create-jen-app 1.2.1 → 1.2.3
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/README.md +3 -1
- package/dist/index.js +1 -6
- package/package.json +2 -2
- package/templates/static/.esbuild/jen.config.js +18 -0
- package/templates/static/README.md +63 -67
- package/templates/static/build.js +4 -6
- package/templates/static/jen.config.ts +3 -5
- package/templates/static/jenjs.d.ts +3 -3
- package/templates/static/lib/api/(hello).d.ts +5 -5
- package/templates/static/lib/api/(hello).js +7 -7
- package/templates/static/lib/auth/cookie-utils.d.ts +20 -11
- package/templates/static/lib/auth/cookie-utils.js +66 -69
- package/templates/static/lib/auth/jwt.d.ts +28 -0
- package/templates/static/lib/auth/jwt.js +50 -6
- package/templates/static/lib/auth/session.d.ts +34 -34
- package/templates/static/lib/auth/session.js +79 -81
- package/templates/static/lib/build/asset-hashing.js +4 -4
- package/templates/static/lib/build/asset-manifest.js +4 -4
- package/templates/static/lib/build/build.d.ts +20 -0
- package/templates/static/lib/build/build.js +43 -6
- package/templates/static/lib/build/island-hydration.js +2 -2
- package/templates/static/lib/build/minifier.js +12 -12
- package/templates/static/lib/build/page-renderer.d.ts +2 -2
- package/templates/static/lib/build/page-renderer.js +3 -3
- package/templates/static/lib/build/production-build.d.ts +1 -1
- package/templates/static/lib/build/production-build.js +4 -4
- package/templates/static/lib/build/ssg-pipeline.d.ts +1 -1
- package/templates/static/lib/build/ssg-pipeline.js +19 -19
- package/templates/static/lib/build-tools/build-site.d.ts +3 -3
- package/templates/static/lib/build-tools/build-site.js +27 -30
- package/templates/static/lib/cache/index.d.ts +8 -0
- package/templates/static/lib/cache/index.js +8 -0
- package/templates/static/lib/cache/memory.d.ts +31 -4
- package/templates/static/lib/cache/memory.js +38 -12
- package/templates/static/lib/cache/redis.d.ts +43 -4
- package/templates/static/lib/cache/redis.js +59 -14
- package/templates/static/lib/cli/banner.d.ts +5 -1
- package/templates/static/lib/cli/banner.js +18 -14
- package/templates/static/lib/cli/templates/ssg/jen.config.js +29 -29
- package/templates/static/lib/cli/templates/ssg/site/index.js +6 -1
- package/templates/static/lib/cli/templates/ssr/jen.config.js +29 -29
- package/templates/static/lib/cli/templates/ssr/site/index.js +6 -1
- package/templates/static/lib/compilers/esbuild-plugins.js +96 -98
- package/templates/static/lib/compilers/svelte.d.ts +10 -10
- package/templates/static/lib/compilers/svelte.js +31 -31
- package/templates/static/lib/compilers/vue.d.ts +8 -8
- package/templates/static/lib/compilers/vue.js +76 -68
- package/templates/static/lib/core/config.d.ts +217 -50
- package/templates/static/lib/core/http.d.ts +55 -2
- package/templates/static/lib/core/http.js +66 -20
- package/templates/static/lib/core/middleware-hooks.d.ts +204 -31
- package/templates/static/lib/core/middleware-hooks.js +86 -41
- package/templates/static/lib/core/paths.d.ts +42 -4
- package/templates/static/lib/core/paths.js +34 -2
- package/templates/static/lib/core/routes/match.d.ts +51 -3
- package/templates/static/lib/core/routes/match.js +44 -11
- package/templates/static/lib/core/routes/scan.d.ts +49 -5
- package/templates/static/lib/core/routes/scan.js +174 -115
- package/templates/static/lib/core/types.d.ts +148 -13
- package/templates/static/lib/css/compiler.d.ts +16 -13
- package/templates/static/lib/css/compiler.js +62 -58
- package/templates/static/lib/db/connector.d.ts +27 -1
- package/templates/static/lib/db/connector.js +37 -11
- package/templates/static/lib/db/drivers/jdb.d.ts +13 -9
- package/templates/static/lib/db/drivers/jdb.js +41 -39
- package/templates/static/lib/db/drivers/sql.d.ts +16 -12
- package/templates/static/lib/db/drivers/sql.js +152 -135
- package/templates/static/lib/db/index.d.ts +20 -12
- package/templates/static/lib/db/index.js +41 -41
- package/templates/static/lib/db/types.d.ts +22 -18
- package/templates/static/lib/graphql/index.d.ts +47 -0
- package/templates/static/lib/graphql/index.js +50 -3
- package/templates/static/lib/graphql/resolvers.d.ts +51 -11
- package/templates/static/lib/graphql/resolvers.js +22 -6
- package/templates/static/lib/graphql/schema.d.ts +34 -0
- package/templates/static/lib/graphql/schema.js +34 -2
- package/templates/static/lib/i18n/en.json +2 -2
- package/templates/static/lib/i18n/es.json +2 -2
- package/templates/static/lib/i18n/index.d.ts +4 -4
- package/templates/static/lib/i18n/index.js +10 -10
- package/templates/static/lib/import/jen-import.d.ts +39 -10
- package/templates/static/lib/import/jen-import.js +130 -80
- package/templates/static/lib/index.d.ts +42 -11
- package/templates/static/lib/index.js +21 -8
- package/templates/static/lib/jdb/engine.d.ts +35 -6
- package/templates/static/lib/jdb/engine.js +260 -144
- package/templates/static/lib/jdb/index.d.ts +32 -0
- package/templates/static/lib/jdb/index.js +32 -0
- package/templates/static/lib/jdb/types.d.ts +212 -30
- package/templates/static/lib/jdb/utils.d.ts +60 -0
- package/templates/static/lib/jdb/utils.js +159 -107
- package/templates/static/lib/middleware/builtins/body-parser.d.ts +15 -0
- package/templates/static/lib/middleware/builtins/body-parser.js +53 -35
- package/templates/static/lib/middleware/builtins/cors.d.ts +8 -6
- package/templates/static/lib/middleware/builtins/cors.js +52 -48
- package/templates/static/lib/middleware/builtins/logger.d.ts +18 -0
- package/templates/static/lib/middleware/builtins/logger.js +31 -13
- package/templates/static/lib/middleware/builtins/rate-limit.d.ts +19 -2
- package/templates/static/lib/middleware/builtins/rate-limit.js +75 -55
- package/templates/static/lib/middleware/builtins/request-id.d.ts +18 -0
- package/templates/static/lib/middleware/builtins/request-id.js +26 -5
- package/templates/static/lib/middleware/builtins/security-headers.d.ts +18 -0
- package/templates/static/lib/middleware/builtins/security-headers.js +51 -20
- package/templates/static/lib/middleware/context.d.ts +102 -15
- package/templates/static/lib/middleware/context.js +121 -30
- package/templates/static/lib/middleware/decorators.d.ts +18 -1
- package/templates/static/lib/middleware/decorators.js +83 -34
- package/templates/static/lib/middleware/errors/handler.js +22 -24
- package/templates/static/lib/middleware/errors/http-error.d.ts +3 -3
- package/templates/static/lib/middleware/errors/http-error.js +8 -8
- package/templates/static/lib/middleware/kernel.d.ts +67 -4
- package/templates/static/lib/middleware/kernel.js +80 -17
- package/templates/static/lib/middleware/pipeline.d.ts +51 -2
- package/templates/static/lib/middleware/pipeline.js +143 -45
- package/templates/static/lib/middleware/registry.d.ts +67 -8
- package/templates/static/lib/middleware/registry.js +83 -22
- package/templates/static/lib/middleware/response.d.ts +73 -11
- package/templates/static/lib/middleware/response.js +104 -40
- package/templates/static/lib/middleware/utils/matcher.js +11 -12
- package/templates/static/lib/native/bundle.d.ts +13 -8
- package/templates/static/lib/native/bundle.js +14 -14
- package/templates/static/lib/native/dev-server.d.ts +11 -4
- package/templates/static/lib/native/dev-server.js +14 -12
- package/templates/static/lib/native/index.d.ts +20 -20
- package/templates/static/lib/native/index.js +23 -21
- package/templates/static/lib/native/optimizer.d.ts +14 -10
- package/templates/static/lib/native/optimizer.js +14 -14
- package/templates/static/lib/native/style-compiler.d.ts +17 -8
- package/templates/static/lib/native/style-compiler.js +9 -9
- package/templates/static/lib/plugin/loader.d.ts +8 -6
- package/templates/static/lib/plugin/loader.js +25 -31
- package/templates/static/lib/runtime/client-runtime.d.ts +15 -0
- package/templates/static/lib/runtime/client-runtime.js +23 -9
- package/templates/static/lib/runtime/hmr.d.ts +23 -1
- package/templates/static/lib/runtime/hmr.js +27 -5
- package/templates/static/lib/runtime/hydrate.d.ts +17 -0
- package/templates/static/lib/runtime/hydrate.js +48 -21
- package/templates/static/lib/runtime/island-hydration-client.d.ts +5 -2
- package/templates/static/lib/runtime/island-hydration-client.js +122 -91
- package/templates/static/lib/runtime/islands.d.ts +82 -27
- package/templates/static/lib/runtime/islands.js +92 -54
- package/templates/static/lib/runtime/render.d.ts +36 -9
- package/templates/static/lib/runtime/render.js +208 -130
- package/templates/static/lib/server/api-routes.d.ts +96 -28
- package/templates/static/lib/server/api-routes.js +214 -156
- package/templates/static/lib/server/api.d.ts +3 -3
- package/templates/static/lib/server/api.js +93 -92
- package/templates/static/lib/server/app.d.ts +37 -3
- package/templates/static/lib/server/app.js +328 -254
- package/templates/static/lib/server/runtimeServe.d.ts +56 -0
- package/templates/static/lib/server/runtimeServe.js +130 -69
- package/templates/static/lib/server/ssr.d.ts +161 -0
- package/templates/static/lib/server/ssr.js +219 -0
- package/templates/static/lib/shared/log.d.ts +47 -3
- package/templates/static/lib/shared/log.js +60 -10
- package/templates/static/package.json +5 -1
- package/templates/static/server.js +4 -6
- package/templates/static/site/(home).tsx +30 -12
- package/templates/static/site/styles/global.scss +89 -78
- package/templates/static/tsconfig.json +39 -39
- package/templates/static/node_modules/.bin/esbuild +0 -16
- package/templates/static/node_modules/.bin/esbuild.cmd +0 -17
- package/templates/static/node_modules/.bin/esbuild.ps1 +0 -28
- package/templates/static/node_modules/.bin/tsc +0 -16
- package/templates/static/node_modules/.bin/tsc.cmd +0 -17
- package/templates/static/node_modules/.bin/tsc.ps1 +0 -28
- package/templates/static/node_modules/.bin/tsserver +0 -16
- package/templates/static/node_modules/.bin/tsserver.cmd +0 -17
- package/templates/static/node_modules/.bin/tsserver.ps1 +0 -28
- package/templates/static/node_modules/.jen/cache/B__Jen.js_packages_create-jen-app_templates_static_site_(home).tsx.mjs +0 -14
- package/templates/static/node_modules/.jen/cache/B__Jen.js_packages_create-jen-app_yo_site_(home).tsx.mjs +0 -11
- package/templates/static/node_modules/.package-lock.json +0 -585
- package/templates/static/node_modules/@esbuild/win32-x64/README.md +0 -3
- package/templates/static/node_modules/@esbuild/win32-x64/esbuild.exe +0 -0
- package/templates/static/node_modules/@esbuild/win32-x64/package.json +0 -20
- package/templates/static/node_modules/@jenjs/master/README.md +0 -24
- package/templates/static/node_modules/@jenjs/master/index.js +0 -3655
- package/templates/static/node_modules/@jenjs/master/package.json +0 -36
- package/templates/static/node_modules/@polka/url/build.js +0 -49
- package/templates/static/node_modules/@polka/url/build.mjs +0 -47
- package/templates/static/node_modules/@polka/url/index.d.ts +0 -11
- package/templates/static/node_modules/@polka/url/package.json +0 -30
- package/templates/static/node_modules/@polka/url/readme.md +0 -68
- package/templates/static/node_modules/@types/node/LICENSE +0 -21
- package/templates/static/node_modules/@types/node/README.md +0 -15
- package/templates/static/node_modules/@types/node/assert/strict.d.ts +0 -111
- package/templates/static/node_modules/@types/node/assert.d.ts +0 -1078
- package/templates/static/node_modules/@types/node/async_hooks.d.ts +0 -603
- package/templates/static/node_modules/@types/node/buffer.buffer.d.ts +0 -472
- package/templates/static/node_modules/@types/node/buffer.d.ts +0 -1934
- package/templates/static/node_modules/@types/node/child_process.d.ts +0 -1476
- package/templates/static/node_modules/@types/node/cluster.d.ts +0 -578
- package/templates/static/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
- package/templates/static/node_modules/@types/node/compatibility/index.d.ts +0 -9
- package/templates/static/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
- package/templates/static/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
- package/templates/static/node_modules/@types/node/console.d.ts +0 -452
- package/templates/static/node_modules/@types/node/constants.d.ts +0 -21
- package/templates/static/node_modules/@types/node/crypto.d.ts +0 -4545
- package/templates/static/node_modules/@types/node/dgram.d.ts +0 -600
- package/templates/static/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
- package/templates/static/node_modules/@types/node/dns/promises.d.ts +0 -503
- package/templates/static/node_modules/@types/node/dns.d.ts +0 -923
- package/templates/static/node_modules/@types/node/domain.d.ts +0 -170
- package/templates/static/node_modules/@types/node/events.d.ts +0 -976
- package/templates/static/node_modules/@types/node/fs/promises.d.ts +0 -1295
- package/templates/static/node_modules/@types/node/fs.d.ts +0 -4461
- package/templates/static/node_modules/@types/node/globals.d.ts +0 -172
- package/templates/static/node_modules/@types/node/globals.typedarray.d.ts +0 -38
- package/templates/static/node_modules/@types/node/http.d.ts +0 -2089
- package/templates/static/node_modules/@types/node/http2.d.ts +0 -2644
- package/templates/static/node_modules/@types/node/https.d.ts +0 -579
- package/templates/static/node_modules/@types/node/index.d.ts +0 -97
- package/templates/static/node_modules/@types/node/inspector.d.ts +0 -253
- package/templates/static/node_modules/@types/node/inspector.generated.d.ts +0 -4052
- package/templates/static/node_modules/@types/node/module.d.ts +0 -891
- package/templates/static/node_modules/@types/node/net.d.ts +0 -1057
- package/templates/static/node_modules/@types/node/os.d.ts +0 -506
- package/templates/static/node_modules/@types/node/package.json +0 -145
- package/templates/static/node_modules/@types/node/path.d.ts +0 -200
- package/templates/static/node_modules/@types/node/perf_hooks.d.ts +0 -968
- package/templates/static/node_modules/@types/node/process.d.ts +0 -2089
- package/templates/static/node_modules/@types/node/punycode.d.ts +0 -117
- package/templates/static/node_modules/@types/node/querystring.d.ts +0 -152
- package/templates/static/node_modules/@types/node/readline/promises.d.ts +0 -161
- package/templates/static/node_modules/@types/node/readline.d.ts +0 -594
- package/templates/static/node_modules/@types/node/repl.d.ts +0 -428
- package/templates/static/node_modules/@types/node/sea.d.ts +0 -153
- package/templates/static/node_modules/@types/node/sqlite.d.ts +0 -721
- package/templates/static/node_modules/@types/node/stream/consumers.d.ts +0 -38
- package/templates/static/node_modules/@types/node/stream/promises.d.ts +0 -90
- package/templates/static/node_modules/@types/node/stream/web.d.ts +0 -622
- package/templates/static/node_modules/@types/node/stream.d.ts +0 -1664
- package/templates/static/node_modules/@types/node/string_decoder.d.ts +0 -67
- package/templates/static/node_modules/@types/node/test.d.ts +0 -2163
- package/templates/static/node_modules/@types/node/timers/promises.d.ts +0 -108
- package/templates/static/node_modules/@types/node/timers.d.ts +0 -287
- package/templates/static/node_modules/@types/node/tls.d.ts +0 -1319
- package/templates/static/node_modules/@types/node/trace_events.d.ts +0 -197
- package/templates/static/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
- package/templates/static/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
- package/templates/static/node_modules/@types/node/ts5.6/index.d.ts +0 -97
- package/templates/static/node_modules/@types/node/tty.d.ts +0 -208
- package/templates/static/node_modules/@types/node/url.d.ts +0 -984
- package/templates/static/node_modules/@types/node/util.d.ts +0 -2606
- package/templates/static/node_modules/@types/node/v8.d.ts +0 -920
- package/templates/static/node_modules/@types/node/vm.d.ts +0 -1000
- package/templates/static/node_modules/@types/node/wasi.d.ts +0 -181
- package/templates/static/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
- package/templates/static/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
- package/templates/static/node_modules/@types/node/web-globals/events.d.ts +0 -97
- package/templates/static/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
- package/templates/static/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
- package/templates/static/node_modules/@types/node/web-globals/storage.d.ts +0 -24
- package/templates/static/node_modules/@types/node/worker_threads.d.ts +0 -784
- package/templates/static/node_modules/@types/node/zlib.d.ts +0 -683
- package/templates/static/node_modules/esbuild/LICENSE.md +0 -21
- package/templates/static/node_modules/esbuild/README.md +0 -3
- package/templates/static/node_modules/esbuild/bin/esbuild +0 -223
- package/templates/static/node_modules/esbuild/install.js +0 -289
- package/templates/static/node_modules/esbuild/lib/main.d.ts +0 -716
- package/templates/static/node_modules/esbuild/lib/main.js +0 -2242
- package/templates/static/node_modules/esbuild/package.json +0 -49
- package/templates/static/node_modules/mrmime/index.d.ts +0 -2
- package/templates/static/node_modules/mrmime/index.js +0 -449
- package/templates/static/node_modules/mrmime/index.mjs +0 -448
- package/templates/static/node_modules/mrmime/license +0 -21
- package/templates/static/node_modules/mrmime/package.json +0 -44
- package/templates/static/node_modules/mrmime/readme.md +0 -130
- package/templates/static/node_modules/preact/LICENSE +0 -21
- package/templates/static/node_modules/preact/README.md +0 -185
- package/templates/static/node_modules/preact/compat/client.d.ts +0 -13
- package/templates/static/node_modules/preact/compat/client.js +0 -21
- package/templates/static/node_modules/preact/compat/client.mjs +0 -24
- package/templates/static/node_modules/preact/compat/dist/compat.js +0 -2
- package/templates/static/node_modules/preact/compat/dist/compat.js.map +0 -1
- package/templates/static/node_modules/preact/compat/dist/compat.mjs +0 -2
- package/templates/static/node_modules/preact/compat/dist/compat.module.js +0 -2
- package/templates/static/node_modules/preact/compat/dist/compat.module.js.map +0 -1
- package/templates/static/node_modules/preact/compat/dist/compat.umd.js +0 -2
- package/templates/static/node_modules/preact/compat/dist/compat.umd.js.map +0 -1
- package/templates/static/node_modules/preact/compat/jsx-dev-runtime.js +0 -3
- package/templates/static/node_modules/preact/compat/jsx-dev-runtime.mjs +0 -3
- package/templates/static/node_modules/preact/compat/jsx-runtime.js +0 -3
- package/templates/static/node_modules/preact/compat/jsx-runtime.mjs +0 -3
- package/templates/static/node_modules/preact/compat/package.json +0 -55
- package/templates/static/node_modules/preact/compat/scheduler.js +0 -15
- package/templates/static/node_modules/preact/compat/scheduler.mjs +0 -23
- package/templates/static/node_modules/preact/compat/server.browser.js +0 -11
- package/templates/static/node_modules/preact/compat/server.js +0 -36
- package/templates/static/node_modules/preact/compat/server.mjs +0 -17
- package/templates/static/node_modules/preact/compat/src/Children.js +0 -21
- package/templates/static/node_modules/preact/compat/src/PureComponent.js +0 -16
- package/templates/static/node_modules/preact/compat/src/forwardRef.js +0 -44
- package/templates/static/node_modules/preact/compat/src/hooks.js +0 -70
- package/templates/static/node_modules/preact/compat/src/index.d.ts +0 -351
- package/templates/static/node_modules/preact/compat/src/index.js +0 -238
- package/templates/static/node_modules/preact/compat/src/internal.d.ts +0 -48
- package/templates/static/node_modules/preact/compat/src/memo.js +0 -35
- package/templates/static/node_modules/preact/compat/src/portals.js +0 -78
- package/templates/static/node_modules/preact/compat/src/render.js +0 -313
- package/templates/static/node_modules/preact/compat/src/suspense-list.d.ts +0 -16
- package/templates/static/node_modules/preact/compat/src/suspense-list.js +0 -127
- package/templates/static/node_modules/preact/compat/src/suspense.d.ts +0 -19
- package/templates/static/node_modules/preact/compat/src/suspense.js +0 -291
- package/templates/static/node_modules/preact/compat/src/util.js +0 -33
- package/templates/static/node_modules/preact/compat/test-utils.js +0 -1
- package/templates/static/node_modules/preact/compat/test-utils.mjs +0 -1
- package/templates/static/node_modules/preact/debug/dist/debug.js +0 -2
- package/templates/static/node_modules/preact/debug/dist/debug.js.map +0 -1
- package/templates/static/node_modules/preact/debug/dist/debug.mjs +0 -2
- package/templates/static/node_modules/preact/debug/dist/debug.module.js +0 -2
- package/templates/static/node_modules/preact/debug/dist/debug.module.js.map +0 -1
- package/templates/static/node_modules/preact/debug/dist/debug.umd.js +0 -2
- package/templates/static/node_modules/preact/debug/dist/debug.umd.js.map +0 -1
- package/templates/static/node_modules/preact/debug/package.json +0 -27
- package/templates/static/node_modules/preact/debug/src/check-props.js +0 -54
- package/templates/static/node_modules/preact/debug/src/component-stack.js +0 -146
- package/templates/static/node_modules/preact/debug/src/constants.js +0 -3
- package/templates/static/node_modules/preact/debug/src/debug.js +0 -593
- package/templates/static/node_modules/preact/debug/src/index.d.ts +0 -23
- package/templates/static/node_modules/preact/debug/src/index.js +0 -12
- package/templates/static/node_modules/preact/debug/src/internal.d.ts +0 -82
- package/templates/static/node_modules/preact/debug/src/util.js +0 -15
- package/templates/static/node_modules/preact/devtools/dist/devtools.js +0 -2
- package/templates/static/node_modules/preact/devtools/dist/devtools.js.map +0 -1
- package/templates/static/node_modules/preact/devtools/dist/devtools.mjs +0 -2
- package/templates/static/node_modules/preact/devtools/dist/devtools.module.js +0 -2
- package/templates/static/node_modules/preact/devtools/dist/devtools.module.js.map +0 -1
- package/templates/static/node_modules/preact/devtools/dist/devtools.umd.js +0 -2
- package/templates/static/node_modules/preact/devtools/dist/devtools.umd.js.map +0 -1
- package/templates/static/node_modules/preact/devtools/package.json +0 -25
- package/templates/static/node_modules/preact/devtools/src/devtools.js +0 -21
- package/templates/static/node_modules/preact/devtools/src/index.d.ts +0 -8
- package/templates/static/node_modules/preact/devtools/src/index.js +0 -15
- package/templates/static/node_modules/preact/dist/preact.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.js.map +0 -1
- package/templates/static/node_modules/preact/dist/preact.min.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.min.js.map +0 -1
- package/templates/static/node_modules/preact/dist/preact.min.module.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.min.module.js.map +0 -1
- package/templates/static/node_modules/preact/dist/preact.min.umd.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.min.umd.js.map +0 -1
- package/templates/static/node_modules/preact/dist/preact.mjs +0 -2
- package/templates/static/node_modules/preact/dist/preact.module.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.module.js.map +0 -1
- package/templates/static/node_modules/preact/dist/preact.umd.js +0 -2
- package/templates/static/node_modules/preact/dist/preact.umd.js.map +0 -1
- package/templates/static/node_modules/preact/hooks/dist/hooks.js +0 -2
- package/templates/static/node_modules/preact/hooks/dist/hooks.js.map +0 -1
- package/templates/static/node_modules/preact/hooks/dist/hooks.mjs +0 -2
- package/templates/static/node_modules/preact/hooks/dist/hooks.module.js +0 -2
- package/templates/static/node_modules/preact/hooks/dist/hooks.module.js.map +0 -1
- package/templates/static/node_modules/preact/hooks/dist/hooks.umd.js +0 -2
- package/templates/static/node_modules/preact/hooks/dist/hooks.umd.js.map +0 -1
- package/templates/static/node_modules/preact/hooks/package.json +0 -35
- package/templates/static/node_modules/preact/hooks/src/index.d.ts +0 -145
- package/templates/static/node_modules/preact/hooks/src/index.js +0 -555
- package/templates/static/node_modules/preact/hooks/src/internal.d.ts +0 -103
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.js +0 -2
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.js.map +0 -1
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs +0 -2
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js +0 -2
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js.map +0 -1
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js +0 -2
- package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js.map +0 -1
- package/templates/static/node_modules/preact/jsx-runtime/package.json +0 -28
- package/templates/static/node_modules/preact/jsx-runtime/src/index.d.ts +0 -62
- package/templates/static/node_modules/preact/jsx-runtime/src/index.js +0 -206
- package/templates/static/node_modules/preact/jsx-runtime/src/utils.js +0 -36
- package/templates/static/node_modules/preact/package.json +0 -258
- package/templates/static/node_modules/preact/src/cjs.js +0 -3
- package/templates/static/node_modules/preact/src/clone-element.js +0 -48
- package/templates/static/node_modules/preact/src/component.js +0 -249
- package/templates/static/node_modules/preact/src/constants.js +0 -22
- package/templates/static/node_modules/preact/src/create-context.js +0 -60
- package/templates/static/node_modules/preact/src/create-element.js +0 -97
- package/templates/static/node_modules/preact/src/diff/catch-error.js +0 -46
- package/templates/static/node_modules/preact/src/diff/children.js +0 -451
- package/templates/static/node_modules/preact/src/diff/index.js +0 -684
- package/templates/static/node_modules/preact/src/diff/props.js +0 -173
- package/templates/static/node_modules/preact/src/dom.d.ts +0 -2476
- package/templates/static/node_modules/preact/src/index-5.d.ts +0 -399
- package/templates/static/node_modules/preact/src/index.d.ts +0 -402
- package/templates/static/node_modules/preact/src/index.js +0 -13
- package/templates/static/node_modules/preact/src/internal.d.ts +0 -190
- package/templates/static/node_modules/preact/src/jsx.d.ts +0 -2878
- package/templates/static/node_modules/preact/src/options.js +0 -16
- package/templates/static/node_modules/preact/src/render.js +0 -78
- package/templates/static/node_modules/preact/src/util.js +0 -28
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.js +0 -2
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.js.map +0 -1
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.mjs +0 -2
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.module.js +0 -2
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.module.js.map +0 -1
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.umd.js +0 -2
- package/templates/static/node_modules/preact/test-utils/dist/testUtils.umd.js.map +0 -1
- package/templates/static/node_modules/preact/test-utils/package.json +0 -28
- package/templates/static/node_modules/preact/test-utils/src/index.d.ts +0 -3
- package/templates/static/node_modules/preact/test-utils/src/index.js +0 -129
- package/templates/static/node_modules/preact-render-to-string/LICENSE +0 -21
- package/templates/static/node_modules/preact-render-to-string/README.md +0 -149
- package/templates/static/node_modules/preact-render-to-string/dist/commonjs.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/index.d.ts +0 -17
- package/templates/static/node_modules/preact-render-to-string/dist/index.js +0 -6
- package/templates/static/node_modules/preact-render-to-string/dist/index.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/index.mjs +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/index.module.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/index.module.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/index.umd.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/index.umd.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/internal.d.ts +0 -35
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/commonjs.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.js +0 -4
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.mjs +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.module.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.module.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.umd.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.umd.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/jsx.d.ts +0 -24
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.mjs +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.module.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.module.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.umd.js +0 -2
- package/templates/static/node_modules/preact-render-to-string/dist/stream/index.umd.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.js +0 -884
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.mjs +0 -884
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.module.js +0 -884
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.module.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.umd.js +0 -888
- package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.umd.js.map +0 -1
- package/templates/static/node_modules/preact-render-to-string/dist/stream-node.d.ts +0 -19
- package/templates/static/node_modules/preact-render-to-string/dist/stream.d.ts +0 -10
- package/templates/static/node_modules/preact-render-to-string/jsx.d.ts +0 -24
- package/templates/static/node_modules/preact-render-to-string/jsx.js +0 -1
- package/templates/static/node_modules/preact-render-to-string/package.json +0 -152
- package/templates/static/node_modules/preact-render-to-string/src/index.d.ts +0 -17
- package/templates/static/node_modules/preact-render-to-string/src/index.js +0 -764
- package/templates/static/node_modules/preact-render-to-string/src/internal.d.ts +0 -35
- package/templates/static/node_modules/preact-render-to-string/src/jsx.d.ts +0 -24
- package/templates/static/node_modules/preact-render-to-string/src/jsx.js +0 -102
- package/templates/static/node_modules/preact-render-to-string/src/lib/chunked.js +0 -97
- package/templates/static/node_modules/preact-render-to-string/src/lib/client.js +0 -62
- package/templates/static/node_modules/preact-render-to-string/src/lib/constants.js +0 -20
- package/templates/static/node_modules/preact-render-to-string/src/lib/polyfills.js +0 -8
- package/templates/static/node_modules/preact-render-to-string/src/lib/util.js +0 -208
- package/templates/static/node_modules/preact-render-to-string/src/pretty.js +0 -491
- package/templates/static/node_modules/preact-render-to-string/src/stream-node.d.ts +0 -19
- package/templates/static/node_modules/preact-render-to-string/src/stream-node.js +0 -84
- package/templates/static/node_modules/preact-render-to-string/src/stream.d.ts +0 -10
- package/templates/static/node_modules/preact-render-to-string/src/stream.js +0 -43
- package/templates/static/node_modules/preact-render-to-string/typings.json +0 -5
- package/templates/static/node_modules/sirv/build.js +0 -197
- package/templates/static/node_modules/sirv/build.mjs +0 -197
- package/templates/static/node_modules/sirv/index.d.mts +0 -29
- package/templates/static/node_modules/sirv/index.d.ts +0 -33
- package/templates/static/node_modules/sirv/package.json +0 -40
- package/templates/static/node_modules/sirv/readme.md +0 -238
- package/templates/static/node_modules/totalist/dist/index.js +0 -24
- package/templates/static/node_modules/totalist/dist/index.mjs +0 -22
- package/templates/static/node_modules/totalist/index.d.ts +0 -3
- package/templates/static/node_modules/totalist/license +0 -21
- package/templates/static/node_modules/totalist/package.json +0 -55
- package/templates/static/node_modules/totalist/readme.md +0 -109
- package/templates/static/node_modules/totalist/sync/index.d.ts +0 -3
- package/templates/static/node_modules/totalist/sync/index.js +0 -17
- package/templates/static/node_modules/totalist/sync/index.mjs +0 -15
- package/templates/static/node_modules/typescript/bin/tsc +0 -2
- package/templates/static/node_modules/typescript/bin/tsserver +0 -2
- package/templates/static/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/lib.d.ts +0 -22
- package/templates/static/node_modules/typescript/lib/lib.decorators.d.ts +0 -384
- package/templates/static/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -22
- package/templates/static/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -41
- package/templates/static/node_modules/typescript/lib/lib.dom.d.ts +0 -39429
- package/templates/static/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -571
- package/templates/static/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -147
- package/templates/static/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -597
- package/templates/static/node_modules/typescript/lib/lib.es2015.d.ts +0 -28
- package/templates/static/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -77
- package/templates/static/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -605
- package/templates/static/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -81
- package/templates/static/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -128
- package/templates/static/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -144
- package/templates/static/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -46
- package/templates/static/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -326
- package/templates/static/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -116
- package/templates/static/node_modules/typescript/lib/lib.es2016.d.ts +0 -21
- package/templates/static/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -31
- package/templates/static/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -21
- package/templates/static/node_modules/typescript/lib/lib.es2017.d.ts +0 -26
- package/templates/static/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -31
- package/templates/static/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -44
- package/templates/static/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -49
- package/templates/static/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -135
- package/templates/static/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -45
- package/templates/static/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -53
- package/templates/static/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -77
- package/templates/static/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -53
- package/templates/static/node_modules/typescript/lib/lib.es2018.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -83
- package/templates/static/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -30
- package/templates/static/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -37
- package/templates/static/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -79
- package/templates/static/node_modules/typescript/lib/lib.es2019.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -33
- package/templates/static/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -37
- package/templates/static/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -765
- package/templates/static/node_modules/typescript/lib/lib.es2020.d.ts +0 -27
- package/templates/static/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -42
- package/templates/static/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -474
- package/templates/static/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -28
- package/templates/static/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -47
- package/templates/static/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -99
- package/templates/static/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -44
- package/templates/static/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -41
- package/templates/static/node_modules/typescript/lib/lib.es2021.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -166
- package/templates/static/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -48
- package/templates/static/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -33
- package/templates/static/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -78
- package/templates/static/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -121
- package/templates/static/node_modules/typescript/lib/lib.es2022.d.ts +0 -25
- package/templates/static/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -75
- package/templates/static/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -145
- package/templates/static/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -26
- package/templates/static/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -39
- package/templates/static/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -25
- package/templates/static/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -924
- package/templates/static/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -21
- package/templates/static/node_modules/typescript/lib/lib.es2023.d.ts +0 -22
- package/templates/static/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -56
- package/templates/static/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -65
- package/templates/static/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -29
- package/templates/static/node_modules/typescript/lib/lib.es2024.d.ts +0 -26
- package/templates/static/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -29
- package/templates/static/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -35
- package/templates/static/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -25
- package/templates/static/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -68
- package/templates/static/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -29
- package/templates/static/node_modules/typescript/lib/lib.es5.d.ts +0 -4601
- package/templates/static/node_modules/typescript/lib/lib.es6.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -35
- package/templates/static/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -96
- package/templates/static/node_modules/typescript/lib/lib.esnext.d.ts +0 -29
- package/templates/static/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -28
- package/templates/static/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -193
- package/templates/static/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -445
- package/templates/static/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -24
- package/templates/static/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -21
- package/templates/static/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -148
- package/templates/static/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -34
- package/templates/static/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -25
- package/templates/static/node_modules/typescript/lib/lib.scripthost.d.ts +0 -322
- package/templates/static/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -41
- package/templates/static/node_modules/typescript/lib/lib.webworker.d.ts +0 -13150
- package/templates/static/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -23
- package/templates/static/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -340
- package/templates/static/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -2122
- package/templates/static/node_modules/typescript/lib/tsc.js +0 -8
- package/templates/static/node_modules/typescript/lib/tsserver.js +0 -8
- package/templates/static/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -17
- package/templates/static/node_modules/typescript/lib/tsserverlibrary.js +0 -21
- package/templates/static/node_modules/typescript/lib/typescript.d.ts +0 -11437
|
@@ -16,74 +16,112 @@
|
|
|
16
16
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
/**
|
|
19
|
-
* Mark a component as an interactive island.
|
|
20
|
-
*
|
|
19
|
+
* Mark a component as an interactive island for partial hydration.
|
|
20
|
+
* Islands are components that require client-side interactivity while the rest of the page
|
|
21
|
+
* remains static HTML. This enables efficient selective hydration.
|
|
22
|
+
*
|
|
23
|
+
* How it works:
|
|
24
|
+
* - Marks component with metadata (__island, __hydrationStrategy)
|
|
25
|
+
* - Server renderer detects marked components and emits HTML comments with island metadata
|
|
26
|
+
* - Client JavaScript discovers islands from HTML comments and hydrates based on strategy
|
|
21
27
|
*
|
|
22
28
|
* Usage in route:
|
|
23
29
|
* import { Island } from "jenjs";
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
30
|
+
* import CounterImpl from "./counter.tsx";
|
|
31
|
+
* export default function Page() {
|
|
32
|
+
* const Counter = Island(CounterImpl, "load");
|
|
33
|
+
* return <Counter count={5} />;
|
|
34
|
+
* }
|
|
27
35
|
*
|
|
28
|
-
*
|
|
29
|
-
* -
|
|
30
|
-
* -
|
|
31
|
-
* -
|
|
36
|
+
* Strategies:
|
|
37
|
+
* - "load": Best for above-the-fold critical interactive components
|
|
38
|
+
* - "idle": Good for secondary interactive elements (lighter priority)
|
|
39
|
+
* - "visible": Best for below-the-fold components; hydrates only when scrolled into view
|
|
32
40
|
*
|
|
33
|
-
*
|
|
34
|
-
* -
|
|
35
|
-
*
|
|
41
|
+
* @param Component - The Preact component to mark as an island.
|
|
42
|
+
* @param strategy - Hydration timing strategy.
|
|
43
|
+
* @returns The same component with island metadata attached.
|
|
36
44
|
*/
|
|
37
45
|
export function Island(Component, strategy) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
// Mark component metadata for server-side detection during SSR
|
|
47
|
+
Component.__island = true;
|
|
48
|
+
Component.__hydrationStrategy = strategy;
|
|
49
|
+
return Component;
|
|
42
50
|
}
|
|
43
51
|
/**
|
|
44
|
-
* Generate
|
|
45
|
-
*
|
|
52
|
+
* Generate an HTML comment marker that encodes island metadata.
|
|
53
|
+
* Server renderer calls this after rendering each island component.
|
|
54
|
+
* The marker is embedded in the HTML and later parsed by the client.
|
|
55
|
+
*
|
|
56
|
+
* Format: <!--__ISLAND_{STRATEGY}__:{id}:{componentPath}:{propsJson}-->
|
|
57
|
+
* Example: <!--__ISLAND_LOAD__:island-1:./counter.js:{"count":5}-->
|
|
58
|
+
*
|
|
59
|
+
* Note: '<' in JSON is escaped to '\\u003c' to prevent breaking HTML parsing
|
|
60
|
+
* (literal '<' in props could confuse the HTML parser or regex extraction).
|
|
61
|
+
*
|
|
62
|
+
* @param id - Unique identifier for the island (e.g., "island-1", "counter-2").
|
|
63
|
+
* @param componentPath - Path to the component module.
|
|
64
|
+
* @param strategy - Hydration timing strategy.
|
|
65
|
+
* @param props - Component props object (will be JSON.stringify'd).
|
|
66
|
+
* @returns HTML comment string encoding the island metadata.
|
|
46
67
|
*/
|
|
47
68
|
export function createIslandMarker(id, componentPath, strategy, props) {
|
|
48
|
-
|
|
49
|
-
|
|
69
|
+
const propsJson = JSON.stringify(props).replace(/</g, "\\u003c");
|
|
70
|
+
return `<!--__ISLAND_${strategy.toUpperCase()}__:${id}:${componentPath}:${propsJson}-->`;
|
|
50
71
|
}
|
|
51
72
|
/**
|
|
52
|
-
* Extract
|
|
53
|
-
*
|
|
73
|
+
* Extract island metadata from server-rendered HTML.
|
|
74
|
+
* Client-side function that parses island markers from HTML comments.
|
|
75
|
+
* Called during page initialization to discover which components need hydration.
|
|
76
|
+
*
|
|
77
|
+
* Parsing strategy:
|
|
78
|
+
* - Regex finds HTML comments matching the island marker format
|
|
79
|
+
* - Extracts strategy, id, componentPath, and props from comment
|
|
80
|
+
* - Validates all fields are present and props are valid JSON
|
|
81
|
+
* - Logs warnings for invalid markers but continues processing remaining islands
|
|
82
|
+
*
|
|
83
|
+
* Return value includes only valid, parseable islands; invalid ones are skipped.
|
|
84
|
+
*
|
|
85
|
+
* @param html - Server-rendered HTML string (typically document.body.innerHTML or full page HTML).
|
|
86
|
+
* @returns Array of detected islands with complete metadata ready for hydration.
|
|
54
87
|
*/
|
|
55
88
|
export function extractIslandsFromHtml(html) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
const islands = [];
|
|
90
|
+
// Regex to match: <!--__ISLAND_{LOAD|IDLE|VISIBLE}__:id:componentPath:propsJson-->
|
|
91
|
+
const regex = /<!--__ISLAND_(LOAD|IDLE|VISIBLE)__:([^:]+):([^:]+):(.+?)-->/g;
|
|
92
|
+
let match;
|
|
93
|
+
while ((match = regex.exec(html)) !== null) {
|
|
94
|
+
const strategy = match[1].toLowerCase();
|
|
95
|
+
const id = match[2];
|
|
96
|
+
const componentPath = match[3];
|
|
97
|
+
// Unescape '<' back to literal character
|
|
98
|
+
const propsStr = match[4].replace(/\\u003c/g, "<");
|
|
99
|
+
// Validate required fields
|
|
100
|
+
if (!id || !componentPath) {
|
|
101
|
+
console.warn("Invalid island marker: missing id or componentPath");
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
// Parse props JSON and validate it's an object
|
|
106
|
+
const props = JSON.parse(propsStr);
|
|
107
|
+
if (typeof props !== "object" || props === null) {
|
|
108
|
+
console.warn(
|
|
109
|
+
`Invalid props for island ${id}: expected object, got ${typeof props}`,
|
|
110
|
+
);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
islands.push({
|
|
114
|
+
id,
|
|
115
|
+
component: componentPath,
|
|
116
|
+
strategy,
|
|
117
|
+
props,
|
|
118
|
+
});
|
|
119
|
+
} catch (err) {
|
|
120
|
+
console.warn(
|
|
121
|
+
`Failed to parse props for island ${id}:`,
|
|
122
|
+
err instanceof Error ? err.message : String(err),
|
|
123
|
+
);
|
|
87
124
|
}
|
|
88
|
-
|
|
125
|
+
}
|
|
126
|
+
return islands;
|
|
89
127
|
}
|
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
import type { FrameworkConfig } from "../core/config.js";
|
|
2
2
|
import type { RouteEntry } from "../core/routes/scan.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders a route module to a complete HTML document.
|
|
5
|
+
* This function handles the entire server-side rendering pipeline:
|
|
6
|
+
* 1. Compiles TypeScript/JSX/Vue/Svelte to JavaScript if needed
|
|
7
|
+
* 2. Imports the compiled route module
|
|
8
|
+
* 3. Executes route-level middleware
|
|
9
|
+
* 4. Calls the loader to fetch data
|
|
10
|
+
* 5. Renders the component to HTML using Preact
|
|
11
|
+
* 6. Wraps the component HTML in a full document with hydration metadata if enabled
|
|
12
|
+
*
|
|
13
|
+
* Compilation is performed at request-time in development (for fast iteration) and at build-time in production.
|
|
14
|
+
* The route module must export a default Preact component and may optionally export a loader function,
|
|
15
|
+
* middleware, a Head component, and hydration strategy metadata.
|
|
16
|
+
*
|
|
17
|
+
* @param opts Configuration and context for rendering.
|
|
18
|
+
* @param opts.config The framework configuration.
|
|
19
|
+
* @param opts.route The route entry being rendered.
|
|
20
|
+
* @param opts.req The Node.js IncomingMessage (optional for SSG).
|
|
21
|
+
* @param opts.res The Node.js ServerResponse (optional for SSG).
|
|
22
|
+
* @param opts.url The parsed request URL.
|
|
23
|
+
* @param opts.params Dynamic route parameters extracted from the URL.
|
|
24
|
+
* @param opts.query Query string parameters.
|
|
25
|
+
* @param opts.headers HTTP request headers.
|
|
26
|
+
* @param opts.cookies Parsed cookies from the request.
|
|
27
|
+
* @returns The complete HTML document as a string.
|
|
28
|
+
* @throws Error if the route module fails to compile, import, or render.
|
|
29
|
+
*/
|
|
3
30
|
export declare function renderRouteToHtml(opts: {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
31
|
+
config: FrameworkConfig;
|
|
32
|
+
route: RouteEntry;
|
|
33
|
+
req?: any;
|
|
34
|
+
res?: any;
|
|
35
|
+
url: URL;
|
|
36
|
+
params: Record<string, string>;
|
|
37
|
+
query: Record<string, string>;
|
|
38
|
+
headers: Record<string, string>;
|
|
39
|
+
cookies: Record<string, string>;
|
|
13
40
|
}): Promise<string>;
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
* You should have received a copy of the GNU General Public License
|
|
16
16
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
createRouteMiddlewareContext,
|
|
20
|
+
executeRouteMiddleware,
|
|
21
|
+
} from "../core/middleware-hooks.js";
|
|
19
22
|
import { createIslandMarker } from "./islands.js";
|
|
20
23
|
import { h } from "preact";
|
|
21
24
|
import renderToString from "preact-render-to-string";
|
|
@@ -23,148 +26,221 @@ import { pathToFileURL } from "node:url";
|
|
|
23
26
|
import { join } from "node:path";
|
|
24
27
|
import { mkdirSync, existsSync } from "node:fs";
|
|
25
28
|
import esbuild from "esbuild";
|
|
26
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
vueEsbuildPlugin,
|
|
31
|
+
svelteEsbuildPlugin,
|
|
32
|
+
} from "../compilers/esbuild-plugins.js";
|
|
33
|
+
/**
|
|
34
|
+
* Escapes HTML special characters to prevent injection attacks.
|
|
35
|
+
* Used when serializing user data or dynamic values into HTML attributes or script content.
|
|
36
|
+
*
|
|
37
|
+
* @param s The string to escape.
|
|
38
|
+
* @returns The escaped string safe for inclusion in HTML.
|
|
39
|
+
*/
|
|
27
40
|
function escapeHtml(s) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
41
|
+
return s
|
|
42
|
+
.replaceAll("&", "&")
|
|
43
|
+
.replaceAll("<", "<")
|
|
44
|
+
.replaceAll(">", ">")
|
|
45
|
+
.replaceAll('"', """)
|
|
46
|
+
.replaceAll("'", "'");
|
|
34
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the cache directory path for compiled route modules.
|
|
50
|
+
* Transpiled TypeScript/JSX/Vue/Svelte routes are cached to avoid repeated compilation.
|
|
51
|
+
* Cache is stored in node_modules/.jen/cache to leverage .gitignore and keep the workspace clean.
|
|
52
|
+
* Path names are flattened to avoid nested directory creation issues on Windows.
|
|
53
|
+
*
|
|
54
|
+
* @param filePath The absolute path to the original source file.
|
|
55
|
+
* @returns The absolute path to the cached compiled output file.
|
|
56
|
+
*/
|
|
35
57
|
function getCachePath(filePath) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
58
|
+
const cacheDir = join(process.cwd(), "node_modules", ".jen", "cache");
|
|
59
|
+
if (!existsSync(cacheDir)) {
|
|
60
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
// Flatten path to avoid directory structure issues.
|
|
63
|
+
const flatName = filePath.replace(/[\\/:]/g, "_").replace(/^_+/, "");
|
|
64
|
+
return join(cacheDir, flatName + ".mjs");
|
|
43
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Renders a route module to a complete HTML document.
|
|
68
|
+
* This function handles the entire server-side rendering pipeline:
|
|
69
|
+
* 1. Compiles TypeScript/JSX/Vue/Svelte to JavaScript if needed
|
|
70
|
+
* 2. Imports the compiled route module
|
|
71
|
+
* 3. Executes route-level middleware
|
|
72
|
+
* 4. Calls the loader to fetch data
|
|
73
|
+
* 5. Renders the component to HTML using Preact
|
|
74
|
+
* 6. Wraps the component HTML in a full document with hydration metadata if enabled
|
|
75
|
+
*
|
|
76
|
+
* Compilation is performed at request-time in development (for fast iteration) and at build-time in production.
|
|
77
|
+
* The route module must export a default Preact component and may optionally export a loader function,
|
|
78
|
+
* middleware, a Head component, and hydration strategy metadata.
|
|
79
|
+
*
|
|
80
|
+
* @param opts Configuration and context for rendering.
|
|
81
|
+
* @param opts.config The framework configuration.
|
|
82
|
+
* @param opts.route The route entry being rendered.
|
|
83
|
+
* @param opts.req The Node.js IncomingMessage (optional for SSG).
|
|
84
|
+
* @param opts.res The Node.js ServerResponse (optional for SSG).
|
|
85
|
+
* @param opts.url The parsed request URL.
|
|
86
|
+
* @param opts.params Dynamic route parameters extracted from the URL.
|
|
87
|
+
* @param opts.query Query string parameters.
|
|
88
|
+
* @param opts.headers HTTP request headers.
|
|
89
|
+
* @param opts.cookies Parsed cookies from the request.
|
|
90
|
+
* @returns The complete HTML document as a string.
|
|
91
|
+
* @throws Error if the route module fails to compile, import, or render.
|
|
92
|
+
*/
|
|
44
93
|
export async function renderRouteToHtml(opts) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
94
|
+
const { config, route, url, params, query, headers, cookies } = opts;
|
|
95
|
+
// Transpile route file if needed. TypeScript and JSX require compilation to JavaScript.
|
|
96
|
+
// Vue and Svelte components also need transpilation to Preact-compatible JavaScript.
|
|
97
|
+
let moduleUrl = route.filePath;
|
|
98
|
+
const ext = route.filePath.slice(-4).toLowerCase();
|
|
99
|
+
const requiresTranspile = [".tsx", ".ts", ".vue", ".svelte"].some((e) =>
|
|
100
|
+
route.filePath.toLowerCase().endsWith(e),
|
|
101
|
+
);
|
|
102
|
+
if (requiresTranspile) {
|
|
103
|
+
const outfile = getCachePath(route.filePath);
|
|
104
|
+
await esbuild.build({
|
|
105
|
+
entryPoints: [route.filePath],
|
|
106
|
+
outfile,
|
|
107
|
+
format: "esm",
|
|
108
|
+
platform: "node", // Node platform for SSR supports built-ins like fs, path, etc.
|
|
109
|
+
target: "es2022",
|
|
110
|
+
bundle: true, // Bundle all local imports into a single file for simplicity.
|
|
111
|
+
external: ["preact", "preact-render-to-string", "jenjs"], // Keep framework imports external.
|
|
112
|
+
write: true,
|
|
113
|
+
plugins: [vueEsbuildPlugin(), svelteEsbuildPlugin()],
|
|
114
|
+
});
|
|
115
|
+
moduleUrl = outfile;
|
|
116
|
+
}
|
|
117
|
+
// Cache busting via query parameter ensures fresh module evaluation even if file is unchanged.
|
|
118
|
+
// This is critical because esbuild may use cached builds and we need the latest code for SSR.
|
|
119
|
+
let mod;
|
|
120
|
+
try {
|
|
121
|
+
mod = await import(pathToFileURL(moduleUrl).href + "?t=" + Date.now());
|
|
122
|
+
} catch (err) {
|
|
123
|
+
throw new Error(
|
|
124
|
+
`Failed to import route module ${route.filePath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
// Execute route middleware if present. Middleware runs only in server context (not during SSG with empty req/res).
|
|
128
|
+
// Middleware can access the request, manipulate context data, or short-circuit rendering by throwing redirect/json signals.
|
|
129
|
+
let middlewareData = {};
|
|
130
|
+
if (opts.req && opts.res) {
|
|
131
|
+
const middlewareCtx = createRouteMiddlewareContext({
|
|
132
|
+
req: opts.req,
|
|
133
|
+
res: opts.res,
|
|
134
|
+
url,
|
|
135
|
+
params,
|
|
136
|
+
query,
|
|
137
|
+
headers,
|
|
138
|
+
cookies,
|
|
139
|
+
});
|
|
140
|
+
const middlewares = [];
|
|
141
|
+
if (mod.middleware) {
|
|
142
|
+
if (Array.isArray(mod.middleware)) {
|
|
143
|
+
middlewares.push(...mod.middleware);
|
|
144
|
+
} else {
|
|
145
|
+
middlewares.push(mod.middleware);
|
|
146
|
+
}
|
|
64
147
|
}
|
|
65
|
-
// Cache busting for dynamic import
|
|
66
|
-
let mod;
|
|
67
148
|
try {
|
|
68
|
-
|
|
149
|
+
await executeRouteMiddleware(middlewares, middlewareCtx);
|
|
150
|
+
middlewareData = middlewareCtx.data || {};
|
|
151
|
+
} catch (err) {
|
|
152
|
+
// Middleware may throw special error messages to signal redirect or JSON responses.
|
|
153
|
+
// These are handled by the caller and should not be caught here.
|
|
154
|
+
if (err.message === "__REDIRECT__" || err.message === "__JSON__") {
|
|
155
|
+
throw err;
|
|
156
|
+
}
|
|
157
|
+
throw err;
|
|
69
158
|
}
|
|
70
|
-
|
|
71
|
-
|
|
159
|
+
}
|
|
160
|
+
// Build the loader context with request data and middleware results.
|
|
161
|
+
// The loader receives both raw request data and enriched data from middleware.
|
|
162
|
+
const loaderCtx = {
|
|
163
|
+
url,
|
|
164
|
+
params,
|
|
165
|
+
query,
|
|
166
|
+
headers,
|
|
167
|
+
cookies,
|
|
168
|
+
data: middlewareData, // Pass middleware data to loader.
|
|
169
|
+
};
|
|
170
|
+
// Call the optional loader function to fetch/prepare data for the page.
|
|
171
|
+
// Loader results are passed as props to the page component.
|
|
172
|
+
let data = null;
|
|
173
|
+
if (typeof mod.loader === "function") {
|
|
174
|
+
data = await mod.loader(loaderCtx);
|
|
175
|
+
}
|
|
176
|
+
if (!mod.default) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`Route module ${route.filePath} does not export a default component`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const Page = mod.default;
|
|
182
|
+
// Check if hydration is disabled. Set to false for purely static pages with no client-side interactivity.
|
|
183
|
+
const shouldHydrate = mod.hydrate !== false;
|
|
184
|
+
const app = h(Page, { data, params, query });
|
|
185
|
+
// Render the page component to a static HTML string.
|
|
186
|
+
// Preact rendering at this stage is purely static; hydration happens on the client.
|
|
187
|
+
let bodyHtml = renderToString(app);
|
|
188
|
+
// Check for island components that need selective hydration on the client.
|
|
189
|
+
// Islands are opt-in interactive components within otherwise static pages.
|
|
190
|
+
// Each island is marked with __island and __hydrationStrategy metadata and will be hydrated by the client.
|
|
191
|
+
for (const [key, value] of Object.entries(mod)) {
|
|
192
|
+
if (
|
|
193
|
+
typeof value === "function" &&
|
|
194
|
+
value.__island &&
|
|
195
|
+
value.__hydrationStrategy
|
|
196
|
+
) {
|
|
197
|
+
const strategy = value.__hydrationStrategy;
|
|
198
|
+
const componentPath = route.filePath;
|
|
199
|
+
const islandId = `island-${Math.random().toString(36).slice(2, 9)}`;
|
|
200
|
+
const marker = createIslandMarker(islandId, componentPath, strategy, {});
|
|
201
|
+
// Inject marker before closing app div.
|
|
202
|
+
bodyHtml = bodyHtml.replace("</div>", `${marker}</div>`);
|
|
72
203
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
middlewares.push(...mod.middleware);
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
middlewares.push(mod.middleware);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
try {
|
|
95
|
-
await executeRouteMiddleware(middlewares, middlewareCtx);
|
|
96
|
-
middlewareData = middlewareCtx.data || {};
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
99
|
-
if (err.message === "__REDIRECT__" || err.message === "__JSON__") {
|
|
100
|
-
// Already sent response
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
const loaderCtx = {
|
|
107
|
-
url,
|
|
108
|
-
params,
|
|
109
|
-
query,
|
|
110
|
-
headers,
|
|
111
|
-
cookies,
|
|
112
|
-
data: middlewareData, // Pass middleware data to loader
|
|
113
|
-
};
|
|
114
|
-
let data = null;
|
|
115
|
-
if (typeof mod.loader === "function") {
|
|
116
|
-
data = await mod.loader(loaderCtx);
|
|
117
|
-
}
|
|
118
|
-
if (!mod.default) {
|
|
119
|
-
throw new Error(`Route module ${route.filePath} does not export a default component`);
|
|
120
|
-
}
|
|
121
|
-
const Page = mod.default;
|
|
122
|
-
// Check if hydration is disabled
|
|
123
|
-
const shouldHydrate = mod.hydrate !== false;
|
|
124
|
-
const app = h(Page, { data, params, query });
|
|
125
|
-
let bodyHtml = renderToString(app);
|
|
126
|
-
// If this module exports island components, add hydration markers
|
|
127
|
-
// Look for components marked with __island metadata
|
|
128
|
-
for (const [key, value] of Object.entries(mod)) {
|
|
129
|
-
if (typeof value === "function" &&
|
|
130
|
-
value.__island &&
|
|
131
|
-
value.__hydrationStrategy) {
|
|
132
|
-
const strategy = value.__hydrationStrategy;
|
|
133
|
-
const componentPath = route.filePath;
|
|
134
|
-
const islandId = `island-${Math.random().toString(36).slice(2, 9)}`;
|
|
135
|
-
const marker = createIslandMarker(islandId, componentPath, strategy, {});
|
|
136
|
-
// Mark location in HTML for client to find
|
|
137
|
-
// Note: In a real implementation, we'd track island renders more carefully
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const headParts = [];
|
|
141
|
-
headParts.push(...config.inject.head);
|
|
142
|
-
if (mod.Head) {
|
|
143
|
-
try {
|
|
144
|
-
const headNode = h(mod.Head, { data, params, query });
|
|
145
|
-
const headHtml = renderToString(headNode);
|
|
146
|
-
headParts.push(headHtml);
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
console.error(`Failed to render Head component for ${route.filePath}:`, err instanceof Error ? err.message : String(err));
|
|
150
|
-
}
|
|
204
|
+
}
|
|
205
|
+
// Collect all head elements from configuration and the route's Head component.
|
|
206
|
+
// Head components allow per-route customization of meta tags, title, links, etc.
|
|
207
|
+
const headParts = [];
|
|
208
|
+
headParts.push(...config.inject.head);
|
|
209
|
+
if (mod.Head) {
|
|
210
|
+
try {
|
|
211
|
+
const headNode = h(mod.Head, { data, params, query });
|
|
212
|
+
const headHtml = renderToString(headNode);
|
|
213
|
+
headParts.push(headHtml);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
console.error(
|
|
216
|
+
`Failed to render Head component for ${route.filePath}:`,
|
|
217
|
+
err instanceof Error ? err.message : String(err),
|
|
218
|
+
);
|
|
151
219
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
220
|
+
}
|
|
221
|
+
// Global stylesheet link is always injected. This file is compiled from SCSS in development and build time.
|
|
222
|
+
headParts.push(`<link rel="stylesheet" href="/styles.css">`);
|
|
223
|
+
// Build the complete HTML document with semantic structure.
|
|
224
|
+
// The div#app is the mount point for hydration on the client.
|
|
225
|
+
let html = `<!doctype html>
|
|
155
226
|
<html>
|
|
156
227
|
<head>
|
|
157
228
|
${headParts.join("\n")}
|
|
158
229
|
</head>
|
|
159
230
|
<body>
|
|
160
231
|
<div id="app">${bodyHtml}</div>`;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
232
|
+
// Only inject hydration script if enabled for this route.
|
|
233
|
+
// Hydration-disabled routes are purely static and require no JavaScript.
|
|
234
|
+
if (shouldHydrate) {
|
|
235
|
+
// Serialize loader and route data for the client. Must escape </script to prevent injection attacks.
|
|
236
|
+
// The client uses this data to reconstruct the component tree and populate props.
|
|
237
|
+
const frameworkDataStr = JSON.stringify(
|
|
238
|
+
{ data, params, query },
|
|
239
|
+
null,
|
|
240
|
+
2,
|
|
241
|
+
).replace(/<\/script/gi, "<\\/script");
|
|
242
|
+
const hydrateFile = `/__hydrate?file=${encodeURIComponent(route.filePath)}`;
|
|
243
|
+
html += `
|
|
168
244
|
<script id="__FRAMEWORK_DATA__" type="application/json">
|
|
169
245
|
${frameworkDataStr}
|
|
170
246
|
</script>
|
|
@@ -174,10 +250,12 @@ ${headParts.join("\n")}
|
|
|
174
250
|
hydrateClient(${JSON.stringify(hydrateFile)});
|
|
175
251
|
initializeIslands();
|
|
176
252
|
</script>`;
|
|
177
|
-
|
|
178
|
-
|
|
253
|
+
}
|
|
254
|
+
// Inject any additional scripts or markup configured to run at the end of body.
|
|
255
|
+
// Useful for analytics, telemetry, or polyfills that should load after DOM is ready.
|
|
256
|
+
html += `
|
|
179
257
|
${config.inject.bodyEnd.join("\n")}
|
|
180
258
|
</body>
|
|
181
259
|
</html>`;
|
|
182
|
-
|
|
260
|
+
return html;
|
|
183
261
|
}
|