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,638 @@
1
+ /**
2
+ * Jen.js DevTools - A comprehensive development tools panel for debugging Jen.js applications
3
+ * Provides real-time component inspection, state/props editing, event logging, and performance monitoring
4
+ */
5
+ import { getHTML } from "./ui.js";
6
+ import { createEventBus } from "./event-bus.js";
7
+ import { PersistenceManager } from "./persistence.js";
8
+ import { PluginSystem } from "./plugins.js";
9
+ import { ComponentTreeManager } from "./component-tree.js";
10
+ import { EventLogger } from "./event-logger.js";
11
+ import { PerformanceMonitor } from "./performance.js";
12
+ import { SearchManager } from "./search.js";
13
+ export class DevTools {
14
+ eventBus;
15
+ persistence;
16
+ pluginSystem;
17
+ componentTree;
18
+ eventLogger;
19
+ performanceMonitor;
20
+ searchManager;
21
+ config;
22
+ isOpen = false;
23
+ panel = null;
24
+ selectedComponent = null;
25
+ theme = "dark";
26
+ constructor(config) {
27
+ this.eventBus = createEventBus();
28
+ this.persistence = new PersistenceManager();
29
+ this.pluginSystem = new PluginSystem(this.eventBus);
30
+ this.componentTree = new ComponentTreeManager(this.eventBus);
31
+ this.eventLogger = new EventLogger();
32
+ this.performanceMonitor = new PerformanceMonitor();
33
+ this.searchManager = new SearchManager(this.componentTree);
34
+ this.config = this.initializeConfig(config);
35
+ if (this.config.enabled) {
36
+ this.setup();
37
+ }
38
+ }
39
+ initializeConfig(userConfig) {
40
+ const saved = this.persistence.loadConfig();
41
+ const defaults = {
42
+ enabled: true,
43
+ theme: "dark",
44
+ position: { x: 20, y: 20 },
45
+ size: { width: 800, height: 600 },
46
+ minimized: false,
47
+ collapsedTabs: {},
48
+ };
49
+ return {
50
+ ...defaults,
51
+ ...saved,
52
+ ...userConfig,
53
+ };
54
+ }
55
+ setup() {
56
+ this.registerHotkeys();
57
+ this.setupInterceptors();
58
+ this.injectPanel();
59
+ this.attachEventListeners();
60
+ }
61
+ registerHotkeys() {
62
+ document.addEventListener("keydown", (e) => {
63
+ // Ctrl+Shift+J or Cmd+Shift+J to toggle DevTools
64
+ if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === "J") {
65
+ e.preventDefault();
66
+ this.toggle();
67
+ }
68
+ // Escape to close
69
+ if (e.key === "Escape" && this.isOpen) {
70
+ this.close();
71
+ }
72
+ });
73
+ }
74
+ setupInterceptors() {
75
+ // Intercept console logs
76
+ const originalLog = console.log;
77
+ console.log = (...args) => {
78
+ originalLog(...args);
79
+ this.eventLogger.log("console", "log", args);
80
+ };
81
+ const originalError = console.error;
82
+ console.error = (...args) => {
83
+ originalError(...args);
84
+ this.eventLogger.log("console", "error", args);
85
+ };
86
+ const originalWarn = console.warn;
87
+ console.warn = (...args) => {
88
+ originalWarn(...args);
89
+ this.eventLogger.log("console", "warn", args);
90
+ }; // Monitor performance
91
+ this.performanceMonitor.start();
92
+ // Monitor component lifecycle
93
+ this.setupComponentInterception();
94
+ }
95
+ setupComponentInterception() {
96
+ // Hook into Preact's component lifecycle
97
+ const originalRender = window.requestAnimationFrame;
98
+ let frameCount = 0;
99
+ const startTime = performance.now();
100
+ const monitorFrame = () => {
101
+ frameCount++;
102
+ const elapsed = performance.now() - startTime;
103
+ const fps = Math.round((frameCount / elapsed) * 1000);
104
+ this.performanceMonitor.recordFPS(fps);
105
+ originalRender(monitorFrame);
106
+ };
107
+ originalRender(monitorFrame);
108
+ }
109
+ injectPanel() {
110
+ const container = document.createElement("div");
111
+ container.id = "__jen_devtools__";
112
+ container.innerHTML = getHTML();
113
+ document.body.appendChild(container);
114
+ this.panel = container;
115
+ this.applyTheme();
116
+ }
117
+ attachEventListeners() {
118
+ if (!this.panel) return;
119
+ // Toggle button
120
+ const toggleBtn = this.panel.querySelector(".jen-devtools-toggle");
121
+ toggleBtn?.addEventListener("click", () => this.toggle());
122
+ // Minimize button
123
+ const minimizeBtn = this.panel.querySelector(".jen-devtools-minimize");
124
+ minimizeBtn?.addEventListener("click", () => this.toggleMinimize());
125
+ // Theme toggle
126
+ const themeToggle = this.panel.querySelector(".jen-devtools-theme-toggle");
127
+ themeToggle?.addEventListener("click", () => this.cycleTheme());
128
+ // Close button
129
+ const closeBtn = this.panel.querySelector(".jen-devtools-close");
130
+ closeBtn?.addEventListener("click", () => this.close());
131
+ // Dragging
132
+ this.setupDragging();
133
+ // Resizing
134
+ this.setupResizing();
135
+ // Tab navigation
136
+ this.setupTabs();
137
+ // Tree navigation
138
+ this.setupTreeNavigation();
139
+ // Search
140
+ this.setupSearch();
141
+ // Export button
142
+ const exportBtn = this.panel.querySelector(".jen-devtools-export");
143
+ exportBtn?.addEventListener("click", () => this.export());
144
+ }
145
+ setupDragging() {
146
+ if (!this.panel) return;
147
+ const header = this.panel.querySelector(".jen-devtools-header");
148
+ if (!header) return;
149
+ let isDragging = false;
150
+ let currentX = this.config.position.x;
151
+ let currentY = this.config.position.y;
152
+ let initialX = 0;
153
+ let initialY = 0;
154
+ header.addEventListener("mousedown", (e) => {
155
+ const me = e;
156
+ if (me.target.closest(".jen-devtools-controls")) return;
157
+ isDragging = true;
158
+ initialX = me.clientX - currentX;
159
+ initialY = me.clientY - currentY;
160
+ });
161
+ document.addEventListener("mousemove", (e) => {
162
+ if (!isDragging || !this.panel) return;
163
+ const me = e;
164
+ currentX = me.clientX - initialX;
165
+ currentY = me.clientY - initialY;
166
+ this.panel.style.left = `${currentX}px`;
167
+ this.panel.style.top = `${currentY}px`;
168
+ });
169
+ document.addEventListener("mouseup", () => {
170
+ isDragging = false;
171
+ this.config.position = { x: currentX, y: currentY };
172
+ this.persistence.saveConfig(this.config);
173
+ });
174
+ }
175
+ setupResizing() {
176
+ if (!this.panel) return;
177
+ const handle = this.panel.querySelector(".jen-devtools-resize");
178
+ if (!handle) return;
179
+ let isResizing = false;
180
+ let currentW = this.config.size.width;
181
+ let currentH = this.config.size.height;
182
+ let initialX = 0;
183
+ let initialY = 0;
184
+ handle.addEventListener("mousedown", (e) => {
185
+ const me = e;
186
+ isResizing = true;
187
+ initialX = me.clientX;
188
+ initialY = me.clientY;
189
+ });
190
+ document.addEventListener("mousemove", (e) => {
191
+ if (!isResizing || !this.panel) return;
192
+ const me = e;
193
+ const deltaX = me.clientX - initialX;
194
+ const deltaY = me.clientY - initialY;
195
+ currentW = Math.max(400, this.config.size.width + deltaX);
196
+ currentH = Math.max(300, this.config.size.height + deltaY);
197
+ this.panel.style.width = `${currentW}px`;
198
+ this.panel.style.height = `${currentH}px`;
199
+ });
200
+ document.addEventListener("mouseup", () => {
201
+ if (isResizing) {
202
+ this.config.size = { width: currentW, height: currentH };
203
+ this.persistence.saveConfig(this.config);
204
+ }
205
+ isResizing = false;
206
+ });
207
+ }
208
+ setupTabs() {
209
+ if (!this.panel) return;
210
+ const tabs = this.panel.querySelectorAll(".jen-devtools-tab");
211
+ tabs.forEach((tab) => {
212
+ tab.addEventListener("click", (e) => {
213
+ const tabName = e.target.dataset.tab;
214
+ if (tabName) {
215
+ this.selectTab(tabName);
216
+ }
217
+ });
218
+ });
219
+ }
220
+ setupTreeNavigation() {
221
+ if (!this.panel) return;
222
+ const tree = this.panel.querySelector(".jen-devtools-tree");
223
+ if (!tree) return;
224
+ // Click to select component
225
+ tree.addEventListener("click", (e) => {
226
+ const node = e.target.closest(".jen-tree-node");
227
+ if (node) {
228
+ const componentId = node.dataset.componentId;
229
+ if (componentId) {
230
+ const component = this.componentTree.getComponentById(componentId);
231
+ if (component) {
232
+ this.selectComponent(component);
233
+ }
234
+ }
235
+ }
236
+ });
237
+ // Hover to highlight DOM element
238
+ tree.addEventListener("mouseover", (e) => {
239
+ const node = e.target.closest(".jen-tree-node");
240
+ if (node) {
241
+ const componentId = node.dataset.componentId;
242
+ if (componentId) {
243
+ const component = this.componentTree.getComponentById(componentId);
244
+ if (component?.el) {
245
+ component.el.classList.add("jen-devtools-highlight");
246
+ }
247
+ }
248
+ }
249
+ });
250
+ tree.addEventListener("mouseout", (e) => {
251
+ const node = e.target.closest(".jen-tree-node");
252
+ if (node) {
253
+ const componentId = node.dataset.componentId;
254
+ if (componentId) {
255
+ const component = this.componentTree.getComponentById(componentId);
256
+ if (component?.el) {
257
+ component.el.classList.remove("jen-devtools-highlight");
258
+ }
259
+ }
260
+ }
261
+ });
262
+ // Keyboard navigation
263
+ document.addEventListener("keydown", (e) => {
264
+ if (!this.isOpen) return;
265
+ if (e.key === "ArrowDown") {
266
+ this.selectNextComponent();
267
+ } else if (e.key === "ArrowUp") {
268
+ this.selectPreviousComponent();
269
+ } else if (e.key === "ArrowRight") {
270
+ this.expandComponent();
271
+ } else if (e.key === "ArrowLeft") {
272
+ this.collapseComponent();
273
+ } else if (e.key === "Enter") {
274
+ this.toggleComponentExpanded();
275
+ }
276
+ });
277
+ }
278
+ setupSearch() {
279
+ if (!this.panel) return;
280
+ const searchInput = this.panel.querySelector(".jen-devtools-search");
281
+ if (!searchInput) return;
282
+ searchInput.addEventListener("input", (e) => {
283
+ const query = e.target.value;
284
+ const results = this.searchManager.search(query);
285
+ this.renderSearchResults(results);
286
+ });
287
+ }
288
+ selectTab(tabName) {
289
+ if (!this.panel) return;
290
+ // Update tab buttons
291
+ const tabs = this.panel.querySelectorAll(".jen-devtools-tab");
292
+ tabs.forEach((tab) => {
293
+ const tabEl = tab;
294
+ tabEl.classList.toggle("active", tabEl.dataset.tab === tabName);
295
+ });
296
+ // Update tab content
297
+ const contents = this.panel.querySelectorAll(".jen-devtools-tab-content");
298
+ contents.forEach((content) => {
299
+ const contentEl = content;
300
+ contentEl.classList.toggle("active", contentEl.dataset.tab === tabName);
301
+ });
302
+ this.config.collapsedTabs[tabName] = false;
303
+ this.persistence.saveConfig(this.config);
304
+ }
305
+ selectComponent(component) {
306
+ this.selectedComponent = component;
307
+ this.renderInspector();
308
+ }
309
+ selectNextComponent() {
310
+ if (!this.selectedComponent) return;
311
+ const next = this.componentTree.getNextComponent(this.selectedComponent);
312
+ if (next) {
313
+ this.selectComponent(next);
314
+ }
315
+ }
316
+ selectPreviousComponent() {
317
+ if (!this.selectedComponent) return;
318
+ const prev = this.componentTree.getPreviousComponent(
319
+ this.selectedComponent,
320
+ );
321
+ if (prev) {
322
+ this.selectComponent(prev);
323
+ }
324
+ }
325
+ expandComponent() {
326
+ if (!this.selectedComponent) return;
327
+ this.selectedComponent.expanded = true;
328
+ this.renderComponentTree();
329
+ }
330
+ collapseComponent() {
331
+ if (!this.selectedComponent) return;
332
+ this.selectedComponent.expanded = false;
333
+ this.renderComponentTree();
334
+ }
335
+ toggleComponentExpanded() {
336
+ if (!this.selectedComponent) return;
337
+ this.selectedComponent.expanded = !this.selectedComponent.expanded;
338
+ this.renderComponentTree();
339
+ }
340
+ renderInspector() {
341
+ if (!this.panel || !this.selectedComponent) return;
342
+ const inspector = this.panel.querySelector(".jen-devtools-inspector");
343
+ if (!inspector) return;
344
+ const component = this.selectedComponent;
345
+ inspector.innerHTML = `
346
+ <div class="jen-inspector-header">
347
+ <h3>${component.name}</h3>
348
+ <span class="jen-inspector-type">${component.type}</span>
349
+ </div>
350
+
351
+ <div class="jen-inspector-section">
352
+ <h4>Props</h4>
353
+ <div class="jen-inspector-props">
354
+ ${this.renderPropsEditor(component.props)}
355
+ </div>
356
+ </div>
357
+
358
+ <div class="jen-inspector-section">
359
+ <h4>State</h4>
360
+ <div class="jen-inspector-state">
361
+ ${this.renderStateEditor(component.state)}
362
+ </div>
363
+ </div>
364
+
365
+ <div class="jen-inspector-section">
366
+ <h4>Hooks</h4>
367
+ <div class="jen-inspector-hooks">
368
+ ${this.renderHooks(component.hooks)}
369
+ </div>
370
+ </div>
371
+
372
+ <div class="jen-inspector-section">
373
+ <h4>Events</h4>
374
+ <div class="jen-inspector-events">
375
+ ${this.renderEvents(component.events)}
376
+ </div>
377
+ </div>
378
+ `;
379
+ }
380
+ renderPropsEditor(props) {
381
+ return Object.entries(props)
382
+ .map(
383
+ ([key, value]) => `
384
+ <div class="jen-prop-item">
385
+ <span class="jen-prop-key">${key}</span>
386
+ <input
387
+ type="text"
388
+ class="jen-prop-value"
389
+ value="${this.serializeValue(value)}"
390
+ data-prop="${key}"
391
+ data-component="${this.selectedComponent?.id}"
392
+ />
393
+ <span class="jen-prop-type">${typeof value}</span>
394
+ </div>
395
+ `,
396
+ )
397
+ .join("");
398
+ }
399
+ renderStateEditor(state) {
400
+ return Object.entries(state)
401
+ .map(
402
+ ([key, value]) => `
403
+ <div class="jen-state-item">
404
+ <span class="jen-state-key">${key}</span>
405
+ <input
406
+ type="text"
407
+ class="jen-state-value"
408
+ value="${this.serializeValue(value)}"
409
+ data-state="${key}"
410
+ data-component="${this.selectedComponent?.id}"
411
+ />
412
+ <span class="jen-state-type">${typeof value}</span>
413
+ </div>
414
+ `,
415
+ )
416
+ .join("");
417
+ }
418
+ renderHooks(hooks) {
419
+ return hooks
420
+ .map(
421
+ (hook, i) => `
422
+ <div class="jen-hook-item">
423
+ <span class="jen-hook-index">[${i}]</span>
424
+ <span class="jen-hook-type">${hook.type}</span>
425
+ <span class="jen-hook-value">${this.serializeValue(hook.value)}</span>
426
+ </div>
427
+ `,
428
+ )
429
+ .join("");
430
+ }
431
+ renderEvents(events) {
432
+ if (events.length === 0) {
433
+ return "<p>No events</p>";
434
+ }
435
+ return events
436
+ .map(
437
+ (event) => `
438
+ <div class="jen-event-item">
439
+ <span class="jen-event-name">${event}</span>
440
+ </div>
441
+ `,
442
+ )
443
+ .join("");
444
+ }
445
+ renderComponentTree() {
446
+ if (!this.panel) return;
447
+ const treeContainer = this.panel.querySelector(".jen-devtools-tree");
448
+ if (!treeContainer) return;
449
+ const tree = this.componentTree.getTree();
450
+ treeContainer.innerHTML = this.renderTreeNodes(tree);
451
+ }
452
+ renderTreeNodes(nodes) {
453
+ return nodes
454
+ .map((node) => {
455
+ const children = node.children
456
+ ? this.renderTreeNodes(node.children)
457
+ : "";
458
+ const isSelected = this.selectedComponent?.id === node.id;
459
+ const icon =
460
+ node.children && node.children.length > 0
461
+ ? node.expanded
462
+ ? "▼"
463
+ : "▶"
464
+ : "•";
465
+ return `
466
+ <div class="jen-tree-node ${isSelected ? "selected" : ""}" data-component-id="${node.id}">
467
+ <div class="jen-tree-node-content">
468
+ <span class="jen-tree-icon">${icon}</span>
469
+ <span class="jen-tree-name">${node.name}</span>
470
+ </div>
471
+ ${node.expanded && children ? `<div class="jen-tree-children">${children}</div>` : ""}
472
+ </div>
473
+ `;
474
+ })
475
+ .join("");
476
+ }
477
+ renderSearchResults(results) {
478
+ if (!this.panel) return;
479
+ const resultsContainer = this.panel.querySelector(".jen-search-results");
480
+ if (!resultsContainer) return;
481
+ resultsContainer.innerHTML = results
482
+ .map(
483
+ (result) => `
484
+ <div class="jen-search-result" data-component-id="${result.id}">
485
+ <span>${result.name}</span>
486
+ </div>
487
+ `,
488
+ )
489
+ .join("");
490
+ }
491
+ serializeValue(value) {
492
+ if (value === null || value === undefined) {
493
+ return String(value);
494
+ }
495
+ if (typeof value === "object") {
496
+ return JSON.stringify(value).substring(0, 50);
497
+ }
498
+ return String(value);
499
+ }
500
+ applyTheme() {
501
+ if (!this.panel) return;
502
+ this.panel.classList.toggle("dark-theme", this.theme === "dark");
503
+ this.panel.classList.toggle("light-theme", this.theme === "light");
504
+ }
505
+ cycleTheme() {
506
+ this.theme = this.theme === "dark" ? "light" : "dark";
507
+ this.config.theme = this.theme;
508
+ this.applyTheme();
509
+ this.persistence.saveConfig(this.config);
510
+ }
511
+ toggleMinimize() {
512
+ this.config.minimized = !this.config.minimized;
513
+ if (this.panel) {
514
+ this.panel.classList.toggle("minimized", this.config.minimized);
515
+ }
516
+ this.persistence.saveConfig(this.config);
517
+ }
518
+ export() {
519
+ const state = {
520
+ components: this.componentTree.getTree(),
521
+ events: this.eventLogger.getLogs(),
522
+ performance: this.performanceMonitor.getMetrics(),
523
+ };
524
+ const dataStr = JSON.stringify(state, null, 2);
525
+ const blob = new Blob([dataStr], { type: "application/json" });
526
+ const url = URL.createObjectURL(blob);
527
+ const a = document.createElement("a");
528
+ a.href = url;
529
+ a.download = `jen-devtools-export-${Date.now()}.json`;
530
+ a.click();
531
+ }
532
+ toggle() {
533
+ if (this.isOpen) {
534
+ this.close();
535
+ } else {
536
+ this.open();
537
+ }
538
+ }
539
+ open() {
540
+ this.isOpen = true;
541
+ if (this.panel) {
542
+ this.panel.classList.add("open");
543
+ }
544
+ }
545
+ close() {
546
+ this.isOpen = false;
547
+ if (this.panel) {
548
+ this.panel.classList.remove("open");
549
+ }
550
+ }
551
+ /**
552
+ * Register a component for inspection
553
+ */
554
+ registerComponent(id, name, el, props, state, hooks) {
555
+ this.componentTree.addComponent({
556
+ id,
557
+ name,
558
+ el,
559
+ props,
560
+ state: state || {},
561
+ hooks: hooks || [],
562
+ events: [],
563
+ type: "component",
564
+ children: [],
565
+ expanded: false,
566
+ parent: null,
567
+ });
568
+ this.eventBus.emit("component:registered", { id, name });
569
+ }
570
+ /**
571
+ * Update component state
572
+ */
573
+ updateComponentState(componentId, state) {
574
+ const component = this.componentTree.getComponentById(componentId);
575
+ if (component) {
576
+ component.state = { ...component.state, ...state };
577
+ this.renderInspector();
578
+ this.eventBus.emit("component:updated", { componentId, state });
579
+ }
580
+ }
581
+ /**
582
+ * Log an event
583
+ */
584
+ logEvent(componentId, eventName, data) {
585
+ this.eventLogger.log(componentId, eventName, data);
586
+ this.eventBus.emit("event:logged", { componentId, eventName, data });
587
+ }
588
+ /**
589
+ * Register a plugin
590
+ */
591
+ registerPlugin(name, factory) {
592
+ this.pluginSystem.register(name, factory);
593
+ }
594
+ /**
595
+ * Get the plugin system
596
+ */
597
+ getPluginSystem() {
598
+ return this.pluginSystem;
599
+ }
600
+ /**
601
+ * Get the event bus
602
+ */
603
+ getEventBus() {
604
+ return this.eventBus;
605
+ }
606
+ /**
607
+ * Destroy DevTools and clean up
608
+ */
609
+ destroy() {
610
+ if (this.panel) {
611
+ this.panel.remove();
612
+ this.panel = null;
613
+ }
614
+ this.isOpen = false;
615
+ }
616
+ }
617
+ /**
618
+ * Global DevTools instance
619
+ */
620
+ let globalDevTools = null;
621
+ /**
622
+ * Initialize DevTools in development mode
623
+ */
624
+ export function initDevTools(config) {
625
+ if (!globalDevTools) {
626
+ globalDevTools = new DevTools({
627
+ enabled: true,
628
+ ...config,
629
+ });
630
+ }
631
+ return globalDevTools;
632
+ }
633
+ /**
634
+ * Get the global DevTools instance
635
+ */
636
+ export function getDevTools() {
637
+ return globalDevTools;
638
+ }
@@ -0,0 +1,29 @@
1
+ /*
2
+ * This file is part of Jen.js.
3
+ * Copyright (C) 2026 oopsio
4
+ */
5
+ export function createEventBus() {
6
+ const listeners = {};
7
+ return {
8
+ on(event, callback) {
9
+ if (!listeners[event]) {
10
+ listeners[event] = [];
11
+ }
12
+ listeners[event].push(callback);
13
+ },
14
+ off(event, callback) {
15
+ if (!listeners[event]) return;
16
+ listeners[event] = listeners[event].filter((cb) => cb !== callback);
17
+ },
18
+ emit(event, ...args) {
19
+ if (!listeners[event]) return;
20
+ listeners[event].forEach((callback) => {
21
+ try {
22
+ callback(...args);
23
+ } catch (e) {
24
+ console.error(`Error in event listener for ${event}:`, e);
25
+ }
26
+ });
27
+ },
28
+ };
29
+ }