@buzola/vite-plugin 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 (56) hide show
  1. package/dist/__tests__/codegen.test.d.ts +2 -0
  2. package/dist/__tests__/codegen.test.d.ts.map +1 -0
  3. package/dist/__tests__/codegen.test.js +121 -0
  4. package/dist/__tests__/codegen.test.js.map +1 -0
  5. package/dist/__tests__/conventions.test.d.ts +2 -0
  6. package/dist/__tests__/conventions.test.d.ts.map +1 -0
  7. package/dist/__tests__/conventions.test.js +80 -0
  8. package/dist/__tests__/conventions.test.js.map +1 -0
  9. package/dist/__tests__/page-extractor.test.d.ts +2 -0
  10. package/dist/__tests__/page-extractor.test.d.ts.map +1 -0
  11. package/dist/__tests__/page-extractor.test.js +82 -0
  12. package/dist/__tests__/page-extractor.test.js.map +1 -0
  13. package/dist/__tests__/tree-builder.test.d.ts +2 -0
  14. package/dist/__tests__/tree-builder.test.d.ts.map +1 -0
  15. package/dist/__tests__/tree-builder.test.js +335 -0
  16. package/dist/__tests__/tree-builder.test.js.map +1 -0
  17. package/dist/conventions.d.ts +53 -0
  18. package/dist/conventions.d.ts.map +1 -0
  19. package/dist/conventions.js +82 -0
  20. package/dist/conventions.js.map +1 -0
  21. package/dist/generator/codegen.d.ts +23 -0
  22. package/dist/generator/codegen.d.ts.map +1 -0
  23. package/dist/generator/codegen.js +164 -0
  24. package/dist/generator/codegen.js.map +1 -0
  25. package/dist/generator/page-extractor.d.ts +21 -0
  26. package/dist/generator/page-extractor.d.ts.map +1 -0
  27. package/dist/generator/page-extractor.js +23 -0
  28. package/dist/generator/page-extractor.js.map +1 -0
  29. package/dist/generator/scanner.d.ts +11 -0
  30. package/dist/generator/scanner.d.ts.map +1 -0
  31. package/dist/generator/scanner.js +34 -0
  32. package/dist/generator/scanner.js.map +1 -0
  33. package/dist/generator/tree-builder.d.ts +50 -0
  34. package/dist/generator/tree-builder.d.ts.map +1 -0
  35. package/dist/generator/tree-builder.js +273 -0
  36. package/dist/generator/tree-builder.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/plugin.d.ts +26 -0
  42. package/dist/plugin.d.ts.map +1 -0
  43. package/dist/plugin.js +101 -0
  44. package/dist/plugin.js.map +1 -0
  45. package/package.json +24 -0
  46. package/src/__tests__/codegen.test.ts +134 -0
  47. package/src/__tests__/conventions.test.ts +93 -0
  48. package/src/__tests__/page-extractor.test.ts +95 -0
  49. package/src/__tests__/tree-builder.test.ts +390 -0
  50. package/src/conventions.ts +116 -0
  51. package/src/generator/codegen.ts +214 -0
  52. package/src/generator/page-extractor.ts +48 -0
  53. package/src/generator/scanner.ts +45 -0
  54. package/src/generator/tree-builder.ts +354 -0
  55. package/src/index.ts +17 -0
  56. package/src/plugin.ts +132 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codegen.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { generateRouteModule } from '../generator/codegen';
3
+ describe('generateRouteModule', () => {
4
+ it('emits BuzolaPersistentParams when persistentParams is provided', () => {
5
+ const output = generateRouteModule({
6
+ tree: [],
7
+ routesDir: '/tmp/routes',
8
+ outputPath: '/tmp/buzola.gen.ts',
9
+ persistentParams: ['lang'],
10
+ });
11
+ expect(output).toContain('interface BuzolaPersistentParams');
12
+ expect(output).toContain('lang: true;');
13
+ });
14
+ it('does not emit BuzolaPersistentParams without persistentParams', () => {
15
+ const output = generateRouteModule({
16
+ tree: [],
17
+ routesDir: '/tmp/routes',
18
+ outputPath: '/tmp/buzola.gen.ts',
19
+ });
20
+ expect(output).not.toContain('BuzolaPersistentParams');
21
+ });
22
+ it('emits BuzolaPageMap interface', () => {
23
+ const output = generateRouteModule({
24
+ tree: [],
25
+ routesDir: '/tmp/routes',
26
+ outputPath: '/tmp/buzola.gen.ts',
27
+ });
28
+ expect(output).toContain('interface BuzolaPageMap');
29
+ });
30
+ it('emits pageRegistry export', () => {
31
+ const output = generateRouteModule({
32
+ tree: [],
33
+ routesDir: '/tmp/routes',
34
+ outputPath: '/tmp/buzola.gen.ts',
35
+ });
36
+ expect(output).toContain('export const pageRegistry');
37
+ });
38
+ it('generates correct lazy import for default export', () => {
39
+ const output = generateRouteModule({
40
+ tree: [{
41
+ segment: 'users',
42
+ fullPath: '/users',
43
+ filePath: '/tmp/routes/users.tsx',
44
+ exportName: 'default',
45
+ isLayout: false,
46
+ isIndex: false,
47
+ isNotFound: false,
48
+ isPathlessGroup: false,
49
+ pageExports: [{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] }],
50
+ children: [],
51
+ }],
52
+ routesDir: '/tmp/routes',
53
+ outputPath: '/tmp/buzola.gen.ts',
54
+ });
55
+ expect(output).toContain('.then(m => ({ default: m.default.component }))');
56
+ });
57
+ it('generates correct lazy import for named export', () => {
58
+ const output = generateRouteModule({
59
+ tree: [{
60
+ segment: 'users',
61
+ fullPath: '/users',
62
+ isLayout: false,
63
+ isIndex: false,
64
+ isNotFound: false,
65
+ isPathlessGroup: false,
66
+ children: [{
67
+ segment: 'detail',
68
+ fullPath: '/users/detail',
69
+ filePath: '/tmp/routes/users.tsx',
70
+ exportName: 'detail',
71
+ isLayout: false,
72
+ isIndex: false,
73
+ isNotFound: false,
74
+ isPathlessGroup: false,
75
+ pageExports: [{ pageId: 'users/detail', exportName: 'detail', routePattern: '/users/detail', params: [] }],
76
+ children: [],
77
+ }],
78
+ }],
79
+ routesDir: '/tmp/routes',
80
+ outputPath: '/tmp/buzola.gen.ts',
81
+ });
82
+ expect(output).toContain('.then(m => ({ default: m.detail.component }))');
83
+ expect(output).toContain("'users/detail': '/users/detail'");
84
+ });
85
+ it('generates separate imports for default and named exports from same file', () => {
86
+ const output = generateRouteModule({
87
+ tree: [{
88
+ segment: 'users',
89
+ fullPath: '/users',
90
+ filePath: '/tmp/routes/users.tsx',
91
+ exportName: 'default',
92
+ isLayout: false,
93
+ isIndex: false,
94
+ isNotFound: false,
95
+ isPathlessGroup: false,
96
+ pageExports: [{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] }],
97
+ children: [{
98
+ segment: 'detail',
99
+ fullPath: '/users/detail',
100
+ filePath: '/tmp/routes/users.tsx',
101
+ exportName: 'detail',
102
+ isLayout: false,
103
+ isIndex: false,
104
+ isNotFound: false,
105
+ isPathlessGroup: false,
106
+ pageExports: [{ pageId: 'users/detail', exportName: 'detail', routePattern: '/users/detail', params: [] }],
107
+ children: [],
108
+ }],
109
+ }],
110
+ routesDir: '/tmp/routes',
111
+ outputPath: '/tmp/buzola.gen.ts',
112
+ });
113
+ // Two separate import lines for the same file
114
+ expect(output).toContain('m.default.component');
115
+ expect(output).toContain('m.detail.component');
116
+ // Both in page registry
117
+ expect(output).toContain("'users': '/users'");
118
+ expect(output).toContain("'users/detail': '/users/detail'");
119
+ });
120
+ });
121
+ //# sourceMappingURL=codegen.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../src/__tests__/codegen.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conventions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conventions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { isRouteFile, parseDirName, parseFileName, parseRouteFile } from '../conventions';
3
+ describe('isRouteFile', () => {
4
+ it('accepts .tsx files', () => {
5
+ expect(isRouteFile('index.tsx')).toBe(true);
6
+ });
7
+ it('accepts .jsx files', () => {
8
+ expect(isRouteFile('_layout.jsx')).toBe(true);
9
+ });
10
+ it('rejects .css files', () => {
11
+ expect(isRouteFile('style.css')).toBe(false);
12
+ });
13
+ });
14
+ describe('parseFileName', () => {
15
+ it('parses layout files', () => {
16
+ const result = parseFileName('_layout');
17
+ expect(result.isLayout).toBe(true);
18
+ expect(result.segment).toBe('');
19
+ });
20
+ it('parses not-found files', () => {
21
+ const result = parseFileName('_404');
22
+ expect(result.isNotFound).toBe(true);
23
+ expect(result.segment).toBe('');
24
+ });
25
+ it('parses index files', () => {
26
+ const result = parseFileName('index');
27
+ expect(result.isIndex).toBe(true);
28
+ expect(result.segment).toBe('');
29
+ });
30
+ it('parses regular page files', () => {
31
+ const result = parseFileName('about');
32
+ expect(result.segment).toBe('about');
33
+ expect(result.isLayout).toBe(false);
34
+ expect(result.isIndex).toBe(false);
35
+ expect(result.isNotFound).toBe(false);
36
+ });
37
+ it('treats bracket names as plain file names', () => {
38
+ const result = parseFileName('[userId]');
39
+ expect(result.segment).toBe('[userId]');
40
+ expect(result.isLayout).toBe(false);
41
+ expect(result.isIndex).toBe(false);
42
+ expect(result.isNotFound).toBe(false);
43
+ });
44
+ });
45
+ describe('parseDirName', () => {
46
+ it('parses pathless groups', () => {
47
+ const result = parseDirName('(auth)');
48
+ expect(result.isPathlessGroup).toBe(true);
49
+ expect(result.segment).toBe('');
50
+ });
51
+ it('parses regular directories', () => {
52
+ const result = parseDirName('users');
53
+ expect(result.segment).toBe('users');
54
+ expect(result.isPathlessGroup).toBe(false);
55
+ });
56
+ it('treats bracket names as plain directory names', () => {
57
+ const result = parseDirName('[userId]');
58
+ expect(result.segment).toBe('[userId]');
59
+ expect(result.isPathlessGroup).toBe(false);
60
+ });
61
+ });
62
+ describe('parseRouteFile', () => {
63
+ it('parses root index', () => {
64
+ const result = parseRouteFile('index.tsx');
65
+ expect(result.isIndex).toBe(true);
66
+ expect(result.segment).toBe('');
67
+ });
68
+ it('parses nested layout', () => {
69
+ const result = parseRouteFile('users/_layout.tsx');
70
+ expect(result.isLayout).toBe(true);
71
+ expect(result.segment).toBe('users');
72
+ });
73
+ it('parses regular nested file', () => {
74
+ const result = parseRouteFile('users/detail.tsx');
75
+ expect(result.segment).toBe('users/detail');
76
+ expect(result.isLayout).toBe(false);
77
+ expect(result.isIndex).toBe(false);
78
+ });
79
+ });
80
+ //# sourceMappingURL=conventions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.test.js","sourceRoot":"","sources":["../../src/__tests__/conventions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=page-extractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-extractor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/page-extractor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { extractPages } from '../generator/page-extractor';
3
+ describe('extractPages', () => {
4
+ it('extracts default page export', async () => {
5
+ const mockModule = {
6
+ default: {
7
+ __buzolaPage: true,
8
+ component: () => null,
9
+ route: '/users/:userId',
10
+ paramsMeta: [
11
+ { name: 'userId', optional: false, array: false },
12
+ { name: 'tab', optional: true, array: false },
13
+ ],
14
+ },
15
+ };
16
+ const pages = await extractPages('/fake/path.tsx', async () => mockModule);
17
+ expect(pages).toHaveLength(1);
18
+ expect(pages[0].exportName).toBe('default');
19
+ expect(pages[0].isDefault).toBe(true);
20
+ expect(pages[0].route).toBe('/users/:userId');
21
+ expect(pages[0].params).toEqual([
22
+ { name: 'userId', optional: false, array: false },
23
+ { name: 'tab', optional: true, array: false },
24
+ ]);
25
+ });
26
+ it('extracts named page exports', async () => {
27
+ const mockModule = {
28
+ detail: {
29
+ __buzolaPage: true,
30
+ component: () => null,
31
+ route: '/project/:id',
32
+ paramsMeta: [{ name: 'id', optional: false, array: false }],
33
+ },
34
+ list: {
35
+ __buzolaPage: true,
36
+ component: () => null,
37
+ route: '/projects',
38
+ paramsMeta: [],
39
+ },
40
+ };
41
+ const pages = await extractPages('/fake/path.tsx', async () => mockModule);
42
+ expect(pages).toHaveLength(2);
43
+ expect(pages[0].exportName).toBe('detail');
44
+ expect(pages[0].isDefault).toBe(false);
45
+ expect(pages[1].exportName).toBe('list');
46
+ });
47
+ it('skips non-page exports', async () => {
48
+ const mockModule = {
49
+ default: {
50
+ __buzolaPage: true,
51
+ component: () => null,
52
+ route: '/about',
53
+ paramsMeta: [],
54
+ },
55
+ helperFunction: () => 'not a page',
56
+ SOME_CONSTANT: 42,
57
+ };
58
+ const pages = await extractPages('/fake/path.tsx', async () => mockModule);
59
+ expect(pages).toHaveLength(1);
60
+ expect(pages[0].exportName).toBe('default');
61
+ });
62
+ it('returns empty for module without pages', async () => {
63
+ const mockModule = {
64
+ default: () => null,
65
+ };
66
+ const pages = await extractPages('/fake/path.tsx', async () => mockModule);
67
+ expect(pages).toEqual([]);
68
+ });
69
+ it('handles page without route', async () => {
70
+ const mockModule = {
71
+ default: {
72
+ __buzolaPage: true,
73
+ component: () => null,
74
+ paramsMeta: [],
75
+ },
76
+ };
77
+ const pages = await extractPages('/fake/path.tsx', async () => mockModule);
78
+ expect(pages).toHaveLength(1);
79
+ expect(pages[0].route).toBeUndefined();
80
+ });
81
+ });
82
+ //# sourceMappingURL=page-extractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-extractor.test.js","sourceRoot":"","sources":["../../src/__tests__/page-extractor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tree-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-builder.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tree-builder.test.ts"],"names":[],"mappings":""}