roto-rooter 0.0.1

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 (62) hide show
  1. package/README.md +52 -0
  2. package/dist/analyzer.d.ts +6 -0
  3. package/dist/analyzer.d.ts.map +1 -0
  4. package/dist/analyzer.js +121 -0
  5. package/dist/analyzer.js.map +1 -0
  6. package/dist/checks/a11y-check.d.ts +6 -0
  7. package/dist/checks/a11y-check.d.ts.map +1 -0
  8. package/dist/checks/a11y-check.js +13 -0
  9. package/dist/checks/a11y-check.js.map +1 -0
  10. package/dist/checks/form-check.d.ts +6 -0
  11. package/dist/checks/form-check.d.ts.map +1 -0
  12. package/dist/checks/form-check.js +74 -0
  13. package/dist/checks/form-check.js.map +1 -0
  14. package/dist/checks/interactive-check.d.ts +6 -0
  15. package/dist/checks/interactive-check.d.ts.map +1 -0
  16. package/dist/checks/interactive-check.js +12 -0
  17. package/dist/checks/interactive-check.js.map +1 -0
  18. package/dist/checks/link-check.d.ts +6 -0
  19. package/dist/checks/link-check.d.ts.map +1 -0
  20. package/dist/checks/link-check.js +56 -0
  21. package/dist/checks/link-check.js.map +1 -0
  22. package/dist/checks/loader-check.d.ts +6 -0
  23. package/dist/checks/loader-check.d.ts.map +1 -0
  24. package/dist/checks/loader-check.js +41 -0
  25. package/dist/checks/loader-check.js.map +1 -0
  26. package/dist/checks/params-check.d.ts +6 -0
  27. package/dist/checks/params-check.d.ts.map +1 -0
  28. package/dist/checks/params-check.js +56 -0
  29. package/dist/checks/params-check.js.map +1 -0
  30. package/dist/cli.d.ts +3 -0
  31. package/dist/cli.d.ts.map +1 -0
  32. package/dist/cli.js +151 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/index.d.ts +10 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +10 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parsers/action-parser.d.ts +17 -0
  39. package/dist/parsers/action-parser.d.ts.map +1 -0
  40. package/dist/parsers/action-parser.js +53 -0
  41. package/dist/parsers/action-parser.js.map +1 -0
  42. package/dist/parsers/component-parser.d.ts +6 -0
  43. package/dist/parsers/component-parser.d.ts.map +1 -0
  44. package/dist/parsers/component-parser.js +354 -0
  45. package/dist/parsers/component-parser.js.map +1 -0
  46. package/dist/parsers/route-parser.d.ts +19 -0
  47. package/dist/parsers/route-parser.d.ts.map +1 -0
  48. package/dist/parsers/route-parser.js +275 -0
  49. package/dist/parsers/route-parser.js.map +1 -0
  50. package/dist/types.d.ts +123 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils/ast-utils.d.ts +41 -0
  55. package/dist/utils/ast-utils.d.ts.map +1 -0
  56. package/dist/utils/ast-utils.js +114 -0
  57. package/dist/utils/ast-utils.js.map +1 -0
  58. package/dist/utils/suggestion.d.ts +10 -0
  59. package/dist/utils/suggestion.d.ts.map +1 -0
  60. package/dist/utils/suggestion.js +30 -0
  61. package/dist/utils/suggestion.js.map +1 -0
  62. package/package.json +48 -0
package/dist/cli.js ADDED
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { analyze } from "./analyzer.js";
6
+ function getVersion() {
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const packageJsonPath = path.resolve(__dirname, "..", "package.json");
9
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
10
+ return packageJson.version;
11
+ }
12
+ function main() {
13
+ const args = process.argv.slice(2);
14
+ const options = parseArgs(args);
15
+ if (options.version) {
16
+ console.log(getVersion());
17
+ process.exit(0);
18
+ }
19
+ if (options.help) {
20
+ printHelp();
21
+ process.exit(0);
22
+ }
23
+ const result = analyze(options);
24
+ if (options.format === "json") {
25
+ console.log(JSON.stringify(result, null, 2));
26
+ }
27
+ else {
28
+ printTextOutput(result.issues);
29
+ }
30
+ // Exit with error code if there are issues
31
+ const errorCount = result.issues.filter((i) => i.severity === "error").length;
32
+ if (errorCount > 0) {
33
+ process.exit(1);
34
+ }
35
+ }
36
+ function parseArgs(args) {
37
+ const options = {
38
+ files: [],
39
+ checks: [],
40
+ format: "text",
41
+ root: process.cwd(),
42
+ help: false,
43
+ version: false,
44
+ };
45
+ let i = 0;
46
+ while (i < args.length) {
47
+ const arg = args[i];
48
+ if (arg === "--help" || arg === "-h") {
49
+ options.help = true;
50
+ i++;
51
+ continue;
52
+ }
53
+ if (arg === "--version" || arg === "-v") {
54
+ options.version = true;
55
+ i++;
56
+ continue;
57
+ }
58
+ if (arg === "--format" || arg === "-f") {
59
+ const value = args[i + 1];
60
+ if (value === "json" || value === "text") {
61
+ options.format = value;
62
+ }
63
+ i += 2;
64
+ continue;
65
+ }
66
+ if (arg === "--check" || arg === "-c") {
67
+ const value = args[i + 1];
68
+ if (value) {
69
+ options.checks = value.split(",").map((c) => c.trim());
70
+ }
71
+ i += 2;
72
+ continue;
73
+ }
74
+ if (arg === "--app" || arg === "-a") {
75
+ const value = args[i + 1];
76
+ if (value) {
77
+ options.root = path.resolve(value);
78
+ }
79
+ i += 2;
80
+ continue;
81
+ }
82
+ // Positional argument - file to check
83
+ if (!arg.startsWith("-")) {
84
+ options.files.push(arg);
85
+ }
86
+ i++;
87
+ }
88
+ return options;
89
+ }
90
+ function printHelp() {
91
+ console.log(`
92
+ rr - Static analysis and functional verification for React Router applications
93
+
94
+ USAGE:
95
+ rr [OPTIONS] [FILES...]
96
+
97
+ OPTIONS:
98
+ -h, --help Show this help message
99
+ -v, --version Show version number
100
+ -f, --format <format> Output format: text (default) or json
101
+ -c, --check <checks> Comma-separated list of checks to run (default is all checks)
102
+ Available: links, forms, loader, params, interactive, a11y
103
+ -a, --app <path> Root directory of the app to roto-root (default: current directory)
104
+
105
+ EXAMPLES:
106
+ # Check all files in current directory
107
+ rr
108
+
109
+ # Check specific file(s)
110
+ rr app/routes/employees.tsx
111
+
112
+ # Run only link and form checks
113
+ rr --check links,forms
114
+
115
+ # Output as JSON
116
+ rr --format json
117
+
118
+ # Analyze files in the context of a different app
119
+ rr --app ./my-app ./my-app/app/routes/dashboard.tsx
120
+
121
+ # Analyze a file against an app in a different location
122
+ rr --app /path/to/app /some/other/path/component.tsx
123
+ `);
124
+ }
125
+ function printTextOutput(issues) {
126
+ if (issues.length === 0) {
127
+ console.log("No issues found.");
128
+ return;
129
+ }
130
+ const errorCount = issues.filter((i) => i.severity === "error").length;
131
+ const warningCount = issues.filter((i) => i.severity === "warning").length;
132
+ console.log(`\nrr found ${issues.length} issue${issues.length === 1 ? "" : "s"}:`);
133
+ console.log();
134
+ for (const issue of issues) {
135
+ const icon = issue.severity === "error" ? "[error]" : "[warning]";
136
+ const relativePath = path.relative(process.cwd(), issue.location.file);
137
+ console.log(`[${issue.category}] ${relativePath}:${issue.location.line}:${issue.location.column}`);
138
+ if (issue.code) {
139
+ console.log(` ${issue.code}`);
140
+ }
141
+ console.log(` ${icon} ${issue.message}`);
142
+ if (issue.suggestion) {
143
+ console.log(` -> ${issue.suggestion}`);
144
+ }
145
+ console.log();
146
+ }
147
+ console.log(`Summary: ${errorCount} error${errorCount === 1 ? "" : "s"}, ${warningCount} warning${warningCount === 1 ? "" : "s"}`);
148
+ console.log("Run with --help for options.");
149
+ }
150
+ main();
151
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { analyze } from "./analyzer.js";
2
+ export { parseRoutes, getAllRoutePaths, matchRoute, matchDynamicPattern } from "./parsers/route-parser.js";
3
+ export { parseComponent } from "./parsers/component-parser.js";
4
+ export { parseRouteExports } from "./parsers/action-parser.js";
5
+ export { checkLinks } from "./checks/link-check.js";
6
+ export { checkForms } from "./checks/form-check.js";
7
+ export { checkLoaders } from "./checks/loader-check.js";
8
+ export { checkParams } from "./checks/params-check.js";
9
+ export type { RouteDefinition, LinkReference, FormReference, DataHookReference, ComponentAnalysis, SourceLocation, AnalyzerIssue, AnalyzerResult, CliOptions, } from "./types.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // Public API exports
2
+ export { analyze } from "./analyzer.js";
3
+ export { parseRoutes, getAllRoutePaths, matchRoute, matchDynamicPattern } from "./parsers/route-parser.js";
4
+ export { parseComponent } from "./parsers/component-parser.js";
5
+ export { parseRouteExports } from "./parsers/action-parser.js";
6
+ export { checkLinks } from "./checks/link-check.js";
7
+ export { checkForms } from "./checks/form-check.js";
8
+ export { checkLoaders } from "./checks/loader-check.js";
9
+ export { checkParams } from "./checks/params-check.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface RouteExports {
2
+ hasLoader: boolean;
3
+ hasAction: boolean;
4
+ loaderLocation?: {
5
+ line: number;
6
+ column: number;
7
+ };
8
+ actionLocation?: {
9
+ line: number;
10
+ column: number;
11
+ };
12
+ }
13
+ /**
14
+ * Parse a route file to check for loader/action exports
15
+ */
16
+ export declare function parseRouteExports(filePath: string): RouteExports;
17
+ //# sourceMappingURL=action-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/action-parser.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAuDhE"}
@@ -0,0 +1,53 @@
1
+ import * as fs from "fs";
2
+ import ts from "typescript";
3
+ import { parseFile, walkAst, isExported } from "../utils/ast-utils.js";
4
+ /**
5
+ * Parse a route file to check for loader/action exports
6
+ */
7
+ export function parseRouteExports(filePath) {
8
+ const content = fs.readFileSync(filePath, "utf-8");
9
+ const sourceFile = parseFile(filePath, content);
10
+ let hasLoader = false;
11
+ let hasAction = false;
12
+ let loaderLocation;
13
+ let actionLocation;
14
+ walkAst(sourceFile, (node) => {
15
+ // Check for exported function declarations
16
+ if (ts.isFunctionDeclaration(node) && node.name && isExported(node)) {
17
+ const name = node.name.text;
18
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
19
+ if (name === "loader") {
20
+ hasLoader = true;
21
+ loaderLocation = { line: line + 1, column: character + 1 };
22
+ }
23
+ if (name === "action") {
24
+ hasAction = true;
25
+ actionLocation = { line: line + 1, column: character + 1 };
26
+ }
27
+ }
28
+ // Check for exported variable declarations (arrow functions)
29
+ if (ts.isVariableStatement(node) && isExported(node)) {
30
+ for (const decl of node.declarationList.declarations) {
31
+ if (ts.isIdentifier(decl.name)) {
32
+ const name = decl.name.text;
33
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(decl.getStart());
34
+ if (name === "loader") {
35
+ hasLoader = true;
36
+ loaderLocation = { line: line + 1, column: character + 1 };
37
+ }
38
+ if (name === "action") {
39
+ hasAction = true;
40
+ actionLocation = { line: line + 1, column: character + 1 };
41
+ }
42
+ }
43
+ }
44
+ }
45
+ });
46
+ return {
47
+ hasLoader,
48
+ hasAction,
49
+ loaderLocation,
50
+ actionLocation,
51
+ };
52
+ }
53
+ //# sourceMappingURL=action-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-parser.js","sourceRoot":"","sources":["../../src/parsers/action-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AASvE;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,cAA4D,CAAC;IACjE,IAAI,cAA4D,CAAC;IAEjE,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QAC3B,2CAA2C;QAC3C,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAClE,IAAI,CAAC,QAAQ,EAAE,CAChB,CAAC;YAEF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;YAC7D,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;gBACrD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAClE,IAAI,CAAC,QAAQ,EAAE,CAChB,CAAC;oBAEF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,SAAS,GAAG,IAAI,CAAC;wBACjB,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;oBAC7D,CAAC;oBACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,SAAS,GAAG,IAAI,CAAC;wBACjB,cAAc,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS;QACT,SAAS;QACT,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ComponentAnalysis } from "../types.js";
2
+ /**
3
+ * Parse a TSX component file and extract links, forms, and hooks
4
+ */
5
+ export declare function parseComponent(filePath: string): ComponentAnalysis;
6
+ //# sourceMappingURL=component-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/component-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAKlB,MAAM,aAAa,CAAC;AAYrB;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAkHlE"}
@@ -0,0 +1,354 @@
1
+ import * as fs from "fs";
2
+ import ts from "typescript";
3
+ import { parseFile, walkAst, isJsxElementWithName, getJsxAttribute, getJsxAttributeStringValue, isCallTo, isExported, getLineAndColumn, } from "../utils/ast-utils.js";
4
+ /**
5
+ * Parse a TSX component file and extract links, forms, and hooks
6
+ */
7
+ export function parseComponent(filePath) {
8
+ const content = fs.readFileSync(filePath, "utf-8");
9
+ const sourceFile = parseFile(filePath, content);
10
+ const links = [];
11
+ const forms = [];
12
+ const dataHooks = [];
13
+ let hasLoader = false;
14
+ let hasAction = false;
15
+ walkAst(sourceFile, (node) => {
16
+ // Check for Link components
17
+ if (isJsxElementWithName(node, "Link")) {
18
+ const link = extractLinkReference(node, sourceFile, filePath);
19
+ if (link) {
20
+ links.push(link);
21
+ }
22
+ }
23
+ // Check for anchor tags with href
24
+ if (isJsxElementWithName(node, "a")) {
25
+ const link = extractAnchorReference(node, sourceFile, filePath);
26
+ if (link) {
27
+ links.push(link);
28
+ }
29
+ }
30
+ // Check for Form components
31
+ if (isJsxElementWithName(node, "Form")) {
32
+ const form = extractFormReference(node, sourceFile, filePath);
33
+ if (form) {
34
+ forms.push(form);
35
+ }
36
+ }
37
+ // Check for redirect() calls
38
+ if (isCallTo(node, "redirect")) {
39
+ const link = extractRedirectReference(node, sourceFile, filePath);
40
+ if (link) {
41
+ links.push(link);
42
+ }
43
+ }
44
+ // Check for useNavigate().navigate() pattern
45
+ // This is more complex - we'd need to track the variable
46
+ // For now, look for navigate() calls directly
47
+ if (isCallTo(node, "navigate")) {
48
+ const link = extractNavigateReference(node, sourceFile, filePath);
49
+ if (link) {
50
+ links.push(link);
51
+ }
52
+ }
53
+ // Check for data hooks
54
+ if (isCallTo(node, "useLoaderData")) {
55
+ const hookRef = createDataHookReference("useLoaderData", node, sourceFile, filePath);
56
+ dataHooks.push(hookRef);
57
+ }
58
+ if (isCallTo(node, "useActionData")) {
59
+ const hookRef = createDataHookReference("useActionData", node, sourceFile, filePath);
60
+ dataHooks.push(hookRef);
61
+ }
62
+ if (isCallTo(node, "useParams")) {
63
+ const hookRef = extractUseParamsReference(node, sourceFile, filePath);
64
+ dataHooks.push(hookRef);
65
+ }
66
+ // Check for loader/action exports
67
+ if (ts.isFunctionDeclaration(node) && node.name) {
68
+ if (isExported(node)) {
69
+ if (node.name.text === "loader") {
70
+ hasLoader = true;
71
+ }
72
+ if (node.name.text === "action") {
73
+ hasAction = true;
74
+ }
75
+ }
76
+ }
77
+ // Also check for exported variable declarations (arrow functions)
78
+ if (ts.isVariableStatement(node) && isExported(node)) {
79
+ for (const decl of node.declarationList.declarations) {
80
+ if (ts.isIdentifier(decl.name)) {
81
+ if (decl.name.text === "loader") {
82
+ hasLoader = true;
83
+ }
84
+ if (decl.name.text === "action") {
85
+ hasAction = true;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ });
91
+ return {
92
+ file: filePath,
93
+ links,
94
+ forms,
95
+ dataHooks,
96
+ hasLoader,
97
+ hasAction,
98
+ };
99
+ }
100
+ /**
101
+ * Extract a Link reference from a <Link> element
102
+ */
103
+ function extractLinkReference(element, sourceFile, filePath) {
104
+ // Check for "to" or "href" attribute
105
+ const toAttr = getJsxAttribute(element, "to");
106
+ const hrefAttr = getJsxAttribute(element, "href");
107
+ const attr = toAttr || hrefAttr;
108
+ if (!attr) {
109
+ return undefined;
110
+ }
111
+ const value = getJsxAttributeStringValue(attr);
112
+ if (!value) {
113
+ // Complex expression we can't analyze
114
+ return undefined;
115
+ }
116
+ // Skip external URLs and hash links
117
+ if (isExternalOrHash(value.value)) {
118
+ return undefined;
119
+ }
120
+ const pos = getLineAndColumn(sourceFile, element.getStart());
121
+ return {
122
+ href: value.value,
123
+ isDynamic: value.isDynamic,
124
+ pattern: value.isDynamic ? normalizeToPattern(value.value) : undefined,
125
+ location: {
126
+ file: filePath,
127
+ line: pos.line,
128
+ column: pos.column,
129
+ },
130
+ type: "link",
131
+ };
132
+ }
133
+ /**
134
+ * Extract a Link reference from an <a> element
135
+ */
136
+ function extractAnchorReference(element, sourceFile, filePath) {
137
+ const hrefAttr = getJsxAttribute(element, "href");
138
+ if (!hrefAttr) {
139
+ return undefined;
140
+ }
141
+ const value = getJsxAttributeStringValue(hrefAttr);
142
+ if (!value) {
143
+ return undefined;
144
+ }
145
+ // Skip external URLs and hash links
146
+ if (isExternalOrHash(value.value)) {
147
+ return undefined;
148
+ }
149
+ const pos = getLineAndColumn(sourceFile, element.getStart());
150
+ return {
151
+ href: value.value,
152
+ isDynamic: value.isDynamic,
153
+ pattern: value.isDynamic ? normalizeToPattern(value.value) : undefined,
154
+ location: {
155
+ file: filePath,
156
+ line: pos.line,
157
+ column: pos.column,
158
+ },
159
+ type: "link",
160
+ };
161
+ }
162
+ /**
163
+ * Extract a Form reference from a <Form> element
164
+ */
165
+ function extractFormReference(element, sourceFile, filePath) {
166
+ const actionAttr = getJsxAttribute(element, "action");
167
+ const methodAttr = getJsxAttribute(element, "method");
168
+ let action;
169
+ if (actionAttr) {
170
+ const value = getJsxAttributeStringValue(actionAttr);
171
+ action = value?.value;
172
+ }
173
+ let method = "post";
174
+ if (methodAttr) {
175
+ const value = getJsxAttributeStringValue(methodAttr);
176
+ if (value) {
177
+ const m = value.value.toLowerCase();
178
+ if (["get", "post", "put", "patch", "delete"].includes(m)) {
179
+ method = m;
180
+ }
181
+ }
182
+ }
183
+ // Extract input names from form children
184
+ const inputNames = extractFormInputNames(element, sourceFile);
185
+ const pos = getLineAndColumn(sourceFile, element.getStart());
186
+ return {
187
+ action,
188
+ method,
189
+ inputNames,
190
+ location: {
191
+ file: filePath,
192
+ line: pos.line,
193
+ column: pos.column,
194
+ },
195
+ };
196
+ }
197
+ /**
198
+ * Extract input names from form children
199
+ */
200
+ function extractFormInputNames(element, sourceFile) {
201
+ const names = [];
202
+ walkAst(element, (node) => {
203
+ if (isJsxElementWithName(node, "input") || isJsxElementWithName(node, "select") || isJsxElementWithName(node, "textarea")) {
204
+ const nameAttr = getJsxAttribute(node, "name");
205
+ if (nameAttr) {
206
+ const value = getJsxAttributeStringValue(nameAttr);
207
+ if (value) {
208
+ names.push(value.value);
209
+ }
210
+ }
211
+ }
212
+ });
213
+ return names;
214
+ }
215
+ /**
216
+ * Extract a redirect reference from a redirect() call
217
+ */
218
+ function extractRedirectReference(call, sourceFile, filePath) {
219
+ if (call.arguments.length === 0) {
220
+ return undefined;
221
+ }
222
+ const arg = call.arguments[0];
223
+ let value;
224
+ if (ts.isStringLiteral(arg)) {
225
+ value = { value: arg.text, isDynamic: false };
226
+ }
227
+ else if (ts.isTemplateExpression(arg)) {
228
+ let pattern = arg.head.text;
229
+ for (const span of arg.templateSpans) {
230
+ pattern += ":param" + span.literal.text;
231
+ }
232
+ value = { value: pattern, isDynamic: true };
233
+ }
234
+ else if (ts.isNoSubstitutionTemplateLiteral(arg)) {
235
+ value = { value: arg.text, isDynamic: false };
236
+ }
237
+ if (!value || isExternalOrHash(value.value)) {
238
+ return undefined;
239
+ }
240
+ const pos = getLineAndColumn(sourceFile, call.getStart());
241
+ return {
242
+ href: value.value,
243
+ isDynamic: value.isDynamic,
244
+ pattern: value.isDynamic ? normalizeToPattern(value.value) : undefined,
245
+ location: {
246
+ file: filePath,
247
+ line: pos.line,
248
+ column: pos.column,
249
+ },
250
+ type: "redirect",
251
+ };
252
+ }
253
+ /**
254
+ * Extract a navigate reference from a navigate() call
255
+ */
256
+ function extractNavigateReference(call, sourceFile, filePath) {
257
+ if (call.arguments.length === 0) {
258
+ return undefined;
259
+ }
260
+ const arg = call.arguments[0];
261
+ let value;
262
+ if (ts.isStringLiteral(arg)) {
263
+ value = { value: arg.text, isDynamic: false };
264
+ }
265
+ else if (ts.isTemplateExpression(arg)) {
266
+ let pattern = arg.head.text;
267
+ for (const span of arg.templateSpans) {
268
+ pattern += ":param" + span.literal.text;
269
+ }
270
+ value = { value: pattern, isDynamic: true };
271
+ }
272
+ else if (ts.isNoSubstitutionTemplateLiteral(arg)) {
273
+ value = { value: arg.text, isDynamic: false };
274
+ }
275
+ if (!value || isExternalOrHash(value.value)) {
276
+ return undefined;
277
+ }
278
+ const pos = getLineAndColumn(sourceFile, call.getStart());
279
+ return {
280
+ href: value.value,
281
+ isDynamic: value.isDynamic,
282
+ pattern: value.isDynamic ? normalizeToPattern(value.value) : undefined,
283
+ location: {
284
+ file: filePath,
285
+ line: pos.line,
286
+ column: pos.column,
287
+ },
288
+ type: "navigate",
289
+ };
290
+ }
291
+ /**
292
+ * Create a data hook reference
293
+ */
294
+ function createDataHookReference(hook, call, sourceFile, filePath) {
295
+ const pos = getLineAndColumn(sourceFile, call.getStart());
296
+ return {
297
+ hook,
298
+ location: {
299
+ file: filePath,
300
+ line: pos.line,
301
+ column: pos.column,
302
+ },
303
+ };
304
+ }
305
+ /**
306
+ * Extract useParams reference with accessed param names
307
+ */
308
+ function extractUseParamsReference(call, sourceFile, filePath) {
309
+ const pos = getLineAndColumn(sourceFile, call.getStart());
310
+ // Try to find which params are accessed
311
+ // This is complex as it depends on how the result is used
312
+ // For now, we'll do basic tracking
313
+ const accessedParams = [];
314
+ // Look at the parent - if it's a variable declaration, track property access
315
+ const parent = call.parent;
316
+ if (ts.isVariableDeclaration(parent)) {
317
+ // Destructuring: const { id } = useParams()
318
+ if (ts.isObjectBindingPattern(parent.name)) {
319
+ for (const element of parent.name.elements) {
320
+ if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
321
+ accessedParams.push(element.name.text);
322
+ }
323
+ }
324
+ }
325
+ }
326
+ return {
327
+ hook: "useParams",
328
+ accessedParams: accessedParams.length > 0 ? accessedParams : undefined,
329
+ location: {
330
+ file: filePath,
331
+ line: pos.line,
332
+ column: pos.column,
333
+ },
334
+ };
335
+ }
336
+ /**
337
+ * Check if a URL is external or a hash link
338
+ */
339
+ function isExternalOrHash(url) {
340
+ return (url.startsWith("http://") ||
341
+ url.startsWith("https://") ||
342
+ url.startsWith("mailto:") ||
343
+ url.startsWith("tel:") ||
344
+ url.startsWith("#") ||
345
+ url.startsWith("//"));
346
+ }
347
+ /**
348
+ * Normalize a dynamic href to a pattern for matching
349
+ * "/employees/:param" stays the same
350
+ */
351
+ function normalizeToPattern(href) {
352
+ return href;
353
+ }
354
+ //# sourceMappingURL=component-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-parser.js","sourceRoot":"","sources":["../../src/parsers/component-parser.ts"],"names":[],"mappings":"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"}