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.
Files changed (355) hide show
  1. package/dist/colors.js +0 -17
  2. package/dist/create.js +5 -17
  3. package/dist/generator.js +14 -31
  4. package/dist/index.js +6 -1
  5. package/package.json +1 -1
  6. package/templates/ssr-isr/README.md +77 -0
  7. package/templates/ssr-isr/build.js +118 -0
  8. package/templates/ssr-isr/jen.config.ts +109 -0
  9. package/templates/ssr-isr/jenjs.d.ts +22 -0
  10. package/templates/ssr-isr/lib/api/(hello).js +9 -0
  11. package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
  12. package/templates/ssr-isr/lib/auth/index.js +2 -0
  13. package/templates/ssr-isr/lib/auth/jwt.js +57 -0
  14. package/templates/ssr-isr/lib/auth/session.js +92 -0
  15. package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
  16. package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
  17. package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
  18. package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
  19. package/templates/{static → ssr-isr}/lib/build/build.d.ts +1 -1
  20. package/templates/ssr-isr/lib/build/build.js +141 -0
  21. package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
  22. package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
  23. package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
  24. package/templates/ssr-isr/lib/build/minifier.js +46 -0
  25. package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
  26. package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
  27. package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
  28. package/templates/ssr-isr/lib/build/production-build.js +13 -0
  29. package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
  30. package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
  31. package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
  32. package/templates/ssr-isr/lib/cache/index.js +10 -0
  33. package/templates/ssr-isr/lib/cache/memory.js +40 -0
  34. package/templates/ssr-isr/lib/cache/redis.js +61 -0
  35. package/templates/ssr-isr/lib/cli/banner.js +28 -0
  36. package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
  37. package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
  38. package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
  39. package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
  40. package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
  41. package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
  42. package/templates/ssr-isr/lib/compilers/vue.js +90 -0
  43. package/templates/ssr-isr/lib/core/http.js +71 -0
  44. package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
  45. package/templates/ssr-isr/lib/core/paths.js +39 -0
  46. package/templates/ssr-isr/lib/core/routes/match.js +47 -0
  47. package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
  48. package/templates/ssr-isr/lib/core/types.js +1 -0
  49. package/templates/ssr-isr/lib/css/compiler.js +74 -0
  50. package/templates/ssr-isr/lib/db/connector.js +42 -0
  51. package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
  52. package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
  53. package/templates/ssr-isr/lib/db/index.js +48 -0
  54. package/templates/ssr-isr/lib/db/types.js +1 -0
  55. package/templates/ssr-isr/lib/graphql/index.js +52 -0
  56. package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
  57. package/templates/ssr-isr/lib/graphql/schema.js +35 -0
  58. package/templates/ssr-isr/lib/i18n/en.json +4 -0
  59. package/templates/ssr-isr/lib/i18n/es.json +4 -0
  60. package/templates/ssr-isr/lib/i18n/index.js +15 -0
  61. package/templates/ssr-isr/lib/import/jen-import.js +161 -0
  62. package/templates/ssr-isr/lib/index.js +116 -0
  63. package/templates/ssr-isr/lib/jdb/engine.js +275 -0
  64. package/templates/ssr-isr/lib/jdb/index.js +34 -0
  65. package/templates/ssr-isr/lib/jdb/types.js +1 -0
  66. package/templates/ssr-isr/lib/jdb/utils.js +176 -0
  67. package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.js +0 -17
  68. package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
  69. package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.js +0 -17
  70. package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.js +0 -17
  71. package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.js +0 -17
  72. package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.js +0 -17
  73. package/templates/ssr-isr/lib/middleware/context.js +124 -0
  74. package/templates/{static → ssr-isr}/lib/middleware/decorators.js +0 -17
  75. package/templates/{static → ssr-isr}/lib/middleware/errors/handler.js +0 -17
  76. package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
  77. package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
  78. package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
  79. package/templates/ssr-isr/lib/middleware/registry.js +85 -0
  80. package/templates/ssr-isr/lib/middleware/response.js +107 -0
  81. package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
  82. package/templates/ssr-isr/lib/middleware/types.js +1 -0
  83. package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
  84. package/templates/{static → ssr-isr}/lib/native/bundle.js +0 -17
  85. package/templates/{static → ssr-isr}/lib/native/dev-server.js +0 -17
  86. package/templates/{static → ssr-isr}/lib/native/index.js +0 -17
  87. package/templates/{static → ssr-isr}/lib/native/optimizer.js +0 -17
  88. package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
  89. package/templates/ssr-isr/lib/plugin/loader.js +36 -0
  90. package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
  91. package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
  92. package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
  93. package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
  94. package/templates/ssr-isr/lib/runtime/islands.js +110 -0
  95. package/templates/ssr-isr/lib/runtime/render.js +244 -0
  96. package/templates/ssr-isr/lib/server/api-routes.js +237 -0
  97. package/templates/ssr-isr/lib/server/api.js +108 -0
  98. package/templates/ssr-isr/lib/server/app.js +438 -0
  99. package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
  100. package/templates/ssr-isr/lib/server/ssr.js +202 -0
  101. package/templates/ssr-isr/lib/shared/log.js +64 -0
  102. package/templates/ssr-isr/package.json +23 -0
  103. package/templates/ssr-isr/server.js +128 -0
  104. package/templates/ssr-isr/site/pages/(index).tsx +11 -0
  105. package/templates/ssr-isr/site/styles/global.scss +37 -0
  106. package/templates/ssr-isr/tsconfig.json +39 -0
  107. package/templates/static/build.js +30 -18
  108. package/templates/static/jen.config.ts +0 -18
  109. package/templates/static/jenjs.d.ts +0 -18
  110. package/templates/static/lib/api/(hello).js +0 -17
  111. package/templates/static/lib/api/examples/files/[...slug].js +22 -0
  112. package/templates/static/lib/api/examples/hello.js +11 -0
  113. package/templates/static/lib/api/examples/posts/[id].js +37 -0
  114. package/templates/static/lib/api/examples/posts.js +37 -0
  115. package/templates/static/lib/api/examples/search.js +23 -0
  116. package/templates/static/lib/api/index.js +41 -0
  117. package/templates/static/lib/api/loader.js +234 -0
  118. package/templates/static/lib/api/router.js +259 -0
  119. package/templates/static/lib/assets/types.js +1 -0
  120. package/templates/static/lib/auth/cookie-utils.js +3 -16
  121. package/templates/static/lib/auth/index.js +0 -17
  122. package/templates/static/lib/auth/jwt.js +0 -17
  123. package/templates/static/lib/auth/session.js +0 -17
  124. package/templates/static/lib/build/asset-hashing.js +44 -36
  125. package/templates/static/lib/build/asset-manifest.js +16 -33
  126. package/templates/static/lib/build/build.js +270 -125
  127. package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
  128. package/templates/static/lib/build/bundle-analyzer.js +945 -0
  129. package/templates/static/lib/build/code-splitter.js +194 -0
  130. package/templates/static/lib/build/feature-analyzer.js +190 -0
  131. package/templates/static/lib/build/feature-gate.js +257 -0
  132. package/templates/static/lib/build/island-hydration.js +17 -35
  133. package/templates/static/lib/build/lazy-loader.js +322 -0
  134. package/templates/static/lib/build/minifier.js +40 -59
  135. package/templates/static/lib/build/page-renderer.js +23 -40
  136. package/templates/static/lib/build/production-build.js +9 -26
  137. package/templates/static/lib/build/rust-hashing.js +71 -0
  138. package/templates/static/lib/build/script-optimizer.js +285 -0
  139. package/templates/static/lib/build/ssg-pipeline.js +100 -106
  140. package/templates/static/lib/build/vercel-output.js +298 -0
  141. package/templates/static/lib/build-tools/build-site.js +0 -17
  142. package/templates/static/lib/cache/index.js +0 -17
  143. package/templates/static/lib/cache/memory.js +0 -17
  144. package/templates/static/lib/cache/redis.js +0 -17
  145. package/templates/static/lib/cli/banner.js +0 -17
  146. package/templates/static/lib/cli/templates/ssg/jen.config.js +0 -17
  147. package/templates/static/lib/cli/templates/ssr/jen.config.js +0 -17
  148. package/templates/static/lib/client/Image.js +42 -0
  149. package/templates/static/lib/client/Link.js +190 -0
  150. package/templates/static/lib/client/PWA.js +46 -0
  151. package/templates/static/lib/client/Seo.js +97 -0
  152. package/templates/static/lib/client/index.js +9 -0
  153. package/templates/static/lib/client/useNavigation.js +25 -0
  154. package/templates/static/lib/client/useRouter.js +64 -0
  155. package/templates/static/lib/client-routing/Link.js +17 -0
  156. package/templates/static/lib/client-routing/index.js +19 -0
  157. package/templates/static/lib/client-routing/router.js +151 -0
  158. package/templates/static/lib/client-routing/signal.js +147 -0
  159. package/templates/static/lib/compilers/esbuild-plugins.js +0 -17
  160. package/templates/static/lib/compilers/svelte.js +0 -17
  161. package/templates/static/lib/compilers/vue.js +0 -17
  162. package/templates/static/lib/core/config.js +0 -17
  163. package/templates/static/lib/core/feature-guard.js +136 -0
  164. package/templates/static/lib/core/features.js +99 -0
  165. package/templates/static/lib/core/http.js +0 -17
  166. package/templates/static/lib/core/layouts/index.js +10 -0
  167. package/templates/static/lib/core/layouts/render.js +158 -0
  168. package/templates/static/lib/core/layouts/scan.js +112 -0
  169. package/templates/static/lib/core/layouts/types.js +1 -0
  170. package/templates/static/lib/core/lifecycle.js +129 -0
  171. package/templates/static/lib/core/loader-schema.js +81 -0
  172. package/templates/static/lib/core/middleware-hooks.js +0 -17
  173. package/templates/static/lib/core/paths.js +0 -17
  174. package/templates/static/lib/core/routes/advanced.js +114 -0
  175. package/templates/static/lib/core/routes/handlers.js +181 -0
  176. package/templates/static/lib/core/routes/match.js +89 -17
  177. package/templates/static/lib/core/routes/orchestrator.js +171 -0
  178. package/templates/static/lib/core/routes/rendering-config.js +131 -0
  179. package/templates/static/lib/core/routes/scan.js +0 -17
  180. package/templates/static/lib/core/types.js +0 -17
  181. package/templates/static/lib/css/compiler.js +1 -18
  182. package/templates/static/lib/data-fetching/cache.js +223 -0
  183. package/templates/static/lib/data-fetching/client.js +202 -0
  184. package/templates/static/lib/data-fetching/feature-guard.js +29 -0
  185. package/templates/static/lib/data-fetching/graphql.js +265 -0
  186. package/templates/static/lib/data-fetching/index.js +57 -0
  187. package/templates/static/lib/data-fetching/rest.js +256 -0
  188. package/templates/static/lib/data-fetching/server.js +182 -0
  189. package/templates/static/lib/data-fetching/types.js +5 -0
  190. package/templates/static/lib/db/connector.js +0 -17
  191. package/templates/static/lib/db/drivers/jdb.js +0 -17
  192. package/templates/static/lib/db/drivers/sql.js +0 -17
  193. package/templates/static/lib/db/index.js +0 -17
  194. package/templates/static/lib/db/types.js +0 -17
  195. package/templates/static/lib/devtools/component-tree.js +106 -0
  196. package/templates/static/lib/devtools/devtools.js +638 -0
  197. package/templates/static/lib/devtools/event-bus.js +29 -0
  198. package/templates/static/lib/devtools/event-logger.js +67 -0
  199. package/templates/static/lib/devtools/index.js +9 -0
  200. package/templates/static/lib/devtools/integration.js +149 -0
  201. package/templates/static/lib/devtools/performance.js +84 -0
  202. package/templates/static/lib/devtools/persistence.js +57 -0
  203. package/templates/static/lib/devtools/plugins.js +97 -0
  204. package/templates/static/lib/devtools/search.js +89 -0
  205. package/templates/static/lib/devtools/ui.js +769 -0
  206. package/templates/static/lib/features/api/handler.js +10 -0
  207. package/templates/static/lib/features/api/index.js +5 -0
  208. package/templates/static/lib/features/api/types.js +4 -0
  209. package/templates/static/lib/features/middleware/compiled.js +7 -0
  210. package/templates/static/lib/features/middleware/index.js +5 -0
  211. package/templates/static/lib/features/middleware/types.js +4 -0
  212. package/templates/static/lib/fonts/index.js +46 -0
  213. package/templates/static/lib/fonts/inject.js +125 -0
  214. package/templates/static/lib/fonts/loader.js +196 -0
  215. package/templates/static/lib/fonts/types.js +1 -0
  216. package/templates/static/lib/graphql/index.js +1 -18
  217. package/templates/static/lib/graphql/resolvers.js +20 -13
  218. package/templates/static/lib/graphql/schema.js +0 -17
  219. package/templates/static/lib/i18n/index.js +7 -19
  220. package/templates/static/lib/import/jen-import.js +1 -18
  221. package/templates/static/lib/index.js +79 -125
  222. package/templates/static/lib/jdb/engine.js +0 -17
  223. package/templates/static/lib/jdb/index.js +1 -18
  224. package/templates/static/lib/jdb/types.js +0 -17
  225. package/templates/static/lib/jdb/utils.js +0 -17
  226. package/templates/static/lib/middleware/builtins/cors.js +3 -16
  227. package/templates/static/lib/middleware/context.js +0 -17
  228. package/templates/static/lib/middleware/kernel.js +117 -25
  229. package/templates/static/lib/middleware/pipeline.js +0 -17
  230. package/templates/static/lib/middleware/registry.js +0 -17
  231. package/templates/static/lib/middleware/response.js +0 -17
  232. package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
  233. package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
  234. package/templates/static/lib/plugin/loader.js +0 -17
  235. package/templates/static/lib/plugin/plugin-manager.js +177 -0
  236. package/templates/static/lib/plugin/types.js +28 -0
  237. package/templates/static/lib/runtime/client-runtime.js +0 -17
  238. package/templates/static/lib/runtime/hmr.js +0 -17
  239. package/templates/static/lib/runtime/hydrate.js +0 -17
  240. package/templates/static/lib/runtime/island-hydration-client.js +0 -17
  241. package/templates/static/lib/runtime/islands.js +0 -17
  242. package/templates/static/lib/runtime/render.js +208 -50
  243. package/templates/static/lib/security/security-config.js +60 -0
  244. package/templates/static/lib/security/security-middleware.js +229 -0
  245. package/templates/static/lib/server/api-routes.js +153 -43
  246. package/templates/static/lib/server/api.js +0 -17
  247. package/templates/static/lib/server/app.js +539 -223
  248. package/templates/static/lib/server/isr.js +365 -0
  249. package/templates/static/lib/server/runtimeServe.js +31 -24
  250. package/templates/static/lib/server/ssr.js +98 -22
  251. package/templates/static/lib/server-actions/handler.js +180 -0
  252. package/templates/static/lib/server-actions/index.js +19 -0
  253. package/templates/static/lib/server-actions/middleware.js +146 -0
  254. package/templates/static/lib/server-actions/scan.js +152 -0
  255. package/templates/static/lib/server-actions/types.js +1 -0
  256. package/templates/static/lib/server-actions/validators.js +156 -0
  257. package/templates/static/lib/shared/log.js +19 -20
  258. package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
  259. package/templates/static/lib/telemetry/api/validator.js +67 -0
  260. package/templates/static/lib/telemetry/client.js +121 -0
  261. package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
  262. package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
  263. package/templates/static/lib/vendor/glob/glob.js +4766 -0
  264. package/templates/static/lib/vendor/preact/LICENSE +21 -0
  265. package/templates/static/lib/vendor/preact/preact.module.js +797 -0
  266. package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
  267. package/templates/static/package.json +4 -0
  268. package/templates/static/server.js +22 -22
  269. package/templates/static/site/(home).tsx +0 -18
  270. package/templates/static/tsconfig.json +5 -1
  271. package/templates/static/.esbuild/jen.config.js +0 -19
  272. package/templates/static/lib/build/asset-hashing.d.ts +0 -10
  273. package/templates/static/lib/build/asset-manifest.d.ts +0 -11
  274. package/templates/static/lib/build/minifier.d.ts +0 -20
  275. package/templates/static/lib/build/page-renderer.d.ts +0 -17
  276. package/templates/static/lib/build/production-build.d.ts +0 -10
  277. package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
  278. package/templates/static/lib/middleware/errors/http-error.js +0 -27
  279. package/templates/static/lib/middleware/types.js +0 -18
  280. package/templates/static/lib/middleware/utils/matcher.js +0 -30
  281. package/templates/static/lib/native/style-compiler.js +0 -36
  282. /package/templates/{static → ssr-isr}/lib/api/(hello).d.ts +0 -0
  283. /package/templates/{static → ssr-isr}/lib/auth/cookie-utils.d.ts +0 -0
  284. /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
  285. /package/templates/{static → ssr-isr}/lib/auth/jwt.d.ts +0 -0
  286. /package/templates/{static → ssr-isr}/lib/auth/session.d.ts +0 -0
  287. /package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +0 -0
  288. /package/templates/{static → ssr-isr}/lib/cache/index.d.ts +0 -0
  289. /package/templates/{static → ssr-isr}/lib/cache/memory.d.ts +0 -0
  290. /package/templates/{static → ssr-isr}/lib/cache/redis.d.ts +0 -0
  291. /package/templates/{static → ssr-isr}/lib/cli/banner.d.ts +0 -0
  292. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
  293. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
  294. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
  295. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
  296. /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
  297. /package/templates/{static → ssr-isr}/lib/compilers/svelte.d.ts +0 -0
  298. /package/templates/{static → ssr-isr}/lib/compilers/vue.d.ts +0 -0
  299. /package/templates/{static → ssr-isr}/lib/core/config.d.ts +0 -0
  300. /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
  301. /package/templates/{static → ssr-isr}/lib/core/http.d.ts +0 -0
  302. /package/templates/{static → ssr-isr}/lib/core/middleware-hooks.d.ts +0 -0
  303. /package/templates/{static → ssr-isr}/lib/core/paths.d.ts +0 -0
  304. /package/templates/{static → ssr-isr}/lib/core/routes/match.d.ts +0 -0
  305. /package/templates/{static → ssr-isr}/lib/core/routes/scan.d.ts +0 -0
  306. /package/templates/{static → ssr-isr}/lib/core/types.d.ts +0 -0
  307. /package/templates/{static → ssr-isr}/lib/css/compiler.d.ts +0 -0
  308. /package/templates/{static → ssr-isr}/lib/db/connector.d.ts +0 -0
  309. /package/templates/{static → ssr-isr}/lib/db/drivers/jdb.d.ts +0 -0
  310. /package/templates/{static → ssr-isr}/lib/db/drivers/sql.d.ts +0 -0
  311. /package/templates/{static → ssr-isr}/lib/db/index.d.ts +0 -0
  312. /package/templates/{static → ssr-isr}/lib/db/types.d.ts +0 -0
  313. /package/templates/{static → ssr-isr}/lib/graphql/index.d.ts +0 -0
  314. /package/templates/{static → ssr-isr}/lib/graphql/resolvers.d.ts +0 -0
  315. /package/templates/{static → ssr-isr}/lib/graphql/schema.d.ts +0 -0
  316. /package/templates/{static → ssr-isr}/lib/i18n/index.d.ts +0 -0
  317. /package/templates/{static → ssr-isr}/lib/import/jen-import.d.ts +0 -0
  318. /package/templates/{static → ssr-isr}/lib/index.d.ts +0 -0
  319. /package/templates/{static → ssr-isr}/lib/jdb/engine.d.ts +0 -0
  320. /package/templates/{static → ssr-isr}/lib/jdb/index.d.ts +0 -0
  321. /package/templates/{static → ssr-isr}/lib/jdb/types.d.ts +0 -0
  322. /package/templates/{static → ssr-isr}/lib/jdb/utils.d.ts +0 -0
  323. /package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.d.ts +0 -0
  324. /package/templates/{static → ssr-isr}/lib/middleware/builtins/cors.d.ts +0 -0
  325. /package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.d.ts +0 -0
  326. /package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.d.ts +0 -0
  327. /package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.d.ts +0 -0
  328. /package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.d.ts +0 -0
  329. /package/templates/{static → ssr-isr}/lib/middleware/context.d.ts +0 -0
  330. /package/templates/{static → ssr-isr}/lib/middleware/decorators.d.ts +0 -0
  331. /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
  332. /package/templates/{static → ssr-isr}/lib/middleware/errors/http-error.d.ts +0 -0
  333. /package/templates/{static → ssr-isr}/lib/middleware/kernel.d.ts +0 -0
  334. /package/templates/{static → ssr-isr}/lib/middleware/pipeline.d.ts +0 -0
  335. /package/templates/{static → ssr-isr}/lib/middleware/registry.d.ts +0 -0
  336. /package/templates/{static → ssr-isr}/lib/middleware/response.d.ts +0 -0
  337. /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
  338. /package/templates/{static → ssr-isr}/lib/native/bundle.d.ts +0 -0
  339. /package/templates/{static → ssr-isr}/lib/native/dev-server.d.ts +0 -0
  340. /package/templates/{static → ssr-isr}/lib/native/index.d.ts +0 -0
  341. /package/templates/{static → ssr-isr}/lib/native/optimizer.d.ts +0 -0
  342. /package/templates/{static → ssr-isr}/lib/native/style-compiler.d.ts +0 -0
  343. /package/templates/{static → ssr-isr}/lib/plugin/loader.d.ts +0 -0
  344. /package/templates/{static → ssr-isr}/lib/runtime/client-runtime.d.ts +0 -0
  345. /package/templates/{static → ssr-isr}/lib/runtime/hmr.d.ts +0 -0
  346. /package/templates/{static → ssr-isr}/lib/runtime/hydrate.d.ts +0 -0
  347. /package/templates/{static → ssr-isr}/lib/runtime/island-hydration-client.d.ts +0 -0
  348. /package/templates/{static → ssr-isr}/lib/runtime/islands.d.ts +0 -0
  349. /package/templates/{static → ssr-isr}/lib/runtime/render.d.ts +0 -0
  350. /package/templates/{static → ssr-isr}/lib/server/api-routes.d.ts +0 -0
  351. /package/templates/{static → ssr-isr}/lib/server/api.d.ts +0 -0
  352. /package/templates/{static → ssr-isr}/lib/server/app.d.ts +0 -0
  353. /package/templates/{static → ssr-isr}/lib/server/runtimeServe.d.ts +0 -0
  354. /package/templates/{static → ssr-isr}/lib/server/ssr.d.ts +0 -0
  355. /package/templates/{static → ssr-isr}/lib/shared/log.d.ts +0 -0
@@ -1,20 +1,3 @@
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
  const SESSION_TIMEOUT = parseInt(process.env.SESSION_TIMEOUT ?? "86400000", 10); // 24 hours default
19
2
  /**
20
3
  * In-memory session manager
@@ -1,42 +1,50 @@
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 { createHash } from "node:crypto";
19
2
  import { readFileSync, renameSync } from "node:fs";
20
3
  import { join, dirname, basename, extname } from "node:path";
4
+ import { hashWithRust } from "./rust-hashing.js";
21
5
  export class AssetHasher {
22
- /**
23
- * Calculate hash of file content
24
- */
25
- static hashContent(content) {
26
- return createHash("md5").update(content).digest("hex").slice(0, 10);
27
- }
28
- /**
29
- * Rename file to include hash (e.g. style.css -> style.a1b2c3.css)
30
- */
31
- static hashFile(filePath) {
32
- const content = readFileSync(filePath);
33
- const hash = this.hashContent(content);
34
- const dir = dirname(filePath);
35
- const ext = extname(filePath);
36
- const name = basename(filePath, ext);
37
- const newName = `${name}.${hash}${ext}`;
38
- const newPath = join(dir, newName);
39
- renameSync(filePath, newPath);
40
- return newName;
6
+ /**
7
+ * Calculate hash of file content
8
+ */
9
+ static hashContent(content) {
10
+ return createHash("md5").update(content).digest("hex").slice(0, 10);
11
+ }
12
+ /**
13
+ * High-performance hashing for directories using Rust utility.
14
+ * Useful during build for hashing all assets in bulk.
15
+ */
16
+ static async hashDirectory(dirPath) {
17
+ try {
18
+ const response = await hashWithRust({
19
+ path: dirPath,
20
+ algorithm: "sha256",
21
+ hashFileNames: false,
22
+ });
23
+ const result = {};
24
+ for (const h of response.hashes) {
25
+ // Rust returns relative path, map it to hash
26
+ result[h.path] = h.hash.slice(0, 10);
27
+ }
28
+ return result;
29
+ } catch (err) {
30
+ console.warn(
31
+ `[AssetHasher] Rust hashing failed, falling back to Node.js: ${err}`,
32
+ );
33
+ return {}; // Fallback would be implemented by caller or here
41
34
  }
35
+ }
36
+ /**
37
+ * Rename file to include hash (e.g. style.css -> style.a1b2c3.css)
38
+ */
39
+ static hashFile(filePath) {
40
+ const content = readFileSync(filePath);
41
+ const hash = this.hashContent(content);
42
+ const dir = dirname(filePath);
43
+ const ext = extname(filePath);
44
+ const name = basename(filePath, ext);
45
+ const newName = `${name}.${hash}${ext}`;
46
+ const newPath = join(dir, newName);
47
+ renameSync(filePath, newPath);
48
+ return newName;
49
+ }
42
50
  }
@@ -1,38 +1,21 @@
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 { writeFileSync, readFileSync, existsSync } from "node:fs";
19
2
  import { join } from "node:path";
20
3
  export class AssetManifest {
21
- manifest = {};
22
- manifestPath;
23
- constructor(distDir) {
24
- this.manifestPath = join(distDir, "manifest.json");
25
- if (existsSync(this.manifestPath)) {
26
- this.manifest = JSON.parse(readFileSync(this.manifestPath, "utf8"));
27
- }
28
- }
29
- set(original, hashed) {
30
- this.manifest[original] = hashed;
31
- }
32
- get(original) {
33
- return this.manifest[original];
34
- }
35
- save() {
36
- writeFileSync(this.manifestPath, JSON.stringify(this.manifest, null, 2));
4
+ manifest = {};
5
+ manifestPath;
6
+ constructor(distDir) {
7
+ this.manifestPath = join(distDir, "manifest.json");
8
+ if (existsSync(this.manifestPath)) {
9
+ this.manifest = JSON.parse(readFileSync(this.manifestPath, "utf8"));
37
10
  }
11
+ }
12
+ set(original, hashed) {
13
+ this.manifest[original] = hashed;
14
+ }
15
+ get(original) {
16
+ return this.manifest[original];
17
+ }
18
+ save() {
19
+ writeFileSync(this.manifestPath, JSON.stringify(this.manifest, null, 2));
20
+ }
38
21
  }
@@ -1,150 +1,295 @@
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
- import { mkdirSync, rmSync, writeFileSync, existsSync, copyFileSync, readdirSync, statSync, } from "node:fs";
19
- import { join } from "node:path";
1
+ import {
2
+ mkdirSync,
3
+ rmSync,
4
+ writeFileSync,
5
+ existsSync,
6
+ copyFileSync,
7
+ readdirSync,
8
+ statSync,
9
+ readFileSync,
10
+ renameSync,
11
+ } from "node:fs";
12
+ import { join, dirname, basename, extname } from "node:path";
13
+ import { fileURLToPath } from "node:url";
20
14
  import esbuild from "esbuild";
21
15
  import { createScssCompiler } from "../css/compiler.js";
22
- import { vueEsbuildPlugin, svelteEsbuildPlugin, } from "../compilers/esbuild-plugins.js";
16
+ import {
17
+ vueEsbuildPlugin,
18
+ svelteEsbuildPlugin,
19
+ } from "../compilers/esbuild-plugins.js";
23
20
  import { scanRoutes } from "../core/routes/scan.js";
24
21
  import { resolveDistPath } from "../core/paths.js";
25
22
  import { log } from "../shared/log.js";
26
23
  import { renderRouteToHtml } from "../runtime/render.js";
24
+ import { injectFonts } from "../fonts/inject.js";
25
+ import { AssetHasher } from "./asset-hashing.js";
26
+ // Get __dirname for ES modules
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = dirname(__filename);
27
29
  /**
28
30
  * Recursively copies a directory and all its contents.
29
31
  * Used to copy static assets from the source directory to the build output.
30
- * Creates the destination directory structure as needed.
31
- *
32
- * @param src The source directory path.
33
- * @param dst The destination directory path.
34
32
  */
35
33
  function copyDir(src, dst) {
36
- if (!existsSync(src))
37
- return;
38
- mkdirSync(dst, { recursive: true });
39
- for (const name of readdirSync(src)) {
40
- const sp = join(src, name);
41
- const dp = join(dst, name);
42
- const st = statSync(sp);
43
- if (st.isDirectory())
44
- copyDir(sp, dp);
45
- else
46
- copyFileSync(sp, dp);
47
- }
34
+ if (!existsSync(src)) return;
35
+ mkdirSync(dst, { recursive: true });
36
+ for (const name of readdirSync(src)) {
37
+ const sp = join(src, name);
38
+ const dp = join(dst, name);
39
+ const st = statSync(sp);
40
+ if (st.isDirectory()) copyDir(sp, dp);
41
+ else copyFileSync(sp, dp);
42
+ }
43
+ }
44
+ /**
45
+ * FIXED: Mock Response/Request to prevent crashes during SSG
46
+ * when components or middleware call res.setHeader()
47
+ */
48
+ function createSsgMocks() {
49
+ return {
50
+ req: {
51
+ headers: {},
52
+ method: "GET",
53
+ url: "/",
54
+ cookies: {},
55
+ },
56
+ res: {
57
+ setHeader: () => {},
58
+ getHeader: () => {},
59
+ getHeaders: () => ({}),
60
+ removeHeader: () => {},
61
+ writeHead: () => ({}),
62
+ end: () => {},
63
+ statusCode: 200,
64
+ },
65
+ };
48
66
  }
49
67
  /**
50
68
  * Builds a static site by pre-rendering all routes to HTML files.
51
- * This is the core static site generation (SSG) function that runs at build time.
52
- * It performs the following steps:
53
- * 1. Clears the previous build output directory
54
- * 2. Discovers all route files in the configured site directory
55
- * 3. Renders each route to a static HTML file
56
- * 4. Copies static assets from the source directory
57
- * 5. Bundles Vue and Svelte components for client-side rehydration
58
- * 6. Compiles SCSS to CSS for the global stylesheet
59
- *
60
- * Routes are rendered with empty req/res objects (SSG mode) to avoid middleware execution.
61
- * This produces pure static HTML that can be served by any web server.
62
- * Hydration scripts are still injected if the route has hydrate:true, allowing for
63
- * optional client-side interactivity in otherwise static pages.
64
- *
65
- * @param opts Configuration object.
66
- * @param opts.config The Jen.js framework configuration.
67
- * @throws Logs warnings for missing assets or component bundling failures but does not stop the build.
68
69
  */
69
70
  export async function buildSite(opts) {
70
- const { config } = opts;
71
- // Clear and recreate the dist directory for a clean build.
72
- const dist = resolveDistPath(config);
73
- rmSync(dist, { recursive: true, force: true });
74
- mkdirSync(dist, { recursive: true });
75
- // Discover all routes and pre-render each to a static HTML file.
76
- const routes = scanRoutes(config);
77
- log.info(`Building SSG: ${routes.length} routes`);
78
- for (const r of routes) {
79
- // Create a synthetic URL for each route. Used as the request URL during rendering.
80
- const url = new URL("http://localhost" + r.urlPath);
81
- // Render the route to HTML. Empty req/res indicates SSG mode (no middleware execution).
82
- const html = await renderRouteToHtml({
83
- config,
84
- route: r,
85
- req: {},
86
- res: {},
87
- url,
88
- params: {},
89
- query: {},
90
- headers: {},
91
- cookies: {},
92
- });
93
- // Calculate output path. Root route goes to index.html, nested routes get their own directories.
94
- const outPath = r.urlPath === "/"
95
- ? join(dist, "index.html")
96
- : join(dist, r.urlPath.slice(1), "index.html");
97
- mkdirSync(join(outPath, ".."), { recursive: true });
98
- writeFileSync(outPath, html, "utf8");
99
- log.info(`SSG: ${r.urlPath} -> ${outPath}`);
71
+ const { config } = opts;
72
+ const { req, res } = createSsgMocks();
73
+ // Inject fonts configuration into config.inject.head
74
+ injectFonts(config);
75
+ // Clear and recreate the dist directory for a clean build.
76
+ const dist = resolveDistPath(config);
77
+ rmSync(dist, { recursive: true, force: true });
78
+ mkdirSync(dist, { recursive: true });
79
+ // Discover all routes and pre-render each to a static HTML file.
80
+ const routes = scanRoutes(config);
81
+ log.info(`Building SSG: ${routes.length} routes`);
82
+ for (const r of routes) {
83
+ // Create a synthetic URL for each route.
84
+ const url = new URL("http://localhost" + r.urlPath);
85
+ // Render the route to HTML.
86
+ let html = await renderRouteToHtml({
87
+ config,
88
+ route: r,
89
+ req, // Using fixed mocks
90
+ res, // Using fixed mocks
91
+ url,
92
+ params: {},
93
+ query: {},
94
+ headers: {},
95
+ cookies: {},
96
+ });
97
+ // Inject polyfills and Preact runtime script tags
98
+ const polyfillsScript = `<script src="/polyfills.js"></script>`;
99
+ const preactScript = `<script type="module" src="/preact-runtime.js"></script>`;
100
+ const injectedScripts = `${polyfillsScript}${preactScript}`;
101
+ // FIXED: Case-insensitive injection for </body>
102
+ const bodyRegex = /<\/body>/i;
103
+ if (bodyRegex.test(html)) {
104
+ html = html.replace(bodyRegex, (match) => `${injectedScripts}${match}`);
105
+ } else {
106
+ html = html + injectedScripts;
100
107
  }
101
- // Copy static assets from the source assets directory to the built site.
102
- copyDir(join(process.cwd(), config.siteDir, "assets"), join(dist, "assets"));
103
- // Bundle Vue and Svelte components found in the site directory.
104
- // These are transpiled to JavaScript modules for client-side use in interactive pages.
105
- const siteSourceDir = join(process.cwd(), config.siteDir);
106
- const vueFiles = readdirSync(siteSourceDir, { recursive: true }).filter((f) => String(f).endsWith(".vue") || String(f).endsWith(".svelte"));
107
- if (vueFiles.length > 0) {
108
- log.info(`Found ${vueFiles.length} Vue/Svelte components, bundling...`);
108
+ // Calculate output path.
109
+ const outPath =
110
+ r.urlPath === "/"
111
+ ? join(dist, "index.html")
112
+ : join(dist, r.urlPath.replace(/\/$/, ""), "index.html");
113
+ mkdirSync(dirname(outPath), { recursive: true });
114
+ writeFileSync(outPath, html, "utf8");
115
+ log.info(`SSG: ${r.urlPath} -> ${outPath}`);
116
+ }
117
+ // Copy static assets
118
+ const assetsSrc = join(process.cwd(), config.siteDir, "assets");
119
+ const assetsDst = join(dist, "assets");
120
+ copyDir(assetsSrc, assetsDst);
121
+ // Asset hashing with Rust utility if enabled
122
+ if (config.build?.hashAssets) {
123
+ log.info("Hashing assets with Rust...");
124
+ const hashes = await AssetHasher.hashDirectory(assetsDst);
125
+ log.info(`Hashed ${Object.keys(hashes).length} assets.`);
126
+ const manifest = {};
127
+ // Rename assets with their hashes and build manifest for HTML updating
128
+ for (const [relPath, hash] of Object.entries(hashes)) {
129
+ const fullPath = join(assetsDst, relPath);
130
+ const ext = extname(fullPath);
131
+ const dir = dirname(fullPath);
132
+ const name = basename(fullPath, ext);
133
+ const newFileName = `${name}.${hash}${ext}`;
134
+ const newPath = join(dir, newFileName);
135
+ // Store the mapping for HTML link replacement (normalized for web)
136
+ const oldPublicPath = `/assets/${relPath}`.replace(/\\/g, "/");
137
+ const newPublicPath =
138
+ `/assets/${join(dirname(relPath), newFileName)}`.replace(/\\/g, "/");
139
+ manifest[oldPublicPath] = newPublicPath;
140
+ if (existsSync(fullPath)) {
109
141
  try {
110
- await esbuild.build({
111
- entryPoints: vueFiles.map((f) => join(siteSourceDir, String(f))),
112
- outdir: join(dist, "components"),
113
- format: "esm",
114
- target: "es2022",
115
- bundle: false,
116
- plugins: [vueEsbuildPlugin(), svelteEsbuildPlugin()],
117
- external: ["preact", "vue", "svelte"],
118
- logLevel: "info",
119
- });
120
- log.info("Vue/Svelte components bundled successfully.");
142
+ renameSync(fullPath, newPath);
143
+ } catch (err) {
144
+ log.warn(`Failed to rename asset ${relPath}: ${err.message}`);
121
145
  }
122
- catch (err) {
123
- log.warn(`Failed to bundle Vue/Svelte components: ${err.message}`);
146
+ }
147
+ }
148
+ // FIXED: Update HTML files with new hashed paths so assets don't 404
149
+ const htmlFiles = readdirSync(dist, { recursive: true })
150
+ .filter((f) => String(f).endsWith(".html"))
151
+ .map((f) => join(dist, String(f)));
152
+ for (const file of htmlFiles) {
153
+ let content = readFileSync(file, "utf8");
154
+ let changed = false;
155
+ for (const [oldPath, newPath] of Object.entries(manifest)) {
156
+ if (content.includes(oldPath)) {
157
+ content = content.split(oldPath).join(newPath);
158
+ changed = true;
124
159
  }
160
+ }
161
+ if (changed) writeFileSync(file, content);
125
162
  }
126
- // Compile the global SCSS file to CSS.
127
- // This stylesheet is injected into every page and contains framework-wide styles.
128
- // Minification is enabled for production builds.
129
- const scssPath = join(process.cwd(), config.css.globalScss);
130
- if (existsSync(scssPath)) {
131
- const compiler = createScssCompiler();
132
- const result = compiler.compile({
133
- inputPath: scssPath,
134
- minified: true,
163
+ if (config.build?.generateManifest) {
164
+ writeFileSync(
165
+ join(dist, "asset-manifest.json"),
166
+ JSON.stringify(hashes, null, 2),
167
+ );
168
+ log.info("Generated asset-manifest.json");
169
+ }
170
+ }
171
+ // Bundle Vue and Svelte components
172
+ if (config.features?.compilers !== false) {
173
+ const siteSourceDir = join(process.cwd(), config.siteDir);
174
+ const componentFiles = readdirSync(siteSourceDir, {
175
+ recursive: true,
176
+ }).filter((f) => /\.(vue|svelte)$/.test(String(f)));
177
+ if (componentFiles.length > 0) {
178
+ log.info(
179
+ `Found ${componentFiles.length} Vue/Svelte components, bundling...`,
180
+ );
181
+ try {
182
+ await esbuild.build({
183
+ entryPoints: componentFiles.map((f) =>
184
+ join(siteSourceDir, String(f)),
185
+ ),
186
+ outdir: join(dist, "components"),
187
+ format: "esm",
188
+ target: "es2022",
189
+ bundle: true, // Increased to true to resolve internal deps
190
+ plugins: [vueEsbuildPlugin(), svelteEsbuildPlugin()],
191
+ external: ["preact", "vue", "svelte"],
192
+ logLevel: "info",
135
193
  });
136
- if (result.error) {
137
- log.error(`SCSS Compilation Failed: ${result.error}`);
138
- writeFileSync(join(dist, "styles.css"), "/* SCSS Compilation Failed */");
139
- }
140
- else {
141
- writeFileSync(join(dist, "styles.css"), result.css);
142
- log.info(`Compiled global SCSS: ${config.css.globalScss}`);
143
- }
194
+ log.info("Vue/Svelte components bundled successfully.");
195
+ } catch (err) {
196
+ log.warn(`Failed to bundle Vue/Svelte components: ${err.message}`);
197
+ }
198
+ }
199
+ }
200
+ // Bundle polyfills
201
+ const polyfillsPaths = [
202
+ join(process.cwd(), "src/runtime/polyfills.js"),
203
+ join(process.cwd(), "../src/runtime/polyfills.js"),
204
+ join(process.cwd(), "../../src/runtime/polyfills.js"),
205
+ ];
206
+ let polyfillsPath = null;
207
+ for (const path of polyfillsPaths) {
208
+ if (existsSync(path)) {
209
+ polyfillsPath = path;
210
+ break;
211
+ }
212
+ }
213
+ if (polyfillsPath) {
214
+ log.info("Bundling polyfills for backwards compatibility...");
215
+ const polyfillsMetaPath = join(dist, "polyfills-meta.json");
216
+ try {
217
+ const polyfillsMeta = await esbuild.build({
218
+ entryPoints: [polyfillsPath],
219
+ outfile: join(dist, "polyfills.js"),
220
+ format: "iife",
221
+ target: "es2015",
222
+ bundle: true,
223
+ minify: true,
224
+ sourcemap: false,
225
+ logLevel: "info",
226
+ metafile: true,
227
+ });
228
+ if (polyfillsMeta.metafile) {
229
+ writeFileSync(
230
+ polyfillsMetaPath,
231
+ JSON.stringify(polyfillsMeta.metafile, null, 2),
232
+ );
233
+ }
234
+ log.info("✅ Polyfills bundled: polyfills.js");
235
+ } catch (err) {
236
+ log.warn(`Failed to bundle polyfills: ${err.message}`);
237
+ }
238
+ }
239
+ // Bundle Preact runtime
240
+ const preactBundleEntry = join(
241
+ process.cwd(),
242
+ ".jen",
243
+ "preact-runtime-entry.js",
244
+ );
245
+ mkdirSync(dirname(preactBundleEntry), { recursive: true });
246
+ writeFileSync(
247
+ preactBundleEntry,
248
+ `export * from 'preact'; export * from 'preact/hooks'; export * from 'preact/compat';
249
+ if (typeof window !== 'undefined') { window.__PREACT_BUNDLE__ = true; }`,
250
+ );
251
+ log.info("Bundling Preact runtime...");
252
+ const preactMetaPath = join(dist, "preact-runtime-meta.json");
253
+ try {
254
+ const preactMeta = await esbuild.build({
255
+ entryPoints: [preactBundleEntry],
256
+ outfile: join(dist, "preact-runtime.js"),
257
+ format: "esm",
258
+ target: "es2015",
259
+ bundle: true,
260
+ minify: true,
261
+ sourcemap: false,
262
+ logLevel: "info",
263
+ metafile: true,
264
+ });
265
+ if (preactMeta.metafile) {
266
+ writeFileSync(
267
+ preactMetaPath,
268
+ JSON.stringify(preactMeta.metafile, null, 2),
269
+ );
144
270
  }
145
- else {
146
- log.warn(`Global SCSS file not found: ${scssPath}`);
147
- writeFileSync(join(dist, "styles.css"), "/* No global SCSS found */");
271
+ log.info("Preact runtime bundled: preact-runtime.js");
272
+ } catch (err) {
273
+ log.warn(`Failed to bundle Preact runtime: ${err.message}`);
274
+ }
275
+ // Compile global SCSS
276
+ const scssPath = join(process.cwd(), config.css.globalScss);
277
+ if (existsSync(scssPath)) {
278
+ const compiler = createScssCompiler();
279
+ const result = compiler.compile({
280
+ inputPath: scssPath,
281
+ minified: true,
282
+ });
283
+ if (result.error) {
284
+ log.error(`SCSS Compilation Failed: ${result.error}`);
285
+ writeFileSync(join(dist, "styles.css"), "/* SCSS Compilation Failed */");
286
+ } else {
287
+ writeFileSync(join(dist, "styles.css"), result.css);
288
+ log.info(`Compiled global SCSS: ${config.css.globalScss}`);
148
289
  }
149
- log.info("Build complete.");
290
+ } else {
291
+ log.warn(`Global SCSS file not found: ${scssPath}`);
292
+ writeFileSync(join(dist, "styles.css"), "/* No global SCSS found */");
293
+ }
294
+ log.info("Build complete.");
150
295
  }