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,202 @@
1
+ import { renderRouteToHtml } from "../runtime/render.js";
2
+ /**
3
+ * HTML rendering cache for performance optimization.
4
+ * Cache key is URL pathname. Useful for frequently accessed pages.
5
+ * In production, consider using Redis or external cache for distributed rendering.
6
+ */
7
+ const renderCache = new Map();
8
+ let cacheConfig = {
9
+ enabled: true,
10
+ ttlSeconds: 3600, // Default: 1 hour
11
+ };
12
+ /**
13
+ * Configure the SSR HTML cache behavior.
14
+ *
15
+ * @param config Cache configuration options
16
+ */
17
+ export function configureSsrCache(config) {
18
+ cacheConfig = { ...cacheConfig, ...config };
19
+ }
20
+ /**
21
+ * Clear the entire SSR render cache.
22
+ * Useful in development or when data has changed.
23
+ */
24
+ export function clearSsrCache() {
25
+ renderCache.clear();
26
+ }
27
+ /**
28
+ * Clear a specific cached page by URL pathname.
29
+ *
30
+ * @param pathname URL pathname to invalidate
31
+ */
32
+ export function invalidateSsrCache(pathname) {
33
+ renderCache.delete(pathname);
34
+ }
35
+ /**
36
+ * Get cached HTML for a page if it exists and hasn't expired.
37
+ *
38
+ * @param pathname URL pathname
39
+ * @returns Cached HTML string, or null if not cached/expired
40
+ */
41
+ function getCachedHtml(pathname) {
42
+ if (!cacheConfig.enabled) return null;
43
+ const cached = renderCache.get(pathname);
44
+ if (!cached) return null;
45
+ const age = (Date.now() - cached.timestamp) / 1000;
46
+ if (age > cacheConfig.ttlSeconds) {
47
+ renderCache.delete(pathname);
48
+ return null;
49
+ }
50
+ return cached.html;
51
+ }
52
+ /**
53
+ * Cache rendered HTML for a page.
54
+ *
55
+ * @param pathname URL pathname
56
+ * @param html Complete HTML string to cache
57
+ */
58
+ function cacheHtml(pathname, html) {
59
+ if (!cacheConfig.enabled) return;
60
+ renderCache.set(pathname, { html, timestamp: Date.now() });
61
+ }
62
+ /**
63
+ * Core SSR render function: converts a component/template to HTML string.
64
+ * This is the main entry point for server-side rendering in Jen.js.
65
+ *
66
+ * Handles:
67
+ * 1. Cache lookup for performance
68
+ * 2. Module compilation (TS/JSX/Vue/Svelte → JS)
69
+ * 3. Route middleware execution
70
+ * 4. Loader function invocation (getServerSideProps pattern)
71
+ * 5. Component rendering to HTML string
72
+ * 6. Head management and hydration script injection
73
+ * 7. HTML caching for subsequent requests
74
+ *
75
+ * @param config Framework configuration
76
+ * @param route Route entry being rendered
77
+ * @param ctx Complete SSR context with request/response and metadata
78
+ * @returns Complete HTML document as a string
79
+ * @throws Error if rendering fails
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const html = await render(config, route, {
84
+ * req, res, url, params, query, headers, cookies
85
+ * });
86
+ * res.setHeader("content-type", "text/html; charset=utf-8");
87
+ * res.end(html);
88
+ * ```
89
+ */
90
+ export async function render(config, route, ctx) {
91
+ const pathname = ctx.url.pathname;
92
+ // Check cache first
93
+ const cached = getCachedHtml(pathname);
94
+ if (cached) {
95
+ return cached;
96
+ }
97
+ // Render the page
98
+ const html = await renderRouteToHtml({
99
+ config,
100
+ route,
101
+ req: ctx.req,
102
+ res: ctx.res,
103
+ url: ctx.url,
104
+ params: ctx.params,
105
+ query: ctx.query,
106
+ headers: ctx.headers,
107
+ cookies: ctx.cookies,
108
+ });
109
+ // Cache for next request
110
+ cacheHtml(pathname, html);
111
+ return html;
112
+ }
113
+ /**
114
+ * Advanced SSR render with optional caching control.
115
+ * Allows per-request cache bypass for revalidation.
116
+ *
117
+ * @param config Framework configuration
118
+ * @param route Route entry being rendered
119
+ * @param ctx Complete SSR context
120
+ * @param options Render options
121
+ * @param options.cache Whether to use/update cache (default: true)
122
+ * @returns Complete HTML document
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const html = await renderWithOptions(config, route, ctx, {
127
+ * cache: false // Bypass cache for this request
128
+ * });
129
+ * ```
130
+ */
131
+ export async function renderWithOptions(config, route, ctx, options = {}) {
132
+ const { cache = true } = options;
133
+ const pathname = ctx.url.pathname;
134
+ // Check cache if enabled
135
+ if (cache) {
136
+ const cached = getCachedHtml(pathname);
137
+ if (cached) return cached;
138
+ }
139
+ // Render the page
140
+ const html = await renderRouteToHtml({
141
+ config,
142
+ route,
143
+ req: ctx.req,
144
+ res: ctx.res,
145
+ url: ctx.url,
146
+ params: ctx.params,
147
+ query: ctx.query,
148
+ headers: ctx.headers,
149
+ cookies: ctx.cookies,
150
+ });
151
+ // Cache if enabled
152
+ if (cache) {
153
+ cacheHtml(pathname, html);
154
+ }
155
+ return html;
156
+ }
157
+ /**
158
+ * Manual HTML rendering of a component to string (no full document).
159
+ * Useful when you need just the component HTML without head/body wrapper.
160
+ *
161
+ * This is a low-level API primarily for internal use.
162
+ * For typical routing, use render() instead.
163
+ *
164
+ * @param config Framework configuration
165
+ * @param route Route to render
166
+ * @param ctx SSR context
167
+ * @returns Just the component body HTML (no <!doctype>, no <head>, no hydration)
168
+ */
169
+ export async function renderComponentToString(config, route, ctx) {
170
+ // For now, we render the full HTML and extract the body
171
+ const html = await renderRouteToHtml({
172
+ config,
173
+ route,
174
+ req: ctx.req,
175
+ res: ctx.res,
176
+ url: ctx.url,
177
+ params: ctx.params,
178
+ query: ctx.query,
179
+ headers: ctx.headers,
180
+ cookies: ctx.cookies,
181
+ });
182
+ // Extract body content
183
+ const bodyMatch = html.match(/<div id="app">([\s\S]*?)<\/div>/);
184
+ return bodyMatch ? bodyMatch[1] : "";
185
+ }
186
+ /**
187
+ * Get cache statistics for monitoring and debugging.
188
+ *
189
+ * @returns Cache statistics
190
+ */
191
+ export function getSsrCacheStats() {
192
+ return {
193
+ size: renderCache.size,
194
+ enabled: cacheConfig.enabled,
195
+ ttlSeconds: cacheConfig.ttlSeconds,
196
+ entries: Array.from(renderCache.entries()).map(([key, value]) => ({
197
+ pathname: key,
198
+ age: (Date.now() - value.timestamp) / 1000,
199
+ size: value.html.length,
200
+ })),
201
+ };
202
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Get current timestamp in ISO 8601 format.
3
+ * Used to prefix all log messages with precise UTC time information for debugging and monitoring.
4
+ *
5
+ * @returns ISO 8601 timestamp string (e.g., "2026-02-19T15:30:45.123Z")
6
+ */
7
+ function ts() {
8
+ return new Date().toISOString();
9
+ }
10
+ /**
11
+ * Structured logging utility for the Jen.js framework.
12
+ * Provides three log levels (info, warn, error) that output to appropriate streams.
13
+ *
14
+ * Usage:
15
+ * - log.info(): Development and progress messages
16
+ * - log.warn(): Warnings and non-fatal issues
17
+ * - log.error(): Critical errors that may require attention
18
+ *
19
+ * Format:
20
+ * All logs include an ISO 8601 timestamp and a level prefix.
21
+ * Example: "[2026-02-19T15:30:45.123Z] [INFO] Building 42 routes"
22
+ *
23
+ * Output:
24
+ * - info() -> console.log (stdout)
25
+ * - warn() -> console.warn (stderr)
26
+ * - error() -> console.error (stderr)
27
+ *
28
+ * This is used throughout the framework for build output, server status, and diagnostics.
29
+ */
30
+ export const log = {
31
+ /**
32
+ * Logs an informational message with timestamp and [INFO] prefix.
33
+ * Used for progress updates, build completion, server startup, etc.
34
+ *
35
+ * @param msg Message to log
36
+ *
37
+ * @example log.info("Server running on port 3000");
38
+ */
39
+ info(msg) {
40
+ console.log(`[${ts()}] [INFO] ${msg}`);
41
+ },
42
+ /**
43
+ * Logs a warning message with timestamp and [WARN] prefix.
44
+ * Used for non-fatal issues, deprecated usage, or recoverable problems.
45
+ *
46
+ * @param msg Warning message to log
47
+ *
48
+ * @example log.warn("Configuration file not found, using defaults");
49
+ */
50
+ warn(msg) {
51
+ console.warn(`[${ts()}] [WARN] ${msg}`);
52
+ },
53
+ /**
54
+ * Logs an error message with timestamp and [ERROR] prefix.
55
+ * Used for critical failures that require immediate attention.
56
+ *
57
+ * @param msg Error message to log
58
+ *
59
+ * @example log.error("Failed to compile SCSS: syntax error on line 42");
60
+ */
61
+ error(msg) {
62
+ console.error(`[${ts()}] [ERROR] ${msg}`);
63
+ },
64
+ };
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "jen-app",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "node server.js dev",
7
+ "build": "node build.js"
8
+ },
9
+ "dependencies": {
10
+ "@vue/compiler-sfc": "^3.5.28",
11
+ "esbuild": "^0.25.0",
12
+ "glob": "^13.0.5",
13
+ "preact": "^10.25.4",
14
+ "preact-render-to-string": "^6.5.13",
15
+ "sass": "^1.97.3",
16
+ "sirv": "^3.0.1",
17
+ "svelte": "^5.51.3"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^22.10.0",
21
+ "typescript": "^5.7.2"
22
+ }
23
+ }
@@ -0,0 +1,128 @@
1
+ import { createServer } from "node:http";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import esbuild from "esbuild";
5
+
6
+ const colors = {
7
+ reset: "\x1b[0m",
8
+ dim: "\x1b[2m",
9
+ cyan: "\x1b[36m",
10
+ red: "\x1b[31m",
11
+ };
12
+
13
+ const ts = () => new Date().toISOString().replace("T", " ").slice(0, 19);
14
+
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const currentDir = dirname(__filename);
17
+ const rootDir = join(currentDir, ".");
18
+
19
+ const mode = process.argv[2] ?? "dev";
20
+ const isDev = mode === "dev";
21
+
22
+ // Embedded Minifier Logic
23
+ const Minifier = {
24
+ html(input) {
25
+ return input
26
+ .replace(/<!--[\s\S]*?-->/g, "")
27
+ .replace(/>\s+</g, "><")
28
+ .replace(/\s+/g, " ")
29
+ .replace(/\s*([{};:,=])\s*/g, "$1")
30
+ .trim();
31
+ },
32
+ css(input) {
33
+ return input
34
+ .replace(/\/\*[\s\S]*?\*\//g, "")
35
+ .replace(/\/\/.*/g, "")
36
+ .replace(/\s*([{}:;,])\s*/g, "$1")
37
+ .replace(/\s+/g, " ")
38
+ .replace(/;\s*}/g, "}")
39
+ .trim();
40
+ },
41
+ };
42
+
43
+ async function main() {
44
+ console.log(
45
+ `${colors.dim}[${ts()}]${colors.reset} ${colors.cyan}[INFO]${colors.reset} Starting SSR+ISR server in ${isDev ? "DEV" : "PROD"} mode...`,
46
+ );
47
+
48
+ const configPath = join(currentDir, "jen.config.ts");
49
+ const outdir = join(currentDir, ".esbuild");
50
+
51
+ await esbuild.build({
52
+ entryPoints: [configPath],
53
+ outdir,
54
+ format: "esm",
55
+ platform: "node",
56
+ target: "es2022",
57
+ minify: true,
58
+ jsx: "automatic",
59
+ jsxImportSource: "preact",
60
+ bundle: true,
61
+ loader: { ".ts": "ts" },
62
+ logLevel: "silent",
63
+ });
64
+
65
+ const configFile = join(outdir, "jen.config.js");
66
+ const config = (await import(pathToFileURL(configFile).href)).default;
67
+
68
+ const appPath = pathToFileURL(join(rootDir, "lib/server/app.js")).href;
69
+ const { createApp } = await import(appPath);
70
+
71
+ // Load banner
72
+ const bannerPath = pathToFileURL(join(rootDir, "lib/cli/banner.js")).href;
73
+ const { printBanner } = await import(bannerPath);
74
+
75
+ const app = await createApp({
76
+ config,
77
+ mode: isDev ? "dev" : "prod",
78
+ });
79
+
80
+ const server = createServer(async (req, res) => {
81
+ // Intercept response to minify
82
+ const originalEnd = res.end;
83
+ res.end = function (chunk, encoding, callback) {
84
+ if (chunk) {
85
+ const type = res.getHeader("content-type");
86
+ if (typeof type === "string") {
87
+ if (type.includes("text/html")) {
88
+ try {
89
+ chunk = Minifier.html(chunk.toString());
90
+ res.removeHeader("content-length");
91
+ } catch (e) {
92
+ console.error(
93
+ `${colors.dim}[${ts()}]${colors.reset} ${colors.red}[ERROR]${colors.reset} HTML Minification failed:`,
94
+ e,
95
+ );
96
+ }
97
+ } else if (type.includes("text/css")) {
98
+ try {
99
+ chunk = Minifier.css(chunk.toString());
100
+ res.removeHeader("content-length");
101
+ } catch (e) {
102
+ console.error(
103
+ `${colors.dim}[${ts()}]${colors.reset} ${colors.red}[ERROR]${colors.reset} CSS Minification failed:`,
104
+ e,
105
+ );
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return originalEnd.call(this, chunk, encoding, callback);
111
+ };
112
+
113
+ try {
114
+ await app.handle(req, res);
115
+ } catch (err) {
116
+ res.statusCode = 500;
117
+ res.setHeader("content-type", "text/plain; charset=utf-8");
118
+ res.end("Internal Server Error\n\n" + (err?.stack ?? String(err)));
119
+ }
120
+ });
121
+
122
+ server.listen(config.server.port, config.server.hostname, () => {
123
+ const actualPort = server.address().port;
124
+ printBanner(actualPort, isDev ? "development" : "production");
125
+ });
126
+ }
127
+
128
+ main().catch(console.error);
@@ -0,0 +1,11 @@
1
+ export default function HomePage() {
2
+ return (
3
+ <main>
4
+ <h1>Welcome to Jen.js (SSR + ISR)</h1>
5
+ <p>
6
+ This is a server-rendered page with incremental static regeneration.
7
+ </p>
8
+ <p>Current time: {new Date().toLocaleString()}</p>
9
+ </main>
10
+ );
11
+ }
@@ -0,0 +1,37 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ html {
8
+ font-family:
9
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
10
+ Arial, sans-serif;
11
+ line-height: 1.5;
12
+ color: #333;
13
+ }
14
+
15
+ body {
16
+ background-color: #f5f5f5;
17
+ }
18
+
19
+ main {
20
+ max-width: 1200px;
21
+ margin: 0 auto;
22
+ padding: 2rem;
23
+ background: white;
24
+ border-radius: 8px;
25
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
26
+ }
27
+
28
+ h1 {
29
+ font-size: 2.5rem;
30
+ margin-bottom: 1rem;
31
+ color: #0066cc;
32
+ }
33
+
34
+ p {
35
+ margin-bottom: 1rem;
36
+ font-size: 1.1rem;
37
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
+
6
+ "module": "ESNext",
7
+ "moduleResolution": "Bundler",
8
+
9
+ "jsx": "react-jsx",
10
+ "jsxImportSource": "preact",
11
+
12
+ "strict": true,
13
+ "skipLibCheck": true,
14
+
15
+ "baseUrl": ".",
16
+ "paths": {
17
+ "@src/*": ["lib/*"]
18
+ },
19
+
20
+ "types": ["node"],
21
+
22
+ "outDir": "dist",
23
+ "rootDir": ".",
24
+
25
+ "allowJs": false,
26
+ "resolveJsonModule": true,
27
+
28
+ "esModuleInterop": true,
29
+ "forceConsistentCasingInFileNames": true
30
+ },
31
+ "include": [
32
+ "site/**/*.ts",
33
+ "site/**/*.tsx",
34
+ "server.ts",
35
+ "build.ts",
36
+ "jen.config.ts"
37
+ ],
38
+ "exclude": ["node_modules", "dist"]
39
+ }
@@ -1,21 +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
-
19
1
  import { dirname, join } from "node:path";
20
2
  import { fileURLToPath, pathToFileURL } from "node:url";
21
3
  import { readdir, stat, readFile, writeFile } from "node:fs/promises";
@@ -25,6 +7,30 @@ const __filename = fileURLToPath(import.meta.url);
25
7
  const currentDir = dirname(__filename);
26
8
  const rootDir = join(currentDir, ".");
27
9
 
10
+ async function analyze() {
11
+ console.log("[ANALYZE] Loading bundle analyzer...");
12
+ const analyzerPath = pathToFileURL(
13
+ join(rootDir, "lib/build/bundle-analyzer.js"),
14
+ ).href;
15
+ const { runBundleAnalyzer } = await import(analyzerPath);
16
+ const configPath = join(currentDir, "jen.config.ts");
17
+ const outdir = join(currentDir, ".esbuild");
18
+ await esbuild.build({
19
+ entryPoints: [configPath],
20
+ outdir,
21
+ format: "esm",
22
+ platform: "node",
23
+ target: "es2022",
24
+ bundle: true,
25
+ loader: { ".ts": "ts" },
26
+ logLevel: "silent",
27
+ });
28
+ const configFile = join(outdir, "jen.config.js");
29
+ const config = (await import(pathToFileURL(configFile).href)).default;
30
+ await runBundleAnalyzer(config);
31
+ console.log("[ANALYZE] Bundle analysis complete!");
32
+ }
33
+
28
34
  // Embedded Minifier Logic
29
35
  const Minifier = {
30
36
  html(input) {
@@ -47,6 +53,12 @@ const Minifier = {
47
53
  };
48
54
 
49
55
  async function main() {
56
+ const args = process.argv.slice(2);
57
+ if (args.includes("analyze")) {
58
+ await analyze();
59
+ return;
60
+ }
61
+
50
62
  console.log("[BUILD] Starting build...");
51
63
 
52
64
  const configPath = join(currentDir, "jen.config.ts");
@@ -1,21 +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
-
19
1
  const config: FrameworkConfig = {
20
2
  siteDir: "site",
21
3
  distDir: "dist",
@@ -1,21 +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
-
19
1
  declare module "@jenjs/master" {
20
2
  export * from "@jenjs/master";
21
3
  }
@@ -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
  export default async function handler(ctx) {
19
2
  return {
20
3
  ok: true,
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Example Catch-All API Route: GET /api/files/[...slug]
3
+ *
4
+ * Example showing catch-all dynamic routes for file paths
5
+ * Matches: /api/files/a, /api/files/a/b, /api/files/a/b/c, etc.
6
+ */
7
+ export default async function handler(req, res) {
8
+ const { slug } = req.params;
9
+ // slug will be an array of path segments
10
+ // /api/files/docs/readme.md -> slug = ['docs', 'readme.md']
11
+ // /api/files/a/b/c -> slug = ['a', 'b', 'c']
12
+ const filePath = Array.isArray(slug) ? slug.join("/") : slug;
13
+ if (req.method === "GET") {
14
+ res.status(200).json({
15
+ message: "File resource",
16
+ path: filePath,
17
+ segments: slug,
18
+ });
19
+ } else {
20
+ res.status(405).json({ error: "Method not allowed" });
21
+ }
22
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Example API Route: GET /api/hello
3
+ *
4
+ * Basic example showing JSON response
5
+ */
6
+ export default function handler(req, res) {
7
+ res.status(200).json({
8
+ message: "Hello from Jen.js API!",
9
+ timestamp: new Date().toISOString(),
10
+ });
11
+ }