@buzola/codegen 0.0.21 → 0.0.23
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/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +33 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/codegen.test.js +24 -1
- package/dist/__tests__/codegen.test.js.map +1 -1
- package/dist/cli.js +8 -1
- package/dist/cli.js.map +1 -1
- package/dist/generator/codegen.d.ts.map +1 -1
- package/dist/generator/codegen.js +8 -5
- package/dist/generator/codegen.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/cli.test.ts +40 -0
- package/src/__tests__/codegen.test.ts +26 -1
- package/src/cli.ts +9 -1
- package/src/generator/codegen.ts +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
// `tsc -b` also compiles this test into dist/, where the CLI beside it is cli.js.
|
|
6
|
+
const CLI = path.join(import.meta.dir, '..', `cli${path.extname(import.meta.path)}`);
|
|
7
|
+
function runCli(root, args) {
|
|
8
|
+
return Bun.spawnSync(['bun', CLI, '--root', root, ...args], { stdout: 'pipe', stderr: 'pipe' });
|
|
9
|
+
}
|
|
10
|
+
describe('buzola CLI', () => {
|
|
11
|
+
let root;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'buzola-cli-test-'));
|
|
14
|
+
fs.mkdirSync(path.join(root, 'src', 'routes'), { recursive: true });
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
it('writes the same hot update code as the Vite plugin with --hot vite', () => {
|
|
20
|
+
expect(runCli(root, ['--hot', 'vite']).exitCode).toBe(0);
|
|
21
|
+
expect(fs.readFileSync(path.join(root, 'src', 'buzola.gen.ts'), 'utf-8')).toContain('import.meta.hot.accept(');
|
|
22
|
+
});
|
|
23
|
+
it('writes no hot update code by default', () => {
|
|
24
|
+
expect(runCli(root, []).exitCode).toBe(0);
|
|
25
|
+
expect(fs.readFileSync(path.join(root, 'src', 'buzola.gen.ts'), 'utf-8')).not.toContain('import.meta.hot');
|
|
26
|
+
});
|
|
27
|
+
it('refuses a bundler it does not know', () => {
|
|
28
|
+
const result = runCli(root, ['--hot', 'webpack']);
|
|
29
|
+
expect(result.exitCode).toBe(1);
|
|
30
|
+
expect(result.stderr.toString()).toContain('--hot accepts only "vite"');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,kFAAkF;AAClF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEpF,SAAS,MAAM,CAAC,IAAY,EAAE,IAAc;IAC3C,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAChG,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,IAAI,IAAY,CAAA;IAEhB,UAAU,CAAC,GAAG,EAAE;QACf,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;QACjE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAC/G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAC3G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -66,7 +66,7 @@ describe('generateRouteModule', () => {
|
|
|
66
66
|
hot: 'vite',
|
|
67
67
|
});
|
|
68
68
|
expect(output).toContain('/// <reference types="vite/client" />');
|
|
69
|
-
expect(output).toContain(`import { buildRouteTree, Router } from '@buzola/router';`);
|
|
69
|
+
expect(output).toContain(`import { buildRouteTree, lazyRoute, Router } from '@buzola/router';`);
|
|
70
70
|
expect(output).toContain('import.meta.hot.accept((next) => {');
|
|
71
71
|
expect(output).toContain('Router.replaceRoutes(routes, next.routes);');
|
|
72
72
|
});
|
|
@@ -114,6 +114,29 @@ describe('generateRouteModule', () => {
|
|
|
114
114
|
});
|
|
115
115
|
expect(output).toContain('.then(m => ({ default: m.default.component }))');
|
|
116
116
|
});
|
|
117
|
+
it("shares one lazyRoute load between a page's component and its preload", () => {
|
|
118
|
+
const output = generateRouteModule({
|
|
119
|
+
tree: [{
|
|
120
|
+
segment: 'users',
|
|
121
|
+
fullPath: '/users',
|
|
122
|
+
filePath: '/tmp/routes/users.tsx',
|
|
123
|
+
exportName: 'default',
|
|
124
|
+
isLayout: false,
|
|
125
|
+
isIndex: false,
|
|
126
|
+
isNotFound: false,
|
|
127
|
+
isPathlessGroup: false,
|
|
128
|
+
pageExports: [{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] }],
|
|
129
|
+
children: [],
|
|
130
|
+
}],
|
|
131
|
+
routesDir: '/tmp/routes',
|
|
132
|
+
outputPath: '/tmp/buzola.gen.ts',
|
|
133
|
+
});
|
|
134
|
+
expect(output).toContain("import { buildRouteTree, lazyRoute } from '@buzola/router';");
|
|
135
|
+
expect(output).toContain("const Route0 = lazyRoute(() => import('./routes/users')");
|
|
136
|
+
expect(output).toContain('component: Route0.component,');
|
|
137
|
+
expect(output).toContain('preload: Route0.preload,');
|
|
138
|
+
expect(output).not.toContain('lazy(Route0)');
|
|
139
|
+
});
|
|
117
140
|
it('generates correct lazy import for named export', () => {
|
|
118
141
|
const output = generateRouteModule({
|
|
119
142
|
tree: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ const { values } = parseArgs({
|
|
|
9
9
|
output: { type: 'string', short: 'o' },
|
|
10
10
|
'persistent-param': { type: 'string', multiple: true },
|
|
11
11
|
root: { type: 'string' },
|
|
12
|
+
hot: { type: 'string' },
|
|
12
13
|
help: { type: 'boolean', short: 'h', default: false },
|
|
13
14
|
},
|
|
14
15
|
strict: true,
|
|
@@ -21,16 +22,22 @@ Options:
|
|
|
21
22
|
-o, --output <path> Output file path (default: src/buzola.gen.ts)
|
|
22
23
|
--persistent-param <name> Persistent parameter name (repeatable)
|
|
23
24
|
--root <path> Project root directory (default: cwd)
|
|
25
|
+
--hot vite Emit Vite hot update code, as the Vite plugin does
|
|
24
26
|
-h, --help Show this help message`);
|
|
25
27
|
process.exit(0);
|
|
26
28
|
}
|
|
29
|
+
const hot = values.hot;
|
|
30
|
+
if (hot !== undefined && hot !== 'vite') {
|
|
31
|
+
console.error(`--hot accepts only "vite", got "${hot}"`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
27
34
|
const options = await resolveOptions({
|
|
28
35
|
root: values.root,
|
|
29
36
|
routesDir: values['routes-dir'],
|
|
30
37
|
output: values.output,
|
|
31
38
|
persistentParams: values['persistent-param'],
|
|
32
39
|
});
|
|
33
|
-
const changed = await generate(options);
|
|
40
|
+
const changed = await generate({ ...options, hot });
|
|
34
41
|
if (changed) {
|
|
35
42
|
console.log(`Generated ${path.relative(options.root, options.outputPath)}`);
|
|
36
43
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE;QACR,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACtC,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;KACrD;IACD,MAAM,EAAE,IAAI;CACZ,CAAC,CAAA;AAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE;QACR,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACtC,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;KACrD;IACD,MAAM,EAAE,IAAI;CACZ,CAAC,CAAA;AAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;yDAQ4C,CAAC,CAAA;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;AACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC;CAC5C,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;AAEnD,IAAI,OAAO,EAAE,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;AAC5E,CAAC;KAAM,CAAC;IACP,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC9B,yCAAyC;IACzC,IAAI,EAAE,aAAa,EAAE,CAAA;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ;AASD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC9B,yCAAyC;IACzC,IAAI,EAAE,aAAa,EAAE,CAAA;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ;AASD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAgGnE"}
|
|
@@ -21,8 +21,10 @@ export function generateRouteModule(options) {
|
|
|
21
21
|
if (options.hot === 'vite')
|
|
22
22
|
lines.push('/// <reference types="vite/client" />');
|
|
23
23
|
lines.push('');
|
|
24
|
-
lines.push(`import {
|
|
25
|
-
lines.push(options.hot === 'vite'
|
|
24
|
+
lines.push(`import type { ComponentType } from 'react';`);
|
|
25
|
+
lines.push(options.hot === 'vite'
|
|
26
|
+
? `import { buildRouteTree, lazyRoute, Router } from '@buzola/router';`
|
|
27
|
+
: `import { buildRouteTree, lazyRoute } from '@buzola/router';`);
|
|
26
28
|
lines.push(`import type { RouteConfig } from '@buzola/router';`);
|
|
27
29
|
lines.push('');
|
|
28
30
|
const imports = [];
|
|
@@ -30,7 +32,7 @@ export function generateRouteModule(options) {
|
|
|
30
32
|
collectImports(tree, outputDir, imports, importsByKey, () => importCounter++);
|
|
31
33
|
for (const imp of imports) {
|
|
32
34
|
if (imp.isLazy) {
|
|
33
|
-
lines.push(`const ${imp.varName} = () => import('${imp.filePath}').then(m => ({ default: m.${imp.exportName}.component })) as Promise<{ default: ComponentType }
|
|
35
|
+
lines.push(`const ${imp.varName} = lazyRoute(() => import('${imp.filePath}').then(m => ({ default: m.${imp.exportName}.component })) as Promise<{ default: ComponentType<Record<string, never>> }>);`);
|
|
34
36
|
}
|
|
35
37
|
else {
|
|
36
38
|
if (imp.exportName !== 'default') {
|
|
@@ -150,8 +152,9 @@ function generateTreeConfig(nodes, lines, importsByKey, indent) {
|
|
|
150
152
|
}
|
|
151
153
|
if (imp) {
|
|
152
154
|
if (imp.isLazy) {
|
|
153
|
-
|
|
154
|
-
lines.push(`${pad}
|
|
155
|
+
// One shared load, so a preloaded page renders without suspending (see `lazyRoute`).
|
|
156
|
+
lines.push(`${pad} component: ${imp.varName}.component,`);
|
|
157
|
+
lines.push(`${pad} preload: ${imp.varName}.preload,`);
|
|
155
158
|
}
|
|
156
159
|
else {
|
|
157
160
|
lines.push(`${pad} component: ${imp.varName},`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAmBjC;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACtC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAA;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAuB;IAC1D,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1C,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;IAC7E,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAClC,IAAI,OAAO,CAAC,GAAG,KAAK,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buzola/codegen",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"directory": "packages/codegen"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@buzola/router": "^0.0.
|
|
27
|
+
"@buzola/router": "^0.0.23"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "^25.3.3",
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
|
+
import * as fs from 'node:fs'
|
|
3
|
+
import * as os from 'node:os'
|
|
4
|
+
import * as path from 'node:path'
|
|
5
|
+
|
|
6
|
+
// `tsc -b` also compiles this test into dist/, where the CLI beside it is cli.js.
|
|
7
|
+
const CLI = path.join(import.meta.dir, '..', `cli${path.extname(import.meta.path)}`)
|
|
8
|
+
|
|
9
|
+
function runCli(root: string, args: string[]) {
|
|
10
|
+
return Bun.spawnSync(['bun', CLI, '--root', root, ...args], { stdout: 'pipe', stderr: 'pipe' })
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('buzola CLI', () => {
|
|
14
|
+
let root: string
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'buzola-cli-test-'))
|
|
18
|
+
fs.mkdirSync(path.join(root, 'src', 'routes'), { recursive: true })
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
fs.rmSync(root, { recursive: true, force: true })
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('writes the same hot update code as the Vite plugin with --hot vite', () => {
|
|
26
|
+
expect(runCli(root, ['--hot', 'vite']).exitCode).toBe(0)
|
|
27
|
+
expect(fs.readFileSync(path.join(root, 'src', 'buzola.gen.ts'), 'utf-8')).toContain('import.meta.hot.accept(')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('writes no hot update code by default', () => {
|
|
31
|
+
expect(runCli(root, []).exitCode).toBe(0)
|
|
32
|
+
expect(fs.readFileSync(path.join(root, 'src', 'buzola.gen.ts'), 'utf-8')).not.toContain('import.meta.hot')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('refuses a bundler it does not know', () => {
|
|
36
|
+
const result = runCli(root, ['--hot', 'webpack'])
|
|
37
|
+
expect(result.exitCode).toBe(1)
|
|
38
|
+
expect(result.stderr.toString()).toContain('--hot accepts only "vite"')
|
|
39
|
+
})
|
|
40
|
+
})
|
|
@@ -76,7 +76,7 @@ describe('generateRouteModule', () => {
|
|
|
76
76
|
})
|
|
77
77
|
|
|
78
78
|
expect(output).toContain('/// <reference types="vite/client" />')
|
|
79
|
-
expect(output).toContain(`import { buildRouteTree, Router } from '@buzola/router';`)
|
|
79
|
+
expect(output).toContain(`import { buildRouteTree, lazyRoute, Router } from '@buzola/router';`)
|
|
80
80
|
expect(output).toContain('import.meta.hot.accept((next) => {')
|
|
81
81
|
expect(output).toContain('Router.replaceRoutes(routes, next.routes);')
|
|
82
82
|
})
|
|
@@ -133,6 +133,31 @@ describe('generateRouteModule', () => {
|
|
|
133
133
|
expect(output).toContain('.then(m => ({ default: m.default.component }))')
|
|
134
134
|
})
|
|
135
135
|
|
|
136
|
+
it("shares one lazyRoute load between a page's component and its preload", () => {
|
|
137
|
+
const output = generateRouteModule({
|
|
138
|
+
tree: [{
|
|
139
|
+
segment: 'users',
|
|
140
|
+
fullPath: '/users',
|
|
141
|
+
filePath: '/tmp/routes/users.tsx',
|
|
142
|
+
exportName: 'default',
|
|
143
|
+
isLayout: false,
|
|
144
|
+
isIndex: false,
|
|
145
|
+
isNotFound: false,
|
|
146
|
+
isPathlessGroup: false,
|
|
147
|
+
pageExports: [{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] }],
|
|
148
|
+
children: [],
|
|
149
|
+
}],
|
|
150
|
+
routesDir: '/tmp/routes',
|
|
151
|
+
outputPath: '/tmp/buzola.gen.ts',
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
expect(output).toContain("import { buildRouteTree, lazyRoute } from '@buzola/router';")
|
|
155
|
+
expect(output).toContain("const Route0 = lazyRoute(() => import('./routes/users')")
|
|
156
|
+
expect(output).toContain('component: Route0.component,')
|
|
157
|
+
expect(output).toContain('preload: Route0.preload,')
|
|
158
|
+
expect(output).not.toContain('lazy(Route0)')
|
|
159
|
+
})
|
|
160
|
+
|
|
136
161
|
it('generates correct lazy import for named export', () => {
|
|
137
162
|
const output = generateRouteModule({
|
|
138
163
|
tree: [{
|
package/src/cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ const { values } = parseArgs({
|
|
|
10
10
|
output: { type: 'string', short: 'o' },
|
|
11
11
|
'persistent-param': { type: 'string', multiple: true },
|
|
12
12
|
root: { type: 'string' },
|
|
13
|
+
hot: { type: 'string' },
|
|
13
14
|
help: { type: 'boolean', short: 'h', default: false },
|
|
14
15
|
},
|
|
15
16
|
strict: true,
|
|
@@ -23,10 +24,17 @@ Options:
|
|
|
23
24
|
-o, --output <path> Output file path (default: src/buzola.gen.ts)
|
|
24
25
|
--persistent-param <name> Persistent parameter name (repeatable)
|
|
25
26
|
--root <path> Project root directory (default: cwd)
|
|
27
|
+
--hot vite Emit Vite hot update code, as the Vite plugin does
|
|
26
28
|
-h, --help Show this help message`)
|
|
27
29
|
process.exit(0)
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
const hot = values.hot
|
|
33
|
+
if (hot !== undefined && hot !== 'vite') {
|
|
34
|
+
console.error(`--hot accepts only "vite", got "${hot}"`)
|
|
35
|
+
process.exit(1)
|
|
36
|
+
}
|
|
37
|
+
|
|
30
38
|
const options = await resolveOptions({
|
|
31
39
|
root: values.root,
|
|
32
40
|
routesDir: values['routes-dir'],
|
|
@@ -34,7 +42,7 @@ const options = await resolveOptions({
|
|
|
34
42
|
persistentParams: values['persistent-param'],
|
|
35
43
|
})
|
|
36
44
|
|
|
37
|
-
const changed = await generate(options)
|
|
45
|
+
const changed = await generate({ ...options, hot })
|
|
38
46
|
|
|
39
47
|
if (changed) {
|
|
40
48
|
console.log(`Generated ${path.relative(options.root, options.outputPath)}`)
|
package/src/generator/codegen.ts
CHANGED
|
@@ -42,8 +42,12 @@ export function generateRouteModule(options: CodegenOptions): string {
|
|
|
42
42
|
if (options.hot === 'vite') lines.push('/// <reference types="vite/client" />')
|
|
43
43
|
lines.push('')
|
|
44
44
|
|
|
45
|
-
lines.push(`import {
|
|
46
|
-
lines.push(
|
|
45
|
+
lines.push(`import type { ComponentType } from 'react';`)
|
|
46
|
+
lines.push(
|
|
47
|
+
options.hot === 'vite'
|
|
48
|
+
? `import { buildRouteTree, lazyRoute, Router } from '@buzola/router';`
|
|
49
|
+
: `import { buildRouteTree, lazyRoute } from '@buzola/router';`,
|
|
50
|
+
)
|
|
47
51
|
lines.push(`import type { RouteConfig } from '@buzola/router';`)
|
|
48
52
|
lines.push('')
|
|
49
53
|
|
|
@@ -54,7 +58,7 @@ export function generateRouteModule(options: CodegenOptions): string {
|
|
|
54
58
|
for (const imp of imports) {
|
|
55
59
|
if (imp.isLazy) {
|
|
56
60
|
lines.push(
|
|
57
|
-
`const ${imp.varName} = () => import('${imp.filePath}').then(m => ({ default: m.${imp.exportName}.component })) as Promise<{ default: ComponentType }
|
|
61
|
+
`const ${imp.varName} = lazyRoute(() => import('${imp.filePath}').then(m => ({ default: m.${imp.exportName}.component })) as Promise<{ default: ComponentType<Record<string, never>> }>);`,
|
|
58
62
|
)
|
|
59
63
|
} else {
|
|
60
64
|
if (imp.exportName !== 'default') {
|
|
@@ -208,8 +212,9 @@ function generateTreeConfig(
|
|
|
208
212
|
|
|
209
213
|
if (imp) {
|
|
210
214
|
if (imp.isLazy) {
|
|
211
|
-
|
|
212
|
-
lines.push(`${pad}
|
|
215
|
+
// One shared load, so a preloaded page renders without suspending (see `lazyRoute`).
|
|
216
|
+
lines.push(`${pad} component: ${imp.varName}.component,`)
|
|
217
|
+
lines.push(`${pad} preload: ${imp.varName}.preload,`)
|
|
213
218
|
} else {
|
|
214
219
|
lines.push(`${pad} component: ${imp.varName},`)
|
|
215
220
|
}
|