@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.
- package/README.md +66 -40
- package/dist/eslint-plugin.d.ts +12 -0
- package/dist/eslint-plugin.d.ts.map +1 -1
- package/dist/eslint-plugin.js +15 -10
- package/dist/eslint-plugin.js.map +1 -6
- package/dist/eslint-recommended.d.ts +2 -1
- package/dist/eslint-recommended.d.ts.map +1 -1
- package/dist/eslint-recommended.js +159 -242
- package/dist/eslint-recommended.js.map +1 -6
- package/dist/rules/ng-template-no-todo-comments.d.ts +12 -0
- package/dist/rules/ng-template-no-todo-comments.d.ts.map +1 -0
- package/dist/rules/ng-template-no-todo-comments.js +46 -0
- package/dist/rules/ng-template-no-todo-comments.js.map +1 -0
- package/dist/rules/ng-template-sd-require-binding-attrs.d.ts +18 -0
- package/dist/rules/ng-template-sd-require-binding-attrs.d.ts.map +1 -0
- package/dist/rules/ng-template-sd-require-binding-attrs.js +88 -0
- package/dist/rules/ng-template-sd-require-binding-attrs.js.map +1 -0
- package/dist/rules/no-hard-private.d.ts +6 -6
- package/dist/rules/no-hard-private.js +109 -88
- package/dist/rules/no-hard-private.js.map +1 -6
- package/dist/rules/no-subpath-imports-from-simplysm.d.ts +5 -5
- package/dist/rules/no-subpath-imports-from-simplysm.js +72 -60
- package/dist/rules/no-subpath-imports-from-simplysm.js.map +1 -6
- package/dist/rules/ts-no-throw-not-implemented-error.d.ts +5 -5
- package/dist/rules/ts-no-throw-not-implemented-error.js +92 -58
- package/dist/rules/ts-no-throw-not-implemented-error.js.map +1 -6
- package/dist/rules/ts-no-unused-injects.d.ts +13 -0
- package/dist/rules/ts-no-unused-injects.d.ts.map +1 -0
- package/dist/rules/ts-no-unused-injects.js +81 -0
- package/dist/rules/ts-no-unused-injects.js.map +1 -0
- package/dist/rules/ts-no-unused-protected-readonly.d.ts +13 -0
- package/dist/rules/ts-no-unused-protected-readonly.d.ts.map +1 -0
- package/dist/rules/ts-no-unused-protected-readonly.js +127 -0
- package/dist/rules/ts-no-unused-protected-readonly.js.map +1 -0
- package/dist/utils/create-rule.d.ts +3 -3
- package/dist/utils/create-rule.js +19 -7
- package/dist/utils/create-rule.js.map +1 -6
- package/package.json +10 -11
- package/src/eslint-plugin.ts +8 -0
- package/src/eslint-recommended.ts +43 -116
- package/src/rules/ng-template-no-todo-comments.ts +48 -0
- package/src/rules/ng-template-sd-require-binding-attrs.ts +111 -0
- package/src/rules/no-hard-private.ts +23 -23
- package/src/rules/no-subpath-imports-from-simplysm.ts +13 -13
- package/src/rules/ts-no-throw-not-implemented-error.ts +14 -14
- package/src/rules/ts-no-unused-injects.ts +88 -0
- package/src/rules/ts-no-unused-protected-readonly.ts +151 -0
- package/src/utils/create-rule.ts +3 -3
- package/tests/no-hard-private.spec.ts +0 -888
- package/tests/no-subpath-imports-from-simplysm.spec.ts +0 -311
- package/tests/recommended.spec.ts +0 -145
- package/tests/ts-no-throw-not-implemented-error.spec.ts +0 -245
- package/tests/vitest.setup.ts +0 -10
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @simplysm/lint
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
13
|
+
### `@simplysm/lint/eslint-plugin`
|
|
14
14
|
|
|
15
|
-
|
|
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
|
-
|
|
17
|
+
```typescript
|
|
18
|
+
import plugin from "@simplysm/lint/eslint-plugin";
|
|
19
|
+
```
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
Default export: `{ rules: { ... } }`
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
#### Rules
|
|
25
24
|
|
|
26
25
|
| Rule | Type | Fixable | Description |
|
|
27
|
-
|
|
28
|
-
| `no-
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
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
|
-
###
|
|
35
|
+
### `@simplysm/lint/eslint-recommended`
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
Pre-configured ESLint flat config for Simplysm projects.
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
43
|
+
Default export: a complete ESLint flat config array (from `tseslint.config()`).
|
|
44
44
|
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
+
#### Key Rules Enabled
|
|
57
54
|
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
87
|
+
export default [
|
|
88
|
+
...recommended,
|
|
89
|
+
// add project-specific overrides here
|
|
90
|
+
];
|
|
63
91
|
```
|
|
64
92
|
|
|
65
|
-
### Use
|
|
93
|
+
### Use plugin rules individually
|
|
66
94
|
|
|
67
|
-
```
|
|
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-
|
|
77
|
-
"@simplysm/ts-no-throw-not-implemented-error": "warn",
|
|
103
|
+
"@simplysm/ts-no-unused-injects": "error",
|
|
78
104
|
},
|
|
79
105
|
},
|
|
80
106
|
];
|
package/dist/eslint-plugin.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"eslint-plugin.d.ts","sourceRoot":"","sources":["../src/eslint-plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAUE"}
|
package/dist/eslint-plugin.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-recommended.d.ts","sourceRoot":"","sources":["../src/eslint-recommended.ts"],"names":[],"mappings":"
|
|
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"}
|