From 73c8059a0a4698ddf724de87b3efdc09dfedd68e Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 11 Aug 2016 22:15:06 -0600 Subject: [PATCH] Create rule enforcing that goog.provide() is like the path --- package.json | 1 + rules/index.js | 1 + rules/valid-provide.js | 58 ++++++++++++++++++++++++++++++++++++++++ test/.eslintrc | 5 ++++ test_rendering/.eslintrc | 5 ++++ 5 files changed, 70 insertions(+) create mode 100644 rules/valid-provide.js create mode 100644 test/.eslintrc create mode 100644 test_rendering/.eslintrc diff --git a/package.json b/package.json index 32d62aa049..4fb4e22993 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,7 @@ "openlayers-internal/no-unused-requires": 2, "openlayers-internal/one-provide": 1, "openlayers-internal/requires-first": 2, + "openlayers-internal/valid-provide": 2, "openlayers-internal/valid-requires": 2 } }, diff --git a/rules/index.js b/rules/index.js index d4f37de7e0..2b38047b87 100644 --- a/rules/index.js +++ b/rules/index.js @@ -7,6 +7,7 @@ module.exports = { 'no-unused-requires': require('./no-unused-requires').rule, 'one-provide': require('./one-provide').rule, 'requires-first': require('./requires-first').rule, + 'valid-provide': require('./valid-provide').rule, 'valid-requires': require('./valid-requires').rule } }; diff --git a/rules/valid-provide.js b/rules/valid-provide.js new file mode 100644 index 0000000000..35890bad5d --- /dev/null +++ b/rules/valid-provide.js @@ -0,0 +1,58 @@ +'use strict'; + +const path = require('path'); +const util = require('./util'); + +const sourceRoot = path.join(__dirname, '..', 'src'); + +exports.rule = { + meta: { + docs: { + description: 'require the first goog.provide() has an arg named like the file path' + } + }, + + create: function(context) { + let gotFirst = false; + return { + CallExpression: function(expression) { + if (gotFirst) { + return; + } + if (util.isProvideExpression(expression)) { + gotFirst = true; + const parent = expression.parent; + if (parent.type !== 'ExpressionStatement') { + return context.report(expression, 'Expected goog.provide() to in an expression statement'); + } + + if (parent.parent.type !== 'Program') { + return context.report(expression, 'Expected goog.provide() to be at the top level'); + } + + if (expression.arguments.length !== 1) { + return context.report(expression, 'Expected one argument for goog.require()'); + } + + const arg = expression.arguments[0]; + if (arg.type !== 'Literal' || !arg.value || typeof arg.value !== 'string') { + return context.report(expression, 'Expected goog.require() to be called with a string'); + } + + const filePath = path.relative(sourceRoot, context.getFilename()); + let ext; + if (path.basename(filePath) === 'index.js') { + ext = path.sep + 'index.js'; + } else { + ext = '.js'; + } + const name = arg.value; + const expectedPath = name.split('.').join(path.sep) + ext; + if (expectedPath.toLowerCase() !== filePath.toLowerCase()) { + return context.report(expression, `Expected goog.provide('${name}') to be like ${filePath}`); + } + } + } + }; + } +}; diff --git a/test/.eslintrc b/test/.eslintrc new file mode 100644 index 0000000000..3bd7528f3c --- /dev/null +++ b/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "openlayers-internal/valid-provide": 0 + } +} diff --git a/test_rendering/.eslintrc b/test_rendering/.eslintrc new file mode 100644 index 0000000000..3bd7528f3c --- /dev/null +++ b/test_rendering/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "openlayers-internal/valid-provide": 0 + } +}