create-jen-app 1.2.3 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/dist/colors.js +0 -17
  2. package/dist/create.js +5 -17
  3. package/dist/generator.js +14 -31
  4. package/dist/index.js +6 -1
  5. package/package.json +1 -1
  6. package/templates/ssr-isr/README.md +77 -0
  7. package/templates/ssr-isr/build.js +118 -0
  8. package/templates/ssr-isr/jen.config.ts +109 -0
  9. package/templates/ssr-isr/jenjs.d.ts +22 -0
  10. package/templates/ssr-isr/lib/api/(hello).js +9 -0
  11. package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
  12. package/templates/ssr-isr/lib/auth/index.js +2 -0
  13. package/templates/ssr-isr/lib/auth/jwt.js +57 -0
  14. package/templates/ssr-isr/lib/auth/session.js +92 -0
  15. package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
  16. package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
  17. package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
  18. package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
  19. package/templates/{static → ssr-isr}/lib/build/build.d.ts +1 -1
  20. package/templates/ssr-isr/lib/build/build.js +141 -0
  21. package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
  22. package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
  23. package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
  24. package/templates/ssr-isr/lib/build/minifier.js +46 -0
  25. package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
  26. package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
  27. package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
  28. package/templates/ssr-isr/lib/build/production-build.js +13 -0
  29. package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
  30. package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
  31. package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
  32. package/templates/ssr-isr/lib/cache/index.js +10 -0
  33. package/templates/ssr-isr/lib/cache/memory.js +40 -0
  34. package/templates/ssr-isr/lib/cache/redis.js +61 -0
  35. package/templates/ssr-isr/lib/cli/banner.js +28 -0
  36. package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
  37. package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
  38. package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
  39. package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
  40. package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
  41. package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
  42. package/templates/ssr-isr/lib/compilers/vue.js +90 -0
  43. package/templates/ssr-isr/lib/core/http.js +71 -0
  44. package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
  45. package/templates/ssr-isr/lib/core/paths.js +39 -0
  46. package/templates/ssr-isr/lib/core/routes/match.js +47 -0
  47. package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
  48. package/templates/ssr-isr/lib/core/types.js +1 -0
  49. package/templates/ssr-isr/lib/css/compiler.js +74 -0
  50. package/templates/ssr-isr/lib/db/connector.js +42 -0
  51. package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
  52. package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
  53. package/templates/ssr-isr/lib/db/index.js +48 -0
  54. package/templates/ssr-isr/lib/db/types.js +1 -0
  55. package/templates/ssr-isr/lib/graphql/index.js +52 -0
  56. package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
  57. package/templates/ssr-isr/lib/graphql/schema.js +35 -0
  58. package/templates/ssr-isr/lib/i18n/en.json +4 -0
  59. package/templates/ssr-isr/lib/i18n/es.json +4 -0
  60. package/templates/ssr-isr/lib/i18n/index.js +15 -0
  61. package/templates/ssr-isr/lib/import/jen-import.js +161 -0
  62. package/templates/ssr-isr/lib/index.js +116 -0
  63. package/templates/ssr-isr/lib/jdb/engine.js +275 -0
  64. package/templates/ssr-isr/lib/jdb/index.js +34 -0
  65. package/templates/ssr-isr/lib/jdb/types.js +1 -0
  66. package/templates/ssr-isr/lib/jdb/utils.js +176 -0
  67. package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.js +0 -17
  68. package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
  69. package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.js +0 -17
  70. package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.js +0 -17
  71. package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.js +0 -17
  72. package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.js +0 -17
  73. package/templates/ssr-isr/lib/middleware/context.js +124 -0
  74. package/templates/{static → ssr-isr}/lib/middleware/decorators.js +0 -17
  75. package/templates/{static → ssr-isr}/lib/middleware/errors/handler.js +0 -17
  76. package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
  77. package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
  78. package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
  79. package/templates/ssr-isr/lib/middleware/registry.js +85 -0
  80. package/templates/ssr-isr/lib/middleware/response.js +107 -0
  81. package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
  82. package/templates/ssr-isr/lib/middleware/types.js +1 -0
  83. package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
  84. package/templates/{static → ssr-isr}/lib/native/bundle.js +0 -17
  85. package/templates/{static → ssr-isr}/lib/native/dev-server.js +0 -17
  86. package/templates/{static → ssr-isr}/lib/native/index.js +0 -17
  87. package/templates/{static → ssr-isr}/lib/native/optimizer.js +0 -17
  88. package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
  89. package/templates/ssr-isr/lib/plugin/loader.js +36 -0
  90. package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
  91. package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
  92. package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
  93. package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
  94. package/templates/ssr-isr/lib/runtime/islands.js +110 -0
  95. package/templates/ssr-isr/lib/runtime/render.js +244 -0
  96. package/templates/ssr-isr/lib/server/api-routes.js +237 -0
  97. package/templates/ssr-isr/lib/server/api.js +108 -0
  98. package/templates/ssr-isr/lib/server/app.js +438 -0
  99. package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
  100. package/templates/ssr-isr/lib/server/ssr.js +202 -0
  101. package/templates/ssr-isr/lib/shared/log.js +64 -0
  102. package/templates/ssr-isr/package.json +23 -0
  103. package/templates/ssr-isr/server.js +128 -0
  104. package/templates/ssr-isr/site/pages/(index).tsx +11 -0
  105. package/templates/ssr-isr/site/styles/global.scss +37 -0
  106. package/templates/ssr-isr/tsconfig.json +39 -0
  107. package/templates/static/build.js +30 -18
  108. package/templates/static/jen.config.ts +0 -18
  109. package/templates/static/jenjs.d.ts +0 -18
  110. package/templates/static/lib/api/(hello).js +0 -17
  111. package/templates/static/lib/api/examples/files/[...slug].js +22 -0
  112. package/templates/static/lib/api/examples/hello.js +11 -0
  113. package/templates/static/lib/api/examples/posts/[id].js +37 -0
  114. package/templates/static/lib/api/examples/posts.js +37 -0
  115. package/templates/static/lib/api/examples/search.js +23 -0
  116. package/templates/static/lib/api/index.js +41 -0
  117. package/templates/static/lib/api/loader.js +234 -0
  118. package/templates/static/lib/api/router.js +259 -0
  119. package/templates/static/lib/assets/types.js +1 -0
  120. package/templates/static/lib/auth/cookie-utils.js +3 -16
  121. package/templates/static/lib/auth/index.js +0 -17
  122. package/templates/static/lib/auth/jwt.js +0 -17
  123. package/templates/static/lib/auth/session.js +0 -17
  124. package/templates/static/lib/build/asset-hashing.js +44 -36
  125. package/templates/static/lib/build/asset-manifest.js +16 -33
  126. package/templates/static/lib/build/build.js +270 -125
  127. package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
  128. package/templates/static/lib/build/bundle-analyzer.js +945 -0
  129. package/templates/static/lib/build/code-splitter.js +194 -0
  130. package/templates/static/lib/build/feature-analyzer.js +190 -0
  131. package/templates/static/lib/build/feature-gate.js +257 -0
  132. package/templates/static/lib/build/island-hydration.js +17 -35
  133. package/templates/static/lib/build/lazy-loader.js +322 -0
  134. package/templates/static/lib/build/minifier.js +40 -59
  135. package/templates/static/lib/build/page-renderer.js +23 -40
  136. package/templates/static/lib/build/production-build.js +9 -26
  137. package/templates/static/lib/build/rust-hashing.js +71 -0
  138. package/templates/static/lib/build/script-optimizer.js +285 -0
  139. package/templates/static/lib/build/ssg-pipeline.js +100 -106
  140. package/templates/static/lib/build/vercel-output.js +298 -0
  141. package/templates/static/lib/build-tools/build-site.js +0 -17
  142. package/templates/static/lib/cache/index.js +0 -17
  143. package/templates/static/lib/cache/memory.js +0 -17
  144. package/templates/static/lib/cache/redis.js +0 -17
  145. package/templates/static/lib/cli/banner.js +0 -17
  146. package/templates/static/lib/cli/templates/ssg/jen.config.js +0 -17
  147. package/templates/static/lib/cli/templates/ssr/jen.config.js +0 -17
  148. package/templates/static/lib/client/Image.js +42 -0
  149. package/templates/static/lib/client/Link.js +190 -0
  150. package/templates/static/lib/client/PWA.js +46 -0
  151. package/templates/static/lib/client/Seo.js +97 -0
  152. package/templates/static/lib/client/index.js +9 -0
  153. package/templates/static/lib/client/useNavigation.js +25 -0
  154. package/templates/static/lib/client/useRouter.js +64 -0
  155. package/templates/static/lib/client-routing/Link.js +17 -0
  156. package/templates/static/lib/client-routing/index.js +19 -0
  157. package/templates/static/lib/client-routing/router.js +151 -0
  158. package/templates/static/lib/client-routing/signal.js +147 -0
  159. package/templates/static/lib/compilers/esbuild-plugins.js +0 -17
  160. package/templates/static/lib/compilers/svelte.js +0 -17
  161. package/templates/static/lib/compilers/vue.js +0 -17
  162. package/templates/static/lib/core/config.js +0 -17
  163. package/templates/static/lib/core/feature-guard.js +136 -0
  164. package/templates/static/lib/core/features.js +99 -0
  165. package/templates/static/lib/core/http.js +0 -17
  166. package/templates/static/lib/core/layouts/index.js +10 -0
  167. package/templates/static/lib/core/layouts/render.js +158 -0
  168. package/templates/static/lib/core/layouts/scan.js +112 -0
  169. package/templates/static/lib/core/layouts/types.js +1 -0
  170. package/templates/static/lib/core/lifecycle.js +129 -0
  171. package/templates/static/lib/core/loader-schema.js +81 -0
  172. package/templates/static/lib/core/middleware-hooks.js +0 -17
  173. package/templates/static/lib/core/paths.js +0 -17
  174. package/templates/static/lib/core/routes/advanced.js +114 -0
  175. package/templates/static/lib/core/routes/handlers.js +181 -0
  176. package/templates/static/lib/core/routes/match.js +89 -17
  177. package/templates/static/lib/core/routes/orchestrator.js +171 -0
  178. package/templates/static/lib/core/routes/rendering-config.js +131 -0
  179. package/templates/static/lib/core/routes/scan.js +0 -17
  180. package/templates/static/lib/core/types.js +0 -17
  181. package/templates/static/lib/css/compiler.js +1 -18
  182. package/templates/static/lib/data-fetching/cache.js +223 -0
  183. package/templates/static/lib/data-fetching/client.js +202 -0
  184. package/templates/static/lib/data-fetching/feature-guard.js +29 -0
  185. package/templates/static/lib/data-fetching/graphql.js +265 -0
  186. package/templates/static/lib/data-fetching/index.js +57 -0
  187. package/templates/static/lib/data-fetching/rest.js +256 -0
  188. package/templates/static/lib/data-fetching/server.js +182 -0
  189. package/templates/static/lib/data-fetching/types.js +5 -0
  190. package/templates/static/lib/db/connector.js +0 -17
  191. package/templates/static/lib/db/drivers/jdb.js +0 -17
  192. package/templates/static/lib/db/drivers/sql.js +0 -17
  193. package/templates/static/lib/db/index.js +0 -17
  194. package/templates/static/lib/db/types.js +0 -17
  195. package/templates/static/lib/devtools/component-tree.js +106 -0
  196. package/templates/static/lib/devtools/devtools.js +638 -0
  197. package/templates/static/lib/devtools/event-bus.js +29 -0
  198. package/templates/static/lib/devtools/event-logger.js +67 -0
  199. package/templates/static/lib/devtools/index.js +9 -0
  200. package/templates/static/lib/devtools/integration.js +149 -0
  201. package/templates/static/lib/devtools/performance.js +84 -0
  202. package/templates/static/lib/devtools/persistence.js +57 -0
  203. package/templates/static/lib/devtools/plugins.js +97 -0
  204. package/templates/static/lib/devtools/search.js +89 -0
  205. package/templates/static/lib/devtools/ui.js +769 -0
  206. package/templates/static/lib/features/api/handler.js +10 -0
  207. package/templates/static/lib/features/api/index.js +5 -0
  208. package/templates/static/lib/features/api/types.js +4 -0
  209. package/templates/static/lib/features/middleware/compiled.js +7 -0
  210. package/templates/static/lib/features/middleware/index.js +5 -0
  211. package/templates/static/lib/features/middleware/types.js +4 -0
  212. package/templates/static/lib/fonts/index.js +46 -0
  213. package/templates/static/lib/fonts/inject.js +125 -0
  214. package/templates/static/lib/fonts/loader.js +196 -0
  215. package/templates/static/lib/fonts/types.js +1 -0
  216. package/templates/static/lib/graphql/index.js +1 -18
  217. package/templates/static/lib/graphql/resolvers.js +20 -13
  218. package/templates/static/lib/graphql/schema.js +0 -17
  219. package/templates/static/lib/i18n/index.js +7 -19
  220. package/templates/static/lib/import/jen-import.js +1 -18
  221. package/templates/static/lib/index.js +79 -125
  222. package/templates/static/lib/jdb/engine.js +0 -17
  223. package/templates/static/lib/jdb/index.js +1 -18
  224. package/templates/static/lib/jdb/types.js +0 -17
  225. package/templates/static/lib/jdb/utils.js +0 -17
  226. package/templates/static/lib/middleware/builtins/cors.js +3 -16
  227. package/templates/static/lib/middleware/context.js +0 -17
  228. package/templates/static/lib/middleware/kernel.js +117 -25
  229. package/templates/static/lib/middleware/pipeline.js +0 -17
  230. package/templates/static/lib/middleware/registry.js +0 -17
  231. package/templates/static/lib/middleware/response.js +0 -17
  232. package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
  233. package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
  234. package/templates/static/lib/plugin/loader.js +0 -17
  235. package/templates/static/lib/plugin/plugin-manager.js +177 -0
  236. package/templates/static/lib/plugin/types.js +28 -0
  237. package/templates/static/lib/runtime/client-runtime.js +0 -17
  238. package/templates/static/lib/runtime/hmr.js +0 -17
  239. package/templates/static/lib/runtime/hydrate.js +0 -17
  240. package/templates/static/lib/runtime/island-hydration-client.js +0 -17
  241. package/templates/static/lib/runtime/islands.js +0 -17
  242. package/templates/static/lib/runtime/render.js +208 -50
  243. package/templates/static/lib/security/security-config.js +60 -0
  244. package/templates/static/lib/security/security-middleware.js +229 -0
  245. package/templates/static/lib/server/api-routes.js +153 -43
  246. package/templates/static/lib/server/api.js +0 -17
  247. package/templates/static/lib/server/app.js +539 -223
  248. package/templates/static/lib/server/isr.js +365 -0
  249. package/templates/static/lib/server/runtimeServe.js +31 -24
  250. package/templates/static/lib/server/ssr.js +98 -22
  251. package/templates/static/lib/server-actions/handler.js +180 -0
  252. package/templates/static/lib/server-actions/index.js +19 -0
  253. package/templates/static/lib/server-actions/middleware.js +146 -0
  254. package/templates/static/lib/server-actions/scan.js +152 -0
  255. package/templates/static/lib/server-actions/types.js +1 -0
  256. package/templates/static/lib/server-actions/validators.js +156 -0
  257. package/templates/static/lib/shared/log.js +19 -20
  258. package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
  259. package/templates/static/lib/telemetry/api/validator.js +67 -0
  260. package/templates/static/lib/telemetry/client.js +121 -0
  261. package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
  262. package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
  263. package/templates/static/lib/vendor/glob/glob.js +4766 -0
  264. package/templates/static/lib/vendor/preact/LICENSE +21 -0
  265. package/templates/static/lib/vendor/preact/preact.module.js +797 -0
  266. package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
  267. package/templates/static/package.json +4 -0
  268. package/templates/static/server.js +22 -22
  269. package/templates/static/site/(home).tsx +0 -18
  270. package/templates/static/tsconfig.json +5 -1
  271. package/templates/static/.esbuild/jen.config.js +0 -19
  272. package/templates/static/lib/build/asset-hashing.d.ts +0 -10
  273. package/templates/static/lib/build/asset-manifest.d.ts +0 -11
  274. package/templates/static/lib/build/minifier.d.ts +0 -20
  275. package/templates/static/lib/build/page-renderer.d.ts +0 -17
  276. package/templates/static/lib/build/production-build.d.ts +0 -10
  277. package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
  278. package/templates/static/lib/middleware/errors/http-error.js +0 -27
  279. package/templates/static/lib/middleware/types.js +0 -18
  280. package/templates/static/lib/middleware/utils/matcher.js +0 -30
  281. package/templates/static/lib/native/style-compiler.js +0 -36
  282. /package/templates/{static → ssr-isr}/lib/api/(hello).d.ts +0 -0
  283. /package/templates/{static → ssr-isr}/lib/auth/cookie-utils.d.ts +0 -0
  284. /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
  285. /package/templates/{static → ssr-isr}/lib/auth/jwt.d.ts +0 -0
  286. /package/templates/{static → ssr-isr}/lib/auth/session.d.ts +0 -0
  287. /package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +0 -0
  288. /package/templates/{static → ssr-isr}/lib/cache/index.d.ts +0 -0
  289. /package/templates/{static → ssr-isr}/lib/cache/memory.d.ts +0 -0
  290. /package/templates/{static → ssr-isr}/lib/cache/redis.d.ts +0 -0
  291. /package/templates/{static → ssr-isr}/lib/cli/banner.d.ts +0 -0
  292. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
  293. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
  294. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
  295. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
  296. /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
  297. /package/templates/{static → ssr-isr}/lib/compilers/svelte.d.ts +0 -0
  298. /package/templates/{static → ssr-isr}/lib/compilers/vue.d.ts +0 -0
  299. /package/templates/{static → ssr-isr}/lib/core/config.d.ts +0 -0
  300. /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
  301. /package/templates/{static → ssr-isr}/lib/core/http.d.ts +0 -0
  302. /package/templates/{static → ssr-isr}/lib/core/middleware-hooks.d.ts +0 -0
  303. /package/templates/{static → ssr-isr}/lib/core/paths.d.ts +0 -0
  304. /package/templates/{static → ssr-isr}/lib/core/routes/match.d.ts +0 -0
  305. /package/templates/{static → ssr-isr}/lib/core/routes/scan.d.ts +0 -0
  306. /package/templates/{static → ssr-isr}/lib/core/types.d.ts +0 -0
  307. /package/templates/{static → ssr-isr}/lib/css/compiler.d.ts +0 -0
  308. /package/templates/{static → ssr-isr}/lib/db/connector.d.ts +0 -0
  309. /package/templates/{static → ssr-isr}/lib/db/drivers/jdb.d.ts +0 -0
  310. /package/templates/{static → ssr-isr}/lib/db/drivers/sql.d.ts +0 -0
  311. /package/templates/{static → ssr-isr}/lib/db/index.d.ts +0 -0
  312. /package/templates/{static → ssr-isr}/lib/db/types.d.ts +0 -0
  313. /package/templates/{static → ssr-isr}/lib/graphql/index.d.ts +0 -0
  314. /package/templates/{static → ssr-isr}/lib/graphql/resolvers.d.ts +0 -0
  315. /package/templates/{static → ssr-isr}/lib/graphql/schema.d.ts +0 -0
  316. /package/templates/{static → ssr-isr}/lib/i18n/index.d.ts +0 -0
  317. /package/templates/{static → ssr-isr}/lib/import/jen-import.d.ts +0 -0
  318. /package/templates/{static → ssr-isr}/lib/index.d.ts +0 -0
  319. /package/templates/{static → ssr-isr}/lib/jdb/engine.d.ts +0 -0
  320. /package/templates/{static → ssr-isr}/lib/jdb/index.d.ts +0 -0
  321. /package/templates/{static → ssr-isr}/lib/jdb/types.d.ts +0 -0
  322. /package/templates/{static → ssr-isr}/lib/jdb/utils.d.ts +0 -0
  323. /package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.d.ts +0 -0
  324. /package/templates/{static → ssr-isr}/lib/middleware/builtins/cors.d.ts +0 -0
  325. /package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.d.ts +0 -0
  326. /package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.d.ts +0 -0
  327. /package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.d.ts +0 -0
  328. /package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.d.ts +0 -0
  329. /package/templates/{static → ssr-isr}/lib/middleware/context.d.ts +0 -0
  330. /package/templates/{static → ssr-isr}/lib/middleware/decorators.d.ts +0 -0
  331. /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
  332. /package/templates/{static → ssr-isr}/lib/middleware/errors/http-error.d.ts +0 -0
  333. /package/templates/{static → ssr-isr}/lib/middleware/kernel.d.ts +0 -0
  334. /package/templates/{static → ssr-isr}/lib/middleware/pipeline.d.ts +0 -0
  335. /package/templates/{static → ssr-isr}/lib/middleware/registry.d.ts +0 -0
  336. /package/templates/{static → ssr-isr}/lib/middleware/response.d.ts +0 -0
  337. /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
  338. /package/templates/{static → ssr-isr}/lib/native/bundle.d.ts +0 -0
  339. /package/templates/{static → ssr-isr}/lib/native/dev-server.d.ts +0 -0
  340. /package/templates/{static → ssr-isr}/lib/native/index.d.ts +0 -0
  341. /package/templates/{static → ssr-isr}/lib/native/optimizer.d.ts +0 -0
  342. /package/templates/{static → ssr-isr}/lib/native/style-compiler.d.ts +0 -0
  343. /package/templates/{static → ssr-isr}/lib/plugin/loader.d.ts +0 -0
  344. /package/templates/{static → ssr-isr}/lib/runtime/client-runtime.d.ts +0 -0
  345. /package/templates/{static → ssr-isr}/lib/runtime/hmr.d.ts +0 -0
  346. /package/templates/{static → ssr-isr}/lib/runtime/hydrate.d.ts +0 -0
  347. /package/templates/{static → ssr-isr}/lib/runtime/island-hydration-client.d.ts +0 -0
  348. /package/templates/{static → ssr-isr}/lib/runtime/islands.d.ts +0 -0
  349. /package/templates/{static → ssr-isr}/lib/runtime/render.d.ts +0 -0
  350. /package/templates/{static → ssr-isr}/lib/server/api-routes.d.ts +0 -0
  351. /package/templates/{static → ssr-isr}/lib/server/api.d.ts +0 -0
  352. /package/templates/{static → ssr-isr}/lib/server/app.d.ts +0 -0
  353. /package/templates/{static → ssr-isr}/lib/server/runtimeServe.d.ts +0 -0
  354. /package/templates/{static → ssr-isr}/lib/server/ssr.d.ts +0 -0
  355. /package/templates/{static → ssr-isr}/lib/shared/log.d.ts +0 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * JDB (Jen Database) - A lightweight embedded JSON database for Jen.js applications.
3
+ *
4
+ * JDB provides MongoDB-like CRUD operations with file-based or in-memory storage.
5
+ * Perfect for small to medium applications that need data persistence without external dependencies.
6
+ *
7
+ * Features:
8
+ * - MongoDB-like query syntax with filter operators ($eq, $gt, $in, $regex, etc.)
9
+ * - Atomic update operations ($set, $inc, $push, etc.)
10
+ * - Pagination, sorting, and filtering
11
+ * - Lazy loading and deferred writes for performance
12
+ * - In-memory mode for testing
13
+ * - Simple JSON file format for easy inspection and migration
14
+ *
15
+ * @example
16
+ * import { JDBEngine, type ICollection, type Document } from '@src/jdb';
17
+ *
18
+ * interface User extends Document {
19
+ * name: string;
20
+ * email: string;
21
+ * age: number;
22
+ * }
23
+ *
24
+ * const db = new JDBEngine({ root: './data' });
25
+ * await db.connect();
26
+ *
27
+ * const users = db.collection<User>('users');
28
+ * const user = await users.insert({ name: 'John', email: 'john@example.com', age: 30 });
29
+ * const found = await users.findOne({ email: 'john@example.com' });
30
+ * await users.update({ _id: user._id }, { $set: { age: 31 } });
31
+ * await users.delete({ _id: user._id });
32
+ */
33
+ export * from "./types";
34
+ export { JDBEngine } from "./engine";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,176 @@
1
+ import fs from "fs/promises";
2
+ import crypto from "crypto";
3
+ /**
4
+ * Ensure a directory exists, creating it recursively if necessary.
5
+ * Idempotent: does not throw if the directory already exists.
6
+ *
7
+ * @param dir Directory path to ensure exists.
8
+ * @throws Error if directory creation fails.
9
+ */
10
+ export async function ensureDir(dir) {
11
+ try {
12
+ await fs.access(dir);
13
+ } catch {
14
+ await fs.mkdir(dir, { recursive: true });
15
+ }
16
+ }
17
+ /**
18
+ * Read and parse a JSON file from disk.
19
+ * Returns null if the file does not exist (ENOENT).
20
+ * Other errors (invalid JSON, permission denied, etc.) are re-thrown.
21
+ *
22
+ * @template T The expected JSON structure type.
23
+ * @param file Path to the JSON file to read.
24
+ * @returns Parsed JSON data, or null if file does not exist.
25
+ * @throws Error if the file exists but cannot be read or parsed.
26
+ */
27
+ export async function readJSON(file) {
28
+ try {
29
+ const data = await fs.readFile(file, "utf-8");
30
+ return JSON.parse(data);
31
+ } catch (e) {
32
+ if (e.code === "ENOENT") return null;
33
+ throw e;
34
+ }
35
+ }
36
+ /**
37
+ * Write data as JSON to a file atomically using a temporary file.
38
+ * Atomic writes prevent corruption if the process crashes during writing.
39
+ * The temporary file is renamed to the target file only after writing completes successfully.
40
+ *
41
+ * @param file Path to the target file (will be created or overwritten).
42
+ * @param data Object to serialize as JSON with pretty-printing (2-space indent).
43
+ * @throws Error if writing or renaming fails.
44
+ */
45
+ export async function writeJSON(file, data) {
46
+ const tempFile = `${file}.tmp`;
47
+ await fs.writeFile(tempFile, JSON.stringify(data, null, 2));
48
+ await fs.rename(tempFile, file);
49
+ }
50
+ /**
51
+ * Generate a unique identifier for a new document.
52
+ * Uses cryptographically secure UUID v4 generation.
53
+ *
54
+ * @returns A UUID string suitable for use as a document _id.
55
+ */
56
+ export function generateId() {
57
+ return crypto.randomUUID();
58
+ }
59
+ /**
60
+ * Test whether a document matches a filter query.
61
+ * Supports MongoDB-like query syntax including operators ($eq, $ne, $gt, etc.) and logical operators ($or, $and).
62
+ * Processes each field condition and returns false if any condition fails (AND semantics).
63
+ * Logical operators $or and $and are processed separately with their respective semantics.
64
+ *
65
+ * @param doc The document to test.
66
+ * @param filter The filter query to apply.
67
+ * @returns True if the document matches all filter conditions, false otherwise.
68
+ *
69
+ * @example
70
+ * matchFilter({ name: 'John', age: 30 }, { name: 'John' }) // true
71
+ * matchFilter({ age: 25 }, { age: { $gte: 18 } }) // true
72
+ * matchFilter({ name: 'Jane' }, { $or: [{ name: 'John' }, { name: 'Jane' }] }) // true
73
+ */
74
+ export function matchFilter(doc, filter) {
75
+ for (const key in filter) {
76
+ if (key === "$or") {
77
+ // OR: at least one filter must match
78
+ if (!filter.$or.some((f) => matchFilter(doc, f))) return false;
79
+ continue;
80
+ }
81
+ if (key === "$and") {
82
+ // AND: all filters must match
83
+ if (!filter.$and.every((f) => matchFilter(doc, f))) return false;
84
+ continue;
85
+ }
86
+ const val = doc[key];
87
+ const cond = filter[key];
88
+ // If condition is an object (not array), it contains operators
89
+ if (typeof cond === "object" && cond !== null && !Array.isArray(cond)) {
90
+ for (const op in cond) {
91
+ const target = cond[op];
92
+ switch (op) {
93
+ case "$eq":
94
+ if (val !== target) return false;
95
+ break;
96
+ case "$ne":
97
+ if (val === target) return false;
98
+ break;
99
+ case "$gt":
100
+ if (!(val > target)) return false;
101
+ break;
102
+ case "$gte":
103
+ if (!(val >= target)) return false;
104
+ break;
105
+ case "$lt":
106
+ if (!(val < target)) return false;
107
+ break;
108
+ case "$lte":
109
+ if (!(val <= target)) return false;
110
+ break;
111
+ case "$in":
112
+ if (!target.includes(val)) return false;
113
+ break;
114
+ case "$nin":
115
+ if (target.includes(val)) return false;
116
+ break;
117
+ case "$regex":
118
+ if (!new RegExp(target).test(val)) return false;
119
+ break;
120
+ }
121
+ }
122
+ } else {
123
+ // Simple equality check
124
+ if (val !== cond) return false;
125
+ }
126
+ }
127
+ return true;
128
+ }
129
+ /**
130
+ * Apply update operators to a document, modifying it in place.
131
+ * Automatically updates the _updated timestamp to the current time.
132
+ * Supports $set, $unset, $inc, $push, and $pull operators.
133
+ *
134
+ * @param doc The document to update (modified in place).
135
+ * @param update Update specification with operators.
136
+ *
137
+ * @example
138
+ * const doc = { name: 'John', age: 30, tags: ['js'] };
139
+ * applyUpdate(doc, { $set: { name: 'Jane' }, $inc: { age: 1 }, $push: { tags: 'ts' } });
140
+ * // doc is now { name: 'Jane', age: 31, tags: ['js', 'ts'], _updated: <current-timestamp> }
141
+ */
142
+ export function applyUpdate(doc, update) {
143
+ const now = Date.now();
144
+ doc._updated = now;
145
+ for (const op in update) {
146
+ const fields = update[op];
147
+ for (const key in fields) {
148
+ const val = fields[key];
149
+ switch (op) {
150
+ case "$set":
151
+ // Set field to the specified value
152
+ doc[key] = val;
153
+ break;
154
+ case "$unset":
155
+ // Remove the field from the document
156
+ delete doc[key];
157
+ break;
158
+ case "$inc":
159
+ // Increment numeric field by the specified amount
160
+ doc[key] = (doc[key] || 0) + val;
161
+ break;
162
+ case "$push":
163
+ // Append to array (create array if doesn't exist)
164
+ if (!Array.isArray(doc[key])) doc[key] = [];
165
+ doc[key].push(val);
166
+ break;
167
+ case "$pull":
168
+ // Remove all occurrences of value from array
169
+ if (Array.isArray(doc[key])) {
170
+ doc[key] = doc[key].filter((item) => item !== val);
171
+ }
172
+ break;
173
+ }
174
+ }
175
+ }
176
+ }
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  /**
19
2
  * Request body parsing middleware.
20
3
  * Reads and parses the request body based on Content-Type header.
@@ -0,0 +1,54 @@
1
+ export function cors(options = {}) {
2
+ const defaults = {
3
+ origin: ["http://localhost:3000", "http://localhost:5173"],
4
+ methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"],
5
+ allowedHeaders: ["Content-Type", "Authorization"],
6
+ credentials: false, // Changed: credentials should be false with CORS by default for security
7
+ maxAge: 86400,
8
+ };
9
+ const opts = { ...defaults, ...options };
10
+ return async (ctx, next) => {
11
+ const origin = ctx.req.headers.origin;
12
+ // Validate origin against whitelist
13
+ let allowOrigin = false;
14
+ if (Array.isArray(opts.origin)) {
15
+ allowOrigin = origin && opts.origin.includes(origin);
16
+ } else if (typeof opts.origin === "function") {
17
+ allowOrigin = origin && opts.origin(origin);
18
+ } else if (opts.origin === "*") {
19
+ // DANGEROUS: only use with credentials: false
20
+ if (opts.credentials) {
21
+ console.warn(
22
+ "SECURITY WARNING: CORS origin '*' with credentials=true is insecure. Origin set to empty.",
23
+ );
24
+ allowOrigin = false;
25
+ } else {
26
+ allowOrigin = true;
27
+ }
28
+ } else if (opts.origin === origin) {
29
+ allowOrigin = true;
30
+ }
31
+ if (allowOrigin && origin) {
32
+ ctx.response.header("Access-Control-Allow-Origin", origin);
33
+ }
34
+ if (opts.credentials) {
35
+ ctx.response.header("Access-Control-Allow-Credentials", "true");
36
+ }
37
+ if (ctx.req.method === "OPTIONS") {
38
+ ctx.response.header(
39
+ "Access-Control-Allow-Methods",
40
+ opts.methods?.join(","),
41
+ );
42
+ ctx.response.header(
43
+ "Access-Control-Allow-Headers",
44
+ opts.allowedHeaders?.join(","),
45
+ );
46
+ if (opts.maxAge) {
47
+ ctx.response.header("Access-Control-Max-Age", opts.maxAge);
48
+ }
49
+ ctx.response.status(204).send();
50
+ return;
51
+ }
52
+ await next();
53
+ };
54
+ }
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  import { log } from "../../shared/log.js";
19
2
  /**
20
3
  * Middleware that logs HTTP requests and responses with timing information.
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  /**
19
2
  * Rate limiting middleware that protects against brute force and DDoS attacks.
20
3
  * Tracks request count per client IP within a time window and rejects excess requests.
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  import { randomUUID } from "node:crypto";
19
2
  /**
20
3
  * Request ID middleware that assigns unique identifiers to incoming requests.
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  /**
19
2
  * Security headers middleware that sets HTTP response headers for defense against common attacks.
20
3
  * Implements a comprehensive security policy including:
@@ -0,0 +1,124 @@
1
+ import { ResponseBuilder } from "./response.js";
2
+ /**
3
+ * Request context object passed through the middleware chain.
4
+ * Wraps Node.js req/res objects and provides helper methods and parsed request data.
5
+ * Each middleware receives this context and can read/modify its properties.
6
+ *
7
+ * The context enables:
8
+ * - Access to parsed URL, query params, route params, cookies, headers
9
+ * - Convenient response building methods (json(), headers())
10
+ * - State storage for passing data between middlewares
11
+ * - Request body parsing and caching
12
+ */
13
+ export class Context {
14
+ /**
15
+ * Raw Node.js IncomingMessage request object.
16
+ * Contains method, url, headers, socket, etc.
17
+ */
18
+ req;
19
+ /**
20
+ * Raw Node.js ServerResponse response object.
21
+ * Used to send response data back to the client.
22
+ */
23
+ res;
24
+ /**
25
+ * Parsed URL object with scheme, host, pathname, search, searchParams, etc.
26
+ * Automatically constructed from req.url and req.headers.host.
27
+ *
28
+ * @example ctx.url.pathname for "/posts/42", ctx.url.searchParams for query parsing
29
+ */
30
+ url;
31
+ /**
32
+ * Shared state object for middleware to store data.
33
+ * Useful for passing values between middlewares in the chain without response headers.
34
+ *
35
+ * @example ctx.state.userId = 42; // Set in auth middleware, read in handler
36
+ */
37
+ state;
38
+ /**
39
+ * ResponseBuilder instance for fluent response building.
40
+ * Use ctx.response.status().json() or ctx.response.header() to build responses.
41
+ * Alternatively, use ctx.json() shortcut for quick JSON responses.
42
+ */
43
+ response;
44
+ /**
45
+ * Parsed request body cache.
46
+ * Set by body parser middleware if request has a body.
47
+ * Can be null if no body parser ran or if the request has no body.
48
+ */
49
+ body;
50
+ /**
51
+ * Query string parameters as an object.
52
+ * Automatically parsed from ctx.url.searchParams on construction.
53
+ * Keys and values are always strings.
54
+ *
55
+ * @example For URL "/posts?sort=date&limit=10", yields { sort: "date", limit: "10" }
56
+ */
57
+ query;
58
+ /**
59
+ * Route parameters extracted from the URL path.
60
+ * Set by route matching middleware based on dynamic route patterns.
61
+ * Empty object initially; populated when a route matches.
62
+ *
63
+ * @example For route "/posts/:id" matching "/posts/42", yields { id: "42" }
64
+ */
65
+ params;
66
+ /**
67
+ * Initializes a request context from Node.js request and response objects.
68
+ * Parses the URL, extracts query parameters, and initializes helpers.
69
+ *
70
+ * @param req Node.js IncomingMessage
71
+ * @param res Node.js ServerResponse
72
+ */
73
+ constructor(req, res) {
74
+ this.req = req;
75
+ this.res = res;
76
+ this.url = new URL(
77
+ req.url ?? "/",
78
+ `http://${req.headers.host || "localhost"}`,
79
+ );
80
+ this.state = {};
81
+ this.response = new ResponseBuilder(res);
82
+ this.body = null;
83
+ this.query = Object.fromEntries(this.url.searchParams);
84
+ this.params = {};
85
+ }
86
+ /**
87
+ * Getter that parses and caches cookies from the request.
88
+ * Parses the Cookie header into an object of name-value pairs.
89
+ * Values are automatically decoded using decodeURIComponent.
90
+ * Memoization is implicit; called fresh each time.
91
+ *
92
+ * @returns Object with cookie names as keys and values as cookie values
93
+ *
94
+ * @example
95
+ * const sessionId = ctx.cookies.sessionId; // Get a cookie value
96
+ * // For header "sessionId=abc123; theme=dark" yields { sessionId: "abc123", theme: "dark" }
97
+ */
98
+ get cookies() {
99
+ const header = this.req.headers.cookie;
100
+ if (!header) return {};
101
+ return Object.fromEntries(
102
+ header.split(";").map((c) => {
103
+ const [key, ...v] = c.trim().split("=");
104
+ return [key, decodeURIComponent(v.join("="))];
105
+ }),
106
+ );
107
+ }
108
+ /**
109
+ * Convenience method to send a JSON response.
110
+ * Combines ctx.response.status().json().send() into a single call.
111
+ *
112
+ * @param data Object to serialize as JSON and send
113
+ * @param status HTTP status code; defaults to 200 (OK)
114
+ *
115
+ * @returns Result of response.send() (undefined if response is sent)
116
+ *
117
+ * @example
118
+ * ctx.json({ success: true }, 201);
119
+ * ctx.json({ error: "Not found" }, 404);
120
+ */
121
+ json(data, status = 200) {
122
+ return this.response.status(status).json(data).send();
123
+ }
124
+ }
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  /**
19
2
  * Metadata storage for decorator information.
20
3
  * Provides a fallback when Reflect.metadata is not available.
@@ -1,20 +1,3 @@
1
- /*
2
- * This file is part of Jen.js.
3
- * Copyright (C) 2026 oopsio
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
- */
18
1
  import { HttpError } from "./http-error.js";
19
2
  export async function errorHandler(ctx, next) {
20
3
  try {
@@ -0,0 +1,10 @@
1
+ export class HttpError extends Error {
2
+ statusCode;
3
+ details;
4
+ constructor(statusCode, message, details) {
5
+ super(message);
6
+ this.statusCode = statusCode;
7
+ this.details = details;
8
+ Object.setPrototypeOf(this, HttpError.prototype);
9
+ }
10
+ }
@@ -0,0 +1,85 @@
1
+ import { Pipeline } from "./pipeline.js";
2
+ import { MiddlewareRegistry } from "./registry.js";
3
+ import { Context } from "./context.js";
4
+ /**
5
+ * Core HTTP request handler that manages middleware execution and request context.
6
+ *
7
+ * The Kernel implements a middleware pipeline pattern:
8
+ * 1. Receives Node.js req and res objects
9
+ * 2. Wraps them in a Context object with helper methods and properties
10
+ * 3. Composes registered middlewares into a callable pipeline
11
+ * 4. Executes the pipeline with the context for request processing
12
+ *
13
+ * Middlewares can:
14
+ * - Access/modify request and response via ctx.req, ctx.res, ctx.response
15
+ * - Read/set cookies, headers, query params, route params
16
+ * - Store and retrieve shared state in ctx.state
17
+ * - Call ctx.response.json() or other response builders
18
+ * - Control flow via next() to continue to next middleware
19
+ */
20
+ export class Kernel {
21
+ /**
22
+ * Array of global middleware functions that run for every request.
23
+ * Middlewares are stored in order of registration (use() calls).
24
+ * Executed sequentially in Pipeline.compose().
25
+ */
26
+ globalMiddleware = [];
27
+ constructor() {}
28
+ /**
29
+ * Registers a middleware function to run for all requests.
30
+ * Middleware can be a function, a class constructor, or an object with handle() method.
31
+ *
32
+ * @param mw Middleware function: (ctx, next) => Promise<void>
33
+ * Or class with: new MyMiddleware().handle(ctx, next)
34
+ *
35
+ * @example
36
+ * kernel.use(async (ctx, next) => {
37
+ * console.log(`${ctx.req.method} ${ctx.url.pathname}`);
38
+ * await next();
39
+ * });
40
+ */
41
+ use(mw) {
42
+ this.globalMiddleware.push(mw);
43
+ }
44
+ /**
45
+ * Processes an HTTP request through the global middleware pipeline.
46
+ * Creates a Context wrapping the request/response, composes middlewares, and executes them.
47
+ *
48
+ * @param req Node.js IncomingMessage (HTTP request object)
49
+ * @param res Node.js ServerResponse (HTTP response object)
50
+ *
51
+ * @returns Promise that resolves when middleware chain completes
52
+ *
53
+ * @example
54
+ * const server = createServer((req, res) => {
55
+ * kernel.handle(req, res);
56
+ * });
57
+ */
58
+ async handle(req, res) {
59
+ const ctx = new Context(req, res);
60
+ const fn = Pipeline.compose(this.globalMiddleware);
61
+ await fn(ctx, async () => {});
62
+ }
63
+ /**
64
+ * Processes a request through global middleware plus a registered middleware group.
65
+ * Retrieves middleware from the registry by group name and composes them with global middleware.
66
+ * Useful for route-specific or feature-specific middleware chains.
67
+ *
68
+ * @param req Node.js IncomingMessage
69
+ * @param res Node.js ServerResponse
70
+ * @param groupName Name of the middleware group registered in MiddlewareRegistry
71
+ *
72
+ * @returns Promise that resolves when complete middleware chain executes
73
+ *
74
+ * @example
75
+ * // Given a group named "apiMiddleware" with auth and logging
76
+ * await kernel.handleWithGroup(req, res, "apiMiddleware");
77
+ */
78
+ async handleWithGroup(req, res, groupName) {
79
+ const ctx = new Context(req, res);
80
+ const registry = MiddlewareRegistry.get();
81
+ const groupMw = registry.getGroup(groupName);
82
+ const fn = Pipeline.compose([...this.globalMiddleware, ...groupMw]);
83
+ await fn(ctx, async () => {});
84
+ }
85
+ }