@codegraft/rules 0.1.0-beta.0 → 0.1.0-beta.10

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 CHANGED
@@ -33,7 +33,7 @@ transform.transform("import { Foo } from 'm'\nlet v: Foo", {})
33
33
  // → "import type { Foo } from 'm'\nlet v: Foo"
34
34
  ```
35
35
 
36
- It works on every JS-family grammar (JS / JSX / TS / TSX) and, through a `ZoneSplitter`, the `<script>` of a Vue SFC.
36
+ It works on every JS-family grammar (JS / JSX / TS / TSX) and, through a `ZoneSplitter`, a Vue SFC — pruning the `<script>` while keeping a binding used only from a sibling zone: a component `<Tag>`, a custom `v-directive`, an interpolation/binding expression, a `<style> v-bind()`, or a second `<script>`.
37
37
 
38
38
  The rule module is also a ready codemod (default export + `targets: ['javascript', 'typescript', 'tsx']`), so the CLI runs it directly — `.vue` `<script>` included, via the cli's built-in splitter:
39
39
 
@@ -2,9 +2,13 @@ import type { GrammarId } from '@codegraft/core';
2
2
  /**
3
3
  * Remove imports with no reference, and rewrite a value import used only in type positions into a
4
4
  * type import — the analogue of `eslint-plugin-unused-imports` plus the import half of
5
- * `@typescript-eslint/consistent-type-imports`. Syntactic and single-file; confident-or-abstain, so
6
- * a binding the scope resolver can't resolve is left untouched rather than deleted. Runs on every
7
- * JS-family grammar and, through a `ZoneSplitter`, the `<script>` of a Vue SFC.
5
+ * `@typescript-eslint/consistent-type-imports`. Syntactic and single-file, confident-or-abstain: an
6
+ * import whose use isn't decidable is kept. The scope resolver's rename-safety abstentions (a TS
7
+ * namespace, `declare module`) don't block pruning — a syntactic use-scan covers them; only `with`
8
+ * and `eval`, which can reach a name invisibly, force a no-op. Runs on every JS-family grammar and,
9
+ * through a `ZoneSplitter`, a Vue SFC: a binding used only from a sibling zone — the template's
10
+ * expression zones, a component `<Tag>`, a custom `v-directive`, a `<style> v-bind()`, or a second
11
+ * `<script>` — is kept, not pruned.
8
12
  */
9
13
  export declare const removeUnusedImports: import("@codegraft/codemod").Codemod<Record<string, unknown>, GrammarId>;
10
14
  export default removeUnusedImports;
@@ -1 +1 @@
1
- {"version":3,"file":"remove-unused-imports.d.ts","sourceRoot":"","sources":["../src/remove-unused-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG5D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,0EAgF9B,CAAA;AAEF,eAAe,mBAAmB,CAAA;AAIlC,eAAO,MAAM,OAAO,EAAE,SAAS,EAAwC,CAAA"}
1
+ {"version":3,"file":"remove-unused-imports.d.ts","sourceRoot":"","sources":["../src/remove-unused-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,SAAS,EAAY,MAAM,iBAAiB,CAAA;AAgDtE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,0EAyI9B,CAAA;AAEF,eAAe,mBAAmB,CAAA;AAIlC,eAAO,MAAM,OAAO,EAAE,SAAS,EAAwC,CAAA"}
@@ -1,12 +1,62 @@
1
1
  import { defineCodemod } from '@codegraft/codemod';
2
+ // `my-widget` / `MyWidget` / `myWidget` → `MyWidget`; each hyphen drops and caps the next letter.
3
+ const pascalCase = (name) => name.replace(/(^|-)([a-z])/g, (_m, _sep, c) => c.toUpperCase());
4
+ const camelCase = (name) => {
5
+ const pascal = pascalCase(name);
6
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
7
+ };
8
+ // Vue's built-in directives bind no import, unlike a custom `v-my-dir` (which maps to a `vMyDir` local).
9
+ const BUILTIN_DIRECTIVES = new Set([
10
+ 'v-if', 'v-else', 'v-else-if', 'v-for', 'v-show', 'v-bind', 'v-on',
11
+ 'v-model', 'v-slot', 'v-html', 'v-text', 'v-pre', 'v-once', 'v-cloak', 'v-memo',
12
+ ]);
13
+ /**
14
+ * Binding names a Vue template references *outside* a JS expression — component tags (`<MyWidget>` /
15
+ * `<my-widget>` → `MyWidget`/`myWidget`) and custom directives (`v-my-dir` → `vMyDir`), which live in
16
+ * vue `tag_name` / `directive_name` nodes. Native elements (`<div>`) and built-in directives are
17
+ * excluded — never an imported binding. These are always value uses; empty for a non-SFC file.
18
+ */
19
+ function vueTemplateBindings(root) {
20
+ const names = new Set();
21
+ root.find('tag_name').forEach((tag) => {
22
+ const name = tag.text;
23
+ if (/^[A-Z]/.test(name) || name.includes('-'))
24
+ names.add(pascalCase(name)).add(camelCase(name));
25
+ });
26
+ root.find('directive_name').forEach((dir) => {
27
+ const name = dir.text;
28
+ if (name.startsWith('v-') && !BUILTIN_DIRECTIVES.has(name))
29
+ names.add('v' + pascalCase(name.slice(2)));
30
+ });
31
+ return names;
32
+ }
33
+ /** The tree (zone) root a node belongs to — for telling a binding's own zone from its siblings. */
34
+ const treeRootOf = (node) => {
35
+ let cur = node;
36
+ while (cur.parent)
37
+ cur = cur.parent;
38
+ return cur;
39
+ };
40
+ /** A value identifier that is not the head of a qualified type (`NS.Thing`, which is a type use). */
41
+ const isValueRef = (ref) => {
42
+ const parent = ref.parent;
43
+ return !(parent?.type === 'nested_type_identifier' && parent.child('module') === ref);
44
+ };
2
45
  /**
3
46
  * Remove imports with no reference, and rewrite a value import used only in type positions into a
4
47
  * type import — the analogue of `eslint-plugin-unused-imports` plus the import half of
5
- * `@typescript-eslint/consistent-type-imports`. Syntactic and single-file; confident-or-abstain, so
6
- * a binding the scope resolver can't resolve is left untouched rather than deleted. Runs on every
7
- * JS-family grammar and, through a `ZoneSplitter`, the `<script>` of a Vue SFC.
48
+ * `@typescript-eslint/consistent-type-imports`. Syntactic and single-file, confident-or-abstain: an
49
+ * import whose use isn't decidable is kept. The scope resolver's rename-safety abstentions (a TS
50
+ * namespace, `declare module`) don't block pruning — a syntactic use-scan covers them; only `with`
51
+ * and `eval`, which can reach a name invisibly, force a no-op. Runs on every JS-family grammar and,
52
+ * through a `ZoneSplitter`, a Vue SFC: a binding used only from a sibling zone — the template's
53
+ * expression zones, a component `<Tag>`, a custom `v-directive`, a `<style> v-bind()`, or a second
54
+ * `<script>` — is kept, not pruned.
8
55
  */
9
56
  export const removeUnusedImports = defineCodemod((root) => {
57
+ // True only when there is more than one parsed zone (a Vue SFC). A plain single-grammar file has no
58
+ // sibling zone to consult, so it skips the cross-zone work below — the sibling scan and template names.
59
+ const multiZone = root.nodes().length > 1;
10
60
  // The resolver reports only value (`identifier`) references, so type-position uses are gathered
11
61
  // separately: every `type_identifier`, plus the `identifier` head of a qualified type (`NS.x`).
12
62
  const typeRefs = new Set();
@@ -16,6 +66,42 @@ export const removeUnusedImports = defineCodemod((root) => {
16
66
  if (head.type === 'identifier')
17
67
  typeRefs.add(head.text);
18
68
  });
69
+ // A `typeof X` type query holds its operand as a value `identifier` (the head of any member or
70
+ // instantiation chain — `typeof a.b`, `typeof g<T>`), so it never lexes as a `type_identifier`.
71
+ // Without this, a type-only import used solely through `typeof` reads as unreferenced — its
72
+ // `isType` binding scores `valueUsed === false` — and is wrongly pruned.
73
+ root.find('type_query').forEach((query) => query.find('identifier').forEach((id) => typeRefs.add(id.text)));
74
+ // Component tags / custom directives a Vue template references — a value use the JS scans can't see.
75
+ const templateNames = multiZone ? vueTemplateBindings(root) : new Set();
76
+ // The resolver abstains on the whole file at a construct it can't rename through — a TS namespace,
77
+ // `declare module`/`declare global`. Use-detection still holds (an import is used iff its name
78
+ // appears as a value identifier), so scan — unless `with`/`eval` can reach a name invisibly (null).
79
+ let fallback;
80
+ const syntacticRefs = (name) => {
81
+ if (!fallback) {
82
+ const dynamic = root.find('with_statement').size() > 0 || root.find('call_expression', { function: 'eval' }).size() > 0;
83
+ const refs = new Map();
84
+ if (!dynamic) {
85
+ // Value uses lex as `identifier` (call, `typeof x`, JSX tag, `member_expression` head) or
86
+ // `shorthand_property_identifier` (`{ x }`); a `.member`/key is a `property_identifier`. The
87
+ // import's own specifiers are `identifier`s too, so skip anything inside an import statement.
88
+ const add = (node) => {
89
+ for (let a = node.parent; a; a = a.parent)
90
+ if (a.type === 'import_statement')
91
+ return;
92
+ const list = refs.get(node.text);
93
+ if (list)
94
+ list.push(node);
95
+ else
96
+ refs.set(node.text, [node]);
97
+ };
98
+ root.find('identifier').nodes().forEach(add);
99
+ root.find('shorthand_property_identifier').nodes().forEach(add);
100
+ }
101
+ fallback = { dynamic, refs };
102
+ }
103
+ return fallback.dynamic ? null : (fallback.refs.get(name) ?? []);
104
+ };
19
105
  root.find('import_statement').forEach((stmt) => {
20
106
  const clause = stmt.children().filter((child) => child.type === 'import_clause').first();
21
107
  if (clause.size() === 0)
@@ -42,16 +128,28 @@ export const removeUnusedImports = defineCodemod((root) => {
42
128
  // Keep each referenced binding, recording whether its only references are type-position ones.
43
129
  const kept = [];
44
130
  for (const binding of bindings) {
45
- const references = binding.local.references();
46
- if (!references)
47
- return; // resolver abstains on this file — leave the statement untouched
131
+ const resolved = binding.local.references();
132
+ const refNodes = resolved ? resolved.nodes() : syntacticRefs(binding.local.text);
133
+ if (!refNodes)
134
+ return; // resolver abstained and `with`/`eval` make use-detection unsound — skip
48
135
  const declaration = binding.local.node;
49
- const valueUsed = !binding.isType &&
50
- references.nodes().some((ref) => {
51
- // A qualified-type head (`NS.Thing`) lexes as a value identifier but is a type use.
52
- const parent = ref.parent;
53
- return ref !== declaration && !(parent?.type === 'nested_type_identifier' && parent.child('module') === ref);
54
- });
136
+ // The resolver (and the syntactic fallback's own-tree refs) only sees the binding's own zone
137
+ // tree. In a multi-zone file — a Vue SFC's template-expression zones, a second `<script>` — the
138
+ // same binding is reachable from a sibling zone, where the use lexes as a plain value identifier
139
+ // and is always a value use (a template / `v-bind` runs at runtime). Consult that even when the
140
+ // resolver succeeded skipping it is exactly what hid template usage. An unsound scan
141
+ // (`with`/`eval`) with sibling zones present can't rule a use out, so abstain.
142
+ let usedInSibling = false;
143
+ if (multiZone) {
144
+ const occurrences = syntacticRefs(binding.local.text);
145
+ if (!occurrences)
146
+ return;
147
+ const ownTree = treeRootOf(declaration);
148
+ usedInSibling = occurrences.some((ref) => treeRootOf(ref) !== ownTree && isValueRef(ref));
149
+ }
150
+ const valueUsed = templateNames.has(binding.local.text) || // a component tag / custom directive (a value use)
151
+ usedInSibling ||
152
+ (!binding.isType && refNodes.some((ref) => ref !== declaration && isValueRef(ref)));
55
153
  if (!valueUsed && !typeRefs.has(binding.local.text))
56
154
  continue; // unreferenced
57
155
  kept.push({ ...binding, typeOnly: !valueUsed });
@@ -77,7 +175,10 @@ export const removeUnusedImports = defineCodemod((root) => {
77
175
  }
78
176
  if (specifiers.length)
79
177
  leading.push(`{ ${specifiers.join(', ')} }`);
80
- stmt.replaceWith(`${asTypeStatement ? 'import type' : 'import'} ${leading.join(', ')} from ${stmt.field('source').text}`);
178
+ // The `;` is part of the import_statement node, so the rewrite must carry it back — preserve the
179
+ // original's terminator (present, or omitted under ASI) rather than dropping it.
180
+ const semi = stmt.node.text.endsWith(';') ? ';' : '';
181
+ stmt.replaceWith(`${asTypeStatement ? 'import type' : 'import'} ${leading.join(', ')} from ${stmt.field('source').text}${semi}`);
81
182
  });
82
183
  });
83
184
  export default removeUnusedImports;
@@ -1 +1 @@
1
- {"version":3,"file":"remove-unused-imports.js","sourceRoot":"","sources":["../src/remove-unused-imports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remove-unused-imports.js","sourceRoot":"","sources":["../src/remove-unused-imports.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codegraft/rules",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.1.0-beta.10",
4
4
  "description": "Ready-made Codegraft codemods — ESLint-rule-style transforms (e.g. removeUnusedImports), one rule per module, tree-shakeable.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,11 +29,11 @@
29
29
  "node": ">=22.13"
30
30
  },
31
31
  "dependencies": {
32
- "@codegraft/codemod": "0.1.0-beta.0",
33
- "@codegraft/core": "0.1.0-beta.0"
32
+ "@codegraft/codemod": "0.1.0-beta.10",
33
+ "@codegraft/core": "0.1.0-beta.10"
34
34
  },
35
35
  "devDependencies": {
36
- "@codegraft/vue": "0.1.0-beta.0"
36
+ "@codegraft/vue": "0.1.0-beta.10"
37
37
  },
38
38
  "scripts": {
39
39
  "build": "tsc -b"