@planu/cli 0.28.0 → 0.29.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 (218) hide show
  1. package/dist/config/model-routing-rules.json +98 -0
  2. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
  3. package/dist/engine/ai-cost-estimator/core.js +2 -202
  4. package/dist/engine/ai-cost-estimator/core.js.map +1 -1
  5. package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
  6. package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
  7. package/dist/engine/ai-cost-estimator/recommender.js +94 -0
  8. package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
  9. package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
  10. package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
  11. package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
  12. package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
  13. package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
  14. package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
  15. package/dist/engine/code-transforms/transform-engine.js +67 -0
  16. package/dist/engine/code-transforms/transform-engine.js.map +1 -0
  17. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
  18. package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
  19. package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
  20. package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
  21. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
  22. package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
  23. package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
  24. package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
  25. package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
  26. package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
  27. package/dist/engine/code-transforms/typescript/add-types.js +182 -0
  28. package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
  29. package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
  30. package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
  31. package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
  32. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
  33. package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
  34. package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
  35. package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
  36. package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
  37. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
  38. package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
  39. package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
  40. package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
  41. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
  42. package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
  43. package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
  44. package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
  45. package/dist/engine/mermaid/core.d.ts +18 -0
  46. package/dist/engine/mermaid/core.d.ts.map +1 -0
  47. package/dist/engine/mermaid/core.js +88 -0
  48. package/dist/engine/mermaid/core.js.map +1 -0
  49. package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
  50. package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
  51. package/dist/engine/mermaid/diagram-generators.js +139 -0
  52. package/dist/engine/mermaid/diagram-generators.js.map +1 -0
  53. package/dist/engine/mermaid/helpers.d.ts +8 -0
  54. package/dist/engine/mermaid/helpers.d.ts.map +1 -0
  55. package/dist/engine/mermaid/helpers.js +61 -0
  56. package/dist/engine/mermaid/helpers.js.map +1 -0
  57. package/dist/engine/mermaid-generator.d.ts +2 -37
  58. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  59. package/dist/engine/mermaid-generator.js +4 -276
  60. package/dist/engine/mermaid-generator.js.map +1 -1
  61. package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
  62. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
  63. package/dist/engine/model-router/complexity-analyzer.js +182 -0
  64. package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
  65. package/dist/engine/model-router/cost-estimator.d.ts +6 -0
  66. package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
  67. package/dist/engine/model-router/cost-estimator.js +60 -0
  68. package/dist/engine/model-router/cost-estimator.js.map +1 -0
  69. package/dist/engine/model-router/historical-learner.d.ts +26 -0
  70. package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
  71. package/dist/engine/model-router/historical-learner.js +91 -0
  72. package/dist/engine/model-router/historical-learner.js.map +1 -0
  73. package/dist/engine/model-router/rules-engine.d.ts +13 -0
  74. package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
  75. package/dist/engine/model-router/rules-engine.js +142 -0
  76. package/dist/engine/model-router/rules-engine.js.map +1 -0
  77. package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
  78. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
  79. package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
  80. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
  81. package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
  82. package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
  83. package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
  84. package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
  85. package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
  86. package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
  87. package/dist/engine/spec-coverage/test-matchers.js +59 -0
  88. package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
  89. package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
  90. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
  91. package/dist/engine/spec-templates/catalog-extra.js +8 -363
  92. package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
  93. package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
  94. package/dist/engine/spec-templates/catalog.js +10 -381
  95. package/dist/engine/spec-templates/catalog.js.map +1 -1
  96. package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
  97. package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
  98. package/dist/engine/spec-templates/templates-api-ui.js +188 -0
  99. package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
  100. package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
  101. package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
  102. package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
  103. package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
  104. package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
  105. package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
  106. package/dist/engine/spec-templates/templates-data-security.js +172 -0
  107. package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
  108. package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
  109. package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
  110. package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
  111. package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
  112. package/dist/engine/vector-store/hnsw.d.ts +37 -0
  113. package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
  114. package/dist/engine/vector-store/hnsw.js +294 -0
  115. package/dist/engine/vector-store/hnsw.js.map +1 -0
  116. package/dist/engine/vector-store/similarity.d.ts +21 -0
  117. package/dist/engine/vector-store/similarity.d.ts.map +1 -0
  118. package/dist/engine/vector-store/similarity.js +86 -0
  119. package/dist/engine/vector-store/similarity.js.map +1 -0
  120. package/dist/engine/vector-store/tfidf.d.ts +35 -0
  121. package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
  122. package/dist/engine/vector-store/tfidf.js +255 -0
  123. package/dist/engine/vector-store/tfidf.js.map +1 -0
  124. package/dist/index.js +6 -0
  125. package/dist/index.js.map +1 -1
  126. package/dist/storage/vector-store/backend-factory.d.ts +9 -0
  127. package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
  128. package/dist/storage/vector-store/backend-factory.js +33 -0
  129. package/dist/storage/vector-store/backend-factory.js.map +1 -0
  130. package/dist/storage/vector-store/json-fallback.d.ts +21 -0
  131. package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
  132. package/dist/storage/vector-store/json-fallback.js +85 -0
  133. package/dist/storage/vector-store/json-fallback.js.map +1 -0
  134. package/dist/storage/vector-store/migrator.d.ts +10 -0
  135. package/dist/storage/vector-store/migrator.d.ts.map +1 -0
  136. package/dist/storage/vector-store/migrator.js +139 -0
  137. package/dist/storage/vector-store/migrator.js.map +1 -0
  138. package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
  139. package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
  140. package/dist/storage/vector-store/sqlite-adapter.js +142 -0
  141. package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
  142. package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
  143. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
  144. package/dist/tools/create-spec/constitution-validator.js +37 -0
  145. package/dist/tools/create-spec/constitution-validator.js.map +1 -0
  146. package/dist/tools/create-spec/post-creation.d.ts +11 -0
  147. package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
  148. package/dist/tools/create-spec/post-creation.js +48 -0
  149. package/dist/tools/create-spec/post-creation.js.map +1 -0
  150. package/dist/tools/create-spec/spec-builder.d.ts +14 -0
  151. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
  152. package/dist/tools/create-spec/spec-builder.js +131 -0
  153. package/dist/tools/create-spec/spec-builder.js.map +1 -0
  154. package/dist/tools/create-spec.d.ts.map +1 -1
  155. package/dist/tools/create-spec.js +42 -172
  156. package/dist/tools/create-spec.js.map +1 -1
  157. package/dist/tools/recommend-model-handler.d.ts +8 -0
  158. package/dist/tools/recommend-model-handler.d.ts.map +1 -0
  159. package/dist/tools/recommend-model-handler.js +65 -0
  160. package/dist/tools/recommend-model-handler.js.map +1 -0
  161. package/dist/tools/register-model-tools.d.ts +3 -0
  162. package/dist/tools/register-model-tools.d.ts.map +1 -0
  163. package/dist/tools/register-model-tools.js +50 -0
  164. package/dist/tools/register-model-tools.js.map +1 -0
  165. package/dist/tools/register-search-tools.d.ts +7 -0
  166. package/dist/tools/register-search-tools.d.ts.map +1 -0
  167. package/dist/tools/register-search-tools.js +34 -0
  168. package/dist/tools/register-search-tools.js.map +1 -0
  169. package/dist/tools/register-transform-tools.d.ts +3 -0
  170. package/dist/tools/register-transform-tools.d.ts.map +1 -0
  171. package/dist/tools/register-transform-tools.js +29 -0
  172. package/dist/tools/register-transform-tools.js.map +1 -0
  173. package/dist/tools/semantic-search-handler.d.ts +7 -0
  174. package/dist/tools/semantic-search-handler.d.ts.map +1 -0
  175. package/dist/tools/semantic-search-handler.js +72 -0
  176. package/dist/tools/semantic-search-handler.js.map +1 -0
  177. package/dist/tools/transform-code-handler.d.ts +7 -0
  178. package/dist/tools/transform-code-handler.d.ts.map +1 -0
  179. package/dist/tools/transform-code-handler.js +58 -0
  180. package/dist/tools/transform-code-handler.js.map +1 -0
  181. package/dist/types/advanced-framework.d.ts +47 -0
  182. package/dist/types/advanced-framework.d.ts.map +1 -0
  183. package/dist/types/advanced-framework.js +3 -0
  184. package/dist/types/advanced-framework.js.map +1 -0
  185. package/dist/types/code-transforms.d.ts +114 -0
  186. package/dist/types/code-transforms.d.ts.map +1 -0
  187. package/dist/types/code-transforms.js +11 -0
  188. package/dist/types/code-transforms.js.map +1 -0
  189. package/dist/types/css-framework.d.ts +110 -0
  190. package/dist/types/css-framework.d.ts.map +1 -0
  191. package/dist/types/css-framework.js +3 -0
  192. package/dist/types/css-framework.js.map +1 -0
  193. package/dist/types/dashboard.d.ts +77 -0
  194. package/dist/types/dashboard.d.ts.map +1 -0
  195. package/dist/types/dashboard.js +2 -0
  196. package/dist/types/dashboard.js.map +1 -0
  197. package/dist/types/index.d.ts +3 -0
  198. package/dist/types/index.d.ts.map +1 -1
  199. package/dist/types/index.js +3 -0
  200. package/dist/types/index.js.map +1 -1
  201. package/dist/types/model-routing.d.ts +127 -0
  202. package/dist/types/model-routing.d.ts.map +1 -0
  203. package/dist/types/model-routing.js +3 -0
  204. package/dist/types/model-routing.js.map +1 -0
  205. package/dist/types/spec/core.d.ts +28 -1
  206. package/dist/types/spec/core.d.ts.map +1 -1
  207. package/dist/types/spec/inputs.d.ts +1 -6
  208. package/dist/types/spec/inputs.d.ts.map +1 -1
  209. package/dist/types/ui.d.ts +3 -231
  210. package/dist/types/ui.d.ts.map +1 -1
  211. package/dist/types/ui.js +7 -1
  212. package/dist/types/ui.js.map +1 -1
  213. package/dist/types/vector-store.d.ts +137 -0
  214. package/dist/types/vector-store.d.ts.map +1 -0
  215. package/dist/types/vector-store.js +3 -0
  216. package/dist/types/vector-store.js.map +1 -0
  217. package/package.json +1 -1
  218. package/src/config/model-routing-rules.json +98 -0
@@ -0,0 +1,67 @@
1
+ // engine/code-transforms/transform-engine.ts — Transform orchestrator (AC-01).
2
+ // Validates intent, dispatches to the correct transform implementation, measures timing.
3
+ import { TRANSFORM_INTENTS, } from '../../types/index.js';
4
+ import { renameSymbol } from './typescript/rename-symbol.js';
5
+ import { addTypes } from './typescript/add-types.js';
6
+ import { addErrorHandling } from './typescript/add-error-handling.js';
7
+ import { modernizeSyntax } from './typescript/modernize-syntax.js';
8
+ import { extractInterface } from './typescript/extract-interface.js';
9
+ import { addJSDoc } from './typescript/add-jsdoc.js';
10
+ /**
11
+ * Execute a code transform based on the request intent.
12
+ * Returns a TransformResult with the transformed source, changes list, and timing.
13
+ */
14
+ export function executeTransform(request) {
15
+ const start = performance.now();
16
+ const fileName = request.fileName ?? 'input.ts';
17
+ // Validate intent
18
+ if (!TRANSFORM_INTENTS.includes(request.intent)) {
19
+ return {
20
+ success: false,
21
+ transformed: request.source,
22
+ changes: [],
23
+ durationMs: performance.now() - start,
24
+ error: `Unknown transform intent: '${request.intent}'. Valid intents: ${TRANSFORM_INTENTS.join(', ')}`,
25
+ };
26
+ }
27
+ try {
28
+ const result = dispatch(request.intent, request.source, request.options, fileName);
29
+ return {
30
+ success: true,
31
+ transformed: result.transformed,
32
+ changes: result.changes,
33
+ durationMs: performance.now() - start,
34
+ };
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ return {
39
+ success: false,
40
+ transformed: request.source,
41
+ changes: [],
42
+ durationMs: performance.now() - start,
43
+ error: message,
44
+ };
45
+ }
46
+ }
47
+ function dispatch(intent, source, options, fileName) {
48
+ switch (intent) {
49
+ case 'rename-symbol':
50
+ return renameSymbol(source, options, fileName);
51
+ case 'add-types':
52
+ return addTypes(source, options, fileName);
53
+ case 'add-error-handling':
54
+ return addErrorHandling(source, options, fileName);
55
+ case 'modernize-syntax':
56
+ return modernizeSyntax(source, options, fileName);
57
+ case 'extract-interface':
58
+ return extractInterface(source, options, fileName);
59
+ case 'add-jsdoc':
60
+ return addJSDoc(source, options, fileName);
61
+ /* v8 ignore next 4 -- exhaustive check: unreachable thanks to TRANSFORM_INTENTS validation */
62
+ default: {
63
+ throw new Error(`Unhandled transform intent: ${String(intent)}`);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=transform-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-engine.js","sourceRoot":"","sources":["../../../src/engine/code-transforms/transform-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AddErrorHandlingOptions, ErrorHandlingResult } from '../../../types/index.js';
2
+ /**
3
+ * Add try/catch error handling to async functions.
4
+ */
5
+ export declare function addErrorHandling(source: string, options: AddErrorHandlingOptions, fileName: string): ErrorHandlingResult;
6
+ //# sourceMappingURL=add-error-handling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-error-handling.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-error-handling.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EAGvB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAoDjC;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,MAAM,GACf,mBAAmB,CAiDrB"}
@@ -0,0 +1,92 @@
1
+ // engine/code-transforms/typescript/add-error-handling.ts — (AC-04).
2
+ // Wraps async function bodies with try/catch blocks.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ function isAsyncFunction(ts, node) {
5
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || ts.isArrowFunction(node)) {
6
+ const mods = ts.getModifiers(node);
7
+ return mods?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) === true;
8
+ }
9
+ return false;
10
+ }
11
+ function getNodeName(ts, node, sourceFile) {
12
+ if ((ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) && node.name) {
13
+ return node.name.getText(sourceFile);
14
+ }
15
+ return '<anonymous>';
16
+ }
17
+ function buildCatchBlock(style, fnName) {
18
+ switch (style) {
19
+ case 'return-null':
20
+ return [
21
+ `catch (error: unknown) {`,
22
+ ` console.error('Error in ${fnName}:', error);`,
23
+ ` return null;`,
24
+ ` }`,
25
+ ].join('\n');
26
+ case 'log-and-rethrow':
27
+ return [
28
+ `catch (error: unknown) {`,
29
+ ` console.error('Error in ${fnName}:', error);`,
30
+ ` throw error;`,
31
+ ` }`,
32
+ ].join('\n');
33
+ default: // 'rethrow'
34
+ return [`catch (error: unknown) {`, ` throw error;`, ` }`].join('\n');
35
+ }
36
+ }
37
+ function hasExistingTryCatch(ts, body) {
38
+ for (const stmt of body.statements) {
39
+ if (ts.isTryStatement(stmt)) {
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+ /**
46
+ * Add try/catch error handling to async functions.
47
+ */
48
+ export function addErrorHandling(source, options, fileName) {
49
+ const ts = getTypeScript();
50
+ const sourceFile = parseSource(source, fileName);
51
+ const style = options.style ?? 'rethrow';
52
+ const targets = [];
53
+ function visit(node) {
54
+ if (isAsyncFunction(ts, node)) {
55
+ let body;
56
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
57
+ body = node.body;
58
+ }
59
+ else if (ts.isArrowFunction(node) && ts.isBlock(node.body)) {
60
+ body = node.body;
61
+ }
62
+ if (body && !hasExistingTryCatch(ts, body)) {
63
+ const name = getNodeName(ts, node, sourceFile);
64
+ targets.push({
65
+ name,
66
+ bodyStart: body.getStart(sourceFile) + 1,
67
+ bodyEnd: body.getEnd() - 1,
68
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
69
+ });
70
+ }
71
+ }
72
+ ts.forEachChild(node, visit);
73
+ }
74
+ visit(sourceFile);
75
+ if (targets.length === 0) {
76
+ return { transformed: source, changes: [] };
77
+ }
78
+ // Apply in reverse order
79
+ targets.sort((a, b) => b.bodyStart - a.bodyStart);
80
+ let result = source;
81
+ const changes = [];
82
+ for (const target of targets) {
83
+ const innerBody = result.slice(target.bodyStart, target.bodyEnd);
84
+ const catchBlock = buildCatchBlock(style, target.name);
85
+ const wrapped = `\n try {${innerBody}} ${catchBlock}\n`;
86
+ result = result.slice(0, target.bodyStart) + wrapped + result.slice(target.bodyEnd);
87
+ changes.push(createChange(target.line, `Wrapped '${target.name}' with try/catch (${style})`));
88
+ }
89
+ changes.sort((a, b) => a.line - b.line);
90
+ return { transformed: result, changes };
91
+ }
92
+ //# sourceMappingURL=add-error-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-error-handling.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-error-handling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AddJSDocOptions, AddJSDocResult } from '../../../types/index.js';
2
+ /**
3
+ * Add JSDoc comments to functions and methods that don't have them.
4
+ */
5
+ export declare function addJSDoc(source: string, options: AddJSDocOptions, fileName: string): AddJSDocResult;
6
+ //# sourceMappingURL=add-jsdoc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-jsdoc.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-jsdoc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EAGf,cAAc,EACf,MAAM,yBAAyB,CAAC;AAwDjC;;GAEG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,MAAM,GACf,cAAc,CAwChB"}
@@ -0,0 +1,83 @@
1
+ // engine/code-transforms/typescript/add-jsdoc.ts — Add JSDoc comments (AC-07).
2
+ // Generates JSDoc stubs with @param, @returns, @throws for functions.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ function hasJSDoc(source, nodeStart) {
5
+ // Check if there is already a JSDoc comment before this node
6
+ const before = source.slice(Math.max(0, nodeStart - 200), nodeStart);
7
+ return before.trimEnd().endsWith('*/');
8
+ }
9
+ function bodyHasThrow(ts, body) {
10
+ if (ts.isThrowStatement(body)) {
11
+ return true;
12
+ }
13
+ let found = false;
14
+ ts.forEachChild(body, (child) => {
15
+ if (bodyHasThrow(ts, child)) {
16
+ found = true;
17
+ }
18
+ });
19
+ return found;
20
+ }
21
+ function buildJSDoc(ts, node, sourceFile, options) {
22
+ const lines = ['/**'];
23
+ /* v8 ignore next 1 -- FunctionDeclaration without name is extremely rare in valid TS */
24
+ const name = node.name ? node.name.getText(sourceFile) : 'anonymous';
25
+ lines.push(` * ${name}`);
26
+ if (options.includeParams !== false) {
27
+ for (const param of node.parameters) {
28
+ const pName = param.name.getText(sourceFile);
29
+ const pType = param.type ? param.type.getText(sourceFile) : 'unknown';
30
+ lines.push(` * @param {${pType}} ${pName}`);
31
+ }
32
+ }
33
+ if (options.includeReturns !== false && node.type) {
34
+ const retType = node.type.getText(sourceFile);
35
+ if (retType !== 'void') {
36
+ lines.push(` * @returns {${retType}}`);
37
+ }
38
+ }
39
+ if (options.includeThrows !== false && node.body && bodyHasThrow(ts, node.body)) {
40
+ lines.push(` * @throws {Error}`);
41
+ }
42
+ lines.push(' */');
43
+ return lines.join('\n');
44
+ }
45
+ /**
46
+ * Add JSDoc comments to functions and methods that don't have them.
47
+ */
48
+ export function addJSDoc(source, options, fileName) {
49
+ const ts = getTypeScript();
50
+ const sourceFile = parseSource(source, fileName);
51
+ const insertions = [];
52
+ function visit(node) {
53
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
54
+ const start = node.getStart(sourceFile);
55
+ if (!hasJSDoc(source, start) && node.name) {
56
+ const name = node.name.getText(sourceFile);
57
+ const doc = buildJSDoc(ts, node, sourceFile, options);
58
+ insertions.push({
59
+ position: start,
60
+ text: doc + '\n',
61
+ line: getLineNumber(sourceFile, start),
62
+ name,
63
+ });
64
+ }
65
+ }
66
+ ts.forEachChild(node, visit);
67
+ }
68
+ visit(sourceFile);
69
+ if (insertions.length === 0) {
70
+ return { transformed: source, changes: [] };
71
+ }
72
+ // Apply in reverse order
73
+ insertions.sort((a, b) => b.position - a.position);
74
+ let result = source;
75
+ const changes = [];
76
+ for (const ins of insertions) {
77
+ result = result.slice(0, ins.position) + ins.text + result.slice(ins.position);
78
+ changes.push(createChange(ins.line, `Added JSDoc to '${ins.name}'`));
79
+ }
80
+ changes.sort((a, b) => a.line - b.line);
81
+ return { transformed: result, changes };
82
+ }
83
+ //# sourceMappingURL=add-jsdoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-jsdoc.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-jsdoc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AddTypesOptions, AddTypesResult } from '../../../types/index.js';
2
+ export declare function addTypes(source: string, _options: AddTypesOptions, fileName: string): AddTypesResult;
3
+ //# sourceMappingURL=add-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-types.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EAGf,cAAc,EACf,MAAM,yBAAyB,CAAC;AA0LjC,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,cAAc,CAwBhB"}
@@ -0,0 +1,182 @@
1
+ // engine/code-transforms/typescript/add-types.ts — Add types transform (AC-03).
2
+ // Infers types from initializers and adds type annotations.
3
+ import { getTypeScript, parseSource, getLineNumber, createChange } from './ast-utils.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Type inference from initializer
6
+ // ---------------------------------------------------------------------------
7
+ function inferTypeFromInit(ts, init) {
8
+ if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) {
9
+ return 'string';
10
+ }
11
+ if (ts.isNumericLiteral(init)) {
12
+ return 'number';
13
+ }
14
+ if (init.kind === ts.SyntaxKind.TrueKeyword || init.kind === ts.SyntaxKind.FalseKeyword) {
15
+ return 'boolean';
16
+ }
17
+ if (init.kind === ts.SyntaxKind.NullKeyword) {
18
+ return 'null';
19
+ }
20
+ /* v8 ignore start -- UndefinedKeyword is rarely emitted; TS parses `undefined` as Identifier */
21
+ if (init.kind === ts.SyntaxKind.UndefinedKeyword) {
22
+ return 'undefined';
23
+ }
24
+ /* v8 ignore stop */
25
+ if (ts.isArrayLiteralExpression(init)) {
26
+ return inferArrayType(ts, init);
27
+ }
28
+ if (ts.isObjectLiteralExpression(init)) {
29
+ return 'Record<string, unknown>';
30
+ }
31
+ return undefined;
32
+ }
33
+ function inferArrayType(ts, arr) {
34
+ if (arr.elements.length === 0) {
35
+ return 'unknown[]';
36
+ }
37
+ const first = arr.elements[0];
38
+ /* v8 ignore start -- defensive: elements[0] always exists when length > 0 */
39
+ if (!first) {
40
+ return 'unknown[]';
41
+ }
42
+ /* v8 ignore stop */
43
+ const elemType = inferTypeFromInit(ts, first);
44
+ return elemType ? `${elemType}[]` : 'unknown[]';
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Collect replacements from variable declarations
48
+ // ---------------------------------------------------------------------------
49
+ function collectVariableTypes(ts, sourceFile, replacements) {
50
+ function visit(node) {
51
+ if (ts.isVariableDeclaration(node) && !node.type && node.initializer) {
52
+ const inferred = inferTypeFromInit(ts, node.initializer);
53
+ if (inferred) {
54
+ const nameEnd = node.name.getEnd();
55
+ replacements.push({
56
+ position: nameEnd,
57
+ length: 0,
58
+ newText: `: ${inferred}`,
59
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
60
+ description: `Added type annotation ': ${inferred}' to variable '${node.name.getText(sourceFile)}'`,
61
+ });
62
+ }
63
+ }
64
+ ts.forEachChild(node, visit);
65
+ }
66
+ visit(sourceFile);
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Collect replacements from function return types
70
+ // ---------------------------------------------------------------------------
71
+ function inferReturnType(ts, body) {
72
+ let foundType;
73
+ for (const stmt of body.statements) {
74
+ if (ts.isReturnStatement(stmt) && stmt.expression) {
75
+ const t = inferTypeFromInit(ts, stmt.expression);
76
+ if (t && !foundType) {
77
+ foundType = t;
78
+ }
79
+ else if (t && foundType && t !== foundType) {
80
+ return undefined; // mixed return types
81
+ }
82
+ }
83
+ }
84
+ return foundType;
85
+ }
86
+ function findClosingParen(source, startPos) {
87
+ let depth = 0;
88
+ for (let i = startPos; i < source.length; i++) {
89
+ const ch = source[i];
90
+ if (ch === '(') {
91
+ depth++;
92
+ }
93
+ if (ch === ')') {
94
+ depth--;
95
+ if (depth === 0) {
96
+ return i;
97
+ }
98
+ }
99
+ }
100
+ /* v8 ignore next 1 */
101
+ return -1;
102
+ }
103
+ function collectFunctionReturnTypes(ts, sourceFile, source, replacements) {
104
+ function visit(node) {
105
+ if ((ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) &&
106
+ !node.type &&
107
+ node.body) {
108
+ const retType = inferReturnType(ts, node.body);
109
+ if (retType) {
110
+ const parenPos = findClosingParen(source, node.getStart(sourceFile));
111
+ /* v8 ignore start -- defensive: findClosingParen always succeeds for valid function decls */
112
+ if (parenPos > 0) {
113
+ /* v8 ignore stop */
114
+ const insertPos = parenPos + 1;
115
+ /* v8 ignore start -- FunctionDeclaration without name is extremely rare */
116
+ const name = node.name ? node.name.getText(sourceFile) : '<anonymous>';
117
+ /* v8 ignore stop */
118
+ replacements.push({
119
+ position: insertPos,
120
+ length: 0,
121
+ newText: `: ${retType}`,
122
+ line: getLineNumber(sourceFile, node.getStart(sourceFile)),
123
+ description: `Added return type ': ${retType}' to function '${name}'`,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ ts.forEachChild(node, visit);
129
+ }
130
+ visit(sourceFile);
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // Collect replacements from function parameters
134
+ // ---------------------------------------------------------------------------
135
+ function collectParameterTypes(ts, sourceFile, replacements) {
136
+ function visit(node) {
137
+ if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {
138
+ for (const param of node.parameters) {
139
+ if (!param.type && param.initializer) {
140
+ const inferred = inferTypeFromInit(ts, param.initializer);
141
+ if (inferred) {
142
+ const nameEnd = param.name.getEnd();
143
+ replacements.push({
144
+ position: nameEnd,
145
+ length: 0,
146
+ newText: `: ${inferred}`,
147
+ line: getLineNumber(sourceFile, param.getStart(sourceFile)),
148
+ description: `Added type ': ${inferred}' to parameter '${param.name.getText(sourceFile)}'`,
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
154
+ ts.forEachChild(node, visit);
155
+ }
156
+ visit(sourceFile);
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // Main export
160
+ // ---------------------------------------------------------------------------
161
+ export function addTypes(source, _options, fileName) {
162
+ const ts = getTypeScript();
163
+ const sourceFile = parseSource(source, fileName);
164
+ const replacements = [];
165
+ collectVariableTypes(ts, sourceFile, replacements);
166
+ collectFunctionReturnTypes(ts, sourceFile, source, replacements);
167
+ collectParameterTypes(ts, sourceFile, replacements);
168
+ if (replacements.length === 0) {
169
+ return { transformed: source, changes: [] };
170
+ }
171
+ // Apply in reverse position order
172
+ replacements.sort((a, b) => b.position - a.position);
173
+ let result = source;
174
+ const changes = [];
175
+ for (const rep of replacements) {
176
+ result = result.slice(0, rep.position) + rep.newText + result.slice(rep.position + rep.length);
177
+ changes.push(createChange(rep.line, rep.description));
178
+ }
179
+ changes.sort((a, b) => a.line - b.line);
180
+ return { transformed: result, changes };
181
+ }
182
+ //# sourceMappingURL=add-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-types.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/add-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type TSModule from 'typescript';
2
+ /**
3
+ * Lazy-load the TypeScript compiler API. Caches after first call.
4
+ * Throws if `typescript` is not installed as a peer dependency.
5
+ */
6
+ export declare function getTypeScript(): typeof TSModule;
7
+ /** Reset the TS cache — used in tests. */
8
+ export declare function resetTypeScriptCache(): void;
9
+ /**
10
+ * Parse source code into a TS SourceFile AST node.
11
+ */
12
+ export declare function parseSource(source: string, fileName: string): TSModule.SourceFile;
13
+ /**
14
+ * Pretty-print a SourceFile AST back to string.
15
+ */
16
+ export declare function printSource(sourceFile: TSModule.SourceFile): string;
17
+ /**
18
+ * Find all AST nodes of a given SyntaxKind in a source file.
19
+ */
20
+ export declare function findNodes(sourceFile: TSModule.SourceFile, kind: TSModule.SyntaxKind): TSModule.Node[];
21
+ /**
22
+ * Get 1-based line number for a position in the source file.
23
+ */
24
+ export declare function getLineNumber(sourceFile: TSModule.SourceFile, pos: number): number;
25
+ /**
26
+ * Create a change record for reporting.
27
+ */
28
+ export declare function createChange(line: number, description: string): {
29
+ line: number;
30
+ description: string;
31
+ };
32
+ /**
33
+ * Apply a text replacement at a specific range in the source string.
34
+ * Replacements must be applied in reverse order (highest position first)
35
+ * to keep earlier positions valid.
36
+ */
37
+ export declare function replaceRange(source: string, start: number, end: number, replacement: string): string;
38
+ //# sourceMappingURL=ast-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/ast-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAQvC;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,QAAQ,CAa/C;AAED,0CAA0C;AAC1C,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,UAAU,CAGjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,MAAM,CAInE;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,EAC/B,IAAI,EAAE,QAAQ,CAAC,UAAU,GACxB,QAAQ,CAAC,IAAI,EAAE,CAajB;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElF;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -0,0 +1,90 @@
1
+ // engine/code-transforms/typescript/ast-utils.ts — Shared AST utilities (AC-08).
2
+ // Lazy-loads TypeScript compiler API and provides common helpers.
3
+ // ---------------------------------------------------------------------------
4
+ // Lazy TypeScript loader with cache
5
+ // ---------------------------------------------------------------------------
6
+ let tsCache;
7
+ /**
8
+ * Lazy-load the TypeScript compiler API. Caches after first call.
9
+ * Throws if `typescript` is not installed as a peer dependency.
10
+ */
11
+ export function getTypeScript() {
12
+ if (tsCache) {
13
+ return tsCache;
14
+ }
15
+ try {
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ tsCache = require('typescript');
18
+ return tsCache;
19
+ }
20
+ catch {
21
+ throw new Error('TypeScript compiler API not available. Install typescript as a peer dependency.');
22
+ }
23
+ }
24
+ /** Reset the TS cache — used in tests. */
25
+ export function resetTypeScriptCache() {
26
+ tsCache = undefined;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Parse / print helpers
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Parse source code into a TS SourceFile AST node.
33
+ */
34
+ export function parseSource(source, fileName) {
35
+ const ts = getTypeScript();
36
+ return ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true);
37
+ }
38
+ /**
39
+ * Pretty-print a SourceFile AST back to string.
40
+ */
41
+ export function printSource(sourceFile) {
42
+ const ts = getTypeScript();
43
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
44
+ return printer.printFile(sourceFile);
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // AST traversal
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Find all AST nodes of a given SyntaxKind in a source file.
51
+ */
52
+ export function findNodes(sourceFile, kind) {
53
+ const ts = getTypeScript();
54
+ const results = [];
55
+ function visit(node) {
56
+ if (node.kind === kind) {
57
+ results.push(node);
58
+ }
59
+ ts.forEachChild(node, visit);
60
+ }
61
+ visit(sourceFile);
62
+ return results;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Position helpers
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Get 1-based line number for a position in the source file.
69
+ */
70
+ export function getLineNumber(sourceFile, pos) {
71
+ return sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Text replacement helper
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Create a change record for reporting.
78
+ */
79
+ export function createChange(line, description) {
80
+ return { line, description };
81
+ }
82
+ /**
83
+ * Apply a text replacement at a specific range in the source string.
84
+ * Replacements must be applied in reverse order (highest position first)
85
+ * to keep earlier positions valid.
86
+ */
87
+ export function replaceRange(source, start, end, replacement) {
88
+ return source.slice(0, start) + replacement + source.slice(end);
89
+ }
90
+ //# sourceMappingURL=ast-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/ast-utils.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kEAAkE;AAIlE,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,IAAI,OAAoC,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACH,iEAAiE;QACjE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAoB,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,oBAAoB;IAClC,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IAC1D,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,UAA+B;IACzD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,UAA+B,EAC/B,IAAyB;IAEzB,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,SAAS,KAAK,CAAC,IAAmB;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAA+B,EAAE,GAAW;IACxE,OAAO,UAAU,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,WAAmB;IAEnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAa,EACb,GAAW,EACX,WAAmB;IAEnB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ExtractInterfaceOptions, ExtractResult } from '../../../types/index.js';
2
+ /**
3
+ * Extract an interface from a class declaration.
4
+ */
5
+ export declare function extractInterface(source: string, options: ExtractInterfaceOptions, fileName: string): ExtractResult;
6
+ //# sourceMappingURL=extract-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-interface.d.ts","sourceRoot":"","sources":["../../../../src/engine/code-transforms/typescript/extract-interface.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EAEvB,aAAa,EAEd,MAAM,yBAAyB,CAAC;AAyEjC;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,MAAM,GACf,aAAa,CA0Df"}