create-jen-app 1.2.2 → 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 (861) hide show
  1. package/README.md +3 -1
  2. package/dist/colors.js +0 -17
  3. package/dist/create.js +5 -17
  4. package/dist/generator.js +14 -31
  5. package/package.json +2 -2
  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).d.ts +7 -0
  11. package/templates/ssr-isr/lib/api/(hello).js +9 -0
  12. package/templates/ssr-isr/lib/auth/cookie-utils.d.ts +33 -0
  13. package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
  14. package/templates/ssr-isr/lib/auth/index.js +2 -0
  15. package/templates/ssr-isr/lib/auth/jwt.d.ts +30 -0
  16. package/templates/ssr-isr/lib/auth/jwt.js +57 -0
  17. package/templates/ssr-isr/lib/auth/session.d.ts +44 -0
  18. package/templates/ssr-isr/lib/auth/session.js +92 -0
  19. package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
  20. package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
  21. package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
  22. package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
  23. package/templates/ssr-isr/lib/build/build.d.ts +24 -0
  24. package/templates/ssr-isr/lib/build/build.js +141 -0
  25. package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
  26. package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
  27. package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
  28. package/templates/ssr-isr/lib/build/minifier.js +46 -0
  29. package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
  30. package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
  31. package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
  32. package/templates/ssr-isr/lib/build/production-build.js +13 -0
  33. package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
  34. package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
  35. package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +3 -3
  36. package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
  37. package/templates/ssr-isr/lib/cache/index.d.ts +10 -0
  38. package/templates/ssr-isr/lib/cache/index.js +10 -0
  39. package/templates/ssr-isr/lib/cache/memory.d.ts +33 -0
  40. package/templates/ssr-isr/lib/cache/memory.js +40 -0
  41. package/templates/ssr-isr/lib/cache/redis.d.ts +45 -0
  42. package/templates/ssr-isr/lib/cache/redis.js +61 -0
  43. package/templates/ssr-isr/lib/cli/banner.d.ts +5 -0
  44. package/templates/ssr-isr/lib/cli/banner.js +28 -0
  45. package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
  46. package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
  47. package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
  48. package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
  49. package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
  50. package/templates/ssr-isr/lib/compilers/svelte.d.ts +18 -0
  51. package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
  52. package/templates/ssr-isr/lib/compilers/vue.d.ts +15 -0
  53. package/templates/ssr-isr/lib/compilers/vue.js +90 -0
  54. package/templates/ssr-isr/lib/core/config.d.ts +220 -0
  55. package/templates/ssr-isr/lib/core/http.d.ts +56 -0
  56. package/templates/ssr-isr/lib/core/http.js +71 -0
  57. package/templates/ssr-isr/lib/core/middleware-hooks.d.ts +219 -0
  58. package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
  59. package/templates/ssr-isr/lib/core/paths.d.ts +44 -0
  60. package/templates/ssr-isr/lib/core/paths.js +39 -0
  61. package/templates/ssr-isr/lib/core/routes/match.d.ts +54 -0
  62. package/templates/ssr-isr/lib/core/routes/match.js +47 -0
  63. package/templates/ssr-isr/lib/core/routes/scan.d.ts +53 -0
  64. package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
  65. package/templates/ssr-isr/lib/core/types.d.ts +153 -0
  66. package/templates/ssr-isr/lib/core/types.js +1 -0
  67. package/templates/ssr-isr/lib/css/compiler.d.ts +23 -0
  68. package/templates/ssr-isr/lib/css/compiler.js +74 -0
  69. package/templates/ssr-isr/lib/db/connector.d.ts +30 -0
  70. package/templates/ssr-isr/lib/db/connector.js +42 -0
  71. package/templates/ssr-isr/lib/db/drivers/jdb.d.ts +17 -0
  72. package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
  73. package/templates/ssr-isr/lib/db/drivers/sql.d.ts +22 -0
  74. package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
  75. package/templates/ssr-isr/lib/db/index.d.ts +27 -0
  76. package/templates/ssr-isr/lib/db/index.js +48 -0
  77. package/templates/ssr-isr/lib/db/types.d.ts +33 -0
  78. package/templates/ssr-isr/lib/db/types.js +1 -0
  79. package/templates/ssr-isr/lib/graphql/index.d.ts +48 -0
  80. package/templates/ssr-isr/lib/graphql/index.js +52 -0
  81. package/templates/ssr-isr/lib/graphql/resolvers.d.ts +57 -0
  82. package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
  83. package/templates/ssr-isr/lib/graphql/schema.d.ts +35 -0
  84. package/templates/ssr-isr/lib/graphql/schema.js +35 -0
  85. package/templates/ssr-isr/lib/i18n/en.json +4 -0
  86. package/templates/ssr-isr/lib/i18n/es.json +4 -0
  87. package/templates/ssr-isr/lib/i18n/index.d.ts +8 -0
  88. package/templates/ssr-isr/lib/i18n/index.js +15 -0
  89. package/templates/ssr-isr/lib/import/jen-import.d.ts +56 -0
  90. package/templates/ssr-isr/lib/import/jen-import.js +161 -0
  91. package/templates/{static → ssr-isr}/lib/index.d.ts +42 -11
  92. package/templates/ssr-isr/lib/index.js +116 -0
  93. package/templates/ssr-isr/lib/jdb/engine.d.ts +38 -0
  94. package/templates/ssr-isr/lib/jdb/engine.js +275 -0
  95. package/templates/ssr-isr/lib/jdb/index.d.ts +34 -0
  96. package/templates/ssr-isr/lib/jdb/index.js +34 -0
  97. package/templates/ssr-isr/lib/jdb/types.d.ts +228 -0
  98. package/templates/ssr-isr/lib/jdb/types.js +1 -0
  99. package/templates/ssr-isr/lib/jdb/utils.d.ts +66 -0
  100. package/templates/ssr-isr/lib/jdb/utils.js +176 -0
  101. package/templates/ssr-isr/lib/middleware/builtins/body-parser.d.ts +16 -0
  102. package/templates/ssr-isr/lib/middleware/builtins/body-parser.js +56 -0
  103. package/templates/ssr-isr/lib/middleware/builtins/cors.d.ts +15 -0
  104. package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
  105. package/templates/ssr-isr/lib/middleware/builtins/logger.d.ts +19 -0
  106. package/templates/ssr-isr/lib/middleware/builtins/logger.js +34 -0
  107. package/templates/ssr-isr/lib/middleware/builtins/rate-limit.d.ts +22 -0
  108. package/templates/ssr-isr/lib/middleware/builtins/rate-limit.js +79 -0
  109. package/templates/ssr-isr/lib/middleware/builtins/request-id.d.ts +19 -0
  110. package/templates/ssr-isr/lib/middleware/builtins/request-id.js +29 -0
  111. package/templates/ssr-isr/lib/middleware/builtins/security-headers.d.ts +19 -0
  112. package/templates/ssr-isr/lib/middleware/builtins/security-headers.js +53 -0
  113. package/templates/ssr-isr/lib/middleware/context.d.ts +105 -0
  114. package/templates/ssr-isr/lib/middleware/context.js +124 -0
  115. package/templates/ssr-isr/lib/middleware/decorators.d.ts +19 -0
  116. package/templates/ssr-isr/lib/middleware/decorators.js +93 -0
  117. package/templates/ssr-isr/lib/middleware/errors/handler.js +46 -0
  118. package/templates/ssr-isr/lib/middleware/errors/http-error.d.ts +5 -0
  119. package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
  120. package/templates/ssr-isr/lib/middleware/kernel.d.ts +69 -0
  121. package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
  122. package/templates/ssr-isr/lib/middleware/pipeline.d.ts +53 -0
  123. package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
  124. package/templates/ssr-isr/lib/middleware/registry.d.ts +69 -0
  125. package/templates/ssr-isr/lib/middleware/registry.js +85 -0
  126. package/templates/ssr-isr/lib/middleware/response.d.ts +75 -0
  127. package/templates/ssr-isr/lib/middleware/response.js +107 -0
  128. package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
  129. package/templates/ssr-isr/lib/middleware/types.js +1 -0
  130. package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
  131. package/templates/ssr-isr/lib/native/bundle.d.ts +24 -0
  132. package/templates/ssr-isr/lib/native/bundle.js +22 -0
  133. package/templates/ssr-isr/lib/native/dev-server.d.ts +13 -0
  134. package/templates/ssr-isr/lib/native/dev-server.js +23 -0
  135. package/templates/{static → ssr-isr}/lib/native/index.d.ts +20 -20
  136. package/templates/ssr-isr/lib/native/index.js +33 -0
  137. package/templates/ssr-isr/lib/native/optimizer.d.ts +21 -0
  138. package/templates/ssr-isr/lib/native/optimizer.js +20 -0
  139. package/templates/ssr-isr/lib/native/style-compiler.d.ts +19 -0
  140. package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
  141. package/templates/ssr-isr/lib/plugin/loader.d.ts +10 -0
  142. package/templates/ssr-isr/lib/plugin/loader.js +36 -0
  143. package/templates/ssr-isr/lib/runtime/client-runtime.d.ts +16 -0
  144. package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
  145. package/templates/ssr-isr/lib/runtime/hmr.d.ts +23 -0
  146. package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
  147. package/templates/ssr-isr/lib/runtime/hydrate.d.ts +18 -0
  148. package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
  149. package/templates/ssr-isr/lib/runtime/island-hydration-client.d.ts +8 -0
  150. package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
  151. package/templates/ssr-isr/lib/runtime/islands.d.ts +101 -0
  152. package/templates/ssr-isr/lib/runtime/islands.js +110 -0
  153. package/templates/ssr-isr/lib/runtime/render.d.ts +40 -0
  154. package/templates/ssr-isr/lib/runtime/render.js +244 -0
  155. package/templates/ssr-isr/lib/server/api-routes.d.ts +112 -0
  156. package/templates/ssr-isr/lib/server/api-routes.js +237 -0
  157. package/templates/{static → ssr-isr}/lib/server/api.d.ts +3 -3
  158. package/templates/ssr-isr/lib/server/api.js +108 -0
  159. package/templates/ssr-isr/lib/server/app.d.ts +44 -0
  160. package/templates/ssr-isr/lib/server/app.js +438 -0
  161. package/templates/ssr-isr/lib/server/runtimeServe.d.ts +60 -0
  162. package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
  163. package/templates/ssr-isr/lib/server/ssr.d.ts +161 -0
  164. package/templates/ssr-isr/lib/server/ssr.js +202 -0
  165. package/templates/ssr-isr/lib/shared/log.d.ts +49 -0
  166. package/templates/ssr-isr/lib/shared/log.js +64 -0
  167. package/templates/ssr-isr/package.json +23 -0
  168. package/templates/ssr-isr/server.js +128 -0
  169. package/templates/ssr-isr/site/pages/(index).tsx +11 -0
  170. package/templates/ssr-isr/site/styles/global.scss +37 -0
  171. package/templates/ssr-isr/tsconfig.json +39 -0
  172. package/templates/static/README.md +63 -67
  173. package/templates/static/build.js +31 -21
  174. package/templates/static/jen.config.ts +0 -20
  175. package/templates/static/jenjs.d.ts +0 -18
  176. package/templates/static/lib/api/(hello).js +7 -24
  177. package/templates/static/lib/api/examples/files/[...slug].js +22 -0
  178. package/templates/static/lib/api/examples/hello.js +11 -0
  179. package/templates/static/lib/api/examples/posts/[id].js +37 -0
  180. package/templates/static/lib/api/examples/posts.js +37 -0
  181. package/templates/static/lib/api/examples/search.js +23 -0
  182. package/templates/static/lib/api/index.js +41 -0
  183. package/templates/static/lib/api/loader.js +234 -0
  184. package/templates/static/lib/api/router.js +259 -0
  185. package/templates/static/lib/assets/types.js +1 -0
  186. package/templates/static/lib/auth/cookie-utils.js +69 -85
  187. package/templates/static/lib/auth/index.js +0 -17
  188. package/templates/static/lib/auth/jwt.js +48 -21
  189. package/templates/static/lib/auth/session.js +79 -98
  190. package/templates/static/lib/build/asset-hashing.js +47 -39
  191. package/templates/static/lib/build/asset-manifest.js +18 -35
  192. package/templates/static/lib/build/build.js +277 -95
  193. package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
  194. package/templates/static/lib/build/bundle-analyzer.js +945 -0
  195. package/templates/static/lib/build/code-splitter.js +194 -0
  196. package/templates/static/lib/build/feature-analyzer.js +190 -0
  197. package/templates/static/lib/build/feature-gate.js +257 -0
  198. package/templates/static/lib/build/island-hydration.js +17 -35
  199. package/templates/static/lib/build/lazy-loader.js +322 -0
  200. package/templates/static/lib/build/minifier.js +42 -61
  201. package/templates/static/lib/build/page-renderer.js +25 -42
  202. package/templates/static/lib/build/production-build.js +11 -28
  203. package/templates/static/lib/build/rust-hashing.js +71 -0
  204. package/templates/static/lib/build/script-optimizer.js +285 -0
  205. package/templates/static/lib/build/ssg-pipeline.js +107 -113
  206. package/templates/static/lib/build/vercel-output.js +298 -0
  207. package/templates/static/lib/build-tools/build-site.js +27 -47
  208. package/templates/static/lib/cache/index.js +6 -15
  209. package/templates/static/lib/cache/memory.js +37 -28
  210. package/templates/static/lib/cache/redis.js +56 -28
  211. package/templates/static/lib/cli/banner.js +18 -31
  212. package/templates/static/lib/cli/templates/ssg/jen.config.js +29 -46
  213. package/templates/static/lib/cli/templates/ssg/site/index.js +6 -1
  214. package/templates/static/lib/cli/templates/ssr/jen.config.js +29 -46
  215. package/templates/static/lib/cli/templates/ssr/site/index.js +6 -1
  216. package/templates/static/lib/client/Image.js +42 -0
  217. package/templates/static/lib/client/Link.js +190 -0
  218. package/templates/static/lib/client/PWA.js +46 -0
  219. package/templates/static/lib/client/Seo.js +97 -0
  220. package/templates/static/lib/client/index.js +9 -0
  221. package/templates/static/lib/client/useNavigation.js +25 -0
  222. package/templates/static/lib/client/useRouter.js +64 -0
  223. package/templates/static/lib/client-routing/Link.js +17 -0
  224. package/templates/static/lib/client-routing/index.js +19 -0
  225. package/templates/static/lib/client-routing/router.js +151 -0
  226. package/templates/static/lib/client-routing/signal.js +147 -0
  227. package/templates/static/lib/compilers/esbuild-plugins.js +96 -115
  228. package/templates/static/lib/compilers/svelte.js +31 -48
  229. package/templates/static/lib/compilers/vue.js +76 -85
  230. package/templates/static/lib/core/config.js +0 -17
  231. package/templates/static/lib/core/feature-guard.js +136 -0
  232. package/templates/static/lib/core/features.js +99 -0
  233. package/templates/static/lib/core/http.js +65 -36
  234. package/templates/static/lib/core/layouts/index.js +10 -0
  235. package/templates/static/lib/core/layouts/render.js +158 -0
  236. package/templates/static/lib/core/layouts/scan.js +112 -0
  237. package/templates/static/lib/core/layouts/types.js +1 -0
  238. package/templates/static/lib/core/lifecycle.js +129 -0
  239. package/templates/static/lib/core/loader-schema.js +81 -0
  240. package/templates/static/lib/core/middleware-hooks.js +86 -58
  241. package/templates/static/lib/core/paths.js +31 -16
  242. package/templates/static/lib/core/routes/advanced.js +114 -0
  243. package/templates/static/lib/core/routes/handlers.js +181 -0
  244. package/templates/static/lib/core/routes/match.js +129 -24
  245. package/templates/static/lib/core/routes/orchestrator.js +171 -0
  246. package/templates/static/lib/core/routes/rendering-config.js +131 -0
  247. package/templates/static/lib/core/routes/scan.js +174 -132
  248. package/templates/static/lib/core/types.js +0 -17
  249. package/templates/static/lib/css/compiler.js +63 -76
  250. package/templates/static/lib/data-fetching/cache.js +223 -0
  251. package/templates/static/lib/data-fetching/client.js +202 -0
  252. package/templates/static/lib/data-fetching/feature-guard.js +29 -0
  253. package/templates/static/lib/data-fetching/graphql.js +265 -0
  254. package/templates/static/lib/data-fetching/index.js +57 -0
  255. package/templates/static/lib/data-fetching/rest.js +256 -0
  256. package/templates/static/lib/data-fetching/server.js +182 -0
  257. package/templates/static/lib/data-fetching/types.js +5 -0
  258. package/templates/static/lib/db/connector.js +37 -28
  259. package/templates/static/lib/db/drivers/jdb.js +41 -56
  260. package/templates/static/lib/db/drivers/sql.js +152 -152
  261. package/templates/static/lib/db/index.js +42 -59
  262. package/templates/static/lib/db/types.js +0 -17
  263. package/templates/static/lib/devtools/component-tree.js +106 -0
  264. package/templates/static/lib/devtools/devtools.js +638 -0
  265. package/templates/static/lib/devtools/event-bus.js +29 -0
  266. package/templates/static/lib/devtools/event-logger.js +67 -0
  267. package/templates/static/lib/devtools/index.js +9 -0
  268. package/templates/static/lib/devtools/integration.js +149 -0
  269. package/templates/static/lib/devtools/performance.js +84 -0
  270. package/templates/static/lib/devtools/persistence.js +57 -0
  271. package/templates/static/lib/devtools/plugins.js +97 -0
  272. package/templates/static/lib/devtools/search.js +89 -0
  273. package/templates/static/lib/devtools/ui.js +769 -0
  274. package/templates/static/lib/features/api/handler.js +10 -0
  275. package/templates/static/lib/features/api/index.js +5 -0
  276. package/templates/static/lib/features/api/types.js +4 -0
  277. package/templates/static/lib/features/middleware/compiled.js +7 -0
  278. package/templates/static/lib/features/middleware/index.js +5 -0
  279. package/templates/static/lib/features/middleware/types.js +4 -0
  280. package/templates/static/lib/fonts/index.js +46 -0
  281. package/templates/static/lib/fonts/inject.js +125 -0
  282. package/templates/static/lib/fonts/loader.js +196 -0
  283. package/templates/static/lib/fonts/types.js +1 -0
  284. package/templates/static/lib/graphql/index.js +46 -16
  285. package/templates/static/lib/graphql/resolvers.js +42 -19
  286. package/templates/static/lib/graphql/schema.js +30 -15
  287. package/templates/static/lib/i18n/en.json +2 -2
  288. package/templates/static/lib/i18n/es.json +2 -2
  289. package/templates/static/lib/i18n/index.js +17 -29
  290. package/templates/static/lib/import/jen-import.js +130 -97
  291. package/templates/static/lib/index.js +82 -115
  292. package/templates/static/lib/jdb/engine.js +259 -160
  293. package/templates/static/lib/jdb/index.js +28 -13
  294. package/templates/static/lib/jdb/types.js +0 -17
  295. package/templates/static/lib/jdb/utils.js +159 -124
  296. package/templates/static/lib/middleware/builtins/cors.js +55 -64
  297. package/templates/static/lib/middleware/context.js +120 -46
  298. package/templates/static/lib/middleware/kernel.js +186 -31
  299. package/templates/static/lib/middleware/pipeline.js +140 -59
  300. package/templates/static/lib/middleware/registry.js +80 -36
  301. package/templates/static/lib/middleware/response.js +101 -54
  302. package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
  303. package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
  304. package/templates/static/lib/plugin/loader.js +25 -48
  305. package/templates/static/lib/plugin/plugin-manager.js +177 -0
  306. package/templates/static/lib/plugin/types.js +28 -0
  307. package/templates/static/lib/runtime/client-runtime.js +19 -22
  308. package/templates/static/lib/runtime/hmr.js +23 -18
  309. package/templates/static/lib/runtime/hydrate.js +47 -37
  310. package/templates/static/lib/runtime/island-hydration-client.js +122 -108
  311. package/templates/static/lib/runtime/islands.js +92 -71
  312. package/templates/static/lib/runtime/render.js +385 -149
  313. package/templates/static/lib/security/security-config.js +60 -0
  314. package/templates/static/lib/security/security-middleware.js +229 -0
  315. package/templates/static/lib/server/api-routes.js +339 -171
  316. package/templates/static/lib/server/api.js +93 -109
  317. package/templates/static/lib/server/app.js +660 -270
  318. package/templates/static/lib/server/isr.js +365 -0
  319. package/templates/static/lib/server/runtimeServe.js +157 -89
  320. package/templates/static/lib/server/ssr.js +295 -0
  321. package/templates/static/lib/server-actions/handler.js +180 -0
  322. package/templates/static/lib/server-actions/index.js +19 -0
  323. package/templates/static/lib/server-actions/middleware.js +146 -0
  324. package/templates/static/lib/server-actions/scan.js +152 -0
  325. package/templates/static/lib/server-actions/types.js +1 -0
  326. package/templates/static/lib/server-actions/validators.js +156 -0
  327. package/templates/static/lib/shared/log.js +74 -25
  328. package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
  329. package/templates/static/lib/telemetry/api/validator.js +67 -0
  330. package/templates/static/lib/telemetry/client.js +121 -0
  331. package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
  332. package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
  333. package/templates/static/lib/vendor/glob/glob.js +4766 -0
  334. package/templates/static/lib/vendor/preact/preact.module.js +797 -0
  335. package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
  336. package/templates/static/package.json +4 -0
  337. package/templates/static/server.js +23 -25
  338. package/templates/static/site/(home).tsx +12 -12
  339. package/templates/static/site/styles/global.scss +89 -78
  340. package/templates/static/tsconfig.json +43 -39
  341. package/templates/static/.esbuild/jen.config.js +0 -1
  342. package/templates/static/lib/api/(hello).d.ts +0 -7
  343. package/templates/static/lib/auth/cookie-utils.d.ts +0 -24
  344. package/templates/static/lib/auth/jwt.d.ts +0 -2
  345. package/templates/static/lib/auth/session.d.ts +0 -44
  346. package/templates/static/lib/build/asset-hashing.d.ts +0 -10
  347. package/templates/static/lib/build/asset-manifest.d.ts +0 -11
  348. package/templates/static/lib/build/build.d.ts +0 -4
  349. package/templates/static/lib/build/minifier.d.ts +0 -20
  350. package/templates/static/lib/build/page-renderer.d.ts +0 -17
  351. package/templates/static/lib/build/production-build.d.ts +0 -10
  352. package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
  353. package/templates/static/lib/cache/index.d.ts +0 -2
  354. package/templates/static/lib/cache/memory.d.ts +0 -6
  355. package/templates/static/lib/cache/redis.d.ts +0 -6
  356. package/templates/static/lib/cli/banner.d.ts +0 -1
  357. package/templates/static/lib/compilers/svelte.d.ts +0 -18
  358. package/templates/static/lib/compilers/vue.d.ts +0 -15
  359. package/templates/static/lib/core/config.d.ts +0 -53
  360. package/templates/static/lib/core/http.d.ts +0 -3
  361. package/templates/static/lib/core/middleware-hooks.d.ts +0 -46
  362. package/templates/static/lib/core/paths.d.ts +0 -6
  363. package/templates/static/lib/core/routes/match.d.ts +0 -6
  364. package/templates/static/lib/core/routes/scan.d.ts +0 -9
  365. package/templates/static/lib/core/types.d.ts +0 -18
  366. package/templates/static/lib/css/compiler.d.ts +0 -20
  367. package/templates/static/lib/db/connector.d.ts +0 -4
  368. package/templates/static/lib/db/drivers/jdb.d.ts +0 -13
  369. package/templates/static/lib/db/drivers/sql.d.ts +0 -18
  370. package/templates/static/lib/db/index.d.ts +0 -19
  371. package/templates/static/lib/db/types.d.ts +0 -29
  372. package/templates/static/lib/graphql/index.d.ts +0 -1
  373. package/templates/static/lib/graphql/resolvers.d.ts +0 -17
  374. package/templates/static/lib/graphql/schema.d.ts +0 -1
  375. package/templates/static/lib/i18n/index.d.ts +0 -8
  376. package/templates/static/lib/import/jen-import.d.ts +0 -27
  377. package/templates/static/lib/jdb/engine.d.ts +0 -9
  378. package/templates/static/lib/jdb/index.d.ts +0 -2
  379. package/templates/static/lib/jdb/types.d.ts +0 -46
  380. package/templates/static/lib/jdb/utils.d.ts +0 -6
  381. package/templates/static/lib/middleware/builtins/body-parser.d.ts +0 -1
  382. package/templates/static/lib/middleware/builtins/body-parser.js +0 -55
  383. package/templates/static/lib/middleware/builtins/cors.d.ts +0 -13
  384. package/templates/static/lib/middleware/builtins/logger.d.ts +0 -1
  385. package/templates/static/lib/middleware/builtins/logger.js +0 -33
  386. package/templates/static/lib/middleware/builtins/rate-limit.d.ts +0 -5
  387. package/templates/static/lib/middleware/builtins/rate-limit.js +0 -76
  388. package/templates/static/lib/middleware/builtins/request-id.d.ts +0 -1
  389. package/templates/static/lib/middleware/builtins/request-id.js +0 -25
  390. package/templates/static/lib/middleware/builtins/security-headers.d.ts +0 -1
  391. package/templates/static/lib/middleware/builtins/security-headers.js +0 -39
  392. package/templates/static/lib/middleware/context.d.ts +0 -18
  393. package/templates/static/lib/middleware/decorators.d.ts +0 -2
  394. package/templates/static/lib/middleware/decorators.js +0 -61
  395. package/templates/static/lib/middleware/errors/handler.js +0 -65
  396. package/templates/static/lib/middleware/errors/http-error.d.ts +0 -5
  397. package/templates/static/lib/middleware/errors/http-error.js +0 -27
  398. package/templates/static/lib/middleware/kernel.d.ts +0 -6
  399. package/templates/static/lib/middleware/pipeline.d.ts +0 -4
  400. package/templates/static/lib/middleware/registry.d.ts +0 -10
  401. package/templates/static/lib/middleware/response.d.ts +0 -13
  402. package/templates/static/lib/middleware/types.js +0 -18
  403. package/templates/static/lib/middleware/utils/matcher.js +0 -31
  404. package/templates/static/lib/native/bundle.d.ts +0 -19
  405. package/templates/static/lib/native/bundle.js +0 -39
  406. package/templates/static/lib/native/dev-server.d.ts +0 -6
  407. package/templates/static/lib/native/dev-server.js +0 -38
  408. package/templates/static/lib/native/index.js +0 -48
  409. package/templates/static/lib/native/optimizer.d.ts +0 -17
  410. package/templates/static/lib/native/optimizer.js +0 -37
  411. package/templates/static/lib/native/style-compiler.d.ts +0 -10
  412. package/templates/static/lib/native/style-compiler.js +0 -36
  413. package/templates/static/lib/plugin/loader.d.ts +0 -8
  414. package/templates/static/lib/runtime/client-runtime.d.ts +0 -1
  415. package/templates/static/lib/runtime/hmr.d.ts +0 -1
  416. package/templates/static/lib/runtime/hydrate.d.ts +0 -1
  417. package/templates/static/lib/runtime/island-hydration-client.d.ts +0 -5
  418. package/templates/static/lib/runtime/islands.d.ts +0 -46
  419. package/templates/static/lib/runtime/render.d.ts +0 -13
  420. package/templates/static/lib/server/api-routes.d.ts +0 -44
  421. package/templates/static/lib/server/app.d.ts +0 -10
  422. package/templates/static/lib/server/runtimeServe.d.ts +0 -4
  423. package/templates/static/lib/shared/log.d.ts +0 -5
  424. package/templates/static/node_modules/.bin/esbuild +0 -16
  425. package/templates/static/node_modules/.bin/esbuild.cmd +0 -17
  426. package/templates/static/node_modules/.bin/esbuild.ps1 +0 -28
  427. package/templates/static/node_modules/.bin/tsc +0 -16
  428. package/templates/static/node_modules/.bin/tsc.cmd +0 -17
  429. package/templates/static/node_modules/.bin/tsc.ps1 +0 -28
  430. package/templates/static/node_modules/.bin/tsserver +0 -16
  431. package/templates/static/node_modules/.bin/tsserver.cmd +0 -17
  432. package/templates/static/node_modules/.bin/tsserver.ps1 +0 -28
  433. package/templates/static/node_modules/.jen/cache/B__Jen.js_packages_create-jen-app_templates_static_site_(home).tsx.mjs +0 -14
  434. package/templates/static/node_modules/.jen/cache/B__Jen.js_packages_create-jen-app_yo_site_(home).tsx.mjs +0 -11
  435. package/templates/static/node_modules/.package-lock.json +0 -585
  436. package/templates/static/node_modules/@esbuild/win32-x64/README.md +0 -3
  437. package/templates/static/node_modules/@esbuild/win32-x64/esbuild.exe +0 -0
  438. package/templates/static/node_modules/@esbuild/win32-x64/package.json +0 -20
  439. package/templates/static/node_modules/@jenjs/master/README.md +0 -24
  440. package/templates/static/node_modules/@jenjs/master/index.js +0 -3655
  441. package/templates/static/node_modules/@jenjs/master/package.json +0 -36
  442. package/templates/static/node_modules/@polka/url/build.js +0 -49
  443. package/templates/static/node_modules/@polka/url/build.mjs +0 -47
  444. package/templates/static/node_modules/@polka/url/index.d.ts +0 -11
  445. package/templates/static/node_modules/@polka/url/package.json +0 -30
  446. package/templates/static/node_modules/@polka/url/readme.md +0 -68
  447. package/templates/static/node_modules/@types/node/LICENSE +0 -21
  448. package/templates/static/node_modules/@types/node/README.md +0 -15
  449. package/templates/static/node_modules/@types/node/assert/strict.d.ts +0 -111
  450. package/templates/static/node_modules/@types/node/assert.d.ts +0 -1078
  451. package/templates/static/node_modules/@types/node/async_hooks.d.ts +0 -603
  452. package/templates/static/node_modules/@types/node/buffer.buffer.d.ts +0 -472
  453. package/templates/static/node_modules/@types/node/buffer.d.ts +0 -1934
  454. package/templates/static/node_modules/@types/node/child_process.d.ts +0 -1476
  455. package/templates/static/node_modules/@types/node/cluster.d.ts +0 -578
  456. package/templates/static/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  457. package/templates/static/node_modules/@types/node/compatibility/index.d.ts +0 -9
  458. package/templates/static/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  459. package/templates/static/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
  460. package/templates/static/node_modules/@types/node/console.d.ts +0 -452
  461. package/templates/static/node_modules/@types/node/constants.d.ts +0 -21
  462. package/templates/static/node_modules/@types/node/crypto.d.ts +0 -4545
  463. package/templates/static/node_modules/@types/node/dgram.d.ts +0 -600
  464. package/templates/static/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
  465. package/templates/static/node_modules/@types/node/dns/promises.d.ts +0 -503
  466. package/templates/static/node_modules/@types/node/dns.d.ts +0 -923
  467. package/templates/static/node_modules/@types/node/domain.d.ts +0 -170
  468. package/templates/static/node_modules/@types/node/events.d.ts +0 -976
  469. package/templates/static/node_modules/@types/node/fs/promises.d.ts +0 -1295
  470. package/templates/static/node_modules/@types/node/fs.d.ts +0 -4461
  471. package/templates/static/node_modules/@types/node/globals.d.ts +0 -172
  472. package/templates/static/node_modules/@types/node/globals.typedarray.d.ts +0 -38
  473. package/templates/static/node_modules/@types/node/http.d.ts +0 -2089
  474. package/templates/static/node_modules/@types/node/http2.d.ts +0 -2644
  475. package/templates/static/node_modules/@types/node/https.d.ts +0 -579
  476. package/templates/static/node_modules/@types/node/index.d.ts +0 -97
  477. package/templates/static/node_modules/@types/node/inspector.d.ts +0 -253
  478. package/templates/static/node_modules/@types/node/inspector.generated.d.ts +0 -4052
  479. package/templates/static/node_modules/@types/node/module.d.ts +0 -891
  480. package/templates/static/node_modules/@types/node/net.d.ts +0 -1057
  481. package/templates/static/node_modules/@types/node/os.d.ts +0 -506
  482. package/templates/static/node_modules/@types/node/package.json +0 -145
  483. package/templates/static/node_modules/@types/node/path.d.ts +0 -200
  484. package/templates/static/node_modules/@types/node/perf_hooks.d.ts +0 -968
  485. package/templates/static/node_modules/@types/node/process.d.ts +0 -2089
  486. package/templates/static/node_modules/@types/node/punycode.d.ts +0 -117
  487. package/templates/static/node_modules/@types/node/querystring.d.ts +0 -152
  488. package/templates/static/node_modules/@types/node/readline/promises.d.ts +0 -161
  489. package/templates/static/node_modules/@types/node/readline.d.ts +0 -594
  490. package/templates/static/node_modules/@types/node/repl.d.ts +0 -428
  491. package/templates/static/node_modules/@types/node/sea.d.ts +0 -153
  492. package/templates/static/node_modules/@types/node/sqlite.d.ts +0 -721
  493. package/templates/static/node_modules/@types/node/stream/consumers.d.ts +0 -38
  494. package/templates/static/node_modules/@types/node/stream/promises.d.ts +0 -90
  495. package/templates/static/node_modules/@types/node/stream/web.d.ts +0 -622
  496. package/templates/static/node_modules/@types/node/stream.d.ts +0 -1664
  497. package/templates/static/node_modules/@types/node/string_decoder.d.ts +0 -67
  498. package/templates/static/node_modules/@types/node/test.d.ts +0 -2163
  499. package/templates/static/node_modules/@types/node/timers/promises.d.ts +0 -108
  500. package/templates/static/node_modules/@types/node/timers.d.ts +0 -287
  501. package/templates/static/node_modules/@types/node/tls.d.ts +0 -1319
  502. package/templates/static/node_modules/@types/node/trace_events.d.ts +0 -197
  503. package/templates/static/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
  504. package/templates/static/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
  505. package/templates/static/node_modules/@types/node/ts5.6/index.d.ts +0 -97
  506. package/templates/static/node_modules/@types/node/tty.d.ts +0 -208
  507. package/templates/static/node_modules/@types/node/url.d.ts +0 -984
  508. package/templates/static/node_modules/@types/node/util.d.ts +0 -2606
  509. package/templates/static/node_modules/@types/node/v8.d.ts +0 -920
  510. package/templates/static/node_modules/@types/node/vm.d.ts +0 -1000
  511. package/templates/static/node_modules/@types/node/wasi.d.ts +0 -181
  512. package/templates/static/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
  513. package/templates/static/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  514. package/templates/static/node_modules/@types/node/web-globals/events.d.ts +0 -97
  515. package/templates/static/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
  516. package/templates/static/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
  517. package/templates/static/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  518. package/templates/static/node_modules/@types/node/worker_threads.d.ts +0 -784
  519. package/templates/static/node_modules/@types/node/zlib.d.ts +0 -683
  520. package/templates/static/node_modules/esbuild/LICENSE.md +0 -21
  521. package/templates/static/node_modules/esbuild/README.md +0 -3
  522. package/templates/static/node_modules/esbuild/bin/esbuild +0 -223
  523. package/templates/static/node_modules/esbuild/install.js +0 -289
  524. package/templates/static/node_modules/esbuild/lib/main.d.ts +0 -716
  525. package/templates/static/node_modules/esbuild/lib/main.js +0 -2242
  526. package/templates/static/node_modules/esbuild/package.json +0 -49
  527. package/templates/static/node_modules/mrmime/index.d.ts +0 -2
  528. package/templates/static/node_modules/mrmime/index.js +0 -449
  529. package/templates/static/node_modules/mrmime/index.mjs +0 -448
  530. package/templates/static/node_modules/mrmime/license +0 -21
  531. package/templates/static/node_modules/mrmime/package.json +0 -44
  532. package/templates/static/node_modules/mrmime/readme.md +0 -130
  533. package/templates/static/node_modules/preact/README.md +0 -185
  534. package/templates/static/node_modules/preact/compat/client.d.ts +0 -13
  535. package/templates/static/node_modules/preact/compat/client.js +0 -21
  536. package/templates/static/node_modules/preact/compat/client.mjs +0 -24
  537. package/templates/static/node_modules/preact/compat/dist/compat.js +0 -2
  538. package/templates/static/node_modules/preact/compat/dist/compat.js.map +0 -1
  539. package/templates/static/node_modules/preact/compat/dist/compat.mjs +0 -2
  540. package/templates/static/node_modules/preact/compat/dist/compat.module.js +0 -2
  541. package/templates/static/node_modules/preact/compat/dist/compat.module.js.map +0 -1
  542. package/templates/static/node_modules/preact/compat/dist/compat.umd.js +0 -2
  543. package/templates/static/node_modules/preact/compat/dist/compat.umd.js.map +0 -1
  544. package/templates/static/node_modules/preact/compat/jsx-dev-runtime.js +0 -3
  545. package/templates/static/node_modules/preact/compat/jsx-dev-runtime.mjs +0 -3
  546. package/templates/static/node_modules/preact/compat/jsx-runtime.js +0 -3
  547. package/templates/static/node_modules/preact/compat/jsx-runtime.mjs +0 -3
  548. package/templates/static/node_modules/preact/compat/package.json +0 -55
  549. package/templates/static/node_modules/preact/compat/scheduler.js +0 -15
  550. package/templates/static/node_modules/preact/compat/scheduler.mjs +0 -23
  551. package/templates/static/node_modules/preact/compat/server.browser.js +0 -11
  552. package/templates/static/node_modules/preact/compat/server.js +0 -36
  553. package/templates/static/node_modules/preact/compat/server.mjs +0 -17
  554. package/templates/static/node_modules/preact/compat/src/Children.js +0 -21
  555. package/templates/static/node_modules/preact/compat/src/PureComponent.js +0 -16
  556. package/templates/static/node_modules/preact/compat/src/forwardRef.js +0 -44
  557. package/templates/static/node_modules/preact/compat/src/hooks.js +0 -70
  558. package/templates/static/node_modules/preact/compat/src/index.d.ts +0 -351
  559. package/templates/static/node_modules/preact/compat/src/index.js +0 -238
  560. package/templates/static/node_modules/preact/compat/src/internal.d.ts +0 -48
  561. package/templates/static/node_modules/preact/compat/src/memo.js +0 -35
  562. package/templates/static/node_modules/preact/compat/src/portals.js +0 -78
  563. package/templates/static/node_modules/preact/compat/src/render.js +0 -313
  564. package/templates/static/node_modules/preact/compat/src/suspense-list.d.ts +0 -16
  565. package/templates/static/node_modules/preact/compat/src/suspense-list.js +0 -127
  566. package/templates/static/node_modules/preact/compat/src/suspense.d.ts +0 -19
  567. package/templates/static/node_modules/preact/compat/src/suspense.js +0 -291
  568. package/templates/static/node_modules/preact/compat/src/util.js +0 -33
  569. package/templates/static/node_modules/preact/compat/test-utils.js +0 -1
  570. package/templates/static/node_modules/preact/compat/test-utils.mjs +0 -1
  571. package/templates/static/node_modules/preact/debug/dist/debug.js +0 -2
  572. package/templates/static/node_modules/preact/debug/dist/debug.js.map +0 -1
  573. package/templates/static/node_modules/preact/debug/dist/debug.mjs +0 -2
  574. package/templates/static/node_modules/preact/debug/dist/debug.module.js +0 -2
  575. package/templates/static/node_modules/preact/debug/dist/debug.module.js.map +0 -1
  576. package/templates/static/node_modules/preact/debug/dist/debug.umd.js +0 -2
  577. package/templates/static/node_modules/preact/debug/dist/debug.umd.js.map +0 -1
  578. package/templates/static/node_modules/preact/debug/package.json +0 -27
  579. package/templates/static/node_modules/preact/debug/src/check-props.js +0 -54
  580. package/templates/static/node_modules/preact/debug/src/component-stack.js +0 -146
  581. package/templates/static/node_modules/preact/debug/src/constants.js +0 -3
  582. package/templates/static/node_modules/preact/debug/src/debug.js +0 -593
  583. package/templates/static/node_modules/preact/debug/src/index.d.ts +0 -23
  584. package/templates/static/node_modules/preact/debug/src/index.js +0 -12
  585. package/templates/static/node_modules/preact/debug/src/internal.d.ts +0 -82
  586. package/templates/static/node_modules/preact/debug/src/util.js +0 -15
  587. package/templates/static/node_modules/preact/devtools/dist/devtools.js +0 -2
  588. package/templates/static/node_modules/preact/devtools/dist/devtools.js.map +0 -1
  589. package/templates/static/node_modules/preact/devtools/dist/devtools.mjs +0 -2
  590. package/templates/static/node_modules/preact/devtools/dist/devtools.module.js +0 -2
  591. package/templates/static/node_modules/preact/devtools/dist/devtools.module.js.map +0 -1
  592. package/templates/static/node_modules/preact/devtools/dist/devtools.umd.js +0 -2
  593. package/templates/static/node_modules/preact/devtools/dist/devtools.umd.js.map +0 -1
  594. package/templates/static/node_modules/preact/devtools/package.json +0 -25
  595. package/templates/static/node_modules/preact/devtools/src/devtools.js +0 -21
  596. package/templates/static/node_modules/preact/devtools/src/index.d.ts +0 -8
  597. package/templates/static/node_modules/preact/devtools/src/index.js +0 -15
  598. package/templates/static/node_modules/preact/dist/preact.js +0 -2
  599. package/templates/static/node_modules/preact/dist/preact.js.map +0 -1
  600. package/templates/static/node_modules/preact/dist/preact.min.js +0 -2
  601. package/templates/static/node_modules/preact/dist/preact.min.js.map +0 -1
  602. package/templates/static/node_modules/preact/dist/preact.min.module.js +0 -2
  603. package/templates/static/node_modules/preact/dist/preact.min.module.js.map +0 -1
  604. package/templates/static/node_modules/preact/dist/preact.min.umd.js +0 -2
  605. package/templates/static/node_modules/preact/dist/preact.min.umd.js.map +0 -1
  606. package/templates/static/node_modules/preact/dist/preact.mjs +0 -2
  607. package/templates/static/node_modules/preact/dist/preact.module.js +0 -2
  608. package/templates/static/node_modules/preact/dist/preact.module.js.map +0 -1
  609. package/templates/static/node_modules/preact/dist/preact.umd.js +0 -2
  610. package/templates/static/node_modules/preact/dist/preact.umd.js.map +0 -1
  611. package/templates/static/node_modules/preact/hooks/dist/hooks.js +0 -2
  612. package/templates/static/node_modules/preact/hooks/dist/hooks.js.map +0 -1
  613. package/templates/static/node_modules/preact/hooks/dist/hooks.mjs +0 -2
  614. package/templates/static/node_modules/preact/hooks/dist/hooks.module.js +0 -2
  615. package/templates/static/node_modules/preact/hooks/dist/hooks.module.js.map +0 -1
  616. package/templates/static/node_modules/preact/hooks/dist/hooks.umd.js +0 -2
  617. package/templates/static/node_modules/preact/hooks/dist/hooks.umd.js.map +0 -1
  618. package/templates/static/node_modules/preact/hooks/package.json +0 -35
  619. package/templates/static/node_modules/preact/hooks/src/index.d.ts +0 -145
  620. package/templates/static/node_modules/preact/hooks/src/index.js +0 -555
  621. package/templates/static/node_modules/preact/hooks/src/internal.d.ts +0 -103
  622. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.js +0 -2
  623. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.js.map +0 -1
  624. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs +0 -2
  625. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js +0 -2
  626. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js.map +0 -1
  627. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js +0 -2
  628. package/templates/static/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js.map +0 -1
  629. package/templates/static/node_modules/preact/jsx-runtime/package.json +0 -28
  630. package/templates/static/node_modules/preact/jsx-runtime/src/index.d.ts +0 -62
  631. package/templates/static/node_modules/preact/jsx-runtime/src/index.js +0 -206
  632. package/templates/static/node_modules/preact/jsx-runtime/src/utils.js +0 -36
  633. package/templates/static/node_modules/preact/package.json +0 -258
  634. package/templates/static/node_modules/preact/src/cjs.js +0 -3
  635. package/templates/static/node_modules/preact/src/clone-element.js +0 -48
  636. package/templates/static/node_modules/preact/src/component.js +0 -249
  637. package/templates/static/node_modules/preact/src/constants.js +0 -22
  638. package/templates/static/node_modules/preact/src/create-context.js +0 -60
  639. package/templates/static/node_modules/preact/src/create-element.js +0 -97
  640. package/templates/static/node_modules/preact/src/diff/catch-error.js +0 -46
  641. package/templates/static/node_modules/preact/src/diff/children.js +0 -451
  642. package/templates/static/node_modules/preact/src/diff/index.js +0 -684
  643. package/templates/static/node_modules/preact/src/diff/props.js +0 -173
  644. package/templates/static/node_modules/preact/src/dom.d.ts +0 -2476
  645. package/templates/static/node_modules/preact/src/index-5.d.ts +0 -399
  646. package/templates/static/node_modules/preact/src/index.d.ts +0 -402
  647. package/templates/static/node_modules/preact/src/index.js +0 -13
  648. package/templates/static/node_modules/preact/src/internal.d.ts +0 -190
  649. package/templates/static/node_modules/preact/src/jsx.d.ts +0 -2878
  650. package/templates/static/node_modules/preact/src/options.js +0 -16
  651. package/templates/static/node_modules/preact/src/render.js +0 -78
  652. package/templates/static/node_modules/preact/src/util.js +0 -28
  653. package/templates/static/node_modules/preact/test-utils/dist/testUtils.js +0 -2
  654. package/templates/static/node_modules/preact/test-utils/dist/testUtils.js.map +0 -1
  655. package/templates/static/node_modules/preact/test-utils/dist/testUtils.mjs +0 -2
  656. package/templates/static/node_modules/preact/test-utils/dist/testUtils.module.js +0 -2
  657. package/templates/static/node_modules/preact/test-utils/dist/testUtils.module.js.map +0 -1
  658. package/templates/static/node_modules/preact/test-utils/dist/testUtils.umd.js +0 -2
  659. package/templates/static/node_modules/preact/test-utils/dist/testUtils.umd.js.map +0 -1
  660. package/templates/static/node_modules/preact/test-utils/package.json +0 -28
  661. package/templates/static/node_modules/preact/test-utils/src/index.d.ts +0 -3
  662. package/templates/static/node_modules/preact/test-utils/src/index.js +0 -129
  663. package/templates/static/node_modules/preact-render-to-string/LICENSE +0 -21
  664. package/templates/static/node_modules/preact-render-to-string/README.md +0 -149
  665. package/templates/static/node_modules/preact-render-to-string/dist/commonjs.js +0 -2
  666. package/templates/static/node_modules/preact-render-to-string/dist/index.d.ts +0 -17
  667. package/templates/static/node_modules/preact-render-to-string/dist/index.js +0 -6
  668. package/templates/static/node_modules/preact-render-to-string/dist/index.js.map +0 -1
  669. package/templates/static/node_modules/preact-render-to-string/dist/index.mjs +0 -2
  670. package/templates/static/node_modules/preact-render-to-string/dist/index.module.js +0 -2
  671. package/templates/static/node_modules/preact-render-to-string/dist/index.module.js.map +0 -1
  672. package/templates/static/node_modules/preact-render-to-string/dist/index.umd.js +0 -2
  673. package/templates/static/node_modules/preact-render-to-string/dist/index.umd.js.map +0 -1
  674. package/templates/static/node_modules/preact-render-to-string/dist/internal.d.ts +0 -35
  675. package/templates/static/node_modules/preact-render-to-string/dist/jsx/commonjs.js +0 -2
  676. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.js +0 -4
  677. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.js.map +0 -1
  678. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.mjs +0 -2
  679. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.module.js +0 -2
  680. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.module.js.map +0 -1
  681. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.umd.js +0 -2
  682. package/templates/static/node_modules/preact-render-to-string/dist/jsx/index.umd.js.map +0 -1
  683. package/templates/static/node_modules/preact-render-to-string/dist/jsx.d.ts +0 -24
  684. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.js +0 -2
  685. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.js.map +0 -1
  686. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.mjs +0 -2
  687. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.module.js +0 -2
  688. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.module.js.map +0 -1
  689. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.umd.js +0 -2
  690. package/templates/static/node_modules/preact-render-to-string/dist/stream/index.umd.js.map +0 -1
  691. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.js +0 -884
  692. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.js.map +0 -1
  693. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.mjs +0 -884
  694. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.module.js +0 -884
  695. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.module.js.map +0 -1
  696. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.umd.js +0 -888
  697. package/templates/static/node_modules/preact-render-to-string/dist/stream/node/index.umd.js.map +0 -1
  698. package/templates/static/node_modules/preact-render-to-string/dist/stream-node.d.ts +0 -19
  699. package/templates/static/node_modules/preact-render-to-string/dist/stream.d.ts +0 -10
  700. package/templates/static/node_modules/preact-render-to-string/jsx.d.ts +0 -24
  701. package/templates/static/node_modules/preact-render-to-string/jsx.js +0 -1
  702. package/templates/static/node_modules/preact-render-to-string/package.json +0 -152
  703. package/templates/static/node_modules/preact-render-to-string/src/index.d.ts +0 -17
  704. package/templates/static/node_modules/preact-render-to-string/src/index.js +0 -764
  705. package/templates/static/node_modules/preact-render-to-string/src/internal.d.ts +0 -35
  706. package/templates/static/node_modules/preact-render-to-string/src/jsx.d.ts +0 -24
  707. package/templates/static/node_modules/preact-render-to-string/src/jsx.js +0 -102
  708. package/templates/static/node_modules/preact-render-to-string/src/lib/chunked.js +0 -97
  709. package/templates/static/node_modules/preact-render-to-string/src/lib/client.js +0 -62
  710. package/templates/static/node_modules/preact-render-to-string/src/lib/constants.js +0 -20
  711. package/templates/static/node_modules/preact-render-to-string/src/lib/polyfills.js +0 -8
  712. package/templates/static/node_modules/preact-render-to-string/src/lib/util.js +0 -208
  713. package/templates/static/node_modules/preact-render-to-string/src/pretty.js +0 -491
  714. package/templates/static/node_modules/preact-render-to-string/src/stream-node.d.ts +0 -19
  715. package/templates/static/node_modules/preact-render-to-string/src/stream-node.js +0 -84
  716. package/templates/static/node_modules/preact-render-to-string/src/stream.d.ts +0 -10
  717. package/templates/static/node_modules/preact-render-to-string/src/stream.js +0 -43
  718. package/templates/static/node_modules/preact-render-to-string/typings.json +0 -5
  719. package/templates/static/node_modules/sirv/build.js +0 -197
  720. package/templates/static/node_modules/sirv/build.mjs +0 -197
  721. package/templates/static/node_modules/sirv/index.d.mts +0 -29
  722. package/templates/static/node_modules/sirv/index.d.ts +0 -33
  723. package/templates/static/node_modules/sirv/package.json +0 -40
  724. package/templates/static/node_modules/sirv/readme.md +0 -238
  725. package/templates/static/node_modules/totalist/dist/index.js +0 -24
  726. package/templates/static/node_modules/totalist/dist/index.mjs +0 -22
  727. package/templates/static/node_modules/totalist/index.d.ts +0 -3
  728. package/templates/static/node_modules/totalist/license +0 -21
  729. package/templates/static/node_modules/totalist/package.json +0 -55
  730. package/templates/static/node_modules/totalist/readme.md +0 -109
  731. package/templates/static/node_modules/totalist/sync/index.d.ts +0 -3
  732. package/templates/static/node_modules/totalist/sync/index.js +0 -17
  733. package/templates/static/node_modules/totalist/sync/index.mjs +0 -15
  734. package/templates/static/node_modules/typescript/bin/tsc +0 -2
  735. package/templates/static/node_modules/typescript/bin/tsserver +0 -2
  736. package/templates/static/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -2122
  737. package/templates/static/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -2122
  738. package/templates/static/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -2122
  739. package/templates/static/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -2122
  740. package/templates/static/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -2122
  741. package/templates/static/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -2122
  742. package/templates/static/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -2122
  743. package/templates/static/node_modules/typescript/lib/lib.d.ts +0 -22
  744. package/templates/static/node_modules/typescript/lib/lib.decorators.d.ts +0 -384
  745. package/templates/static/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -22
  746. package/templates/static/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -41
  747. package/templates/static/node_modules/typescript/lib/lib.dom.d.ts +0 -39429
  748. package/templates/static/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -571
  749. package/templates/static/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -147
  750. package/templates/static/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -597
  751. package/templates/static/node_modules/typescript/lib/lib.es2015.d.ts +0 -28
  752. package/templates/static/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -77
  753. package/templates/static/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -605
  754. package/templates/static/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -81
  755. package/templates/static/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -128
  756. package/templates/static/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -144
  757. package/templates/static/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -46
  758. package/templates/static/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -326
  759. package/templates/static/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -116
  760. package/templates/static/node_modules/typescript/lib/lib.es2016.d.ts +0 -21
  761. package/templates/static/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -23
  762. package/templates/static/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -31
  763. package/templates/static/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -21
  764. package/templates/static/node_modules/typescript/lib/lib.es2017.d.ts +0 -26
  765. package/templates/static/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -31
  766. package/templates/static/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -23
  767. package/templates/static/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -44
  768. package/templates/static/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -49
  769. package/templates/static/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -135
  770. package/templates/static/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -45
  771. package/templates/static/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -53
  772. package/templates/static/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -77
  773. package/templates/static/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -53
  774. package/templates/static/node_modules/typescript/lib/lib.es2018.d.ts +0 -24
  775. package/templates/static/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -24
  776. package/templates/static/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -83
  777. package/templates/static/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -30
  778. package/templates/static/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -37
  779. package/templates/static/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -79
  780. package/templates/static/node_modules/typescript/lib/lib.es2019.d.ts +0 -24
  781. package/templates/static/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -24
  782. package/templates/static/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -23
  783. package/templates/static/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -33
  784. package/templates/static/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -37
  785. package/templates/static/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -24
  786. package/templates/static/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -765
  787. package/templates/static/node_modules/typescript/lib/lib.es2020.d.ts +0 -27
  788. package/templates/static/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -42
  789. package/templates/static/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -24
  790. package/templates/static/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -474
  791. package/templates/static/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -28
  792. package/templates/static/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -47
  793. package/templates/static/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -99
  794. package/templates/static/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -44
  795. package/templates/static/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -41
  796. package/templates/static/node_modules/typescript/lib/lib.es2021.d.ts +0 -23
  797. package/templates/static/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -24
  798. package/templates/static/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -166
  799. package/templates/static/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -48
  800. package/templates/static/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -33
  801. package/templates/static/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -78
  802. package/templates/static/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -121
  803. package/templates/static/node_modules/typescript/lib/lib.es2022.d.ts +0 -25
  804. package/templates/static/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -75
  805. package/templates/static/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -24
  806. package/templates/static/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -145
  807. package/templates/static/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -26
  808. package/templates/static/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -39
  809. package/templates/static/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -25
  810. package/templates/static/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -924
  811. package/templates/static/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -21
  812. package/templates/static/node_modules/typescript/lib/lib.es2023.d.ts +0 -22
  813. package/templates/static/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -24
  814. package/templates/static/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -56
  815. package/templates/static/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -65
  816. package/templates/static/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -29
  817. package/templates/static/node_modules/typescript/lib/lib.es2024.d.ts +0 -26
  818. package/templates/static/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -24
  819. package/templates/static/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -29
  820. package/templates/static/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -35
  821. package/templates/static/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -25
  822. package/templates/static/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -68
  823. package/templates/static/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -29
  824. package/templates/static/node_modules/typescript/lib/lib.es5.d.ts +0 -4601
  825. package/templates/static/node_modules/typescript/lib/lib.es6.d.ts +0 -23
  826. package/templates/static/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -35
  827. package/templates/static/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -96
  828. package/templates/static/node_modules/typescript/lib/lib.esnext.d.ts +0 -29
  829. package/templates/static/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -28
  830. package/templates/static/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -193
  831. package/templates/static/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -24
  832. package/templates/static/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -445
  833. package/templates/static/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -24
  834. package/templates/static/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -21
  835. package/templates/static/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -148
  836. package/templates/static/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -34
  837. package/templates/static/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -25
  838. package/templates/static/node_modules/typescript/lib/lib.scripthost.d.ts +0 -322
  839. package/templates/static/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -41
  840. package/templates/static/node_modules/typescript/lib/lib.webworker.d.ts +0 -13150
  841. package/templates/static/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -23
  842. package/templates/static/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -340
  843. package/templates/static/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -2122
  844. package/templates/static/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -2122
  845. package/templates/static/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -2122
  846. package/templates/static/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -2122
  847. package/templates/static/node_modules/typescript/lib/tsc.js +0 -8
  848. package/templates/static/node_modules/typescript/lib/tsserver.js +0 -8
  849. package/templates/static/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -17
  850. package/templates/static/node_modules/typescript/lib/tsserverlibrary.js +0 -21
  851. package/templates/static/node_modules/typescript/lib/typescript.d.ts +0 -11437
  852. /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
  853. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
  854. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
  855. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
  856. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
  857. /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
  858. /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
  859. /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
  860. /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
  861. /package/templates/static/{node_modules → lib/vendor}/preact/LICENSE +0 -0
@@ -1,121 +1,396 @@
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 { existsSync, watch } from "node:fs";
19
- import { join, extname } from "node:path";
20
- import sirv from "sirv";
2
+ import { join, extname, resolve } from "node:path";
21
3
  import { createScssCompiler } from "../css/compiler.js";
22
4
  import { scanRoutes } from "../core/routes/scan.js";
23
- import { matchRoute } from "../core/routes/match.js";
5
+ import { createAdvancedRouter } from "../core/routes/orchestrator.js";
24
6
  import { log } from "../shared/log.js";
25
7
  import { Kernel } from "../middleware/kernel.js";
26
8
  import { renderRouteToHtml } from "../runtime/render.js";
27
9
  import { HMR_CLIENT_SCRIPT } from "../runtime/hmr.js";
28
10
  import { headersToObject, parseCookies } from "../core/http.js";
29
11
  import { tryHandleApiRoute } from "./api-routes.js";
30
- import { resolve } from "node:path";
31
- import { buildHydrationModule, runtimeHydrateModule, invalidateCache, } from "./runtimeServe.js";
32
- import { invalidateVueCache, invalidateSvelteCache, } from "../compilers/esbuild-plugins.js";
12
+ import {
13
+ buildHydrationModule,
14
+ runtimeHydrateModule,
15
+ invalidateCache,
16
+ } from "./runtimeServe.js";
17
+ import {
18
+ invalidateVueCache,
19
+ invalidateSvelteCache,
20
+ } from "../compilers/esbuild-plugins.js";
21
+ import { fontServeMiddleware } from "../fonts/inject.js";
22
+ import { createServerActionsMiddleware } from "../server-actions/middleware.js";
23
+ import { runQuery } from "../graphql/index.js";
24
+ import { I18n } from "../i18n/index.js";
25
+ import sirv from "sirv";
26
+ /**
27
+ * Manages the lifecycle of file watchers and HMR connections.
28
+ * Ensures proper cleanup on shutdown to prevent memory leaks.
29
+ */
30
+ class AppLifecycle {
31
+ watcher = null;
32
+ debounceTimer = null;
33
+ hmrClients = new Set();
34
+ setWatcher(watcher) {
35
+ this.watcher = watcher;
36
+ }
37
+ setDebounceTimer(timer) {
38
+ this.debounceTimer = timer;
39
+ }
40
+ addHmrClient(client) {
41
+ this.hmrClients.add(client);
42
+ }
43
+ removeHmrClient(client) {
44
+ this.hmrClients.delete(client);
45
+ }
46
+ getHmrClients() {
47
+ return this.hmrClients;
48
+ }
49
+ /**
50
+ * Properly closes all resources.
51
+ * Called on server shutdown.
52
+ */
53
+ async close() {
54
+ // Clear debounce timer
55
+ if (this.debounceTimer) {
56
+ clearTimeout(this.debounceTimer);
57
+ this.debounceTimer = null;
58
+ }
59
+ // Close all HMR connections
60
+ for (const client of this.hmrClients) {
61
+ if (!client.writableEnded && !client.destroyed) {
62
+ client.end();
63
+ }
64
+ }
65
+ this.hmrClients.clear();
66
+ // Close file watcher
67
+ if (this.watcher) {
68
+ return new Promise((resolve) => {
69
+ const w = this.watcher;
70
+ if (w) {
71
+ w.close();
72
+ this.watcher = null;
73
+ }
74
+ resolve();
75
+ });
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * HTML template for 500 Internal Server Error responses.
81
+ * Used when middleware or request handlers throw uncaught exceptions.
82
+ */
83
+ const ERROR_500_TEMPLATE = `<!DOCTYPE html>
84
+ <html lang="en">
85
+ <head>
86
+ <meta charset="UTF-8">
87
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
88
+ <title>500 - Internal Server Error</title>
89
+ <style>
90
+ body {
91
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
92
+ background: #f5f5f5;
93
+ margin: 0;
94
+ padding: 20px;
95
+ }
96
+ .container {
97
+ max-width: 600px;
98
+ margin: 60px auto;
99
+ background: white;
100
+ padding: 40px;
101
+ border-radius: 8px;
102
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
103
+ }
104
+ h1 {
105
+ color: #d32f2f;
106
+ margin: 0 0 20px 0;
107
+ font-size: 32px;
108
+ }
109
+ p {
110
+ color: #666;
111
+ line-height: 1.6;
112
+ margin: 10px 0;
113
+ }
114
+ .error-details {
115
+ background: #fafafa;
116
+ border-left: 4px solid #d32f2f;
117
+ padding: 15px;
118
+ margin: 20px 0;
119
+ font-family: monospace;
120
+ font-size: 12px;
121
+ color: #333;
122
+ overflow-x: auto;
123
+ white-space: pre-wrap;
124
+ word-break: break-word;
125
+ }
126
+ </style>
127
+ </head>
128
+ <body>
129
+ <div class="container">
130
+ <h1>500 - Internal Server Error</h1>
131
+ <p>The server encountered an unexpected error while processing your request.</p>
132
+ <p>Our team has been notified. Please try again later.</p>
133
+ <div class="error-details" id="details" style="display:none;"></div>
134
+ </div>
135
+ </body>
136
+ </html>`;
137
+ /**
138
+ * Sends a safe 500 error response, checking if headers have already been sent.
139
+ * If headers were sent, attempts to destroy the socket to prevent further data transmission.
140
+ * Logs the error with stack trace for debugging.
141
+ *
142
+ * @param res Node.js ServerResponse object
143
+ * @param error Error object or string to log
144
+ * @param showDetails Whether to include error details in response (dev mode)
145
+ */
146
+ function sendSafeError(res, error, showDetails = false) {
147
+ const errorMsg = error instanceof Error ? error.message : String(error);
148
+ const errorStack = error instanceof Error ? error.stack : "";
149
+ // Log error with full stack trace
150
+ log.error(`[Error] ${errorMsg}`);
151
+ if (errorStack) {
152
+ log.error(`Stack:\n${errorStack}`);
153
+ }
154
+ // If headers already sent, destroy socket to prevent data corruption
155
+ if (res.headersSent) {
156
+ log.error("[Error Response] Headers already sent, destroying socket");
157
+ if (res.socket && !res.socket.destroyed) {
158
+ res.socket.destroy();
159
+ }
160
+ return;
161
+ }
162
+ // Send 500 response with safe error template
163
+ try {
164
+ let html = ERROR_500_TEMPLATE;
165
+ if (showDetails && errorStack) {
166
+ // In dev mode, include error details
167
+ html = html.replace('id="details" style="display:none;"', 'id="details"');
168
+ html = html.replace(
169
+ "<script>",
170
+ `<script>
171
+ document.getElementById('details').textContent = ${JSON.stringify(errorStack)};
172
+ `,
173
+ );
174
+ }
175
+ res.statusCode = 500;
176
+ res.setHeader("content-type", "text/html; charset=utf-8");
177
+ res.setHeader("cache-control", "no-store, no-cache, must-revalidate");
178
+ res.end(html);
179
+ } catch (e) {
180
+ // If error sending response, just try to end the response
181
+ log.error(`[Error Response] Failed to send error page: ${e}`);
182
+ try {
183
+ res.end();
184
+ } catch {
185
+ // Last resort: destroy socket
186
+ if (res.socket && !res.socket.destroyed) {
187
+ res.socket.destroy();
188
+ }
189
+ }
190
+ }
191
+ }
192
+ /**
193
+ * Creates and configures the main HTTP application handler.
194
+ *
195
+ * Initializes the middleware chain for handling requests in the following order:
196
+ * 1. Request logging
197
+ * 2. Internal runtime modules (hydration, HMR)
198
+ * 3. API route handling
199
+ * 4. Static dist directory serving (prod mode)
200
+ * 5. SCSS compilation (dev mode)
201
+ * 6. Site assets serving (dev mode)
202
+ * 7. Server-side rendering (SSR) of route pages
203
+ * 8. 404 fallback
204
+ *
205
+ * In development mode, sets up file watching on the site directory to enable:
206
+ * - Hot Module Replacement (HMR) via Server-Sent Events (SSE)
207
+ * - Hot CSS reload for SCSS changes
208
+ * - Full page reload for JavaScript/TypeScript/framework file changes
209
+ * - Module and compiler cache invalidation
210
+ *
211
+ * @param opts Configuration object
212
+ * @param opts.config Jen.js framework configuration with routes, directories, etc.
213
+ * @param opts.mode "dev" for development or "prod" for production
214
+ * @param opts.viteServer Optional Vite dev server instance for HMR (dev mode only)
215
+ *
216
+ * @returns Promise resolving to an object with handle() method for processing HTTP requests
217
+ *
218
+ * @throws {Error} If route scanning fails due to invalid route patterns
219
+ */
33
220
  export async function createApp(opts) {
34
- const { config, mode } = opts;
35
- // HMR / Live Reload Setup
36
- const hmrClients = new Set();
37
- if (mode === "dev") {
38
- const sitePath = join(process.cwd(), config.siteDir);
39
- log.info(`[HMR] Watching ${sitePath} for changes...`);
40
- // Recursive watch (Node 20+)
41
- let debounceTimer;
42
- try {
43
- watch(sitePath, { recursive: true }, (eventType, filename) => {
44
- if (!filename)
45
- return;
46
- // Ignore common temporary/hidden files to prevent infinite loops
47
- if (filename.startsWith(".") ||
48
- filename.includes("node_modules") ||
49
- filename.endsWith("~") ||
50
- filename.endsWith(".tmp") ||
51
- filename.endsWith(".esbuild.mjs") || // Ignore build artifacts
52
- filename.includes("\\.") || // Windows hidden files
53
- filename.includes("/.") // Unix hidden files
54
- ) {
55
- return;
221
+ const { config, mode, viteServer } = opts;
222
+ /**
223
+ * Lifecycle manager for watchers and HMR connections.
224
+ * Ensures proper cleanup on app shutdown.
225
+ */
226
+ const lifecycle = new AppLifecycle();
227
+ if (mode === "dev") {
228
+ const sitePath = join(process.cwd(), config.siteDir);
229
+ log.info(`[HMR] Watching ${sitePath} for changes...`);
230
+ try {
231
+ const watcher = watch(
232
+ sitePath,
233
+ { recursive: true },
234
+ (eventType, filename) => {
235
+ if (!filename) return;
236
+ /**
237
+ * Filter out files that should not trigger HMR notifications.
238
+ * Temporary files, build artifacts, and hidden files cause infinite loops
239
+ * or are not meant for hot reload.
240
+ */
241
+ if (
242
+ filename.startsWith(".") ||
243
+ filename.includes("node_modules") ||
244
+ filename.endsWith("~") ||
245
+ filename.endsWith(".tmp") ||
246
+ filename.endsWith(".esbuild.mjs") || // Ignore build artifacts
247
+ filename.includes("\\.") || // Windows hidden files
248
+ filename.includes("/.") // Unix hidden files
249
+ ) {
250
+ return;
251
+ }
252
+ /**
253
+ * Debounce timer prevents multiple rapid change notifications.
254
+ * Filesystem watchers often emit multiple events for a single file change.
255
+ * This delay coalesces rapid changes into a single notification (100ms threshold).
256
+ * maxWait cap prevents indefinite waiting on continuous changes.
257
+ */
258
+ let debounceTimer = setTimeout(() => {
259
+ const ext = extname(filename);
260
+ // Normalize path
261
+ const fullPath = join(sitePath, filename);
262
+ log.info(`[HMR] Change detected: ${filename}`);
263
+ if (ext === ".css" || ext === ".scss") {
264
+ /**
265
+ * For CSS/SCSS changes, send a style-update event.
266
+ * This allows the client to reload CSS without full page reload,
267
+ * preserving component state and providing better developer experience.
268
+ */
269
+ const cssName = filename.replace(/\.scss$/, ".css");
270
+ for (const client of lifecycle.getHmrClients()) {
271
+ if (!client.writableEnded && !client.destroyed) {
272
+ client.write(
273
+ `event: style-update\ndata: ${JSON.stringify({ file: cssName })}\n\n`,
274
+ );
56
275
  }
57
- // Debounce to avoid double events
58
- clearTimeout(debounceTimer);
59
- debounceTimer = setTimeout(() => {
60
- const ext = extname(filename);
61
- // Normalize path
62
- const fullPath = join(sitePath, filename);
63
- log.info(`[HMR] Change detected: ${filename}`);
64
- if (ext === ".css" || ext === ".scss") {
65
- // Hot CSS
66
- const cssName = filename.replace(/\.scss$/, ".css");
67
- for (const client of hmrClients) {
68
- client.write(`event: style-update\ndata: ${JSON.stringify({ file: cssName })}\n\n`);
69
- }
70
- }
71
- else {
72
- // Invalidate caches for changed file
73
- invalidateCache(fullPath);
74
- if (ext === ".vue")
75
- invalidateVueCache(fullPath);
76
- if (ext === ".svelte")
77
- invalidateSvelteCache(fullPath);
78
- // Full reload for JS/TS/Vue/Svelte/Other
79
- for (const client of hmrClients) {
80
- client.write(`event: reload\ndata: {}\n\n`);
81
- }
82
- }
83
- }, 100);
84
- });
276
+ }
277
+ } else {
278
+ /**
279
+ * For JavaScript/TypeScript/component changes, invalidate build caches
280
+ * and send a full reload event.
281
+ * Cache invalidation ensures the latest code is loaded on next request.
282
+ */
283
+ invalidateCache(fullPath);
284
+ if (ext === ".vue") invalidateVueCache(fullPath);
285
+ if (ext === ".svelte") invalidateSvelteCache(fullPath);
286
+ // Full reload for JS/TS/Vue/Svelte/Other
287
+ for (const client of lifecycle.getHmrClients()) {
288
+ if (!client.writableEnded && !client.destroyed) {
289
+ client.write(`event: reload\ndata: {}\n\n`);
290
+ }
291
+ }
292
+ }
293
+ }, 100);
294
+ // Use unref() to allow Node.js to exit if this is the only pending operation
295
+ if (debounceTimer.unref) {
296
+ debounceTimer.unref();
297
+ }
298
+ lifecycle.setDebounceTimer(debounceTimer);
299
+ },
300
+ );
301
+ // Store watcher for cleanup on shutdown
302
+ lifecycle.setWatcher(watcher);
303
+ } catch (err) {
304
+ log.warn(`[HMR] Watch failed: ${err}`);
305
+ }
306
+ }
307
+ /**
308
+ * Scans the site directory for route files and compiles route patterns.
309
+ * Routes are discovered by filename pattern and file extensions configured in config.
310
+ * See scanRoutes() for details on route naming conventions.
311
+ */
312
+ const routes = scanRoutes(config);
313
+ const router = createAdvancedRouter(routes, config);
314
+ log.info(`Routes discovered: ${routes.length}`);
315
+ for (const r of routes) log.info(` ${r.urlPath} -> ${r.filePath}`);
316
+ const serveAssets = sirv(join(process.cwd(), config.siteDir), {
317
+ dev: mode === "dev",
318
+ etag: true,
319
+ });
320
+ const serveDist = sirv(join(process.cwd(), config.distDir), {
321
+ dev: mode === "dev",
322
+ etag: true,
323
+ });
324
+ // Font serving middleware
325
+ const fontCacheDir = join(
326
+ process.cwd(),
327
+ config.build?.cacheDir ?? ".jen",
328
+ "fonts",
329
+ );
330
+ const serveFonts = fontServeMiddleware(fontCacheDir);
331
+ // Server actions middleware
332
+ const serverActionsMiddleware = await createServerActionsMiddleware({
333
+ config,
334
+ });
335
+ const middlewares = [
336
+ async (ctx, next) => {
337
+ try {
338
+ log.info(`${ctx.req.method} ${ctx.url.pathname}`);
339
+ // i18n middleware
340
+ if (config.features?.i18n !== false) {
341
+ const locales = config.i18n?.locales || ["en", "es"];
342
+ const defaultLocale = config.i18n?.defaultLocale || "en";
343
+ const firstSegment = ctx.url.pathname.split("/")[1];
344
+ const locale = locales.includes(firstSegment)
345
+ ? firstSegment
346
+ : defaultLocale;
347
+ ctx.i18n = new I18n(locale);
85
348
  }
86
- catch (err) {
87
- log.warn(`[HMR] Watch failed: ${err}`);
349
+ await next();
350
+ } catch (err) {
351
+ sendSafeError(
352
+ ctx.res,
353
+ err instanceof Error ? err : new Error(String(err)),
354
+ mode === "dev",
355
+ );
356
+ }
357
+ },
358
+ async (ctx, next) => {
359
+ try {
360
+ // GraphQL endpoint
361
+ if (ctx.url.pathname === "/graphql" && config.features?.graphql) {
362
+ if (ctx.req.method !== "POST") {
363
+ ctx.res.statusCode = 405;
364
+ ctx.res.end("Method Not Allowed");
365
+ return;
366
+ }
367
+ let body = "";
368
+ ctx.req.on("data", (chunk) => (body += chunk.toString()));
369
+ await new Promise((resolve) => ctx.req.on("end", resolve));
370
+ const { query, variables } = JSON.parse(body);
371
+ const result = await runQuery(query, variables);
372
+ ctx.res.statusCode = 200;
373
+ ctx.res.setHeader("content-type", "application/json");
374
+ ctx.res.end(JSON.stringify(result));
375
+ return;
88
376
  }
89
- }
90
- const routes = scanRoutes(config);
91
- log.info(`Routes discovered: ${routes.length}`);
92
- for (const r of routes)
93
- log.info(` ${r.urlPath} -> ${r.filePath}`);
94
- const serveAssets = sirv(join(process.cwd(), config.siteDir), {
95
- dev: mode === "dev",
96
- etag: true,
97
- });
98
- const serveDist = sirv(join(process.cwd(), config.distDir), {
99
- dev: mode === "dev",
100
- etag: true,
101
- });
102
- const middlewares = [
103
- async (ctx, next) => {
104
- log.info(`${ctx.req.method} ${ctx.url.pathname}`);
105
- await next();
106
- },
107
- async (ctx, next) => {
108
- // runtime internal modules
109
- if (ctx.url.pathname === "/__runtime/hydrate.js") {
110
- ctx.res.statusCode = 200;
111
- ctx.res.setHeader("content-type", "application/javascript; charset=utf-8");
112
- ctx.res.end(runtimeHydrateModule());
113
- return;
114
- }
115
- if (ctx.url.pathname === "/__runtime/island-hydration-client.js") {
116
- ctx.res.statusCode = 200;
117
- ctx.res.setHeader("content-type", "application/javascript; charset=utf-8");
118
- const islandCode = `
377
+ // runtime internal modules
378
+ if (ctx.url.pathname === "/__runtime/hydrate.js") {
379
+ ctx.res.statusCode = 200;
380
+ ctx.res.setHeader(
381
+ "content-type",
382
+ "application/javascript; charset=utf-8",
383
+ );
384
+ ctx.res.end(runtimeHydrateModule());
385
+ return;
386
+ }
387
+ if (ctx.url.pathname === "/__runtime/island-hydration-client.js") {
388
+ ctx.res.statusCode = 200;
389
+ ctx.res.setHeader(
390
+ "content-type",
391
+ "application/javascript; charset=utf-8",
392
+ );
393
+ const islandCode = `
119
394
  import { hydrate } from "https://esm.sh/preact@10";
120
395
  import { h } from "https://esm.sh/preact@10";
121
396
 
@@ -209,173 +484,288 @@ export function initializeIslands() {
209
484
 
210
485
  initializeIslands();
211
486
  `;
212
- ctx.res.end(islandCode);
213
- return;
214
- }
215
- // HMR Endpoint (SSE)
216
- if (ctx.url.pathname === "/__hmr" && mode === "dev") {
217
- ctx.res.statusCode = 200;
218
- ctx.res.setHeader("content-type", "text/event-stream");
219
- ctx.res.setHeader("cache-control", "no-cache");
220
- ctx.res.setHeader("connection", "keep-alive");
221
- ctx.res.write("data: connected\n\n");
222
- hmrClients.add(ctx.res);
223
- ctx.req.on("close", () => {
224
- hmrClients.delete(ctx.res);
225
- });
226
- return;
487
+ ctx.res.end(islandCode);
488
+ return;
489
+ }
490
+ // HMR Endpoint (SSE)
491
+ if (ctx.url.pathname === "/__hmr" && mode === "dev") {
492
+ ctx.res.statusCode = 200;
493
+ ctx.res.setHeader("content-type", "text/event-stream");
494
+ ctx.res.setHeader("cache-control", "no-cache");
495
+ ctx.res.setHeader("connection", "keep-alive");
496
+ ctx.res.write("data: connected\n\n");
497
+ lifecycle.addHmrClient(ctx.res);
498
+ ctx.req.on("close", () => {
499
+ lifecycle.removeHmrClient(ctx.res);
500
+ });
501
+ // Cleanup on response error
502
+ ctx.res.on("error", () => {
503
+ lifecycle.removeHmrClient(ctx.res);
504
+ });
505
+ return;
506
+ }
507
+ if (ctx.url.pathname === "/__hydrate") {
508
+ const file = ctx.url.searchParams.get("file");
509
+ if (!file) {
510
+ ctx.res.statusCode = 400;
511
+ ctx.res.end("missing file");
512
+ return;
513
+ }
514
+ const js = buildHydrationModule(file);
515
+ ctx.res.statusCode = 200;
516
+ ctx.res.setHeader(
517
+ "content-type",
518
+ "application/javascript; charset=utf-8",
519
+ );
520
+ ctx.res.setHeader("cache-control", "no-store");
521
+ ctx.res.end(js);
522
+ return;
523
+ }
524
+ await next();
525
+ } catch (err) {
526
+ sendSafeError(
527
+ ctx.res,
528
+ err instanceof Error ? err : new Error(String(err)),
529
+ mode === "dev",
530
+ );
531
+ }
532
+ },
533
+ async (ctx, next) => {
534
+ try {
535
+ // Font serving (with proper cache headers)
536
+ const handled = await serveFonts(ctx.req, ctx.res);
537
+ if (handled) return;
538
+ await next();
539
+ } catch (err) {
540
+ sendSafeError(
541
+ ctx.res,
542
+ err instanceof Error ? err : new Error(String(err)),
543
+ mode === "dev",
544
+ );
545
+ }
546
+ },
547
+ async (ctx, next) => {
548
+ try {
549
+ // Server actions
550
+ await serverActionsMiddleware(ctx, next);
551
+ } catch (err) {
552
+ sendSafeError(
553
+ ctx.res,
554
+ err instanceof Error ? err : new Error(String(err)),
555
+ mode === "dev",
556
+ );
557
+ }
558
+ },
559
+ async (ctx, next) => {
560
+ try {
561
+ // API routes
562
+ const handled = await tryHandleApiRoute({
563
+ req: ctx.req,
564
+ res: ctx.res,
565
+ siteDir: config.siteDir,
566
+ });
567
+ if (handled) return;
568
+ await next();
569
+ } catch (err) {
570
+ sendSafeError(
571
+ ctx.res,
572
+ err instanceof Error ? err : new Error(String(err)),
573
+ mode === "dev",
574
+ );
575
+ }
576
+ },
577
+ async (ctx, next) => {
578
+ try {
579
+ // dist
580
+ if (mode === "prod") {
581
+ await new Promise((resolve) => {
582
+ serveDist(ctx.req, ctx.res, () => resolve());
583
+ });
584
+ if (ctx.res.writableEnded || ctx.res.headersSent) return;
585
+ }
586
+ await next();
587
+ } catch (err) {
588
+ sendSafeError(
589
+ ctx.res,
590
+ err instanceof Error ? err : new Error(String(err)),
591
+ mode === "dev",
592
+ );
593
+ }
594
+ },
595
+ async (ctx, next) => {
596
+ try {
597
+ // SCSS Compilation (Dev)
598
+ if (mode === "dev" && ctx.url.pathname.endsWith(".css")) {
599
+ let scssFile = null;
600
+ const basePath = resolve(process.cwd());
601
+ if (ctx.url.pathname === "/styles.css") {
602
+ // Global SCSS
603
+ if (config.css?.globalScss) {
604
+ // Already includes siteDir if needed, but add it if it doesn't
605
+ const scssPath = config.css.globalScss.startsWith(config.siteDir)
606
+ ? config.css.globalScss
607
+ : join(config.siteDir, config.css.globalScss);
608
+ scssFile = join(basePath, scssPath);
609
+ console.log(
610
+ "[DEBUG CSS] Looking for global SCSS:",
611
+ scssFile,
612
+ "exists:",
613
+ existsSync(scssFile),
614
+ );
615
+ } else {
616
+ console.log("[DEBUG CSS] No config.css.globalScss found");
227
617
  }
228
- if (ctx.url.pathname === "/__hydrate") {
229
- const file = ctx.url.searchParams.get("file");
230
- if (!file) {
231
- ctx.res.statusCode = 400;
232
- ctx.res.end("missing file");
233
- return;
234
- }
235
- const js = buildHydrationModule(file);
236
- ctx.res.statusCode = 200;
237
- ctx.res.setHeader("content-type", "application/javascript; charset=utf-8");
238
- ctx.res.setHeader("cache-control", "no-store");
239
- ctx.res.end(js);
240
- return;
618
+ } else {
619
+ // Map /foo.css -> siteDir/foo.scss
620
+ const rel = ctx.url.pathname.slice(1);
621
+ const tryPath = join(
622
+ basePath,
623
+ config.siteDir,
624
+ rel.replace(/\.css$/, ".scss"),
625
+ );
626
+ if (existsSync(tryPath)) {
627
+ scssFile = tryPath;
241
628
  }
242
- await next();
243
- },
244
- async (ctx, next) => {
245
- // API routes
246
- const handled = await tryHandleApiRoute({
247
- req: ctx.req,
248
- res: ctx.res,
249
- siteDir: config.siteDir,
629
+ }
630
+ if (scssFile && existsSync(scssFile)) {
631
+ const compiler = createScssCompiler();
632
+ const result = compiler.compile({
633
+ inputPath: scssFile,
634
+ minified: false,
635
+ sourceMap: true,
250
636
  });
251
- if (handled)
252
- return;
253
- await next();
254
- },
255
- async (ctx, next) => {
256
- // dist
257
- if (mode === "prod") {
258
- await new Promise((resolve) => {
259
- serveDist(ctx.req, ctx.res, () => resolve());
260
- });
261
- if (ctx.res.writableEnded || ctx.res.headersSent)
262
- return;
263
- }
264
- await next();
265
- },
266
- async (ctx, next) => {
267
- // SCSS Compilation (Dev)
268
- if (mode === "dev" && ctx.url.pathname.endsWith(".css")) {
269
- let scssFile = null;
270
- const basePath = resolve(process.cwd());
271
- if (ctx.url.pathname === "/styles.css") {
272
- // Global SCSS
273
- if (config.css?.globalScss) {
274
- // Already includes siteDir if needed, but add it if it doesn't
275
- const scssPath = config.css.globalScss.startsWith(config.siteDir)
276
- ? config.css.globalScss
277
- : join(config.siteDir, config.css.globalScss);
278
- scssFile = join(basePath, scssPath);
279
- console.log('[DEBUG CSS] Looking for global SCSS:', scssFile, 'exists:', existsSync(scssFile));
280
- }
281
- else {
282
- console.log('[DEBUG CSS] No config.css.globalScss found');
283
- }
284
- }
285
- else {
286
- // Map /foo.css -> siteDir/foo.scss
287
- const rel = ctx.url.pathname.slice(1);
288
- const tryPath = join(basePath, config.siteDir, rel.replace(/\.css$/, ".scss"));
289
- if (existsSync(tryPath)) {
290
- scssFile = tryPath;
291
- }
292
- }
293
- if (scssFile && existsSync(scssFile)) {
294
- const compiler = createScssCompiler();
295
- const result = compiler.compile({
296
- inputPath: scssFile,
297
- minified: false,
298
- sourceMap: true,
299
- });
300
- if (result.error) {
301
- ctx.res.statusCode = 500;
302
- ctx.res.setHeader("content-type", "text/css");
303
- ctx.res.end(`/* SCSS Error: ${result.error.replace(/\*\//g, "* /")} */ body::before { position:fixed; top:0; left:0; width:100%; content: "SCSS Error: ${result.error
304
- .replace(/\\/g, "\\\\")
305
- .replace(/"/g, '\\"')}"; display: block; background: red; color: white; padding: 1em; z-index:9999; white-space: pre-wrap; }`);
306
- return;
307
- }
308
- ctx.res.statusCode = 200;
309
- ctx.res.setHeader("content-type", "text/css");
310
- ctx.res.end(result.css);
311
- return;
312
- }
637
+ if (result.error) {
638
+ ctx.res.statusCode = 500;
639
+ ctx.res.setHeader("content-type", "text/css");
640
+ ctx.res.end(
641
+ `/* SCSS Error: ${result.error.replace(/\*\//g, "* /")} */ body::before { position:fixed; top:0; left:0; width:100%; content: "SCSS Error: ${result.error
642
+ .replace(/\\/g, "\\\\")
643
+ .replace(
644
+ /"/g,
645
+ '\\"',
646
+ )}"; display: block; background: red; color: white; padding: 1em; z-index:9999; white-space: pre-wrap; }`,
647
+ );
648
+ return;
313
649
  }
314
- await next();
315
- },
316
- async (ctx, next) => {
317
- // site assets in dev
318
- if (mode === "dev") {
319
- await new Promise((resolve) => {
320
- serveAssets(ctx.req, ctx.res, () => resolve());
321
- });
322
- if (ctx.res.writableEnded || ctx.res.headersSent)
323
- return;
324
- }
325
- await next();
326
- },
327
- async (ctx, next) => {
328
- // SSR
329
- if (ctx.req.method !== "GET")
330
- return next();
331
- const m = matchRoute(routes, ctx.url.pathname);
332
- if (!m)
333
- return next();
334
- const reqHeaders = headersToObject(ctx.req.headers);
335
- const cookies = parseCookies(ctx.req);
336
- const query = {};
337
- for (const [k, v] of ctx.url.searchParams.entries())
338
- query[k] = v;
339
- try {
340
- const html = await renderRouteToHtml({
341
- config,
342
- route: m.route,
343
- req: ctx.req,
344
- res: ctx.res,
345
- url: ctx.url,
346
- params: m.params,
347
- query,
348
- headers: reqHeaders,
349
- cookies,
350
- });
351
- let finalHtml = html;
352
- if (mode === "dev") {
353
- // Inject HMR client
354
- finalHtml = html.replace("</body>", `<script>${HMR_CLIENT_SCRIPT}</script></body>`);
355
- }
356
- ctx.res.statusCode = 200;
357
- ctx.res.setHeader("content-type", "text/html; charset=utf-8");
358
- ctx.res.end(finalHtml);
359
- }
360
- catch (err) {
361
- // Middleware may have sent a response (redirect/json)
362
- if (err.message === "__REDIRECT__" || err.message === "__JSON__") {
363
- return; // Response already sent
364
- }
365
- throw err;
366
- }
367
- },
368
- async (ctx) => {
369
- ctx.res.statusCode = 404;
370
- ctx.res.setHeader("content-type", "text/plain; charset=utf-8");
371
- ctx.res.end("404 Not Found");
372
- },
373
- ];
374
- const kernel = new Kernel();
375
- middlewares.forEach((m) => kernel.use(m));
376
- return {
377
- async handle(req, res) {
378
- await kernel.handle(req, res);
379
- },
380
- };
650
+ ctx.res.statusCode = 200;
651
+ ctx.res.setHeader("content-type", "text/css");
652
+ ctx.res.end(result.css);
653
+ return;
654
+ }
655
+ }
656
+ await next();
657
+ } catch (err) {
658
+ sendSafeError(
659
+ ctx.res,
660
+ err instanceof Error ? err : new Error(String(err)),
661
+ mode === "dev",
662
+ );
663
+ }
664
+ },
665
+ async (ctx, next) => {
666
+ try {
667
+ // site assets in dev
668
+ if (mode === "dev") {
669
+ await new Promise((resolve) => {
670
+ serveAssets(ctx.req, ctx.res, () => resolve());
671
+ });
672
+ if (ctx.res.writableEnded || ctx.res.headersSent) return;
673
+ }
674
+ await next();
675
+ } catch (err) {
676
+ sendSafeError(
677
+ ctx.res,
678
+ err instanceof Error ? err : new Error(String(err)),
679
+ mode === "dev",
680
+ );
681
+ }
682
+ },
683
+ async (ctx, next) => {
684
+ try {
685
+ // Advanced routing with guards, redirects, and 404 handling
686
+ if (ctx.req.method !== "GET") return next();
687
+ const reqHeaders = headersToObject(ctx.req.headers);
688
+ const cookies = parseCookies(ctx.req);
689
+ // Use advanced router to resolve the route
690
+ const resolution = await router.resolve(
691
+ ctx.url.pathname,
692
+ ctx.url,
693
+ reqHeaders,
694
+ cookies,
695
+ );
696
+ if (resolution.type === "redirect") {
697
+ // Handle redirects (both app-level and route-level)
698
+ router.handleRedirect(
699
+ ctx.res,
700
+ resolution.location,
701
+ resolution.status,
702
+ );
703
+ return;
704
+ }
705
+ if (resolution.type === "not_found") {
706
+ // Handle 404 responses
707
+ await router.handle404(ctx.res, resolution.pathname);
708
+ return;
709
+ }
710
+ // Route matched - render the page
711
+ if (resolution.type !== "matched") return next();
712
+ const html = await renderRouteToHtml({
713
+ config,
714
+ route: resolution.route,
715
+ req: ctx.req,
716
+ res: ctx.res,
717
+ url: ctx.url,
718
+ params: resolution.params,
719
+ query: resolution.query,
720
+ headers: reqHeaders,
721
+ cookies,
722
+ });
723
+ let finalHtml = html;
724
+ if (mode === "dev") {
725
+ // Inject HMR client
726
+ finalHtml = html.replace(
727
+ "</body>",
728
+ `<script>${HMR_CLIENT_SCRIPT}</script></body>`,
729
+ );
730
+ }
731
+ ctx.res.statusCode = 200;
732
+ ctx.res.setHeader("content-type", "text/html; charset=utf-8");
733
+ ctx.res.end(finalHtml);
734
+ } catch (err) {
735
+ // Middleware may have sent a response (redirect/json)
736
+ if (
737
+ err &&
738
+ (err.message === "__REDIRECT__" || err.message === "__JSON__")
739
+ ) {
740
+ return; // Response already sent
741
+ }
742
+ sendSafeError(
743
+ ctx.res,
744
+ err instanceof Error ? err : new Error(String(err)),
745
+ mode === "dev",
746
+ );
747
+ }
748
+ },
749
+ ];
750
+ const kernel = new Kernel();
751
+ middlewares.forEach((m) => kernel.use(m));
752
+ return {
753
+ async handle(req, res) {
754
+ const start = Date.now();
755
+ const originalEnd = res.end.bind(res);
756
+ res.end = function (...args) {
757
+ const duration = Date.now() - start;
758
+ console.log(`${req.method} ${req.url} ${res.statusCode} ${duration}ms`);
759
+ return originalEnd(...args);
760
+ };
761
+ await kernel.handle(req, res);
762
+ },
763
+ /**
764
+ * Gracefully closes the app and cleans up resources.
765
+ * Should be called on server shutdown.
766
+ */
767
+ async close() {
768
+ await lifecycle.close();
769
+ },
770
+ };
381
771
  }