@elench/ts-analysis 0.1.109

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.
@@ -0,0 +1,8 @@
1
+ import * as ts from "typescript";
2
+ import type { CallableNode, JSImportCollectionOptions, ImportCollection, ScopeLocalFunctions } from "./types.js";
3
+ export declare function collectImports(sourceFile: ts.SourceFile, options: JSImportCollectionOptions): ImportCollection;
4
+ export declare function collectTopLevelFunctions(sourceFile: ts.SourceFile): ScopeLocalFunctions;
5
+ export declare function collectExportedCallables(sourceFile: ts.SourceFile, topLevelFunctions: ScopeLocalFunctions): ScopeLocalFunctions;
6
+ export declare function collectScopeLocalFunctions(node: CallableNode): ScopeLocalFunctions;
7
+ export declare function findDefaultExportCallable(sourceFile: ts.SourceFile, localFunctions: ScopeLocalFunctions): CallableNode | null;
8
+ //# sourceMappingURL=callables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callables.d.ts","sourceRoot":"","sources":["../src/callables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjH,wBAAgB,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,yBAAyB,GAAG,gBAAgB,CAiC9G;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,mBAAmB,CAiBvF;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,iBAAiB,EAAE,mBAAmB,GACrC,mBAAmB,CAoBrB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CA0BlF;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,cAAc,EAAE,mBAAmB,GAClC,YAAY,GAAG,IAAI,CAgBrB"}
@@ -0,0 +1,126 @@
1
+ import * as ts from "typescript";
2
+ import { extractStringLiteral } from "./syntax.js";
3
+ export function collectImports(sourceFile, options) {
4
+ const imports = new Map();
5
+ for (const statement of sourceFile.statements) {
6
+ if (!ts.isImportDeclaration(statement) || !statement.importClause)
7
+ continue;
8
+ const specifier = extractStringLiteral(statement.moduleSpecifier);
9
+ if (!specifier)
10
+ continue;
11
+ const resolvedFilePath = options.resolveImportPath(specifier);
12
+ const sourceContent = resolvedFilePath ? options.readSourceFile(resolvedFilePath) : null;
13
+ const serverActionImport = Boolean(sourceContent && options.isServerActionFile(sourceContent));
14
+ if (statement.importClause.name) {
15
+ imports.set(statement.importClause.name.text, {
16
+ importedName: "default",
17
+ specifier,
18
+ resolvedFilePath,
19
+ isServerAction: serverActionImport,
20
+ });
21
+ }
22
+ const bindings = statement.importClause.namedBindings;
23
+ if (!bindings || !ts.isNamedImports(bindings))
24
+ continue;
25
+ for (const element of bindings.elements) {
26
+ const localName = element.name.text;
27
+ const importedName = element.propertyName?.text || localName;
28
+ imports.set(localName, {
29
+ importedName,
30
+ specifier,
31
+ resolvedFilePath,
32
+ isServerAction: serverActionImport,
33
+ });
34
+ }
35
+ }
36
+ return imports;
37
+ }
38
+ export function collectTopLevelFunctions(sourceFile) {
39
+ const functions = new Map();
40
+ for (const statement of sourceFile.statements) {
41
+ if (ts.isFunctionDeclaration(statement) && statement.name) {
42
+ functions.set(statement.name.text, statement);
43
+ continue;
44
+ }
45
+ if (!ts.isVariableStatement(statement))
46
+ continue;
47
+ for (const declaration of statement.declarationList.declarations) {
48
+ if (!ts.isIdentifier(declaration.name) || !declaration.initializer)
49
+ continue;
50
+ if (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)) {
51
+ functions.set(declaration.name.text, declaration.initializer);
52
+ }
53
+ }
54
+ }
55
+ return functions;
56
+ }
57
+ export function collectExportedCallables(sourceFile, topLevelFunctions) {
58
+ const exports = new Map();
59
+ for (const statement of sourceFile.statements) {
60
+ if (ts.isFunctionDeclaration(statement) && statement.name && hasExportModifier(statement.modifiers)) {
61
+ exports.set(statement.name.text, statement);
62
+ continue;
63
+ }
64
+ if (!ts.isVariableStatement(statement) || !hasExportModifier(statement.modifiers))
65
+ continue;
66
+ for (const declaration of statement.declarationList.declarations) {
67
+ if (!ts.isIdentifier(declaration.name) || !declaration.initializer)
68
+ continue;
69
+ if (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)) {
70
+ exports.set(declaration.name.text, declaration.initializer);
71
+ }
72
+ else if (ts.isIdentifier(declaration.initializer)) {
73
+ const referenced = topLevelFunctions.get(declaration.initializer.text);
74
+ if (referenced)
75
+ exports.set(declaration.name.text, referenced);
76
+ }
77
+ }
78
+ }
79
+ return exports;
80
+ }
81
+ export function collectScopeLocalFunctions(node) {
82
+ const functions = new Map();
83
+ const callableBody = "body" in node ? node.body : null;
84
+ if (!callableBody)
85
+ return functions;
86
+ const visit = (child) => {
87
+ if (ts.isFunctionDeclaration(child) && child.name) {
88
+ functions.set(child.name.text, child);
89
+ return;
90
+ }
91
+ if (child !== callableBody && (ts.isArrowFunction(child) || ts.isFunctionExpression(child))) {
92
+ return;
93
+ }
94
+ if (ts.isVariableDeclaration(child) && ts.isIdentifier(child.name) && child.initializer) {
95
+ if (ts.isArrowFunction(child.initializer) || ts.isFunctionExpression(child.initializer)) {
96
+ functions.set(child.name.text, child.initializer);
97
+ }
98
+ }
99
+ ts.forEachChild(child, visit);
100
+ };
101
+ visit(callableBody);
102
+ return functions;
103
+ }
104
+ export function findDefaultExportCallable(sourceFile, localFunctions) {
105
+ for (const statement of sourceFile.statements) {
106
+ if (ts.isFunctionDeclaration(statement) && hasDefaultModifier(statement.modifiers)) {
107
+ return statement;
108
+ }
109
+ if (ts.isExportAssignment(statement)) {
110
+ if (ts.isIdentifier(statement.expression)) {
111
+ return localFunctions.get(statement.expression.text) || null;
112
+ }
113
+ if (ts.isArrowFunction(statement.expression) || ts.isFunctionExpression(statement.expression)) {
114
+ return statement.expression;
115
+ }
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+ function hasExportModifier(modifiers) {
121
+ return Boolean(modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword));
122
+ }
123
+ function hasDefaultModifier(modifiers) {
124
+ return Boolean(modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword));
125
+ }
126
+ //# sourceMappingURL=callables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callables.js","sourceRoot":"","sources":["../src/callables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ExportedFunctionBody } from "./types.js";
2
+ export declare function extractExportedMethodBodies(content: string, methods: string[], filePath?: string): Array<[string, string]>;
3
+ export declare function extractExportedFunctions(content: string, filePath?: string): ExportedFunctionBody[];
4
+ export declare function extractExportedFunctionBody(content: string, exportName: string, filePath?: string): string | null;
5
+ export declare function readBalancedBlock(content: string, startIndex: number): string | null;
6
+ //# sourceMappingURL=exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,SAAa,GACpB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOzB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,oBAAoB,EAAE,CAaxG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,MAAM,GAAG,IAAI,CAQtH;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBpF"}
@@ -0,0 +1,70 @@
1
+ import * as ts from "typescript";
2
+ import { createSourceFile } from "./syntax.js";
3
+ export function extractExportedMethodBodies(content, methods, filePath = "route.ts") {
4
+ const bodies = [];
5
+ for (const method of methods) {
6
+ const body = extractExportedFunctionBody(content, method, filePath);
7
+ if (body)
8
+ bodies.push([method, body]);
9
+ }
10
+ return bodies;
11
+ }
12
+ export function extractExportedFunctions(content, filePath = "module.ts") {
13
+ const sourceFile = createSourceFile(filePath, content);
14
+ const exported = [];
15
+ for (const statement of sourceFile.statements) {
16
+ if (!ts.isFunctionDeclaration(statement) || !statement.name || !hasExportModifier(statement.modifiers) || !statement.body) {
17
+ continue;
18
+ }
19
+ exported.push({
20
+ name: statement.name.text,
21
+ body: bodyText(sourceFile, statement.body),
22
+ });
23
+ }
24
+ return exported;
25
+ }
26
+ export function extractExportedFunctionBody(content, exportName, filePath = "module.ts") {
27
+ const sourceFile = createSourceFile(filePath, content);
28
+ for (const statement of sourceFile.statements) {
29
+ if (!ts.isFunctionDeclaration(statement) || !statement.name || statement.name.text !== exportName)
30
+ continue;
31
+ if (!hasExportModifier(statement.modifiers) || !statement.body)
32
+ return null;
33
+ return bodyText(sourceFile, statement.body);
34
+ }
35
+ return null;
36
+ }
37
+ export function readBalancedBlock(content, startIndex) {
38
+ let depth = 0;
39
+ let inSingle = false;
40
+ let inDouble = false;
41
+ let inTemplate = false;
42
+ for (let index = startIndex; index < content.length; index += 1) {
43
+ const char = content[index];
44
+ const previous = content[index - 1];
45
+ if (char === "'" && !inDouble && !inTemplate && previous !== "\\")
46
+ inSingle = !inSingle;
47
+ if (char === '"' && !inSingle && !inTemplate && previous !== "\\")
48
+ inDouble = !inDouble;
49
+ if (char === "`" && !inSingle && !inDouble && previous !== "\\")
50
+ inTemplate = !inTemplate;
51
+ if (inSingle || inDouble || inTemplate)
52
+ continue;
53
+ if (char === "{")
54
+ depth += 1;
55
+ if (char === "}") {
56
+ depth -= 1;
57
+ if (depth === 0) {
58
+ return content.slice(startIndex, index + 1);
59
+ }
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ function hasExportModifier(modifiers) {
65
+ return Boolean(modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword));
66
+ }
67
+ function bodyText(sourceFile, bodyNode) {
68
+ return sourceFile.text.slice(bodyNode.getStart(sourceFile), bodyNode.end);
69
+ }
70
+ //# sourceMappingURL=exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { AnalysisProject, AnalysisProjectOptions, CallableNode, ExportedFunctionBody, HttpRequest, JSImportCollectionOptions, JSImportRecord, JsxAttributeMap, JsxAttributeValue, LoadedTsConfig, RequestExtractionOptions, } from "./types.js";
2
+ export { DEFAULT_DYNAMIC_SEGMENT_TOKEN, normalizePath } from "./shared.js";
3
+ export { createAnalysisProject, findNearestTsConfig, loadTsConfig } from "./project.js";
4
+ export { resolveImportToSourceFile, resolveSourceCandidate } from "./resolution.js";
5
+ export { collectExportedCallables, collectImports, collectScopeLocalFunctions, collectTopLevelFunctions, findDefaultExportCallable, } from "./callables.js";
6
+ export { collectJsxAttributes, extractJsxLabel, flattenJsxText, walkJsx } from "./jsx.js";
7
+ export { extractExportedFunctionBody, extractExportedFunctions, extractExportedMethodBodies, readBalancedBlock } from "./exports.js";
8
+ export { extractHttpRequests, extractPlaywrightVisitedRoutes, extractRouteLiteral } from "./requests.js";
9
+ export { createSourceFile, extractLineNumber, extractStringLiteral } from "./syntax.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,yBAAyB,EACzB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,6BAA6B,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrI,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { DEFAULT_DYNAMIC_SEGMENT_TOKEN, normalizePath } from "./shared.js";
2
+ export { createAnalysisProject, findNearestTsConfig, loadTsConfig } from "./project.js";
3
+ export { resolveImportToSourceFile, resolveSourceCandidate } from "./resolution.js";
4
+ export { collectExportedCallables, collectImports, collectScopeLocalFunctions, collectTopLevelFunctions, findDefaultExportCallable, } from "./callables.js";
5
+ export { collectJsxAttributes, extractJsxLabel, flattenJsxText, walkJsx } from "./jsx.js";
6
+ export { extractExportedFunctionBody, extractExportedFunctions, extractExportedMethodBodies, readBalancedBlock } from "./exports.js";
7
+ export { extractHttpRequests, extractPlaywrightVisitedRoutes, extractRouteLiteral } from "./requests.js";
8
+ export { createSourceFile, extractLineNumber, extractStringLiteral } from "./syntax.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,6BAA6B,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrI,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
package/dist/jsx.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import * as ts from "typescript";
2
+ import type { JsxAttributeMap } from "./types.js";
3
+ type JsxVisitNode = ts.JsxElement | ts.JsxSelfClosingElement;
4
+ export declare function walkJsx(sourceFile: ts.SourceFile | ts.Node, visitor: (node: JsxVisitNode, formContext: unknown) => unknown): void;
5
+ export declare function collectJsxAttributes(openingElement: ts.JsxOpeningLikeElement): JsxAttributeMap;
6
+ export declare function flattenJsxText(children: readonly ts.JsxChild[]): string;
7
+ export declare function extractJsxLabel(node: JsxVisitNode, attributes: JsxAttributeMap): string | null;
8
+ export {};
9
+ //# sourceMappingURL=jsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,YAAY,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,qBAAqB,CAAC;AAE7D,wBAAgB,OAAO,CACrB,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,IAAI,EACnC,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,KAAK,OAAO,GAC7D,IAAI,CAgBN;AAED,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,EAAE,CAAC,qBAAqB,GAAG,eAAe,CAwB9F;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,MAAM,CAYvE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAQ9F"}
package/dist/jsx.js ADDED
@@ -0,0 +1,68 @@
1
+ import * as ts from "typescript";
2
+ export function walkJsx(sourceFile, visitor) {
3
+ const visit = (node, formContext = null) => {
4
+ let nextFormContext = formContext;
5
+ if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node)) {
6
+ nextFormContext = visitor(node, formContext);
7
+ }
8
+ if (ts.isJsxElement(node)) {
9
+ for (const child of node.children)
10
+ visit(child, nextFormContext);
11
+ return;
12
+ }
13
+ ts.forEachChild(node, (child) => visit(child, nextFormContext));
14
+ };
15
+ visit(sourceFile, null);
16
+ }
17
+ export function collectJsxAttributes(openingElement) {
18
+ const attributes = {};
19
+ for (const property of openingElement.attributes.properties) {
20
+ if (!ts.isJsxAttribute(property))
21
+ continue;
22
+ const name = property.name.getText();
23
+ if (!property.initializer) {
24
+ attributes[name] = { stringValue: "true", expression: null };
25
+ continue;
26
+ }
27
+ if (ts.isStringLiteral(property.initializer)) {
28
+ attributes[name] = { stringValue: property.initializer.text, expression: null };
29
+ continue;
30
+ }
31
+ if (ts.isJsxExpression(property.initializer)) {
32
+ attributes[name] = {
33
+ stringValue: property.initializer.expression && ts.isStringLiteralLike(property.initializer.expression)
34
+ ? property.initializer.expression.text
35
+ : null,
36
+ expression: property.initializer.expression || null,
37
+ };
38
+ }
39
+ }
40
+ return attributes;
41
+ }
42
+ export function flattenJsxText(children) {
43
+ let text = "";
44
+ for (const child of children) {
45
+ if (ts.isJsxText(child)) {
46
+ text += child.getText().replace(/\s+/gu, " ");
47
+ }
48
+ else if (ts.isJsxExpression(child) && child.expression && ts.isStringLiteralLike(child.expression)) {
49
+ text += child.expression.text;
50
+ }
51
+ else if (ts.isJsxElement(child)) {
52
+ text += flattenJsxText(child.children);
53
+ }
54
+ }
55
+ return text;
56
+ }
57
+ export function extractJsxLabel(node, attributes) {
58
+ const ariaLabel = attributes["aria-label"]?.stringValue || attributes.title?.stringValue || null;
59
+ if (ariaLabel)
60
+ return ariaLabel;
61
+ if (ts.isJsxElement(node)) {
62
+ const text = flattenJsxText(node.children).trim();
63
+ if (text)
64
+ return text;
65
+ }
66
+ return null;
67
+ }
68
+ //# sourceMappingURL=jsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AnalysisProject, AnalysisProjectOptions, LoadedTsConfig } from "./types.js";
2
+ export declare function findNearestTsConfig(startDir: string): string | null;
3
+ export declare function loadTsConfig(tsconfigPath: string): LoadedTsConfig;
4
+ export declare function createAnalysisProject({ rootDir, tsconfigPath }?: AnalysisProjectOptions): AnalysisProject;
5
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI1F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,CA2BjE;AAED,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,YAAmB,EAAE,GAAE,sBAA2B,GAAG,eAAe,CAsCpH"}
@@ -0,0 +1,90 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as ts from "typescript";
4
+ import { defaultCompilerOptions, normalizePath } from "./shared.js";
5
+ import { resolveImportToSourceFile } from "./resolution.js";
6
+ export function findNearestTsConfig(startDir) {
7
+ return ts.findConfigFile(startDir, ts.sys.fileExists, "tsconfig.json") || null;
8
+ }
9
+ export function loadTsConfig(tsconfigPath) {
10
+ const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
11
+ if (configFile.error) {
12
+ return {
13
+ tsconfigPath,
14
+ rootDir: path.dirname(tsconfigPath),
15
+ fileNames: [],
16
+ options: defaultCompilerOptions(path.dirname(tsconfigPath)),
17
+ errors: [configFile.error],
18
+ };
19
+ }
20
+ const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(tsconfigPath), defaultCompilerOptions(path.dirname(tsconfigPath)), tsconfigPath);
21
+ return {
22
+ tsconfigPath,
23
+ rootDir: path.dirname(tsconfigPath),
24
+ fileNames: parsed.fileNames.map(normalizePath),
25
+ options: parsed.options,
26
+ errors: parsed.errors || [],
27
+ };
28
+ }
29
+ export function createAnalysisProject({ rootDir, tsconfigPath = null } = {}) {
30
+ const resolvedRoot = path.resolve(rootDir || process.cwd());
31
+ const resolvedConfigPath = tsconfigPath ? path.resolve(tsconfigPath) : findNearestTsConfig(resolvedRoot);
32
+ const config = resolvedConfigPath
33
+ ? loadTsConfig(resolvedConfigPath)
34
+ : {
35
+ tsconfigPath: null,
36
+ rootDir: resolvedRoot,
37
+ fileNames: listProjectFiles(resolvedRoot),
38
+ options: defaultCompilerOptions(resolvedRoot),
39
+ errors: [],
40
+ };
41
+ const program = ts.createProgram(config.fileNames, config.options);
42
+ const checker = program.getTypeChecker();
43
+ const diagnostics = [...config.errors, ...ts.getPreEmitDiagnostics(program)];
44
+ return {
45
+ rootDir: config.rootDir,
46
+ tsconfigPath: config.tsconfigPath,
47
+ program,
48
+ checker,
49
+ compilerOptions: config.options,
50
+ diagnostics,
51
+ getSourceFiles() {
52
+ return program.getSourceFiles().filter((file) => !file.isDeclarationFile);
53
+ },
54
+ getSourceFile(filePath) {
55
+ return program.getSourceFile(path.isAbsolute(filePath) ? filePath : path.join(config.rootDir, filePath)) || null;
56
+ },
57
+ readSourceFile(filePath) {
58
+ const sourceFile = this.getSourceFile(filePath);
59
+ return sourceFile ? sourceFile.text : null;
60
+ },
61
+ resolveImport(fromFilePath, specifier) {
62
+ return resolveImportToSourceFile(config.rootDir, normalizePath(fromFilePath), specifier, config.options);
63
+ },
64
+ };
65
+ }
66
+ function listProjectFiles(rootDir) {
67
+ const results = [];
68
+ const queue = [rootDir];
69
+ while (queue.length > 0) {
70
+ const current = queue.pop();
71
+ if (!current)
72
+ continue;
73
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
74
+ if (entry.isSymbolicLink())
75
+ continue;
76
+ const absolutePath = path.join(current, entry.name);
77
+ if (entry.isDirectory()) {
78
+ if (entry.name === "node_modules" || entry.name === ".next" || entry.name === ".git")
79
+ continue;
80
+ queue.push(absolutePath);
81
+ continue;
82
+ }
83
+ if (/\.(ts|tsx|js|jsx|mjs)$/u.test(entry.name)) {
84
+ results.push(normalizePath(absolutePath));
85
+ }
86
+ }
87
+ }
88
+ return results.sort((left, right) => left.localeCompare(right));
89
+ }
90
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as ts from "typescript";
2
+ import type { HttpRequest, RequestExtractionOptions } from "./types.js";
3
+ export declare function extractHttpRequests(content: string, options?: RequestExtractionOptions): HttpRequest[];
4
+ export declare function extractPlaywrightVisitedRoutes(content: string, options?: RequestExtractionOptions): string[];
5
+ export declare function extractRouteLiteral(node: ts.Node | undefined, options?: RequestExtractionOptions): string | null;
6
+ //# sourceMappingURL=requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../src/requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAWxE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,WAAW,EAAE,CAgB1G;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,MAAM,EAAE,CAgBhH;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,EACzB,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,IAAI,CAKf"}
@@ -0,0 +1,140 @@
1
+ import * as ts from "typescript";
2
+ import { createSourceFile, extractStringLiteral } from "./syntax.js";
3
+ const HTTP_WRAPPER_METHODS = {
4
+ getJson: "GET",
5
+ postJson: "POST",
6
+ putJson: "PUT",
7
+ patchJson: "PATCH",
8
+ deleteJson: "DELETE",
9
+ };
10
+ export function extractHttpRequests(content, options = {}) {
11
+ const filePath = options.filePath || "suite.testkit.ts";
12
+ const normalizeRoute = options.normalizeRoute || defaultNormalizeRoute;
13
+ const sourceFile = createSourceFile(filePath, content);
14
+ const requests = [];
15
+ const visit = (node) => {
16
+ if (ts.isCallExpression(node)) {
17
+ const request = resolveHttpRequestCall(node, { normalizeRoute, dynamicSegmentToken: options.dynamicSegmentToken });
18
+ if (request)
19
+ requests.push(request);
20
+ }
21
+ ts.forEachChild(node, visit);
22
+ };
23
+ visit(sourceFile);
24
+ return dedupeRequests(requests);
25
+ }
26
+ export function extractPlaywrightVisitedRoutes(content, options = {}) {
27
+ const filePath = options.filePath || "suite.ui.testkit.ts";
28
+ const normalizeRoute = options.normalizeRoute || defaultNormalizeRoute;
29
+ const sourceFile = createSourceFile(filePath, content);
30
+ const routes = [];
31
+ const visit = (node) => {
32
+ if (ts.isCallExpression(node)) {
33
+ const route = resolveGotoRoute(node, { normalizeRoute, dynamicSegmentToken: options.dynamicSegmentToken });
34
+ if (route)
35
+ routes.push(route);
36
+ }
37
+ ts.forEachChild(node, visit);
38
+ };
39
+ visit(sourceFile);
40
+ return [...new Set(routes)];
41
+ }
42
+ export function extractRouteLiteral(node, options = {}) {
43
+ const normalizeRoute = options.normalizeRoute || defaultNormalizeRoute;
44
+ const literal = extractStringLiteral(node, options);
45
+ if (!literal)
46
+ return null;
47
+ return normalizeRoute(literal.split("?")[0]);
48
+ }
49
+ function resolveGotoRoute(callExpression, options) {
50
+ const callee = callExpression.expression;
51
+ if (!ts.isPropertyAccessExpression(callee))
52
+ return null;
53
+ if (callee.name.text !== "goto")
54
+ return null;
55
+ const pathArg = callExpression.arguments[0];
56
+ const literal = extractStringLiteral(pathArg, options);
57
+ if (!literal)
58
+ return null;
59
+ if (/^https?:\/\//u.test(literal)) {
60
+ try {
61
+ const parsed = new URL(literal);
62
+ if (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1") {
63
+ return options.normalizeRoute(parsed.pathname.split("?")[0]);
64
+ }
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ return null;
70
+ }
71
+ return options.normalizeRoute(literal.split("?")[0]);
72
+ }
73
+ function resolveHttpRequestCall(callExpression, options) {
74
+ const callee = callExpression.expression;
75
+ if (ts.isIdentifier(callee)) {
76
+ if (callee.text === "fetch") {
77
+ const path = extractRouteLiteral(callExpression.arguments[0], options);
78
+ if (!path || !path.startsWith("/api/"))
79
+ return null;
80
+ return {
81
+ method: extractFetchMethod(callExpression.arguments[1], options) || "GET",
82
+ path,
83
+ confidence: "high",
84
+ };
85
+ }
86
+ const method = HTTP_WRAPPER_METHODS[callee.text];
87
+ if (method) {
88
+ const path = extractRouteLiteral(callExpression.arguments[0], options);
89
+ if (!path || !path.startsWith("/api/"))
90
+ return null;
91
+ return { method, path, confidence: "high" };
92
+ }
93
+ if (callee.text === "rawReq") {
94
+ const methodLiteral = extractStringLiteral(callExpression.arguments[0], options);
95
+ const path = extractRouteLiteral(callExpression.arguments[1], options);
96
+ if (!methodLiteral || !path)
97
+ return null;
98
+ return { method: methodLiteral.toUpperCase(), path, confidence: "high" };
99
+ }
100
+ }
101
+ if (ts.isPropertyAccessExpression(callee) && callee.name.text === "rawReq") {
102
+ const methodLiteral = extractStringLiteral(callExpression.arguments[0], options);
103
+ const path = extractRouteLiteral(callExpression.arguments[1], options);
104
+ if (!methodLiteral || !path)
105
+ return null;
106
+ return { method: methodLiteral.toUpperCase(), path, confidence: "high" };
107
+ }
108
+ return null;
109
+ }
110
+ function extractFetchMethod(node, options) {
111
+ if (!node || !ts.isObjectLiteralExpression(node))
112
+ return null;
113
+ for (const property of node.properties) {
114
+ if (!ts.isPropertyAssignment(property))
115
+ continue;
116
+ if (property.name.getText() !== "method")
117
+ continue;
118
+ const value = extractStringLiteral(property.initializer, options);
119
+ return value ? value.toUpperCase() : null;
120
+ }
121
+ return null;
122
+ }
123
+ function dedupeRequests(requests) {
124
+ const seen = new Set();
125
+ return requests.filter((entry) => {
126
+ const key = `${entry.method}:${entry.path}`;
127
+ if (seen.has(key))
128
+ return false;
129
+ seen.add(key);
130
+ return true;
131
+ });
132
+ }
133
+ function defaultNormalizeRoute(value) {
134
+ const trimmed = String(value || "/").trim();
135
+ if (!trimmed || trimmed === "/")
136
+ return "/";
137
+ const withLeadingSlash = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
138
+ return withLeadingSlash.length > 1 ? withLeadingSlash.replace(/\/+$/u, "") : withLeadingSlash;
139
+ }
140
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../src/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import * as ts from "typescript";
2
+ export declare function resolveImportToSourceFile(serviceRoot: string, fromFilePath: string, specifier: string, compilerOptions?: ts.CompilerOptions | null): string | null;
3
+ export declare function resolveSourceCandidate(basePath: string, serviceRoot?: string | null): string | null;
4
+ //# sourceMappingURL=resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution.d.ts","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,eAAe,GAAE,EAAE,CAAC,eAAe,GAAG,IAAW,GAChD,MAAM,GAAG,IAAI,CAqBf;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,GAAG,IAAI,CAgBzG"}
@@ -0,0 +1,53 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as ts from "typescript";
4
+ import { defaultCompilerOptions, normalizePath } from "./shared.js";
5
+ export function resolveImportToSourceFile(serviceRoot, fromFilePath, specifier, compilerOptions = null) {
6
+ if (!specifier)
7
+ return null;
8
+ if (specifier.startsWith(".")) {
9
+ const fromDirectory = path.dirname(path.join(serviceRoot, fromFilePath));
10
+ return resolveSourceCandidate(path.resolve(fromDirectory, specifier), serviceRoot);
11
+ }
12
+ const options = { ...defaultCompilerOptions(serviceRoot), ...(compilerOptions || {}) };
13
+ const containingFile = path.join(serviceRoot, fromFilePath);
14
+ const resolved = ts.resolveModuleName(specifier, containingFile, options, ts.sys).resolvedModule;
15
+ if (resolved?.resolvedFileName) {
16
+ if (resolved.resolvedFileName.endsWith(".d.ts"))
17
+ return null;
18
+ return normalizeResolvedFile(serviceRoot, resolved.resolvedFileName);
19
+ }
20
+ if (specifier.startsWith("@/")) {
21
+ const fromRoot = resolveSourceCandidate(path.join(serviceRoot, specifier.slice(2)), serviceRoot);
22
+ if (fromRoot)
23
+ return fromRoot;
24
+ return resolveSourceCandidate(path.join(serviceRoot, "src", specifier.slice(2)), serviceRoot);
25
+ }
26
+ return null;
27
+ }
28
+ export function resolveSourceCandidate(basePath, serviceRoot = null) {
29
+ const direct = [basePath, `${basePath}.ts`, `${basePath}.tsx`, `${basePath}.js`, `${basePath}.jsx`, `${basePath}.mjs`];
30
+ for (const candidate of direct) {
31
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isFile())
32
+ return normalizeResolvedFile(serviceRoot, candidate);
33
+ }
34
+ const indexed = [
35
+ path.join(basePath, "index.ts"),
36
+ path.join(basePath, "index.tsx"),
37
+ path.join(basePath, "index.js"),
38
+ path.join(basePath, "index.jsx"),
39
+ path.join(basePath, "index.mjs"),
40
+ ];
41
+ for (const candidate of indexed) {
42
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isFile())
43
+ return normalizeResolvedFile(serviceRoot, candidate);
44
+ }
45
+ return null;
46
+ }
47
+ function normalizeResolvedFile(serviceRoot, resolvedFileName) {
48
+ const normalized = normalizePath(resolvedFileName);
49
+ if (!serviceRoot)
50
+ return normalized;
51
+ return normalizePath(path.relative(serviceRoot, normalized));
52
+ }
53
+ //# sourceMappingURL=resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as ts from "typescript";
2
+ export declare const DEFAULT_DYNAMIC_SEGMENT_TOKEN = "__TESTKIT_DYNAMIC_SEGMENT__";
3
+ export declare function normalizePath(filePath: string): string;
4
+ export declare function scriptKindForFile(filePath: string): ts.ScriptKind;
5
+ export declare function defaultCompilerOptions(rootDir?: string): ts.CompilerOptions;
6
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAE3E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,CAMjE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,SAAgB,GAAG,EAAE,CAAC,eAAe,CAalF"}
package/dist/shared.js ADDED
@@ -0,0 +1,31 @@
1
+ import * as path from "node:path";
2
+ import * as ts from "typescript";
3
+ export const DEFAULT_DYNAMIC_SEGMENT_TOKEN = "__TESTKIT_DYNAMIC_SEGMENT__";
4
+ export function normalizePath(filePath) {
5
+ return String(filePath || "").split(path.sep).join("/");
6
+ }
7
+ export function scriptKindForFile(filePath) {
8
+ const normalized = normalizePath(filePath);
9
+ if (normalized.endsWith(".tsx"))
10
+ return ts.ScriptKind.TSX;
11
+ if (normalized.endsWith(".jsx"))
12
+ return ts.ScriptKind.JSX;
13
+ if (normalized.endsWith(".js") || normalized.endsWith(".mjs"))
14
+ return ts.ScriptKind.JS;
15
+ return ts.ScriptKind.TS;
16
+ }
17
+ export function defaultCompilerOptions(rootDir = process.cwd()) {
18
+ return {
19
+ allowJs: true,
20
+ checkJs: false,
21
+ jsx: ts.JsxEmit.Preserve,
22
+ target: ts.ScriptTarget.ESNext,
23
+ module: ts.ModuleKind.ESNext,
24
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
25
+ baseUrl: rootDir,
26
+ paths: {
27
+ "@/*": ["./*", "./src/*"],
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC;AAE3E,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IACvF,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;QACxB,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;QAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM;QAC5B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO;QACjD,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;SAC1B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import * as ts from "typescript";
2
+ export declare function createSourceFile(filePath: string, content: string): ts.SourceFile;
3
+ export declare function extractStringLiteral(node: ts.Node | undefined | null, options?: {
4
+ dynamicSegmentToken?: string;
5
+ }): string | null;
6
+ export declare function extractLineNumber(node: ts.Node): number;
7
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../src/syntax.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,CAEjF;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,EAChC,OAAO,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,MAAM,GAAG,IAAI,CAcf;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAEvD"}
package/dist/syntax.js ADDED
@@ -0,0 +1,27 @@
1
+ import * as ts from "typescript";
2
+ import { DEFAULT_DYNAMIC_SEGMENT_TOKEN, scriptKindForFile } from "./shared.js";
3
+ export function createSourceFile(filePath, content) {
4
+ return ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, scriptKindForFile(filePath));
5
+ }
6
+ export function extractStringLiteral(node, options = {}) {
7
+ const dynamicSegmentToken = options.dynamicSegmentToken || DEFAULT_DYNAMIC_SEGMENT_TOKEN;
8
+ if (!node)
9
+ return null;
10
+ if (ts.isStringLiteralLike(node))
11
+ return node.text;
12
+ if (ts.isNoSubstitutionTemplateLiteral(node))
13
+ return node.text;
14
+ if (ts.isTemplateExpression(node)) {
15
+ let value = node.head.text;
16
+ for (const span of node.templateSpans) {
17
+ value += dynamicSegmentToken;
18
+ value += span.literal.text;
19
+ }
20
+ return value;
21
+ }
22
+ return null;
23
+ }
24
+ export function extractLineNumber(node) {
25
+ return ts.getLineAndCharacterOfPosition(node.getSourceFile(), node.getStart()).line + 1;
26
+ }
27
+ //# sourceMappingURL=syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../src/syntax.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IAChE,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAgC,EAChC,UAA4C,EAAE;IAE9C,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,6BAA6B,CAAC;IACzF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnD,IAAI,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC/D,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,KAAK,IAAI,mBAAmB,CAAC;YAC7B,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type * as ts from "typescript";
2
+ export interface JSImportRecord {
3
+ importedName: string;
4
+ specifier: string;
5
+ resolvedFilePath: string | null;
6
+ isServerAction: boolean;
7
+ }
8
+ export interface JSImportCollectionOptions {
9
+ resolveImportPath: (specifier: string) => string | null;
10
+ readSourceFile: (filePath: string) => string | null;
11
+ isServerActionFile: (content: string) => boolean;
12
+ }
13
+ export type CallableNode = ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression;
14
+ export type ScopeLocalFunctions = Map<string, CallableNode>;
15
+ export type ImportCollection = Map<string, JSImportRecord>;
16
+ export interface LoadedTsConfig {
17
+ tsconfigPath: string | null;
18
+ rootDir: string;
19
+ fileNames: string[];
20
+ options: ts.CompilerOptions;
21
+ errors: readonly ts.Diagnostic[];
22
+ }
23
+ export interface AnalysisProjectOptions {
24
+ rootDir?: string;
25
+ tsconfigPath?: string | null;
26
+ }
27
+ export interface AnalysisProject {
28
+ rootDir: string;
29
+ tsconfigPath: string | null;
30
+ program: ts.Program;
31
+ checker: ts.TypeChecker;
32
+ compilerOptions: ts.CompilerOptions;
33
+ diagnostics: readonly ts.Diagnostic[];
34
+ getSourceFiles(): ts.SourceFile[];
35
+ getSourceFile(filePath: string): ts.SourceFile | null;
36
+ readSourceFile(filePath: string): string | null;
37
+ resolveImport(fromFilePath: string, specifier: string): string | null;
38
+ }
39
+ export interface JsxAttributeValue {
40
+ stringValue: string | null;
41
+ expression: ts.Expression | null;
42
+ }
43
+ export type JsxAttributeMap = Record<string, JsxAttributeValue>;
44
+ export interface HttpRequest {
45
+ method: string;
46
+ path: string;
47
+ confidence: "high";
48
+ }
49
+ export interface RequestExtractionOptions {
50
+ filePath?: string;
51
+ normalizeRoute?: (value: string) => string;
52
+ dynamicSegmentToken?: string;
53
+ }
54
+ export interface ExportedFunctionBody {
55
+ name: string;
56
+ body: string;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD;AAED,MAAM,MAAM,YAAY,GAAG,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,CAAC;AAC7F,MAAM,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;IAC5B,MAAM,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC;IACpC,WAAW,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC;IACtC,cAAc,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;IAClC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC;IACtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@elench/ts-analysis",
3
+ "version": "0.1.109",
4
+ "description": "TypeScript compiler-backed source analysis primitives for Erench tools",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ },
11
+ "./package.json": "./package.json"
12
+ },
13
+ "types": "./dist/index.d.ts",
14
+ "files": [
15
+ "dist/",
16
+ "package.json"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.build.json",
20
+ "clean": "rm -rf dist",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit"
22
+ },
23
+ "peerDependencies": {
24
+ "typescript": ">=5.9.0 <6.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "5.9.3"
28
+ }
29
+ }