@jasonshimmy/vite-plugin-cer-app 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +130 -0
- package/.github/workflows/publish.yml +206 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +10 -0
- package/IMPLEMENTATION_PLAN.md +391 -0
- package/README.md +231 -0
- package/VITE_PLUGIN_FRAMEWORK_PLAN.md +594 -0
- package/commits.txt +3 -0
- package/dist/__tests__/plugin/path-utils.test.d.ts +2 -0
- package/dist/__tests__/plugin/path-utils.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/path-utils.test.js +305 -0
- package/dist/__tests__/plugin/path-utils.test.js.map +1 -0
- package/dist/__tests__/plugin/scanner.test.d.ts +2 -0
- package/dist/__tests__/plugin/scanner.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/scanner.test.js +143 -0
- package/dist/__tests__/plugin/scanner.test.js.map +1 -0
- package/dist/__tests__/plugin/transforms/auto-import.test.d.ts +2 -0
- package/dist/__tests__/plugin/transforms/auto-import.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/transforms/auto-import.test.js +151 -0
- package/dist/__tests__/plugin/transforms/auto-import.test.js.map +1 -0
- package/dist/__tests__/plugin/transforms/head-inject.test.d.ts +2 -0
- package/dist/__tests__/plugin/transforms/head-inject.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/transforms/head-inject.test.js +151 -0
- package/dist/__tests__/plugin/transforms/head-inject.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/components.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/components.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/components.test.js +47 -0
- package/dist/__tests__/plugin/virtual/components.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/composables.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/composables.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/composables.test.js +48 -0
- package/dist/__tests__/plugin/virtual/composables.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/layouts.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/layouts.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/layouts.test.js +59 -0
- package/dist/__tests__/plugin/virtual/layouts.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/middleware.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/middleware.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/middleware.test.js +58 -0
- package/dist/__tests__/plugin/virtual/middleware.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/plugins.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/plugins.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/plugins.test.js +73 -0
- package/dist/__tests__/plugin/virtual/plugins.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/routes.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/routes.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/routes.test.js +167 -0
- package/dist/__tests__/plugin/virtual/routes.test.js.map +1 -0
- package/dist/__tests__/plugin/virtual/server-api.test.d.ts +2 -0
- package/dist/__tests__/plugin/virtual/server-api.test.d.ts.map +1 -0
- package/dist/__tests__/plugin/virtual/server-api.test.js +72 -0
- package/dist/__tests__/plugin/virtual/server-api.test.js.map +1 -0
- package/dist/__tests__/runtime/use-head.test.d.ts +2 -0
- package/dist/__tests__/runtime/use-head.test.d.ts.map +1 -0
- package/dist/__tests__/runtime/use-head.test.js +202 -0
- package/dist/__tests__/runtime/use-head.test.js.map +1 -0
- package/dist/__tests__/runtime/use-page-data.test.d.ts +2 -0
- package/dist/__tests__/runtime/use-page-data.test.d.ts.map +1 -0
- package/dist/__tests__/runtime/use-page-data.test.js +41 -0
- package/dist/__tests__/runtime/use-page-data.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +103 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +3 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +92 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +7 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +72 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/preview.d.ts +3 -0
- package/dist/cli/commands/preview.d.ts.map +1 -0
- package/dist/cli/commands/preview.js +191 -0
- package/dist/cli/commands/preview.js.map +1 -0
- package/dist/cli/create/index.d.ts +3 -0
- package/dist/cli/create/index.d.ts.map +1 -0
- package/dist/cli/create/index.js +184 -0
- package/dist/cli/create/index.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/build-ssg.d.ts +12 -0
- package/dist/plugin/build-ssg.d.ts.map +1 -0
- package/dist/plugin/build-ssg.js +212 -0
- package/dist/plugin/build-ssg.js.map +1 -0
- package/dist/plugin/build-ssr.d.ts +10 -0
- package/dist/plugin/build-ssr.d.ts.map +1 -0
- package/dist/plugin/build-ssr.js +139 -0
- package/dist/plugin/build-ssr.js.map +1 -0
- package/dist/plugin/dev-server.d.ts +46 -0
- package/dist/plugin/dev-server.d.ts.map +1 -0
- package/dist/plugin/dev-server.js +194 -0
- package/dist/plugin/dev-server.js.map +1 -0
- package/dist/plugin/dts-generator.d.ts +27 -0
- package/dist/plugin/dts-generator.d.ts.map +1 -0
- package/dist/plugin/dts-generator.js +180 -0
- package/dist/plugin/dts-generator.js.map +1 -0
- package/dist/plugin/index.d.ts +13 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +298 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/path-utils.d.ts +57 -0
- package/dist/plugin/path-utils.d.ts.map +1 -0
- package/dist/plugin/path-utils.js +160 -0
- package/dist/plugin/path-utils.js.map +1 -0
- package/dist/plugin/scanner.d.ts +17 -0
- package/dist/plugin/scanner.d.ts.map +1 -0
- package/dist/plugin/scanner.js +54 -0
- package/dist/plugin/scanner.js.map +1 -0
- package/dist/plugin/transforms/auto-import.d.ts +14 -0
- package/dist/plugin/transforms/auto-import.d.ts.map +1 -0
- package/dist/plugin/transforms/auto-import.js +154 -0
- package/dist/plugin/transforms/auto-import.js.map +1 -0
- package/dist/plugin/transforms/head-inject.d.ts +29 -0
- package/dist/plugin/transforms/head-inject.d.ts.map +1 -0
- package/dist/plugin/transforms/head-inject.js +127 -0
- package/dist/plugin/transforms/head-inject.js.map +1 -0
- package/dist/plugin/virtual/components.d.ts +6 -0
- package/dist/plugin/virtual/components.d.ts.map +1 -0
- package/dist/plugin/virtual/components.js +22 -0
- package/dist/plugin/virtual/components.js.map +1 -0
- package/dist/plugin/virtual/composables.d.ts +6 -0
- package/dist/plugin/virtual/composables.d.ts.map +1 -0
- package/dist/plugin/virtual/composables.js +22 -0
- package/dist/plugin/virtual/composables.js.map +1 -0
- package/dist/plugin/virtual/error.d.ts +13 -0
- package/dist/plugin/virtual/error.d.ts.map +1 -0
- package/dist/plugin/virtual/error.js +32 -0
- package/dist/plugin/virtual/error.js.map +1 -0
- package/dist/plugin/virtual/layouts.d.ts +6 -0
- package/dist/plugin/virtual/layouts.d.ts.map +1 -0
- package/dist/plugin/virtual/layouts.js +33 -0
- package/dist/plugin/virtual/layouts.js.map +1 -0
- package/dist/plugin/virtual/loading.d.ts +11 -0
- package/dist/plugin/virtual/loading.d.ts.map +1 -0
- package/dist/plugin/virtual/loading.js +30 -0
- package/dist/plugin/virtual/loading.js.map +1 -0
- package/dist/plugin/virtual/middleware.d.ts +6 -0
- package/dist/plugin/virtual/middleware.d.ts.map +1 -0
- package/dist/plugin/virtual/middleware.js +36 -0
- package/dist/plugin/virtual/middleware.js.map +1 -0
- package/dist/plugin/virtual/plugins.d.ts +6 -0
- package/dist/plugin/virtual/plugins.d.ts.map +1 -0
- package/dist/plugin/virtual/plugins.js +30 -0
- package/dist/plugin/virtual/plugins.js.map +1 -0
- package/dist/plugin/virtual/routes.d.ts +16 -0
- package/dist/plugin/virtual/routes.d.ts.map +1 -0
- package/dist/plugin/virtual/routes.js +131 -0
- package/dist/plugin/virtual/routes.js.map +1 -0
- package/dist/plugin/virtual/server-api.d.ts +6 -0
- package/dist/plugin/virtual/server-api.d.ts.map +1 -0
- package/dist/plugin/virtual/server-api.js +41 -0
- package/dist/plugin/virtual/server-api.js.map +1 -0
- package/dist/plugin/virtual/server-middleware.d.ts +6 -0
- package/dist/plugin/virtual/server-middleware.d.ts.map +1 -0
- package/dist/plugin/virtual/server-middleware.js +36 -0
- package/dist/plugin/virtual/server-middleware.js.map +1 -0
- package/dist/runtime/app-template.d.ts +10 -0
- package/dist/runtime/app-template.d.ts.map +1 -0
- package/dist/runtime/app-template.js +143 -0
- package/dist/runtime/app-template.js.map +1 -0
- package/dist/runtime/composables/index.d.ts +4 -0
- package/dist/runtime/composables/index.d.ts.map +1 -0
- package/dist/runtime/composables/index.js +3 -0
- package/dist/runtime/composables/index.js.map +1 -0
- package/dist/runtime/composables/use-head.d.ts +30 -0
- package/dist/runtime/composables/use-head.d.ts.map +1 -0
- package/dist/runtime/composables/use-head.js +182 -0
- package/dist/runtime/composables/use-head.js.map +1 -0
- package/dist/runtime/composables/use-page-data.d.ts +32 -0
- package/dist/runtime/composables/use-page-data.d.ts.map +1 -0
- package/dist/runtime/composables/use-page-data.js +41 -0
- package/dist/runtime/composables/use-page-data.js.map +1 -0
- package/dist/runtime/entry-client-template.d.ts +8 -0
- package/dist/runtime/entry-client-template.d.ts.map +1 -0
- package/dist/runtime/entry-client-template.js +18 -0
- package/dist/runtime/entry-client-template.js.map +1 -0
- package/dist/runtime/entry-server-template.d.ts +9 -0
- package/dist/runtime/entry-server-template.d.ts.map +1 -0
- package/dist/runtime/entry-server-template.js +72 -0
- package/dist/runtime/entry-server-template.js.map +1 -0
- package/dist/types/api.d.ts +16 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/config.d.ts +32 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +4 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/middleware.d.ts +6 -0
- package/dist/types/middleware.d.ts.map +1 -0
- package/dist/types/middleware.js +2 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/page.d.ts +21 -0
- package/dist/types/page.d.ts.map +1 -0
- package/dist/types/page.js +2 -0
- package/dist/types/page.js.map +1 -0
- package/dist/types/plugin.d.ts +12 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +1 -0
- package/docs/cli.md +233 -0
- package/docs/components.md +114 -0
- package/docs/composables.md +99 -0
- package/docs/configuration.md +270 -0
- package/docs/data-loading.md +165 -0
- package/docs/getting-started.md +235 -0
- package/docs/head-management.md +206 -0
- package/docs/layouts.md +112 -0
- package/docs/middleware.md +140 -0
- package/docs/plugins.md +138 -0
- package/docs/rendering-modes.md +251 -0
- package/docs/routing.md +180 -0
- package/docs/server-api.md +172 -0
- package/docs/testing.md +462 -0
- package/package.json +75 -0
- package/src/__tests__/plugin/path-utils.test.ts +399 -0
- package/src/__tests__/plugin/scanner.test.ts +172 -0
- package/src/__tests__/plugin/transforms/auto-import.test.ts +229 -0
- package/src/__tests__/plugin/transforms/head-inject.test.ts +178 -0
- package/src/__tests__/plugin/virtual/components.test.ts +56 -0
- package/src/__tests__/plugin/virtual/composables.test.ts +57 -0
- package/src/__tests__/plugin/virtual/layouts.test.ts +70 -0
- package/src/__tests__/plugin/virtual/middleware.test.ts +68 -0
- package/src/__tests__/plugin/virtual/plugins.test.ts +84 -0
- package/src/__tests__/plugin/virtual/routes.test.ts +202 -0
- package/src/__tests__/plugin/virtual/server-api.test.ts +85 -0
- package/src/__tests__/runtime/use-head.test.ts +243 -0
- package/src/__tests__/runtime/use-page-data.test.ts +45 -0
- package/src/cli/commands/build.ts +114 -0
- package/src/cli/commands/dev.ts +101 -0
- package/src/cli/commands/generate.ts +81 -0
- package/src/cli/commands/preview.ts +218 -0
- package/src/cli/create/index.ts +250 -0
- package/src/cli/create/templates/spa/app/app.ts.tpl +74 -0
- package/src/cli/create/templates/spa/app/layouts/default.ts.tpl +15 -0
- package/src/cli/create/templates/spa/app/pages/index.ts.tpl +8 -0
- package/src/cli/create/templates/spa/cer.config.ts.tpl +6 -0
- package/src/cli/create/templates/spa/index.html.tpl +12 -0
- package/src/cli/create/templates/spa/package.json.tpl +18 -0
- package/src/cli/create/templates/ssg/app/app.ts.tpl +74 -0
- package/src/cli/create/templates/ssg/app/layouts/default.ts.tpl +15 -0
- package/src/cli/create/templates/ssg/app/pages/index.ts.tpl +17 -0
- package/src/cli/create/templates/ssg/cer.config.ts.tpl +13 -0
- package/src/cli/create/templates/ssg/index.html.tpl +12 -0
- package/src/cli/create/templates/ssg/package.json.tpl +19 -0
- package/src/cli/create/templates/ssr/app/app.ts.tpl +74 -0
- package/src/cli/create/templates/ssr/app/layouts/default.ts.tpl +15 -0
- package/src/cli/create/templates/ssr/app/pages/index.ts.tpl +8 -0
- package/src/cli/create/templates/ssr/cer.config.ts.tpl +10 -0
- package/src/cli/create/templates/ssr/index.html.tpl +12 -0
- package/src/cli/create/templates/ssr/package.json.tpl +18 -0
- package/src/cli/index.ts +20 -0
- package/src/index.ts +13 -0
- package/src/plugin/build-ssg.ts +259 -0
- package/src/plugin/build-ssr.ts +147 -0
- package/src/plugin/dev-server.ts +266 -0
- package/src/plugin/dts-generator.ts +214 -0
- package/src/plugin/index.ts +330 -0
- package/src/plugin/path-utils.ts +186 -0
- package/src/plugin/scanner.ts +65 -0
- package/src/plugin/transforms/auto-import.ts +190 -0
- package/src/plugin/transforms/head-inject.ts +161 -0
- package/src/plugin/virtual/components.ts +28 -0
- package/src/plugin/virtual/composables.ts +28 -0
- package/src/plugin/virtual/error.ts +34 -0
- package/src/plugin/virtual/layouts.ts +41 -0
- package/src/plugin/virtual/loading.ts +33 -0
- package/src/plugin/virtual/middleware.ts +45 -0
- package/src/plugin/virtual/plugins.ts +36 -0
- package/src/plugin/virtual/routes.ts +147 -0
- package/src/plugin/virtual/server-api.ts +52 -0
- package/src/plugin/virtual/server-middleware.ts +44 -0
- package/src/runtime/app-template.ts +142 -0
- package/src/runtime/composables/index.ts +3 -0
- package/src/runtime/composables/use-head.ts +204 -0
- package/src/runtime/composables/use-page-data.ts +39 -0
- package/src/runtime/entry-client-template.ts +17 -0
- package/src/runtime/entry-server-template.ts +71 -0
- package/src/types/api.ts +19 -0
- package/src/types/config.ts +39 -0
- package/src/types/index.ts +6 -0
- package/src/types/middleware.ts +16 -0
- package/src/types/page.ts +29 -0
- package/src/types/plugin.ts +13 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/plugins.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/plugins.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/routes.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,167 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/routes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-api.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/server-api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-api.test.js","sourceRoot":"","sources":["../../../../src/__tests__/plugin/virtual/server-api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE7D,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AACnD,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAE7E,MAAM,GAAG,GAAG,qBAAqB,CAAA;AAEjC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC3C,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAA;QACpE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,aAAa,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC;YACzC,GAAG,GAAG,YAAY;YAClB,GAAG,GAAG,iBAAiB;YACvB,GAAG,GAAG,gBAAgB;SACvB,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-head.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-head.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,202 @@
|
|
|
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('<script>');
|
|
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('"quoted"');
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-head.test.js","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-head.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,GACR,MAAM,uCAAuC,CAAA;AAE9C,iFAAiF;AAEjF,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,SAAS,CAAC,GAAG,EAAE;QACb,8EAA8E;QAC9E,iBAAiB,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,mBAAmB,EAAE,CAAA;QACrB,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;QAC/B,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,mBAAmB,EAAE,CAAA;QACrB,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,mBAAmB,EAAE,CAAA;QACrB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACvB,iBAAiB,EAAE,CAAA;QACnB,kFAAkF;QAClF,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,mBAAmB,EAAE,CAAA;QACrB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3B,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,iFAAiF;AAEjF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAA;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACxF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE;YACrD,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;SACvD,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;YAClD,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SACnD,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/F,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE;YACpD,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE;SACrD,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/E,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC7B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;YAC9B,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAClF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,gFAAgF;AAEhF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,UAAU,CAAC,GAAG,EAAE;QACd,8DAA8D;QAC9D,iBAAiB,EAAE,CAAA;QACnB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QAC5B,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAC3B,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAA;QAC/D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC3B,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAC/C,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAC5C,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAC/C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAEnC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAA;QACnE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAA;QAChE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC3B,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC3B,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;QACtE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,mDAAmD,CAAC,CAAA;QAC5F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAA;QACxE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAA;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAC5D,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QACzC,mEAAmE;QACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QAC5D,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-page-data.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/runtime/use-page-data.test.ts"],"names":[],"mappings":""}
|