create-jen-app 1.2.3 → 1.2.4
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/dist/colors.js +0 -17
- package/dist/create.js +5 -17
- package/dist/generator.js +14 -31
- package/dist/index.js +6 -1
- package/package.json +1 -1
- package/templates/ssr-isr/README.md +77 -0
- package/templates/ssr-isr/build.js +118 -0
- package/templates/ssr-isr/jen.config.ts +109 -0
- package/templates/ssr-isr/jenjs.d.ts +22 -0
- package/templates/ssr-isr/lib/api/(hello).js +9 -0
- package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
- package/templates/ssr-isr/lib/auth/index.js +2 -0
- package/templates/ssr-isr/lib/auth/jwt.js +57 -0
- package/templates/ssr-isr/lib/auth/session.js +92 -0
- package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
- package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
- package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
- package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
- package/templates/{static → ssr-isr}/lib/build/build.d.ts +1 -1
- package/templates/ssr-isr/lib/build/build.js +141 -0
- package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
- package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
- package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
- package/templates/ssr-isr/lib/build/minifier.js +46 -0
- package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
- package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
- package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
- package/templates/ssr-isr/lib/build/production-build.js +13 -0
- package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
- package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
- package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
- package/templates/ssr-isr/lib/cache/index.js +10 -0
- package/templates/ssr-isr/lib/cache/memory.js +40 -0
- package/templates/ssr-isr/lib/cache/redis.js +61 -0
- package/templates/ssr-isr/lib/cli/banner.js +28 -0
- package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
- package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
- package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
- package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
- package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
- package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
- package/templates/ssr-isr/lib/compilers/vue.js +90 -0
- package/templates/ssr-isr/lib/core/http.js +71 -0
- package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
- package/templates/ssr-isr/lib/core/paths.js +39 -0
- package/templates/ssr-isr/lib/core/routes/match.js +47 -0
- package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
- package/templates/ssr-isr/lib/core/types.js +1 -0
- package/templates/ssr-isr/lib/css/compiler.js +74 -0
- package/templates/ssr-isr/lib/db/connector.js +42 -0
- package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
- package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
- package/templates/ssr-isr/lib/db/index.js +48 -0
- package/templates/ssr-isr/lib/db/types.js +1 -0
- package/templates/ssr-isr/lib/graphql/index.js +52 -0
- package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
- package/templates/ssr-isr/lib/graphql/schema.js +35 -0
- package/templates/ssr-isr/lib/i18n/en.json +4 -0
- package/templates/ssr-isr/lib/i18n/es.json +4 -0
- package/templates/ssr-isr/lib/i18n/index.js +15 -0
- package/templates/ssr-isr/lib/import/jen-import.js +161 -0
- package/templates/ssr-isr/lib/index.js +116 -0
- package/templates/ssr-isr/lib/jdb/engine.js +275 -0
- package/templates/ssr-isr/lib/jdb/index.js +34 -0
- package/templates/ssr-isr/lib/jdb/types.js +1 -0
- package/templates/ssr-isr/lib/jdb/utils.js +176 -0
- package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.js +0 -17
- package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
- package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.js +0 -17
- package/templates/ssr-isr/lib/middleware/context.js +124 -0
- package/templates/{static → ssr-isr}/lib/middleware/decorators.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/errors/handler.js +0 -17
- package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
- package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
- package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
- package/templates/ssr-isr/lib/middleware/registry.js +85 -0
- package/templates/ssr-isr/lib/middleware/response.js +107 -0
- package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
- package/templates/ssr-isr/lib/middleware/types.js +1 -0
- package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
- package/templates/{static → ssr-isr}/lib/native/bundle.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/dev-server.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/index.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/optimizer.js +0 -17
- package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
- package/templates/ssr-isr/lib/plugin/loader.js +36 -0
- package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
- package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
- package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
- package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
- package/templates/ssr-isr/lib/runtime/islands.js +110 -0
- package/templates/ssr-isr/lib/runtime/render.js +244 -0
- package/templates/ssr-isr/lib/server/api-routes.js +237 -0
- package/templates/ssr-isr/lib/server/api.js +108 -0
- package/templates/ssr-isr/lib/server/app.js +438 -0
- package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
- package/templates/ssr-isr/lib/server/ssr.js +202 -0
- package/templates/ssr-isr/lib/shared/log.js +64 -0
- package/templates/ssr-isr/package.json +23 -0
- package/templates/ssr-isr/server.js +128 -0
- package/templates/ssr-isr/site/pages/(index).tsx +11 -0
- package/templates/ssr-isr/site/styles/global.scss +37 -0
- package/templates/ssr-isr/tsconfig.json +39 -0
- package/templates/static/build.js +30 -18
- package/templates/static/jen.config.ts +0 -18
- package/templates/static/jenjs.d.ts +0 -18
- package/templates/static/lib/api/(hello).js +0 -17
- package/templates/static/lib/api/examples/files/[...slug].js +22 -0
- package/templates/static/lib/api/examples/hello.js +11 -0
- package/templates/static/lib/api/examples/posts/[id].js +37 -0
- package/templates/static/lib/api/examples/posts.js +37 -0
- package/templates/static/lib/api/examples/search.js +23 -0
- package/templates/static/lib/api/index.js +41 -0
- package/templates/static/lib/api/loader.js +234 -0
- package/templates/static/lib/api/router.js +259 -0
- package/templates/static/lib/assets/types.js +1 -0
- package/templates/static/lib/auth/cookie-utils.js +3 -16
- package/templates/static/lib/auth/index.js +0 -17
- package/templates/static/lib/auth/jwt.js +0 -17
- package/templates/static/lib/auth/session.js +0 -17
- package/templates/static/lib/build/asset-hashing.js +44 -36
- package/templates/static/lib/build/asset-manifest.js +16 -33
- package/templates/static/lib/build/build.js +270 -125
- package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
- package/templates/static/lib/build/bundle-analyzer.js +945 -0
- package/templates/static/lib/build/code-splitter.js +194 -0
- package/templates/static/lib/build/feature-analyzer.js +190 -0
- package/templates/static/lib/build/feature-gate.js +257 -0
- package/templates/static/lib/build/island-hydration.js +17 -35
- package/templates/static/lib/build/lazy-loader.js +322 -0
- package/templates/static/lib/build/minifier.js +40 -59
- package/templates/static/lib/build/page-renderer.js +23 -40
- package/templates/static/lib/build/production-build.js +9 -26
- package/templates/static/lib/build/rust-hashing.js +71 -0
- package/templates/static/lib/build/script-optimizer.js +285 -0
- package/templates/static/lib/build/ssg-pipeline.js +100 -106
- package/templates/static/lib/build/vercel-output.js +298 -0
- package/templates/static/lib/build-tools/build-site.js +0 -17
- package/templates/static/lib/cache/index.js +0 -17
- package/templates/static/lib/cache/memory.js +0 -17
- package/templates/static/lib/cache/redis.js +0 -17
- package/templates/static/lib/cli/banner.js +0 -17
- package/templates/static/lib/cli/templates/ssg/jen.config.js +0 -17
- package/templates/static/lib/cli/templates/ssr/jen.config.js +0 -17
- package/templates/static/lib/client/Image.js +42 -0
- package/templates/static/lib/client/Link.js +190 -0
- package/templates/static/lib/client/PWA.js +46 -0
- package/templates/static/lib/client/Seo.js +97 -0
- package/templates/static/lib/client/index.js +9 -0
- package/templates/static/lib/client/useNavigation.js +25 -0
- package/templates/static/lib/client/useRouter.js +64 -0
- package/templates/static/lib/client-routing/Link.js +17 -0
- package/templates/static/lib/client-routing/index.js +19 -0
- package/templates/static/lib/client-routing/router.js +151 -0
- package/templates/static/lib/client-routing/signal.js +147 -0
- package/templates/static/lib/compilers/esbuild-plugins.js +0 -17
- package/templates/static/lib/compilers/svelte.js +0 -17
- package/templates/static/lib/compilers/vue.js +0 -17
- package/templates/static/lib/core/config.js +0 -17
- package/templates/static/lib/core/feature-guard.js +136 -0
- package/templates/static/lib/core/features.js +99 -0
- package/templates/static/lib/core/http.js +0 -17
- package/templates/static/lib/core/layouts/index.js +10 -0
- package/templates/static/lib/core/layouts/render.js +158 -0
- package/templates/static/lib/core/layouts/scan.js +112 -0
- package/templates/static/lib/core/layouts/types.js +1 -0
- package/templates/static/lib/core/lifecycle.js +129 -0
- package/templates/static/lib/core/loader-schema.js +81 -0
- package/templates/static/lib/core/middleware-hooks.js +0 -17
- package/templates/static/lib/core/paths.js +0 -17
- package/templates/static/lib/core/routes/advanced.js +114 -0
- package/templates/static/lib/core/routes/handlers.js +181 -0
- package/templates/static/lib/core/routes/match.js +89 -17
- package/templates/static/lib/core/routes/orchestrator.js +171 -0
- package/templates/static/lib/core/routes/rendering-config.js +131 -0
- package/templates/static/lib/core/routes/scan.js +0 -17
- package/templates/static/lib/core/types.js +0 -17
- package/templates/static/lib/css/compiler.js +1 -18
- package/templates/static/lib/data-fetching/cache.js +223 -0
- package/templates/static/lib/data-fetching/client.js +202 -0
- package/templates/static/lib/data-fetching/feature-guard.js +29 -0
- package/templates/static/lib/data-fetching/graphql.js +265 -0
- package/templates/static/lib/data-fetching/index.js +57 -0
- package/templates/static/lib/data-fetching/rest.js +256 -0
- package/templates/static/lib/data-fetching/server.js +182 -0
- package/templates/static/lib/data-fetching/types.js +5 -0
- package/templates/static/lib/db/connector.js +0 -17
- package/templates/static/lib/db/drivers/jdb.js +0 -17
- package/templates/static/lib/db/drivers/sql.js +0 -17
- package/templates/static/lib/db/index.js +0 -17
- package/templates/static/lib/db/types.js +0 -17
- package/templates/static/lib/devtools/component-tree.js +106 -0
- package/templates/static/lib/devtools/devtools.js +638 -0
- package/templates/static/lib/devtools/event-bus.js +29 -0
- package/templates/static/lib/devtools/event-logger.js +67 -0
- package/templates/static/lib/devtools/index.js +9 -0
- package/templates/static/lib/devtools/integration.js +149 -0
- package/templates/static/lib/devtools/performance.js +84 -0
- package/templates/static/lib/devtools/persistence.js +57 -0
- package/templates/static/lib/devtools/plugins.js +97 -0
- package/templates/static/lib/devtools/search.js +89 -0
- package/templates/static/lib/devtools/ui.js +769 -0
- package/templates/static/lib/features/api/handler.js +10 -0
- package/templates/static/lib/features/api/index.js +5 -0
- package/templates/static/lib/features/api/types.js +4 -0
- package/templates/static/lib/features/middleware/compiled.js +7 -0
- package/templates/static/lib/features/middleware/index.js +5 -0
- package/templates/static/lib/features/middleware/types.js +4 -0
- package/templates/static/lib/fonts/index.js +46 -0
- package/templates/static/lib/fonts/inject.js +125 -0
- package/templates/static/lib/fonts/loader.js +196 -0
- package/templates/static/lib/fonts/types.js +1 -0
- package/templates/static/lib/graphql/index.js +1 -18
- package/templates/static/lib/graphql/resolvers.js +20 -13
- package/templates/static/lib/graphql/schema.js +0 -17
- package/templates/static/lib/i18n/index.js +7 -19
- package/templates/static/lib/import/jen-import.js +1 -18
- package/templates/static/lib/index.js +79 -125
- package/templates/static/lib/jdb/engine.js +0 -17
- package/templates/static/lib/jdb/index.js +1 -18
- package/templates/static/lib/jdb/types.js +0 -17
- package/templates/static/lib/jdb/utils.js +0 -17
- package/templates/static/lib/middleware/builtins/cors.js +3 -16
- package/templates/static/lib/middleware/context.js +0 -17
- package/templates/static/lib/middleware/kernel.js +117 -25
- package/templates/static/lib/middleware/pipeline.js +0 -17
- package/templates/static/lib/middleware/registry.js +0 -17
- package/templates/static/lib/middleware/response.js +0 -17
- package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
- package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
- package/templates/static/lib/plugin/loader.js +0 -17
- package/templates/static/lib/plugin/plugin-manager.js +177 -0
- package/templates/static/lib/plugin/types.js +28 -0
- package/templates/static/lib/runtime/client-runtime.js +0 -17
- package/templates/static/lib/runtime/hmr.js +0 -17
- package/templates/static/lib/runtime/hydrate.js +0 -17
- package/templates/static/lib/runtime/island-hydration-client.js +0 -17
- package/templates/static/lib/runtime/islands.js +0 -17
- package/templates/static/lib/runtime/render.js +208 -50
- package/templates/static/lib/security/security-config.js +60 -0
- package/templates/static/lib/security/security-middleware.js +229 -0
- package/templates/static/lib/server/api-routes.js +153 -43
- package/templates/static/lib/server/api.js +0 -17
- package/templates/static/lib/server/app.js +539 -223
- package/templates/static/lib/server/isr.js +365 -0
- package/templates/static/lib/server/runtimeServe.js +31 -24
- package/templates/static/lib/server/ssr.js +98 -22
- package/templates/static/lib/server-actions/handler.js +180 -0
- package/templates/static/lib/server-actions/index.js +19 -0
- package/templates/static/lib/server-actions/middleware.js +146 -0
- package/templates/static/lib/server-actions/scan.js +152 -0
- package/templates/static/lib/server-actions/types.js +1 -0
- package/templates/static/lib/server-actions/validators.js +156 -0
- package/templates/static/lib/shared/log.js +19 -20
- package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
- package/templates/static/lib/telemetry/api/validator.js +67 -0
- package/templates/static/lib/telemetry/client.js +121 -0
- package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
- package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
- package/templates/static/lib/vendor/glob/glob.js +4766 -0
- package/templates/static/lib/vendor/preact/LICENSE +21 -0
- package/templates/static/lib/vendor/preact/preact.module.js +797 -0
- package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
- package/templates/static/package.json +4 -0
- package/templates/static/server.js +22 -22
- package/templates/static/site/(home).tsx +0 -18
- package/templates/static/tsconfig.json +5 -1
- package/templates/static/.esbuild/jen.config.js +0 -19
- package/templates/static/lib/build/asset-hashing.d.ts +0 -10
- package/templates/static/lib/build/asset-manifest.d.ts +0 -11
- package/templates/static/lib/build/minifier.d.ts +0 -20
- package/templates/static/lib/build/page-renderer.d.ts +0 -17
- package/templates/static/lib/build/production-build.d.ts +0 -10
- package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
- package/templates/static/lib/middleware/errors/http-error.js +0 -27
- package/templates/static/lib/middleware/types.js +0 -18
- package/templates/static/lib/middleware/utils/matcher.js +0 -30
- package/templates/static/lib/native/style-compiler.js +0 -36
- /package/templates/{static → ssr-isr}/lib/api/(hello).d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/cookie-utils.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/jwt.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/session.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/memory.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/redis.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/banner.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/svelte.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/vue.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/config.d.ts +0 -0
- /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
- /package/templates/{static → ssr-isr}/lib/core/http.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/middleware-hooks.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/paths.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/routes/match.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/routes/scan.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/css/compiler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/connector.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/drivers/jdb.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/drivers/sql.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/resolvers.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/schema.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/i18n/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/import/jen-import.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/engine.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/utils.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/cors.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/context.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/decorators.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/errors/http-error.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/kernel.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/pipeline.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/registry.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/response.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/bundle.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/dev-server.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/optimizer.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/style-compiler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/plugin/loader.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/client-runtime.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/hmr.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/hydrate.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/island-hydration-client.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/islands.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/render.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/api-routes.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/api.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/app.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/runtimeServe.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/ssr.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/shared/log.d.ts +0 -0
|
@@ -1,62 +1,44 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
1
|
/**
|
|
19
2
|
* Creates an empty island registry for a request
|
|
20
3
|
*/
|
|
21
4
|
export function createIslandRegistry() {
|
|
22
|
-
|
|
5
|
+
return { islands: [] };
|
|
23
6
|
}
|
|
24
7
|
/**
|
|
25
8
|
* Mark a component as an island (placeholder implementation)
|
|
26
9
|
* In a real framework, this would be a decorator or a HOC
|
|
27
10
|
*/
|
|
28
11
|
export function markIsland(name, props) {
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
const id = `island-${Math.random().toString(36).slice(2, 9)}`;
|
|
13
|
+
return `<div data-island="${name}" data-props='${JSON.stringify(props)}' id="${id}"></div>`;
|
|
31
14
|
}
|
|
32
15
|
/**
|
|
33
16
|
* Extract islands from HTML string
|
|
34
17
|
*/
|
|
35
18
|
export function extractIslandsFromHtml(html) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
19
|
+
const islands = [];
|
|
20
|
+
const regex = /data-island="([^"]+)" data-props='([^']+)' id="([^"]+)"/g;
|
|
21
|
+
let match;
|
|
22
|
+
while ((match = regex.exec(html)) !== null) {
|
|
23
|
+
islands.push({
|
|
24
|
+
component: match[1],
|
|
25
|
+
props: JSON.parse(match[2]),
|
|
26
|
+
id: match[3],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return islands;
|
|
47
30
|
}
|
|
48
31
|
/**
|
|
49
32
|
* Inject hydration script into HTML
|
|
50
33
|
*/
|
|
51
34
|
export function injectIslandScript(html, islands) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const script = `
|
|
35
|
+
if (islands.length === 0) return html;
|
|
36
|
+
const script = `
|
|
55
37
|
<script type="module">
|
|
56
38
|
import { hydrate } from '/__runtime/hydrate.js';
|
|
57
39
|
const islands = ${JSON.stringify(islands)};
|
|
58
40
|
islands.forEach(i => hydrate(i.component, i.id, i.props));
|
|
59
41
|
</script>
|
|
60
42
|
`;
|
|
61
|
-
|
|
43
|
+
return html.replace("</body>", `${script}</body>`);
|
|
62
44
|
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy-loading manager for dynamic imports
|
|
3
|
+
*
|
|
4
|
+
* Detects and manages lazy-loaded modules:
|
|
5
|
+
* - Identifies dynamic imports and code-split boundaries
|
|
6
|
+
* - Generates lazy-loading metadata
|
|
7
|
+
* - Creates runtime helpers for loading
|
|
8
|
+
* - Implements prefetching/preloading strategies
|
|
9
|
+
*/
|
|
10
|
+
export class LazyLoader {
|
|
11
|
+
modules = new Map();
|
|
12
|
+
manifest;
|
|
13
|
+
constructor(strategy = "lazy") {
|
|
14
|
+
this.manifest = {
|
|
15
|
+
modules: [],
|
|
16
|
+
loadingStrategy: strategy,
|
|
17
|
+
prefetch: strategy !== "eager",
|
|
18
|
+
preload: strategy === "progressive",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a lazy-loaded module
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* lazyLoader.register({
|
|
27
|
+
* id: "dashboard",
|
|
28
|
+
* name: "Dashboard",
|
|
29
|
+
* path: "src/pages/dashboard.tsx",
|
|
30
|
+
* chunkName: "dashboard",
|
|
31
|
+
* condition: "route === 'dashboard'"
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
register(module) {
|
|
36
|
+
this.modules.set(module.id, module);
|
|
37
|
+
this.manifest.modules.push(module);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detect lazy-loaded modules from source code
|
|
41
|
+
*
|
|
42
|
+
* Patterns detected:
|
|
43
|
+
* - import() dynamic imports
|
|
44
|
+
* - React.lazy() components
|
|
45
|
+
* - Preact lazy() components
|
|
46
|
+
* - @lazy-load comments
|
|
47
|
+
*/
|
|
48
|
+
detectFromSource(source) {
|
|
49
|
+
const detected = [];
|
|
50
|
+
const patterns = {
|
|
51
|
+
// import("./path") or import('./path')
|
|
52
|
+
dynamicImport: /import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g,
|
|
53
|
+
// @lazy-load:"name"
|
|
54
|
+
lazyComment: /@lazy-load:\s*"([^"]+)"/g,
|
|
55
|
+
// React.lazy(() => import(...))
|
|
56
|
+
reactLazy:
|
|
57
|
+
/React\.lazy\s*\(\s*\(\)\s*=>\s*import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)\s*\)/g,
|
|
58
|
+
};
|
|
59
|
+
// Detect dynamic imports
|
|
60
|
+
let match;
|
|
61
|
+
const importRegex = patterns.dynamicImport;
|
|
62
|
+
while ((match = importRegex.exec(source)) !== null) {
|
|
63
|
+
const path = match[1];
|
|
64
|
+
detected.push({
|
|
65
|
+
id: path.replace(/[./]/g, "-"),
|
|
66
|
+
name: path.split("/").pop() || "unknown",
|
|
67
|
+
path,
|
|
68
|
+
chunkName:
|
|
69
|
+
path
|
|
70
|
+
.split("/")
|
|
71
|
+
.pop()
|
|
72
|
+
?.replace(/\.[jt]sx?$/, "") || "chunk",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Detect lazy-load comments
|
|
76
|
+
const commentRegex = patterns.lazyComment;
|
|
77
|
+
while ((match = commentRegex.exec(source)) !== null) {
|
|
78
|
+
const name = match[1];
|
|
79
|
+
detected.push({
|
|
80
|
+
id: name,
|
|
81
|
+
name,
|
|
82
|
+
path: name,
|
|
83
|
+
chunkName: name,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return detected;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate runtime lazy-loading helper code
|
|
90
|
+
*/
|
|
91
|
+
generateRuntimeHelper() {
|
|
92
|
+
return `
|
|
93
|
+
/**
|
|
94
|
+
* Auto-generated lazy-loading runtime helper
|
|
95
|
+
* Manages dynamic imports with caching and error handling
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
// Cache for loaded modules
|
|
99
|
+
const lazyCache = new Map();
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Load a lazy module by ID
|
|
103
|
+
* Returns cached module if already loaded
|
|
104
|
+
* Implements exponential backoff for failed loads
|
|
105
|
+
*/
|
|
106
|
+
export async function loadLazy(moduleId, moduleSpec) {
|
|
107
|
+
if (lazyCache.has(moduleId)) {
|
|
108
|
+
return lazyCache.get(moduleId);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
let retries = 0;
|
|
112
|
+
const maxRetries = 3;
|
|
113
|
+
let lastError;
|
|
114
|
+
|
|
115
|
+
while (retries < maxRetries) {
|
|
116
|
+
try {
|
|
117
|
+
const module = await import(moduleSpec);
|
|
118
|
+
lazyCache.set(moduleId, module);
|
|
119
|
+
return module;
|
|
120
|
+
} catch (err) {
|
|
121
|
+
lastError = err;
|
|
122
|
+
retries++;
|
|
123
|
+
if (retries < maxRetries) {
|
|
124
|
+
// Exponential backoff: 100ms, 200ms, 400ms
|
|
125
|
+
await new Promise(r => setTimeout(r, 100 * Math.pow(2, retries - 1)));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
console.error(\`Failed to load module \${moduleId}:\`, lastError);
|
|
131
|
+
throw lastError;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Prefetch a lazy module
|
|
136
|
+
* Useful for anticipated navigation or user interactions
|
|
137
|
+
*/
|
|
138
|
+
export function prefetchLazy(moduleId, moduleSpec) {
|
|
139
|
+
if (typeof window === 'undefined') return; // Server-side, skip
|
|
140
|
+
|
|
141
|
+
const link = document.createElement('link');
|
|
142
|
+
link.rel = 'prefetch';
|
|
143
|
+
link.as = 'script';
|
|
144
|
+
link.href = moduleSpec;
|
|
145
|
+
document.head.appendChild(link);
|
|
146
|
+
|
|
147
|
+
// Also start loading in background
|
|
148
|
+
loadLazy(moduleId, moduleSpec).catch(err => {
|
|
149
|
+
console.warn(\`Prefetch for \${moduleId} failed:\`, err);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Preload a lazy module immediately
|
|
155
|
+
* Used for critical lazy modules needed soon
|
|
156
|
+
*/
|
|
157
|
+
export function preloadLazy(moduleId, moduleSpec) {
|
|
158
|
+
if (typeof window === 'undefined') return; // Server-side, skip
|
|
159
|
+
|
|
160
|
+
const link = document.createElement('link');
|
|
161
|
+
link.rel = 'preload';
|
|
162
|
+
link.as = 'script';
|
|
163
|
+
link.href = moduleSpec;
|
|
164
|
+
document.head.appendChild(link);
|
|
165
|
+
|
|
166
|
+
return loadLazy(moduleId, moduleSpec);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Get lazy loading manifest
|
|
171
|
+
*/
|
|
172
|
+
export function getLazyManifest() {
|
|
173
|
+
return ${JSON.stringify(this.manifest, null, 2)};
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate lazy-loading manifest JSON
|
|
179
|
+
*/
|
|
180
|
+
getManifest() {
|
|
181
|
+
return {
|
|
182
|
+
...this.manifest,
|
|
183
|
+
modules: Array.from(this.modules.values()),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Generate HTML script tags for lazy-loaded modules
|
|
188
|
+
*/
|
|
189
|
+
generateLazyScriptTags() {
|
|
190
|
+
let html = `<!-- Lazy-loaded module hints -->\n`;
|
|
191
|
+
for (const module of this.modules.values()) {
|
|
192
|
+
if (this.manifest.prefetch) {
|
|
193
|
+
html += `<link rel="prefetch" as="script" href="/${module.chunkName}.js">\n`;
|
|
194
|
+
}
|
|
195
|
+
if (this.manifest.preload) {
|
|
196
|
+
html += `<link rel="preload" as="script" href="/${module.chunkName}.js">\n`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return html;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Generate Intersection Observer helper for visible-load pattern
|
|
203
|
+
*
|
|
204
|
+
* Lazy-loads components when they become visible in viewport
|
|
205
|
+
* Useful for components below the fold
|
|
206
|
+
*/
|
|
207
|
+
generateVisibleLoadHelper() {
|
|
208
|
+
return `
|
|
209
|
+
/**
|
|
210
|
+
* Load component when element becomes visible
|
|
211
|
+
* Useful for below-the-fold content
|
|
212
|
+
*/
|
|
213
|
+
export function loadWhenVisible(elementId, moduleId, moduleSpec) {
|
|
214
|
+
if (typeof window === 'undefined') return;
|
|
215
|
+
if (typeof IntersectionObserver === 'undefined') {
|
|
216
|
+
// Fallback: load immediately if IntersectionObserver not available
|
|
217
|
+
return loadLazy(moduleId, moduleSpec);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const element = document.getElementById(elementId);
|
|
221
|
+
if (!element) return;
|
|
222
|
+
|
|
223
|
+
const observer = new IntersectionObserver((entries) => {
|
|
224
|
+
for (const entry of entries) {
|
|
225
|
+
if (entry.isIntersecting) {
|
|
226
|
+
observer.unobserve(entry.target);
|
|
227
|
+
loadLazy(moduleId, moduleSpec);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
observer.observe(element);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Load component on user interaction
|
|
237
|
+
* Examples: hover, focus, click
|
|
238
|
+
*/
|
|
239
|
+
export function loadOnInteraction(elementId, moduleId, moduleSpec, events = ['mouseover', 'focus', 'click']) {
|
|
240
|
+
if (typeof window === 'undefined') return;
|
|
241
|
+
|
|
242
|
+
const element = document.getElementById(elementId);
|
|
243
|
+
if (!element) return;
|
|
244
|
+
|
|
245
|
+
const listener = () => {
|
|
246
|
+
for (const event of events) {
|
|
247
|
+
element.removeEventListener(event, listener);
|
|
248
|
+
}
|
|
249
|
+
loadLazy(moduleId, moduleSpec);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
for (const event of events) {
|
|
253
|
+
element.addEventListener(event, listener, { once: true });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
`;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Generate loading state component for Preact
|
|
260
|
+
*/
|
|
261
|
+
generateLoadingComponent() {
|
|
262
|
+
return `
|
|
263
|
+
/**
|
|
264
|
+
* Loading component for lazy-loaded modules
|
|
265
|
+
* Shows while module is loading
|
|
266
|
+
*/
|
|
267
|
+
import { h } from 'preact';
|
|
268
|
+
|
|
269
|
+
export function LazyLoading() {
|
|
270
|
+
return h('div', { class: 'lazy-loading' },
|
|
271
|
+
h('div', { class: 'spinner' }),
|
|
272
|
+
h('p', null, 'Loading...')
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function LazyError({ error, retry }) {
|
|
277
|
+
return h('div', { class: 'lazy-error' },
|
|
278
|
+
h('p', null, 'Failed to load component'),
|
|
279
|
+
h('pre', null, error?.message),
|
|
280
|
+
h('button', { onClick: retry }, 'Retry')
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export function withLazyFallback(Component, LoadingComponent = LazyLoading) {
|
|
285
|
+
return function LazyComponent(props) {
|
|
286
|
+
return h('ErrorBoundary', null,
|
|
287
|
+
h('Suspense', { fallback: h(LoadingComponent) },
|
|
288
|
+
h(Component, props)
|
|
289
|
+
)
|
|
290
|
+
);
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
`;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Generate configuration report
|
|
297
|
+
*/
|
|
298
|
+
generateReport() {
|
|
299
|
+
let report = "# Lazy-Loading Report\n\n";
|
|
300
|
+
report += "## Configuration\n";
|
|
301
|
+
report += `- Strategy: ${this.manifest.loadingStrategy}\n`;
|
|
302
|
+
report += `- Prefetch: ${this.manifest.prefetch}\n`;
|
|
303
|
+
report += `- Preload: ${this.manifest.preload}\n`;
|
|
304
|
+
report += `- Total modules: ${this.modules.size}\n\n`;
|
|
305
|
+
if (this.modules.size > 0) {
|
|
306
|
+
report += "## Modules\n";
|
|
307
|
+
for (const module of this.modules.values()) {
|
|
308
|
+
report += `- ${module.name} (${module.chunkName})\n`;
|
|
309
|
+
if (module.condition) {
|
|
310
|
+
report += ` Condition: ${module.condition}\n`;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return report;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Helper: Create lazy loader from config
|
|
319
|
+
*/
|
|
320
|
+
export function createLazyLoader(strategy = "lazy") {
|
|
321
|
+
return new LazyLoader(strategy);
|
|
322
|
+
}
|
|
@@ -1,65 +1,46 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
1
|
import * as esbuild from "esbuild";
|
|
19
2
|
import { log } from "../shared/log.js";
|
|
20
3
|
export class Minifier {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
throw err;
|
|
37
|
-
}
|
|
4
|
+
/**
|
|
5
|
+
* Minify JavaScript/TypeScript using esbuild
|
|
6
|
+
*/
|
|
7
|
+
static async minifyJs(code, options = {}) {
|
|
8
|
+
try {
|
|
9
|
+
const result = await esbuild.transform(code, {
|
|
10
|
+
loader: "js",
|
|
11
|
+
minify: true,
|
|
12
|
+
legalComments: "none",
|
|
13
|
+
...options,
|
|
14
|
+
});
|
|
15
|
+
return result.code;
|
|
16
|
+
} catch (err) {
|
|
17
|
+
log.error("Minification failed (JS)");
|
|
18
|
+
throw err;
|
|
38
19
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Minify HTML (basic regex/string-based, as esbuild doesn't handle HTML)
|
|
57
|
-
*/
|
|
58
|
-
static minifyHtml(html) {
|
|
59
|
-
return html
|
|
60
|
-
.replace(/<!--[\s\S]*?-->/g, "") // Remove comments
|
|
61
|
-
.replace(/>\s+</g, "><") // Remove whitespace between tags
|
|
62
|
-
.replace(/\s{2,}/g, " ") // Collapse multiple whitespaces
|
|
63
|
-
.trim();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Minify CSS using esbuild
|
|
23
|
+
*/
|
|
24
|
+
static async minifyCss(code) {
|
|
25
|
+
try {
|
|
26
|
+
const result = await esbuild.transform(code, {
|
|
27
|
+
loader: "css",
|
|
28
|
+
minify: true,
|
|
29
|
+
});
|
|
30
|
+
return result.code;
|
|
31
|
+
} catch (err) {
|
|
32
|
+
log.error("Minification failed (CSS)");
|
|
33
|
+
throw err;
|
|
64
34
|
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Minify HTML (basic regex/string-based, as esbuild doesn't handle HTML)
|
|
38
|
+
*/
|
|
39
|
+
static minifyHtml(html) {
|
|
40
|
+
return html
|
|
41
|
+
.replace(/<!--[\s\S]*?-->/g, "") // Remove comments
|
|
42
|
+
.replace(/>\s+</g, "><") // Remove whitespace between tags
|
|
43
|
+
.replace(/\s{2,}/g, " ") // Collapse multiple whitespaces
|
|
44
|
+
.trim();
|
|
45
|
+
}
|
|
65
46
|
}
|
|
@@ -1,45 +1,28 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
1
|
import { renderRouteToHtml } from "../runtime/render.js";
|
|
19
2
|
import { Minifier } from "./minifier.js";
|
|
20
3
|
export class PageRenderer {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
return html;
|
|
4
|
+
/**
|
|
5
|
+
* Render a route to a full HTML string, including minification if requested
|
|
6
|
+
*/
|
|
7
|
+
static async render(ctx, minify = false) {
|
|
8
|
+
// 1. Core Preact render
|
|
9
|
+
let html = await renderRouteToHtml({
|
|
10
|
+
config: ctx.config,
|
|
11
|
+
route: ctx.route,
|
|
12
|
+
req: {},
|
|
13
|
+
res: {},
|
|
14
|
+
url: ctx.url,
|
|
15
|
+
params: ctx.params,
|
|
16
|
+
query: ctx.query,
|
|
17
|
+
headers: ctx.headers,
|
|
18
|
+
cookies: ctx.cookies,
|
|
19
|
+
});
|
|
20
|
+
// 2. Post-processing (Layout injection, hydration script injection)
|
|
21
|
+
// Note: Hydration logic is handled by island-hydration.ts usually
|
|
22
|
+
// 3. Optional Minification
|
|
23
|
+
if (minify) {
|
|
24
|
+
html = Minifier.minifyHtml(html);
|
|
44
25
|
}
|
|
26
|
+
return html;
|
|
27
|
+
}
|
|
45
28
|
}
|
|
@@ -1,30 +1,13 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
1
|
import { SSGPipeline } from "./ssg-pipeline.js";
|
|
19
2
|
import { log } from "../shared/log.js";
|
|
20
3
|
export class ProductionBuilder {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Run the production build sequence
|
|
6
|
+
*/
|
|
7
|
+
static async build(opts) {
|
|
8
|
+
log.info("--- PRODUCTION BUILD START ---");
|
|
9
|
+
const pipeline = new SSGPipeline(opts.config);
|
|
10
|
+
await pipeline.run();
|
|
11
|
+
log.info("--- PRODUCTION BUILD COMPLETE ---");
|
|
12
|
+
}
|
|
30
13
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readdirSync, existsSync } from "node:fs";
|
|
4
|
+
/**
|
|
5
|
+
* High-performance hashing using Rust utility
|
|
6
|
+
*/
|
|
7
|
+
export async function hashWithRust(options) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
// Binary is expected in lib/ relative to the project root
|
|
10
|
+
const libDir = join(process.cwd(), "lib");
|
|
11
|
+
if (!existsSync(libDir)) {
|
|
12
|
+
reject(new Error(`Binary directory not found: ${libDir}`));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Look for a file named 'utils' with any extension (e.g. utils.exe, utils.bin, or just utils)
|
|
16
|
+
let binaryName;
|
|
17
|
+
try {
|
|
18
|
+
const files = readdirSync(libDir);
|
|
19
|
+
binaryName = files.find((f) => f === "utils" || f.startsWith("utils."));
|
|
20
|
+
} catch (err) {
|
|
21
|
+
reject(new Error(`Failed to list binary directory: ${err.message}`));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!binaryName) {
|
|
25
|
+
reject(
|
|
26
|
+
new Error(
|
|
27
|
+
`Could not find 'utils' binary in ${libDir}. Ensure the Rust utility is compiled and placed in lib/.`,
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const binaryPath = join(libDir, binaryName);
|
|
33
|
+
const child = spawn(binaryPath, [], {
|
|
34
|
+
stdio: ["pipe", "pipe", "inherit"],
|
|
35
|
+
});
|
|
36
|
+
let stdout = "";
|
|
37
|
+
child.stdout.on("data", (data) => {
|
|
38
|
+
stdout += data.toString();
|
|
39
|
+
});
|
|
40
|
+
child.on("error", (err) => {
|
|
41
|
+
reject(new Error(`Failed to start Rust utility: ${err.message}`));
|
|
42
|
+
});
|
|
43
|
+
child.on("close", (code) => {
|
|
44
|
+
if (code !== 0 && !stdout) {
|
|
45
|
+
reject(new Error(`Rust utility exited with code ${code}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const response = JSON.parse(stdout);
|
|
50
|
+
if (response.ok) {
|
|
51
|
+
resolve(response);
|
|
52
|
+
} else {
|
|
53
|
+
reject(
|
|
54
|
+
new Error(response.error || "Unknown error from Rust utility"),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
} catch (e) {
|
|
58
|
+
reject(new Error(`Failed to parse Rust utility output: ${stdout}`));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Send command via stdin
|
|
62
|
+
const request = {
|
|
63
|
+
command: "hash",
|
|
64
|
+
path: options.path,
|
|
65
|
+
algorithm: options.algorithm || "sha256",
|
|
66
|
+
hashFileNames: options.hashFileNames || false,
|
|
67
|
+
};
|
|
68
|
+
child.stdin.write(JSON.stringify(request));
|
|
69
|
+
child.stdin.end();
|
|
70
|
+
});
|
|
71
|
+
}
|