Skip to content

Commit

Permalink
DEV: Add discourse-common-imports rule
Browse files Browse the repository at this point in the history
  • Loading branch information
davidtaylorhq committed Jan 13, 2025
1 parent 2645d3c commit 306d1e9
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 1 deletion.
80 changes: 80 additions & 0 deletions lint-configs/eslint-rules/discourse-common-imports.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
export default {
meta: {
type: "suggestion",
docs: {
description:
"disallow imports from 'discourse-common' and replace with modern equivalents",
category: "Best Practices",
recommended: false,
},
fixable: "code",
schema: [], // no options
},
create(context) {
return {
ImportDeclaration(node) {
const modulePath = node.source.value.toLowerCase();
if (MAPPINGS[modulePath]) {
const newModule = MAPPINGS[modulePath];
context.report({
node,
message: `Importing ${modulePath} is no longer allowed. Use ${newModule} instead.`,
fix(fixer) {
return fixer.replaceText(node.source, `"${newModule}"`);
},
});
}
},
};
},
};

const MAPPINGS = {
"discourse-common/helpers/base-path": "discourse/helpers/base-path",
"discourse-common/helpers/base-url": "discourse/helpers/base-url",
"discourse-common/helpers/bound-i18n": "discourse/helpers/bound-i18n",
"discourse-common/helpers/component-for-collection":
"discourse/helpers/component-for-collection",
"discourse-common/helpers/component-for-row":
"discourse/helpers/component-for-row",
"discourse-common/helpers/d-icon": "discourse/helpers/d-icon",
"discourse-common/helpers/fa-icon": "discourse/helpers/fa-icon",
"discourse-common/helpers/get-url": "discourse/helpers/get-url",
"discourse-common/helpers/html-safe": "discourse/helpers/html-safe",
"discourse-common/helpers/i18n-yes-no": "discourse/helpers/i18n-yes-no",
// "discourse-common/helpers/i18n": "discourse/helpers/i18n", // This one is handled by i18n-import-location
"discourse-common/lib/attribute-hook": "discourse/lib/attribute-hook",
"discourse-common/lib/avatar-utils": "discourse/lib/avatar-utils",
"discourse-common/lib/case-converter": "discourse/lib/case-converter",
"discourse-common/lib/debounce": "discourse/lib/debounce",
"discourse-common/lib/deprecated": "discourse/lib/deprecated",
"discourse-common/lib/discourse-template-map":
"discourse/lib/discourse-template-map",
"discourse-common/lib/dom-from-string": "discourse/lib/dom-from-string",
"discourse-common/lib/escape": "discourse/lib/escape",
"discourse-common/lib/get-owner": "discourse/lib/get-owner",
"discourse-common/lib/get-url": "discourse/lib/get-url",
"discourse-common/lib/helpers": "discourse/lib/helpers",
"discourse-common/lib/icon-library": "discourse/lib/icon-library",
"discourse-common/lib/later": "discourse/lib/later",
"discourse-common/lib/loader-shim": "discourse/lib/loader-shim",
"discourse-common/lib/object": "discourse/lib/object",
"discourse-common/lib/popular-themes": "discourse/lib/popular-themes",
"discourse-common/lib/raw-handlebars-helpers":
"discourse/lib/raw-handlebars-helpers",
"discourse-common/lib/raw-handlebars": "discourse/lib/raw-handlebars",
"discourse-common/lib/raw-templates": "discourse/lib/raw-templates",
"discourse-common/lib/suffix-trie": "discourse/lib/suffix-trie",
"discourse-common/utils/decorator-alias": "discourse/lib/decorator-alias",
"discourse-common/utils/decorators": "discourse/lib/decorators",
"discourse-common/utils/dom-utils": "discourse/lib/dom-utils",
"discourse-common/utils/escape-regexp": "discourse/lib/escape-regexp",
"discourse-common/utils/extract-value": "discourse/lib/extract-value",
"discourse-common/utils/handle-descriptor": "discourse/lib/handle-descriptor",
"discourse-common/utils/is-descriptor": "discourse/lib/is-descriptor",
"discourse-common/utils/macro-alias": "discourse/lib/macro-alias",
"discourse-common/utils/multi-cache": "discourse/lib/multi-cache",
"discourse-common/deprecation-workflow": "discourse/deprecation-workflow",
"discourse-common/resolver": "discourse/resolver",
"discourse-common/config/environment": "discourse/lib/environment",
};
4 changes: 4 additions & 0 deletions lint-configs/eslint.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import SimpleImportSort from "eslint-plugin-simple-import-sort";
import SortClassMembers from "eslint-plugin-sort-class-members";
import globals from "globals";
import deprecatedLookups from "./eslint-rules/deprecated-lookups.mjs";
import discourseCommonImports from "./eslint-rules/discourse-common-imports.mjs";
import i18nImport from "./eslint-rules/i18n-import-location.mjs";
import i18nT from "./eslint-rules/i18n-t.mjs";
import noSimpleQueryselector from "./eslint-rules/no-simple-queryselector.mjs";
Expand Down Expand Up @@ -107,6 +108,7 @@ export default [
"service-inject-import": serviceInjectImport,
"no-simple-queryselector": noSimpleQueryselector,
"deprecated-lookups": deprecatedLookups,
"discourse-common-imports": discourseCommonImports,
},
},
},
Expand Down Expand Up @@ -289,6 +291,8 @@ export default [
"discourse/service-inject-import": ["error"],
"discourse/no-simple-queryselector": ["error"],
"discourse/deprecated-lookups": ["error"],
// TODO: enable by default once 98fa42f2 is widely available
// "discourse/discourse-common-imports": ["error"],
},
},
{
Expand Down
2 changes: 1 addition & 1 deletion lint-configs/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@discourse/lint-configs",
"version": "2.2.3",
"version": "2.3.0",
"description": "Shareable lint configs for Discourse core, plugins, and themes",
"author": "Discourse",
"license": "MIT",
Expand Down
26 changes: 26 additions & 0 deletions test/eslint-rules/discourse-common-imports.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { RuleTester } from "eslint";
import rule from "../../lint-configs/eslint-rules/discourse-common-imports.mjs";

const ruleTester = new RuleTester({
parserOptions: { ecmaVersion: 2015, sourceType: "module" },
});

ruleTester.run("no-discourse-common-import", rule, {
valid: [
{
code: `import Something from "discourse/lib/environment";`,
},
],
invalid: [
{
code: `import Something from "discourse-common/config/environment";`,
errors: [
{
message:
"Importing discourse-common/config/environment is no longer allowed. Use discourse/lib/environment instead.",
},
],
output: `import Something from "discourse/lib/environment";`,
},
],
});

0 comments on commit 306d1e9

Please sign in to comment.