@jasonshimmy/vite-plugin-cer-app 0.1.1 → 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 (109) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/commits.txt +1 -1
  3. package/dist/cli/commands/generate.d.ts.map +1 -1
  4. package/dist/cli/commands/generate.js +2 -0
  5. package/dist/cli/commands/generate.js.map +1 -1
  6. package/dist/cli/commands/preview.d.ts.map +1 -1
  7. package/dist/cli/commands/preview.js +21 -2
  8. package/dist/cli/commands/preview.js.map +1 -1
  9. package/dist/cli/index.js +1 -1
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/plugin/build-ssg.d.ts.map +1 -1
  12. package/dist/plugin/build-ssg.js +10 -21
  13. package/dist/plugin/build-ssg.js.map +1 -1
  14. package/dist/plugin/build-ssr.d.ts.map +1 -1
  15. package/dist/plugin/build-ssr.js +150 -27
  16. package/dist/plugin/build-ssr.js.map +1 -1
  17. package/dist/plugin/virtual/routes.d.ts.map +1 -1
  18. package/dist/plugin/virtual/routes.js +11 -1
  19. package/dist/plugin/virtual/routes.js.map +1 -1
  20. package/dist/runtime/app-template.d.ts +1 -1
  21. package/dist/runtime/app-template.d.ts.map +1 -1
  22. package/dist/runtime/app-template.js +6 -0
  23. package/dist/runtime/app-template.js.map +1 -1
  24. package/dist/runtime/composables/use-page-data.d.ts +15 -6
  25. package/dist/runtime/composables/use-page-data.d.ts.map +1 -1
  26. package/dist/runtime/composables/use-page-data.js +30 -9
  27. package/dist/runtime/composables/use-page-data.js.map +1 -1
  28. package/dist/runtime/entry-server-template.d.ts +1 -1
  29. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  30. package/dist/runtime/entry-server-template.js +137 -16
  31. package/dist/runtime/entry-server-template.js.map +1 -1
  32. package/docs/data-loading.md +7 -6
  33. package/docs/getting-started.md +1 -1
  34. package/docs/rendering-modes.md +1 -1
  35. package/docs/server-api.md +9 -0
  36. package/package.json +1 -1
  37. package/src/__tests__/index.test.ts +21 -0
  38. package/src/__tests__/plugin/build-ssg.test.ts +265 -0
  39. package/src/__tests__/plugin/build-ssr.test.ts +180 -0
  40. package/src/__tests__/plugin/cer-app-plugin.test.ts +409 -0
  41. package/src/__tests__/plugin/dts-generator.test.ts +246 -0
  42. package/src/__tests__/plugin/resolve-config.test.ts +158 -0
  43. package/src/__tests__/plugin/virtual/error.test.ts +71 -0
  44. package/src/__tests__/plugin/virtual/loading.test.ts +72 -0
  45. package/src/__tests__/plugin/virtual/server-middleware.test.ts +102 -0
  46. package/src/__tests__/runtime/use-page-data.test.ts +81 -5
  47. package/src/__tests__/types/config.test.ts +23 -0
  48. package/src/cli/commands/generate.ts +2 -0
  49. package/src/cli/commands/preview.ts +21 -2
  50. package/src/cli/index.ts +1 -1
  51. package/src/plugin/build-ssg.ts +9 -22
  52. package/src/plugin/build-ssr.ts +149 -27
  53. package/src/plugin/virtual/routes.ts +12 -1
  54. package/src/runtime/app-template.ts +6 -0
  55. package/src/runtime/composables/use-page-data.ts +31 -9
  56. package/src/runtime/entry-server-template.ts +137 -16
  57. package/tsconfig.build.json +1 -1
  58. package/dist/__tests__/plugin/path-utils.test.d.ts +0 -2
  59. package/dist/__tests__/plugin/path-utils.test.d.ts.map +0 -1
  60. package/dist/__tests__/plugin/path-utils.test.js +0 -305
  61. package/dist/__tests__/plugin/path-utils.test.js.map +0 -1
  62. package/dist/__tests__/plugin/scanner.test.d.ts +0 -2
  63. package/dist/__tests__/plugin/scanner.test.d.ts.map +0 -1
  64. package/dist/__tests__/plugin/scanner.test.js +0 -143
  65. package/dist/__tests__/plugin/scanner.test.js.map +0 -1
  66. package/dist/__tests__/plugin/transforms/auto-import.test.d.ts +0 -2
  67. package/dist/__tests__/plugin/transforms/auto-import.test.d.ts.map +0 -1
  68. package/dist/__tests__/plugin/transforms/auto-import.test.js +0 -151
  69. package/dist/__tests__/plugin/transforms/auto-import.test.js.map +0 -1
  70. package/dist/__tests__/plugin/transforms/head-inject.test.d.ts +0 -2
  71. package/dist/__tests__/plugin/transforms/head-inject.test.d.ts.map +0 -1
  72. package/dist/__tests__/plugin/transforms/head-inject.test.js +0 -151
  73. package/dist/__tests__/plugin/transforms/head-inject.test.js.map +0 -1
  74. package/dist/__tests__/plugin/virtual/components.test.d.ts +0 -2
  75. package/dist/__tests__/plugin/virtual/components.test.d.ts.map +0 -1
  76. package/dist/__tests__/plugin/virtual/components.test.js +0 -47
  77. package/dist/__tests__/plugin/virtual/components.test.js.map +0 -1
  78. package/dist/__tests__/plugin/virtual/composables.test.d.ts +0 -2
  79. package/dist/__tests__/plugin/virtual/composables.test.d.ts.map +0 -1
  80. package/dist/__tests__/plugin/virtual/composables.test.js +0 -48
  81. package/dist/__tests__/plugin/virtual/composables.test.js.map +0 -1
  82. package/dist/__tests__/plugin/virtual/layouts.test.d.ts +0 -2
  83. package/dist/__tests__/plugin/virtual/layouts.test.d.ts.map +0 -1
  84. package/dist/__tests__/plugin/virtual/layouts.test.js +0 -59
  85. package/dist/__tests__/plugin/virtual/layouts.test.js.map +0 -1
  86. package/dist/__tests__/plugin/virtual/middleware.test.d.ts +0 -2
  87. package/dist/__tests__/plugin/virtual/middleware.test.d.ts.map +0 -1
  88. package/dist/__tests__/plugin/virtual/middleware.test.js +0 -58
  89. package/dist/__tests__/plugin/virtual/middleware.test.js.map +0 -1
  90. package/dist/__tests__/plugin/virtual/plugins.test.d.ts +0 -2
  91. package/dist/__tests__/plugin/virtual/plugins.test.d.ts.map +0 -1
  92. package/dist/__tests__/plugin/virtual/plugins.test.js +0 -73
  93. package/dist/__tests__/plugin/virtual/plugins.test.js.map +0 -1
  94. package/dist/__tests__/plugin/virtual/routes.test.d.ts +0 -2
  95. package/dist/__tests__/plugin/virtual/routes.test.d.ts.map +0 -1
  96. package/dist/__tests__/plugin/virtual/routes.test.js +0 -167
  97. package/dist/__tests__/plugin/virtual/routes.test.js.map +0 -1
  98. package/dist/__tests__/plugin/virtual/server-api.test.d.ts +0 -2
  99. package/dist/__tests__/plugin/virtual/server-api.test.d.ts.map +0 -1
  100. package/dist/__tests__/plugin/virtual/server-api.test.js +0 -72
  101. package/dist/__tests__/plugin/virtual/server-api.test.js.map +0 -1
  102. package/dist/__tests__/runtime/use-head.test.d.ts +0 -2
  103. package/dist/__tests__/runtime/use-head.test.d.ts.map +0 -1
  104. package/dist/__tests__/runtime/use-head.test.js +0 -202
  105. package/dist/__tests__/runtime/use-head.test.js.map +0 -1
  106. package/dist/__tests__/runtime/use-page-data.test.d.ts +0 -2
  107. package/dist/__tests__/runtime/use-page-data.test.d.ts.map +0 -1
  108. package/dist/__tests__/runtime/use-page-data.test.js +0 -41
  109. package/dist/__tests__/runtime/use-page-data.test.js.map +0 -1
@@ -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 @jasonshimmy/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 @jasonshimmy/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 @jasonshimmy/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":""}
@@ -1,202 +0,0 @@
1
- /**
2
- * @vitest-environment happy-dom
3
- */
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
- import { beginHeadCollection, endHeadCollection, serializeHeadTags, useHead, } from '../../runtime/composables/use-head.js';
6
- // ─── SSR collection ───────────────────────────────────────────────────────────
7
- describe('SSR head collection (beginHeadCollection / endHeadCollection)', () => {
8
- afterEach(() => {
9
- // Always clean up so we don't leak SSR collector state into client-mode tests
10
- endHeadCollection();
11
- });
12
- it('useHead pushes to the SSR collector when collection is active', () => {
13
- beginHeadCollection();
14
- useHead({ title: 'Test Page' });
15
- const collected = endHeadCollection();
16
- expect(collected).toHaveLength(1);
17
- expect(collected[0].title).toBe('Test Page');
18
- });
19
- it('endHeadCollection returns empty array when nothing was collected', () => {
20
- beginHeadCollection();
21
- expect(endHeadCollection()).toEqual([]);
22
- });
23
- it('endHeadCollection resets the collector (subsequent calls return empty)', () => {
24
- beginHeadCollection();
25
- useHead({ title: 'A' });
26
- endHeadCollection();
27
- // After reset, another endHeadCollection (without beginHeadCollection) returns []
28
- expect(endHeadCollection()).toEqual([]);
29
- });
30
- it('collects multiple useHead calls in order', () => {
31
- beginHeadCollection();
32
- useHead({ title: 'First' });
33
- useHead({ meta: [{ name: 'description', content: 'Desc' }] });
34
- const collected = endHeadCollection();
35
- expect(collected).toHaveLength(2);
36
- expect(collected[0].title).toBe('First');
37
- expect(collected[1].meta[0].name).toBe('description');
38
- });
39
- });
40
- // ─── serializeHeadTags ────────────────────────────────────────────────────────
41
- describe('serializeHeadTags', () => {
42
- it('returns empty string for an empty array', () => {
43
- expect(serializeHeadTags([])).toBe('');
44
- });
45
- it('serializes a title tag', () => {
46
- const html = serializeHeadTags([{ title: 'My Page' }]);
47
- expect(html).toContain('<title>My Page</title>');
48
- });
49
- it('last title wins when multiple inputs have titles', () => {
50
- const html = serializeHeadTags([{ title: 'First' }, { title: 'Second' }]);
51
- expect(html).toContain('Second');
52
- expect(html).not.toContain('First');
53
- });
54
- it('escapes HTML entities in title to prevent XSS', () => {
55
- const html = serializeHeadTags([{ title: '<script>alert(1)</script>' }]);
56
- expect(html).not.toContain('<script>');
57
- expect(html).toContain('&lt;script&gt;');
58
- });
59
- it('serializes meta tags', () => {
60
- const html = serializeHeadTags([{ meta: [{ name: 'description', content: 'A desc' }] }]);
61
- expect(html).toContain('<meta name="description" content="A desc">');
62
- });
63
- it('deduplicates meta tags by name — last value wins', () => {
64
- const html = serializeHeadTags([
65
- { meta: [{ name: 'description', content: 'First' }] },
66
- { meta: [{ name: 'description', content: 'Second' }] },
67
- ]);
68
- expect((html.match(/<meta/g) ?? []).length).toBe(1);
69
- expect(html).toContain('Second');
70
- expect(html).not.toContain('First');
71
- });
72
- it('deduplicates meta tags by property — last value wins', () => {
73
- const html = serializeHeadTags([
74
- { meta: [{ property: 'og:title', content: 'A' }] },
75
- { meta: [{ property: 'og:title', content: 'B' }] },
76
- ]);
77
- expect((html.match(/<meta/g) ?? []).length).toBe(1);
78
- expect(html).toContain('B');
79
- });
80
- it('serializes link tags', () => {
81
- const html = serializeHeadTags([{ link: [{ rel: 'canonical', href: 'https://example.com' }] }]);
82
- expect(html).toContain('<link rel="canonical" href="https://example.com">');
83
- });
84
- it('deduplicates link tags by rel+href', () => {
85
- const html = serializeHeadTags([
86
- { link: [{ rel: 'stylesheet', href: '/main.css' }] },
87
- { link: [{ rel: 'stylesheet', href: '/main.css' }] },
88
- ]);
89
- expect((html.match(/<link/g) ?? []).length).toBe(1);
90
- });
91
- it('serializes script tag with src', () => {
92
- const html = serializeHeadTags([{ script: [{ src: '/app.js' }] }]);
93
- expect(html).toContain('src="/app.js"');
94
- expect(html).toContain('<script');
95
- expect(html).toContain('</script>');
96
- });
97
- it('serializes script tag with innerHTML', () => {
98
- const html = serializeHeadTags([{ script: [{ innerHTML: 'window.foo = 1' }] }]);
99
- expect(html).toContain('window.foo = 1');
100
- expect(html).toContain('<script');
101
- expect(html).toContain('</script>');
102
- });
103
- it('does not deduplicate script tags', () => {
104
- const html = serializeHeadTags([
105
- { script: [{ src: '/a.js' }] },
106
- { script: [{ src: '/b.js' }] },
107
- ]);
108
- expect((html.match(/<script/g) ?? []).length).toBe(2);
109
- });
110
- it('serializes style tags', () => {
111
- const html = serializeHeadTags([{ style: [{ innerHTML: 'body { margin: 0 }' }] }]);
112
- expect(html).toContain('<style');
113
- expect(html).toContain('body { margin: 0 }');
114
- expect(html).toContain('</style>');
115
- });
116
- it('escapes attribute values in meta content', () => {
117
- const html = serializeHeadTags([{ meta: [{ name: 'test', content: '"quoted"' }] }]);
118
- expect(html).toContain('&quot;quoted&quot;');
119
- expect(html).not.toContain('"quoted"');
120
- });
121
- });
122
- // ─── useHead — client mode (DOM) ─────────────────────────────────────────────
123
- describe('useHead — client-side DOM updates', () => {
124
- beforeEach(() => {
125
- // Ensure SSR collector is null so useHead runs in client mode
126
- endHeadCollection();
127
- document.head.innerHTML = '';
128
- document.title = '';
129
- });
130
- it('sets document.title', () => {
131
- useHead({ title: 'Hello World' });
132
- expect(document.title).toBe('Hello World');
133
- });
134
- it('updates document.title on subsequent calls', () => {
135
- useHead({ title: 'First' });
136
- useHead({ title: 'Second' });
137
- expect(document.title).toBe('Second');
138
- });
139
- it('creates a new meta[name] tag', () => {
140
- useHead({ meta: [{ name: 'description', content: 'A test page' }] });
141
- const meta = document.querySelector('meta[name="description"]');
142
- expect(meta).not.toBeNull();
143
- expect(meta?.getAttribute('content')).toBe('A test page');
144
- });
145
- it('updates an existing meta[name] tag instead of creating a duplicate', () => {
146
- const existing = document.createElement('meta');
147
- existing.setAttribute('name', 'description');
148
- existing.setAttribute('content', 'Old content');
149
- document.head.appendChild(existing);
150
- useHead({ meta: [{ name: 'description', content: 'New content' }] });
151
- const metas = document.querySelectorAll('meta[name="description"]');
152
- expect(metas.length).toBe(1);
153
- expect(metas[0].getAttribute('content')).toBe('New content');
154
- });
155
- it('creates a new meta[property] tag', () => {
156
- useHead({ meta: [{ property: 'og:title', content: 'OG Title' }] });
157
- const meta = document.querySelector('meta[property="og:title"]');
158
- expect(meta).not.toBeNull();
159
- expect(meta?.getAttribute('content')).toBe('OG Title');
160
- });
161
- it('creates a new link tag', () => {
162
- useHead({ link: [{ rel: 'canonical', href: 'https://example.com' }] });
163
- const link = document.querySelector('link[rel="canonical"]');
164
- expect(link).not.toBeNull();
165
- expect(link?.getAttribute('href')).toBe('https://example.com');
166
- });
167
- it('does not duplicate link with same rel+href', () => {
168
- useHead({ link: [{ rel: 'canonical', href: 'https://example.com' }] });
169
- useHead({ link: [{ rel: 'canonical', href: 'https://example.com' }] });
170
- const links = document.querySelectorAll('link[rel="canonical"][href="https://example.com"]');
171
- expect(links.length).toBe(1);
172
- });
173
- it('adds a script tag with src', () => {
174
- useHead({ script: [{ src: '/analytics.js' }] });
175
- const script = document.querySelector('script[src="/analytics.js"]');
176
- expect(script).not.toBeNull();
177
- });
178
- it('does not add a duplicate script with the same src', () => {
179
- useHead({ script: [{ src: '/analytics.js' }] });
180
- useHead({ script: [{ src: '/analytics.js' }] });
181
- const scripts = document.querySelectorAll('script[src="/analytics.js"]');
182
- expect(scripts.length).toBe(1);
183
- });
184
- it('adds an inline script (innerHTML, no src)', () => {
185
- useHead({ script: [{ innerHTML: 'window.foo = 1' }] });
186
- const scripts = document.querySelectorAll('script');
187
- expect(scripts.length).toBe(1);
188
- expect(scripts[0].textContent).toBe('window.foo = 1');
189
- });
190
- it('ignores meta without name or property', () => {
191
- const before = document.head.querySelectorAll('meta').length;
192
- useHead({ meta: [{ charset: 'UTF-8' }] });
193
- // charset meta has no name/property so the code skips it on client
194
- expect(document.head.querySelectorAll('meta').length).toBe(before);
195
- });
196
- it('ignores link without rel or href', () => {
197
- const before = document.head.querySelectorAll('link').length;
198
- useHead({ link: [{ type: 'text/css' }] });
199
- expect(document.head.querySelectorAll('link').length).toBe(before);
200
- });
201
- });
202
- //# sourceMappingURL=use-head.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-head.test.js","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-head.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-page-data.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-page-data.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-page-data.test.ts"],"names":[],"mappings":""}