create-jen-app 1.2.3 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/dist/colors.js +0 -17
  2. package/dist/create.js +5 -17
  3. package/dist/generator.js +14 -31
  4. package/dist/index.js +6 -1
  5. package/package.json +1 -1
  6. package/templates/ssr-isr/README.md +77 -0
  7. package/templates/ssr-isr/build.js +118 -0
  8. package/templates/ssr-isr/jen.config.ts +109 -0
  9. package/templates/ssr-isr/jenjs.d.ts +22 -0
  10. package/templates/ssr-isr/lib/api/(hello).js +9 -0
  11. package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
  12. package/templates/ssr-isr/lib/auth/index.js +2 -0
  13. package/templates/ssr-isr/lib/auth/jwt.js +57 -0
  14. package/templates/ssr-isr/lib/auth/session.js +92 -0
  15. package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
  16. package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
  17. package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
  18. package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
  19. package/templates/{static → ssr-isr}/lib/build/build.d.ts +1 -1
  20. package/templates/ssr-isr/lib/build/build.js +141 -0
  21. package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
  22. package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
  23. package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
  24. package/templates/ssr-isr/lib/build/minifier.js +46 -0
  25. package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
  26. package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
  27. package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
  28. package/templates/ssr-isr/lib/build/production-build.js +13 -0
  29. package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
  30. package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
  31. package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
  32. package/templates/ssr-isr/lib/cache/index.js +10 -0
  33. package/templates/ssr-isr/lib/cache/memory.js +40 -0
  34. package/templates/ssr-isr/lib/cache/redis.js +61 -0
  35. package/templates/ssr-isr/lib/cli/banner.js +28 -0
  36. package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
  37. package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
  38. package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
  39. package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
  40. package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
  41. package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
  42. package/templates/ssr-isr/lib/compilers/vue.js +90 -0
  43. package/templates/ssr-isr/lib/core/http.js +71 -0
  44. package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
  45. package/templates/ssr-isr/lib/core/paths.js +39 -0
  46. package/templates/ssr-isr/lib/core/routes/match.js +47 -0
  47. package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
  48. package/templates/ssr-isr/lib/core/types.js +1 -0
  49. package/templates/ssr-isr/lib/css/compiler.js +74 -0
  50. package/templates/ssr-isr/lib/db/connector.js +42 -0
  51. package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
  52. package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
  53. package/templates/ssr-isr/lib/db/index.js +48 -0
  54. package/templates/ssr-isr/lib/db/types.js +1 -0
  55. package/templates/ssr-isr/lib/graphql/index.js +52 -0
  56. package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
  57. package/templates/ssr-isr/lib/graphql/schema.js +35 -0
  58. package/templates/ssr-isr/lib/i18n/en.json +4 -0
  59. package/templates/ssr-isr/lib/i18n/es.json +4 -0
  60. package/templates/ssr-isr/lib/i18n/index.js +15 -0
  61. package/templates/ssr-isr/lib/import/jen-import.js +161 -0
  62. package/templates/ssr-isr/lib/index.js +116 -0
  63. package/templates/ssr-isr/lib/jdb/engine.js +275 -0
  64. package/templates/ssr-isr/lib/jdb/index.js +34 -0
  65. package/templates/ssr-isr/lib/jdb/types.js +1 -0
  66. package/templates/ssr-isr/lib/jdb/utils.js +176 -0
  67. package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.js +0 -17
  68. package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
  69. package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.js +0 -17
  70. package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.js +0 -17
  71. package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.js +0 -17
  72. package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.js +0 -17
  73. package/templates/ssr-isr/lib/middleware/context.js +124 -0
  74. package/templates/{static → ssr-isr}/lib/middleware/decorators.js +0 -17
  75. package/templates/{static → ssr-isr}/lib/middleware/errors/handler.js +0 -17
  76. package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
  77. package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
  78. package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
  79. package/templates/ssr-isr/lib/middleware/registry.js +85 -0
  80. package/templates/ssr-isr/lib/middleware/response.js +107 -0
  81. package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
  82. package/templates/ssr-isr/lib/middleware/types.js +1 -0
  83. package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
  84. package/templates/{static → ssr-isr}/lib/native/bundle.js +0 -17
  85. package/templates/{static → ssr-isr}/lib/native/dev-server.js +0 -17
  86. package/templates/{static → ssr-isr}/lib/native/index.js +0 -17
  87. package/templates/{static → ssr-isr}/lib/native/optimizer.js +0 -17
  88. package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
  89. package/templates/ssr-isr/lib/plugin/loader.js +36 -0
  90. package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
  91. package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
  92. package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
  93. package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
  94. package/templates/ssr-isr/lib/runtime/islands.js +110 -0
  95. package/templates/ssr-isr/lib/runtime/render.js +244 -0
  96. package/templates/ssr-isr/lib/server/api-routes.js +237 -0
  97. package/templates/ssr-isr/lib/server/api.js +108 -0
  98. package/templates/ssr-isr/lib/server/app.js +438 -0
  99. package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
  100. package/templates/ssr-isr/lib/server/ssr.js +202 -0
  101. package/templates/ssr-isr/lib/shared/log.js +64 -0
  102. package/templates/ssr-isr/package.json +23 -0
  103. package/templates/ssr-isr/server.js +128 -0
  104. package/templates/ssr-isr/site/pages/(index).tsx +11 -0
  105. package/templates/ssr-isr/site/styles/global.scss +37 -0
  106. package/templates/ssr-isr/tsconfig.json +39 -0
  107. package/templates/static/build.js +30 -18
  108. package/templates/static/jen.config.ts +0 -18
  109. package/templates/static/jenjs.d.ts +0 -18
  110. package/templates/static/lib/api/(hello).js +0 -17
  111. package/templates/static/lib/api/examples/files/[...slug].js +22 -0
  112. package/templates/static/lib/api/examples/hello.js +11 -0
  113. package/templates/static/lib/api/examples/posts/[id].js +37 -0
  114. package/templates/static/lib/api/examples/posts.js +37 -0
  115. package/templates/static/lib/api/examples/search.js +23 -0
  116. package/templates/static/lib/api/index.js +41 -0
  117. package/templates/static/lib/api/loader.js +234 -0
  118. package/templates/static/lib/api/router.js +259 -0
  119. package/templates/static/lib/assets/types.js +1 -0
  120. package/templates/static/lib/auth/cookie-utils.js +3 -16
  121. package/templates/static/lib/auth/index.js +0 -17
  122. package/templates/static/lib/auth/jwt.js +0 -17
  123. package/templates/static/lib/auth/session.js +0 -17
  124. package/templates/static/lib/build/asset-hashing.js +44 -36
  125. package/templates/static/lib/build/asset-manifest.js +16 -33
  126. package/templates/static/lib/build/build.js +270 -125
  127. package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
  128. package/templates/static/lib/build/bundle-analyzer.js +945 -0
  129. package/templates/static/lib/build/code-splitter.js +194 -0
  130. package/templates/static/lib/build/feature-analyzer.js +190 -0
  131. package/templates/static/lib/build/feature-gate.js +257 -0
  132. package/templates/static/lib/build/island-hydration.js +17 -35
  133. package/templates/static/lib/build/lazy-loader.js +322 -0
  134. package/templates/static/lib/build/minifier.js +40 -59
  135. package/templates/static/lib/build/page-renderer.js +23 -40
  136. package/templates/static/lib/build/production-build.js +9 -26
  137. package/templates/static/lib/build/rust-hashing.js +71 -0
  138. package/templates/static/lib/build/script-optimizer.js +285 -0
  139. package/templates/static/lib/build/ssg-pipeline.js +100 -106
  140. package/templates/static/lib/build/vercel-output.js +298 -0
  141. package/templates/static/lib/build-tools/build-site.js +0 -17
  142. package/templates/static/lib/cache/index.js +0 -17
  143. package/templates/static/lib/cache/memory.js +0 -17
  144. package/templates/static/lib/cache/redis.js +0 -17
  145. package/templates/static/lib/cli/banner.js +0 -17
  146. package/templates/static/lib/cli/templates/ssg/jen.config.js +0 -17
  147. package/templates/static/lib/cli/templates/ssr/jen.config.js +0 -17
  148. package/templates/static/lib/client/Image.js +42 -0
  149. package/templates/static/lib/client/Link.js +190 -0
  150. package/templates/static/lib/client/PWA.js +46 -0
  151. package/templates/static/lib/client/Seo.js +97 -0
  152. package/templates/static/lib/client/index.js +9 -0
  153. package/templates/static/lib/client/useNavigation.js +25 -0
  154. package/templates/static/lib/client/useRouter.js +64 -0
  155. package/templates/static/lib/client-routing/Link.js +17 -0
  156. package/templates/static/lib/client-routing/index.js +19 -0
  157. package/templates/static/lib/client-routing/router.js +151 -0
  158. package/templates/static/lib/client-routing/signal.js +147 -0
  159. package/templates/static/lib/compilers/esbuild-plugins.js +0 -17
  160. package/templates/static/lib/compilers/svelte.js +0 -17
  161. package/templates/static/lib/compilers/vue.js +0 -17
  162. package/templates/static/lib/core/config.js +0 -17
  163. package/templates/static/lib/core/feature-guard.js +136 -0
  164. package/templates/static/lib/core/features.js +99 -0
  165. package/templates/static/lib/core/http.js +0 -17
  166. package/templates/static/lib/core/layouts/index.js +10 -0
  167. package/templates/static/lib/core/layouts/render.js +158 -0
  168. package/templates/static/lib/core/layouts/scan.js +112 -0
  169. package/templates/static/lib/core/layouts/types.js +1 -0
  170. package/templates/static/lib/core/lifecycle.js +129 -0
  171. package/templates/static/lib/core/loader-schema.js +81 -0
  172. package/templates/static/lib/core/middleware-hooks.js +0 -17
  173. package/templates/static/lib/core/paths.js +0 -17
  174. package/templates/static/lib/core/routes/advanced.js +114 -0
  175. package/templates/static/lib/core/routes/handlers.js +181 -0
  176. package/templates/static/lib/core/routes/match.js +89 -17
  177. package/templates/static/lib/core/routes/orchestrator.js +171 -0
  178. package/templates/static/lib/core/routes/rendering-config.js +131 -0
  179. package/templates/static/lib/core/routes/scan.js +0 -17
  180. package/templates/static/lib/core/types.js +0 -17
  181. package/templates/static/lib/css/compiler.js +1 -18
  182. package/templates/static/lib/data-fetching/cache.js +223 -0
  183. package/templates/static/lib/data-fetching/client.js +202 -0
  184. package/templates/static/lib/data-fetching/feature-guard.js +29 -0
  185. package/templates/static/lib/data-fetching/graphql.js +265 -0
  186. package/templates/static/lib/data-fetching/index.js +57 -0
  187. package/templates/static/lib/data-fetching/rest.js +256 -0
  188. package/templates/static/lib/data-fetching/server.js +182 -0
  189. package/templates/static/lib/data-fetching/types.js +5 -0
  190. package/templates/static/lib/db/connector.js +0 -17
  191. package/templates/static/lib/db/drivers/jdb.js +0 -17
  192. package/templates/static/lib/db/drivers/sql.js +0 -17
  193. package/templates/static/lib/db/index.js +0 -17
  194. package/templates/static/lib/db/types.js +0 -17
  195. package/templates/static/lib/devtools/component-tree.js +106 -0
  196. package/templates/static/lib/devtools/devtools.js +638 -0
  197. package/templates/static/lib/devtools/event-bus.js +29 -0
  198. package/templates/static/lib/devtools/event-logger.js +67 -0
  199. package/templates/static/lib/devtools/index.js +9 -0
  200. package/templates/static/lib/devtools/integration.js +149 -0
  201. package/templates/static/lib/devtools/performance.js +84 -0
  202. package/templates/static/lib/devtools/persistence.js +57 -0
  203. package/templates/static/lib/devtools/plugins.js +97 -0
  204. package/templates/static/lib/devtools/search.js +89 -0
  205. package/templates/static/lib/devtools/ui.js +769 -0
  206. package/templates/static/lib/features/api/handler.js +10 -0
  207. package/templates/static/lib/features/api/index.js +5 -0
  208. package/templates/static/lib/features/api/types.js +4 -0
  209. package/templates/static/lib/features/middleware/compiled.js +7 -0
  210. package/templates/static/lib/features/middleware/index.js +5 -0
  211. package/templates/static/lib/features/middleware/types.js +4 -0
  212. package/templates/static/lib/fonts/index.js +46 -0
  213. package/templates/static/lib/fonts/inject.js +125 -0
  214. package/templates/static/lib/fonts/loader.js +196 -0
  215. package/templates/static/lib/fonts/types.js +1 -0
  216. package/templates/static/lib/graphql/index.js +1 -18
  217. package/templates/static/lib/graphql/resolvers.js +20 -13
  218. package/templates/static/lib/graphql/schema.js +0 -17
  219. package/templates/static/lib/i18n/index.js +7 -19
  220. package/templates/static/lib/import/jen-import.js +1 -18
  221. package/templates/static/lib/index.js +79 -125
  222. package/templates/static/lib/jdb/engine.js +0 -17
  223. package/templates/static/lib/jdb/index.js +1 -18
  224. package/templates/static/lib/jdb/types.js +0 -17
  225. package/templates/static/lib/jdb/utils.js +0 -17
  226. package/templates/static/lib/middleware/builtins/cors.js +3 -16
  227. package/templates/static/lib/middleware/context.js +0 -17
  228. package/templates/static/lib/middleware/kernel.js +117 -25
  229. package/templates/static/lib/middleware/pipeline.js +0 -17
  230. package/templates/static/lib/middleware/registry.js +0 -17
  231. package/templates/static/lib/middleware/response.js +0 -17
  232. package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
  233. package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
  234. package/templates/static/lib/plugin/loader.js +0 -17
  235. package/templates/static/lib/plugin/plugin-manager.js +177 -0
  236. package/templates/static/lib/plugin/types.js +28 -0
  237. package/templates/static/lib/runtime/client-runtime.js +0 -17
  238. package/templates/static/lib/runtime/hmr.js +0 -17
  239. package/templates/static/lib/runtime/hydrate.js +0 -17
  240. package/templates/static/lib/runtime/island-hydration-client.js +0 -17
  241. package/templates/static/lib/runtime/islands.js +0 -17
  242. package/templates/static/lib/runtime/render.js +208 -50
  243. package/templates/static/lib/security/security-config.js +60 -0
  244. package/templates/static/lib/security/security-middleware.js +229 -0
  245. package/templates/static/lib/server/api-routes.js +153 -43
  246. package/templates/static/lib/server/api.js +0 -17
  247. package/templates/static/lib/server/app.js +539 -223
  248. package/templates/static/lib/server/isr.js +365 -0
  249. package/templates/static/lib/server/runtimeServe.js +31 -24
  250. package/templates/static/lib/server/ssr.js +98 -22
  251. package/templates/static/lib/server-actions/handler.js +180 -0
  252. package/templates/static/lib/server-actions/index.js +19 -0
  253. package/templates/static/lib/server-actions/middleware.js +146 -0
  254. package/templates/static/lib/server-actions/scan.js +152 -0
  255. package/templates/static/lib/server-actions/types.js +1 -0
  256. package/templates/static/lib/server-actions/validators.js +156 -0
  257. package/templates/static/lib/shared/log.js +19 -20
  258. package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
  259. package/templates/static/lib/telemetry/api/validator.js +67 -0
  260. package/templates/static/lib/telemetry/client.js +121 -0
  261. package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
  262. package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
  263. package/templates/static/lib/vendor/glob/glob.js +4766 -0
  264. package/templates/static/lib/vendor/preact/LICENSE +21 -0
  265. package/templates/static/lib/vendor/preact/preact.module.js +797 -0
  266. package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
  267. package/templates/static/package.json +4 -0
  268. package/templates/static/server.js +22 -22
  269. package/templates/static/site/(home).tsx +0 -18
  270. package/templates/static/tsconfig.json +5 -1
  271. package/templates/static/.esbuild/jen.config.js +0 -19
  272. package/templates/static/lib/build/asset-hashing.d.ts +0 -10
  273. package/templates/static/lib/build/asset-manifest.d.ts +0 -11
  274. package/templates/static/lib/build/minifier.d.ts +0 -20
  275. package/templates/static/lib/build/page-renderer.d.ts +0 -17
  276. package/templates/static/lib/build/production-build.d.ts +0 -10
  277. package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
  278. package/templates/static/lib/middleware/errors/http-error.js +0 -27
  279. package/templates/static/lib/middleware/types.js +0 -18
  280. package/templates/static/lib/middleware/utils/matcher.js +0 -30
  281. package/templates/static/lib/native/style-compiler.js +0 -36
  282. /package/templates/{static → ssr-isr}/lib/api/(hello).d.ts +0 -0
  283. /package/templates/{static → ssr-isr}/lib/auth/cookie-utils.d.ts +0 -0
  284. /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
  285. /package/templates/{static → ssr-isr}/lib/auth/jwt.d.ts +0 -0
  286. /package/templates/{static → ssr-isr}/lib/auth/session.d.ts +0 -0
  287. /package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +0 -0
  288. /package/templates/{static → ssr-isr}/lib/cache/index.d.ts +0 -0
  289. /package/templates/{static → ssr-isr}/lib/cache/memory.d.ts +0 -0
  290. /package/templates/{static → ssr-isr}/lib/cache/redis.d.ts +0 -0
  291. /package/templates/{static → ssr-isr}/lib/cli/banner.d.ts +0 -0
  292. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
  293. /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
  294. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
  295. /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
  296. /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
  297. /package/templates/{static → ssr-isr}/lib/compilers/svelte.d.ts +0 -0
  298. /package/templates/{static → ssr-isr}/lib/compilers/vue.d.ts +0 -0
  299. /package/templates/{static → ssr-isr}/lib/core/config.d.ts +0 -0
  300. /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
  301. /package/templates/{static → ssr-isr}/lib/core/http.d.ts +0 -0
  302. /package/templates/{static → ssr-isr}/lib/core/middleware-hooks.d.ts +0 -0
  303. /package/templates/{static → ssr-isr}/lib/core/paths.d.ts +0 -0
  304. /package/templates/{static → ssr-isr}/lib/core/routes/match.d.ts +0 -0
  305. /package/templates/{static → ssr-isr}/lib/core/routes/scan.d.ts +0 -0
  306. /package/templates/{static → ssr-isr}/lib/core/types.d.ts +0 -0
  307. /package/templates/{static → ssr-isr}/lib/css/compiler.d.ts +0 -0
  308. /package/templates/{static → ssr-isr}/lib/db/connector.d.ts +0 -0
  309. /package/templates/{static → ssr-isr}/lib/db/drivers/jdb.d.ts +0 -0
  310. /package/templates/{static → ssr-isr}/lib/db/drivers/sql.d.ts +0 -0
  311. /package/templates/{static → ssr-isr}/lib/db/index.d.ts +0 -0
  312. /package/templates/{static → ssr-isr}/lib/db/types.d.ts +0 -0
  313. /package/templates/{static → ssr-isr}/lib/graphql/index.d.ts +0 -0
  314. /package/templates/{static → ssr-isr}/lib/graphql/resolvers.d.ts +0 -0
  315. /package/templates/{static → ssr-isr}/lib/graphql/schema.d.ts +0 -0
  316. /package/templates/{static → ssr-isr}/lib/i18n/index.d.ts +0 -0
  317. /package/templates/{static → ssr-isr}/lib/import/jen-import.d.ts +0 -0
  318. /package/templates/{static → ssr-isr}/lib/index.d.ts +0 -0
  319. /package/templates/{static → ssr-isr}/lib/jdb/engine.d.ts +0 -0
  320. /package/templates/{static → ssr-isr}/lib/jdb/index.d.ts +0 -0
  321. /package/templates/{static → ssr-isr}/lib/jdb/types.d.ts +0 -0
  322. /package/templates/{static → ssr-isr}/lib/jdb/utils.d.ts +0 -0
  323. /package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.d.ts +0 -0
  324. /package/templates/{static → ssr-isr}/lib/middleware/builtins/cors.d.ts +0 -0
  325. /package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.d.ts +0 -0
  326. /package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.d.ts +0 -0
  327. /package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.d.ts +0 -0
  328. /package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.d.ts +0 -0
  329. /package/templates/{static → ssr-isr}/lib/middleware/context.d.ts +0 -0
  330. /package/templates/{static → ssr-isr}/lib/middleware/decorators.d.ts +0 -0
  331. /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
  332. /package/templates/{static → ssr-isr}/lib/middleware/errors/http-error.d.ts +0 -0
  333. /package/templates/{static → ssr-isr}/lib/middleware/kernel.d.ts +0 -0
  334. /package/templates/{static → ssr-isr}/lib/middleware/pipeline.d.ts +0 -0
  335. /package/templates/{static → ssr-isr}/lib/middleware/registry.d.ts +0 -0
  336. /package/templates/{static → ssr-isr}/lib/middleware/response.d.ts +0 -0
  337. /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
  338. /package/templates/{static → ssr-isr}/lib/native/bundle.d.ts +0 -0
  339. /package/templates/{static → ssr-isr}/lib/native/dev-server.d.ts +0 -0
  340. /package/templates/{static → ssr-isr}/lib/native/index.d.ts +0 -0
  341. /package/templates/{static → ssr-isr}/lib/native/optimizer.d.ts +0 -0
  342. /package/templates/{static → ssr-isr}/lib/native/style-compiler.d.ts +0 -0
  343. /package/templates/{static → ssr-isr}/lib/plugin/loader.d.ts +0 -0
  344. /package/templates/{static → ssr-isr}/lib/runtime/client-runtime.d.ts +0 -0
  345. /package/templates/{static → ssr-isr}/lib/runtime/hmr.d.ts +0 -0
  346. /package/templates/{static → ssr-isr}/lib/runtime/hydrate.d.ts +0 -0
  347. /package/templates/{static → ssr-isr}/lib/runtime/island-hydration-client.d.ts +0 -0
  348. /package/templates/{static → ssr-isr}/lib/runtime/islands.d.ts +0 -0
  349. /package/templates/{static → ssr-isr}/lib/runtime/render.d.ts +0 -0
  350. /package/templates/{static → ssr-isr}/lib/server/api-routes.d.ts +0 -0
  351. /package/templates/{static → ssr-isr}/lib/server/api.d.ts +0 -0
  352. /package/templates/{static → ssr-isr}/lib/server/app.d.ts +0 -0
  353. /package/templates/{static → ssr-isr}/lib/server/runtimeServe.d.ts +0 -0
  354. /package/templates/{static → ssr-isr}/lib/server/ssr.d.ts +0 -0
  355. /package/templates/{static → ssr-isr}/lib/shared/log.d.ts +0 -0
@@ -1,62 +1,44 @@
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
  * Creates an empty island registry for a request
20
3
  */
21
4
  export function createIslandRegistry() {
22
- return { islands: [] };
5
+ return { islands: [] };
23
6
  }
24
7
  /**
25
8
  * Mark a component as an island (placeholder implementation)
26
9
  * In a real framework, this would be a decorator or a HOC
27
10
  */
28
11
  export function markIsland(name, props) {
29
- const id = `island-${Math.random().toString(36).slice(2, 9)}`;
30
- return `<div data-island="${name}" data-props='${JSON.stringify(props)}' id="${id}"></div>`;
12
+ const id = `island-${Math.random().toString(36).slice(2, 9)}`;
13
+ return `<div data-island="${name}" data-props='${JSON.stringify(props)}' id="${id}"></div>`;
31
14
  }
32
15
  /**
33
16
  * Extract islands from HTML string
34
17
  */
35
18
  export function extractIslandsFromHtml(html) {
36
- const islands = [];
37
- const regex = /data-island="([^"]+)" data-props='([^']+)' id="([^"]+)"/g;
38
- let match;
39
- while ((match = regex.exec(html)) !== null) {
40
- islands.push({
41
- component: match[1],
42
- props: JSON.parse(match[2]),
43
- id: match[3],
44
- });
45
- }
46
- return islands;
19
+ const islands = [];
20
+ const regex = /data-island="([^"]+)" data-props='([^']+)' id="([^"]+)"/g;
21
+ let match;
22
+ while ((match = regex.exec(html)) !== null) {
23
+ islands.push({
24
+ component: match[1],
25
+ props: JSON.parse(match[2]),
26
+ id: match[3],
27
+ });
28
+ }
29
+ return islands;
47
30
  }
48
31
  /**
49
32
  * Inject hydration script into HTML
50
33
  */
51
34
  export function injectIslandScript(html, islands) {
52
- if (islands.length === 0)
53
- return html;
54
- const script = `
35
+ if (islands.length === 0) return html;
36
+ const script = `
55
37
  <script type="module">
56
38
  import { hydrate } from '/__runtime/hydrate.js';
57
39
  const islands = ${JSON.stringify(islands)};
58
40
  islands.forEach(i => hydrate(i.component, i.id, i.props));
59
41
  </script>
60
42
  `;
61
- return html.replace("</body>", `${script}</body>`);
43
+ return html.replace("</body>", `${script}</body>`);
62
44
  }
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Lazy-loading manager for dynamic imports
3
+ *
4
+ * Detects and manages lazy-loaded modules:
5
+ * - Identifies dynamic imports and code-split boundaries
6
+ * - Generates lazy-loading metadata
7
+ * - Creates runtime helpers for loading
8
+ * - Implements prefetching/preloading strategies
9
+ */
10
+ export class LazyLoader {
11
+ modules = new Map();
12
+ manifest;
13
+ constructor(strategy = "lazy") {
14
+ this.manifest = {
15
+ modules: [],
16
+ loadingStrategy: strategy,
17
+ prefetch: strategy !== "eager",
18
+ preload: strategy === "progressive",
19
+ };
20
+ }
21
+ /**
22
+ * Register a lazy-loaded module
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * lazyLoader.register({
27
+ * id: "dashboard",
28
+ * name: "Dashboard",
29
+ * path: "src/pages/dashboard.tsx",
30
+ * chunkName: "dashboard",
31
+ * condition: "route === 'dashboard'"
32
+ * });
33
+ * ```
34
+ */
35
+ register(module) {
36
+ this.modules.set(module.id, module);
37
+ this.manifest.modules.push(module);
38
+ }
39
+ /**
40
+ * Detect lazy-loaded modules from source code
41
+ *
42
+ * Patterns detected:
43
+ * - import() dynamic imports
44
+ * - React.lazy() components
45
+ * - Preact lazy() components
46
+ * - @lazy-load comments
47
+ */
48
+ detectFromSource(source) {
49
+ const detected = [];
50
+ const patterns = {
51
+ // import("./path") or import('./path')
52
+ dynamicImport: /import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g,
53
+ // @lazy-load:"name"
54
+ lazyComment: /@lazy-load:\s*"([^"]+)"/g,
55
+ // React.lazy(() => import(...))
56
+ reactLazy:
57
+ /React\.lazy\s*\(\s*\(\)\s*=>\s*import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)\s*\)/g,
58
+ };
59
+ // Detect dynamic imports
60
+ let match;
61
+ const importRegex = patterns.dynamicImport;
62
+ while ((match = importRegex.exec(source)) !== null) {
63
+ const path = match[1];
64
+ detected.push({
65
+ id: path.replace(/[./]/g, "-"),
66
+ name: path.split("/").pop() || "unknown",
67
+ path,
68
+ chunkName:
69
+ path
70
+ .split("/")
71
+ .pop()
72
+ ?.replace(/\.[jt]sx?$/, "") || "chunk",
73
+ });
74
+ }
75
+ // Detect lazy-load comments
76
+ const commentRegex = patterns.lazyComment;
77
+ while ((match = commentRegex.exec(source)) !== null) {
78
+ const name = match[1];
79
+ detected.push({
80
+ id: name,
81
+ name,
82
+ path: name,
83
+ chunkName: name,
84
+ });
85
+ }
86
+ return detected;
87
+ }
88
+ /**
89
+ * Generate runtime lazy-loading helper code
90
+ */
91
+ generateRuntimeHelper() {
92
+ return `
93
+ /**
94
+ * Auto-generated lazy-loading runtime helper
95
+ * Manages dynamic imports with caching and error handling
96
+ */
97
+
98
+ // Cache for loaded modules
99
+ const lazyCache = new Map();
100
+
101
+ /**
102
+ * Load a lazy module by ID
103
+ * Returns cached module if already loaded
104
+ * Implements exponential backoff for failed loads
105
+ */
106
+ export async function loadLazy(moduleId, moduleSpec) {
107
+ if (lazyCache.has(moduleId)) {
108
+ return lazyCache.get(moduleId);
109
+ }
110
+
111
+ let retries = 0;
112
+ const maxRetries = 3;
113
+ let lastError;
114
+
115
+ while (retries < maxRetries) {
116
+ try {
117
+ const module = await import(moduleSpec);
118
+ lazyCache.set(moduleId, module);
119
+ return module;
120
+ } catch (err) {
121
+ lastError = err;
122
+ retries++;
123
+ if (retries < maxRetries) {
124
+ // Exponential backoff: 100ms, 200ms, 400ms
125
+ await new Promise(r => setTimeout(r, 100 * Math.pow(2, retries - 1)));
126
+ }
127
+ }
128
+ }
129
+
130
+ console.error(\`Failed to load module \${moduleId}:\`, lastError);
131
+ throw lastError;
132
+ }
133
+
134
+ /**
135
+ * Prefetch a lazy module
136
+ * Useful for anticipated navigation or user interactions
137
+ */
138
+ export function prefetchLazy(moduleId, moduleSpec) {
139
+ if (typeof window === 'undefined') return; // Server-side, skip
140
+
141
+ const link = document.createElement('link');
142
+ link.rel = 'prefetch';
143
+ link.as = 'script';
144
+ link.href = moduleSpec;
145
+ document.head.appendChild(link);
146
+
147
+ // Also start loading in background
148
+ loadLazy(moduleId, moduleSpec).catch(err => {
149
+ console.warn(\`Prefetch for \${moduleId} failed:\`, err);
150
+ });
151
+ }
152
+
153
+ /**
154
+ * Preload a lazy module immediately
155
+ * Used for critical lazy modules needed soon
156
+ */
157
+ export function preloadLazy(moduleId, moduleSpec) {
158
+ if (typeof window === 'undefined') return; // Server-side, skip
159
+
160
+ const link = document.createElement('link');
161
+ link.rel = 'preload';
162
+ link.as = 'script';
163
+ link.href = moduleSpec;
164
+ document.head.appendChild(link);
165
+
166
+ return loadLazy(moduleId, moduleSpec);
167
+ }
168
+
169
+ /**
170
+ * Get lazy loading manifest
171
+ */
172
+ export function getLazyManifest() {
173
+ return ${JSON.stringify(this.manifest, null, 2)};
174
+ }
175
+ `;
176
+ }
177
+ /**
178
+ * Generate lazy-loading manifest JSON
179
+ */
180
+ getManifest() {
181
+ return {
182
+ ...this.manifest,
183
+ modules: Array.from(this.modules.values()),
184
+ };
185
+ }
186
+ /**
187
+ * Generate HTML script tags for lazy-loaded modules
188
+ */
189
+ generateLazyScriptTags() {
190
+ let html = `<!-- Lazy-loaded module hints -->\n`;
191
+ for (const module of this.modules.values()) {
192
+ if (this.manifest.prefetch) {
193
+ html += `<link rel="prefetch" as="script" href="/${module.chunkName}.js">\n`;
194
+ }
195
+ if (this.manifest.preload) {
196
+ html += `<link rel="preload" as="script" href="/${module.chunkName}.js">\n`;
197
+ }
198
+ }
199
+ return html;
200
+ }
201
+ /**
202
+ * Generate Intersection Observer helper for visible-load pattern
203
+ *
204
+ * Lazy-loads components when they become visible in viewport
205
+ * Useful for components below the fold
206
+ */
207
+ generateVisibleLoadHelper() {
208
+ return `
209
+ /**
210
+ * Load component when element becomes visible
211
+ * Useful for below-the-fold content
212
+ */
213
+ export function loadWhenVisible(elementId, moduleId, moduleSpec) {
214
+ if (typeof window === 'undefined') return;
215
+ if (typeof IntersectionObserver === 'undefined') {
216
+ // Fallback: load immediately if IntersectionObserver not available
217
+ return loadLazy(moduleId, moduleSpec);
218
+ }
219
+
220
+ const element = document.getElementById(elementId);
221
+ if (!element) return;
222
+
223
+ const observer = new IntersectionObserver((entries) => {
224
+ for (const entry of entries) {
225
+ if (entry.isIntersecting) {
226
+ observer.unobserve(entry.target);
227
+ loadLazy(moduleId, moduleSpec);
228
+ }
229
+ }
230
+ });
231
+
232
+ observer.observe(element);
233
+ }
234
+
235
+ /**
236
+ * Load component on user interaction
237
+ * Examples: hover, focus, click
238
+ */
239
+ export function loadOnInteraction(elementId, moduleId, moduleSpec, events = ['mouseover', 'focus', 'click']) {
240
+ if (typeof window === 'undefined') return;
241
+
242
+ const element = document.getElementById(elementId);
243
+ if (!element) return;
244
+
245
+ const listener = () => {
246
+ for (const event of events) {
247
+ element.removeEventListener(event, listener);
248
+ }
249
+ loadLazy(moduleId, moduleSpec);
250
+ };
251
+
252
+ for (const event of events) {
253
+ element.addEventListener(event, listener, { once: true });
254
+ }
255
+ }
256
+ `;
257
+ }
258
+ /**
259
+ * Generate loading state component for Preact
260
+ */
261
+ generateLoadingComponent() {
262
+ return `
263
+ /**
264
+ * Loading component for lazy-loaded modules
265
+ * Shows while module is loading
266
+ */
267
+ import { h } from 'preact';
268
+
269
+ export function LazyLoading() {
270
+ return h('div', { class: 'lazy-loading' },
271
+ h('div', { class: 'spinner' }),
272
+ h('p', null, 'Loading...')
273
+ );
274
+ }
275
+
276
+ export function LazyError({ error, retry }) {
277
+ return h('div', { class: 'lazy-error' },
278
+ h('p', null, 'Failed to load component'),
279
+ h('pre', null, error?.message),
280
+ h('button', { onClick: retry }, 'Retry')
281
+ );
282
+ }
283
+
284
+ export function withLazyFallback(Component, LoadingComponent = LazyLoading) {
285
+ return function LazyComponent(props) {
286
+ return h('ErrorBoundary', null,
287
+ h('Suspense', { fallback: h(LoadingComponent) },
288
+ h(Component, props)
289
+ )
290
+ );
291
+ };
292
+ }
293
+ `;
294
+ }
295
+ /**
296
+ * Generate configuration report
297
+ */
298
+ generateReport() {
299
+ let report = "# Lazy-Loading Report\n\n";
300
+ report += "## Configuration\n";
301
+ report += `- Strategy: ${this.manifest.loadingStrategy}\n`;
302
+ report += `- Prefetch: ${this.manifest.prefetch}\n`;
303
+ report += `- Preload: ${this.manifest.preload}\n`;
304
+ report += `- Total modules: ${this.modules.size}\n\n`;
305
+ if (this.modules.size > 0) {
306
+ report += "## Modules\n";
307
+ for (const module of this.modules.values()) {
308
+ report += `- ${module.name} (${module.chunkName})\n`;
309
+ if (module.condition) {
310
+ report += ` Condition: ${module.condition}\n`;
311
+ }
312
+ }
313
+ }
314
+ return report;
315
+ }
316
+ }
317
+ /**
318
+ * Helper: Create lazy loader from config
319
+ */
320
+ export function createLazyLoader(strategy = "lazy") {
321
+ return new LazyLoader(strategy);
322
+ }
@@ -1,65 +1,46 @@
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 * as esbuild from "esbuild";
19
2
  import { log } from "../shared/log.js";
20
3
  export class Minifier {
21
- /**
22
- * Minify JavaScript/TypeScript using esbuild
23
- */
24
- static async minifyJs(code, options = {}) {
25
- try {
26
- const result = await esbuild.transform(code, {
27
- loader: "js",
28
- minify: true,
29
- legalComments: "none",
30
- ...options,
31
- });
32
- return result.code;
33
- }
34
- catch (err) {
35
- log.error("Minification failed (JS)");
36
- throw err;
37
- }
4
+ /**
5
+ * Minify JavaScript/TypeScript using esbuild
6
+ */
7
+ static async minifyJs(code, options = {}) {
8
+ try {
9
+ const result = await esbuild.transform(code, {
10
+ loader: "js",
11
+ minify: true,
12
+ legalComments: "none",
13
+ ...options,
14
+ });
15
+ return result.code;
16
+ } catch (err) {
17
+ log.error("Minification failed (JS)");
18
+ throw err;
38
19
  }
39
- /**
40
- * Minify CSS using esbuild
41
- */
42
- static async minifyCss(code) {
43
- try {
44
- const result = await esbuild.transform(code, {
45
- loader: "css",
46
- minify: true,
47
- });
48
- return result.code;
49
- }
50
- catch (err) {
51
- log.error("Minification failed (CSS)");
52
- throw err;
53
- }
54
- }
55
- /**
56
- * Minify HTML (basic regex/string-based, as esbuild doesn't handle HTML)
57
- */
58
- static minifyHtml(html) {
59
- return html
60
- .replace(/<!--[\s\S]*?-->/g, "") // Remove comments
61
- .replace(/>\s+</g, "><") // Remove whitespace between tags
62
- .replace(/\s{2,}/g, " ") // Collapse multiple whitespaces
63
- .trim();
20
+ }
21
+ /**
22
+ * Minify CSS using esbuild
23
+ */
24
+ static async minifyCss(code) {
25
+ try {
26
+ const result = await esbuild.transform(code, {
27
+ loader: "css",
28
+ minify: true,
29
+ });
30
+ return result.code;
31
+ } catch (err) {
32
+ log.error("Minification failed (CSS)");
33
+ throw err;
64
34
  }
35
+ }
36
+ /**
37
+ * Minify HTML (basic regex/string-based, as esbuild doesn't handle HTML)
38
+ */
39
+ static minifyHtml(html) {
40
+ return html
41
+ .replace(/<!--[\s\S]*?-->/g, "") // Remove comments
42
+ .replace(/>\s+</g, "><") // Remove whitespace between tags
43
+ .replace(/\s{2,}/g, " ") // Collapse multiple whitespaces
44
+ .trim();
45
+ }
65
46
  }
@@ -1,45 +1,28 @@
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 { renderRouteToHtml } from "../runtime/render.js";
19
2
  import { Minifier } from "./minifier.js";
20
3
  export class PageRenderer {
21
- /**
22
- * Render a route to a full HTML string, including minification if requested
23
- */
24
- static async render(ctx, minify = false) {
25
- // 1. Core Preact render
26
- let html = await renderRouteToHtml({
27
- config: ctx.config,
28
- route: ctx.route,
29
- req: {},
30
- res: {},
31
- url: ctx.url,
32
- params: ctx.params,
33
- query: ctx.query,
34
- headers: ctx.headers,
35
- cookies: ctx.cookies,
36
- });
37
- // 2. Post-processing (Layout injection, hydration script injection)
38
- // Note: Hydration logic is handled by island-hydration.ts usually
39
- // 3. Optional Minification
40
- if (minify) {
41
- html = Minifier.minifyHtml(html);
42
- }
43
- return html;
4
+ /**
5
+ * Render a route to a full HTML string, including minification if requested
6
+ */
7
+ static async render(ctx, minify = false) {
8
+ // 1. Core Preact render
9
+ let html = await renderRouteToHtml({
10
+ config: ctx.config,
11
+ route: ctx.route,
12
+ req: {},
13
+ res: {},
14
+ url: ctx.url,
15
+ params: ctx.params,
16
+ query: ctx.query,
17
+ headers: ctx.headers,
18
+ cookies: ctx.cookies,
19
+ });
20
+ // 2. Post-processing (Layout injection, hydration script injection)
21
+ // Note: Hydration logic is handled by island-hydration.ts usually
22
+ // 3. Optional Minification
23
+ if (minify) {
24
+ html = Minifier.minifyHtml(html);
44
25
  }
26
+ return html;
27
+ }
45
28
  }
@@ -1,30 +1,13 @@
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 { SSGPipeline } from "./ssg-pipeline.js";
19
2
  import { log } from "../shared/log.js";
20
3
  export class ProductionBuilder {
21
- /**
22
- * Run the production build sequence
23
- */
24
- static async build(opts) {
25
- log.info("--- PRODUCTION BUILD START ---");
26
- const pipeline = new SSGPipeline(opts.config);
27
- await pipeline.run();
28
- log.info("--- PRODUCTION BUILD COMPLETE ---");
29
- }
4
+ /**
5
+ * Run the production build sequence
6
+ */
7
+ static async build(opts) {
8
+ log.info("--- PRODUCTION BUILD START ---");
9
+ const pipeline = new SSGPipeline(opts.config);
10
+ await pipeline.run();
11
+ log.info("--- PRODUCTION BUILD COMPLETE ---");
12
+ }
30
13
  }
@@ -0,0 +1,71 @@
1
+ import { spawn } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { readdirSync, existsSync } from "node:fs";
4
+ /**
5
+ * High-performance hashing using Rust utility
6
+ */
7
+ export async function hashWithRust(options) {
8
+ return new Promise((resolve, reject) => {
9
+ // Binary is expected in lib/ relative to the project root
10
+ const libDir = join(process.cwd(), "lib");
11
+ if (!existsSync(libDir)) {
12
+ reject(new Error(`Binary directory not found: ${libDir}`));
13
+ return;
14
+ }
15
+ // Look for a file named 'utils' with any extension (e.g. utils.exe, utils.bin, or just utils)
16
+ let binaryName;
17
+ try {
18
+ const files = readdirSync(libDir);
19
+ binaryName = files.find((f) => f === "utils" || f.startsWith("utils."));
20
+ } catch (err) {
21
+ reject(new Error(`Failed to list binary directory: ${err.message}`));
22
+ return;
23
+ }
24
+ if (!binaryName) {
25
+ reject(
26
+ new Error(
27
+ `Could not find 'utils' binary in ${libDir}. Ensure the Rust utility is compiled and placed in lib/.`,
28
+ ),
29
+ );
30
+ return;
31
+ }
32
+ const binaryPath = join(libDir, binaryName);
33
+ const child = spawn(binaryPath, [], {
34
+ stdio: ["pipe", "pipe", "inherit"],
35
+ });
36
+ let stdout = "";
37
+ child.stdout.on("data", (data) => {
38
+ stdout += data.toString();
39
+ });
40
+ child.on("error", (err) => {
41
+ reject(new Error(`Failed to start Rust utility: ${err.message}`));
42
+ });
43
+ child.on("close", (code) => {
44
+ if (code !== 0 && !stdout) {
45
+ reject(new Error(`Rust utility exited with code ${code}`));
46
+ return;
47
+ }
48
+ try {
49
+ const response = JSON.parse(stdout);
50
+ if (response.ok) {
51
+ resolve(response);
52
+ } else {
53
+ reject(
54
+ new Error(response.error || "Unknown error from Rust utility"),
55
+ );
56
+ }
57
+ } catch (e) {
58
+ reject(new Error(`Failed to parse Rust utility output: ${stdout}`));
59
+ }
60
+ });
61
+ // Send command via stdin
62
+ const request = {
63
+ command: "hash",
64
+ path: options.path,
65
+ algorithm: options.algorithm || "sha256",
66
+ hashFileNames: options.hashFileNames || false,
67
+ };
68
+ child.stdin.write(JSON.stringify(request));
69
+ child.stdin.end();
70
+ });
71
+ }