ts-codemod-lib 1.1.3 → 1.3.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.
Files changed (58) hide show
  1. package/README.md +0 -4
  2. package/dist/cmd/append-as-const.mjs +1 -1
  3. package/dist/cmd/convert-interface-to-type.mjs +1 -1
  4. package/dist/cmd/convert-to-readonly.mjs +1 -1
  5. package/dist/cmd/replace-any-with-unknown.mjs +1 -1
  6. package/dist/cmd/replace-record-with-unknown-record.mjs +1 -1
  7. package/dist/entry-point.mjs +1 -1
  8. package/dist/functions/ast-transformers/append-as-const.d.mts.map +1 -1
  9. package/dist/functions/ast-transformers/append-as-const.mjs +11 -5
  10. package/dist/functions/ast-transformers/append-as-const.mjs.map +1 -1
  11. package/dist/functions/ast-transformers/convert-interface-to-type.d.mts.map +1 -1
  12. package/dist/functions/ast-transformers/convert-interface-to-type.mjs +71 -66
  13. package/dist/functions/ast-transformers/convert-interface-to-type.mjs.map +1 -1
  14. package/dist/functions/ast-transformers/convert-to-readonly-type.d.mts +1 -1
  15. package/dist/functions/ast-transformers/convert-to-readonly-type.d.mts.map +1 -1
  16. package/dist/functions/ast-transformers/convert-to-readonly-type.mjs +13 -7
  17. package/dist/functions/ast-transformers/convert-to-readonly-type.mjs.map +1 -1
  18. package/dist/functions/ast-transformers/replace-any-with-unknown.d.mts.map +1 -1
  19. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs +35 -26
  20. package/dist/functions/ast-transformers/replace-any-with-unknown.mjs.map +1 -1
  21. package/dist/functions/ast-transformers/replace-record-with-unknown-record.d.mts.map +1 -1
  22. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs +141 -135
  23. package/dist/functions/ast-transformers/replace-record-with-unknown-record.mjs.map +1 -1
  24. package/dist/functions/ast-transformers/transform-source-code.d.mts.map +1 -1
  25. package/dist/functions/ast-transformers/transform-source-code.mjs +40 -7
  26. package/dist/functions/ast-transformers/transform-source-code.mjs.map +1 -1
  27. package/dist/functions/ast-transformers/types.d.mts +9 -1
  28. package/dist/functions/ast-transformers/types.d.mts.map +1 -1
  29. package/dist/functions/constants/ignore-comment-text.d.mts +2 -2
  30. package/dist/functions/constants/ignore-comment-text.d.mts.map +1 -1
  31. package/dist/functions/constants/ignore-comment-text.mjs +3 -3
  32. package/dist/functions/constants/ignore-comment-text.mjs.map +1 -1
  33. package/dist/functions/constants/index.mjs +1 -1
  34. package/dist/functions/functions/has-disable-next-line-comment.d.mts +8 -2
  35. package/dist/functions/functions/has-disable-next-line-comment.d.mts.map +1 -1
  36. package/dist/functions/functions/has-disable-next-line-comment.mjs +31 -6
  37. package/dist/functions/functions/has-disable-next-line-comment.mjs.map +1 -1
  38. package/dist/functions/index.mjs +1 -1
  39. package/dist/index.mjs +1 -1
  40. package/package.json +9 -9
  41. package/src/cmd/append-as-const.mts +1 -1
  42. package/src/cmd/convert-interface-to-type.mts +1 -1
  43. package/src/cmd/convert-to-readonly.mts +1 -1
  44. package/src/cmd/replace-any-with-unknown.mts +1 -1
  45. package/src/cmd/replace-record-with-unknown-record.mts +1 -1
  46. package/src/functions/ast-transformers/append-as-const.mts +18 -9
  47. package/src/functions/ast-transformers/append-as-const.test.mts +58 -0
  48. package/src/functions/ast-transformers/convert-interface-to-type.mts +8 -2
  49. package/src/functions/ast-transformers/convert-to-readonly-type.mts +41 -32
  50. package/src/functions/ast-transformers/convert-to-readonly-type.test.mts +13 -0
  51. package/src/functions/ast-transformers/replace-any-with-unknown.mts +41 -28
  52. package/src/functions/ast-transformers/replace-any-with-unknown.test.mts +58 -0
  53. package/src/functions/ast-transformers/replace-record-with-unknown-record.mts +175 -167
  54. package/src/functions/ast-transformers/transform-source-code.mts +59 -9
  55. package/src/functions/ast-transformers/transformer-specific-ignore.test.mts +190 -0
  56. package/src/functions/ast-transformers/types.mts +10 -3
  57. package/src/functions/constants/ignore-comment-text.mts +2 -2
  58. package/src/functions/functions/has-disable-next-line-comment.mts +39 -8
@@ -7,166 +7,172 @@ import * as tsm from 'ts-morph';
7
7
  * Replaces `Readonly<Record<string, unknown>>`, `Record<string, unknown>`,
8
8
  * and index signatures `[k: string]: unknown` with `UnknownRecord`
9
9
  */
10
- const replaceRecordWithUnknownRecordTransformer = () => (sourceAst) => {
11
- const processDeclarations = (container) => {
12
- const typeAliases = container.getTypeAliases();
13
- for (const typeAlias of typeAliases) {
14
- const typeNode = typeAlias.getTypeNode();
15
- if (typeNode === undefined)
16
- continue;
17
- visitTypeNode(typeNode);
18
- }
19
- const interfaces = container.getInterfaces();
20
- for (const interfaceDecl of interfaces) {
21
- // Check if interface has index signature [k: string]: unknown
22
- const indexSignatures = interfaceDecl.getIndexSignatures();
23
- const hasStringUnknownSignature = indexSignatures.some((sig) => {
24
- const keyType = sig.getKeyType();
25
- const returnType = sig.getReturnType();
26
- return (keyType.getText() === 'string' && returnType.getText() === 'unknown');
27
- });
28
- // If it has the signature and no other members, replace entire interface with type alias
29
- if (hasStringUnknownSignature) {
30
- const properties = interfaceDecl.getProperties();
31
- if (properties.length === 0 && indexSignatures.length === 1) {
32
- // Replace interface with type alias
33
- const interfaceName = interfaceDecl.getName();
34
- interfaceDecl.replaceWithText(`export type ${interfaceName} = UnknownRecord;`);
35
- continue;
36
- }
37
- }
38
- // Otherwise, check properties for Record types
39
- for (const property of interfaceDecl.getProperties()) {
40
- const typeNode = property.getTypeNode();
10
+ const replaceRecordWithUnknownRecordTransformer = () => {
11
+ const transformer = (sourceAst) => {
12
+ const processDeclarations = (container) => {
13
+ const typeAliases = container.getTypeAliases();
14
+ for (const typeAlias of typeAliases) {
15
+ const typeNode = typeAlias.getTypeNode();
41
16
  if (typeNode === undefined)
42
17
  continue;
43
18
  visitTypeNode(typeNode);
44
19
  }
45
- }
46
- };
47
- const visitTypeNode = (node) => {
48
- if (tsm.Node.isTypeReference(node)) {
49
- // Check if it's Readonly<{ [k: string]: unknown }>
50
- if (node.getTypeName().getText() === 'Readonly') {
51
- const typeArgs = node.getTypeArguments();
52
- if (typeArgs.length === 1) {
53
- const typeArg = typeArgs[0];
54
- if (tsm.Node.isTypeLiteral(typeArg)) {
55
- const members = typeArg.getMembers();
56
- const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
57
- // Check if it has only one index signature [k: string]: unknown
58
- if (members.length === 1 &&
59
- Arr.isArrayOfLength(indexSigs, 1) &&
60
- isStringUnknownIndexSignature(indexSigs[0])) {
61
- node.replaceWithText('UnknownRecord');
20
+ const interfaces = container.getInterfaces();
21
+ for (const interfaceDecl of interfaces) {
22
+ // Check if interface has index signature [k: string]: unknown
23
+ const indexSignatures = interfaceDecl.getIndexSignatures();
24
+ const hasStringUnknownSignature = indexSignatures.some((sig) => {
25
+ const keyType = sig.getKeyType();
26
+ const returnType = sig.getReturnType();
27
+ return (keyType.getText() === 'string' &&
28
+ returnType.getText() === 'unknown');
29
+ });
30
+ // If it has the signature and no other members, replace entire interface with type alias
31
+ if (hasStringUnknownSignature) {
32
+ const properties = interfaceDecl.getProperties();
33
+ if (properties.length === 0 && indexSignatures.length === 1) {
34
+ // Replace interface with type alias
35
+ const interfaceName = interfaceDecl.getName();
36
+ interfaceDecl.replaceWithText(`export type ${interfaceName} = UnknownRecord;`);
37
+ continue;
38
+ }
39
+ }
40
+ // Otherwise, check properties for Record types
41
+ for (const property of interfaceDecl.getProperties()) {
42
+ const typeNode = property.getTypeNode();
43
+ if (typeNode === undefined)
44
+ continue;
45
+ visitTypeNode(typeNode);
46
+ }
47
+ }
48
+ };
49
+ const visitTypeNode = (node) => {
50
+ if (tsm.Node.isTypeReference(node)) {
51
+ // Check if it's Readonly<{ [k: string]: unknown }>
52
+ if (node.getTypeName().getText() === 'Readonly') {
53
+ const typeArgs = node.getTypeArguments();
54
+ if (typeArgs.length === 1) {
55
+ const typeArg = typeArgs[0];
56
+ if (tsm.Node.isTypeLiteral(typeArg)) {
57
+ const members = typeArg.getMembers();
58
+ const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
59
+ // Check if it has only one index signature [k: string]: unknown
60
+ if (members.length === 1 &&
61
+ Arr.isArrayOfLength(indexSigs, 1) &&
62
+ isStringUnknownIndexSignature(indexSigs[0])) {
63
+ node.replaceWithText('UnknownRecord');
64
+ return;
65
+ }
66
+ // Otherwise, recurse into the type literal to visit its properties
67
+ visitTypeNode(typeArg);
62
68
  return;
63
69
  }
64
- // Otherwise, recurse into the type literal to visit its properties
65
- visitTypeNode(typeArg);
66
- return;
67
70
  }
68
71
  }
72
+ replaceIfRecordUnknown(node);
69
73
  }
70
- replaceIfRecordUnknown(node);
71
- }
72
- // Check for type literal { [k: string]: unknown }
73
- if (tsm.Node.isTypeLiteral(node)) {
74
- const members = node.getMembers();
75
- const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
76
- // Check if it has only one index signature [k: string]: unknown
77
- if (members.length === 1 &&
78
- Arr.isArrayOfLength(indexSigs, 1) &&
79
- isStringUnknownIndexSignature(indexSigs[0])) {
80
- node.replaceWithText('UnknownRecord');
81
- return;
74
+ // Check for type literal { [k: string]: unknown }
75
+ if (tsm.Node.isTypeLiteral(node)) {
76
+ const members = node.getMembers();
77
+ const indexSigs = members.filter((m) => tsm.Node.isIndexSignatureDeclaration(m));
78
+ // Check if it has only one index signature [k: string]: unknown
79
+ if (members.length === 1 &&
80
+ Arr.isArrayOfLength(indexSigs, 1) &&
81
+ isStringUnknownIndexSignature(indexSigs[0])) {
82
+ node.replaceWithText('UnknownRecord');
83
+ return;
84
+ }
82
85
  }
83
- }
84
- // Recursively visit child type nodes
85
- if (tsm.Node.isUnionTypeNode(node)) {
86
- for (const typeNode of node.getTypeNodes()) {
87
- visitTypeNode(typeNode);
86
+ // Recursively visit child type nodes
87
+ if (tsm.Node.isUnionTypeNode(node)) {
88
+ for (const typeNode of node.getTypeNodes()) {
89
+ visitTypeNode(typeNode);
90
+ }
88
91
  }
89
- }
90
- else if (tsm.Node.isIntersectionTypeNode(node)) {
91
- for (const typeNode of node.getTypeNodes()) {
92
- visitTypeNode(typeNode);
92
+ else if (tsm.Node.isIntersectionTypeNode(node)) {
93
+ for (const typeNode of node.getTypeNodes()) {
94
+ visitTypeNode(typeNode);
95
+ }
93
96
  }
94
- }
95
- else if (tsm.Node.isArrayTypeNode(node)) {
96
- visitTypeNode(node.getElementTypeNode());
97
- }
98
- else if (tsm.Node.isTupleTypeNode(node)) {
99
- for (const element of node.getElements()) {
100
- visitTypeNode(element);
97
+ else if (tsm.Node.isArrayTypeNode(node)) {
98
+ visitTypeNode(node.getElementTypeNode());
101
99
  }
102
- }
103
- else if (tsm.Node.isParenthesizedTypeNode(node)) {
104
- visitTypeNode(node.getTypeNode());
105
- }
106
- else if (tsm.Node.isTypeLiteral(node)) {
107
- for (const member of node.getMembers()) {
108
- if (tsm.Node.isPropertySignature(member)) {
109
- const typeNode = member.getTypeNode();
110
- if (typeNode !== undefined) {
111
- visitTypeNode(typeNode);
112
- }
100
+ else if (tsm.Node.isTupleTypeNode(node)) {
101
+ for (const element of node.getElements()) {
102
+ visitTypeNode(element);
113
103
  }
114
- else if (tsm.Node.isIndexSignatureDeclaration(member)) {
115
- const typeNode = member.getReturnTypeNode();
116
- if (typeNode !== undefined) {
117
- visitTypeNode(typeNode);
104
+ }
105
+ else if (tsm.Node.isParenthesizedTypeNode(node)) {
106
+ visitTypeNode(node.getTypeNode());
107
+ }
108
+ else if (tsm.Node.isTypeLiteral(node)) {
109
+ for (const member of node.getMembers()) {
110
+ if (tsm.Node.isPropertySignature(member)) {
111
+ const typeNode = member.getTypeNode();
112
+ if (typeNode !== undefined) {
113
+ visitTypeNode(typeNode);
114
+ }
115
+ }
116
+ else if (tsm.Node.isIndexSignatureDeclaration(member)) {
117
+ const typeNode = member.getReturnTypeNode();
118
+ if (typeNode !== undefined) {
119
+ visitTypeNode(typeNode);
120
+ }
118
121
  }
119
122
  }
120
123
  }
121
- }
122
- };
123
- const isStringUnknownIndexSignature = (sig) => {
124
- const keyType = sig.getKeyTypeNode();
125
- const returnType = sig.getReturnTypeNode();
126
- return (keyType.getText() === 'string' && returnType?.getText() === 'unknown');
127
- };
128
- const replaceIfRecordUnknown = (node) => {
129
- const typeName = node.getTypeName().getText();
130
- switch (typeName) {
131
- case 'Record': {
132
- // Check if it's Record<string, unknown>
133
- const typeArgs = node.getTypeArguments();
134
- if (typeArgs.length === 2 &&
135
- typeArgs[0]?.getText() === 'string' &&
136
- typeArgs[1]?.getText() === 'unknown') {
137
- node.replaceWithText('UnknownRecord');
124
+ };
125
+ const isStringUnknownIndexSignature = (sig) => {
126
+ const keyType = sig.getKeyTypeNode();
127
+ const returnType = sig.getReturnTypeNode();
128
+ return (keyType.getText() === 'string' && returnType?.getText() === 'unknown');
129
+ };
130
+ const replaceIfRecordUnknown = (node) => {
131
+ const typeName = node.getTypeName().getText();
132
+ switch (typeName) {
133
+ case 'Record': {
134
+ // Check if it's Record<string, unknown>
135
+ const typeArgs = node.getTypeArguments();
136
+ if (typeArgs.length === 2 &&
137
+ typeArgs[0]?.getText() === 'string' &&
138
+ typeArgs[1]?.getText() === 'unknown') {
139
+ node.replaceWithText('UnknownRecord');
140
+ }
141
+ break;
138
142
  }
139
- break;
140
- }
141
- case 'Readonly': {
142
- // Check if it's Readonly<Record<string, unknown>>
143
- const typeArgs = node.getTypeArguments();
144
- if (typeArgs.length === 1) {
145
- const innerType = typeArgs[0];
146
- if (innerType !== undefined &&
147
- tsm.Node.isTypeReference(innerType)) {
148
- const innerTypeName = innerType.getTypeName().getText();
149
- if (innerTypeName === 'Record') {
150
- const innerTypeArgs = innerType.getTypeArguments();
151
- if (innerTypeArgs.length === 2 &&
152
- innerTypeArgs[0]?.getText() === 'string' &&
153
- innerTypeArgs[1]?.getText() === 'unknown') {
154
- node.replaceWithText('UnknownRecord');
143
+ case 'Readonly': {
144
+ // Check if it's Readonly<Record<string, unknown>>
145
+ const typeArgs = node.getTypeArguments();
146
+ if (typeArgs.length === 1) {
147
+ const innerType = typeArgs[0];
148
+ if (innerType !== undefined &&
149
+ tsm.Node.isTypeReference(innerType)) {
150
+ const innerTypeName = innerType.getTypeName().getText();
151
+ if (innerTypeName === 'Record') {
152
+ const innerTypeArgs = innerType.getTypeArguments();
153
+ if (innerTypeArgs.length === 2 &&
154
+ innerTypeArgs[0]?.getText() === 'string' &&
155
+ innerTypeArgs[1]?.getText() === 'unknown') {
156
+ node.replaceWithText('UnknownRecord');
157
+ }
155
158
  }
156
159
  }
157
160
  }
161
+ break;
158
162
  }
159
- break;
160
163
  }
164
+ };
165
+ // Process top-level declarations
166
+ processDeclarations(sourceAst);
167
+ // Process declarations inside namespaces/modules
168
+ const namespaces = sourceAst.getModules();
169
+ for (const namespace of namespaces) {
170
+ processDeclarations(namespace);
161
171
  }
162
172
  };
163
- // Process top-level declarations
164
- processDeclarations(sourceAst);
165
- // Process declarations inside namespaces/modules
166
- const namespaces = sourceAst.getModules();
167
- for (const namespace of namespaces) {
168
- processDeclarations(namespace);
169
- }
173
+ // eslint-disable-next-line functional/immutable-data
174
+ transformer.transformerName = 'replace-record-with-unknown-record';
175
+ return transformer;
170
176
  };
171
177
 
172
178
  export { replaceRecordWithUnknownRecordTransformer };
@@ -1 +1 @@
1
- {"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replace-record-with-unknown-record.mjs","sources":["../../../src/functions/ast-transformers/replace-record-with-unknown-record.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform-source-code.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,OAAO,OAAO,EACd,cAAc,SAAS,kBAAkB,EAAE,EAC3C,QAAO,OAAe,KACrB,MA4BF,CAAC"}
1
+ {"version":3,"file":"transform-source-code.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAgDtD,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,OAAO,OAAO,EAEd,cAAc,SAAS,kBAAkB,EAAE,EAC3C,QAAO,OAAe,KACrB,MAgCF,CAAC"}
@@ -1,13 +1,39 @@
1
1
  import * as tsm from 'ts-morph';
2
- import { IGNORE_FILE_COMMENT_TEXT } from '../constants/ignore-comment-text.mjs';
3
2
 
4
- const transformSourceCode = (code, isTsx, transformers, debug = false) => {
5
- if (code.includes(IGNORE_FILE_COMMENT_TEXT)) {
6
- if (debug) {
7
- console.debug('skipped by ignore-file comment');
8
- }
9
- return code;
3
+ const extractFileIgnoreTransformers = (code) => {
4
+ const match = /\/\*\s*transformer-ignore\s*(.*?)\s*\*\//u.exec(code);
5
+ if (match === null) {
6
+ return [];
7
+ }
8
+ const targetTransformers = match[1]?.trim() ?? '';
9
+ // Empty means ignore all transformers
10
+ if (targetTransformers === '') {
11
+ return [];
12
+ }
13
+ // Parse comma-separated transformer names
14
+ return targetTransformers.split(',').map((name) => name.trim());
15
+ };
16
+ const shouldSkipFile = (code, transformerName) => {
17
+ const ignoredTransformers = extractFileIgnoreTransformers(code);
18
+ // If no file-level ignore comment found, don't skip
19
+ if (ignoredTransformers.length === 0 &&
20
+ !/\/\*\s*transformer-ignore\s*.*?\s*\*\//u.test(code)) {
21
+ return false;
10
22
  }
23
+ // Empty array means ignore all transformers (file-level ignore without specific transformers)
24
+ if (ignoredTransformers.length === 0) {
25
+ return true;
26
+ }
27
+ // If transformer name is not specified, don't skip
28
+ if (transformerName === undefined) {
29
+ return false;
30
+ }
31
+ // Check if the transformer is in the ignore list
32
+ return ignoredTransformers.includes(transformerName);
33
+ };
34
+ const transformSourceCode = (code, isTsx,
35
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
36
+ transformers, debug = false) => {
11
37
  const project = new tsm.Project({
12
38
  useInMemoryFileSystem: true,
13
39
  compilerOptions: {
@@ -18,6 +44,13 @@ const transformSourceCode = (code, isTsx, transformers, debug = false) => {
18
44
  });
19
45
  const sourceAst = project.createSourceFile(`source.${isTsx ? 'tsx' : 'ts'}`, code);
20
46
  for (const transformer of transformers) {
47
+ const transformerName = transformer.transformerName;
48
+ if (shouldSkipFile(code, transformerName)) {
49
+ if (debug) {
50
+ console.debug(`skipped by ignore-file comment${transformerName !== undefined ? ` for transformer: ${transformerName}` : ''}`);
51
+ }
52
+ continue;
53
+ }
21
54
  transformer(sourceAst);
22
55
  }
23
56
  return sourceAst.getFullText();
@@ -1 +1 @@
1
- {"version":3,"file":"transform-source-code.mjs","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIO,MAAM,mBAAmB,GAAG,CACjC,IAAY,EACZ,KAAc,EACd,YAA2C,EAC3C,KAAA,GAAiB,KAAK,KACZ;AACV,IAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;QAC3C,IAAI,KAAK,EAAE;AACT,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC;QACjD;AAEA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC9B,QAAA,qBAAqB,EAAE,IAAI;AAC3B,QAAA,eAAe,EAAE;AACf,YAAA,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS;AAC7C,YAAA,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM;AAClC,YAAA,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM;AACjC,SAAA;AACF,KAAA,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CACxC,CAAA,OAAA,EAAU,KAAK,GAAG,KAAK,GAAG,IAAI,EAAE,EAChC,IAAI,CACL;AAED,IAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;QACtC,WAAW,CAAC,SAAS,CAAC;IACxB;AAEA,IAAA,OAAO,SAAS,CAAC,WAAW,EAAE;AAChC;;;;"}
1
+ {"version":3,"file":"transform-source-code.mjs","sources":["../../../src/functions/ast-transformers/transform-source-code.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA,MAAM,6BAA6B,GAAG,CAAC,IAAY,KAAuB;IACxE,MAAM,KAAK,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC;AAEpE,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,QAAA,OAAO,EAAE;IACX;IAEA,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;;AAGjD,IAAA,IAAI,kBAAkB,KAAK,EAAE,EAAE;AAC7B,QAAA,OAAO,EAAE;IACX;;AAGA,IAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,cAAc,GAAG,CACrB,IAAY,EACZ,eAAmC,KACxB;AACX,IAAA,MAAM,mBAAmB,GAAG,6BAA6B,CAAC,IAAI,CAAC;;AAG/D,IAAA,IACE,mBAAmB,CAAC,MAAM,KAAK,CAAC;AAChC,QAAA,CAAC,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,EACrD;AACA,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AACjC,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,OAAO,mBAAmB,CAAC,QAAQ,CAAC,eAAe,CAAC;AACtD,CAAC;AAEM,MAAM,mBAAmB,GAAG,CACjC,IAAY,EACZ,KAAc;AACd;AACA,YAA2C,EAC3C,KAAA,GAAiB,KAAK,KACZ;AACV,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC9B,QAAA,qBAAqB,EAAE,IAAI;AAC3B,QAAA,eAAe,EAAE;AACf,YAAA,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS;AAC7C,YAAA,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM;AAClC,YAAA,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM;AACjC,SAAA;AACF,KAAA,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CACxC,CAAA,OAAA,EAAU,KAAK,GAAG,KAAK,GAAG,IAAI,EAAE,EAChC,IAAI,CACL;AAED,IAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,QAAA,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe;AAEnD,QAAA,IAAI,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE;YACzC,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,CAAC,KAAK,CACX,iCAAiC,eAAe,KAAK,SAAS,GAAG,CAAA,kBAAA,EAAqB,eAAe,EAAE,GAAG,EAAE,CAAA,CAAE,CAC/G;YACH;YAEA;QACF;QAEA,WAAW,CAAC,SAAS,CAAC;IACxB;AAEA,IAAA,OAAO,SAAS,CAAC,WAAW,EAAE;AAChC;;;;"}
@@ -1,3 +1,11 @@
1
1
  import type * as tsm from 'ts-morph';
2
- export type TsMorphTransformer = (sourceFile: tsm.SourceFile) => void;
2
+ export type TsMorphTransformer = {
3
+ (sourceFile: tsm.SourceFile): void;
4
+ /**
5
+ * Optional name identifier for this transformer.
6
+ * Used to enable transformer-specific ignore comments.
7
+ * Example: 'append-as-const', 'replace-any-with-unknown'
8
+ */
9
+ transformerName?: string;
10
+ };
3
11
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,MAAM,MAAM,kBAAkB,GAAG,CAE/B,UAAU,EAAE,GAAG,CAAC,UAAU,KACvB,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../../src/functions/ast-transformers/types.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,MAAM,MAAM,kBAAkB,GAAG;IAE/B,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC"}
@@ -1,3 +1,3 @@
1
- export declare const IGNORE_LINE_COMMENT_TEXT = "transformer-ignore-next-line";
2
- export declare const IGNORE_FILE_COMMENT_TEXT = "/* transformer-ignore */";
1
+ export declare const IGNORE_LINE_COMMENT_PREFIX = "transformer-ignore-next-line";
2
+ export declare const IGNORE_FILE_COMMENT_PREFIX = "transformer-ignore";
3
3
  //# sourceMappingURL=ignore-comment-text.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-comment-text.d.mts","sourceRoot":"","sources":["../../../src/functions/constants/ignore-comment-text.mts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC"}
1
+ {"version":3,"file":"ignore-comment-text.d.mts","sourceRoot":"","sources":["../../../src/functions/constants/ignore-comment-text.mts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,iCAAiC,CAAC;AAEzE,eAAO,MAAM,0BAA0B,uBAAuB,CAAC"}
@@ -1,5 +1,5 @@
1
- const IGNORE_LINE_COMMENT_TEXT = 'transformer-ignore-next-line';
2
- const IGNORE_FILE_COMMENT_TEXT = '/* transformer-ignore */';
1
+ const IGNORE_LINE_COMMENT_PREFIX = 'transformer-ignore-next-line';
2
+ const IGNORE_FILE_COMMENT_PREFIX = 'transformer-ignore';
3
3
 
4
- export { IGNORE_FILE_COMMENT_TEXT, IGNORE_LINE_COMMENT_TEXT };
4
+ export { IGNORE_FILE_COMMENT_PREFIX, IGNORE_LINE_COMMENT_PREFIX };
5
5
  //# sourceMappingURL=ignore-comment-text.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-comment-text.mjs","sources":["../../../src/functions/constants/ignore-comment-text.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,wBAAwB,GAAG;AAEjC,MAAM,wBAAwB,GAAG;;;;"}
1
+ {"version":3,"file":"ignore-comment-text.mjs","sources":["../../../src/functions/constants/ignore-comment-text.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,0BAA0B,GAAG;AAEnC,MAAM,0BAA0B,GAAG;;;;"}
@@ -1,2 +1,2 @@
1
- export { IGNORE_FILE_COMMENT_TEXT, IGNORE_LINE_COMMENT_TEXT } from './ignore-comment-text.mjs';
1
+ export { IGNORE_FILE_COMMENT_PREFIX, IGNORE_LINE_COMMENT_PREFIX } from './ignore-comment-text.mjs';
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,10 +1,16 @@
1
1
  import * as tsm from 'ts-morph';
2
2
  /**
3
3
  * Checks if a given ts-morph Node is immediately preceded by a
4
- * '// transformer-ignore-next-line' comment.
4
+ * '// transformer-ignore-next-line' comment, optionally filtered by transformer name(s).
5
5
  *
6
6
  * @param node - The ts-morph Node to check.
7
+ * @param transformerName - Optional transformer name to check for specific ignore directive.
8
+ * If provided, only ignores if the comment specifies this transformer.
9
+ * Supports ESLint-style syntax like:
10
+ * - `// transformer-ignore-next-line` (ignores all transformers)
11
+ * - `// transformer-ignore-next-line append-as-const` (specific transformer)
12
+ * - `// transformer-ignore-next-line append-as-const, replace-any-with-unknown` (multiple transformers)
7
13
  * @returns True if the node is preceded by the ignore comment on the immediately previous line, false otherwise.
8
14
  */
9
- export declare const hasDisableNextLineComment: (node: tsm.Node) => boolean;
15
+ export declare const hasDisableNextLineComment: (node: tsm.Node, transformerName?: string) => boolean;
10
16
  //# sourceMappingURL=has-disable-next-line-comment.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"has-disable-next-line-comment.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/has-disable-next-line-comment.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GAAI,MAAM,GAAG,CAAC,IAAI,KAAG,OA6C1D,CAAC"}
1
+ {"version":3,"file":"has-disable-next-line-comment.d.mts","sourceRoot":"","sources":["../../../src/functions/functions/has-disable-next-line-comment.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,GAAG,CAAC,IAAI,EACd,kBAAkB,MAAM,KACvB,OAmEF,CAAC"}
@@ -1,14 +1,20 @@
1
1
  import * as tsm from 'ts-morph';
2
- import { IGNORE_LINE_COMMENT_TEXT } from '../constants/ignore-comment-text.mjs';
2
+ import { IGNORE_LINE_COMMENT_PREFIX } from '../constants/ignore-comment-text.mjs';
3
3
 
4
4
  /**
5
5
  * Checks if a given ts-morph Node is immediately preceded by a
6
- * '// transformer-ignore-next-line' comment.
6
+ * '// transformer-ignore-next-line' comment, optionally filtered by transformer name(s).
7
7
  *
8
8
  * @param node - The ts-morph Node to check.
9
+ * @param transformerName - Optional transformer name to check for specific ignore directive.
10
+ * If provided, only ignores if the comment specifies this transformer.
11
+ * Supports ESLint-style syntax like:
12
+ * - `// transformer-ignore-next-line` (ignores all transformers)
13
+ * - `// transformer-ignore-next-line append-as-const` (specific transformer)
14
+ * - `// transformer-ignore-next-line append-as-const, replace-any-with-unknown` (multiple transformers)
9
15
  * @returns True if the node is preceded by the ignore comment on the immediately previous line, false otherwise.
10
16
  */
11
- const hasDisableNextLineComment = (node) => {
17
+ const hasDisableNextLineComment = (node, transformerName) => {
12
18
  const nodeStartLine = node.getStartLineNumber();
13
19
  // Cannot be ignored if it's on the first line
14
20
  if (nodeStartLine <= 1) {
@@ -26,9 +32,28 @@ const hasDisableNextLineComment = (node) => {
26
32
  // Check if the comment is on the immediately preceding line
27
33
  if (nodeStartLine === commentEndLine + 1) {
28
34
  // Check if it's a single-line comment containing the specific ignore text
29
- if (commentRange.getKind() === tsm.SyntaxKind.SingleLineCommentTrivia &&
30
- commentRange.getText().trim().includes(IGNORE_LINE_COMMENT_TEXT)) {
31
- return true;
35
+ if (commentRange.getKind() === tsm.SyntaxKind.SingleLineCommentTrivia) {
36
+ const commentText = commentRange.getText().trim();
37
+ if (commentText.includes(IGNORE_LINE_COMMENT_PREFIX)) {
38
+ // Extract the part after the prefix
39
+ const afterPrefix = commentText
40
+ .slice(commentText.indexOf(IGNORE_LINE_COMMENT_PREFIX))
41
+ .replace(IGNORE_LINE_COMMENT_PREFIX, '')
42
+ .trim();
43
+ // If no transformer name specified, check if comment applies to all transformers
44
+ if (transformerName === undefined) {
45
+ return true;
46
+ }
47
+ // If no specific transformers listed in comment, it applies to all
48
+ if (afterPrefix === '') {
49
+ return true;
50
+ }
51
+ // Check if the transformer name is in the comma-separated list
52
+ const targetTransformers = afterPrefix
53
+ .split(',')
54
+ .map((name) => name.trim());
55
+ return targetTransformers.includes(transformerName);
56
+ }
32
57
  }
33
58
  // If we found *any* comment on the preceding line, but it wasn't
34
59
  // the correct ignore comment, then the node is not ignored by
@@ -1 +1 @@
1
- {"version":3,"file":"has-disable-next-line-comment.mjs","sources":["../../../src/functions/functions/has-disable-next-line-comment.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGA;;;;;;AAMG;AACI,MAAM,yBAAyB,GAAG,CAAC,IAAc,KAAa;AACnE,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,EAAE;;AAG/C,IAAA,IAAI,aAAa,IAAI,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAExC,IAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,EAAE;;AAG3D,IAAA,KAAK,IAAI,KAAK,GAAG,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;;AAErE,QAAA,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAE;;AAGjD,QAAA,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,EAAE;QAE3C,MAAM,cAAc,GAAG,UAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,IAAI;;AAG3E,QAAA,IAAI,aAAa,KAAK,cAAc,GAAG,CAAC,EAAE;;YAExC,IACE,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,uBAAuB;AACjE,gBAAA,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAChE;AACA,gBAAA,OAAO,IAAI;YACb;;;;AAKA,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,cAAc,GAAG,aAAa,GAAG,CAAC,EAAE;YACtC;QACF;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;;;"}
1
+ {"version":3,"file":"has-disable-next-line-comment.mjs","sources":["../../../src/functions/functions/has-disable-next-line-comment.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;AAYG;MACU,yBAAyB,GAAG,CACvC,IAAc,EACd,eAAwB,KACb;AACX,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,EAAE;;AAG/C,IAAA,IAAI,aAAa,IAAI,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAExC,IAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,EAAE;;AAG3D,IAAA,KAAK,IAAI,KAAK,GAAG,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;;AAErE,QAAA,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAE;;AAGjD,QAAA,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,EAAE;QAE3C,MAAM,cAAc,GAAG,UAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,IAAI;;AAG3E,QAAA,IAAI,aAAa,KAAK,cAAc,GAAG,CAAC,EAAE;;YAExC,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,uBAAuB,EAAE;gBACrE,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAEjD,gBAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;;oBAEpD,MAAM,WAAW,GAAG;AACjB,yBAAA,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,0BAA0B,CAAC;AACrD,yBAAA,OAAO,CAAC,0BAA0B,EAAE,EAAE;AACtC,yBAAA,IAAI,EAAE;;AAGT,oBAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AACjC,wBAAA,OAAO,IAAI;oBACb;;AAGA,oBAAA,IAAI,WAAW,KAAK,EAAE,EAAE;AACtB,wBAAA,OAAO,IAAI;oBACb;;oBAGA,MAAM,kBAAkB,GAAG;yBACxB,KAAK,CAAC,GAAG;yBACT,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;AAE7B,oBAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACrD;YACF;;;;AAKA,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,cAAc,GAAG,aAAa,GAAG,CAAC,EAAE;YACtC;QACF;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;;;"}
@@ -8,7 +8,7 @@ export { nextReadonlyContext } from './ast-transformers/readonly-transformer-hel
8
8
  export { replaceAnyWithUnknownTransformer } from './ast-transformers/replace-any-with-unknown.mjs';
9
9
  export { replaceRecordWithUnknownRecordTransformer } from './ast-transformers/replace-record-with-unknown-record.mjs';
10
10
  export { transformSourceCode } from './ast-transformers/transform-source-code.mjs';
11
- export { IGNORE_FILE_COMMENT_TEXT, IGNORE_LINE_COMMENT_TEXT } from './constants/ignore-comment-text.mjs';
11
+ export { IGNORE_FILE_COMMENT_PREFIX, IGNORE_LINE_COMMENT_PREFIX } from './constants/ignore-comment-text.mjs';
12
12
  export { hasDisableNextLineComment } from './functions/has-disable-next-line-comment.mjs';
13
13
  export { isAsConstNode } from './functions/is-as-const-node.mjs';
14
14
  export { isPrimitiveTypeNode } from './functions/is-primitive-type-node.mjs';
package/dist/index.mjs CHANGED
@@ -8,7 +8,7 @@ export { nextReadonlyContext } from './functions/ast-transformers/readonly-trans
8
8
  export { replaceAnyWithUnknownTransformer } from './functions/ast-transformers/replace-any-with-unknown.mjs';
9
9
  export { replaceRecordWithUnknownRecordTransformer } from './functions/ast-transformers/replace-record-with-unknown-record.mjs';
10
10
  export { transformSourceCode } from './functions/ast-transformers/transform-source-code.mjs';
11
- export { IGNORE_FILE_COMMENT_TEXT, IGNORE_LINE_COMMENT_TEXT } from './functions/constants/ignore-comment-text.mjs';
11
+ export { IGNORE_FILE_COMMENT_PREFIX, IGNORE_LINE_COMMENT_PREFIX } from './functions/constants/ignore-comment-text.mjs';
12
12
  export { hasDisableNextLineComment } from './functions/functions/has-disable-next-line-comment.mjs';
13
13
  export { isAsConstNode } from './functions/functions/is-as-const-node.mjs';
14
14
  export { isPrimitiveTypeNode } from './functions/functions/is-primitive-type-node.mjs';