@discourse/lint-configs 2.22.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,96 @@
1
+ export default {
2
+ meta: {
3
+ type: "problem",
4
+ docs: {
5
+ description: "Do not use themeSetting or themeI18n helpers.",
6
+ },
7
+ fixable: "code",
8
+ schema: [], // no options
9
+ },
10
+
11
+ create(context) {
12
+ return {
13
+ ImportDeclaration(node) {
14
+ const modulePath = node.source.value.toLowerCase();
15
+ const moduleScope = context.sourceCode.scopeManager.scopes.find(
16
+ (s) => s.type === "module"
17
+ );
18
+
19
+ if (modulePath === "discourse/helpers/theme-setting") {
20
+ context.report({
21
+ node,
22
+ message: `Importing themeSetting is not allowed.`,
23
+ fix(fixer) {
24
+ const fixes = [fixer.remove(node)];
25
+
26
+ const importName = node.specifiers[0].local.name;
27
+ const themeSetting = moduleScope.variables.find(
28
+ (v) => v.name === importName
29
+ );
30
+ themeSetting.references.forEach((ref) => {
31
+ const expression = ref.identifier.parent.parent;
32
+ const param = expression?.params[0];
33
+
34
+ if (expression?.type === "GlimmerMustacheStatement") {
35
+ fixes.push(
36
+ fixer.replaceText(expression, `{{settings.${param.value}}}`)
37
+ );
38
+ } else if (expression?.type === "GlimmerSubExpression") {
39
+ fixes.push(
40
+ fixer.replaceText(expression, `settings.${param.value}`)
41
+ );
42
+ }
43
+ });
44
+
45
+ return fixes;
46
+ },
47
+ });
48
+ } else if (modulePath === "discourse/helpers/theme-i18n") {
49
+ context.report({
50
+ node,
51
+ message: `Importing themeI18n is not allowed.`,
52
+ fix(fixer) {
53
+ const fixes = [];
54
+
55
+ const i18nImport = moduleScope.variables.find(
56
+ (v) => v.name === "i18n"
57
+ );
58
+ if (i18nImport) {
59
+ fixes.push(fixer.remove(node));
60
+ } else {
61
+ fixes.push(
62
+ fixer.replaceText(
63
+ node,
64
+ `import { i18n } from "discourse-i18n";`
65
+ )
66
+ );
67
+ }
68
+
69
+ const importName = node.specifiers[0].local.name;
70
+ const themeI18n = moduleScope.variables.find(
71
+ (v) => v.name === importName
72
+ );
73
+ themeI18n.references.forEach((ref) => {
74
+ const expression = ref.identifier.parent.parent;
75
+ if (
76
+ ["GlimmerMustacheStatement", "GlimmerSubExpression"].includes(
77
+ expression?.type
78
+ )
79
+ ) {
80
+ const param = expression.params[0];
81
+ if (param) {
82
+ fixes.push(fixer.replaceText(ref.identifier, "i18n"));
83
+ fixes.push(fixer.insertTextBefore(param, "(themePrefix "));
84
+ fixes.push(fixer.insertTextAfter(param, ")"));
85
+ }
86
+ }
87
+ });
88
+
89
+ return fixes;
90
+ },
91
+ });
92
+ }
93
+ },
94
+ };
95
+ },
96
+ };
package/eslint.mjs CHANGED
@@ -24,6 +24,7 @@ import linesBetweenClassMembers from "./eslint-rules/lines-between-class-members
24
24
  import noCurlyComponents from "./eslint-rules/no-curly-components.mjs";
25
25
  import noSimpleQuerySelector from "./eslint-rules/no-simple-query-selector.mjs";
26
26
  import serviceInjectImport from "./eslint-rules/service-inject-import.mjs";
27
+ import themeImports from "./eslint-rules/theme-imports.mjs";
27
28
  import truthHelpersImports from "./eslint-rules/truth-helpers-imports.mjs";
28
29
 
29
30
  // Copied from "ember-template-imports/lib/utils"
@@ -117,6 +118,7 @@ export default [
117
118
  "i18n-t": i18nT,
118
119
  "service-inject-import": serviceInjectImport,
119
120
  "truth-helpers-imports": truthHelpersImports,
121
+ "theme-imports": themeImports,
120
122
  "no-simple-query-selector": noSimpleQuerySelector,
121
123
  "deprecated-lookups": deprecatedLookups,
122
124
  "discourse-common-imports": discourseCommonImports,
@@ -292,10 +294,12 @@ export default [
292
294
  "discourse/i18n-t": ["error"],
293
295
  "discourse/service-inject-import": ["error"],
294
296
  "discourse/truth-helpers-imports": ["error"],
297
+ "discourse/theme-imports": ["error"],
295
298
  "discourse/no-simple-query-selector": ["error"],
296
299
  "discourse/deprecated-lookups": ["error"],
297
300
  "discourse/discourse-common-imports": ["error"],
298
301
  "discourse/lines-between-class-members": ["error"],
302
+ "discourse/deprecated-plugin-apis": ["error"],
299
303
  "discourse/line-after-imports": ["error"],
300
304
  "discourse/line-before-default-export": ["error"],
301
305
  "discourse/no-curly-components": ["error"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@discourse/lint-configs",
3
- "version": "2.22.0",
3
+ "version": "2.24.0",
4
4
  "description": "Shareable lint configs for Discourse core, plugins, and themes",
5
5
  "author": "Discourse",
6
6
  "license": "MIT",
@@ -30,21 +30,21 @@
30
30
  "test": "cd ../test && node test.js"
31
31
  },
32
32
  "dependencies": {
33
- "@babel/core": "^7.27.1",
33
+ "@babel/core": "^7.27.4",
34
34
  "@babel/eslint-parser": "^7.27.1",
35
35
  "@babel/plugin-proposal-decorators": "^7.27.1",
36
36
  "ember-template-lint": "^7.7.0",
37
- "eslint": "^9.27.0",
37
+ "eslint": "^9.28.0",
38
38
  "eslint-plugin-decorator-position": "^6.0.0",
39
39
  "eslint-plugin-ember": "^12.5.0",
40
40
  "eslint-plugin-import": "^2.31.0",
41
41
  "eslint-plugin-qunit": "^8.1.2",
42
42
  "eslint-plugin-simple-import-sort": "^12.1.1",
43
43
  "eslint-plugin-sort-class-members": "^1.21.0",
44
- "globals": "^16.1.0",
44
+ "globals": "^16.2.0",
45
45
  "prettier": "^3.5.3",
46
46
  "prettier-plugin-ember-template-tag": "^2.0.5",
47
- "stylelint": "^16.19.1",
47
+ "stylelint": "^16.20.0",
48
48
  "stylelint-config-standard": "^38.0.0",
49
49
  "stylelint-config-standard-scss": "^15.0.1",
50
50
  "stylelint-scss": "^6.12.0",
@@ -52,8 +52,8 @@
52
52
  },
53
53
  "peerDependencies": {
54
54
  "ember-template-lint": "7.7.0",
55
- "eslint": "9.27.0",
55
+ "eslint": "9.28.0",
56
56
  "prettier": "3.5.3",
57
- "stylelint": "16.19.1"
57
+ "stylelint": "16.20.0"
58
58
  }
59
59
  }