@cr8rcho/alkahest 0.1.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 (130) hide show
  1. package/README.ko.md +208 -0
  2. package/README.md +208 -0
  3. package/dist/assets/dashboard.html +647 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +68 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/hook.d.ts +1 -0
  8. package/dist/commands/hook.js +64 -0
  9. package/dist/commands/hook.js.map +1 -0
  10. package/dist/commands/login.d.ts +11 -0
  11. package/dist/commands/login.js +27 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/mcp.d.ts +6 -0
  14. package/dist/commands/mcp.js +13 -0
  15. package/dist/commands/mcp.js.map +1 -0
  16. package/dist/commands/publish.d.ts +19 -0
  17. package/dist/commands/publish.js +27 -0
  18. package/dist/commands/publish.js.map +1 -0
  19. package/dist/commands/scan.d.ts +11 -0
  20. package/dist/commands/scan.js +29 -0
  21. package/dist/commands/scan.js.map +1 -0
  22. package/dist/commands/update.d.ts +15 -0
  23. package/dist/commands/update.js +41 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/commands/view.d.ts +6 -0
  26. package/dist/commands/view.js +21 -0
  27. package/dist/commands/view.js.map +1 -0
  28. package/dist/core/adapters/angular.d.ts +2 -0
  29. package/dist/core/adapters/angular.js +305 -0
  30. package/dist/core/adapters/angular.js.map +1 -0
  31. package/dist/core/adapters/astro.d.ts +3 -0
  32. package/dist/core/adapters/astro.js +140 -0
  33. package/dist/core/adapters/astro.js.map +1 -0
  34. package/dist/core/adapters/compose.d.ts +2 -0
  35. package/dist/core/adapters/compose.js +195 -0
  36. package/dist/core/adapters/compose.js.map +1 -0
  37. package/dist/core/adapters/django.d.ts +2 -0
  38. package/dist/core/adapters/django.js +314 -0
  39. package/dist/core/adapters/django.js.map +1 -0
  40. package/dist/core/adapters/expo-router.d.ts +2 -0
  41. package/dist/core/adapters/expo-router.js +60 -0
  42. package/dist/core/adapters/expo-router.js.map +1 -0
  43. package/dist/core/adapters/flask.d.ts +2 -0
  44. package/dist/core/adapters/flask.js +249 -0
  45. package/dist/core/adapters/flask.js.map +1 -0
  46. package/dist/core/adapters/flutter.d.ts +2 -0
  47. package/dist/core/adapters/flutter.js +232 -0
  48. package/dist/core/adapters/flutter.js.map +1 -0
  49. package/dist/core/adapters/index.d.ts +19 -0
  50. package/dist/core/adapters/index.js +59 -0
  51. package/dist/core/adapters/index.js.map +1 -0
  52. package/dist/core/adapters/next-app.d.ts +2 -0
  53. package/dist/core/adapters/next-app.js +62 -0
  54. package/dist/core/adapters/next-app.js.map +1 -0
  55. package/dist/core/adapters/next-pages.d.ts +2 -0
  56. package/dist/core/adapters/next-pages.js +70 -0
  57. package/dist/core/adapters/next-pages.js.map +1 -0
  58. package/dist/core/adapters/nuxt.d.ts +2 -0
  59. package/dist/core/adapters/nuxt.js +59 -0
  60. package/dist/core/adapters/nuxt.js.map +1 -0
  61. package/dist/core/adapters/rails.d.ts +2 -0
  62. package/dist/core/adapters/rails.js +275 -0
  63. package/dist/core/adapters/rails.js.map +1 -0
  64. package/dist/core/adapters/react-jsx.d.ts +68 -0
  65. package/dist/core/adapters/react-jsx.js +355 -0
  66. package/dist/core/adapters/react-jsx.js.map +1 -0
  67. package/dist/core/adapters/react-navigation.d.ts +2 -0
  68. package/dist/core/adapters/react-navigation.js +153 -0
  69. package/dist/core/adapters/react-navigation.js.map +1 -0
  70. package/dist/core/adapters/react-router.d.ts +2 -0
  71. package/dist/core/adapters/react-router.js +249 -0
  72. package/dist/core/adapters/react-router.js.map +1 -0
  73. package/dist/core/adapters/remix.d.ts +2 -0
  74. package/dist/core/adapters/remix.js +109 -0
  75. package/dist/core/adapters/remix.js.map +1 -0
  76. package/dist/core/adapters/static-html.d.ts +2 -0
  77. package/dist/core/adapters/static-html.js +157 -0
  78. package/dist/core/adapters/static-html.js.map +1 -0
  79. package/dist/core/adapters/sveltekit.d.ts +2 -0
  80. package/dist/core/adapters/sveltekit.js +151 -0
  81. package/dist/core/adapters/sveltekit.js.map +1 -0
  82. package/dist/core/adapters/swiftui.d.ts +2 -0
  83. package/dist/core/adapters/swiftui.js +216 -0
  84. package/dist/core/adapters/swiftui.js.map +1 -0
  85. package/dist/core/adapters/types.d.ts +65 -0
  86. package/dist/core/adapters/types.js +2 -0
  87. package/dist/core/adapters/types.js.map +1 -0
  88. package/dist/core/adapters/uikit.d.ts +2 -0
  89. package/dist/core/adapters/uikit.js +178 -0
  90. package/dist/core/adapters/uikit.js.map +1 -0
  91. package/dist/core/adapters/vue-router.d.ts +2 -0
  92. package/dist/core/adapters/vue-router.js +224 -0
  93. package/dist/core/adapters/vue-router.js.map +1 -0
  94. package/dist/core/adapters/vue-sfc.d.ts +28 -0
  95. package/dist/core/adapters/vue-sfc.js +132 -0
  96. package/dist/core/adapters/vue-sfc.js.map +1 -0
  97. package/dist/core/credentials.d.ts +24 -0
  98. package/dist/core/credentials.js +30 -0
  99. package/dist/core/credentials.js.map +1 -0
  100. package/dist/core/dashboard.d.ts +9 -0
  101. package/dist/core/dashboard.js +20 -0
  102. package/dist/core/dashboard.js.map +1 -0
  103. package/dist/core/emit.d.ts +7 -0
  104. package/dist/core/emit.js +23 -0
  105. package/dist/core/emit.js.map +1 -0
  106. package/dist/core/hash.d.ts +2 -0
  107. package/dist/core/hash.js +6 -0
  108. package/dist/core/hash.js.map +1 -0
  109. package/dist/core/pipeline.d.ts +25 -0
  110. package/dist/core/pipeline.js +122 -0
  111. package/dist/core/pipeline.js.map +1 -0
  112. package/dist/core/publish.d.ts +31 -0
  113. package/dist/core/publish.js +87 -0
  114. package/dist/core/publish.js.map +1 -0
  115. package/dist/core/resolve.d.ts +42 -0
  116. package/dist/core/resolve.js +128 -0
  117. package/dist/core/resolve.js.map +1 -0
  118. package/dist/core/serve.d.ts +5 -0
  119. package/dist/core/serve.js +52 -0
  120. package/dist/core/serve.js.map +1 -0
  121. package/dist/core/types.d.ts +117 -0
  122. package/dist/core/types.js +9 -0
  123. package/dist/core/types.js.map +1 -0
  124. package/dist/core/version.d.ts +23 -0
  125. package/dist/core/version.js +102 -0
  126. package/dist/core/version.js.map +1 -0
  127. package/dist/mcp/server.d.ts +7 -0
  128. package/dist/mcp/server.js +224 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/package.json +57 -0
@@ -0,0 +1,305 @@
1
+ import { readdirSync, readFileSync, existsSync, statSync } from "node:fs";
2
+ import { join, relative, sep, dirname, resolve } from "node:path";
3
+ import { Project, Node, SyntaxKind, ts } from "ts-morph";
4
+ /**
5
+ * Angular adapter. Routes are *declared* in a TS config — `RouterModule.forRoot([...])` /
6
+ * `forChild([...])` or a standalone `provideRouter([...])` / exported `Routes` array. discover()
7
+ * parses that config with ts-morph, maps each route's `component` (static import) or
8
+ * `loadComponent: () => import('…')` (lazy) to its source file; nested `children` join through
9
+ * parent paths.
10
+ *
11
+ * A component's signals come from its `@Component` template — inline (`template: \`…\``) or an
12
+ * external `templateUrl` html file — plus its TS body:
13
+ * - nav: `routerLink="/x"` / `[routerLink]="'/x'"` / `[routerLink]="['/x']"` (template);
14
+ * `router.navigate(['/x'])` / `router.navigateByUrl('/x')` (TS)
15
+ * - call: `http.get('url')` / `this.http.post('url', …)` etc. (TS)
16
+ * - feature: `<button>`, `<input|textarea|select>`, `<form>`, `*ngFor` (template)
17
+ *
18
+ * Screen id = full route path ("/users/:id"); entry = "/".
19
+ */
20
+ const SOURCE_RE = /\.(ts)$/;
21
+ const CONFIG_HINT = /RouterModule\.for(Root|Child)|provideRouter|:\s*Routes\b/;
22
+ const EXTS = [".ts"];
23
+ function srcRootOf(projectRoot) {
24
+ const src = join(projectRoot, "src");
25
+ return existsSync(src) && statSync(src).isDirectory() ? src : projectRoot;
26
+ }
27
+ function hasAngularDep(projectRoot) {
28
+ try {
29
+ const pkg = JSON.parse(readFileSync(join(projectRoot, "package.json"), "utf8"));
30
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
31
+ return "@angular/core" in deps || "@angular/router" in deps;
32
+ }
33
+ catch {
34
+ return existsSync(join(projectRoot, "angular.json"));
35
+ }
36
+ }
37
+ let _project = null;
38
+ function project() {
39
+ if (!_project)
40
+ _project = new Project({
41
+ useInMemoryFileSystem: false,
42
+ skipAddingFilesFromTsConfig: true,
43
+ compilerOptions: { allowJs: true, jsx: ts.JsxEmit.React },
44
+ });
45
+ return _project;
46
+ }
47
+ function sourceFileFor(absPath) {
48
+ return project().getSourceFile(absPath) ?? project().addSourceFileAtPath(absPath);
49
+ }
50
+ export const angularAdapter = {
51
+ id: "angular",
52
+ router: "angular-router",
53
+ detect(projectRoot) {
54
+ return hasAngularDep(projectRoot);
55
+ },
56
+ discover(projectRoot) {
57
+ const root = srcRootOf(projectRoot);
58
+ const byRoute = new Map();
59
+ walkTs(root, (file) => {
60
+ const src = safeRead(file);
61
+ if (!CONFIG_HINT.test(src))
62
+ return; // cheap pre-filter
63
+ const sf = sourceFileFor(file);
64
+ const entries = routesFromConfig(sf);
65
+ if (entries.length === 0)
66
+ return;
67
+ const imports = importSpecs(sf);
68
+ const configDir = dirname(file);
69
+ for (const { route, spec } of entries) {
70
+ if (byRoute.has(route))
71
+ continue; // first declaration wins
72
+ const abs = spec ? resolveTsFile(configDir, spec) : null;
73
+ if (!abs)
74
+ continue; // can't open the component → skip
75
+ byRoute.set(route, {
76
+ absPath: abs,
77
+ relPath: relative(projectRoot, abs).split(sep).join("/"),
78
+ id: route,
79
+ route,
80
+ title: titleFromRoute(route),
81
+ isEntry: route === "/",
82
+ });
83
+ }
84
+ });
85
+ return [...byRoute.values()].sort((a, b) => a.route.localeCompare(b.route));
86
+ },
87
+ parse(file) {
88
+ return parseAngularComponent(file.absPath);
89
+ },
90
+ };
91
+ // ---------- route extraction (ts-morph) ----------
92
+ /** Every `Routes`-shaped array literal in the file → flattened routes (paths joined through children). */
93
+ function routesFromConfig(sf) {
94
+ const out = [];
95
+ const imports = importSpecs(sf);
96
+ const seen = new Set();
97
+ const handle = (arr) => {
98
+ if (arr && Node.isArrayLiteralExpression(arr) && !seen.has(arr)) {
99
+ seen.add(arr);
100
+ walkRouteArray(arr, "/", out, imports);
101
+ }
102
+ };
103
+ // forRoot([...]) / forChild([...]) / provideRouter([...]) call arguments
104
+ for (const ce of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
105
+ const expr = ce.getExpression();
106
+ const name = Node.isPropertyAccessExpression(expr) ? expr.getName() : expr.getText();
107
+ if (name === "forRoot" || name === "forChild" || name === "provideRouter")
108
+ handle(ce.getArguments()[0]);
109
+ }
110
+ // `const routes: Routes = [...]` and `export const routes = [...]`
111
+ for (const decl of sf.getDescendantsOfKind(SyntaxKind.VariableDeclaration)) {
112
+ const typeNode = decl.getTypeNode();
113
+ if (typeNode?.getText() === "Routes")
114
+ handle(decl.getInitializer());
115
+ }
116
+ return out;
117
+ }
118
+ function walkRouteArray(arr, parentPath, out, imports) {
119
+ if (!Node.isArrayLiteralExpression(arr))
120
+ return;
121
+ for (const el of arr.getElements()) {
122
+ if (Node.isObjectLiteralExpression(el))
123
+ walkRouteObject(el, parentPath, out, imports);
124
+ }
125
+ }
126
+ function walkRouteObject(obj, parentPath, out, imports) {
127
+ const pathVal = stringProp(obj, "path");
128
+ const route = joinRoute(parentPath, pathVal);
129
+ const spec = componentSpec(obj, imports);
130
+ if (spec || pathVal != null)
131
+ out.push({ route, spec });
132
+ const childrenProp = obj.getProperty("children");
133
+ if (childrenProp && Node.isPropertyAssignment(childrenProp)) {
134
+ const init = childrenProp.getInitializer();
135
+ if (init)
136
+ walkRouteArray(init, route, out, imports);
137
+ }
138
+ }
139
+ /** `component: Home` (static import) or `loadComponent: () => import('./x').then(m => m.X)` → module specifier. */
140
+ function componentSpec(obj, imports) {
141
+ const comp = obj.getProperty("component");
142
+ if (comp && Node.isPropertyAssignment(comp)) {
143
+ const init = comp.getInitializer();
144
+ if (init && Node.isIdentifier(init))
145
+ return imports.get(init.getText()) ?? null;
146
+ }
147
+ const load = obj.getProperty("loadComponent");
148
+ if (load && Node.isPropertyAssignment(load)) {
149
+ const dyn = dynamicImportSpecifier(load.getInitializer());
150
+ if (dyn)
151
+ return dyn;
152
+ }
153
+ return null;
154
+ }
155
+ // ---------- component parsing (template + TS) ----------
156
+ const ROUTER_LINK = /\brouterLink\b(?:=["']([^"']+)["']|]=["']\[?['"]?(\/[^"'\]]+)['"]?]?["'])/;
157
+ const NAVIGATE = /\.navigate(?:ByUrl)?\s*\(\s*\[?\s*["'`]([^"'`]+)["'`]/;
158
+ const HTTP_CALL = /\bhttp\.(get|post|put|delete|patch)\s*(?:<[^>]*>)?\s*\(\s*["'`]([^"'`]+)["'`]/;
159
+ const TEMPLATE_URL = /templateUrl:\s*["'`]([^"'`]+)["'`]/;
160
+ const FEATURE_RULES = [
161
+ { re: /<button\b[^>]*>([^<]*)/i, kind: "button", label: (m) => m[1].trim() || "Button" },
162
+ { re: /<(?:input|textarea|select)\b[^>]*\bplaceholder=["']([^"']*)["']/i, kind: "input", label: (m) => m[1] || "Input" },
163
+ { re: /<(?:input|textarea|select)\b/i, kind: "input", label: () => "Input" },
164
+ { re: /<form\b/i, kind: "form", label: () => "Form" },
165
+ { re: /\*ngFor\b/, kind: "list", label: () => "List" },
166
+ ];
167
+ /** Parse an Angular component file: TS body for navigate()/http calls + its template (inline or templateUrl) for routerLink/features. */
168
+ function parseAngularComponent(absPath) {
169
+ const ts = safeRead(absPath);
170
+ const templateUrlMatch = ts.match(TEMPLATE_URL);
171
+ const externalTemplate = templateUrlMatch ? safeRead(resolve(dirname(absPath), templateUrlMatch[1])) : "";
172
+ // The inline template lives inside the @Component decorator's TS; scanning the whole TS source
173
+ // for routerLink/features covers it without isolating the literal.
174
+ const markup = ts + "\n" + externalTemplate;
175
+ const navs = [];
176
+ const calls = [];
177
+ const features = [];
178
+ // --- navigation + calls: scan TS lines (navigate/http) ---
179
+ ts.split(/\r?\n/).forEach((rawLine, i) => {
180
+ const line = rawLine.trim();
181
+ const navM = line.match(NAVIGATE);
182
+ if (navM)
183
+ navs.push({ target: normalizeNav(navM[1]), raw: snippet(line), trigger: "router.navigate", line: i + 1 });
184
+ const httpM = line.match(HTTP_CALL);
185
+ if (httpM)
186
+ calls.push({ url: httpM[2], method: httpM[1].toUpperCase(), raw: snippet(line), trigger: "http", line: i + 1 });
187
+ });
188
+ // --- routerLink + features: scan combined markup ---
189
+ markup.split(/\r?\n/).forEach((rawLine, i) => {
190
+ const line = rawLine.trim();
191
+ const linkM = line.match(ROUTER_LINK);
192
+ if (linkM) {
193
+ const target = linkM[1] ?? linkM[2] ?? null;
194
+ navs.push({ target: target ? normalizeNav(target) : null, raw: snippet(line), trigger: "routerLink", line: i + 1 });
195
+ }
196
+ for (const rule of FEATURE_RULES) {
197
+ const m = line.match(rule.re);
198
+ if (m) {
199
+ features.push({ kind: rule.kind, label: rule.label(m), detail: m[0].trim().slice(0, 40), line: i + 1 });
200
+ break;
201
+ }
202
+ }
203
+ });
204
+ return { navs, calls, features, components: [], contains: [] };
205
+ }
206
+ /** `users/42` or `/users` → "/users/42"; arrays already split on the first literal. */
207
+ function normalizeNav(target) {
208
+ const t = target.startsWith("/") ? target : "/" + target;
209
+ return t.length > 1 ? t.replace(/\/+$/, "") : "/";
210
+ }
211
+ // ---------- helpers ----------
212
+ function importSpecs(sf) {
213
+ const map = new Map();
214
+ for (const imp of sf.getImportDeclarations()) {
215
+ const spec = imp.getModuleSpecifierValue();
216
+ const def = imp.getDefaultImport();
217
+ if (def)
218
+ map.set(def.getText(), spec);
219
+ for (const n of imp.getNamedImports())
220
+ map.set(n.getName(), spec);
221
+ }
222
+ return map;
223
+ }
224
+ function dynamicImportSpecifier(node) {
225
+ if (!node)
226
+ return null;
227
+ for (const ce of node.getDescendantsOfKind(SyntaxKind.CallExpression)) {
228
+ if (ce.getExpression().getKind() === SyntaxKind.ImportKeyword) {
229
+ const a = ce.getArguments()[0];
230
+ if (a && Node.isStringLiteral(a))
231
+ return a.getLiteralValue();
232
+ }
233
+ }
234
+ return null;
235
+ }
236
+ function stringProp(obj, name) {
237
+ const prop = obj.getProperty(name);
238
+ if (prop && Node.isPropertyAssignment(prop)) {
239
+ const init = prop.getInitializer();
240
+ if (init && Node.isStringLiteral(init))
241
+ return init.getLiteralValue();
242
+ }
243
+ return null;
244
+ }
245
+ function resolveTsFile(configDir, spec) {
246
+ if (!spec.startsWith("."))
247
+ return null;
248
+ const base = resolve(configDir, spec);
249
+ const candidates = [...EXTS.map((e) => base + e), ...EXTS.map((e) => join(base, "index" + e))];
250
+ if (SOURCE_RE.test(base))
251
+ candidates.unshift(base);
252
+ return candidates.find((c) => existsSync(c) && statSync(c).isFile()) ?? null;
253
+ }
254
+ function joinRoute(parent, child) {
255
+ if (child == null || child === "")
256
+ return parent || "/";
257
+ if (child.startsWith("/"))
258
+ return normalize(child);
259
+ const base = parent === "/" ? "" : parent;
260
+ return normalize(base + "/" + child);
261
+ }
262
+ function normalize(route) {
263
+ const r = ("/" + route).replace(/\/{2,}/g, "/");
264
+ return r.length > 1 ? r.replace(/\/+$/, "") : "/";
265
+ }
266
+ function titleFromRoute(route) {
267
+ if (route === "/" || route === "")
268
+ return "Home";
269
+ const last = route.split("/").filter(Boolean).pop() ?? route;
270
+ return last
271
+ .replace(/^:(.+)$/, "$1")
272
+ .replace(/[-_]/g, " ")
273
+ .replace(/\b\w/g, (c) => c.toUpperCase());
274
+ }
275
+ function walkTs(dir, onFile) {
276
+ let entries;
277
+ try {
278
+ entries = readdirSync(dir, { withFileTypes: true });
279
+ }
280
+ catch {
281
+ return;
282
+ }
283
+ for (const entry of entries) {
284
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
285
+ continue;
286
+ const full = join(dir, entry.name);
287
+ if (entry.isDirectory())
288
+ walkTs(full, onFile);
289
+ else if (entry.name.endsWith(".ts"))
290
+ onFile(full);
291
+ }
292
+ }
293
+ function safeRead(file) {
294
+ try {
295
+ return readFileSync(file, "utf8");
296
+ }
297
+ catch {
298
+ return "";
299
+ }
300
+ }
301
+ function snippet(text) {
302
+ const flat = text.replace(/\s+/g, " ").trim();
303
+ return flat.length > 80 ? flat.slice(0, 77) + "..." : flat;
304
+ }
305
+ //# sourceMappingURL=angular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular.js","sourceRoot":"","sources":["../../../src/core/adapters/angular.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkAdapter } from "./types.js";
2
+ export declare function hasAstroDep(projectRoot: string): boolean;
3
+ export declare const astroAdapter: FrameworkAdapter;
@@ -0,0 +1,140 @@
1
+ import { readdirSync, readFileSync, existsSync, statSync } from "node:fs";
2
+ import { join, relative, sep } from "node:path";
3
+ /**
4
+ * Astro adapter (file-based). `src/pages/**​/*.{astro,md,mdx,html}` → routes, mirroring Astro's
5
+ * filesystem router. An `.astro` file is a `---` frontmatter (JS/TS) fence followed by HTML
6
+ * markup — it can't reuse the JSX or Vue parsers, so this is a zero-dependency regex scan
7
+ * (SwiftUI/Vue-SFC style): markup gives nav/features, frontmatter gives fetch calls.
8
+ *
9
+ * - screen id = route ("/blog/[slug]"); `index` collapses to its dir; dynamic `[slug]`/`[...rest]` kept.
10
+ * - nav = <a href="/x"> (markup)
11
+ * - call = fetch("…") (frontmatter or markup script); src/pages/**.{js,ts} API routes are not screens
12
+ * - feature = <button>, <input|textarea|select>, <form>
13
+ */
14
+ const PAGE_RE = /\.(astro|md|mdx|html)$/i;
15
+ function pagesDirOf(projectRoot) {
16
+ return ([join(projectRoot, "src", "pages"), join(projectRoot, "pages")].find((d) => existsSync(d) && statSync(d).isDirectory()) ?? null);
17
+ }
18
+ export function hasAstroDep(projectRoot) {
19
+ try {
20
+ const pkg = JSON.parse(readFileSync(join(projectRoot, "package.json"), "utf8"));
21
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
22
+ return "astro" in deps;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export const astroAdapter = {
29
+ id: "astro",
30
+ router: "astro-pages",
31
+ detect(projectRoot) {
32
+ return hasAstroDep(projectRoot) && pagesDirOf(projectRoot) !== null;
33
+ },
34
+ discover(projectRoot) {
35
+ const pagesDir = pagesDirOf(projectRoot);
36
+ if (!pagesDir)
37
+ return [];
38
+ const files = [];
39
+ walk(pagesDir, (file) => {
40
+ if (!PAGE_RE.test(file))
41
+ return; // .js/.ts under pages/ are API endpoints, not screens
42
+ const route = routeFromPageFile(pagesDir, file);
43
+ files.push({
44
+ absPath: file,
45
+ relPath: relative(projectRoot, file).split(sep).join("/"),
46
+ id: route,
47
+ route,
48
+ title: titleFromRoute(route),
49
+ isEntry: route === "/",
50
+ });
51
+ });
52
+ files.sort((a, b) => a.route.localeCompare(b.route));
53
+ return files;
54
+ },
55
+ parse(file) {
56
+ return parseAstro(safeRead(file.absPath));
57
+ },
58
+ };
59
+ // ---------- discovery ----------
60
+ function walk(dir, onFile) {
61
+ let entries;
62
+ try {
63
+ entries = readdirSync(dir, { withFileTypes: true });
64
+ }
65
+ catch {
66
+ return;
67
+ }
68
+ for (const entry of entries) {
69
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
70
+ continue;
71
+ const full = join(dir, entry.name);
72
+ if (entry.isDirectory())
73
+ walk(full, onFile);
74
+ else
75
+ onFile(full);
76
+ }
77
+ }
78
+ /** Astro page file → route. `index` collapses to its dir; keeps dynamic `[slug]`/`[...rest]`. */
79
+ function routeFromPageFile(pagesDir, file) {
80
+ const segs = relative(pagesDir, file).replace(PAGE_RE, "").split(sep);
81
+ if (segs[segs.length - 1] === "index")
82
+ segs.pop();
83
+ const route = "/" + segs.join("/");
84
+ return route.length > 1 ? route.replace(/\/+$/, "") : "/";
85
+ }
86
+ function titleFromRoute(route) {
87
+ if (route === "/")
88
+ return "Home";
89
+ const last = route.split("/").filter(Boolean).pop() ?? route;
90
+ return last
91
+ .replace(/^\[(\.\.\.)?(.+?)\]$/, "$2") // [slug] / [...rest] → slug / rest
92
+ .replace(/[-_]/g, " ")
93
+ .replace(/\b\w/g, (c) => c.toUpperCase());
94
+ }
95
+ function safeRead(file) {
96
+ try {
97
+ return readFileSync(file, "utf8");
98
+ }
99
+ catch {
100
+ return "";
101
+ }
102
+ }
103
+ // ---------- parsing (regex scan) ----------
104
+ const FEATURE_RULES = [
105
+ { re: /<button\b[^>]*>([^<]*)/i, kind: "button", label: (m) => m[1].trim() || "Button" },
106
+ { re: /<(?:input|textarea|select)\b[^>]*\bplaceholder=["']([^"']*)["']/i, kind: "input", label: (m) => m[1] || "Input" },
107
+ { re: /<(?:input|textarea|select)\b/i, kind: "input", label: () => "Input" },
108
+ { re: /<form\b/i, kind: "form", label: () => "Form" },
109
+ ];
110
+ const HREF = /<a\b[^>]*?\shref=["'](\/[^"'#]*)["']/i;
111
+ const FETCH = /\bfetch\s*\(\s*["'`]([^"'`]+)["'`]/;
112
+ function parseAstro(src) {
113
+ const navs = [];
114
+ const calls = [];
115
+ const features = [];
116
+ const lines = src.split(/\r?\n/);
117
+ for (let i = 0; i < lines.length; i++) {
118
+ const line = lines[i].trim();
119
+ const lineNo = i + 1;
120
+ const href = line.match(HREF);
121
+ if (href)
122
+ navs.push({ target: href[1], raw: snippet(line), trigger: "<a href>", line: lineNo });
123
+ const fetchM = line.match(FETCH);
124
+ if (fetchM)
125
+ calls.push({ url: fetchM[1], raw: snippet(line), trigger: "fetch", line: lineNo });
126
+ for (const rule of FEATURE_RULES) {
127
+ const m = line.match(rule.re);
128
+ if (m) {
129
+ features.push({ kind: rule.kind, label: rule.label(m), detail: m[0].trim().slice(0, 40), line: lineNo });
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ return { navs, calls, features, components: [], contains: [] };
135
+ }
136
+ function snippet(text) {
137
+ const flat = text.replace(/\s+/g, " ").trim();
138
+ return flat.length > 80 ? flat.slice(0, 77) + "..." : flat;
139
+ }
140
+ //# sourceMappingURL=astro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro.js","sourceRoot":"","sources":["../../../src/core/adapters/astro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FrameworkAdapter } from "./types.js";
2
+ export declare const composeAdapter: FrameworkAdapter;