sovr-patch 0.2.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.

Potentially problematic release.


This version of sovr-patch might be problematic. Click here for more details.

Files changed (102) hide show
  1. package/LICENSE +66 -0
  2. package/README.md +112 -0
  3. package/dist/audit/engine.js +140 -0
  4. package/dist/audit/engine.js.map +1 -0
  5. package/dist/audit/packs.js +21 -0
  6. package/dist/audit/packs.js.map +1 -0
  7. package/dist/audit/report.js +79 -0
  8. package/dist/audit/report.js.map +1 -0
  9. package/dist/audit/types.js +5 -0
  10. package/dist/audit/types.js.map +1 -0
  11. package/dist/cli/help.js +108 -0
  12. package/dist/cli/help.js.map +1 -0
  13. package/dist/cli/parse-argv.js +73 -0
  14. package/dist/cli/parse-argv.js.map +1 -0
  15. package/dist/commands/activate.js +179 -0
  16. package/dist/commands/activate.js.map +1 -0
  17. package/dist/commands/audit.js +89 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/ci-gate.js +239 -0
  20. package/dist/commands/ci-gate.js.map +1 -0
  21. package/dist/commands/list-rules.js +11 -0
  22. package/dist/commands/list-rules.js.map +1 -0
  23. package/dist/commands/run.js +107 -0
  24. package/dist/commands/run.js.map +1 -0
  25. package/dist/commands/status.js +174 -0
  26. package/dist/commands/status.js.map +1 -0
  27. package/dist/core/engine.js +68 -0
  28. package/dist/core/engine.js.map +1 -0
  29. package/dist/core/license.js +243 -0
  30. package/dist/core/license.js.map +1 -0
  31. package/dist/core/load-project.js +41 -0
  32. package/dist/core/load-project.js.map +1 -0
  33. package/dist/core/report.js +68 -0
  34. package/dist/core/report.js.map +1 -0
  35. package/dist/core/rollback.js +160 -0
  36. package/dist/core/rollback.js.map +1 -0
  37. package/dist/core/safe-apply.js +75 -0
  38. package/dist/core/safe-apply.js.map +1 -0
  39. package/dist/core/types.js +3 -0
  40. package/dist/core/types.js.map +1 -0
  41. package/dist/core/update-check.js +162 -0
  42. package/dist/core/update-check.js.map +1 -0
  43. package/dist/core/verify.js +32 -0
  44. package/dist/core/verify.js.map +1 -0
  45. package/dist/index.js +124 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/patch/apply.js +14 -0
  48. package/dist/patch/apply.js.map +1 -0
  49. package/dist/patch/overlap.js +12 -0
  50. package/dist/patch/overlap.js.map +1 -0
  51. package/dist/patch/preview.js +48 -0
  52. package/dist/patch/preview.js.map +1 -0
  53. package/dist/rules/design-token/classify.js +16 -0
  54. package/dist/rules/design-token/classify.js.map +1 -0
  55. package/dist/rules/design-token/locate.js +113 -0
  56. package/dist/rules/design-token/locate.js.map +1 -0
  57. package/dist/rules/design-token/presets.js +53 -0
  58. package/dist/rules/design-token/presets.js.map +1 -0
  59. package/dist/rules/design-token/rule.js +13 -0
  60. package/dist/rules/design-token/rule.js.map +1 -0
  61. package/dist/rules/design-token/schema.js +84 -0
  62. package/dist/rules/design-token/schema.js.map +1 -0
  63. package/dist/rules/design-token/transform.js +27 -0
  64. package/dist/rules/design-token/transform.js.map +1 -0
  65. package/dist/rules/field-rename/classify.js +77 -0
  66. package/dist/rules/field-rename/classify.js.map +1 -0
  67. package/dist/rules/field-rename/locate.js +294 -0
  68. package/dist/rules/field-rename/locate.js.map +1 -0
  69. package/dist/rules/field-rename/rule.js +13 -0
  70. package/dist/rules/field-rename/rule.js.map +1 -0
  71. package/dist/rules/field-rename/schema.js +35 -0
  72. package/dist/rules/field-rename/schema.js.map +1 -0
  73. package/dist/rules/field-rename/transform.js +160 -0
  74. package/dist/rules/field-rename/transform.js.map +1 -0
  75. package/dist/rules/inline-style/classify.js +17 -0
  76. package/dist/rules/inline-style/classify.js.map +1 -0
  77. package/dist/rules/inline-style/locate.js +163 -0
  78. package/dist/rules/inline-style/locate.js.map +1 -0
  79. package/dist/rules/inline-style/presets.js +71 -0
  80. package/dist/rules/inline-style/presets.js.map +1 -0
  81. package/dist/rules/inline-style/rule.js +13 -0
  82. package/dist/rules/inline-style/rule.js.map +1 -0
  83. package/dist/rules/inline-style/schema.js +97 -0
  84. package/dist/rules/inline-style/schema.js.map +1 -0
  85. package/dist/rules/inline-style/transform.js +52 -0
  86. package/dist/rules/inline-style/transform.js.map +1 -0
  87. package/dist/rules/nullish-fallback/classify.js +22 -0
  88. package/dist/rules/nullish-fallback/classify.js.map +1 -0
  89. package/dist/rules/nullish-fallback/locate.js +175 -0
  90. package/dist/rules/nullish-fallback/locate.js.map +1 -0
  91. package/dist/rules/nullish-fallback/rule.js +13 -0
  92. package/dist/rules/nullish-fallback/rule.js.map +1 -0
  93. package/dist/rules/nullish-fallback/schema.js +10 -0
  94. package/dist/rules/nullish-fallback/schema.js.map +1 -0
  95. package/dist/rules/nullish-fallback/transform.js +49 -0
  96. package/dist/rules/nullish-fallback/transform.js.map +1 -0
  97. package/dist/rules/registry.js +21 -0
  98. package/dist/rules/registry.js.map +1 -0
  99. package/dist/rules/types.js +2 -0
  100. package/dist/rules/types.js.map +1 -0
  101. package/license.json +13 -0
  102. package/package.json +64 -0
@@ -0,0 +1,294 @@
1
+ import path from "node:path";
2
+ import { Node, SyntaxKind } from "ts-morph";
3
+ import { parseFromPath } from "./schema.js";
4
+ // ─── Helpers ────────────────────────────────────────────────────
5
+ function getColumnFromNode(node) {
6
+ const sourceFile = node.getSourceFile();
7
+ const lineStarts = sourceFile.compilerNode.getLineStarts();
8
+ const lineIndex = node.getStartLineNumber() - 1;
9
+ const lineStart = lineStarts[lineIndex] ?? 0;
10
+ return node.getStart() - lineStart + 1;
11
+ }
12
+ // ─── Chain extraction ───────────────────────────────────────────
13
+ export function extractAccessChain(node) {
14
+ const parts = [];
15
+ let current = node;
16
+ while (Node.isPropertyAccessExpression(current)) {
17
+ parts.unshift(current.getName());
18
+ current = current.getExpression();
19
+ }
20
+ if (Node.isIdentifier(current)) {
21
+ parts.unshift(current.getText());
22
+ return parts;
23
+ }
24
+ if (current.getKind() === SyntaxKind.ThisKeyword) {
25
+ parts.unshift("this");
26
+ return parts;
27
+ }
28
+ return null;
29
+ }
30
+ function chainsEqual(a, b) {
31
+ if (a.length !== b.length)
32
+ return false;
33
+ return a.every((item, index) => item === b[index]);
34
+ }
35
+ // ─── Value reference scanner ────────────────────────────────────
36
+ function scanValueReferences(context, parsedRule, results) {
37
+ for (const sourceFile of context.loaded.sourceFiles) {
38
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
39
+ for (const node of nodes) {
40
+ const accessChain = extractAccessChain(node);
41
+ if (!accessChain)
42
+ continue;
43
+ if (!chainsEqual(accessChain, parsedRule.fullChain))
44
+ continue;
45
+ results.push({
46
+ node,
47
+ hit: {
48
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
49
+ line: node.getStartLineNumber(),
50
+ column: getColumnFromNode(node),
51
+ sourceText: node.getText(),
52
+ severity: "safe",
53
+ reason: "property-access-match",
54
+ start: node.getStart(),
55
+ end: node.getEnd(),
56
+ metadata: {
57
+ kind: "value-ref",
58
+ accessChain,
59
+ rootIdentifier: accessChain[0],
60
+ },
61
+ },
62
+ });
63
+ }
64
+ }
65
+ }
66
+ // ─── Property key scanner ───────────────────────────────────────
67
+ function scanPropertyKeys(context, parsedRule, results) {
68
+ const targetKey = parsedRule.lastProperty;
69
+ for (const sourceFile of context.loaded.sourceFiles) {
70
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAssignment);
71
+ for (const node of nodes) {
72
+ const nameNode = node.getNameNode();
73
+ if (Node.isComputedPropertyName(nameNode))
74
+ continue;
75
+ const keyName = nameNode.getText();
76
+ const cleanKey = keyName.replace(/^["']|["']$/g, "");
77
+ if (cleanKey !== targetKey)
78
+ continue;
79
+ let severity = "safe";
80
+ let reason = "object-property-key";
81
+ if (keyName.startsWith('"') || keyName.startsWith("'")) {
82
+ severity = "ambiguous";
83
+ reason = "quoted-property-key";
84
+ }
85
+ results.push({
86
+ node,
87
+ hit: {
88
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
89
+ line: nameNode.getStartLineNumber(),
90
+ column: getColumnFromNode(nameNode),
91
+ sourceText: node.getText().slice(0, 60),
92
+ severity,
93
+ reason,
94
+ start: nameNode.getStart(),
95
+ end: nameNode.getEnd(),
96
+ metadata: {
97
+ kind: "property-key",
98
+ },
99
+ },
100
+ });
101
+ }
102
+ }
103
+ }
104
+ // ─── Type/interface field scanner ───────────────────────────────
105
+ function scanTypeFields(context, parsedRule, results) {
106
+ const targetKey = parsedRule.lastProperty;
107
+ for (const sourceFile of context.loaded.sourceFiles) {
108
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.PropertySignature);
109
+ for (const node of nodes) {
110
+ const name = node.getName();
111
+ if (name !== targetKey)
112
+ continue;
113
+ const nameNode = node.getNameNode();
114
+ results.push({
115
+ node,
116
+ hit: {
117
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
118
+ line: nameNode.getStartLineNumber(),
119
+ column: getColumnFromNode(nameNode),
120
+ sourceText: node.getText().slice(0, 60),
121
+ severity: "safe",
122
+ reason: "type-field-signature",
123
+ start: nameNode.getStart(),
124
+ end: nameNode.getEnd(),
125
+ metadata: {
126
+ kind: "type-field",
127
+ },
128
+ },
129
+ });
130
+ }
131
+ }
132
+ }
133
+ // ─── Shorthand property scanner ─────────────────────────────────
134
+ function scanShorthandProperties(context, parsedRule, results) {
135
+ const targetKey = parsedRule.lastProperty;
136
+ for (const sourceFile of context.loaded.sourceFiles) {
137
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.ShorthandPropertyAssignment);
138
+ for (const node of nodes) {
139
+ const name = node.getName();
140
+ if (name !== targetKey)
141
+ continue;
142
+ const nameNode = node.getNameNode();
143
+ results.push({
144
+ node,
145
+ hit: {
146
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
147
+ line: nameNode.getStartLineNumber(),
148
+ column: getColumnFromNode(nameNode),
149
+ sourceText: node.getText(),
150
+ severity: "safe",
151
+ reason: "shorthand-property-assignment",
152
+ start: nameNode.getStart(),
153
+ end: nameNode.getEnd(),
154
+ metadata: {
155
+ kind: "shorthand",
156
+ },
157
+ },
158
+ });
159
+ }
160
+ }
161
+ }
162
+ // ─── Destructuring binding scanner ──────────────────────────────
163
+ /**
164
+ * Scan for destructuring patterns like:
165
+ * const { baseUrl } = config;
166
+ * const { baseUrl: url } = config;
167
+ * const { baseUrl, apiKey } = config;
168
+ *
169
+ * These are BindingElement nodes inside ObjectBindingPattern.
170
+ * We detect when the property name matches the target field.
171
+ */
172
+ function scanDestructuringBindings(context, parsedRule, results) {
173
+ const targetKey = parsedRule.lastProperty;
174
+ for (const sourceFile of context.loaded.sourceFiles) {
175
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.BindingElement);
176
+ for (const node of nodes) {
177
+ // BindingElement can have:
178
+ // - propertyName (the key being destructured from) — may be absent for shorthand
179
+ // - name (the local variable name)
180
+ //
181
+ // For `const { baseUrl } = config`:
182
+ // propertyName = undefined, name = "baseUrl"
183
+ // → shorthand destructuring, key = name
184
+ //
185
+ // For `const { baseUrl: url } = config`:
186
+ // propertyName = "baseUrl", name = "url"
187
+ // → renamed destructuring, key = propertyName
188
+ const propertyNameNode = node.getPropertyNameNode();
189
+ const nameNode = node.getNameNode();
190
+ // Determine the "key" being destructured
191
+ let keyName;
192
+ let isShorthand;
193
+ if (propertyNameNode) {
194
+ // Renamed destructuring: { baseUrl: url }
195
+ keyName = propertyNameNode.getText();
196
+ isShorthand = false;
197
+ }
198
+ else if (Node.isIdentifier(nameNode)) {
199
+ // Shorthand destructuring: { baseUrl }
200
+ keyName = nameNode.getText();
201
+ isShorthand = true;
202
+ }
203
+ else {
204
+ continue;
205
+ }
206
+ if (keyName !== targetKey)
207
+ continue;
208
+ // Determine the full text range to replace
209
+ // For shorthand: `baseUrl` → `apiBaseUrl: baseUrl`
210
+ // (rename the key, keep old name as local alias)
211
+ // For renamed: `baseUrl: url` → `apiBaseUrl: url`
212
+ // (rename just the key, keep the alias)
213
+ // The node's full text includes everything: `baseUrl` or `baseUrl: url` or `baseUrl = default`
214
+ const nodeStart = node.getStart();
215
+ const nodeEnd = node.getEnd();
216
+ results.push({
217
+ node,
218
+ hit: {
219
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
220
+ line: node.getStartLineNumber(),
221
+ column: getColumnFromNode(node),
222
+ sourceText: node.getText(),
223
+ severity: "safe",
224
+ reason: isShorthand ? "destructuring-shorthand" : "destructuring-renamed",
225
+ start: nodeStart,
226
+ end: nodeEnd,
227
+ metadata: {
228
+ kind: "destructuring",
229
+ isShorthand,
230
+ keyName,
231
+ localName: Node.isIdentifier(nameNode) ? nameNode.getText() : undefined,
232
+ hasDefault: node.getInitializer() !== undefined,
233
+ defaultText: node.getInitializer()?.getText(),
234
+ },
235
+ },
236
+ });
237
+ }
238
+ }
239
+ }
240
+ // ─── this. chain scanner ────────────────────────────────────────
241
+ function scanThisChainReferences(context, parsedRule, results) {
242
+ const thisChain = ["this", ...parsedRule.fullChain];
243
+ for (const sourceFile of context.loaded.sourceFiles) {
244
+ const nodes = sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
245
+ for (const node of nodes) {
246
+ const accessChain = extractAccessChain(node);
247
+ if (!accessChain)
248
+ continue;
249
+ if (!chainsEqual(accessChain, thisChain))
250
+ continue;
251
+ results.push({
252
+ node,
253
+ hit: {
254
+ filePath: path.relative(context.loaded.repoPath, sourceFile.getFilePath()),
255
+ line: node.getStartLineNumber(),
256
+ column: getColumnFromNode(node),
257
+ sourceText: node.getText(),
258
+ severity: "safe",
259
+ reason: "this-chain-access",
260
+ start: node.getStart(),
261
+ end: node.getEnd(),
262
+ metadata: {
263
+ kind: "value-ref",
264
+ accessChain,
265
+ rootIdentifier: "this",
266
+ },
267
+ },
268
+ });
269
+ }
270
+ }
271
+ }
272
+ // ─── Main locate entry point ────────────────────────────────────
273
+ export function locateFieldRename(context) {
274
+ const parsedRule = parseFromPath(context.config.from);
275
+ const results = [];
276
+ // 1. Value references: plan.yearlyPrice
277
+ scanValueReferences(context, parsedRule, results);
278
+ // 2. Object property keys: { baseUrl: '...' }
279
+ scanPropertyKeys(context, parsedRule, results);
280
+ // 3. Type/interface fields: interface Foo { baseUrl: string }
281
+ scanTypeFields(context, parsedRule, results);
282
+ // 4. Shorthand properties: { baseUrl }
283
+ scanShorthandProperties(context, parsedRule, results);
284
+ // 5. Destructuring bindings: const { baseUrl } = config
285
+ scanDestructuringBindings(context, parsedRule, results);
286
+ // 6. this. chain auto-merge (when includeThis is set)
287
+ if (context.config.includeThis) {
288
+ if (parsedRule.rootIdentifier !== "this") {
289
+ scanThisChainReferences(context, parsedRule, results);
290
+ }
291
+ }
292
+ return results;
293
+ }
294
+ //# sourceMappingURL=locate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/rules/field-rename/locate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { parseFieldRenameConfig } from "./schema.js";
2
+ import { locateFieldRename } from "./locate.js";
3
+ import { classifyFieldRename } from "./classify.js";
4
+ import { transformFieldRename } from "./transform.js";
5
+ export const fieldRenameRule = {
6
+ name: "field-rename",
7
+ description: "Safe TypeScript field rename across value refs, property keys, and type fields.",
8
+ parseConfig: parseFieldRenameConfig,
9
+ locate: locateFieldRename,
10
+ classify: classifyFieldRename,
11
+ transform: transformFieldRename,
12
+ };
13
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/rules/field-rename/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,CAAC,MAAM,eAAe,GAAsC;IAChE,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,iFAAiF;IAC9F,WAAW,EAAE,sBAAsB;IACnC,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,mBAAmB;IAC7B,SAAS,EAAE,oBAAoB;CAChC,CAAC"}
@@ -0,0 +1,35 @@
1
+ export function parseFieldRenameConfig(input) {
2
+ const from = String(input.from ?? "").trim();
3
+ const to = String(input.to ?? "").trim();
4
+ const fallback = input.fallback == null ? undefined : String(input.fallback);
5
+ const includeThis = input["include-this"] === "true" || input["include-this"] === true || input.includeThis === true;
6
+ if (!from)
7
+ throw new Error(`field-rename: "from" is required`);
8
+ if (!to)
9
+ throw new Error(`field-rename: "to" is required`);
10
+ return {
11
+ from,
12
+ to,
13
+ fallback,
14
+ includeThis,
15
+ };
16
+ }
17
+ export function parseFromPath(from) {
18
+ const trimmed = from.trim();
19
+ if (!trimmed) {
20
+ throw new Error("from cannot be empty");
21
+ }
22
+ // Normalize optional chain syntax: plan?.yearlyPrice → plan.yearlyPrice
23
+ const normalized = trimmed.replace(/\?\./g, ".");
24
+ const parts = normalized.split(".").map((p) => p.trim()).filter(Boolean);
25
+ if (parts.length < 2) {
26
+ throw new Error(`invalid from path: "${from}". Expected at least "object.field"`);
27
+ }
28
+ return {
29
+ rootIdentifier: parts[0],
30
+ propertyChain: parts.slice(1),
31
+ fullChain: parts,
32
+ lastProperty: parts[parts.length - 1],
33
+ };
34
+ }
35
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/rules/field-rename/schema.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CAAC,KAA8B;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC;IAErH,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAE3D,OAAO;QACL,IAAI;QACJ,EAAE;QACF,QAAQ;QACR,WAAW;KACZ,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,wEAAwE;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,qCAAqC,CACjE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;QACxB,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,160 @@
1
+ import { parseFromPath } from "./schema.js";
2
+ // ─── Smart parentheses (P3) ────────────────────────────────────
3
+ function isSimpleExpression(expr) {
4
+ const trimmed = expr.trim();
5
+ // If it contains parens, brackets, operators, template literals → complex
6
+ if (/[()[\]{}+\-*/%<>=!&|^~?:`]/.test(trimmed.replace(/\?\./g, ""))) {
7
+ return false;
8
+ }
9
+ // Just identifiers separated by dots (with optional ?.)
10
+ return /^[a-zA-Z_$][\w$]*(\??\.[\w$]+)*$/.test(trimmed);
11
+ }
12
+ function wrapIfNeeded(expr) {
13
+ return isSimpleExpression(expr) ? expr : `(${expr})`;
14
+ }
15
+ // ─── Value reference replacement ────────────────────────────────
16
+ function stripRootFromToExpression(to, ruleFromRoot) {
17
+ const trimmed = to.trim();
18
+ const prefix = `${ruleFromRoot}.`;
19
+ if (trimmed === ruleFromRoot) {
20
+ return "";
21
+ }
22
+ if (trimmed.startsWith(prefix)) {
23
+ return trimmed.slice(prefix.length);
24
+ }
25
+ throw new Error(`--to must start with "${ruleFromRoot}." for root-preserving rewrite. Received: "${to}"`);
26
+ }
27
+ function buildValueRefReplacement(hit, config) {
28
+ const parsed = parseFromPath(config.from);
29
+ const rootIdentifier = String(hit.metadata?.rootIdentifier ?? "");
30
+ // For this. chain hits
31
+ if (rootIdentifier === "this" && parsed.rootIdentifier !== "this") {
32
+ const strippedTail = stripRootFromToExpression(config.to, parsed.rootIdentifier);
33
+ const expr = strippedTail
34
+ ? `this.${parsed.rootIdentifier}.${strippedTail}`
35
+ : `this.${parsed.rootIdentifier}`;
36
+ if (config.fallback && config.fallback.trim()) {
37
+ return wrapIfNeeded(`${expr} ?? ${config.fallback.trim()}`);
38
+ }
39
+ return wrapIfNeeded(expr);
40
+ }
41
+ const strippedTail = stripRootFromToExpression(config.to, parsed.rootIdentifier);
42
+ let expr = strippedTail
43
+ ? `${rootIdentifier}.${strippedTail}`
44
+ : rootIdentifier;
45
+ if (config.fallback && config.fallback.trim()) {
46
+ expr = `${expr} ?? ${config.fallback.trim()}`;
47
+ }
48
+ return wrapIfNeeded(expr);
49
+ }
50
+ // ─── Key / type field replacement ───────────────────────────────
51
+ function extractNewFieldName(config) {
52
+ const parsed = parseFromPath(config.to);
53
+ return parsed.lastProperty;
54
+ }
55
+ // ─── Shorthand replacement ──────────────────────────────────────
56
+ function buildShorthandReplacement(hit, config) {
57
+ const newKey = extractNewFieldName(config);
58
+ const accessChain = hit.metadata?.accessChain;
59
+ const oldVarName = accessChain?.[0] ?? hit.sourceText;
60
+ return `${newKey}: ${oldVarName}`;
61
+ }
62
+ // ─── Destructuring replacement ──────────────────────────────────
63
+ /**
64
+ * Handle destructuring patterns:
65
+ *
66
+ * Shorthand destructuring:
67
+ * const { baseUrl } = config
68
+ * → const { apiBaseUrl: baseUrl } = config
69
+ * (rename the key, keep old name as local variable alias)
70
+ *
71
+ * Shorthand destructuring with default:
72
+ * const { baseUrl = "" } = config
73
+ * → const { apiBaseUrl: baseUrl = "" } = config
74
+ *
75
+ * Renamed destructuring:
76
+ * const { baseUrl: url } = config
77
+ * → const { apiBaseUrl: url } = config
78
+ * (rename just the key, keep the alias)
79
+ *
80
+ * Renamed destructuring with default:
81
+ * const { baseUrl: url = "" } = config
82
+ * → const { apiBaseUrl: url = "" } = config
83
+ */
84
+ function buildDestructuringReplacement(hit, config) {
85
+ const newKey = extractNewFieldName(config);
86
+ const isShorthand = Boolean(hit.metadata?.isShorthand);
87
+ const localName = String(hit.metadata?.localName ?? "");
88
+ const hasDefault = Boolean(hit.metadata?.hasDefault);
89
+ const defaultText = hit.metadata?.defaultText ? String(hit.metadata.defaultText) : undefined;
90
+ if (isShorthand) {
91
+ // { baseUrl } → { apiBaseUrl: baseUrl }
92
+ // { baseUrl = "" } → { apiBaseUrl: baseUrl = "" }
93
+ if (hasDefault && defaultText) {
94
+ return `${newKey}: ${localName} = ${defaultText}`;
95
+ }
96
+ return `${newKey}: ${localName}`;
97
+ }
98
+ else {
99
+ // { baseUrl: url } → { apiBaseUrl: url }
100
+ // { baseUrl: url = "" } → { apiBaseUrl: url = "" }
101
+ if (hasDefault && defaultText) {
102
+ return `${newKey}: ${localName} = ${defaultText}`;
103
+ }
104
+ return `${newKey}: ${localName}`;
105
+ }
106
+ }
107
+ // ─── Main transform ────────────────────────────────────────────
108
+ export function transformFieldRename(hit, context) {
109
+ const kind = String(hit.metadata?.kind ?? "");
110
+ if (kind === "type-field" || kind === "property-key") {
111
+ const after = extractNewFieldName(context.config);
112
+ return {
113
+ filePath: hit.filePath,
114
+ start: hit.start,
115
+ end: hit.end,
116
+ before: hit.sourceText.slice(0, hit.end - hit.start),
117
+ after,
118
+ ruleName: "field-rename",
119
+ reason: kind,
120
+ };
121
+ }
122
+ if (kind === "value-ref") {
123
+ const after = buildValueRefReplacement(hit, context.config);
124
+ return {
125
+ filePath: hit.filePath,
126
+ start: hit.start,
127
+ end: hit.end,
128
+ before: hit.sourceText,
129
+ after,
130
+ ruleName: "field-rename",
131
+ reason: kind,
132
+ };
133
+ }
134
+ if (kind === "shorthand") {
135
+ const after = buildShorthandReplacement(hit, context.config);
136
+ return {
137
+ filePath: hit.filePath,
138
+ start: hit.start,
139
+ end: hit.end,
140
+ before: hit.sourceText,
141
+ after,
142
+ ruleName: "field-rename",
143
+ reason: kind,
144
+ };
145
+ }
146
+ if (kind === "destructuring") {
147
+ const after = buildDestructuringReplacement(hit, context.config);
148
+ return {
149
+ filePath: hit.filePath,
150
+ start: hit.start,
151
+ end: hit.end,
152
+ before: hit.sourceText,
153
+ after,
154
+ ruleName: "field-rename",
155
+ reason: kind,
156
+ };
157
+ }
158
+ return null;
159
+ }
160
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/rules/field-rename/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Classify inline-style hits.
3
+ *
4
+ * - If ALL properties in the style object are matched → safe (full replacement)
5
+ * - If only SOME properties are matched → ambiguous (partial replacement needs review)
6
+ */
7
+ export function classifyInlineStyle(located, _context) {
8
+ const allMatched = Boolean(located.hit.metadata?.allMatched);
9
+ return {
10
+ ...located.hit,
11
+ severity: allMatched ? "safe" : "ambiguous",
12
+ reason: allMatched
13
+ ? "all-style-properties-mapped"
14
+ : "partial-style-properties-mapped",
15
+ };
16
+ }
17
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/rules/inline-style/classify.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,QAAwC;IAExC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE7D,OAAO;QACL,GAAG,OAAO,CAAC,GAAG;QACd,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;QAC3C,MAAM,EAAE,UAAU;YAChB,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,iCAAiC;KACtC,CAAC;AACJ,CAAC"}