@simplysm/lint 13.0.100 → 14.0.4

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.
Files changed (53) hide show
  1. package/README.md +66 -40
  2. package/dist/eslint-plugin.d.ts +12 -0
  3. package/dist/eslint-plugin.d.ts.map +1 -1
  4. package/dist/eslint-plugin.js +15 -10
  5. package/dist/eslint-plugin.js.map +1 -6
  6. package/dist/eslint-recommended.d.ts +2 -1
  7. package/dist/eslint-recommended.d.ts.map +1 -1
  8. package/dist/eslint-recommended.js +159 -242
  9. package/dist/eslint-recommended.js.map +1 -6
  10. package/dist/rules/ng-template-no-todo-comments.d.ts +12 -0
  11. package/dist/rules/ng-template-no-todo-comments.d.ts.map +1 -0
  12. package/dist/rules/ng-template-no-todo-comments.js +46 -0
  13. package/dist/rules/ng-template-no-todo-comments.js.map +1 -0
  14. package/dist/rules/ng-template-sd-require-binding-attrs.d.ts +18 -0
  15. package/dist/rules/ng-template-sd-require-binding-attrs.d.ts.map +1 -0
  16. package/dist/rules/ng-template-sd-require-binding-attrs.js +88 -0
  17. package/dist/rules/ng-template-sd-require-binding-attrs.js.map +1 -0
  18. package/dist/rules/no-hard-private.d.ts +6 -6
  19. package/dist/rules/no-hard-private.js +109 -88
  20. package/dist/rules/no-hard-private.js.map +1 -6
  21. package/dist/rules/no-subpath-imports-from-simplysm.d.ts +5 -5
  22. package/dist/rules/no-subpath-imports-from-simplysm.js +72 -60
  23. package/dist/rules/no-subpath-imports-from-simplysm.js.map +1 -6
  24. package/dist/rules/ts-no-throw-not-implemented-error.d.ts +5 -5
  25. package/dist/rules/ts-no-throw-not-implemented-error.js +92 -58
  26. package/dist/rules/ts-no-throw-not-implemented-error.js.map +1 -6
  27. package/dist/rules/ts-no-unused-injects.d.ts +13 -0
  28. package/dist/rules/ts-no-unused-injects.d.ts.map +1 -0
  29. package/dist/rules/ts-no-unused-injects.js +81 -0
  30. package/dist/rules/ts-no-unused-injects.js.map +1 -0
  31. package/dist/rules/ts-no-unused-protected-readonly.d.ts +13 -0
  32. package/dist/rules/ts-no-unused-protected-readonly.d.ts.map +1 -0
  33. package/dist/rules/ts-no-unused-protected-readonly.js +127 -0
  34. package/dist/rules/ts-no-unused-protected-readonly.js.map +1 -0
  35. package/dist/utils/create-rule.d.ts +3 -3
  36. package/dist/utils/create-rule.js +19 -7
  37. package/dist/utils/create-rule.js.map +1 -6
  38. package/package.json +10 -11
  39. package/src/eslint-plugin.ts +8 -0
  40. package/src/eslint-recommended.ts +43 -116
  41. package/src/rules/ng-template-no-todo-comments.ts +48 -0
  42. package/src/rules/ng-template-sd-require-binding-attrs.ts +111 -0
  43. package/src/rules/no-hard-private.ts +23 -23
  44. package/src/rules/no-subpath-imports-from-simplysm.ts +13 -13
  45. package/src/rules/ts-no-throw-not-implemented-error.ts +14 -14
  46. package/src/rules/ts-no-unused-injects.ts +88 -0
  47. package/src/rules/ts-no-unused-protected-readonly.ts +151 -0
  48. package/src/utils/create-rule.ts +3 -3
  49. package/tests/no-hard-private.spec.ts +0 -888
  50. package/tests/no-subpath-imports-from-simplysm.spec.ts +0 -311
  51. package/tests/recommended.spec.ts +0 -145
  52. package/tests/ts-no-throw-not-implemented-error.spec.ts +0 -245
  53. package/tests/vitest.setup.ts +0 -10
@@ -1,273 +1,190 @@
1
- import globals from "globals";
2
1
  import tseslint, {} from "typescript-eslint";
2
+ import angular from "angular-eslint";
3
+ import globals from "globals";
3
4
  import plugin from "./eslint-plugin.js";
4
5
  import importPlugin from "eslint-plugin-import";
5
6
  import unusedImportsPlugin from "eslint-plugin-unused-imports";
6
- import solidPlugin from "eslint-plugin-solid";
7
- import tailwindcssPlugin from "eslint-plugin-tailwindcss";
8
- import { defineConfig, globalIgnores } from "eslint/config";
9
7
  import { ESLint } from "eslint";
10
8
  import { fileURLToPath } from "url";
11
9
  const commonRules = {
12
- "no-console": "error",
13
- "no-warning-comments": "warn",
14
- "eqeqeq": ["error", "always", { null: "ignore" }],
15
- "no-self-compare": "error",
16
- "array-callback-return": "error"
10
+ "no-warning-comments": "warn",
11
+ "eqeqeq": ["error", "always", { null: "ignore" }],
12
+ "no-self-compare": "error",
13
+ "array-callback-return": "error",
17
14
  };
18
15
  const noNodeBuiltinsRules = {
19
- "no-restricted-globals": [
20
- "error",
21
- {
22
- name: "Buffer",
23
- message: "Use Uint8Array. For complex operations, use BytesUtils from @simplysm/core-common."
24
- }
25
- ],
26
- "no-restricted-imports": [
27
- "error",
28
- {
29
- paths: [
16
+ "no-restricted-globals": [
17
+ "error",
30
18
  {
31
- name: "buffer",
32
- message: "Use Uint8Array. For complex operations, use BytesUtils from @simplysm/core-common."
19
+ name: "Buffer",
20
+ message: "Uint8Array 사용하세요. 복잡한 연산에는 @simplysm/core-common의 BytesUtils를 사용하세요.",
33
21
  },
22
+ ],
23
+ "no-restricted-imports": [
24
+ "error",
34
25
  {
35
- name: "events",
36
- message: "Use EventEmitter from @simplysm/core-common."
26
+ paths: [
27
+ {
28
+ name: "buffer",
29
+ message: "Uint8Array를 사용하세요. 복잡한 연산에는 @simplysm/core-common의 BytesUtils를 사용하세요.",
30
+ },
31
+ {
32
+ name: "events",
33
+ message: "@simplysm/core-common의 EventEmitter를 사용하세요.",
34
+ },
35
+ {
36
+ name: "eventemitter3",
37
+ message: "@simplysm/core-common의 EventEmitter를 사용하세요.",
38
+ },
39
+ ],
37
40
  },
38
- {
39
- name: "eventemitter3",
40
- message: "Use EventEmitter from @simplysm/core-common."
41
- }
42
- ]
43
- }
44
- ]
41
+ ],
45
42
  };
46
43
  const unusedImportsRules = {
47
- "unused-imports/no-unused-imports": "error",
48
- "unused-imports/no-unused-vars": [
49
- "error",
50
- {
51
- vars: "all",
52
- varsIgnorePattern: "^_",
53
- args: "after-used",
54
- argsIgnorePattern: "^_"
55
- }
56
- ]
44
+ "unused-imports/no-unused-imports": "error",
45
+ "unused-imports/no-unused-vars": [
46
+ "error",
47
+ {
48
+ vars: "all",
49
+ varsIgnorePattern: "^_",
50
+ args: "after-used",
51
+ argsIgnorePattern: "^_",
52
+ },
53
+ ],
57
54
  };
58
- var eslint_recommended_default = defineConfig([
59
- globalIgnores([
60
- // Skip traversal itself in directory/** form
61
- "**/node_modules/**",
62
- "**/dist/**",
63
- "**/.*/**",
64
- "**/_*/**"
65
- ]),
66
- {
55
+ export default tseslint.config({
56
+ ignores: [
57
+ // directory/** 형태의 순회 자체를 건너뜀
58
+ "**/node_modules/**",
59
+ "**/dist/**",
60
+ "**/.*/**",
61
+ "**/_*/**",
62
+ ],
63
+ }, {
64
+ languageOptions: {
65
+ ecmaVersion: "latest",
66
+ sourceType: "module",
67
+ },
68
+ }, {
69
+ files: ["**/*.js", "**/*.mjs", "**/*.cjs"],
67
70
  languageOptions: {
68
- globals: {
69
- ...globals.node,
70
- ...globals.es2024,
71
- ...globals.browser
72
- },
73
- ecmaVersion: 2024,
74
- sourceType: "module"
75
- }
76
- },
77
- {
78
- files: ["**/*.js", "**/*.jsx"],
71
+ globals: globals.node,
72
+ },
79
73
  plugins: {
80
- "import": importPlugin,
81
- "@simplysm": plugin,
82
- "unused-imports": unusedImportsPlugin
74
+ "import": importPlugin,
75
+ "@simplysm": plugin,
76
+ "unused-imports": unusedImportsPlugin,
83
77
  },
84
78
  rules: {
85
- ...commonRules,
86
- "require-await": "error",
87
- "no-shadow": "error",
88
- "no-duplicate-imports": "error",
89
- "no-unused-expressions": "error",
90
- "no-undef": "error",
91
- ...unusedImportsRules,
92
- "import/no-extraneous-dependencies": [
93
- "error",
94
- {
95
- devDependencies: [
96
- "**/lib/**",
97
- "**/eslint.config.{js,cjs,mjs}",
98
- "**/simplysm.{js,cjs,mjs}",
99
- "**/vitest.config.{js,cjs,mjs}"
100
- ]
101
- }
102
- ],
103
- // Common rules for JS/TS
104
- "@simplysm/no-subpath-imports-from-simplysm": "error",
105
- "@simplysm/no-hard-private": "error",
106
- ...noNodeBuiltinsRules
107
- }
108
- },
109
- {
110
- files: ["**/*.ts", "**/*.tsx"],
79
+ ...commonRules,
80
+ "require-await": "error",
81
+ "no-shadow": "error",
82
+ "no-duplicate-imports": "error",
83
+ "no-unused-expressions": "error",
84
+ "no-undef": "error",
85
+ ...unusedImportsRules,
86
+ "import/no-extraneous-dependencies": [
87
+ "error",
88
+ {
89
+ devDependencies: [
90
+ "**/lib/**",
91
+ "**/eslint.config.{js,cjs,mjs}",
92
+ "**/simplysm.{js,cjs,mjs}",
93
+ "**/vitest.config.{js,cjs,mjs}",
94
+ ],
95
+ },
96
+ ],
97
+ // JS/TS 공통 규칙
98
+ "@simplysm/no-subpath-imports-from-simplysm": "error",
99
+ "@simplysm/no-hard-private": "error",
100
+ ...noNodeBuiltinsRules,
101
+ },
102
+ }, ...angular.configs.tsRecommended, {
103
+ files: ["**/*.ts"],
104
+ processor: angular.processInlineTemplates,
111
105
  plugins: {
112
- "@typescript-eslint": tseslint.plugin,
113
- "@simplysm": plugin,
114
- "import": importPlugin,
115
- "unused-imports": unusedImportsPlugin
106
+ "@typescript-eslint": tseslint.plugin,
107
+ "@simplysm": plugin,
108
+ "import": importPlugin,
109
+ "unused-imports": unusedImportsPlugin,
116
110
  },
117
111
  settings: {
118
- "import/resolver": {
119
- [fileURLToPath(import.meta.resolve("eslint-import-resolver-typescript"))]: {
120
- alwaysTryTypes: true
121
- }
122
- }
112
+ "import/resolver": {
113
+ [fileURLToPath(import.meta.resolve("eslint-import-resolver-typescript"))]: {
114
+ alwaysTryTypes: true,
115
+ },
116
+ },
123
117
  },
124
118
  languageOptions: {
125
- parser: tseslint.parser,
126
- parserOptions: {
127
- project: true
128
- }
119
+ parser: tseslint.parser,
120
+ parserOptions: {
121
+ project: true,
122
+ },
129
123
  },
130
124
  rules: {
131
- ...commonRules,
132
- "@typescript-eslint/require-await": "error",
133
- "@typescript-eslint/await-thenable": "error",
134
- "@typescript-eslint/return-await": ["error", "in-try-catch"],
135
- "@typescript-eslint/no-floating-promises": "error",
136
- "@typescript-eslint/no-shadow": "error",
137
- "@typescript-eslint/no-unnecessary-condition": [
138
- "error",
139
- { allowConstantLoopConditions: true }
140
- ],
141
- "@typescript-eslint/no-unnecessary-type-assertion": "error",
142
- // "@typescript-eslint/non-nullable-type-assertion-style": "error",
143
- "@typescript-eslint/prefer-reduce-type-parameter": "error",
144
- "@typescript-eslint/prefer-return-this-type": "error",
145
- "@typescript-eslint/no-unused-expressions": "error",
146
- "@typescript-eslint/strict-boolean-expressions": [
147
- "error",
148
- {
149
- allowNullableBoolean: true,
150
- allowNullableObject: true
151
- }
152
- ],
153
- "@typescript-eslint/ban-ts-comment": [
154
- "error",
155
- {
156
- "ts-expect-error": "allow-with-description",
157
- "minimumDescriptionLength": 3
158
- }
159
- ],
160
- "@typescript-eslint/prefer-readonly": "error",
161
- // Prevent mistakes: passing async function to void callback (prevent error loss)
162
- // - arguments: false → allow socket.on("event", async () => {}) (handled with internal try-catch)
163
- // - attributes: false → allow JSX event handlers (SolidJS compatible)
164
- "@typescript-eslint/no-misused-promises": [
165
- "error",
166
- { checksVoidReturn: { arguments: false, attributes: false } }
167
- ],
168
- // Prevent mistakes: throwing non-Error objects (prevent stack trace loss)
169
- "@typescript-eslint/only-throw-error": "error",
170
- // Prevent mistakes: using delete on arrays (prevent sparse array bugs)
171
- "@typescript-eslint/no-array-delete": "error",
172
- "@simplysm/no-hard-private": "error",
173
- "@simplysm/no-subpath-imports-from-simplysm": "error",
174
- "@simplysm/ts-no-throw-not-implemented-error": "warn",
175
- ...unusedImportsRules,
176
- ...noNodeBuiltinsRules,
177
- "import/no-extraneous-dependencies": [
178
- "error",
179
- {
180
- devDependencies: [
181
- "**/lib/**",
182
- "**/eslint.config.ts",
183
- "**/simplysm.ts",
184
- "**/vitest.config.ts",
185
- "**/vitest-e2e.config.ts",
186
- "**/vitest.setup.ts",
187
- "**/vitest.setup.ts"
188
- ]
189
- }
190
- ]
191
- }
192
- },
193
- // Test folders: allow root devDependencies (vitest, etc.)
194
- {
195
- files: [
196
- "**/tests/**/*.ts",
197
- "**/tests/**/*.tsx",
198
- "**/tests-e2e/**/*.ts",
199
- "**/tests-e2e/**/*.tsx"
200
- ],
201
- rules: {
202
- "no-console": "off",
203
- "import/no-extraneous-dependencies": "off",
204
- "@simplysm/ts-no-throw-not-implemented-error": "off"
205
- }
206
- },
207
- // SolidJS TSX files: explicitly configure all rules (error)
208
- {
209
- files: ["**/*.ts", "**/*.tsx"],
125
+ ...commonRules,
126
+ "no-console": "error",
127
+ "@typescript-eslint/require-await": "error",
128
+ "@typescript-eslint/await-thenable": "error",
129
+ "@typescript-eslint/return-await": ["error", "in-try-catch"],
130
+ "@typescript-eslint/no-floating-promises": "error",
131
+ "@typescript-eslint/no-shadow": "error",
132
+ "@typescript-eslint/no-unnecessary-condition": [
133
+ "error",
134
+ { allowConstantLoopConditions: true },
135
+ ],
136
+ "@typescript-eslint/no-unnecessary-type-assertion": "error",
137
+ // "@typescript-eslint/non-nullable-type-assertion-style": "error",
138
+ "@typescript-eslint/prefer-reduce-type-parameter": "error",
139
+ "@typescript-eslint/prefer-return-this-type": "error",
140
+ "@typescript-eslint/no-unused-expressions": "error",
141
+ "@typescript-eslint/strict-boolean-expressions": [
142
+ "error",
143
+ {
144
+ allowNullableBoolean: true,
145
+ allowNullableObject: true,
146
+ },
147
+ ],
148
+ "@typescript-eslint/ban-ts-comment": [
149
+ "error",
150
+ {
151
+ "ts-expect-error": "allow-with-description",
152
+ "minimumDescriptionLength": 3,
153
+ },
154
+ ],
155
+ "@typescript-eslint/prefer-readonly": "error",
156
+ "@typescript-eslint/no-misused-promises": [
157
+ "error",
158
+ { checksVoidReturn: { arguments: false } },
159
+ ],
160
+ "@typescript-eslint/only-throw-error": "error",
161
+ "@typescript-eslint/no-array-delete": "error",
162
+ "@simplysm/no-hard-private": "error",
163
+ "@simplysm/no-subpath-imports-from-simplysm": "error",
164
+ "@simplysm/ts-no-throw-not-implemented-error": "warn",
165
+ "@simplysm/ts-no-unused-injects": "error",
166
+ "@simplysm/ts-no-unused-protected-readonly": "error",
167
+ "@angular-eslint/no-output-native": "off",
168
+ ...unusedImportsRules,
169
+ ...noNodeBuiltinsRules,
170
+ "import/no-extraneous-dependencies": "error",
171
+ },
172
+ }, {
173
+ files: ["**/*.html"],
174
+ extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility],
210
175
  plugins: {
211
- solid: solidPlugin,
212
- tailwindcss: tailwindcssPlugin
176
+ "@simplysm": plugin,
213
177
  },
214
- settings: {
215
- tailwindcss: {
216
- // Support template literal tags: recognize clsx`py-0.5 px-1.5` form
217
- tags: ["clsx"]
218
- }
178
+ rules: {
179
+ "@simplysm/ng-template-no-todo-comments": "warn",
180
+ "@simplysm/ng-template-sd-require-binding-attrs": "error",
219
181
  },
182
+ }, {
183
+ files: ["**/tests/**/*.ts"],
220
184
  rules: {
221
- // ─── Prevent mistakes ───
222
- "solid/reactivity": "off",
223
- "solid/no-destructure": "error",
224
- // Props destructuring → reactivity loss
225
- "solid/components-return-once": "error",
226
- // early return → bugs
227
- "solid/jsx-no-duplicate-props": "error",
228
- // Duplicate props
229
- "solid/jsx-no-undef": ["error", { typescriptEnabled: true }],
230
- // Undefined variables
231
- "solid/no-react-deps": "error",
232
- // React dependency array mistakes
233
- "solid/no-react-specific-props": "error",
234
- // React props mistakes (className, etc.)
235
- // ─── Security ───
236
- "solid/no-innerhtml": "error",
237
- // Prevent XSS
238
- "solid/jsx-no-script-url": "error",
239
- // Prevent javascript: URLs
240
- // ─── Tooling support ───
241
- "solid/jsx-uses-vars": "error",
242
- // Prevent false positives in unused import detection
243
- // ─── Conventions ───
244
- "solid/prefer-for": "error",
245
- // Recommend For component
246
- "solid/event-handlers": "error",
247
- // Event handler naming
248
- "solid/imports": "error",
249
- // Import consistency
250
- "solid/style-prop": "error",
251
- // style prop format
252
- "solid/self-closing-comp": "error",
253
- // Self-closing tags
254
- // ─── Tailwind CSS ───
255
- "tailwindcss/classnames-order": "warn",
256
- // Auto-sort class order
257
- "tailwindcss/enforces-negative-arbitrary-values": "error",
258
- // Unify negative arbitrary value format
259
- "tailwindcss/enforces-shorthand": "error",
260
- // Recommend shorthand usage
261
- "tailwindcss/no-contradicting-classname": "error",
262
- // Prohibit conflicting classes (p-2 p-4, etc.)
263
- "tailwindcss/no-custom-classname": "error",
264
- // Prohibit custom classes not in Tailwind
265
- "tailwindcss/no-unnecessary-arbitrary-value": "error"
266
- // Prohibit unnecessary arbitrary values
267
- }
268
- }
269
- ]);
270
- export {
271
- eslint_recommended_default as default
272
- };
273
- //# sourceMappingURL=eslint-recommended.js.map
185
+ "no-console": "off",
186
+ "import/no-extraneous-dependencies": "off",
187
+ "@simplysm/ts-no-throw-not-implemented-error": "off",
188
+ },
189
+ });
190
+ //# sourceMappingURL=eslint-recommended.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/eslint-recommended.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"eslint-recommended.js","sourceRoot":"","sources":["../src/eslint-recommended.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTML 템플릿 내 TODO 주석을 감지하여 경고하는 ESLint 규칙.
3
+ *
4
+ * @remarks
5
+ * `<!-- TODO: ... -->` 형태의 HTML 주석을 찾아 보고합니다.
6
+ * raw text regex 방식으로 동작하므로 AST 노드 방문자가 아닌 빈 객체를 반환합니다.
7
+ */
8
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noTodo", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
9
+ name: string;
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=ng-template-no-todo-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-template-no-todo-comments.d.ts","sourceRoot":"","sources":["../../src/rules/ng-template-no-todo-comments.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;;;;AACH,wBAsCG"}
@@ -0,0 +1,46 @@
1
+ import { createRule } from "../utils/create-rule.js";
2
+ /**
3
+ * HTML 템플릿 내 TODO 주석을 감지하여 경고하는 ESLint 규칙.
4
+ *
5
+ * @remarks
6
+ * `<!-- TODO: ... -->` 형태의 HTML 주석을 찾아 보고합니다.
7
+ * raw text regex 방식으로 동작하므로 AST 노드 방문자가 아닌 빈 객체를 반환합니다.
8
+ */
9
+ export default createRule({
10
+ name: "ng-template-no-todo-comments",
11
+ meta: {
12
+ type: "problem",
13
+ docs: {
14
+ description: "HTML 템플릿 내 TODO 주석을 경고합니다.",
15
+ },
16
+ schema: [],
17
+ messages: {
18
+ noTodo: "{{content}}",
19
+ },
20
+ },
21
+ defaultOptions: [],
22
+ create(context) {
23
+ const sourceCode = context.sourceCode;
24
+ const source = sourceCode.getText();
25
+ const commentRegex = /<!--([\s\S]*?)-->/g;
26
+ let match;
27
+ while ((match = commentRegex.exec(source)) !== null) {
28
+ const commentContent = match[1];
29
+ const todoIndex = commentContent.indexOf("TODO:");
30
+ if (todoIndex < 0)
31
+ continue;
32
+ const start = match.index;
33
+ const end = start + match[0].length;
34
+ const content = commentContent.slice(todoIndex + 5).trim();
35
+ const loc = sourceCode.getLocFromIndex(start);
36
+ const endLoc = sourceCode.getLocFromIndex(end);
37
+ context.report({
38
+ loc: { start: loc, end: endLoc },
39
+ messageId: "noTodo",
40
+ data: { content },
41
+ });
42
+ }
43
+ return {};
44
+ },
45
+ });
46
+ //# sourceMappingURL=ng-template-no-todo-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-template-no-todo-comments.js","sourceRoot":"","sources":["../../src/rules/ng-template-no-todo-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;GAMG;AACH,eAAe,UAAU,CAAC;IACxB,IAAI,EAAE,8BAA8B;IACpC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,4BAA4B;SAC1C;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,MAAM,EAAE,aAAa;SACtB;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,oBAAoB,CAAC;QAC1C,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,SAAS,GAAG,CAAC;gBAAE,SAAS;YAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAE/C,OAAO,CAAC,MAAM,CAAC;gBACb,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;gBAChC,SAAS,EAAE,QAAQ;gBACnB,IAAI,EAAE,EAAE,OAAO,EAAE;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface RuleOptions {
2
+ selectorPrefixes?: string[];
3
+ allowAttributes?: string[];
4
+ allowAttributePrefixes?: string[];
5
+ }
6
+ /**
7
+ * sd-* 컴포넌트에서 plain attribute 사용을 제한하고 Angular property binding을 강제하는 ESLint 규칙.
8
+ *
9
+ * @remarks
10
+ * `sd-` 접두사를 가진 커스텀 컴포넌트에서 허용되지 않은 plain attribute를 감지합니다.
11
+ * 허용 목록(id, class, style, title, tabindex, role)과 허용 접두사(aria-, data-, sd-)에
12
+ * 해당하지 않는 attribute는 `[attr]="..."` 형태의 property binding으로 변환하도록 autofix합니다.
13
+ */
14
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireBindingForAttribute", [RuleOptions], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
15
+ name: string;
16
+ };
17
+ export default _default;
18
+ //# sourceMappingURL=ng-template-sd-require-binding-attrs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-template-sd-require-binding-attrs.d.ts","sourceRoot":"","sources":["../../src/rules/ng-template-sd-require-binding-attrs.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAQD;;;;;;;GAOG;;;;AACH,wBAuFG"}
@@ -0,0 +1,88 @@
1
+ import { getTemplateParserServices } from "@angular-eslint/utils";
2
+ import { createRule } from "../utils/create-rule.js";
3
+ const DEFAULT_OPTIONS = {
4
+ selectorPrefixes: ["sd-"],
5
+ allowAttributes: ["id", "class", "style", "title", "tabindex", "role"],
6
+ allowAttributePrefixes: ["aria-", "data-", "sd-"],
7
+ };
8
+ /**
9
+ * sd-* 컴포넌트에서 plain attribute 사용을 제한하고 Angular property binding을 강제하는 ESLint 규칙.
10
+ *
11
+ * @remarks
12
+ * `sd-` 접두사를 가진 커스텀 컴포넌트에서 허용되지 않은 plain attribute를 감지합니다.
13
+ * 허용 목록(id, class, style, title, tabindex, role)과 허용 접두사(aria-, data-, sd-)에
14
+ * 해당하지 않는 attribute는 `[attr]="..."` 형태의 property binding으로 변환하도록 autofix합니다.
15
+ */
16
+ export default createRule({
17
+ name: "ng-template-sd-require-binding-attrs",
18
+ meta: {
19
+ type: "problem",
20
+ docs: {
21
+ description: 'Disallow non-whitelisted plain attributes on prefixed components (e.g. sd-*) and require using Angular property bindings instead.',
22
+ },
23
+ fixable: "code",
24
+ schema: [
25
+ {
26
+ type: "object",
27
+ properties: {
28
+ selectorPrefixes: { type: "array", items: { type: "string" } },
29
+ allowAttributes: { type: "array", items: { type: "string" } },
30
+ allowAttributePrefixes: { type: "array", items: { type: "string" } },
31
+ },
32
+ additionalProperties: false,
33
+ },
34
+ ],
35
+ messages: {
36
+ requireBindingForAttribute: 'Attribute "{{attrName}}" is not allowed as a plain attribute on "{{elementName}}". Use a property binding instead, e.g. [{{attrName}}]="…".',
37
+ },
38
+ },
39
+ defaultOptions: [{}],
40
+ create(context) {
41
+ const parserServices = getTemplateParserServices(context);
42
+ const userOptions = context.options.at(0) ?? {};
43
+ const selectorPrefixes = userOptions.selectorPrefixes ?? DEFAULT_OPTIONS.selectorPrefixes;
44
+ const allowAttributes = userOptions.allowAttributes ?? DEFAULT_OPTIONS.allowAttributes;
45
+ const allowAttributePrefixes = userOptions.allowAttributePrefixes ?? DEFAULT_OPTIONS.allowAttributePrefixes;
46
+ const allowedAttrSet = new Set(allowAttributes.map((attr) => attr.toLowerCase()));
47
+ function isTargetElement(node) {
48
+ const tagName = node.name.toLowerCase();
49
+ return selectorPrefixes.some((prefix) => tagName.startsWith(prefix.toLowerCase()));
50
+ }
51
+ function isWhitelistedPlainAttr(attr) {
52
+ const name = attr.name.toLowerCase();
53
+ if (allowedAttrSet.has(name))
54
+ return true;
55
+ return allowAttributePrefixes.some((prefix) => name.startsWith(prefix.toLowerCase()));
56
+ }
57
+ return {
58
+ Element(node) {
59
+ if (!isTargetElement(node))
60
+ return;
61
+ for (const attr of node.attributes) {
62
+ if (isWhitelistedPlainAttr(attr))
63
+ continue;
64
+ const span = attr.sourceSpan;
65
+ const loc = parserServices.convertNodeSourceSpanToLoc(span);
66
+ context.report({
67
+ loc,
68
+ messageId: "requireBindingForAttribute",
69
+ data: { attrName: attr.name, elementName: node.name },
70
+ fix(fixer) {
71
+ const start = span.start.offset;
72
+ const end = span.end.offset;
73
+ if (start >= end)
74
+ return null;
75
+ const rawValue = attr.value;
76
+ if (rawValue === "") {
77
+ return fixer.replaceTextRange([start, end], `[${attr.name}]="true"`);
78
+ }
79
+ const escaped = rawValue.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
80
+ return fixer.replaceTextRange([start, end], `[${attr.name}]="'${escaped}'"`);
81
+ },
82
+ });
83
+ }
84
+ },
85
+ };
86
+ },
87
+ });
88
+ //# sourceMappingURL=ng-template-sd-require-binding-attrs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-template-sd-require-binding-attrs.js","sourceRoot":"","sources":["../../src/rules/ng-template-sd-require-binding-attrs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAQlD,MAAM,eAAe,GAA0B;IAC7C,gBAAgB,EAAE,CAAC,KAAK,CAAC;IACzB,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;IACtE,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;CAClD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAe,UAAU,CAAC;IACxB,IAAI,EAAE,sCAAsC;IAC5C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,mIAAmI;SACtI;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBAC9D,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBAC7D,sBAAsB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;iBACrE;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,QAAQ,EAAE;YACR,0BAA0B,EACxB,6IAA6I;SAChJ;KACF;IACD,cAAc,EAAE,CAAC,EAAE,CAAkB;IACrC,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,yBAAyB,CAAC,OAAgB,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,IAAI,eAAe,CAAC,gBAAgB,CAAC;QAC1F,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,IAAI,eAAe,CAAC,eAAe,CAAC;QACvF,MAAM,sBAAsB,GAC1B,WAAW,CAAC,sBAAsB,IAAI,eAAe,CAAC,sBAAsB,CAAC;QAE/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAElF,SAAS,eAAe,CAAC,IAAsB;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;QAED,SAAS,sBAAsB,CAAC,IAAsB;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1C,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxF,CAAC;QAED,OAAO;YACL,OAAO,CAAC,IAQP;gBACC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAEnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,sBAAsB,CAAC,IAAI,CAAC;wBAAE,SAAS;oBAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,0BAA0B,CAAC,IAAa,CAAC,CAAC;oBAErE,OAAO,CAAC,MAAM,CAAC;wBACb,GAAG;wBACH,SAAS,EAAE,4BAA4B;wBACvC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;wBACrD,GAAG,CAAC,KAAK;4BACP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;4BAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;4BAC5B,IAAI,KAAK,IAAI,GAAG;gCAAE,OAAO,IAAI,CAAC;4BAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;4BAC5B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gCACpB,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC;4BACvE,CAAC;4BAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;4BACrE,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,OAAO,OAAO,IAAI,CAAC,CAAC;wBAC/E,CAAC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACO,CAAC;IACb,CAAC;CACF,CAAC,CAAC"}