@jasonshimmy/vite-plugin-cer-app 0.1.0 → 0.1.2

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 (172) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/IMPLEMENTATION_PLAN.md +1 -1
  3. package/README.md +7 -7
  4. package/VITE_PLUGIN_FRAMEWORK_PLAN.md +12 -12
  5. package/commits.txt +1 -3
  6. package/dist/cli/commands/generate.d.ts.map +1 -1
  7. package/dist/cli/commands/generate.js +2 -0
  8. package/dist/cli/commands/generate.js.map +1 -1
  9. package/dist/cli/commands/preview.d.ts.map +1 -1
  10. package/dist/cli/commands/preview.js +21 -2
  11. package/dist/cli/commands/preview.js.map +1 -1
  12. package/dist/cli/create/index.js +2 -2
  13. package/dist/cli/create/index.js.map +1 -1
  14. package/dist/cli/index.js +1 -1
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/plugin/build-ssg.d.ts.map +1 -1
  17. package/dist/plugin/build-ssg.js +10 -21
  18. package/dist/plugin/build-ssg.js.map +1 -1
  19. package/dist/plugin/build-ssr.d.ts.map +1 -1
  20. package/dist/plugin/build-ssr.js +151 -28
  21. package/dist/plugin/build-ssr.js.map +1 -1
  22. package/dist/plugin/dts-generator.js +4 -4
  23. package/dist/plugin/dts-generator.js.map +1 -1
  24. package/dist/plugin/index.js +2 -2
  25. package/dist/plugin/index.js.map +1 -1
  26. package/dist/plugin/transforms/auto-import.js +3 -3
  27. package/dist/plugin/transforms/auto-import.js.map +1 -1
  28. package/dist/plugin/virtual/components.js +3 -3
  29. package/dist/plugin/virtual/components.js.map +1 -1
  30. package/dist/plugin/virtual/composables.js +3 -3
  31. package/dist/plugin/virtual/composables.js.map +1 -1
  32. package/dist/plugin/virtual/error.js +2 -2
  33. package/dist/plugin/virtual/error.js.map +1 -1
  34. package/dist/plugin/virtual/layouts.js +3 -3
  35. package/dist/plugin/virtual/layouts.js.map +1 -1
  36. package/dist/plugin/virtual/loading.js +2 -2
  37. package/dist/plugin/virtual/loading.js.map +1 -1
  38. package/dist/plugin/virtual/middleware.js +3 -3
  39. package/dist/plugin/virtual/middleware.js.map +1 -1
  40. package/dist/plugin/virtual/plugins.js +3 -3
  41. package/dist/plugin/virtual/plugins.js.map +1 -1
  42. package/dist/plugin/virtual/routes.d.ts.map +1 -1
  43. package/dist/plugin/virtual/routes.js +14 -4
  44. package/dist/plugin/virtual/routes.js.map +1 -1
  45. package/dist/plugin/virtual/server-api.js +3 -3
  46. package/dist/plugin/virtual/server-api.js.map +1 -1
  47. package/dist/plugin/virtual/server-middleware.js +3 -3
  48. package/dist/plugin/virtual/server-middleware.js.map +1 -1
  49. package/dist/runtime/app-template.d.ts +1 -1
  50. package/dist/runtime/app-template.d.ts.map +1 -1
  51. package/dist/runtime/app-template.js +6 -0
  52. package/dist/runtime/app-template.js.map +1 -1
  53. package/dist/runtime/composables/use-page-data.d.ts +15 -6
  54. package/dist/runtime/composables/use-page-data.d.ts.map +1 -1
  55. package/dist/runtime/composables/use-page-data.js +30 -9
  56. package/dist/runtime/composables/use-page-data.js.map +1 -1
  57. package/dist/runtime/entry-server-template.d.ts +1 -1
  58. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  59. package/dist/runtime/entry-server-template.js +138 -17
  60. package/dist/runtime/entry-server-template.js.map +1 -1
  61. package/docs/cli.md +2 -2
  62. package/docs/configuration.md +4 -4
  63. package/docs/data-loading.md +8 -7
  64. package/docs/getting-started.md +5 -5
  65. package/docs/head-management.md +3 -3
  66. package/docs/middleware.md +2 -2
  67. package/docs/plugins.md +1 -1
  68. package/docs/rendering-modes.md +1 -1
  69. package/docs/routing.md +1 -1
  70. package/docs/server-api.md +10 -1
  71. package/docs/testing.md +4 -4
  72. package/package.json +1 -1
  73. package/src/__tests__/index.test.ts +21 -0
  74. package/src/__tests__/plugin/build-ssg.test.ts +265 -0
  75. package/src/__tests__/plugin/build-ssr.test.ts +180 -0
  76. package/src/__tests__/plugin/cer-app-plugin.test.ts +409 -0
  77. package/src/__tests__/plugin/dts-generator.test.ts +246 -0
  78. package/src/__tests__/plugin/resolve-config.test.ts +158 -0
  79. package/src/__tests__/plugin/transforms/auto-import.test.ts +1 -1
  80. package/src/__tests__/plugin/virtual/components.test.ts +1 -1
  81. package/src/__tests__/plugin/virtual/composables.test.ts +1 -1
  82. package/src/__tests__/plugin/virtual/error.test.ts +71 -0
  83. package/src/__tests__/plugin/virtual/layouts.test.ts +1 -1
  84. package/src/__tests__/plugin/virtual/loading.test.ts +72 -0
  85. package/src/__tests__/plugin/virtual/middleware.test.ts +1 -1
  86. package/src/__tests__/plugin/virtual/plugins.test.ts +1 -1
  87. package/src/__tests__/plugin/virtual/routes.test.ts +1 -1
  88. package/src/__tests__/plugin/virtual/server-api.test.ts +1 -1
  89. package/src/__tests__/plugin/virtual/server-middleware.test.ts +102 -0
  90. package/src/__tests__/runtime/use-page-data.test.ts +81 -5
  91. package/src/__tests__/types/config.test.ts +23 -0
  92. package/src/cli/commands/generate.ts +2 -0
  93. package/src/cli/commands/preview.ts +21 -2
  94. package/src/cli/create/index.ts +2 -2
  95. package/src/cli/create/templates/spa/cer.config.ts.tpl +1 -1
  96. package/src/cli/create/templates/spa/package.json.tpl +1 -1
  97. package/src/cli/create/templates/ssg/cer.config.ts.tpl +1 -1
  98. package/src/cli/create/templates/ssg/package.json.tpl +1 -1
  99. package/src/cli/create/templates/ssr/cer.config.ts.tpl +1 -1
  100. package/src/cli/create/templates/ssr/package.json.tpl +1 -1
  101. package/src/cli/index.ts +1 -1
  102. package/src/plugin/build-ssg.ts +9 -22
  103. package/src/plugin/build-ssr.ts +150 -28
  104. package/src/plugin/dts-generator.ts +4 -4
  105. package/src/plugin/index.ts +2 -2
  106. package/src/plugin/transforms/auto-import.ts +3 -3
  107. package/src/plugin/virtual/components.ts +3 -3
  108. package/src/plugin/virtual/composables.ts +3 -3
  109. package/src/plugin/virtual/error.ts +2 -2
  110. package/src/plugin/virtual/layouts.ts +3 -3
  111. package/src/plugin/virtual/loading.ts +2 -2
  112. package/src/plugin/virtual/middleware.ts +3 -3
  113. package/src/plugin/virtual/plugins.ts +3 -3
  114. package/src/plugin/virtual/routes.ts +15 -4
  115. package/src/plugin/virtual/server-api.ts +3 -3
  116. package/src/plugin/virtual/server-middleware.ts +3 -3
  117. package/src/runtime/app-template.ts +6 -0
  118. package/src/runtime/composables/use-page-data.ts +31 -9
  119. package/src/runtime/entry-server-template.ts +138 -17
  120. package/tsconfig.build.json +1 -1
  121. package/dist/__tests__/plugin/path-utils.test.d.ts +0 -2
  122. package/dist/__tests__/plugin/path-utils.test.d.ts.map +0 -1
  123. package/dist/__tests__/plugin/path-utils.test.js +0 -305
  124. package/dist/__tests__/plugin/path-utils.test.js.map +0 -1
  125. package/dist/__tests__/plugin/scanner.test.d.ts +0 -2
  126. package/dist/__tests__/plugin/scanner.test.d.ts.map +0 -1
  127. package/dist/__tests__/plugin/scanner.test.js +0 -143
  128. package/dist/__tests__/plugin/scanner.test.js.map +0 -1
  129. package/dist/__tests__/plugin/transforms/auto-import.test.d.ts +0 -2
  130. package/dist/__tests__/plugin/transforms/auto-import.test.d.ts.map +0 -1
  131. package/dist/__tests__/plugin/transforms/auto-import.test.js +0 -151
  132. package/dist/__tests__/plugin/transforms/auto-import.test.js.map +0 -1
  133. package/dist/__tests__/plugin/transforms/head-inject.test.d.ts +0 -2
  134. package/dist/__tests__/plugin/transforms/head-inject.test.d.ts.map +0 -1
  135. package/dist/__tests__/plugin/transforms/head-inject.test.js +0 -151
  136. package/dist/__tests__/plugin/transforms/head-inject.test.js.map +0 -1
  137. package/dist/__tests__/plugin/virtual/components.test.d.ts +0 -2
  138. package/dist/__tests__/plugin/virtual/components.test.d.ts.map +0 -1
  139. package/dist/__tests__/plugin/virtual/components.test.js +0 -47
  140. package/dist/__tests__/plugin/virtual/components.test.js.map +0 -1
  141. package/dist/__tests__/plugin/virtual/composables.test.d.ts +0 -2
  142. package/dist/__tests__/plugin/virtual/composables.test.d.ts.map +0 -1
  143. package/dist/__tests__/plugin/virtual/composables.test.js +0 -48
  144. package/dist/__tests__/plugin/virtual/composables.test.js.map +0 -1
  145. package/dist/__tests__/plugin/virtual/layouts.test.d.ts +0 -2
  146. package/dist/__tests__/plugin/virtual/layouts.test.d.ts.map +0 -1
  147. package/dist/__tests__/plugin/virtual/layouts.test.js +0 -59
  148. package/dist/__tests__/plugin/virtual/layouts.test.js.map +0 -1
  149. package/dist/__tests__/plugin/virtual/middleware.test.d.ts +0 -2
  150. package/dist/__tests__/plugin/virtual/middleware.test.d.ts.map +0 -1
  151. package/dist/__tests__/plugin/virtual/middleware.test.js +0 -58
  152. package/dist/__tests__/plugin/virtual/middleware.test.js.map +0 -1
  153. package/dist/__tests__/plugin/virtual/plugins.test.d.ts +0 -2
  154. package/dist/__tests__/plugin/virtual/plugins.test.d.ts.map +0 -1
  155. package/dist/__tests__/plugin/virtual/plugins.test.js +0 -73
  156. package/dist/__tests__/plugin/virtual/plugins.test.js.map +0 -1
  157. package/dist/__tests__/plugin/virtual/routes.test.d.ts +0 -2
  158. package/dist/__tests__/plugin/virtual/routes.test.d.ts.map +0 -1
  159. package/dist/__tests__/plugin/virtual/routes.test.js +0 -167
  160. package/dist/__tests__/plugin/virtual/routes.test.js.map +0 -1
  161. package/dist/__tests__/plugin/virtual/server-api.test.d.ts +0 -2
  162. package/dist/__tests__/plugin/virtual/server-api.test.d.ts.map +0 -1
  163. package/dist/__tests__/plugin/virtual/server-api.test.js +0 -72
  164. package/dist/__tests__/plugin/virtual/server-api.test.js.map +0 -1
  165. package/dist/__tests__/runtime/use-head.test.d.ts +0 -2
  166. package/dist/__tests__/runtime/use-head.test.d.ts.map +0 -1
  167. package/dist/__tests__/runtime/use-head.test.js +0 -202
  168. package/dist/__tests__/runtime/use-head.test.js.map +0 -1
  169. package/dist/__tests__/runtime/use-page-data.test.d.ts +0 -2
  170. package/dist/__tests__/runtime/use-page-data.test.d.ts.map +0 -1
  171. package/dist/__tests__/runtime/use-page-data.test.js +0 -41
  172. package/dist/__tests__/runtime/use-page-data.test.js.map +0 -1
@@ -1,48 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
4
- import { existsSync } from 'node:fs';
5
- import { scanDirectory } from '../../../plugin/scanner.js';
6
- import { generateComposablesCode } from '../../../plugin/virtual/composables.js';
7
- const COMPOSABLES = '/project/app/composables';
8
- describe('generateComposablesCode', () => {
9
- beforeEach(() => {
10
- vi.mocked(existsSync).mockReturnValue(true);
11
- vi.mocked(scanDirectory).mockResolvedValue([]);
12
- });
13
- it('returns no-directory comment when directory does not exist', async () => {
14
- vi.mocked(existsSync).mockReturnValue(false);
15
- const code = await generateComposablesCode(COMPOSABLES);
16
- expect(code).toContain('No composables directory found');
17
- });
18
- it('returns no-composables comment when no files found', async () => {
19
- const code = await generateComposablesCode(COMPOSABLES);
20
- expect(code).toContain('No composables found');
21
- });
22
- it('includes AUTO-GENERATED comment', async () => {
23
- vi.mocked(scanDirectory).mockResolvedValue([`${COMPOSABLES}/useTheme.ts`]);
24
- const code = await generateComposablesCode(COMPOSABLES);
25
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
26
- });
27
- it('generates export * from for each composable file', async () => {
28
- vi.mocked(scanDirectory).mockResolvedValue([`${COMPOSABLES}/useTheme.ts`]);
29
- const code = await generateComposablesCode(COMPOSABLES);
30
- expect(code).toContain(`export * from "${COMPOSABLES}/useTheme.ts"`);
31
- });
32
- it('generates export * from for multiple composables', async () => {
33
- vi.mocked(scanDirectory).mockResolvedValue([
34
- `${COMPOSABLES}/useTheme.ts`,
35
- `${COMPOSABLES}/useAuth.ts`,
36
- ]);
37
- const code = await generateComposablesCode(COMPOSABLES);
38
- expect(code).toContain(`export * from "${COMPOSABLES}/useTheme.ts"`);
39
- expect(code).toContain(`export * from "${COMPOSABLES}/useAuth.ts"`);
40
- });
41
- it('does not generate side-effect imports (re-exports only)', async () => {
42
- vi.mocked(scanDirectory).mockResolvedValue([`${COMPOSABLES}/useTheme.ts`]);
43
- const code = await generateComposablesCode(COMPOSABLES);
44
- // Should NOT have plain `import "..."` side-effect imports
45
- expect(code).not.toMatch(/^import "/);
46
- });
47
- });
48
- //# sourceMappingURL=composables.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"composables.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/composables.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=layouts.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layouts.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/layouts.test.ts"],"names":[],"mappings":""}
@@ -1,59 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
4
- import { existsSync } from 'node:fs';
5
- import { scanDirectory } from '../../../plugin/scanner.js';
6
- import { generateLayoutsCode } from '../../../plugin/virtual/layouts.js';
7
- const LAYOUTS = '/project/app/layouts';
8
- describe('generateLayoutsCode', () => {
9
- beforeEach(() => {
10
- vi.mocked(existsSync).mockReturnValue(true);
11
- vi.mocked(scanDirectory).mockResolvedValue([]);
12
- });
13
- it('returns empty layouts when directory does not exist', async () => {
14
- vi.mocked(existsSync).mockReturnValue(false);
15
- const code = await generateLayoutsCode(LAYOUTS);
16
- expect(code).toContain('export const layouts = {}');
17
- expect(code).toContain('export default layouts');
18
- });
19
- it('returns empty layouts when no layout files found', async () => {
20
- const code = await generateLayoutsCode(LAYOUTS);
21
- expect(code).toContain('export const layouts = {}');
22
- expect(code).toContain('export default layouts');
23
- });
24
- it('includes AUTO-GENERATED comment', async () => {
25
- const code = await generateLayoutsCode(LAYOUTS);
26
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
27
- });
28
- it('generates a side-effect import for each layout file', async () => {
29
- vi.mocked(scanDirectory).mockResolvedValue([`${LAYOUTS}/default.ts`]);
30
- const code = await generateLayoutsCode(LAYOUTS);
31
- expect(code).toContain(`import "${LAYOUTS}/default.ts"`);
32
- });
33
- it('generates layouts map with layout name and tag name', async () => {
34
- vi.mocked(scanDirectory).mockResolvedValue([`${LAYOUTS}/default.ts`]);
35
- const code = await generateLayoutsCode(LAYOUTS);
36
- expect(code).toContain('"default": "layout-default"');
37
- });
38
- it('handles multiple layouts', async () => {
39
- vi.mocked(scanDirectory).mockResolvedValue([
40
- `${LAYOUTS}/default.ts`,
41
- `${LAYOUTS}/minimal.ts`,
42
- ]);
43
- const code = await generateLayoutsCode(LAYOUTS);
44
- expect(code).toContain('"default": "layout-default"');
45
- expect(code).toContain('"minimal": "layout-minimal"');
46
- });
47
- it('handles nested layout files', async () => {
48
- vi.mocked(scanDirectory).mockResolvedValue([`${LAYOUTS}/blog/post.ts`]);
49
- const code = await generateLayoutsCode(LAYOUTS);
50
- expect(code).toContain('"blog-post": "layout-blog-post"');
51
- });
52
- it('exports layouts both as named and default export', async () => {
53
- vi.mocked(scanDirectory).mockResolvedValue([`${LAYOUTS}/default.ts`]);
54
- const code = await generateLayoutsCode(LAYOUTS);
55
- expect(code).toContain('export const layouts');
56
- expect(code).toContain('export default layouts');
57
- });
58
- });
59
- //# sourceMappingURL=layouts.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layouts.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/layouts.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=middleware.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/middleware.test.ts"],"names":[],"mappings":""}
@@ -1,58 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
4
- import { existsSync } from 'node:fs';
5
- import { scanDirectory } from '../../../plugin/scanner.js';
6
- import { generateMiddlewareCode } from '../../../plugin/virtual/middleware.js';
7
- const MIDDLEWARE = '/project/app/middleware';
8
- describe('generateMiddlewareCode', () => {
9
- beforeEach(() => {
10
- vi.mocked(existsSync).mockReturnValue(true);
11
- vi.mocked(scanDirectory).mockResolvedValue([]);
12
- });
13
- it('returns empty middleware when directory does not exist', async () => {
14
- vi.mocked(existsSync).mockReturnValue(false);
15
- const code = await generateMiddlewareCode(MIDDLEWARE);
16
- expect(code).toContain('export const middleware = {}');
17
- expect(code).toContain('export default middleware');
18
- });
19
- it('returns empty middleware when no files found', async () => {
20
- const code = await generateMiddlewareCode(MIDDLEWARE);
21
- expect(code).toContain('export const middleware = {}');
22
- });
23
- it('includes AUTO-GENERATED comment', async () => {
24
- vi.mocked(scanDirectory).mockResolvedValue([`${MIDDLEWARE}/auth.ts`]);
25
- const code = await generateMiddlewareCode(MIDDLEWARE);
26
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
27
- });
28
- it('generates default import and registers under filename key', async () => {
29
- vi.mocked(scanDirectory).mockResolvedValue([`${MIDDLEWARE}/auth.ts`]);
30
- const code = await generateMiddlewareCode(MIDDLEWARE);
31
- expect(code).toContain(`import _m_auth from "${MIDDLEWARE}/auth.ts"`);
32
- expect(code).toContain('"auth": _m_auth');
33
- });
34
- it('creates a safe JS identifier for middleware names with dashes', async () => {
35
- vi.mocked(scanDirectory).mockResolvedValue([`${MIDDLEWARE}/check-auth.ts`]);
36
- const code = await generateMiddlewareCode(MIDDLEWARE);
37
- // Dashes replaced with underscores in the identifier
38
- expect(code).toContain('_m_check_auth');
39
- // Key in the map is the original name (without extension)
40
- expect(code).toContain('"check-auth"');
41
- });
42
- it('handles multiple middleware files', async () => {
43
- vi.mocked(scanDirectory).mockResolvedValue([
44
- `${MIDDLEWARE}/auth.ts`,
45
- `${MIDDLEWARE}/logger.ts`,
46
- ]);
47
- const code = await generateMiddlewareCode(MIDDLEWARE);
48
- expect(code).toContain('"auth": _m_auth');
49
- expect(code).toContain('"logger": _m_logger');
50
- });
51
- it('exports middleware as both named and default export', async () => {
52
- vi.mocked(scanDirectory).mockResolvedValue([`${MIDDLEWARE}/auth.ts`]);
53
- const code = await generateMiddlewareCode(MIDDLEWARE);
54
- expect(code).toContain('export const middleware');
55
- expect(code).toContain('export default middleware');
56
- });
57
- });
58
- //# sourceMappingURL=middleware.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/middleware.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plugins.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugins.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/plugins.test.ts"],"names":[],"mappings":""}
@@ -1,73 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
4
- import { existsSync } from 'node:fs';
5
- import { scanDirectory } from '../../../plugin/scanner.js';
6
- import { generatePluginsCode } from '../../../plugin/virtual/plugins.js';
7
- const PLUGINS = '/project/app/plugins';
8
- describe('generatePluginsCode', () => {
9
- beforeEach(() => {
10
- vi.mocked(existsSync).mockReturnValue(true);
11
- vi.mocked(scanDirectory).mockResolvedValue([]);
12
- });
13
- it('returns empty plugins when directory does not exist', async () => {
14
- vi.mocked(existsSync).mockReturnValue(false);
15
- const code = await generatePluginsCode(PLUGINS);
16
- expect(code).toContain('export const plugins = []');
17
- expect(code).toContain('export default plugins');
18
- });
19
- it('returns empty plugins when no files found', async () => {
20
- const code = await generatePluginsCode(PLUGINS);
21
- expect(code).toContain('export const plugins = []');
22
- });
23
- it('includes AUTO-GENERATED comment', async () => {
24
- vi.mocked(scanDirectory).mockResolvedValue([`${PLUGINS}/store.ts`]);
25
- const code = await generatePluginsCode(PLUGINS);
26
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
27
- });
28
- it('generates default import with alias _p0 for first plugin', async () => {
29
- vi.mocked(scanDirectory).mockResolvedValue([`${PLUGINS}/01.store.ts`]);
30
- const code = await generatePluginsCode(PLUGINS);
31
- expect(code).toContain(`import _p0 from "${PLUGINS}/01.store.ts"`);
32
- expect(code).toContain('export const plugins = [_p0]');
33
- });
34
- it('generates aliased imports _p0, _p1 for two plugins', async () => {
35
- vi.mocked(scanDirectory).mockResolvedValue([
36
- `${PLUGINS}/01.store.ts`,
37
- `${PLUGINS}/02.auth.ts`,
38
- ]);
39
- const code = await generatePluginsCode(PLUGINS);
40
- expect(code).toContain('import _p0 from');
41
- expect(code).toContain('import _p1 from');
42
- expect(code).toContain('export const plugins = [_p0, _p1]');
43
- });
44
- it('sorts plugins by numeric prefix before generating imports', async () => {
45
- // scanDirectory returns files unsorted — sortPluginFiles should sort them
46
- vi.mocked(scanDirectory).mockResolvedValue([
47
- `${PLUGINS}/02.auth.ts`,
48
- `${PLUGINS}/01.store.ts`,
49
- ]);
50
- const code = await generatePluginsCode(PLUGINS);
51
- // 01.store should appear first (_p0), 02.auth second (_p1)
52
- const storeIdx = code.indexOf(`"${PLUGINS}/01.store.ts"`);
53
- const authIdx = code.indexOf(`"${PLUGINS}/02.auth.ts"`);
54
- expect(storeIdx).toBeLessThan(authIdx);
55
- });
56
- it('unnumbered plugins come after numbered ones', async () => {
57
- vi.mocked(scanDirectory).mockResolvedValue([
58
- `${PLUGINS}/zzz.ts`,
59
- `${PLUGINS}/01.first.ts`,
60
- ]);
61
- const code = await generatePluginsCode(PLUGINS);
62
- const firstIdx = code.indexOf(`"${PLUGINS}/01.first.ts"`);
63
- const zzzIdx = code.indexOf(`"${PLUGINS}/zzz.ts"`);
64
- expect(firstIdx).toBeLessThan(zzzIdx);
65
- });
66
- it('exports plugins as both named and default export', async () => {
67
- vi.mocked(scanDirectory).mockResolvedValue([`${PLUGINS}/01.store.ts`]);
68
- const code = await generatePluginsCode(PLUGINS);
69
- expect(code).toContain('export const plugins');
70
- expect(code).toContain('export default plugins');
71
- });
72
- });
73
- //# sourceMappingURL=plugins.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugins.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/plugins.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=routes.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/routes.test.ts"],"names":[],"mappings":""}
@@ -1,167 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('node:fs/promises', () => ({ readFile: vi.fn().mockResolvedValue('') }));
4
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
5
- import { existsSync } from 'node:fs';
6
- import { readFile } from 'node:fs/promises';
7
- import { scanDirectory } from '../../../plugin/scanner.js';
8
- import { generateRoutesCode } from '../../../plugin/virtual/routes.js';
9
- const PAGES = '/project/app/pages';
10
- describe('generateRoutesCode', () => {
11
- beforeEach(() => {
12
- vi.mocked(existsSync).mockReturnValue(true);
13
- vi.mocked(scanDirectory).mockResolvedValue([]);
14
- vi.mocked(readFile).mockResolvedValue('');
15
- });
16
- it('returns empty routes when directory does not exist', async () => {
17
- vi.mocked(existsSync).mockReturnValue(false);
18
- const code = await generateRoutesCode(PAGES);
19
- expect(code).toContain('const routes = []');
20
- expect(code).toContain('export default routes');
21
- });
22
- it('returns empty routes when no files found', async () => {
23
- const code = await generateRoutesCode(PAGES);
24
- expect(code).toContain('const routes = []');
25
- expect(code).toContain('export default routes');
26
- });
27
- it('includes AUTO-GENERATED comment', async () => {
28
- const code = await generateRoutesCode(PAGES);
29
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
30
- });
31
- it('generates a lazy load() route for a static page', async () => {
32
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
33
- const code = await generateRoutesCode(PAGES);
34
- expect(code).toContain('path: \"/about\"');
35
- expect(code).toContain('load:');
36
- expect(code).toContain(`import("${PAGES}/about.ts")`);
37
- expect(code).toContain('"page-about"');
38
- // No eager static imports
39
- expect(code).not.toContain('import * as');
40
- });
41
- it('load() also forwards the page module loader export', async () => {
42
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
43
- const code = await generateRoutesCode(PAGES);
44
- expect(code).toContain('loader: mod.loader');
45
- });
46
- it('generates a lazy load() route for index.ts → /', async () => {
47
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/index.ts`]);
48
- const code = await generateRoutesCode(PAGES);
49
- expect(code).toContain('path: \"/\"');
50
- expect(code).toContain('load:');
51
- expect(code).toContain('"page-index"');
52
- });
53
- it('generates a lazy load() route for a dynamic route', async () => {
54
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/blog/[slug].ts`]);
55
- const code = await generateRoutesCode(PAGES);
56
- expect(code).toContain('path: \"/blog/:slug\"');
57
- expect(code).toContain('load:');
58
- expect(code).toContain('"page-blog-slug"');
59
- });
60
- it('generates a lazy load() route for a catch-all route', async () => {
61
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/[...all].ts`]);
62
- const code = await generateRoutesCode(PAGES);
63
- expect(code).toContain('path: \"/:all*\"');
64
- expect(code).toContain('load:');
65
- expect(code).toContain('"page-all"');
66
- });
67
- it('sorts routes: static before dynamic before catch-all', async () => {
68
- vi.mocked(scanDirectory).mockResolvedValue([
69
- `${PAGES}/[...all].ts`,
70
- `${PAGES}/[id].ts`,
71
- `${PAGES}/about.ts`,
72
- ]);
73
- const code = await generateRoutesCode(PAGES);
74
- const aboutIdx = code.indexOf('\"/about\"');
75
- const idIdx = code.indexOf('\"/:id\"');
76
- const allIdx = code.indexOf('\"/:all*\"');
77
- expect(aboutIdx).toBeLessThan(idIdx);
78
- expect(idIdx).toBeLessThan(allIdx);
79
- });
80
- it('includes export default routes', async () => {
81
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
82
- const code = await generateRoutesCode(PAGES);
83
- expect(code).toContain('export default routes');
84
- });
85
- it('generates multiple lazy routes', async () => {
86
- vi.mocked(scanDirectory).mockResolvedValue([
87
- `${PAGES}/index.ts`,
88
- `${PAGES}/about.ts`,
89
- `${PAGES}/contact.ts`,
90
- ]);
91
- const code = await generateRoutesCode(PAGES);
92
- expect(code).toContain('\"/about\"');
93
- expect(code).toContain('\"/contact\"');
94
- expect(code).toContain('\"/\"');
95
- expect(code).not.toContain('import * as');
96
- });
97
- it('inlines middleware names and adds beforeEnter when middleware is present', async () => {
98
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/dashboard.ts`]);
99
- vi.mocked(readFile).mockResolvedValue(`component('page-dashboard', () => html\`<div>Dashboard</div>\`)\nexport const meta = { middleware: ['auth'] }`);
100
- const code = await generateRoutesCode(PAGES);
101
- expect(code).toContain('beforeEnter');
102
- expect(code).toContain('"auth"');
103
- expect(code).toContain('virtual:cer-middleware');
104
- });
105
- it('omits beforeEnter when no middleware is declared', async () => {
106
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
107
- vi.mocked(readFile).mockResolvedValue(`component('page-about', () => html\`<h1>About</h1>\`)\nexport const meta = { layout: 'default' }`);
108
- const code = await generateRoutesCode(PAGES);
109
- expect(code).not.toContain('beforeEnter');
110
- });
111
- });
112
- // ─── meta.layout ─────────────────────────────────────────────────────────────
113
- describe('generateRoutesCode — meta.layout', () => {
114
- beforeEach(() => {
115
- vi.mocked(existsSync).mockReturnValue(true);
116
- vi.mocked(scanDirectory).mockResolvedValue([]);
117
- vi.mocked(readFile).mockResolvedValue('');
118
- });
119
- it('emits meta.layout when layout is declared in page source', async () => {
120
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
121
- vi.mocked(readFile).mockResolvedValue(`component('page-about', () => html\`<h1>About</h1>\`)\nexport const meta = { layout: 'minimal' }`);
122
- const code = await generateRoutesCode(PAGES);
123
- expect(code).toContain('meta: { layout: "minimal" }');
124
- });
125
- it('omits meta field when no layout is declared', async () => {
126
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/about.ts`]);
127
- vi.mocked(readFile).mockResolvedValue(`component('page-about', () => html\`<h1>About</h1>\`)`);
128
- const code = await generateRoutesCode(PAGES);
129
- expect(code).not.toContain('meta:');
130
- });
131
- it('emits meta.layout alongside beforeEnter when both layout and middleware are present', async () => {
132
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/dashboard.ts`]);
133
- vi.mocked(readFile).mockResolvedValue(`component('page-dashboard', () => html\`<div/>\`)\nexport const meta = { layout: 'admin', middleware: ['auth'] }`);
134
- const code = await generateRoutesCode(PAGES);
135
- expect(code).toContain('meta: { layout: "admin" }');
136
- expect(code).toContain('beforeEnter');
137
- expect(code).toContain('"auth"');
138
- });
139
- });
140
- // ─── 404 page convention ──────────────────────────────────────────────────────
141
- describe('generateRoutesCode — 404.ts convention', () => {
142
- beforeEach(() => {
143
- vi.mocked(existsSync).mockReturnValue(true);
144
- vi.mocked(scanDirectory).mockResolvedValue([]);
145
- vi.mocked(readFile).mockResolvedValue('');
146
- });
147
- it('maps 404.ts to path /:all* (catch-all)', async () => {
148
- vi.mocked(scanDirectory).mockResolvedValue([`${PAGES}/404.ts`]);
149
- const code = await generateRoutesCode(PAGES);
150
- expect(code).toContain('path: \"/:all*\"');
151
- expect(code).toContain('"page-404"');
152
- });
153
- it('sorts 404.ts catch-all after all other routes', async () => {
154
- vi.mocked(scanDirectory).mockResolvedValue([
155
- `${PAGES}/404.ts`,
156
- `${PAGES}/about.ts`,
157
- `${PAGES}/[id].ts`,
158
- ]);
159
- const code = await generateRoutesCode(PAGES);
160
- const aboutIdx = code.indexOf('\"/about\"');
161
- const idIdx = code.indexOf('\"/:id\"');
162
- const allIdx = code.indexOf('\"/:all*\"');
163
- expect(aboutIdx).toBeLessThan(idIdx);
164
- expect(idIdx).toBeLessThan(allIdx);
165
- });
166
- });
167
- //# sourceMappingURL=routes.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/routes.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=server-api.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-api.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/server-api.test.ts"],"names":[],"mappings":""}
@@ -1,72 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach } from 'vitest';
2
- vi.mock('node:fs', () => ({ existsSync: vi.fn() }));
3
- vi.mock('../../../plugin/scanner.js', () => ({ scanDirectory: vi.fn() }));
4
- import { existsSync } from 'node:fs';
5
- import { scanDirectory } from '../../../plugin/scanner.js';
6
- import { generateServerApiCode } from '../../../plugin/virtual/server-api.js';
7
- const API = '/project/server/api';
8
- describe('generateServerApiCode', () => {
9
- beforeEach(() => {
10
- vi.mocked(existsSync).mockReturnValue(true);
11
- vi.mocked(scanDirectory).mockResolvedValue([]);
12
- });
13
- it('returns empty apiRoutes when directory does not exist', async () => {
14
- vi.mocked(existsSync).mockReturnValue(false);
15
- const code = await generateServerApiCode(API);
16
- expect(code).toContain('export const apiRoutes = []');
17
- expect(code).toContain('export default apiRoutes');
18
- });
19
- it('returns empty apiRoutes when no files found', async () => {
20
- const code = await generateServerApiCode(API);
21
- expect(code).toContain('export const apiRoutes = []');
22
- });
23
- it('includes AUTO-GENERATED comment', async () => {
24
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/health.ts`]);
25
- const code = await generateServerApiCode(API);
26
- expect(code).toContain('AUTO-GENERATED by vite-plugin-cer-app');
27
- });
28
- it('prefixes route path with /api/', async () => {
29
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/health.ts`]);
30
- const code = await generateServerApiCode(API);
31
- expect(code).toContain('path: "/api/health"');
32
- });
33
- it('maps users/index.ts to /api/users', async () => {
34
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/users/index.ts`]);
35
- const code = await generateServerApiCode(API);
36
- expect(code).toContain('path: "/api/users"');
37
- });
38
- it('maps dynamic route [id].ts to /api/users/:id', async () => {
39
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/users/[id].ts`]);
40
- const code = await generateServerApiCode(API);
41
- expect(code).toContain('path: "/api/users/:id"');
42
- });
43
- it('imports handlers as namespace (import * as)', async () => {
44
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/health.ts`]);
45
- const code = await generateServerApiCode(API);
46
- expect(code).toContain('import * as');
47
- expect(code).toContain(`"${API}/health.ts"`);
48
- });
49
- it('assigns handlers to each route entry', async () => {
50
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/health.ts`]);
51
- const code = await generateServerApiCode(API);
52
- expect(code).toContain('handlers:');
53
- });
54
- it('generates entries for multiple API routes', async () => {
55
- vi.mocked(scanDirectory).mockResolvedValue([
56
- `${API}/health.ts`,
57
- `${API}/users/index.ts`,
58
- `${API}/users/[id].ts`,
59
- ]);
60
- const code = await generateServerApiCode(API);
61
- expect(code).toContain('"/api/health"');
62
- expect(code).toContain('"/api/users"');
63
- expect(code).toContain('"/api/users/:id"');
64
- });
65
- it('exports apiRoutes as both named and default export', async () => {
66
- vi.mocked(scanDirectory).mockResolvedValue([`${API}/health.ts`]);
67
- const code = await generateServerApiCode(API);
68
- expect(code).toContain('export const apiRoutes');
69
- expect(code).toContain('export default apiRoutes');
70
- });
71
- });
72
- //# sourceMappingURL=server-api.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-api.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/server-api.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-head.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-head.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-head.test.ts"],"names":[],"mappings":""}