diff --git a/.eslintplugin/code-amd-node-module.ts b/.eslintplugin/code-amd-node-module.ts new file mode 100644 index 00000000000..35c89dcb219 --- /dev/null +++ b/.eslintplugin/code-amd-node-module.ts @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as eslint from 'eslint'; +import { join } from 'path'; + + +export = new class ApiProviderNaming implements eslint.Rule.RuleModule { + + readonly meta: eslint.Rule.RuleMetaData = { + messages: { + amdX: 'Use `import type` for import declarations, use `amdX#importAMDNodeModule` for import expressions' + } + }; + + create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { + + const modules = new Set(); + + try { + const { dependencies, optionalDependencies } = require(join(__dirname, '../package.json')); + const all = Object.keys(dependencies).concat(Object.keys(optionalDependencies)); + for (const key of all) { + modules.add(key); + } + + } catch (e) { + console.error(e); + throw e; + } + + + const checkImport = (node: any) => { + + if (node.type !== 'Literal' || typeof node.value !== 'string') { + return; + } + + if (node.parent.importKind === 'type') { + return; + } + + if (!modules.has(node.value)) { + return; + } + + context.report({ + node, + messageId: 'amdX' + }); + } + + return { + ['ImportExpression Literal']: checkImport, + ['ImportDeclaration Literal']: checkImport + }; + } +}; diff --git a/.eslintrc.json b/.eslintrc.json index 7e6ab36bef3..2f52208fa18 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -194,6 +194,14 @@ ] } }, + { + "files": [ + "src/**/{common,browser}/**/*.ts" + ], + "rules": { + "local/code-amd-node-module": "warn" + } + }, { "files": [ "src/**/*.ts"