@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
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @simplysm/lint
2
2
 
3
- Simplysm package - Lint configuration (ESLint). Provides an ESLint plugin with custom rules and a recommended flat config for TypeScript, SolidJS, and Tailwind CSS projects.
3
+ Shared ESLint plugin and recommended configuration for Simplysm projects.
4
4
 
5
5
  ## Installation
6
6
 
@@ -10,62 +10,89 @@ npm install @simplysm/lint
10
10
 
11
11
  ## Entrypoints
12
12
 
13
- This package has two entrypoints:
13
+ ### `@simplysm/lint/eslint-plugin`
14
14
 
15
- | Entrypoint | Import Path | Description |
16
- |------------|-------------|-------------|
17
- | ESLint Plugin | `@simplysm/lint/eslint-plugin` | Custom ESLint rules |
18
- | Recommended Config | `@simplysm/lint/eslint-recommended` | Full recommended flat config |
15
+ ESLint plugin providing 7 custom rules for Angular/TypeScript projects.
19
16
 
20
- ## API Overview
17
+ ```typescript
18
+ import plugin from "@simplysm/lint/eslint-plugin";
19
+ ```
21
20
 
22
- ### ESLint Plugin (`@simplysm/lint/eslint-plugin`)
21
+ Default export: `{ rules: { ... } }`
23
22
 
24
- Default export is an ESLint plugin object with `rules`:
23
+ #### Rules
25
24
 
26
25
  | Rule | Type | Fixable | Description |
27
- |------|------|---------|-------------|
28
- | `no-hard-private` | problem | Yes | Enforces TypeScript `private _` style instead of hard private fields (`#`). Auto-fixes `#field` to `private _field` and `this.#field` to `this._field`. |
29
- | `no-subpath-imports-from-simplysm` | problem | Yes | Prohibits `src` subpath imports from `@simplysm/*` packages (e.g., `@simplysm/pkg/src/x` is prohibited). Auto-fixes to package root import. |
30
- | `ts-no-throw-not-implemented-error` | suggestion | No | Warns about `NotImplementedError` usage from `@simplysm/core-common`. Detects named, aliased, and namespace imports. |
26
+ |---|---|---|---|
27
+ | `ng-template-no-todo-comments` | problem | no | Warn on TODO comments inside Angular HTML templates |
28
+ | `ng-template-sd-require-binding-attrs` | problem | yes | Disallow non-whitelisted plain attributes on `sd-*` prefixed components; require Angular property bindings instead |
29
+ | `no-hard-private` | problem | yes | Disallow ES hard private fields (`#field`); require TypeScript `private _field` style instead |
30
+ | `no-subpath-imports-from-simplysm` | problem | yes | Disallow importing from `@simplysm/*/src/*` subpaths (use package entrypoints) |
31
+ | `ts-no-throw-not-implemented-error` | suggestion | no | Warn on `NotImplementedError` usage (indicates unfinished implementation) |
32
+ | `ts-no-unused-injects` | problem | yes | Disallow unused Angular `inject()` fields |
33
+ | `ts-no-unused-protected-readonly` | problem | yes | Disallow unused `protected readonly` fields in Angular components |
31
34
 
32
- ### Recommended Config (`@simplysm/lint/eslint-recommended`)
35
+ ### `@simplysm/lint/eslint-recommended`
33
36
 
34
- Default export is a full ESLint flat config array that includes:
37
+ Pre-configured ESLint flat config for Simplysm projects.
35
38
 
36
- - **Global ignores**: `node_modules`, `dist`, dotfiles, underscore-prefixed directories
37
- - **JS/JSX rules**: Common rules + unused imports + import dependency checks + custom `@simplysm` rules
38
- - **TS/TSX rules**: TypeScript-specific rules (strict boolean expressions, no floating promises, prefer readonly, etc.) + all JS rules
39
- - **Test overrides**: Relaxed rules for `tests/` and `tests-e2e/` directories (allows console, no extraneous deps check)
40
- - **SolidJS rules**: No destructure, components-return-once, no-innerhtml, prefer-for, etc.
41
- - **Tailwind CSS rules**: Classnames order, enforces shorthand, no contradicting classname, no custom classname
39
+ ```typescript
40
+ import recommended from "@simplysm/lint/eslint-recommended";
41
+ ```
42
42
 
43
- #### Included Plugins
43
+ Default export: a complete ESLint flat config array (from `tseslint.config()`).
44
44
 
45
- | Plugin | Prefix | Purpose |
46
- |--------|--------|---------|
47
- | `@typescript-eslint` | `@typescript-eslint/` | TypeScript type-aware linting |
48
- | `@simplysm` (this package) | `@simplysm/` | Custom Simplysm rules |
49
- | `eslint-plugin-import` | `import/` | Import/export validation |
50
- | `eslint-plugin-unused-imports` | `unused-imports/` | Auto-remove unused imports |
51
- | `eslint-plugin-solid` | `solid/` | SolidJS best practices |
52
- | `eslint-plugin-tailwindcss` | `tailwindcss/` | Tailwind CSS class validation |
45
+ #### Included Configurations
53
46
 
54
- ## Usage Examples
47
+ - `angular-eslint` template recommended + accessibility
48
+ - `typescript-eslint` recommended rules
49
+ - `eslint-plugin-import` (extraneous dependency checking)
50
+ - `eslint-plugin-unused-imports` (auto-remove unused imports)
51
+ - All 7 `@simplysm/lint/eslint-plugin` rules
55
52
 
56
- ### Use the recommended config
53
+ #### Key Rules Enabled
57
54
 
58
- ```typescript
59
- // eslint.config.ts
55
+ - `eqeqeq` (always, null-ignore)
56
+ - `no-console` (error in .ts files)
57
+ - `@typescript-eslint/require-await`, `await-thenable`, `no-floating-promises`
58
+ - `@typescript-eslint/strict-boolean-expressions` (nullable boolean/object allowed)
59
+ - `@typescript-eslint/prefer-readonly`
60
+ - `@typescript-eslint/no-unnecessary-condition`
61
+ - Bans `Buffer`, `events`, `eventemitter3` imports
62
+ - Test files (`**/tests/**/*.ts`): relaxes `no-console`, `import/no-extraneous-dependencies`, `ts-no-throw-not-implemented-error`
63
+
64
+ #### File Patterns
65
+
66
+ | Pattern | Applied Rules |
67
+ |---|---|
68
+ | `**/*.js`, `**/*.mjs`, `**/*.cjs` | Common rules + import checks + unused imports + no-hard-private + no-subpath-imports |
69
+ | `**/*.ts` | Full TypeScript rules + Angular rules + all custom rules |
70
+ | `**/*.html` | Angular template rules (no-todo-comments, sd-require-binding-attrs) |
71
+ | `**/tests/**/*.ts` | Relaxed rules (no-console off, extraneous deps off) |
72
+
73
+ #### Ignored Patterns
74
+
75
+ - `**/node_modules/**`
76
+ - `**/dist/**`
77
+ - `**/.*/**`
78
+ - `**/_*/**`
79
+
80
+ ## Usage
81
+
82
+ ### eslint.config.js
83
+
84
+ ```javascript
60
85
  import recommended from "@simplysm/lint/eslint-recommended";
61
86
 
62
- export default recommended;
87
+ export default [
88
+ ...recommended,
89
+ // add project-specific overrides here
90
+ ];
63
91
  ```
64
92
 
65
- ### Use the plugin with custom rules
93
+ ### Use plugin rules individually
66
94
 
67
- ```typescript
68
- // eslint.config.ts
95
+ ```javascript
69
96
  import plugin from "@simplysm/lint/eslint-plugin";
70
97
 
71
98
  export default [
@@ -73,8 +100,7 @@ export default [
73
100
  plugins: { "@simplysm": plugin },
74
101
  rules: {
75
102
  "@simplysm/no-hard-private": "error",
76
- "@simplysm/no-subpath-imports-from-simplysm": "error",
77
- "@simplysm/ts-no-throw-not-implemented-error": "warn",
103
+ "@simplysm/ts-no-unused-injects": "error",
78
104
  },
79
105
  },
80
106
  ];
@@ -1,5 +1,11 @@
1
1
  declare const _default: {
2
2
  rules: {
3
+ "ng-template-no-todo-comments": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noTodo", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
4
+ name: string;
5
+ };
6
+ "ng-template-sd-require-binding-attrs": import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireBindingForAttribute", [import("./rules/ng-template-sd-require-binding-attrs").RuleOptions], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
7
+ name: string;
8
+ };
3
9
  "no-hard-private": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferSoftPrivate" | "nameConflict", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
4
10
  name: string;
5
11
  };
@@ -9,6 +15,12 @@ declare const _default: {
9
15
  "ts-no-throw-not-implemented-error": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noThrowNotImplementedError", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
10
16
  name: string;
11
17
  };
18
+ "ts-no-unused-injects": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unusedInject", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
19
+ name: string;
20
+ };
21
+ "ts-no-unused-protected-readonly": import("@typescript-eslint/utils/ts-eslint").RuleModule<"unusedField", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
22
+ name: string;
23
+ };
12
24
  };
13
25
  };
14
26
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"eslint-plugin.d.ts","sourceRoot":"","sources":["../src/eslint-plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAIA,wBAME"}
1
+ {"version":3,"file":"eslint-plugin.d.ts","sourceRoot":"","sources":["../src/eslint-plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAUE"}
@@ -1,14 +1,19 @@
1
+ import ngTemplateNoTodoComments from "./rules/ng-template-no-todo-comments.js";
2
+ import ngTemplateSdRequireBindingAttrs from "./rules/ng-template-sd-require-binding-attrs.js";
1
3
  import noHardPrivate from "./rules/no-hard-private.js";
2
4
  import noSubpathImportsFromSimplysm from "./rules/no-subpath-imports-from-simplysm.js";
3
5
  import tsNoThrowNotImplementedError from "./rules/ts-no-throw-not-implemented-error.js";
4
- var eslint_plugin_default = {
5
- rules: {
6
- "no-hard-private": noHardPrivate,
7
- "no-subpath-imports-from-simplysm": noSubpathImportsFromSimplysm,
8
- "ts-no-throw-not-implemented-error": tsNoThrowNotImplementedError
9
- }
6
+ import tsNoUnusedInjects from "./rules/ts-no-unused-injects.js";
7
+ import tsNoUnusedProtectedReadonly from "./rules/ts-no-unused-protected-readonly.js";
8
+ export default {
9
+ rules: {
10
+ "ng-template-no-todo-comments": ngTemplateNoTodoComments,
11
+ "ng-template-sd-require-binding-attrs": ngTemplateSdRequireBindingAttrs,
12
+ "no-hard-private": noHardPrivate,
13
+ "no-subpath-imports-from-simplysm": noSubpathImportsFromSimplysm,
14
+ "ts-no-throw-not-implemented-error": tsNoThrowNotImplementedError,
15
+ "ts-no-unused-injects": tsNoUnusedInjects,
16
+ "ts-no-unused-protected-readonly": tsNoUnusedProtectedReadonly,
17
+ },
10
18
  };
11
- export {
12
- eslint_plugin_default as default
13
- };
14
- //# sourceMappingURL=eslint-plugin.js.map
19
+ //# sourceMappingURL=eslint-plugin.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/eslint-plugin.ts"],
4
- "mappings": "AAAA,OAAO,mBAAmB;AAC1B,OAAO,kCAAkC;AACzC,OAAO,kCAAkC;AAEzC,IAAO,wBAAQ;AAAA,EACb,OAAO;AAAA,IACL,mBAAmB;AAAA,IACnB,oCAAoC;AAAA,IACpC,qCAAqC;AAAA,EACvC;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"eslint-plugin.js","sourceRoot":"","sources":["../src/eslint-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,sCAAsC,CAAC;AAC5E,OAAO,+BAA+B,MAAM,8CAA8C,CAAC;AAC3F,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,4BAA4B,MAAM,0CAA0C,CAAC;AACpF,OAAO,4BAA4B,MAAM,2CAA2C,CAAC;AACrF,OAAO,iBAAiB,MAAM,8BAA8B,CAAC;AAC7D,OAAO,2BAA2B,MAAM,yCAAyC,CAAC;AAElF,eAAe;IACb,KAAK,EAAE;QACL,8BAA8B,EAAE,wBAAwB;QACxD,sCAAsC,EAAE,+BAA+B;QACvE,iBAAiB,EAAE,aAAa;QAChC,kCAAkC,EAAE,4BAA4B;QAChE,mCAAmC,EAAE,4BAA4B;QACjE,sBAAsB,EAAE,iBAAiB;QACzC,iCAAiC,EAAE,2BAA2B;KAC/D;CACF,CAAC"}
@@ -1,3 +1,4 @@
1
- declare const _default: import("eslint/config").Config[];
1
+ import { type FlatConfig } from "typescript-eslint";
2
+ declare const _default: FlatConfig.ConfigArray;
2
3
  export default _default;
3
4
  //# sourceMappingURL=eslint-recommended.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eslint-recommended.d.ts","sourceRoot":"","sources":["../src/eslint-recommended.ts"],"names":[],"mappings":";AA+EA,wBA6MG"}
1
+ {"version":3,"file":"eslint-recommended.d.ts","sourceRoot":"","sources":["../src/eslint-recommended.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;;AA2D9D,wBAwJE"}