@jasonshimmy/vite-plugin-cer-app 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/IMPLEMENTATION_PLAN.md +1 -1
- package/README.md +7 -7
- package/VITE_PLUGIN_FRAMEWORK_PLAN.md +12 -12
- package/commits.txt +1 -3
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +2 -0
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/preview.d.ts.map +1 -1
- package/dist/cli/commands/preview.js +21 -2
- package/dist/cli/commands/preview.js.map +1 -1
- package/dist/cli/create/index.js +2 -2
- package/dist/cli/create/index.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/plugin/build-ssg.d.ts.map +1 -1
- package/dist/plugin/build-ssg.js +10 -21
- package/dist/plugin/build-ssg.js.map +1 -1
- package/dist/plugin/build-ssr.d.ts.map +1 -1
- package/dist/plugin/build-ssr.js +151 -28
- package/dist/plugin/build-ssr.js.map +1 -1
- package/dist/plugin/dts-generator.js +4 -4
- package/dist/plugin/dts-generator.js.map +1 -1
- package/dist/plugin/index.js +2 -2
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/transforms/auto-import.js +3 -3
- package/dist/plugin/transforms/auto-import.js.map +1 -1
- package/dist/plugin/virtual/components.js +3 -3
- package/dist/plugin/virtual/components.js.map +1 -1
- package/dist/plugin/virtual/composables.js +3 -3
- package/dist/plugin/virtual/composables.js.map +1 -1
- package/dist/plugin/virtual/error.js +2 -2
- package/dist/plugin/virtual/error.js.map +1 -1
- package/dist/plugin/virtual/layouts.js +3 -3
- package/dist/plugin/virtual/layouts.js.map +1 -1
- package/dist/plugin/virtual/loading.js +2 -2
- package/dist/plugin/virtual/loading.js.map +1 -1
- package/dist/plugin/virtual/middleware.js +3 -3
- package/dist/plugin/virtual/middleware.js.map +1 -1
- package/dist/plugin/virtual/plugins.js +3 -3
- package/dist/plugin/virtual/plugins.js.map +1 -1
- package/dist/plugin/virtual/routes.d.ts.map +1 -1
- package/dist/plugin/virtual/routes.js +14 -4
- package/dist/plugin/virtual/routes.js.map +1 -1
- package/dist/plugin/virtual/server-api.js +3 -3
- package/dist/plugin/virtual/server-api.js.map +1 -1
- package/dist/plugin/virtual/server-middleware.js +3 -3
- package/dist/plugin/virtual/server-middleware.js.map +1 -1
- package/dist/runtime/app-template.d.ts +1 -1
- package/dist/runtime/app-template.d.ts.map +1 -1
- package/dist/runtime/app-template.js +6 -0
- package/dist/runtime/app-template.js.map +1 -1
- package/dist/runtime/composables/use-page-data.d.ts +15 -6
- package/dist/runtime/composables/use-page-data.d.ts.map +1 -1
- package/dist/runtime/composables/use-page-data.js +30 -9
- package/dist/runtime/composables/use-page-data.js.map +1 -1
- package/dist/runtime/entry-server-template.d.ts +1 -1
- package/dist/runtime/entry-server-template.d.ts.map +1 -1
- package/dist/runtime/entry-server-template.js +138 -17
- package/dist/runtime/entry-server-template.js.map +1 -1
- package/docs/cli.md +2 -2
- package/docs/configuration.md +4 -4
- package/docs/data-loading.md +8 -7
- package/docs/getting-started.md +5 -5
- package/docs/head-management.md +3 -3
- package/docs/middleware.md +2 -2
- package/docs/plugins.md +1 -1
- package/docs/rendering-modes.md +1 -1
- package/docs/routing.md +1 -1
- package/docs/server-api.md +10 -1
- package/docs/testing.md +4 -4
- package/package.json +1 -1
- package/src/__tests__/index.test.ts +21 -0
- package/src/__tests__/plugin/build-ssg.test.ts +265 -0
- package/src/__tests__/plugin/build-ssr.test.ts +180 -0
- package/src/__tests__/plugin/cer-app-plugin.test.ts +409 -0
- package/src/__tests__/plugin/dts-generator.test.ts +246 -0
- package/src/__tests__/plugin/resolve-config.test.ts +158 -0
- package/src/__tests__/plugin/transforms/auto-import.test.ts +1 -1
- package/src/__tests__/plugin/virtual/components.test.ts +1 -1
- package/src/__tests__/plugin/virtual/composables.test.ts +1 -1
- package/src/__tests__/plugin/virtual/error.test.ts +71 -0
- package/src/__tests__/plugin/virtual/layouts.test.ts +1 -1
- package/src/__tests__/plugin/virtual/loading.test.ts +72 -0
- package/src/__tests__/plugin/virtual/middleware.test.ts +1 -1
- package/src/__tests__/plugin/virtual/plugins.test.ts +1 -1
- package/src/__tests__/plugin/virtual/routes.test.ts +1 -1
- package/src/__tests__/plugin/virtual/server-api.test.ts +1 -1
- package/src/__tests__/plugin/virtual/server-middleware.test.ts +102 -0
- package/src/__tests__/runtime/use-page-data.test.ts +81 -5
- package/src/__tests__/types/config.test.ts +23 -0
- package/src/cli/commands/generate.ts +2 -0
- package/src/cli/commands/preview.ts +21 -2
- package/src/cli/create/index.ts +2 -2
- package/src/cli/create/templates/spa/cer.config.ts.tpl +1 -1
- package/src/cli/create/templates/spa/package.json.tpl +1 -1
- package/src/cli/create/templates/ssg/cer.config.ts.tpl +1 -1
- package/src/cli/create/templates/ssg/package.json.tpl +1 -1
- package/src/cli/create/templates/ssr/cer.config.ts.tpl +1 -1
- package/src/cli/create/templates/ssr/package.json.tpl +1 -1
- package/src/cli/index.ts +1 -1
- package/src/plugin/build-ssg.ts +9 -22
- package/src/plugin/build-ssr.ts +150 -28
- package/src/plugin/dts-generator.ts +4 -4
- package/src/plugin/index.ts +2 -2
- package/src/plugin/transforms/auto-import.ts +3 -3
- package/src/plugin/virtual/components.ts +3 -3
- package/src/plugin/virtual/composables.ts +3 -3
- package/src/plugin/virtual/error.ts +2 -2
- package/src/plugin/virtual/layouts.ts +3 -3
- package/src/plugin/virtual/loading.ts +2 -2
- package/src/plugin/virtual/middleware.ts +3 -3
- package/src/plugin/virtual/plugins.ts +3 -3
- package/src/plugin/virtual/routes.ts +15 -4
- package/src/plugin/virtual/server-api.ts +3 -3
- package/src/plugin/virtual/server-middleware.ts +3 -3
- package/src/runtime/app-template.ts +6 -0
- package/src/runtime/composables/use-page-data.ts +31 -9
- package/src/runtime/entry-server-template.ts +138 -17
- package/tsconfig.build.json +1 -1
- package/dist/__tests__/plugin/path-utils.test.d.ts +0 -2
- package/dist/__tests__/plugin/path-utils.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/path-utils.test.js +0 -305
- package/dist/__tests__/plugin/path-utils.test.js.map +0 -1
- package/dist/__tests__/plugin/scanner.test.d.ts +0 -2
- package/dist/__tests__/plugin/scanner.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/scanner.test.js +0 -143
- package/dist/__tests__/plugin/scanner.test.js.map +0 -1
- package/dist/__tests__/plugin/transforms/auto-import.test.d.ts +0 -2
- package/dist/__tests__/plugin/transforms/auto-import.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/transforms/auto-import.test.js +0 -151
- package/dist/__tests__/plugin/transforms/auto-import.test.js.map +0 -1
- package/dist/__tests__/plugin/transforms/head-inject.test.d.ts +0 -2
- package/dist/__tests__/plugin/transforms/head-inject.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/transforms/head-inject.test.js +0 -151
- package/dist/__tests__/plugin/transforms/head-inject.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/components.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/components.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/components.test.js +0 -47
- package/dist/__tests__/plugin/virtual/components.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/composables.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/composables.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/composables.test.js +0 -48
- package/dist/__tests__/plugin/virtual/composables.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/layouts.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/layouts.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/layouts.test.js +0 -59
- package/dist/__tests__/plugin/virtual/layouts.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/middleware.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/middleware.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/middleware.test.js +0 -58
- package/dist/__tests__/plugin/virtual/middleware.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/plugins.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/plugins.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/plugins.test.js +0 -73
- package/dist/__tests__/plugin/virtual/plugins.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/routes.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/routes.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/routes.test.js +0 -167
- package/dist/__tests__/plugin/virtual/routes.test.js.map +0 -1
- package/dist/__tests__/plugin/virtual/server-api.test.d.ts +0 -2
- package/dist/__tests__/plugin/virtual/server-api.test.d.ts.map +0 -1
- package/dist/__tests__/plugin/virtual/server-api.test.js +0 -72
- package/dist/__tests__/plugin/virtual/server-api.test.js.map +0 -1
- package/dist/__tests__/runtime/use-head.test.d.ts +0 -2
- package/dist/__tests__/runtime/use-head.test.d.ts.map +0 -1
- package/dist/__tests__/runtime/use-head.test.js +0 -202
- package/dist/__tests__/runtime/use-head.test.js.map +0 -1
- package/dist/__tests__/runtime/use-page-data.test.d.ts +0 -2
- package/dist/__tests__/runtime/use-page-data.test.d.ts.map +0 -1
- package/dist/__tests__/runtime/use-page-data.test.js +0 -41
- package/dist/__tests__/runtime/use-page-data.test.js.map +0 -1
|
@@ -5,27 +5,98 @@
|
|
|
5
5
|
* wires up the routing, and exports a handler compatible with
|
|
6
6
|
* Express/Fastify/Node http.
|
|
7
7
|
*/
|
|
8
|
-
export const ENTRY_SERVER_TEMPLATE = `// Server-side entry — AUTO-GENERATED by vite-plugin-cer-app
|
|
8
|
+
export const ENTRY_SERVER_TEMPLATE = `// Server-side entry — AUTO-GENERATED by @jasonshimmy/vite-plugin-cer-app
|
|
9
|
+
import { readFileSync, existsSync } from 'node:fs'
|
|
10
|
+
import { dirname, join } from 'node:path'
|
|
11
|
+
import { fileURLToPath } from 'node:url'
|
|
12
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
9
13
|
import 'virtual:cer-components'
|
|
10
14
|
import routes from 'virtual:cer-routes'
|
|
11
15
|
import layouts from 'virtual:cer-layouts'
|
|
12
16
|
import plugins from 'virtual:cer-plugins'
|
|
13
17
|
import apiRoutes from 'virtual:cer-server-api'
|
|
14
|
-
import {
|
|
18
|
+
import { registerBuiltinComponents } from '@jasonshimmy/custom-elements-runtime'
|
|
19
|
+
import { registerEntityMap, DSD_POLYFILL_SCRIPT } from '@jasonshimmy/custom-elements-runtime/ssr'
|
|
20
|
+
import entitiesJson from '@jasonshimmy/custom-elements-runtime/entities.json'
|
|
15
21
|
import { initRouter } from '@jasonshimmy/custom-elements-runtime/router'
|
|
16
|
-
import {
|
|
22
|
+
import { createSSRHandler } from '@jasonshimmy/custom-elements-runtime/ssr-middleware'
|
|
17
23
|
|
|
18
24
|
registerBuiltinComponents()
|
|
19
25
|
|
|
26
|
+
// Pre-load the full HTML entity map so named entities like — decode
|
|
27
|
+
// correctly during SSR. Without this the bundled runtime falls back to a
|
|
28
|
+
// minimal set (<, >, & …) and re-escapes everything else.
|
|
29
|
+
registerEntityMap(entitiesJson)
|
|
30
|
+
|
|
31
|
+
// Async-local storage for request-scoped SSR loader data.
|
|
32
|
+
// Using AsyncLocalStorage ensures concurrent SSR renders (e.g. SSG with
|
|
33
|
+
// concurrency > 1) never see each other's data — each request's async chain
|
|
34
|
+
// carries its own store value, so usePageData() is always race-condition-free.
|
|
35
|
+
const _cerDataStore = new AsyncLocalStorage()
|
|
36
|
+
// Expose the store so the usePageData() composable can read it server-side.
|
|
37
|
+
;(globalThis).__CER_DATA_STORE__ = _cerDataStore
|
|
38
|
+
|
|
39
|
+
// Load the Vite-built client index.html (dist/client/index.html) so every SSR
|
|
40
|
+
// response includes the client-side scripts needed for hydration and routing.
|
|
41
|
+
// The server bundle lives at dist/server/server.js, so ../client resolves correctly.
|
|
42
|
+
const _clientTemplatePath = join(dirname(fileURLToPath(import.meta.url)), '../client/index.html')
|
|
43
|
+
const _clientTemplate = existsSync(_clientTemplatePath)
|
|
44
|
+
? readFileSync(_clientTemplatePath, 'utf-8')
|
|
45
|
+
: null
|
|
46
|
+
|
|
47
|
+
// Merge the SSR handler's full HTML document with the Vite client shell so the
|
|
48
|
+
// final page contains both pre-rendered DSD content and the client bundle scripts.
|
|
49
|
+
function _mergeWithClientTemplate(ssrHtml, clientTemplate) {
|
|
50
|
+
const headTag = '<head>', headCloseTag = '</head>'
|
|
51
|
+
const bodyTag = '<body>', bodyCloseTag = '</body>'
|
|
52
|
+
const headStart = ssrHtml.indexOf(headTag)
|
|
53
|
+
const headEnd = ssrHtml.indexOf(headCloseTag)
|
|
54
|
+
const bodyStart = ssrHtml.indexOf(bodyTag)
|
|
55
|
+
const bodyEnd = ssrHtml.lastIndexOf(bodyCloseTag)
|
|
56
|
+
const ssrHead = headStart >= 0 && headEnd > headStart
|
|
57
|
+
? ssrHtml.slice(headStart + headTag.length, headEnd).trim() : ''
|
|
58
|
+
const ssrBody = bodyStart >= 0 && bodyEnd > bodyStart
|
|
59
|
+
? ssrHtml.slice(bodyStart + bodyTag.length, bodyEnd).trim() : ssrHtml
|
|
60
|
+
// Hoist <style> elements from the SSR body into the document <head> so
|
|
61
|
+
// JIT CSS rules are applied before the layout paints.
|
|
62
|
+
const headParts = ssrHead ? [ssrHead] : []
|
|
63
|
+
let ssrBodyContent = ssrBody
|
|
64
|
+
let pos = 0
|
|
65
|
+
while (pos < ssrBodyContent.length) {
|
|
66
|
+
const styleOpen = ssrBodyContent.indexOf('<style', pos)
|
|
67
|
+
if (styleOpen < 0) break
|
|
68
|
+
const styleClose = ssrBodyContent.indexOf('</style>', styleOpen)
|
|
69
|
+
if (styleClose < 0) break
|
|
70
|
+
headParts.push(ssrBodyContent.slice(styleOpen, styleClose + 8))
|
|
71
|
+
ssrBodyContent = ssrBodyContent.slice(0, styleOpen) + ssrBodyContent.slice(styleClose + 8)
|
|
72
|
+
pos = styleOpen
|
|
73
|
+
}
|
|
74
|
+
ssrBodyContent = ssrBodyContent.trim()
|
|
75
|
+
// Inject the pre-rendered layout+page as light DOM of the app mount element
|
|
76
|
+
// so it is visible before JS boots, then the client router takes over.
|
|
77
|
+
let merged = clientTemplate
|
|
78
|
+
if (merged.includes('<cer-layout-view></cer-layout-view>')) {
|
|
79
|
+
merged = merged.replace('<cer-layout-view></cer-layout-view>',
|
|
80
|
+
'<cer-layout-view>' + ssrBodyContent + '</cer-layout-view>')
|
|
81
|
+
} else if (merged.includes('<div id="app"></div>')) {
|
|
82
|
+
merged = merged.replace('<div id="app"></div>',
|
|
83
|
+
'<div id="app">' + ssrBodyContent + '</div>')
|
|
84
|
+
}
|
|
85
|
+
const headAdditions = headParts.filter(Boolean).join('\\n')
|
|
86
|
+
if (headAdditions) merged = merged.replace('</head>', headAdditions + '\\n</head>')
|
|
87
|
+
return merged
|
|
88
|
+
}
|
|
89
|
+
|
|
20
90
|
/**
|
|
21
91
|
* Per-request VNode factory — initializes a fresh router at the request URL,
|
|
22
|
-
* resolves the active layout from the matched route's meta,
|
|
23
|
-
*
|
|
24
|
-
*
|
|
92
|
+
* resolves the active layout from the matched route's meta, pre-loads the
|
|
93
|
+
* matched page component (bypassing the async router-view so DSD renders
|
|
94
|
+
* synchronously), calls the route's data loader (if any), and injects the
|
|
95
|
+
* serialized result into the document head as window.__CER_DATA__ for
|
|
96
|
+
* client-side hydration.
|
|
25
97
|
*
|
|
26
98
|
* createStreamingSSRHandler threads the router through each component's SSR
|
|
27
|
-
* context so
|
|
28
|
-
* shared activeRouterProxy singleton. This makes concurrent SSR requests safe.
|
|
99
|
+
* context so concurrent renders never share state.
|
|
29
100
|
*/
|
|
30
101
|
const vnodeFactory = async (req) => {
|
|
31
102
|
const router = initRouter({ routes, initialUrl: req.url ?? '/' })
|
|
@@ -33,38 +104,88 @@ const vnodeFactory = async (req) => {
|
|
|
33
104
|
const { route, params } = router.matchRoute(current.path)
|
|
34
105
|
const layoutName = route?.meta?.layout ?? 'default'
|
|
35
106
|
const layoutTag = layouts[layoutName]
|
|
36
|
-
const inner = html\`<router-view></router-view>\`
|
|
37
|
-
const vnode = layoutTag
|
|
38
|
-
? { tag: layoutTag, props: {}, children: [inner] }
|
|
39
|
-
: inner
|
|
40
107
|
|
|
41
|
-
//
|
|
108
|
+
// Pre-load the page module so we can embed the component tag directly.
|
|
109
|
+
// This avoids the async router-view (which injects content via script tags
|
|
110
|
+
// and breaks Declarative Shadow DOM on initial parse).
|
|
111
|
+
let pageVnode = { tag: 'div', props: {}, children: [] }
|
|
42
112
|
let head
|
|
43
113
|
if (route?.load) {
|
|
44
114
|
try {
|
|
45
115
|
const mod = await route.load()
|
|
116
|
+
const pageTag = mod.default
|
|
117
|
+
if (pageTag) {
|
|
118
|
+
pageVnode = { tag: pageTag, props: { attrs: { ...params } }, children: [] }
|
|
119
|
+
}
|
|
46
120
|
if (typeof mod.loader === 'function') {
|
|
47
121
|
const query = current.query ?? {}
|
|
48
122
|
const data = await mod.loader({ params, query, req })
|
|
49
123
|
if (data !== undefined && data !== null) {
|
|
124
|
+
// Make data available to usePageData() during the SSR render pass.
|
|
125
|
+
// enterWith() scopes the value to the current async context so
|
|
126
|
+
// concurrent renders (SSG concurrency > 1) never share data.
|
|
127
|
+
_cerDataStore.enterWith(data)
|
|
50
128
|
head = \`<script>window.__CER_DATA__ = \${JSON.stringify(data)}</script>\`
|
|
51
129
|
}
|
|
52
130
|
}
|
|
53
131
|
} catch {
|
|
54
|
-
//
|
|
132
|
+
// Non-fatal: loader errors fall back to an empty page; client will refetch.
|
|
55
133
|
}
|
|
56
134
|
}
|
|
57
135
|
|
|
136
|
+
const vnode = layoutTag
|
|
137
|
+
? { tag: layoutTag, props: {}, children: [pageVnode] }
|
|
138
|
+
: pageVnode
|
|
139
|
+
|
|
58
140
|
return { vnode, router, head }
|
|
59
141
|
}
|
|
60
142
|
|
|
143
|
+
// Capture the raw SSR handler and wrap it to merge the response with the
|
|
144
|
+
// Vite client template before sending — this injects the JS/CSS asset bundles
|
|
145
|
+
// so the browser can hydrate and enable client-side routing.
|
|
146
|
+
const _rawHandler = createSSRHandler(vnodeFactory, {
|
|
147
|
+
render: { dsd: true, dsdPolyfill: false },
|
|
148
|
+
})
|
|
149
|
+
|
|
61
150
|
/**
|
|
62
151
|
* The main request handler.
|
|
63
152
|
* Compatible with Express, Fastify, and Node's raw http.createServer.
|
|
153
|
+
*
|
|
154
|
+
* Each request is run inside a fresh _cerDataStore.run() context so that
|
|
155
|
+
* concurrent renders (e.g. SSG with concurrency > 1) get isolated stores.
|
|
156
|
+
* vnodeFactory calls _cerDataStore.enterWith(loaderData) from within this
|
|
157
|
+
* context, making the data visible to usePageData() during SSR rendering
|
|
158
|
+
* without any global-state races.
|
|
64
159
|
*/
|
|
65
|
-
export const handler =
|
|
66
|
-
|
|
67
|
-
|
|
160
|
+
export const handler = async (req, res) => {
|
|
161
|
+
if (!_clientTemplate) {
|
|
162
|
+
// No client template — run handler normally, then inject DSD polyfill.
|
|
163
|
+
let _html = ''
|
|
164
|
+
await _cerDataStore.run(null, async () => {
|
|
165
|
+
await _rawHandler(req, { setHeader: () => {}, end: (body) => { _html = body } })
|
|
166
|
+
})
|
|
167
|
+
// Inject DSD polyfill at end of <body>, outside any custom element light DOM.
|
|
168
|
+
const _final = _html.includes('</body>')
|
|
169
|
+
? _html.replace('</body>', DSD_POLYFILL_SCRIPT + '</body>')
|
|
170
|
+
: _html + DSD_POLYFILL_SCRIPT
|
|
171
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
|
172
|
+
return res.end(_final)
|
|
173
|
+
}
|
|
174
|
+
let _capturedHtml = ''
|
|
175
|
+
// Wrap _rawHandler in an isolated async-local-storage context so that
|
|
176
|
+
// vnodeFactory's enterWith() call is scoped to this request only.
|
|
177
|
+
await _cerDataStore.run(null, async () => {
|
|
178
|
+
// Omit write() to force the non-streaming collect-then-end code path.
|
|
179
|
+
await _rawHandler(req, { setHeader: () => {}, end: (body) => { _capturedHtml = body } })
|
|
180
|
+
})
|
|
181
|
+
let _merged = _mergeWithClientTemplate(_capturedHtml, _clientTemplate)
|
|
182
|
+
// Inject DSD polyfill at end of <body>, outside <cer-layout-view> light DOM.
|
|
183
|
+
_merged = _merged.includes('</body>')
|
|
184
|
+
? _merged.replace('</body>', DSD_POLYFILL_SCRIPT + '</body>')
|
|
185
|
+
: _merged + DSD_POLYFILL_SCRIPT
|
|
186
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
|
187
|
+
res.end(_merged)
|
|
188
|
+
}
|
|
68
189
|
|
|
69
190
|
export { apiRoutes, plugins, layouts, routes }
|
|
70
191
|
export default handler
|
package/tsconfig.build.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/plugin/path-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { fileToRoutePath, fileToTagName, fileToLayoutTagName, fileToLayoutName, fileToImportAlias, extractPluginOrder, sortPluginFiles, sortRoutes, isRouteDynamic, isRouteCatchAll, buildRouteEntry, } from '../../plugin/path-utils.js';
|
|
3
|
-
const PAGES = '/project/app/pages';
|
|
4
|
-
const LAYOUTS = '/project/app/layouts';
|
|
5
|
-
// ─── fileToRoutePath ────────────────────────────────────────────────────────
|
|
6
|
-
describe('fileToRoutePath', () => {
|
|
7
|
-
it('maps index.ts to /', () => {
|
|
8
|
-
expect(fileToRoutePath(`${PAGES}/index.ts`, PAGES)).toBe('/');
|
|
9
|
-
});
|
|
10
|
-
it('maps about.ts to /about', () => {
|
|
11
|
-
expect(fileToRoutePath(`${PAGES}/about.ts`, PAGES)).toBe('/about');
|
|
12
|
-
});
|
|
13
|
-
it('maps blog/index.ts to /blog', () => {
|
|
14
|
-
expect(fileToRoutePath(`${PAGES}/blog/index.ts`, PAGES)).toBe('/blog');
|
|
15
|
-
});
|
|
16
|
-
it('maps blog/[slug].ts to /blog/:slug', () => {
|
|
17
|
-
expect(fileToRoutePath(`${PAGES}/blog/[slug].ts`, PAGES)).toBe('/blog/:slug');
|
|
18
|
-
});
|
|
19
|
-
it('maps [...all].ts to /:all*', () => {
|
|
20
|
-
expect(fileToRoutePath(`${PAGES}/[...all].ts`, PAGES)).toBe('/:all*');
|
|
21
|
-
});
|
|
22
|
-
it('maps [...catchAll].ts to /:catchAll*', () => {
|
|
23
|
-
expect(fileToRoutePath(`${PAGES}/[...catchAll].ts`, PAGES)).toBe('/:catchAll*');
|
|
24
|
-
});
|
|
25
|
-
it('strips route group prefix: (auth)/login.ts → /login', () => {
|
|
26
|
-
expect(fileToRoutePath(`${PAGES}/(auth)/login.ts`, PAGES)).toBe('/login');
|
|
27
|
-
});
|
|
28
|
-
it('strips nested route group: (group)/sub/page.ts → /sub/page', () => {
|
|
29
|
-
expect(fileToRoutePath(`${PAGES}/(group)/sub/page.ts`, PAGES)).toBe('/sub/page');
|
|
30
|
-
});
|
|
31
|
-
it('maps [id]/edit.ts → /:id/edit', () => {
|
|
32
|
-
expect(fileToRoutePath(`${PAGES}/[id]/edit.ts`, PAGES)).toBe('/:id/edit');
|
|
33
|
-
});
|
|
34
|
-
it('maps users/[id]/posts/[postId].ts → /users/:id/posts/:postId', () => {
|
|
35
|
-
expect(fileToRoutePath(`${PAGES}/users/[id]/posts/[postId].ts`, PAGES)).toBe('/users/:id/posts/:postId');
|
|
36
|
-
});
|
|
37
|
-
it('normalizes double slashes from route group at root', () => {
|
|
38
|
-
expect(fileToRoutePath(`${PAGES}/(group)/index.ts`, PAGES)).toBe('/');
|
|
39
|
-
});
|
|
40
|
-
it('handles .js extension', () => {
|
|
41
|
-
expect(fileToRoutePath(`${PAGES}/about.js`, PAGES)).toBe('/about');
|
|
42
|
-
});
|
|
43
|
-
it('handles deeply nested static route', () => {
|
|
44
|
-
expect(fileToRoutePath(`${PAGES}/a/b/c.ts`, PAGES)).toBe('/a/b/c');
|
|
45
|
-
});
|
|
46
|
-
it('maps contact/index.ts to /contact (strips trailing index)', () => {
|
|
47
|
-
expect(fileToRoutePath(`${PAGES}/contact/index.ts`, PAGES)).toBe('/contact');
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
// ─── fileToTagName ───────────────────────────────────────────────────────────
|
|
51
|
-
describe('fileToTagName', () => {
|
|
52
|
-
it('maps index.ts to page-index', () => {
|
|
53
|
-
expect(fileToTagName(`${PAGES}/index.ts`, PAGES)).toBe('page-index');
|
|
54
|
-
});
|
|
55
|
-
it('maps about.ts to page-about', () => {
|
|
56
|
-
expect(fileToTagName(`${PAGES}/about.ts`, PAGES)).toBe('page-about');
|
|
57
|
-
});
|
|
58
|
-
it('maps blog/[slug].ts to page-blog-slug', () => {
|
|
59
|
-
expect(fileToTagName(`${PAGES}/blog/[slug].ts`, PAGES)).toBe('page-blog-slug');
|
|
60
|
-
});
|
|
61
|
-
it('maps [...all].ts to page-all (strips brackets and dots)', () => {
|
|
62
|
-
expect(fileToTagName(`${PAGES}/[...all].ts`, PAGES)).toBe('page-all');
|
|
63
|
-
});
|
|
64
|
-
it('strips route group from tag name', () => {
|
|
65
|
-
expect(fileToTagName(`${PAGES}/(auth)/login.ts`, PAGES)).toBe('page-login');
|
|
66
|
-
});
|
|
67
|
-
it('converts to lowercase', () => {
|
|
68
|
-
expect(fileToTagName(`${PAGES}/MyPage.ts`, PAGES)).toBe('page-mypage');
|
|
69
|
-
});
|
|
70
|
-
it('maps blog/index.ts to page-blog (strips index when other segments exist)', () => {
|
|
71
|
-
expect(fileToTagName(`${PAGES}/blog/index.ts`, PAGES)).toBe('page-blog');
|
|
72
|
-
});
|
|
73
|
-
it('maps items/index.ts to page-items', () => {
|
|
74
|
-
expect(fileToTagName(`${PAGES}/items/index.ts`, PAGES)).toBe('page-items');
|
|
75
|
-
});
|
|
76
|
-
it('maps [id]/detail.ts to page-id-detail', () => {
|
|
77
|
-
expect(fileToTagName(`${PAGES}/[id]/detail.ts`, PAGES)).toBe('page-id-detail');
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
// ─── fileToLayoutTagName ─────────────────────────────────────────────────────
|
|
81
|
-
describe('fileToLayoutTagName', () => {
|
|
82
|
-
it('maps default.ts to layout-default', () => {
|
|
83
|
-
expect(fileToLayoutTagName(`${LAYOUTS}/default.ts`, LAYOUTS)).toBe('layout-default');
|
|
84
|
-
});
|
|
85
|
-
it('maps minimal.ts to layout-minimal', () => {
|
|
86
|
-
expect(fileToLayoutTagName(`${LAYOUTS}/minimal.ts`, LAYOUTS)).toBe('layout-minimal');
|
|
87
|
-
});
|
|
88
|
-
it('maps blog/post.ts to layout-blog-post', () => {
|
|
89
|
-
expect(fileToLayoutTagName(`${LAYOUTS}/blog/post.ts`, LAYOUTS)).toBe('layout-blog-post');
|
|
90
|
-
});
|
|
91
|
-
it('converts to lowercase', () => {
|
|
92
|
-
expect(fileToLayoutTagName(`${LAYOUTS}/MyLayout.ts`, LAYOUTS)).toBe('layout-mylayout');
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
// ─── fileToLayoutName ────────────────────────────────────────────────────────
|
|
96
|
-
describe('fileToLayoutName', () => {
|
|
97
|
-
it('maps default.ts to default', () => {
|
|
98
|
-
expect(fileToLayoutName(`${LAYOUTS}/default.ts`, LAYOUTS)).toBe('default');
|
|
99
|
-
});
|
|
100
|
-
it('maps minimal.ts to minimal', () => {
|
|
101
|
-
expect(fileToLayoutName(`${LAYOUTS}/minimal.ts`, LAYOUTS)).toBe('minimal');
|
|
102
|
-
});
|
|
103
|
-
it('maps blog/post.ts to blog-post (slash → dash)', () => {
|
|
104
|
-
expect(fileToLayoutName(`${LAYOUTS}/blog/post.ts`, LAYOUTS)).toBe('blog-post');
|
|
105
|
-
});
|
|
106
|
-
it('converts to lowercase', () => {
|
|
107
|
-
expect(fileToLayoutName(`${LAYOUTS}/Admin.ts`, LAYOUTS)).toBe('admin');
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
// ─── fileToImportAlias ───────────────────────────────────────────────────────
|
|
111
|
-
describe('fileToImportAlias', () => {
|
|
112
|
-
it('creates _m_ prefixed alias by default', () => {
|
|
113
|
-
expect(fileToImportAlias('/project/app/composables/useTheme.ts')).toBe('_m_useTheme');
|
|
114
|
-
});
|
|
115
|
-
it('uses custom prefix', () => {
|
|
116
|
-
expect(fileToImportAlias('/project/store.ts', '_s')).toBe('_s_store');
|
|
117
|
-
});
|
|
118
|
-
it('replaces dashes with underscores', () => {
|
|
119
|
-
expect(fileToImportAlias('/project/my-util.ts')).toBe('_m_my_util');
|
|
120
|
-
});
|
|
121
|
-
it('prepends underscore for filenames starting with a digit', () => {
|
|
122
|
-
expect(fileToImportAlias('/project/01.store.ts')).toBe('_m__01_store');
|
|
123
|
-
});
|
|
124
|
-
it('replaces brackets in filename with underscores', () => {
|
|
125
|
-
expect(fileToImportAlias('/project/[slug].ts')).toBe('_m__slug_');
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
// ─── extractPluginOrder ──────────────────────────────────────────────────────
|
|
129
|
-
describe('extractPluginOrder', () => {
|
|
130
|
-
it('returns numeric prefix for 01.store.ts', () => {
|
|
131
|
-
expect(extractPluginOrder('01.store.ts')).toBe(1);
|
|
132
|
-
});
|
|
133
|
-
it('returns numeric prefix for 10.auth.ts', () => {
|
|
134
|
-
expect(extractPluginOrder('10.auth.ts')).toBe(10);
|
|
135
|
-
});
|
|
136
|
-
it('returns Infinity for files without numeric prefix', () => {
|
|
137
|
-
expect(extractPluginOrder('store.ts')).toBe(Infinity);
|
|
138
|
-
});
|
|
139
|
-
it('returns Infinity for files with a number but no trailing dot', () => {
|
|
140
|
-
expect(extractPluginOrder('1store.ts')).toBe(Infinity);
|
|
141
|
-
});
|
|
142
|
-
it('works with absolute paths (extracts basename first)', () => {
|
|
143
|
-
expect(extractPluginOrder('/project/app/plugins/01.store.ts')).toBe(1);
|
|
144
|
-
});
|
|
145
|
-
it('returns 0 for 00.first.ts', () => {
|
|
146
|
-
expect(extractPluginOrder('00.first.ts')).toBe(0);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
// ─── sortPluginFiles ─────────────────────────────────────────────────────────
|
|
150
|
-
describe('sortPluginFiles', () => {
|
|
151
|
-
it('sorts by numeric prefix ascending', () => {
|
|
152
|
-
const files = ['/p/03.c.ts', '/p/01.a.ts', '/p/02.b.ts'];
|
|
153
|
-
expect(sortPluginFiles(files)).toEqual(['/p/01.a.ts', '/p/02.b.ts', '/p/03.c.ts']);
|
|
154
|
-
});
|
|
155
|
-
it('places numbered files before unnumbered files', () => {
|
|
156
|
-
const files = ['/p/zzz.ts', '/p/01.first.ts'];
|
|
157
|
-
expect(sortPluginFiles(files)).toEqual(['/p/01.first.ts', '/p/zzz.ts']);
|
|
158
|
-
});
|
|
159
|
-
it('sorts unnumbered files alphabetically', () => {
|
|
160
|
-
const files = ['/p/zoo.ts', '/p/alpha.ts', '/p/beta.ts'];
|
|
161
|
-
expect(sortPluginFiles(files)).toEqual(['/p/alpha.ts', '/p/beta.ts', '/p/zoo.ts']);
|
|
162
|
-
});
|
|
163
|
-
it('does not mutate the original array', () => {
|
|
164
|
-
const files = ['/p/b.ts', '/p/a.ts'];
|
|
165
|
-
const copy = [...files];
|
|
166
|
-
sortPluginFiles(files);
|
|
167
|
-
expect(files).toEqual(copy);
|
|
168
|
-
});
|
|
169
|
-
it('returns empty array for empty input', () => {
|
|
170
|
-
expect(sortPluginFiles([])).toEqual([]);
|
|
171
|
-
});
|
|
172
|
-
it('handles single file', () => {
|
|
173
|
-
expect(sortPluginFiles(['/p/store.ts'])).toEqual(['/p/store.ts']);
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
// ─── isRouteDynamic ──────────────────────────────────────────────────────────
|
|
177
|
-
describe('isRouteDynamic', () => {
|
|
178
|
-
it('returns true for routes with :param', () => {
|
|
179
|
-
expect(isRouteDynamic('/blog/:slug')).toBe(true);
|
|
180
|
-
});
|
|
181
|
-
it('returns true for multiple params', () => {
|
|
182
|
-
expect(isRouteDynamic('/users/:id/posts/:postId')).toBe(true);
|
|
183
|
-
});
|
|
184
|
-
it('returns false for static routes', () => {
|
|
185
|
-
expect(isRouteDynamic('/about')).toBe(false);
|
|
186
|
-
});
|
|
187
|
-
it('returns false for root route', () => {
|
|
188
|
-
expect(isRouteDynamic('/')).toBe(false);
|
|
189
|
-
});
|
|
190
|
-
it('returns false for catch-all routes', () => {
|
|
191
|
-
expect(isRouteDynamic('/*')).toBe(false);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
// ─── isRouteCatchAll ─────────────────────────────────────────────────────────
|
|
195
|
-
describe('isRouteCatchAll', () => {
|
|
196
|
-
it('returns true for /* catch-all', () => {
|
|
197
|
-
expect(isRouteCatchAll('/*')).toBe(true);
|
|
198
|
-
});
|
|
199
|
-
it('returns false for static routes', () => {
|
|
200
|
-
expect(isRouteCatchAll('/about')).toBe(false);
|
|
201
|
-
});
|
|
202
|
-
it('returns false for dynamic routes', () => {
|
|
203
|
-
expect(isRouteCatchAll('/blog/:slug')).toBe(false);
|
|
204
|
-
});
|
|
205
|
-
it('returns false for root route', () => {
|
|
206
|
-
expect(isRouteCatchAll('/')).toBe(false);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
// ─── sortRoutes ──────────────────────────────────────────────────────────────
|
|
210
|
-
describe('sortRoutes', () => {
|
|
211
|
-
const makeRoute = (routePath) => ({
|
|
212
|
-
filePath: `/pages${routePath}.ts`,
|
|
213
|
-
routePath,
|
|
214
|
-
tagName: `page${routePath.replace(/[/:*]/g, '-')}`,
|
|
215
|
-
isDynamic: isRouteDynamic(routePath),
|
|
216
|
-
isCatchAll: isRouteCatchAll(routePath),
|
|
217
|
-
});
|
|
218
|
-
it('places static routes before dynamic routes', () => {
|
|
219
|
-
const routes = [makeRoute('/blog/:slug'), makeRoute('/about')];
|
|
220
|
-
const sorted = sortRoutes(routes);
|
|
221
|
-
expect(sorted[0].routePath).toBe('/about');
|
|
222
|
-
expect(sorted[1].routePath).toBe('/blog/:slug');
|
|
223
|
-
});
|
|
224
|
-
it('places dynamic routes before catch-all routes', () => {
|
|
225
|
-
const routes = [makeRoute('/*'), makeRoute('/blog/:slug')];
|
|
226
|
-
const sorted = sortRoutes(routes);
|
|
227
|
-
expect(sorted[0].routePath).toBe('/blog/:slug');
|
|
228
|
-
expect(sorted[1].routePath).toBe('/*');
|
|
229
|
-
});
|
|
230
|
-
it('places static routes before catch-all routes', () => {
|
|
231
|
-
const routes = [makeRoute('/*'), makeRoute('/about')];
|
|
232
|
-
const sorted = sortRoutes(routes);
|
|
233
|
-
expect(sorted[0].routePath).toBe('/about');
|
|
234
|
-
expect(sorted[1].routePath).toBe('/*');
|
|
235
|
-
});
|
|
236
|
-
it('sorts static routes alphabetically', () => {
|
|
237
|
-
const routes = [makeRoute('/zzz'), makeRoute('/aaa'), makeRoute('/mmm')];
|
|
238
|
-
const sorted = sortRoutes(routes);
|
|
239
|
-
expect(sorted.map((r) => r.routePath)).toEqual(['/aaa', '/mmm', '/zzz']);
|
|
240
|
-
});
|
|
241
|
-
it('does not mutate the original array', () => {
|
|
242
|
-
const routes = [makeRoute('/about'), makeRoute('/')];
|
|
243
|
-
const copy = [...routes];
|
|
244
|
-
sortRoutes(routes);
|
|
245
|
-
expect(routes).toEqual(copy);
|
|
246
|
-
});
|
|
247
|
-
it('handles all three tiers together', () => {
|
|
248
|
-
const routes = [
|
|
249
|
-
makeRoute('/*'),
|
|
250
|
-
makeRoute('/blog/:slug'),
|
|
251
|
-
makeRoute('/contact'),
|
|
252
|
-
makeRoute('/about'),
|
|
253
|
-
makeRoute('/:id'),
|
|
254
|
-
];
|
|
255
|
-
const sorted = sortRoutes(routes);
|
|
256
|
-
// Static first, alphabetically
|
|
257
|
-
expect(sorted[0].routePath).toBe('/about');
|
|
258
|
-
expect(sorted[1].routePath).toBe('/contact');
|
|
259
|
-
// Dynamic next, alphabetically — ':' (58) < 'b' (98), so /:id before /blog/:slug
|
|
260
|
-
expect(sorted[2].routePath).toBe('/:id');
|
|
261
|
-
expect(sorted[3].routePath).toBe('/blog/:slug');
|
|
262
|
-
// Catch-all last
|
|
263
|
-
expect(sorted[4].routePath).toBe('/*');
|
|
264
|
-
});
|
|
265
|
-
it('returns empty array for empty input', () => {
|
|
266
|
-
expect(sortRoutes([])).toEqual([]);
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
// ─── buildRouteEntry ─────────────────────────────────────────────────────────
|
|
270
|
-
describe('buildRouteEntry', () => {
|
|
271
|
-
it('builds a complete RouteEntry for a static page', () => {
|
|
272
|
-
const entry = buildRouteEntry(`${PAGES}/about.ts`, PAGES);
|
|
273
|
-
expect(entry).toEqual({
|
|
274
|
-
filePath: `${PAGES}/about.ts`,
|
|
275
|
-
routePath: '/about',
|
|
276
|
-
tagName: 'page-about',
|
|
277
|
-
isDynamic: false,
|
|
278
|
-
isCatchAll: false,
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
it('builds a complete RouteEntry for a dynamic page', () => {
|
|
282
|
-
const entry = buildRouteEntry(`${PAGES}/blog/[slug].ts`, PAGES);
|
|
283
|
-
expect(entry).toEqual({
|
|
284
|
-
filePath: `${PAGES}/blog/[slug].ts`,
|
|
285
|
-
routePath: '/blog/:slug',
|
|
286
|
-
tagName: 'page-blog-slug',
|
|
287
|
-
isDynamic: true,
|
|
288
|
-
isCatchAll: false,
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
it('marks catch-all routes correctly (isCatchAll=true, isDynamic=true)', () => {
|
|
292
|
-
const entry = buildRouteEntry(`${PAGES}/[...all].ts`, PAGES);
|
|
293
|
-
expect(entry.routePath).toBe('/:all*');
|
|
294
|
-
expect(entry.isCatchAll).toBe(true);
|
|
295
|
-
expect(entry.isDynamic).toBe(true);
|
|
296
|
-
});
|
|
297
|
-
it('handles index page', () => {
|
|
298
|
-
const entry = buildRouteEntry(`${PAGES}/index.ts`, PAGES);
|
|
299
|
-
expect(entry.routePath).toBe('/');
|
|
300
|
-
expect(entry.tagName).toBe('page-index');
|
|
301
|
-
expect(entry.isDynamic).toBe(false);
|
|
302
|
-
expect(entry.isCatchAll).toBe(false);
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
//# sourceMappingURL=path-utils.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.test.js","sourceRoot":"","sources":["../../../src/__tests__/plugin/path-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/plugin/scanner.test.ts"],"names":[],"mappings":""}
|