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,194 @@
1
+ /**
2
+ * Intelligent code splitting analyzer
3
+ *
4
+ * Splits bundles into logical chunks:
5
+ * - Vendor: node_modules dependencies (high cache hit rate)
6
+ * - Runtime: Framework runtime/hydration (shared across all pages)
7
+ * - Common: Shared components (used by multiple routes)
8
+ * - Route: Per-route chunks (lazy-loaded on demand)
9
+ * - Entry: Main application bundle
10
+ */
11
+ export class CodeSplitter {
12
+ strategies = [];
13
+ routeAnalysis = new Map();
14
+ constructor() {
15
+ this.initializeDefaultStrategies();
16
+ }
17
+ /**
18
+ * Initialize default splitting strategies in priority order
19
+ */
20
+ initializeDefaultStrategies() {
21
+ // Vendor chunks (highest priority - most stable)
22
+ this.strategies.push({
23
+ name: "vendor",
24
+ test: (path) => {
25
+ return /node_modules/.test(path) && !this.isFrameworkInternal(path);
26
+ },
27
+ priority: 100,
28
+ });
29
+ // Framework runtime (stable, shared across all pages)
30
+ this.strategies.push({
31
+ name: "runtime",
32
+ test: (path) => {
33
+ return (
34
+ this.isFrameworkInternal(path) && /runtime|hydrate|ssr/.test(path)
35
+ );
36
+ },
37
+ priority: 90,
38
+ });
39
+ // Common utilities (shared components)
40
+ this.strategies.push({
41
+ name: "common",
42
+ test: (path) => {
43
+ return /components|utils|helpers/.test(path);
44
+ },
45
+ priority: 80,
46
+ });
47
+ // Route-specific chunks (lazy-loaded)
48
+ this.strategies.push({
49
+ name: "route",
50
+ test: (path) => {
51
+ return /pages|routes|site/.test(path);
52
+ },
53
+ priority: 50,
54
+ });
55
+ }
56
+ /**
57
+ * Determine which chunk a module should belong to
58
+ */
59
+ determineChunk(modulePath) {
60
+ // Sort by priority (descending)
61
+ const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
62
+ for (const strategy of sorted) {
63
+ if (strategy.test(modulePath)) {
64
+ return strategy.name;
65
+ }
66
+ }
67
+ return "entry"; // Default to main entry chunk
68
+ }
69
+ /**
70
+ * Analyze route dependencies for splitting decisions
71
+ *
72
+ * @param routePath Path to route file
73
+ * @param dependencies List of imported module paths
74
+ */
75
+ analyzeRouteDependencies(routePath, dependencies) {
76
+ this.routeAnalysis.set(routePath, dependencies);
77
+ }
78
+ /**
79
+ * Generate esbuild manual chunks configuration
80
+ *
81
+ * Implements intelligent bundling:
82
+ * - Vendor libraries in separate chunk (external dependencies)
83
+ * - Runtime/hydration in separate chunk (framework internals)
84
+ * - Common code in separate chunk (shared components)
85
+ * - Route-specific code in separate chunks (per-route lazy-loading)
86
+ */
87
+ generateManualChunks() {
88
+ const chunks = {};
89
+ // Vendor chunk patterns
90
+ chunks.vendor = [
91
+ "preact",
92
+ "preact/compat",
93
+ "preact/hooks",
94
+ "preact/compat/scheduler",
95
+ "htm",
96
+ ];
97
+ // Runtime chunk patterns
98
+ chunks.runtime = [
99
+ "../runtime/hydrate.js",
100
+ "../runtime/render.js",
101
+ "../runtime/ssr.js",
102
+ ];
103
+ // Common utilities patterns
104
+ chunks.common = [];
105
+ return chunks;
106
+ }
107
+ /**
108
+ * Generate esbuild splitting configuration
109
+ */
110
+ generateSplittingConfig() {
111
+ return {
112
+ splitting: true,
113
+ format: "esm",
114
+ chunkNames: "[name]-[hash]",
115
+ manualChunks: this.generateManualChunks(),
116
+ };
117
+ }
118
+ /**
119
+ * Generate chunk dependency graph for debugging
120
+ *
121
+ * Shows which chunks depend on which others, useful for:
122
+ * - Understanding load order
123
+ * - Optimizing prefetching
124
+ * - Detecting circular dependencies
125
+ */
126
+ generateDependencyGraph() {
127
+ let graph = "# Chunk Dependency Graph\n\n";
128
+ graph += "## Splitting Strategy\n";
129
+ graph += "- **vendor**: External dependencies (preact, utilities)\n";
130
+ graph += "- **runtime**: Framework runtime (hydration, SSR, hooks)\n";
131
+ graph += "- **common**: Shared components and utilities\n";
132
+ graph += "- **route**: Per-route lazy-loaded chunks\n";
133
+ graph += "- **entry**: Main application bundle\n\n";
134
+ graph += "## Load Order\n";
135
+ graph += "1. Entry (main bundle) - executes immediately\n";
136
+ graph += "2. Vendor - loaded on demand, cached long-term\n";
137
+ graph += "3. Runtime - loaded before any route rendering\n";
138
+ graph += "4. Common - loaded when needed by routes\n";
139
+ graph += "5. Route chunks - lazy-loaded per page\n\n";
140
+ graph += "## Cache Strategy\n";
141
+ graph +=
142
+ "- Vendor: `max-age=31536000, immutable` (1 year, never changes)\n";
143
+ graph += "- Runtime: `max-age=2592000` (30 days, updated with framework)\n";
144
+ graph += "- Entry: `max-age=3600` (1 hour, updated frequently)\n";
145
+ graph += "- Routes: `max-age=86400` (1 day, per-route updates)\n\n";
146
+ return graph;
147
+ }
148
+ /**
149
+ * Check if path is internal framework code
150
+ */
151
+ isFrameworkInternal(path) {
152
+ return /@src|src\//.test(path);
153
+ }
154
+ /**
155
+ * Register custom splitting strategy
156
+ */
157
+ registerStrategy(strategy) {
158
+ this.strategies.push(strategy);
159
+ // Re-sort by priority
160
+ this.strategies.sort((a, b) => b.priority - a.priority);
161
+ }
162
+ /**
163
+ * Generate splitting report
164
+ */
165
+ generateReport() {
166
+ let report = "# Code Splitting Report\n\n";
167
+ report += "## Active Strategies\n";
168
+ for (const strategy of this.strategies) {
169
+ report += `- **${strategy.name}** (priority: ${strategy.priority})\n`;
170
+ }
171
+ report += "\n## Route Analysis\n";
172
+ if (this.routeAnalysis.size === 0) {
173
+ report += "No routes analyzed yet.\n";
174
+ } else {
175
+ for (const [route, deps] of this.routeAnalysis) {
176
+ report += `- **${route}**: ${deps.length} dependencies\n`;
177
+ }
178
+ }
179
+ return report;
180
+ }
181
+ }
182
+ /**
183
+ * Helper: Create esbuild configuration for code splitting
184
+ */
185
+ export function createSplitConfig(outdir = "dist") {
186
+ const splitter = new CodeSplitter();
187
+ return {
188
+ ...splitter.generateSplittingConfig(),
189
+ outdir,
190
+ minify: true,
191
+ format: "esm",
192
+ target: "es2022",
193
+ };
194
+ }
@@ -0,0 +1,190 @@
1
+ import {
2
+ resolveFeatures,
3
+ getEnabledFeatures,
4
+ createBuildMetadata,
5
+ } from "../core/features.js";
6
+ /**
7
+ * Build-time feature analyzer.
8
+ * Determines which features are enabled and generates metadata.
9
+ * Used to inform bundling decisions and eliminate unused code.
10
+ */
11
+ export class FeatureAnalyzer {
12
+ config;
13
+ resolved;
14
+ metadata;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.resolved = resolveFeatures(config.features);
18
+ this.metadata = createBuildMetadata(this.resolved, config.features);
19
+ }
20
+ /**
21
+ * Returns resolved feature configuration.
22
+ */
23
+ getResolved() {
24
+ return this.resolved;
25
+ }
26
+ /**
27
+ * Returns build metadata for debugging/introspection.
28
+ */
29
+ getMetadata() {
30
+ return this.metadata;
31
+ }
32
+ /**
33
+ * Checks if a feature is enabled.
34
+ */
35
+ isEnabled(feature) {
36
+ return this.resolved[feature] ?? false;
37
+ }
38
+ /**
39
+ * Gets list of enabled features.
40
+ */
41
+ getEnabled() {
42
+ return getEnabledFeatures(this.resolved);
43
+ }
44
+ /**
45
+ * Generates feature metadata JSON string.
46
+ */
47
+ generateMetadataJson() {
48
+ return JSON.stringify(this.metadata, null, 2);
49
+ }
50
+ /**
51
+ * Generates a feature flag constant object for runtime checks.
52
+ * Can be tree-shaken by bundler for disabled features.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * export const FEATURES = {
57
+ * api: true,
58
+ * middleware: true,
59
+ * cache: false,
60
+ * // ... rest
61
+ * } as const;
62
+ * ```
63
+ */
64
+ generateFeatureFlagsCode() {
65
+ const features = this.resolved;
66
+ const lines = Object.entries(features).map(
67
+ ([name, enabled]) => ` ${name}: ${enabled},`,
68
+ );
69
+ return `
70
+ /**
71
+ * Build-time feature flags.
72
+ * Disabled features are tree-shaken by the bundler.
73
+ */
74
+ export const FEATURES = {
75
+ ${lines.join("\n")}
76
+ } as const;
77
+
78
+ export type EnabledFeatures = {
79
+ ${getEnabledFeatures(this.resolved)
80
+ .map((f) => `${f}: typeof FEATURES.${f}`)
81
+ .join(";\n ")};
82
+ };
83
+ `;
84
+ }
85
+ /**
86
+ * Generates TypeScript definitions for feature-gated code.
87
+ * Enables type-safe access to enabled features only.
88
+ */
89
+ generateTypeDefinitions() {
90
+ const enabled = getEnabledFeatures(this.resolved);
91
+ return `
92
+ /**
93
+ * Auto-generated feature type definitions
94
+ * Features not listed here are disabled and not available at runtime
95
+ */
96
+
97
+ declare global {
98
+ interface FeatureFlags {
99
+ ${enabled.map((f) => `${f}: true;`).join("\n ")}
100
+ }
101
+ }
102
+
103
+ export {};
104
+ `;
105
+ }
106
+ /**
107
+ * Generates a dynamic import guard for feature modules.
108
+ * Prevents importing disabled feature modules.
109
+ */
110
+ generateFeatureGuard(feature) {
111
+ const isEnabled = this.isEnabled(feature);
112
+ return `
113
+ if (!${isEnabled}) {
114
+ throw new Error(
115
+ 'Feature "${feature}" is not enabled. ' +
116
+ 'Enable it in jen.config.ts: features: { ${feature}: true }'
117
+ );
118
+ }
119
+ `;
120
+ }
121
+ /**
122
+ * Generates code to conditionally include feature handlers.
123
+ * Used in server request handlers.
124
+ */
125
+ generateConditionalHandlers() {
126
+ const enabled = getEnabledFeatures(this.resolved);
127
+ let code = `
128
+ // Auto-generated feature handlers
129
+ // Only enabled features are included
130
+
131
+ `;
132
+ if (enabled.includes("api")) {
133
+ code += `
134
+ // API Routes Handler
135
+ import { tryHandleApiRoute } from "../server/api-routes.js";
136
+ `;
137
+ }
138
+ if (enabled.includes("middleware")) {
139
+ code += `
140
+ // Middleware Handler
141
+ import { Kernel } from "../middleware/kernel.js";
142
+ `;
143
+ }
144
+ if (enabled.includes("cache")) {
145
+ code += `
146
+ // Cache Handler
147
+ import { MemoryCache } from "../cache/memory.js";
148
+ `;
149
+ }
150
+ if (enabled.includes("streaming")) {
151
+ code += `
152
+ // Streaming Handler
153
+ import renderToString from "preact-render-to-string";
154
+ `;
155
+ }
156
+ if (enabled.includes("auth")) {
157
+ code += `
158
+ // Auth Handler
159
+ // (to be implemented in future release)
160
+ `;
161
+ }
162
+ return code;
163
+ }
164
+ /**
165
+ * Generates summary report of feature configuration.
166
+ */
167
+ generateReport() {
168
+ const enabled = getEnabledFeatures(this.resolved);
169
+ const disabled = Object.entries(this.resolved)
170
+ .filter(([, e]) => !e)
171
+ .map(([name]) => name);
172
+ return `
173
+ Feature Configuration Report
174
+ =============================
175
+
176
+ Build Time: ${this.metadata.buildTime}
177
+
178
+ Enabled (${enabled.length}):
179
+ ${enabled.length > 0 ? enabled.map((f) => ` ✓ ${f}`).join("\n") : " (none - core only)"}
180
+
181
+ Disabled (${disabled.length}):
182
+ ${disabled.length > 0 ? disabled.map((f) => ` ✗ ${f}`).join("\n") : " (all features enabled)"}
183
+
184
+ Bundle Impact:
185
+ Core modules: Always included
186
+ Enabled features: Included in bundle
187
+ Disabled features: Completely removed (tree-shaken)
188
+ `;
189
+ }
190
+ }
@@ -0,0 +1,257 @@
1
+ import { resolveFeatures, getEnabledFeatures } from "../core/features.js";
2
+ /**
3
+ * Feature gate compiler that generates optimized request handlers based on enabled features.
4
+ * Statically analyzes feature configuration at build time and generates only the necessary code.
5
+ *
6
+ * This approach ensures:
7
+ * 1. Unused features are completely tree-shaken from the bundle
8
+ * 2. No runtime feature detection overhead
9
+ * 3. Type-safe access to enabled features
10
+ * 4. Build-time validation of feature compatibility
11
+ */
12
+ export class FeatureGateCompiler {
13
+ resolved;
14
+ config;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.resolved = resolveFeatures(config.features);
18
+ }
19
+ /**
20
+ * Generates a TypeScript handler file that includes only enabled features.
21
+ * This file is generated at build time and imported by the request handler.
22
+ *
23
+ * @returns Generated TypeScript code as string
24
+ */
25
+ generateHandlerCode() {
26
+ const enabled = getEnabledFeatures(this.resolved);
27
+ const imports = this.generateImports(enabled);
28
+ const middleware = this.generateMiddlewareChain(enabled);
29
+ const handlers = this.generateHandlers(enabled);
30
+ return `
31
+ /*
32
+ * AUTO-GENERATED: This file is generated at build time based on enabled features.
33
+ * DO NOT EDIT MANUALLY - your changes will be overwritten on next build.
34
+ *
35
+ * Enabled features: ${enabled.join(", ") || "none (core only)"}
36
+ */
37
+
38
+ ${imports}
39
+
40
+ /**
41
+ * Build-time compiled request handler with only enabled features.
42
+ * Each feature is statically included or excluded based on configuration.
43
+ */
44
+ export async function handleRequest(req: any, res: any, context: any) {
45
+ ${middleware}
46
+ ${handlers}
47
+ }
48
+
49
+ /**
50
+ * Feature flags for runtime checks (constant-folded at build time).
51
+ * TypeScript will eliminate dead code paths for disabled features.
52
+ */
53
+ export const FEATURES = {
54
+ ${enabled.map((f) => `${f}: true`).join(",\n ")},
55
+ ${Object.entries(this.resolved)
56
+ .filter(([, enabled]) => !enabled)
57
+ .map(([name]) => `${name}: false`)
58
+ .join(",\n ")},
59
+ } as const;
60
+ `;
61
+ }
62
+ /**
63
+ * Generates import statements only for enabled features.
64
+ *
65
+ * @param enabled List of enabled feature names
66
+ * @returns Import statement code
67
+ */
68
+ generateImports(enabled) {
69
+ const imports = [];
70
+ if (enabled.includes("api")) {
71
+ imports.push(
72
+ 'import { handleApiRoutes } from "../features/api/handler.js";',
73
+ );
74
+ }
75
+ if (enabled.includes("middleware")) {
76
+ imports.push(
77
+ 'import { compiledMiddlewareChain } from "../features/middleware/compiled.js";',
78
+ );
79
+ }
80
+ if (enabled.includes("cache")) {
81
+ imports.push(
82
+ 'import { getCachedResponse, setCachedResponse } from "../features/cache/handler.js";',
83
+ );
84
+ }
85
+ if (enabled.includes("streaming")) {
86
+ imports.push(
87
+ 'import { StreamingRenderer } from "../features/streaming/renderer.js";',
88
+ );
89
+ }
90
+ if (enabled.includes("auth")) {
91
+ imports.push(
92
+ 'import { authMiddleware } from "../features/auth/middleware.js";',
93
+ );
94
+ }
95
+ // Always import core
96
+ imports.unshift('import type { RouteHandler } from "../core/types.js";');
97
+ return imports.join("\n");
98
+ }
99
+ /**
100
+ * Generates middleware chain initialization code.
101
+ *
102
+ * @param enabled List of enabled feature names
103
+ * @returns Middleware setup code
104
+ */
105
+ generateMiddlewareChain(enabled) {
106
+ if (!enabled.includes("middleware")) {
107
+ return "// Middleware disabled";
108
+ }
109
+ return `
110
+ // Apply compiled middleware chain (pre-resolved at build time)
111
+ const middlewareResult = await compiledMiddlewareChain(req, res, context);
112
+ if (middlewareResult.handled) return;
113
+ context.middleware = middlewareResult.data;
114
+ `;
115
+ }
116
+ /**
117
+ * Generates request handler logic for enabled features.
118
+ *
119
+ * @param enabled List of enabled feature names
120
+ * @returns Handler code
121
+ */
122
+ generateHandlers(enabled) {
123
+ const handlers = [];
124
+ // Always handle core routing
125
+ handlers.push(`
126
+ // Core routing
127
+ const route = context.routes.get(req.url);
128
+ if (!route) {
129
+ res.statusCode = 404;
130
+ res.end("Not Found");
131
+ return;
132
+ }
133
+ `);
134
+ // API routes
135
+ if (enabled.includes("api")) {
136
+ handlers.push(`
137
+ // Try API routes first
138
+ const apiResult = await handleApiRoutes(req, res, route, context);
139
+ if (apiResult.handled) return;
140
+ `);
141
+ }
142
+ // Caching
143
+ if (enabled.includes("cache")) {
144
+ handlers.push(`
145
+ // Check response cache
146
+ const cached = await getCachedResponse(route, context);
147
+ if (cached) {
148
+ res.setHeader("X-Cache", "HIT");
149
+ res.end(cached);
150
+ return;
151
+ }
152
+ `);
153
+ }
154
+ // SSR rendering
155
+ handlers.push(`
156
+ // Render route
157
+ const component = await import(route.moduleId);
158
+ const data = await component.loader?.(context) ?? {};
159
+ const html = await renderToString(component.default, { data });
160
+ `);
161
+ // Cache response
162
+ if (enabled.includes("cache")) {
163
+ handlers.push(`
164
+ await setCachedResponse(route, html, context);
165
+ `);
166
+ }
167
+ // Stream or buffered response
168
+ if (enabled.includes("streaming")) {
169
+ handlers.push(`
170
+ // Stream response
171
+ const renderer = new StreamingRenderer(res);
172
+ await renderer.sendHead(route.head);
173
+ await renderer.sendBody(html);
174
+ await renderer.sendFooter();
175
+ `);
176
+ } else {
177
+ handlers.push(`
178
+ // Send buffered response
179
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
180
+ res.end(html);
181
+ `);
182
+ }
183
+ return handlers.join("\n");
184
+ }
185
+ /**
186
+ * Generates type definitions for enabled features.
187
+ * Ensures TypeScript knows about enabled/disabled features.
188
+ *
189
+ * @returns TypeScript type definition code
190
+ */
191
+ generateTypeDefinitions() {
192
+ const enabled = getEnabledFeatures(this.resolved);
193
+ return `
194
+ // Auto-generated feature type definitions
195
+ declare global {
196
+ interface FeatureContext {
197
+ api: ${enabled.includes("api") ? "ApiFeature" : "never"};
198
+ middleware: ${enabled.includes("middleware") ? "MiddlewareFeature" : "never"};
199
+ cache: ${enabled.includes("cache") ? "CacheFeature" : "never"};
200
+ streaming: ${enabled.includes("streaming") ? "StreamingFeature" : "never"};
201
+ auth: ${enabled.includes("auth") ? "AuthFeature" : "never"};
202
+ }
203
+ }
204
+
205
+ export {};
206
+ `;
207
+ }
208
+ /**
209
+ * Generates build metadata for debugging and introspection.
210
+ *
211
+ * @returns Metadata as JSON string
212
+ */
213
+ generateMetadata() {
214
+ return JSON.stringify(
215
+ {
216
+ buildTime: new Date().toISOString(),
217
+ enabledFeatures: getEnabledFeatures(this.resolved),
218
+ disabledFeatures: Object.entries(this.resolved)
219
+ .filter(([, enabled]) => !enabled)
220
+ .map(([name]) => name),
221
+ config: this.config.features,
222
+ },
223
+ null,
224
+ 2,
225
+ );
226
+ }
227
+ }
228
+ /**
229
+ * Creates an esbuild plugin that generates feature-gated code during build.
230
+ *
231
+ * @param config Framework configuration
232
+ * @returns esbuild plugin object
233
+ */
234
+ export function featureGatePlugin(config) {
235
+ const compiler = new FeatureGateCompiler(config);
236
+ return {
237
+ name: "feature-gate",
238
+ resolveId(id) {
239
+ if (id === "virtual-feature-handler") {
240
+ return id;
241
+ }
242
+ if (id === "virtual-feature-metadata") {
243
+ return id;
244
+ }
245
+ return null;
246
+ },
247
+ load(id) {
248
+ if (id === "virtual-feature-handler") {
249
+ return compiler.generateHandlerCode();
250
+ }
251
+ if (id === "virtual-feature-metadata") {
252
+ return `export default ${compiler.generateMetadata()}`;
253
+ }
254
+ return null;
255
+ },
256
+ };
257
+ }