@agentuity/cli 1.0.47 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cmd/build/app-router-detector.d.ts +2 -5
- package/dist/cmd/build/app-router-detector.d.ts.map +1 -1
- package/dist/cmd/build/app-router-detector.js +130 -154
- package/dist/cmd/build/app-router-detector.js.map +1 -1
- package/dist/cmd/build/ids.d.ts +11 -0
- package/dist/cmd/build/ids.d.ts.map +1 -0
- package/dist/cmd/build/ids.js +18 -0
- package/dist/cmd/build/ids.js.map +1 -0
- package/dist/cmd/build/vite/agent-discovery.d.ts +8 -4
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.js +166 -487
- package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +10 -16
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.js +67 -134
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
- package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/docs-generator.js +0 -2
- package/dist/cmd/build/vite/docs-generator.js.map +1 -1
- package/dist/cmd/build/vite/index.d.ts.map +1 -1
- package/dist/cmd/build/vite/index.js +0 -36
- package/dist/cmd/build/vite/index.js.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +10 -2
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.js +302 -23
- package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +11 -38
- package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/route-discovery.js +97 -177
- package/dist/cmd/build/vite/route-discovery.js.map +1 -1
- package/dist/cmd/build/vite/server-bundler.js +1 -1
- package/dist/cmd/build/vite/server-bundler.js.map +1 -1
- package/dist/cmd/build/vite/static-renderer.d.ts.map +1 -1
- package/dist/cmd/build/vite/static-renderer.js +1 -9
- package/dist/cmd/build/vite/static-renderer.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts +6 -3
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +171 -18
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.d.ts +8 -3
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server.js +14 -13
- package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +6 -34
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/build/vite/ws-proxy.d.ts +53 -0
- package/dist/cmd/build/vite/ws-proxy.d.ts.map +1 -0
- package/dist/cmd/build/vite/ws-proxy.js +95 -0
- package/dist/cmd/build/vite/ws-proxy.js.map +1 -0
- package/dist/cmd/build/vite-bundler.d.ts.map +1 -1
- package/dist/cmd/build/vite-bundler.js +0 -3
- package/dist/cmd/build/vite-bundler.js.map +1 -1
- package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
- package/dist/cmd/dev/file-watcher.js +2 -8
- package/dist/cmd/dev/file-watcher.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +369 -720
- package/dist/cmd/dev/index.js.map +1 -1
- package/package.json +6 -8
- package/src/cmd/ai/prompt/agent.md +0 -1
- package/src/cmd/ai/prompt/api.md +0 -7
- package/src/cmd/ai/prompt/web.md +51 -213
- package/src/cmd/build/app-router-detector.ts +152 -182
- package/src/cmd/build/ids.ts +19 -0
- package/src/cmd/build/vite/agent-discovery.ts +208 -679
- package/src/cmd/build/vite/bun-dev-server.ts +78 -154
- package/src/cmd/build/vite/docs-generator.ts +0 -2
- package/src/cmd/build/vite/index.ts +1 -42
- package/src/cmd/build/vite/lifecycle-generator.ts +345 -21
- package/src/cmd/build/vite/route-discovery.ts +116 -274
- package/src/cmd/build/vite/server-bundler.ts +1 -1
- package/src/cmd/build/vite/static-renderer.ts +1 -11
- package/src/cmd/build/vite/vite-asset-server-config.ts +196 -20
- package/src/cmd/build/vite/vite-asset-server.ts +25 -15
- package/src/cmd/build/vite/vite-builder.ts +6 -51
- package/src/cmd/build/vite/ws-proxy.ts +126 -0
- package/src/cmd/build/vite-bundler.ts +0 -4
- package/src/cmd/dev/file-watcher.ts +2 -9
- package/src/cmd/dev/index.ts +409 -832
- package/dist/cmd/build/ast.d.ts +0 -78
- package/dist/cmd/build/ast.d.ts.map +0 -1
- package/dist/cmd/build/ast.js +0 -2703
- package/dist/cmd/build/ast.js.map +0 -1
- package/dist/cmd/build/entry-generator.d.ts +0 -25
- package/dist/cmd/build/entry-generator.d.ts.map +0 -1
- package/dist/cmd/build/entry-generator.js +0 -695
- package/dist/cmd/build/entry-generator.js.map +0 -1
- package/dist/cmd/build/vite/api-mount-path.d.ts +0 -61
- package/dist/cmd/build/vite/api-mount-path.d.ts.map +0 -1
- package/dist/cmd/build/vite/api-mount-path.js +0 -83
- package/dist/cmd/build/vite/api-mount-path.js.map +0 -1
- package/dist/cmd/build/vite/registry-generator.d.ts +0 -19
- package/dist/cmd/build/vite/registry-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/registry-generator.js +0 -1108
- package/dist/cmd/build/vite/registry-generator.js.map +0 -1
- package/dist/cmd/build/webanalytics-generator.d.ts +0 -16
- package/dist/cmd/build/webanalytics-generator.d.ts.map +0 -1
- package/dist/cmd/build/webanalytics-generator.js +0 -178
- package/dist/cmd/build/webanalytics-generator.js.map +0 -1
- package/dist/cmd/build/workbench.d.ts +0 -7
- package/dist/cmd/build/workbench.d.ts.map +0 -1
- package/dist/cmd/build/workbench.js +0 -55
- package/dist/cmd/build/workbench.js.map +0 -1
- package/dist/utils/route-migration.d.ts +0 -62
- package/dist/utils/route-migration.d.ts.map +0 -1
- package/dist/utils/route-migration.js +0 -630
- package/dist/utils/route-migration.js.map +0 -1
- package/src/cmd/build/ast.ts +0 -3529
- package/src/cmd/build/entry-generator.ts +0 -760
- package/src/cmd/build/vite/api-mount-path.ts +0 -87
- package/src/cmd/build/vite/registry-generator.ts +0 -1267
- package/src/cmd/build/webanalytics-generator.ts +0 -197
- package/src/cmd/build/workbench.ts +0 -58
- package/src/utils/route-migration.ts +0 -757
|
@@ -1,630 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Route Migration Utility
|
|
3
|
-
*
|
|
4
|
-
* Detects projects using file-based routing (multiple route files in src/api/)
|
|
5
|
-
* and offers to migrate them to explicit routing — a single src/api/index.ts
|
|
6
|
-
* root router that imports and mounts all sub-routers explicitly.
|
|
7
|
-
*
|
|
8
|
-
* Also updates src/app.ts to import the router and pass it to
|
|
9
|
-
* createApp({ router }), completing the migration to explicit routing.
|
|
10
|
-
*
|
|
11
|
-
* Explicit routing will become the default in the next major release.
|
|
12
|
-
*
|
|
13
|
-
* Runs during `dev` and `build` after dependency upgrades.
|
|
14
|
-
*/
|
|
15
|
-
import { join, basename, dirname, relative } from 'node:path';
|
|
16
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
17
|
-
import * as tui from '../tui';
|
|
18
|
-
// Sentinel file that tracks whether the user has been notified or has opted out
|
|
19
|
-
const MIGRATION_SENTINEL = '.agentuity/.route-migration-state';
|
|
20
|
-
function getMigrationStatePath(rootDir) {
|
|
21
|
-
return join(rootDir, MIGRATION_SENTINEL);
|
|
22
|
-
}
|
|
23
|
-
function readMigrationState(rootDir) {
|
|
24
|
-
const statePath = getMigrationStatePath(rootDir);
|
|
25
|
-
if (!existsSync(statePath))
|
|
26
|
-
return null;
|
|
27
|
-
try {
|
|
28
|
-
return JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
function writeMigrationState(rootDir, state) {
|
|
35
|
-
const statePath = getMigrationStatePath(rootDir);
|
|
36
|
-
const dir = dirname(statePath);
|
|
37
|
-
if (!existsSync(dir))
|
|
38
|
-
mkdirSync(dir, { recursive: true });
|
|
39
|
-
writeFileSync(statePath, JSON.stringify({
|
|
40
|
-
state,
|
|
41
|
-
timestamp: Date.now(),
|
|
42
|
-
}) + '\n');
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Detect if a project uses file-based routing (has route files in src/api/).
|
|
46
|
-
* Returns the list of discovered route files, or empty array if none found.
|
|
47
|
-
*/
|
|
48
|
-
/**
|
|
49
|
-
* Check if a file exports a router as its default export.
|
|
50
|
-
* Matches patterns like:
|
|
51
|
-
* export default router;
|
|
52
|
-
* export default createRouter();
|
|
53
|
-
* export default new Hono();
|
|
54
|
-
* But NOT files that merely import/reference createRouter or Hono without exporting a router.
|
|
55
|
-
*/
|
|
56
|
-
function isRouterFile(content) {
|
|
57
|
-
// Strip single-line and multi-line comments to avoid false positives
|
|
58
|
-
const stripped = content.replace(/\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '');
|
|
59
|
-
// Must have a default export
|
|
60
|
-
if (!stripped.includes('export default'))
|
|
61
|
-
return false;
|
|
62
|
-
// Must actually create a router (not just import the function)
|
|
63
|
-
return /createRouter\s*\(/.test(stripped) || /new\s+Hono\s*[<(]/.test(stripped);
|
|
64
|
-
}
|
|
65
|
-
export function detectFileBasedRoutes(rootDir) {
|
|
66
|
-
const apiDir = join(rootDir, 'src', 'api');
|
|
67
|
-
if (!existsSync(apiDir))
|
|
68
|
-
return [];
|
|
69
|
-
const routeFiles = [];
|
|
70
|
-
const glob = new Bun.Glob('**/*.ts');
|
|
71
|
-
for (const file of glob.scanSync(apiDir)) {
|
|
72
|
-
const filePath = join(apiDir, file);
|
|
73
|
-
try {
|
|
74
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
75
|
-
if (isRouterFile(content)) {
|
|
76
|
-
routeFiles.push(file);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Skip unreadable files
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return routeFiles;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Check if src/api/index.ts already exists and is a root router that mounts sub-routers.
|
|
87
|
-
* This means the project has already migrated to explicit routing.
|
|
88
|
-
*/
|
|
89
|
-
function hasExplicitRootRouter(rootDir) {
|
|
90
|
-
const indexPath = join(rootDir, 'src', 'api', 'index.ts');
|
|
91
|
-
if (!existsSync(indexPath))
|
|
92
|
-
return false;
|
|
93
|
-
try {
|
|
94
|
-
const content = readFileSync(indexPath, 'utf-8');
|
|
95
|
-
const stripped = content.replace(/\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '');
|
|
96
|
-
// An explicit root router both creates a router AND mounts sub-routers via .route()
|
|
97
|
-
return ((/createRouter\s*\(/.test(stripped) || /new\s+Hono\s*[<(]/.test(stripped)) &&
|
|
98
|
-
stripped.includes('.route(') &&
|
|
99
|
-
content.includes('export default'));
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Check if the user's app.ts already passes a router to createApp().
|
|
107
|
-
* If so, they've already adopted explicit routing and no migration is needed.
|
|
108
|
-
*/
|
|
109
|
-
function hasExplicitRouterInCreateApp(rootDir) {
|
|
110
|
-
const rootAppPath = join(rootDir, 'app.ts');
|
|
111
|
-
const srcAppPath = join(rootDir, 'src', 'app.ts');
|
|
112
|
-
const appPath = existsSync(rootAppPath)
|
|
113
|
-
? rootAppPath
|
|
114
|
-
: existsSync(srcAppPath)
|
|
115
|
-
? srcAppPath
|
|
116
|
-
: null;
|
|
117
|
-
if (!appPath)
|
|
118
|
-
return false;
|
|
119
|
-
try {
|
|
120
|
-
const content = readFileSync(appPath, 'utf-8');
|
|
121
|
-
return /createApp\s*\(\s*\{[^}]*\brouter\b/.test(content);
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Check if a project is eligible for migration to explicit routing.
|
|
129
|
-
* Returns info about the project's routing state without performing any action.
|
|
130
|
-
*
|
|
131
|
-
* A project is eligible when:
|
|
132
|
-
* - createApp() does NOT already have a `router` property
|
|
133
|
-
* - It has multiple route files in src/api/
|
|
134
|
-
* - It does NOT already have an explicit src/api/index.ts root router
|
|
135
|
-
*/
|
|
136
|
-
export function checkMigrationEligibility(rootDir) {
|
|
137
|
-
// If createApp({ router }) is already present, they've adopted explicit routing
|
|
138
|
-
if (hasExplicitRouterInCreateApp(rootDir)) {
|
|
139
|
-
return { available: false, routeFiles: [], alreadyNotified: false };
|
|
140
|
-
}
|
|
141
|
-
const routeFiles = detectFileBasedRoutes(rootDir);
|
|
142
|
-
// Need at least 2 route files for migration to be useful
|
|
143
|
-
// (a single file already acts as an explicit root router)
|
|
144
|
-
if (routeFiles.length < 2) {
|
|
145
|
-
return { available: false, routeFiles: [], alreadyNotified: false };
|
|
146
|
-
}
|
|
147
|
-
// If there's already an explicit root router, check if all route files
|
|
148
|
-
// are already imported. If so, nothing to do.
|
|
149
|
-
if (hasExplicitRootRouter(rootDir)) {
|
|
150
|
-
const indexPath = join(rootDir, 'src', 'api', 'index.ts');
|
|
151
|
-
const indexContent = readFileSync(indexPath, 'utf-8');
|
|
152
|
-
const filesToMount = routeFiles.filter((f) => f !== 'index.ts');
|
|
153
|
-
const allImported = filesToMount.every((f) => {
|
|
154
|
-
const importPath = `./${f.replace(/\.tsx?$/, '')}`;
|
|
155
|
-
return indexContent.includes(importPath);
|
|
156
|
-
});
|
|
157
|
-
if (allImported) {
|
|
158
|
-
return { available: false, routeFiles: [], alreadyNotified: false };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
const state = readMigrationState(rootDir);
|
|
162
|
-
// Already migrated — don't prompt again
|
|
163
|
-
if (state?.state === 'migrated') {
|
|
164
|
-
return { available: false, routeFiles: [], alreadyNotified: true };
|
|
165
|
-
}
|
|
166
|
-
const alreadyNotified = state?.state === 'notified' || state?.state === 'dismissed';
|
|
167
|
-
return { available: true, routeFiles, alreadyNotified };
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Convert a string segment into a valid camelCase identifier part.
|
|
171
|
-
* Splits on non-alphanumeric characters (hyphens, dots, underscores, spaces, etc.)
|
|
172
|
-
* and capitalizes each sub-word.
|
|
173
|
-
*
|
|
174
|
-
* e.g. "user-profile" → "userProfile"
|
|
175
|
-
* "my_api" → "myApi"
|
|
176
|
-
* "foo.bar" → "fooBar"
|
|
177
|
-
* "123start" → "_123start" (leading digit gets underscore prefix)
|
|
178
|
-
*/
|
|
179
|
-
function sanitizeSegment(segment, capitalize) {
|
|
180
|
-
// Split on non-alphanumeric characters
|
|
181
|
-
const parts = segment.split(/[^a-zA-Z0-9]+/).filter(Boolean);
|
|
182
|
-
if (parts.length === 0)
|
|
183
|
-
return '_';
|
|
184
|
-
const result = parts
|
|
185
|
-
.map((part, i) => {
|
|
186
|
-
if (i === 0 && !capitalize)
|
|
187
|
-
return part.toLowerCase();
|
|
188
|
-
return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
|
|
189
|
-
})
|
|
190
|
-
.join('');
|
|
191
|
-
// Prefix with underscore if starts with a digit
|
|
192
|
-
if (/^\d/.test(result))
|
|
193
|
-
return `_${result}`;
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Derive a descriptive camelCase import name from a route file path.
|
|
198
|
-
* Handles special characters (hyphens, dots, underscores) in file/directory names
|
|
199
|
-
* by converting them to camelCase boundaries.
|
|
200
|
-
*
|
|
201
|
-
* e.g. "auth/route.ts" → "authRouter"
|
|
202
|
-
* "users.ts" → "usersRouter"
|
|
203
|
-
* "users/profile.ts" → "usersProfileRouter"
|
|
204
|
-
* "health.ts" → "healthRouter"
|
|
205
|
-
* "user-profile.ts" → "userProfileRouter"
|
|
206
|
-
* "my-api/v2-routes.ts" → "myApiV2RoutesRouter"
|
|
207
|
-
* "foo_bar/route.ts" → "fooBarRouter"
|
|
208
|
-
*/
|
|
209
|
-
function deriveImportName(file) {
|
|
210
|
-
const withoutExt = file.replace(/\.tsx?$/, '');
|
|
211
|
-
const dir = dirname(withoutExt);
|
|
212
|
-
const base = basename(withoutExt);
|
|
213
|
-
let segments;
|
|
214
|
-
if (dir === '.') {
|
|
215
|
-
// Top-level file: users.ts → ["users"]
|
|
216
|
-
segments = base === 'index' || base === 'route' ? ['root'] : [base];
|
|
217
|
-
}
|
|
218
|
-
else if (base === 'index' || base === 'route') {
|
|
219
|
-
// Convention file in subdirectory: auth/route.ts → ["auth"]
|
|
220
|
-
segments = dir.split('/');
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
// Named file in subdirectory: users/profile.ts → ["users", "profile"]
|
|
224
|
-
segments = [...dir.split('/'), base];
|
|
225
|
-
}
|
|
226
|
-
// Convert to camelCase + "Router" suffix, sanitizing each segment
|
|
227
|
-
const camel = segments.map((s, i) => sanitizeSegment(s, i > 0)).join('');
|
|
228
|
-
return `${camel}Router`;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Compute the mount path and import path for a route file.
|
|
232
|
-
*/
|
|
233
|
-
function computeRouteMountInfo(file) {
|
|
234
|
-
const withoutExt = file.replace(/\.tsx?$/, '');
|
|
235
|
-
const importPath = `./${withoutExt}`;
|
|
236
|
-
const importName = deriveImportName(file);
|
|
237
|
-
const dir = dirname(file);
|
|
238
|
-
const base = basename(withoutExt);
|
|
239
|
-
let mountPath;
|
|
240
|
-
if (dir === '.') {
|
|
241
|
-
if (base === 'index' || base === 'route') {
|
|
242
|
-
mountPath = '/';
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
mountPath = `/${base}`;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
else if (base === 'index' || base === 'route') {
|
|
249
|
-
mountPath = `/${dir}`;
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
mountPath = `/${dir}/${base}`;
|
|
253
|
-
}
|
|
254
|
-
return { importPath, importName, mountPath };
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Deduplicate import names by appending a numeric suffix when collisions occur.
|
|
258
|
-
*/
|
|
259
|
-
function deduplicateImportNames(infos) {
|
|
260
|
-
const seen = new Map();
|
|
261
|
-
return infos.map((info) => {
|
|
262
|
-
const count = seen.get(info.importName) ?? 0;
|
|
263
|
-
seen.set(info.importName, count + 1);
|
|
264
|
-
if (count > 0) {
|
|
265
|
-
return { ...info, importName: `${info.importName}${count}` };
|
|
266
|
-
}
|
|
267
|
-
return info;
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Generate a fresh src/api/index.ts that imports and mounts all route files.
|
|
272
|
-
*/
|
|
273
|
-
function generateRootRouter(routeFiles) {
|
|
274
|
-
const sorted = [...routeFiles].sort();
|
|
275
|
-
const infos = deduplicateImportNames(sorted.map(computeRouteMountInfo));
|
|
276
|
-
const imports = infos.map((i) => `import ${i.importName} from '${i.importPath}';`);
|
|
277
|
-
const mounts = infos.map((i) => `router.route('${i.mountPath}', ${i.importName});`);
|
|
278
|
-
return `import { createRouter } from '@agentuity/runtime';
|
|
279
|
-
${imports.join('\n')}
|
|
280
|
-
|
|
281
|
-
const router = createRouter();
|
|
282
|
-
|
|
283
|
-
${mounts.join('\n')}
|
|
284
|
-
|
|
285
|
-
export default router;
|
|
286
|
-
`;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Detect the router variable name used in an existing file.
|
|
290
|
-
* Looks for patterns like:
|
|
291
|
-
* - `const router = createRouter()` / `const api = createRouter()`
|
|
292
|
-
* - `const router = new Hono()` / `const app = new Hono()`
|
|
293
|
-
* - Falls back to checking what identifier is default-exported
|
|
294
|
-
*
|
|
295
|
-
* Returns the variable name (e.g., 'router', 'api', 'app') or 'router' as fallback.
|
|
296
|
-
*/
|
|
297
|
-
function detectRouterVariableName(content) {
|
|
298
|
-
// Look for variable assigned from createRouter() or new Hono()
|
|
299
|
-
const routerAssignMatch = content.match(/(?:const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*(?:createRouter\s*\(|new\s+Hono\s*[<(])/);
|
|
300
|
-
if (routerAssignMatch?.[1]) {
|
|
301
|
-
return routerAssignMatch[1];
|
|
302
|
-
}
|
|
303
|
-
// Look for existing .route() calls to infer the variable name
|
|
304
|
-
const routeCallMatch = content.match(/([a-zA-Z_$][a-zA-Z0-9_$]*)\.route\s*\(/);
|
|
305
|
-
if (routeCallMatch?.[1]) {
|
|
306
|
-
return routeCallMatch[1];
|
|
307
|
-
}
|
|
308
|
-
// Fall back to the default export identifier
|
|
309
|
-
const exportMatch = content.match(/export\s+default\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*;?\s*$/m);
|
|
310
|
-
if (exportMatch?.[1]) {
|
|
311
|
-
return exportMatch[1];
|
|
312
|
-
}
|
|
313
|
-
return 'router';
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Modify an existing src/api/index.ts to add imports and route mounts for
|
|
317
|
-
* route files that are not already imported. Inserts imports at the top
|
|
318
|
-
* (after existing imports) and mounts just before the `export default` line.
|
|
319
|
-
*
|
|
320
|
-
* Detects the router variable name used in the file (e.g., 'router', 'api', 'app')
|
|
321
|
-
* and uses it in the generated `.route()` calls.
|
|
322
|
-
*/
|
|
323
|
-
function mergeIntoExistingIndex(existingContent, routeFiles) {
|
|
324
|
-
const sorted = [...routeFiles].sort();
|
|
325
|
-
const allInfos = deduplicateImportNames(sorted.map(computeRouteMountInfo));
|
|
326
|
-
// Filter out files already imported in the existing content
|
|
327
|
-
const newInfos = allInfos.filter((info) => !existingContent.includes(info.importPath));
|
|
328
|
-
if (newInfos.length === 0) {
|
|
329
|
-
return { content: existingContent, added: [] };
|
|
330
|
-
}
|
|
331
|
-
// Detect the router variable name used in this file
|
|
332
|
-
const routerVar = detectRouterVariableName(existingContent);
|
|
333
|
-
const newImports = newInfos.map((i) => `import ${i.importName} from '${i.importPath}';`);
|
|
334
|
-
const newMounts = newInfos.map((i) => `${routerVar}.route('${i.mountPath}', ${i.importName});`);
|
|
335
|
-
const lines = existingContent.split('\n');
|
|
336
|
-
// Find the last import line to insert new imports after it
|
|
337
|
-
let lastImportIndex = -1;
|
|
338
|
-
for (let i = 0; i < lines.length; i++) {
|
|
339
|
-
const trimmed = lines[i].trim();
|
|
340
|
-
if (trimmed.startsWith('import ') || trimmed.startsWith('import{')) {
|
|
341
|
-
lastImportIndex = i;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
// Find the export default line to insert mounts before it
|
|
345
|
-
let exportDefaultIndex = -1;
|
|
346
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
347
|
-
if (lines[i].trim().startsWith('export default')) {
|
|
348
|
-
exportDefaultIndex = i;
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
if (exportDefaultIndex === -1) {
|
|
353
|
-
// No export default found — append mounts at the end
|
|
354
|
-
exportDefaultIndex = lines.length;
|
|
355
|
-
}
|
|
356
|
-
// Insert new imports after the last existing import
|
|
357
|
-
const insertImportAt = lastImportIndex === -1 ? 0 : lastImportIndex + 1;
|
|
358
|
-
lines.splice(insertImportAt, 0, ...newImports);
|
|
359
|
-
// Adjust exportDefaultIndex since we inserted lines above it
|
|
360
|
-
const adjustedExportIndex = exportDefaultIndex + newImports.length;
|
|
361
|
-
// Insert mounts before export default, with a blank line separator
|
|
362
|
-
lines.splice(adjustedExportIndex, 0, '', ...newMounts, '');
|
|
363
|
-
return {
|
|
364
|
-
content: lines.join('\n'),
|
|
365
|
-
added: newInfos.map((i) => i.mountPath),
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Detect the default export name from a router file.
|
|
370
|
-
* Returns the identifier name if found (e.g., 'router', 'api', 'app'),
|
|
371
|
-
* or 'router' as a fallback for anonymous/expression default exports.
|
|
372
|
-
*/
|
|
373
|
-
function detectDefaultExportName(filePath) {
|
|
374
|
-
if (!existsSync(filePath))
|
|
375
|
-
return 'router';
|
|
376
|
-
try {
|
|
377
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
378
|
-
const lines = content.split('\n');
|
|
379
|
-
for (const line of lines) {
|
|
380
|
-
const trimmed = line.trim();
|
|
381
|
-
// export default router;
|
|
382
|
-
const identifierMatch = trimmed.match(/^export\s+default\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*;?\s*$/);
|
|
383
|
-
if (identifierMatch && identifierMatch[1]) {
|
|
384
|
-
return identifierMatch[1];
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
// Check for `const X = createRouter(); ... export default X;` pattern
|
|
388
|
-
// by finding the variable assigned from createRouter() or new Hono()
|
|
389
|
-
const routerVarMatch = content.match(/(?:const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*(?:createRouter\s*\(|new\s+Hono\s*[<(])/);
|
|
390
|
-
if (routerVarMatch && routerVarMatch[1]) {
|
|
391
|
-
// Verify this variable is actually the default export
|
|
392
|
-
const exportPattern = new RegExp(`export\\s+default\\s+${routerVarMatch[1]}\\s*;?`);
|
|
393
|
-
if (exportPattern.test(content)) {
|
|
394
|
-
return routerVarMatch[1];
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
catch {
|
|
399
|
-
// Fall through to default
|
|
400
|
-
}
|
|
401
|
-
return 'router';
|
|
402
|
-
}
|
|
403
|
-
/**
|
|
404
|
-
* Update src/app.ts to import the explicit router and pass it to createApp().
|
|
405
|
-
*
|
|
406
|
-
* Handles these createApp patterns:
|
|
407
|
-
* - `createApp()` → `createApp({ router })`
|
|
408
|
-
* - `createApp({})` → `createApp({ router })`
|
|
409
|
-
* - `createApp({ ... })` → `createApp({ router, ... })`
|
|
410
|
-
* - `createApp({ router: x })` → already has router, skip
|
|
411
|
-
*
|
|
412
|
-
* The import name is derived from the default export of src/api/index.ts
|
|
413
|
-
* (e.g., if it exports `api`, the import is `import api from './api/index'`
|
|
414
|
-
* and the property is `router: api`).
|
|
415
|
-
*
|
|
416
|
-
* Returns null if app.ts doesn't exist or doesn't need changes.
|
|
417
|
-
*/
|
|
418
|
-
function updateAppTs(rootDir, routerExportName) {
|
|
419
|
-
// Try root app.ts first (standard convention), then src/app.ts
|
|
420
|
-
const rootAppPath = join(rootDir, 'app.ts');
|
|
421
|
-
const srcAppPath = join(rootDir, 'src', 'app.ts');
|
|
422
|
-
const appPath = existsSync(rootAppPath)
|
|
423
|
-
? rootAppPath
|
|
424
|
-
: existsSync(srcAppPath)
|
|
425
|
-
? srcAppPath
|
|
426
|
-
: null;
|
|
427
|
-
if (!appPath)
|
|
428
|
-
return null;
|
|
429
|
-
const content = readFileSync(appPath, 'utf-8');
|
|
430
|
-
// Skip if already has a router property in createApp
|
|
431
|
-
if (/createApp\s*\(\s*\{[^}]*\brouter\b/.test(content)) {
|
|
432
|
-
return { content, changed: false, appPath };
|
|
433
|
-
}
|
|
434
|
-
// Skip if createApp is not used
|
|
435
|
-
if (!content.includes('createApp')) {
|
|
436
|
-
return { content, changed: false, appPath };
|
|
437
|
-
}
|
|
438
|
-
const lines = content.split('\n');
|
|
439
|
-
// Step 1: Add import for the router after the last import
|
|
440
|
-
// Import path depends on where app.ts lives:
|
|
441
|
-
// root app.ts → './src/api/index'
|
|
442
|
-
// src/app.ts → './api/index'
|
|
443
|
-
const isRootAppTs = appPath === rootAppPath;
|
|
444
|
-
const importName = routerExportName;
|
|
445
|
-
const importPath = isRootAppTs ? './src/api/index' : './api/index';
|
|
446
|
-
const importStatement = `import ${importName} from '${importPath}';`;
|
|
447
|
-
// Check if this import already exists
|
|
448
|
-
const alreadyImported = lines.some((line) => line.includes("from './api/index'") ||
|
|
449
|
-
line.includes("from './api'") ||
|
|
450
|
-
line.includes("from './src/api/index'") ||
|
|
451
|
-
line.includes("from './src/api'"));
|
|
452
|
-
if (!alreadyImported) {
|
|
453
|
-
let lastImportIndex = -1;
|
|
454
|
-
for (let i = 0; i < lines.length; i++) {
|
|
455
|
-
const trimmed = lines[i].trim();
|
|
456
|
-
if (trimmed.startsWith('import ') || trimmed.startsWith('import{')) {
|
|
457
|
-
lastImportIndex = i;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
const insertAt = lastImportIndex === -1 ? 0 : lastImportIndex + 1;
|
|
461
|
-
lines.splice(insertAt, 0, importStatement);
|
|
462
|
-
}
|
|
463
|
-
// Step 2: Add router property to createApp() call
|
|
464
|
-
// Determine the property value: if export name is 'router', use shorthand
|
|
465
|
-
// Otherwise use `router: exportName`
|
|
466
|
-
const routerProp = importName === 'router' ? 'router' : `router: ${importName}`;
|
|
467
|
-
let modified = false;
|
|
468
|
-
for (let i = 0; i < lines.length; i++) {
|
|
469
|
-
const line = lines[i];
|
|
470
|
-
// Match createApp() with no arguments
|
|
471
|
-
if (/createApp\s*\(\s*\)/.test(line)) {
|
|
472
|
-
lines[i] = line.replace(/createApp\s*\(\s*\)/, `createApp({ ${routerProp} })`);
|
|
473
|
-
modified = true;
|
|
474
|
-
break;
|
|
475
|
-
}
|
|
476
|
-
// Match createApp({}) with empty object
|
|
477
|
-
if (/createApp\s*\(\s*\{\s*\}\s*\)/.test(line)) {
|
|
478
|
-
lines[i] = line.replace(/createApp\s*\(\s*\{\s*\}\s*\)/, `createApp({ ${routerProp} })`);
|
|
479
|
-
modified = true;
|
|
480
|
-
break;
|
|
481
|
-
}
|
|
482
|
-
// Match createApp({ ...existing }) with existing properties
|
|
483
|
-
// Insert router as the first property after the opening brace
|
|
484
|
-
if (/createApp\s*\(\s*\{/.test(line)) {
|
|
485
|
-
lines[i] = line.replace(/createApp\s*\(\s*\{/, `createApp({ ${routerProp},`);
|
|
486
|
-
modified = true;
|
|
487
|
-
break;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
if (!modified && !alreadyImported) {
|
|
491
|
-
// createApp pattern not recognized — don't write partial changes
|
|
492
|
-
return null;
|
|
493
|
-
}
|
|
494
|
-
return { content: lines.join('\n'), changed: !alreadyImported || modified, appPath };
|
|
495
|
-
}
|
|
496
|
-
/**
|
|
497
|
-
* Perform the migration to explicit routing.
|
|
498
|
-
*
|
|
499
|
-
* 1. Generates/updates `src/api/index.ts` to import and mount all route files
|
|
500
|
-
* 2. Updates `src/app.ts` to import the router and pass it to `createApp({ router })`
|
|
501
|
-
*
|
|
502
|
-
* Existing route files are NOT modified — they already export routers.
|
|
503
|
-
*/
|
|
504
|
-
export function performMigration(rootDir, routeFiles) {
|
|
505
|
-
const filesCreated = [];
|
|
506
|
-
const filesModified = [];
|
|
507
|
-
try {
|
|
508
|
-
const apiIndexPath = join(rootDir, 'src', 'api', 'index.ts');
|
|
509
|
-
// Filter out index.ts itself from the route files to mount
|
|
510
|
-
const filesToMount = routeFiles.filter((f) => f !== 'index.ts');
|
|
511
|
-
if (filesToMount.length === 0) {
|
|
512
|
-
return {
|
|
513
|
-
success: false,
|
|
514
|
-
filesCreated: [],
|
|
515
|
-
filesModified: [],
|
|
516
|
-
message: 'No route files to migrate (only index.ts found).',
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
let indexMessage;
|
|
520
|
-
if (existsSync(apiIndexPath)) {
|
|
521
|
-
// Existing index.ts — merge new imports and mounts into it
|
|
522
|
-
const existingContent = readFileSync(apiIndexPath, 'utf-8');
|
|
523
|
-
const { content: merged, added } = mergeIntoExistingIndex(existingContent, filesToMount);
|
|
524
|
-
if (added.length === 0) {
|
|
525
|
-
// All routes already imported — still try to update app.ts
|
|
526
|
-
const routerExportName = detectDefaultExportName(apiIndexPath);
|
|
527
|
-
const appResult = updateAppTs(rootDir, routerExportName);
|
|
528
|
-
if (appResult?.changed) {
|
|
529
|
-
writeFileSync(appResult.appPath, appResult.content);
|
|
530
|
-
const relAppPath = relative(rootDir, appResult.appPath);
|
|
531
|
-
filesModified.push(relAppPath);
|
|
532
|
-
return {
|
|
533
|
-
success: true,
|
|
534
|
-
filesCreated: [],
|
|
535
|
-
filesModified,
|
|
536
|
-
message: `All route files are already imported in src/api/index.ts. Updated ${relAppPath} with explicit router.`,
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
|
-
return {
|
|
540
|
-
success: true,
|
|
541
|
-
filesCreated: [],
|
|
542
|
-
filesModified: [],
|
|
543
|
-
message: 'All route files are already imported in src/api/index.ts.',
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
writeFileSync(apiIndexPath, merged);
|
|
547
|
-
filesModified.push('src/api/index.ts');
|
|
548
|
-
indexMessage = `Added ${added.length} route mount(s) to existing src/api/index.ts.`;
|
|
549
|
-
}
|
|
550
|
-
else {
|
|
551
|
-
// No existing index.ts — generate a fresh one
|
|
552
|
-
const rootRouterContent = generateRootRouter(filesToMount);
|
|
553
|
-
const apiDir = join(rootDir, 'src', 'api');
|
|
554
|
-
if (!existsSync(apiDir))
|
|
555
|
-
mkdirSync(apiDir, { recursive: true });
|
|
556
|
-
writeFileSync(apiIndexPath, rootRouterContent);
|
|
557
|
-
filesCreated.push('src/api/index.ts');
|
|
558
|
-
indexMessage = 'Migrated to explicit routing in src/api/index.ts.';
|
|
559
|
-
}
|
|
560
|
-
// Update app.ts to import and use the explicit router
|
|
561
|
-
const routerExportName = detectDefaultExportName(apiIndexPath);
|
|
562
|
-
const appResult = updateAppTs(rootDir, routerExportName);
|
|
563
|
-
if (appResult?.changed) {
|
|
564
|
-
writeFileSync(appResult.appPath, appResult.content);
|
|
565
|
-
const relAppPath = relative(rootDir, appResult.appPath);
|
|
566
|
-
filesModified.push(relAppPath);
|
|
567
|
-
}
|
|
568
|
-
writeMigrationState(rootDir, 'migrated');
|
|
569
|
-
return {
|
|
570
|
-
success: true,
|
|
571
|
-
filesCreated,
|
|
572
|
-
filesModified,
|
|
573
|
-
message: indexMessage,
|
|
574
|
-
};
|
|
575
|
-
}
|
|
576
|
-
catch (error) {
|
|
577
|
-
return {
|
|
578
|
-
success: false,
|
|
579
|
-
filesCreated,
|
|
580
|
-
filesModified: [],
|
|
581
|
-
message: `Migration failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
/**
|
|
586
|
-
* Show the migration notice and optionally perform migration.
|
|
587
|
-
*
|
|
588
|
-
* Called during `dev` and `build` after dependency upgrades.
|
|
589
|
-
* Shows an informational banner with instructions — never blocks on
|
|
590
|
-
* interactive prompts (which would hang agents and CI pipelines).
|
|
591
|
-
*
|
|
592
|
-
* @returns true if migration was performed, false otherwise
|
|
593
|
-
*/
|
|
594
|
-
export async function promptRouteMigration(rootDir, _logger, options) {
|
|
595
|
-
const interactive = options?.interactive ?? process.stdin.isTTY;
|
|
596
|
-
// Only show the migration notice in TTY sessions
|
|
597
|
-
if (!interactive) {
|
|
598
|
-
return false;
|
|
599
|
-
}
|
|
600
|
-
const eligibility = checkMigrationEligibility(rootDir);
|
|
601
|
-
if (!eligibility.available) {
|
|
602
|
-
return false;
|
|
603
|
-
}
|
|
604
|
-
const { routeFiles, alreadyNotified } = eligibility;
|
|
605
|
-
// Only notify once — if the user has already been notified or dismissed, don't show again
|
|
606
|
-
if (alreadyNotified) {
|
|
607
|
-
return false;
|
|
608
|
-
}
|
|
609
|
-
tui.newline();
|
|
610
|
-
tui.banner('✨ Migrate to Explicit Routing', 'Agentuity is moving to explicit routing, which will become the\n' +
|
|
611
|
-
'default in the next major release. File-based route discovery\n' +
|
|
612
|
-
'will be deprecated.\n' +
|
|
613
|
-
'\n' +
|
|
614
|
-
`Your project has ${routeFiles.length} route files in src/api/ that are\n` +
|
|
615
|
-
'auto-discovered at build time. Explicit routing gives you a single\n' +
|
|
616
|
-
'src/api/index.ts that imports and mounts all sub-routers — just\n' +
|
|
617
|
-
'like a standard Hono application.\n' +
|
|
618
|
-
'\n' +
|
|
619
|
-
`${tui.muted('Before:')} ${routeFiles.length} files auto-discovered from src/api/**/*.ts\n` +
|
|
620
|
-
`${tui.muted('After:')} One src/api/index.ts that imports and mounts them\n` +
|
|
621
|
-
'\n' +
|
|
622
|
-
'Your existing route files are not modified. Your app.ts will be\n' +
|
|
623
|
-
'updated to import the router and pass it to createApp({ router }).', { centerTitle: false });
|
|
624
|
-
tui.newline();
|
|
625
|
-
tui.info(`Migrate by running: ${tui.muted('agentuity dev --migrate-routes')}`);
|
|
626
|
-
tui.newline();
|
|
627
|
-
writeMigrationState(rootDir, 'notified');
|
|
628
|
-
return false;
|
|
629
|
-
}
|
|
630
|
-
//# sourceMappingURL=route-migration.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"route-migration.js","sourceRoot":"","sources":["../../src/utils/route-migration.ts"],"names":[],"mappings":"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"}
|