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
package/dist/colors.js CHANGED
@@ -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
  // ANSI color codes for beautiful terminal output
19
2
  export const colors = {
20
3
  // Main colors
package/dist/create.js CHANGED
@@ -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 fs from "fs";
19
2
  import path from "path";
20
3
  import { fileURLToPath } from "url";
@@ -75,6 +58,11 @@ export async function createJenApp() {
75
58
  value: "static",
76
59
  hint: "Fast, lightweight static sites",
77
60
  },
61
+ {
62
+ label: `${pc.green("SSR & ISR")} - Server-side rendering with incremental static regeneration`,
63
+ value: "ssr-isr",
64
+ hint: "Dynamic content with cached pages",
65
+ },
78
66
  ],
79
67
  });
80
68
  if (isCancel(template)) {
package/dist/generator.js CHANGED
@@ -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 fs from "fs";
19
2
  import path from "path";
20
3
  export function copyTemplateFiles(src, dest) {
@@ -45,27 +28,27 @@ export function createProjectFiles(dir, options) {
45
28
  }
46
29
  // Merge with user project name
47
30
  const packageJson = {
48
- ...templatePackageJson,
49
- name: options.projectName.toLowerCase().replace(/\s+/g, "-"),
50
- version: "0.1.0",
31
+ name: "jen-app",
32
+ version: "1.0.0",
51
33
  type: "module",
52
34
  scripts: {
53
- ...templatePackageJson.scripts,
54
- dev: "jen dev",
55
- build: "jen build",
56
- start: "jen start",
57
- ...(options.typescript && { typecheck: "tsc --noEmit" }),
35
+ dev: "node server.js dev",
36
+ build: "node build.js",
58
37
  },
59
38
  dependencies: {
60
- ...templatePackageJson.dependencies,
61
39
  "@jenjs/master": "^1.2.5",
40
+ "@vue/compiler-sfc": "^3.5.28",
41
+ esbuild: "^0.25.0",
42
+ glob: "^13.0.5",
43
+ preact: "^10.25.4",
44
+ "preact-render-to-string": "^6.5.13",
45
+ sass: "^1.97.3",
46
+ sirv: "^3.0.1",
47
+ svelte: "^5.51.3",
62
48
  },
63
49
  devDependencies: {
64
- ...templatePackageJson.devDependencies,
65
- ...(options.typescript && {
66
- "@types/node": "^22.10.0",
67
- typescript: "^5.7.2",
68
- }),
50
+ "@types/node": "^22.10.0",
51
+ typescript: "^5.7.2",
69
52
  },
70
53
  };
71
54
  fs.writeFileSync(path.join(dir, "package.json"), JSON.stringify(packageJson, null, 2));
package/dist/index.js CHANGED
@@ -1 +1,6 @@
1
- #!/usr/bin/env nodeimport { createJenApp } from "./create.js";createJenApp().catch((error) => { console.error("\n❌ Error:", error.message); process.exit(1);});
1
+ #!/usr/bin/env node
2
+ import { createJenApp } from "./create.js";
3
+ createJenApp().catch((error) => {
4
+ console.error("\n❌ Error:", error.message);
5
+ process.exit(1);
6
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-jen-app",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "description": "Create a beautiful Jen.js application with a single command",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,77 @@
1
+ # Jen.js Starter Kit: SSR + ISR
2
+
3
+ ```sh
4
+ npm create jen-app@latest
5
+ ```
6
+
7
+ > ⚡ **Building something cool?** This is an SSR (Server-Side Rendering) + ISR (Incremental Static Regeneration) Jen.js starter template with dynamic rendering and intelligent caching.
8
+
9
+ ## 🚀 Project Structure
10
+
11
+ Inside your Jen.js project, you'll see the following folders and files:
12
+
13
+ ```text
14
+ /
15
+ ├── site/
16
+ │ ├── assets/
17
+ │ │ └── favicon.svg
18
+ │ ├── components/
19
+ │ │ └── Header.tsx
20
+ │ ├── layouts/
21
+ │ │ └── BaseLayout.tsx
22
+ │ ├── pages/
23
+ │ │ └── (index).tsx
24
+ │ ├── styles/
25
+ │ │ └── global.scss
26
+ │ └── jen.config.ts
27
+ ├── dist/
28
+ └── package.json
29
+ ```
30
+
31
+ ### Key Folders
32
+
33
+ - **`site/pages/`** → Your routes (file-based routing)
34
+ - **`site/components/`** → Reusable UI components
35
+ - **`site/layouts/`** → Layout wrappers
36
+ - **`site/assets/`** → Public static files
37
+ - **`site/styles/`** → Global styles
38
+
39
+ ## 🧞 Commands
40
+
41
+ All commands are run from the root of the project, from a terminal:
42
+
43
+ | Command | Action |
44
+ | :-------------- | :---------------------------------------- |
45
+ | `npm install` | Installs dependencies |
46
+ | `npm run dev` | Starts the dev server at `localhost:3001` |
47
+ | `npm run build` | Builds your SSR+ISR app into `./dist/` |
48
+
49
+ ## 🎯 SSR + ISR Mode
50
+
51
+ This template uses **Server-Side Rendering (SSR)** with **Incremental Static Regeneration (ISR)**:
52
+
53
+ - **SSR**: Pages are rendered on-demand on the server when requested
54
+ - **ISR**: Rendered pages are cached and revalidated every `defaultRevalidateSeconds` (default: 3600 seconds / 1 hour)
55
+
56
+ Configure revalidation in `jen.config.ts`:
57
+
58
+ ```typescript
59
+ rendering: {
60
+ defaultMode: "ssr",
61
+ defaultRevalidateSeconds: 3600, // Revalidate every hour
62
+ },
63
+ ```
64
+
65
+ ## 📦 Deployment
66
+
67
+ SSR+ISR apps require a Node.js runtime:
68
+
69
+ - **Vercel** - Excellent SSR support
70
+ - **Netlify** - With serverless functions
71
+ - **Railway** - Node.js hosting
72
+ - **Heroku** - Classic Node.js deployment
73
+ - **AWS Lambda** - Via serverless frameworks
74
+
75
+ ## 👀 Want to learn more?
76
+
77
+ Check the Jen.js documentation (coming soon) or explore the source code to see how routing, SSR, and caching work.
@@ -0,0 +1,118 @@
1
+ import { dirname, join } from "node:path";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
+ import { readdir, stat, readFile, writeFile } from "node:fs/promises";
4
+ import esbuild from "esbuild";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const currentDir = dirname(__filename);
8
+ const rootDir = join(currentDir, ".");
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
+
34
+ // Embedded Minifier Logic
35
+ const Minifier = {
36
+ html(input) {
37
+ return input
38
+ .replace(/<!--[\s\S]*?-->/g, "")
39
+ .replace(/>\s+</g, "><")
40
+ .replace(/\s+/g, " ")
41
+ .replace(/\s*([{};:,=])\s*/g, "$1")
42
+ .trim();
43
+ },
44
+ css(input) {
45
+ return input
46
+ .replace(/\/\*[\s\S]*?\*\//g, "")
47
+ .replace(/\/\/.*/g, "")
48
+ .replace(/\s*([{}:;,])\s*/g, "$1")
49
+ .replace(/\s+/g, " ")
50
+ .replace(/;\s*}/g, "}")
51
+ .trim();
52
+ },
53
+ };
54
+
55
+ async function main() {
56
+ const args = process.argv.slice(2);
57
+ if (args.includes("analyze")) {
58
+ await analyze();
59
+ return;
60
+ }
61
+
62
+ console.log("[BUILD] Starting SSR+ISR build...");
63
+
64
+ const configPath = join(currentDir, "jen.config.ts");
65
+ const outdir = join(currentDir, ".esbuild");
66
+
67
+ await esbuild.build({
68
+ entryPoints: [configPath],
69
+ outdir,
70
+ format: "esm",
71
+ platform: "node",
72
+ target: "es2022",
73
+ bundle: true,
74
+ minify: true,
75
+ sourcemap: true,
76
+ loader: { ".ts": "ts" },
77
+ logLevel: "silent",
78
+ });
79
+
80
+ const configFile = join(outdir, "jen.config.js");
81
+ const config = (await import(pathToFileURL(configFile).href)).default;
82
+
83
+ const buildPath = pathToFileURL(
84
+ join(rootDir, "lib/build/production-build.js"),
85
+ ).href;
86
+ const { buildProduction } = await import(buildPath);
87
+
88
+ await buildProduction({ config });
89
+
90
+ console.log("[BUILD] Minifying output...");
91
+
92
+ async function minifyDir(dir) {
93
+ try {
94
+ const files = await readdir(dir);
95
+ for (const file of files) {
96
+ const path = join(dir, file);
97
+ const s = await stat(path);
98
+ if (s.isDirectory()) {
99
+ await minifyDir(path);
100
+ } else if (file.endsWith(".html")) {
101
+ const content = await readFile(path, "utf-8");
102
+ await writeFile(path, Minifier.html(content));
103
+ } else if (file.endsWith(".css")) {
104
+ const content = await readFile(path, "utf-8");
105
+ await writeFile(path, Minifier.css(content));
106
+ }
107
+ }
108
+ } catch (e) {
109
+ if (e.code !== "ENOENT") console.warn("Minification warning:", e.message);
110
+ }
111
+ }
112
+
113
+ await minifyDir(join(currentDir, config.distDir || "dist"));
114
+
115
+ console.log("✅ Site built successfully with SSR+ISR!");
116
+ }
117
+
118
+ main().catch(console.error);
@@ -0,0 +1,109 @@
1
+ const config: FrameworkConfig = {
2
+ siteDir: "site",
3
+ distDir: "dist",
4
+ routes: {
5
+ fileExtensions: [".tsx", ".jsx", ".ts", ".js"],
6
+ routeFilePattern: /^\(([^)]+)\)\.(tsx|jsx|ts|js)$/,
7
+ enableIndexFallback: true,
8
+ },
9
+ rendering: {
10
+ defaultMode: "ssr",
11
+ defaultRevalidateSeconds: 3600,
12
+ },
13
+ inject: {
14
+ head: [],
15
+ bodyEnd: [],
16
+ },
17
+ css: {
18
+ globalScss: "site/styles/global.scss",
19
+ },
20
+ assets: {
21
+ publicDir: "site/assets",
22
+ cacheControl: "public, max-age=3600",
23
+ },
24
+ server: {
25
+ port: 3001,
26
+ hostname: "localhost",
27
+ },
28
+ dev: {
29
+ liveReload: true,
30
+ },
31
+ };
32
+
33
+ export default config;
34
+
35
+ export type RenderMode = "ssg" | "ssr" | "isr";
36
+
37
+ export interface FrameworkConfig {
38
+ /** Root directory where pages/components live */
39
+ siteDir: string;
40
+
41
+ /** Output directory for build artifacts */
42
+ distDir: string;
43
+
44
+ routes: {
45
+ /** Allowed extensions for route files */
46
+ fileExtensions: string[];
47
+
48
+ /**
49
+ * Pattern for matching route files.
50
+ * Example: (hello).tsx -> "hello"
51
+ */
52
+ routeFilePattern: RegExp;
53
+
54
+ /** If true, /about maps to /about/index */
55
+ enableIndexFallback: boolean;
56
+ };
57
+
58
+ rendering: {
59
+ /** Default rendering strategy: ssg, ssr, or isr */
60
+ defaultMode: RenderMode;
61
+
62
+ /**
63
+ * Default revalidation time in seconds (ISR-like behavior).
64
+ * 0 = never revalidate (pure SSR).
65
+ * >0 = revalidate cache after N seconds.
66
+ */
67
+ defaultRevalidateSeconds: number;
68
+ };
69
+
70
+ inject: {
71
+ /**
72
+ * HTML strings to inject into <head>.
73
+ * Example: `<meta charset="utf-8">`
74
+ */
75
+ head: string[];
76
+
77
+ /**
78
+ * HTML strings injected before </body>.
79
+ * Example: `<script src="/app.js"></script>`
80
+ */
81
+ bodyEnd: string[];
82
+ };
83
+
84
+ css: {
85
+ /** Path to global SCSS file loaded into every page */
86
+ globalScss?: string;
87
+ };
88
+
89
+ assets: {
90
+ /** Directory for static public assets */
91
+ publicDir: string;
92
+
93
+ /** Cache-Control header applied to assets */
94
+ cacheControl?: string;
95
+ };
96
+
97
+ server: {
98
+ /** Dev/SSR server port */
99
+ port: number;
100
+
101
+ /** Dev/SSR server hostname */
102
+ hostname: string;
103
+ };
104
+
105
+ dev: {
106
+ /** Enables live reload / HMR behavior */
107
+ liveReload: boolean;
108
+ };
109
+ }
@@ -0,0 +1,22 @@
1
+ // Type declarations for local lib/ folder (bundled Jen.js framework)
2
+ declare module "lib" {
3
+ export * from "./lib/index.js";
4
+ }
5
+
6
+ declare module "lib/core" {
7
+ export * from "./lib/core/config.js";
8
+ export * from "./lib/core/routes/scan.js";
9
+ export * from "./lib/core/routes/match.js";
10
+ export * from "./lib/core/middleware-hooks.js";
11
+ export * from "./lib/core/http.js";
12
+ }
13
+
14
+ declare module "lib/runtime" {
15
+ export * from "./lib/runtime/render.js";
16
+ export * from "./lib/runtime/islands.js";
17
+ }
18
+
19
+ declare module "lib/server" {
20
+ export * from "./lib/server/app.js";
21
+ export * from "./lib/server/ssr.js";
22
+ }
@@ -0,0 +1,9 @@
1
+ export default async function handler(ctx) {
2
+ return {
3
+ ok: true,
4
+ message: "Hello from API route",
5
+ method: ctx.method,
6
+ query: ctx.query,
7
+ body: ctx.body,
8
+ };
9
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Generate secure cookie header value
3
+ */
4
+ export function createSecureCookie(name, value, options = {}) {
5
+ const defaults = {
6
+ httpOnly: true, // Prevent XSS token theft
7
+ secure: process.env.NODE_ENV === "production", // HTTPS only in production
8
+ sameSite: "Strict", // CSRF protection
9
+ maxAge: 24 * 60 * 60, // 24 hours
10
+ path: "/",
11
+ };
12
+ const opts = { ...defaults, ...options };
13
+ let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
14
+ if (opts.maxAge !== undefined) {
15
+ cookieStr += `; Max-Age=${opts.maxAge}`;
16
+ }
17
+ if (opts.path) {
18
+ cookieStr += `; Path=${opts.path}`;
19
+ }
20
+ if (opts.domain) {
21
+ cookieStr += `; Domain=${opts.domain}`;
22
+ }
23
+ if (opts.secure) {
24
+ cookieStr += "; Secure";
25
+ }
26
+ if (opts.httpOnly) {
27
+ cookieStr += "; HttpOnly";
28
+ }
29
+ if (opts.sameSite) {
30
+ cookieStr += `; SameSite=${opts.sameSite}`;
31
+ }
32
+ return cookieStr;
33
+ }
34
+ /**
35
+ * Parse cookies from request header
36
+ */
37
+ export function parseCookies(cookieHeader) {
38
+ const cookies = {};
39
+ if (!cookieHeader || !cookieHeader.trim()) return cookies;
40
+ cookieHeader.split(";").forEach((cookie) => {
41
+ const trimmed = cookie.trim();
42
+ if (!trimmed) return;
43
+ const eqIndex = trimmed.indexOf("=");
44
+ if (eqIndex === -1) return;
45
+ const name = trimmed.substring(0, eqIndex).trim();
46
+ const value = trimmed.substring(eqIndex + 1).trim();
47
+ if (name && value) {
48
+ try {
49
+ cookies[decodeURIComponent(name)] = decodeURIComponent(value);
50
+ } catch (err) {
51
+ // Skip cookies with invalid URI encoding
52
+ console.warn(
53
+ `Failed to decode cookie ${name}:`,
54
+ err instanceof Error ? err.message : String(err),
55
+ );
56
+ }
57
+ }
58
+ });
59
+ return cookies;
60
+ }
61
+ /**
62
+ * Validate session cookie - check all security properties
63
+ */
64
+ export function validateSessionCookie(header, expectedName = "sessionId") {
65
+ if (!header) return false;
66
+ const parts = header.split(";").map((p) => p.trim());
67
+ const [cookiePair, ...flags] = parts;
68
+ if (!cookiePair || !cookiePair.includes("=")) return false;
69
+ const [name] = cookiePair.split("=");
70
+ if (decodeURIComponent(name) !== expectedName) return false;
71
+ // Check required security flags
72
+ const hasHttpOnly = flags.some((f) => f.toLowerCase() === "httponly");
73
+ const hasSameSite = flags.some((f) => f.toLowerCase().startsWith("samesite"));
74
+ const isSecure =
75
+ process.env.NODE_ENV === "production"
76
+ ? flags.some((f) => f.toLowerCase() === "secure")
77
+ : true;
78
+ return hasHttpOnly && hasSameSite && isSecure;
79
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./jwt";
2
+ export * from "./session";
@@ -0,0 +1,57 @@
1
+ /**
2
+ * JWT token utilities for creating and validating JSON Web Tokens.
3
+ * This module provides stub implementations that require an external JWT library.
4
+ * Users must install a JWT library (e.g., jsonwebtoken) and implement these functions
5
+ * using that library's APIs to enable authentication features.
6
+ *
7
+ * The module validates that JWT_SECRET is configured in the environment,
8
+ * ensuring token signing and verification can proceed securely.
9
+ */
10
+ // JWT signing and verification require an external library not included by default.
11
+ // Users should install jsonwebtoken: npm install jsonwebtoken
12
+ const SECRET = process.env.JWT_SECRET;
13
+ // Validate that JWT_SECRET is set. This environment variable is required for all token operations.
14
+ // Without a secret, tokens cannot be securely signed or verified.
15
+ if (!SECRET) {
16
+ throw new Error(
17
+ "CRITICAL: JWT_SECRET environment variable is required. Set JWT_SECRET in your .env file or environment.",
18
+ );
19
+ }
20
+ /**
21
+ * Creates a signed JWT token containing the provided payload.
22
+ * This function is a stub that requires implementing with an external JWT library.
23
+ *
24
+ * @param payload The data to encode in the token.
25
+ * @param expiresIn Token expiration time (default "1h"). Format: "1h", "7d", "30s", etc.
26
+ * @returns The signed JWT token as a string.
27
+ * @throws Error indicating that a JWT library must be installed.
28
+ *
29
+ * @example
30
+ * const token = signToken({ userId: 123, role: 'admin' }, '24h');
31
+ * // Implementation using jsonwebtoken:
32
+ * // jwt.sign(payload, SECRET, { expiresIn });
33
+ */
34
+ export function signToken(payload, expiresIn = "1h") {
35
+ throw new Error(
36
+ "JWT implementation requires external library. Install: npm install jsonwebtoken",
37
+ );
38
+ }
39
+ /**
40
+ * Verifies and decodes a JWT token, returning the payload if valid.
41
+ * This function is a stub that requires implementing with an external JWT library.
42
+ *
43
+ * @param token The JWT token string to verify.
44
+ * @returns The decoded payload from the token.
45
+ * @throws Error indicating that a JWT library must be installed.
46
+ * @throws Error if the token is invalid, expired, or fails verification.
47
+ *
48
+ * @example
49
+ * const payload = verifyToken(token);
50
+ * // Implementation using jsonwebtoken:
51
+ * // jwt.verify(token, SECRET);
52
+ */
53
+ export function verifyToken(token) {
54
+ throw new Error(
55
+ "JWT implementation requires external library. Install: npm install jsonwebtoken",
56
+ );
57
+ }