@buenojs/bueno 0.8.6 → 0.8.7

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 (398) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +132 -15
  3. package/dist/cache/index.d.ts +187 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cli/bin.d.ts +8 -0
  6. package/dist/cli/bin.d.ts.map +1 -0
  7. package/dist/cli/bin.js +483 -155
  8. package/dist/cli/commands/add-frontend.d.ts +7 -0
  9. package/dist/cli/commands/add-frontend.d.ts.map +1 -0
  10. package/dist/cli/commands/build.d.ts +7 -0
  11. package/dist/cli/commands/build.d.ts.map +1 -0
  12. package/dist/cli/commands/dev.d.ts +7 -0
  13. package/dist/cli/commands/dev.d.ts.map +1 -0
  14. package/dist/cli/commands/generate.d.ts +7 -0
  15. package/dist/cli/commands/generate.d.ts.map +1 -0
  16. package/dist/cli/commands/help.d.ts +7 -0
  17. package/dist/cli/commands/help.d.ts.map +1 -0
  18. package/dist/cli/commands/index.d.ts +59 -0
  19. package/dist/cli/commands/index.d.ts.map +1 -0
  20. package/dist/cli/commands/migration.d.ts +7 -0
  21. package/dist/cli/commands/migration.d.ts.map +1 -0
  22. package/dist/cli/commands/new.d.ts +7 -0
  23. package/dist/cli/commands/new.d.ts.map +1 -0
  24. package/dist/cli/commands/start.d.ts +7 -0
  25. package/dist/cli/commands/start.d.ts.map +1 -0
  26. package/dist/cli/core/args.d.ts +61 -0
  27. package/dist/cli/core/args.d.ts.map +1 -0
  28. package/dist/cli/core/console.d.ts +135 -0
  29. package/dist/cli/core/console.d.ts.map +1 -0
  30. package/dist/cli/core/index.d.ts +10 -0
  31. package/dist/cli/core/index.d.ts.map +1 -0
  32. package/dist/cli/core/prompt.d.ts +63 -0
  33. package/dist/cli/core/prompt.d.ts.map +1 -0
  34. package/dist/cli/core/spinner.d.ts +111 -0
  35. package/dist/cli/core/spinner.d.ts.map +1 -0
  36. package/dist/cli/index.d.ts +47 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/templates/database/index.d.ts +24 -0
  39. package/dist/cli/templates/database/index.d.ts.map +1 -0
  40. package/dist/cli/templates/database/mysql.d.ts +6 -0
  41. package/dist/cli/templates/database/mysql.d.ts.map +1 -0
  42. package/dist/cli/templates/database/none.d.ts +8 -0
  43. package/dist/cli/templates/database/none.d.ts.map +1 -0
  44. package/dist/cli/templates/database/postgresql.d.ts +6 -0
  45. package/dist/cli/templates/database/postgresql.d.ts.map +1 -0
  46. package/dist/cli/templates/database/sqlite.d.ts +6 -0
  47. package/dist/cli/templates/database/sqlite.d.ts.map +1 -0
  48. package/dist/cli/templates/deploy.d.ts +41 -0
  49. package/dist/cli/templates/deploy.d.ts.map +1 -0
  50. package/dist/cli/templates/docker.d.ts +30 -0
  51. package/dist/cli/templates/docker.d.ts.map +1 -0
  52. package/dist/cli/templates/frontend/index.d.ts +25 -0
  53. package/dist/cli/templates/frontend/index.d.ts.map +1 -0
  54. package/dist/cli/templates/frontend/none.d.ts +8 -0
  55. package/dist/cli/templates/frontend/none.d.ts.map +1 -0
  56. package/dist/cli/templates/frontend/react.d.ts +6 -0
  57. package/dist/cli/templates/frontend/react.d.ts.map +1 -0
  58. package/dist/cli/templates/frontend/solid.d.ts +6 -0
  59. package/dist/cli/templates/frontend/solid.d.ts.map +1 -0
  60. package/dist/cli/templates/frontend/svelte.d.ts +6 -0
  61. package/dist/cli/templates/frontend/svelte.d.ts.map +1 -0
  62. package/dist/cli/templates/frontend/vue.d.ts +6 -0
  63. package/dist/cli/templates/frontend/vue.d.ts.map +1 -0
  64. package/dist/cli/templates/generators/index.d.ts +29 -0
  65. package/dist/cli/templates/generators/index.d.ts.map +1 -0
  66. package/dist/cli/templates/generators/types.d.ts +32 -0
  67. package/dist/cli/templates/generators/types.d.ts.map +1 -0
  68. package/dist/cli/templates/index.d.ts +12 -0
  69. package/dist/cli/templates/index.d.ts.map +1 -0
  70. package/dist/cli/templates/project/api.d.ts +6 -0
  71. package/dist/cli/templates/project/api.d.ts.map +1 -0
  72. package/dist/cli/templates/project/default.d.ts +6 -0
  73. package/dist/cli/templates/project/default.d.ts.map +1 -0
  74. package/dist/cli/templates/project/fullstack.d.ts +14 -0
  75. package/dist/cli/templates/project/fullstack.d.ts.map +1 -0
  76. package/dist/cli/templates/project/index.d.ts +26 -0
  77. package/dist/cli/templates/project/index.d.ts.map +1 -0
  78. package/dist/cli/templates/project/minimal.d.ts +6 -0
  79. package/dist/cli/templates/project/minimal.d.ts.map +1 -0
  80. package/dist/cli/templates/project/types.d.ts +80 -0
  81. package/dist/cli/templates/project/types.d.ts.map +1 -0
  82. package/dist/cli/templates/project/website.d.ts +8 -0
  83. package/dist/cli/templates/project/website.d.ts.map +1 -0
  84. package/dist/cli/utils/fs.d.ts +137 -0
  85. package/dist/cli/utils/fs.d.ts.map +1 -0
  86. package/dist/cli/utils/index.d.ts +9 -0
  87. package/dist/cli/utils/index.d.ts.map +1 -0
  88. package/dist/cli/utils/strings.d.ts +86 -0
  89. package/dist/cli/utils/strings.d.ts.map +1 -0
  90. package/dist/cli/utils/version.d.ts +15 -0
  91. package/dist/cli/utils/version.d.ts.map +1 -0
  92. package/dist/config/env-validation.d.ts +49 -0
  93. package/dist/config/env-validation.d.ts.map +1 -0
  94. package/dist/config/env.d.ts +167 -0
  95. package/dist/config/env.d.ts.map +1 -0
  96. package/dist/config/index.d.ts +168 -0
  97. package/dist/config/index.d.ts.map +1 -0
  98. package/dist/config/loader.d.ts +81 -0
  99. package/dist/config/loader.d.ts.map +1 -0
  100. package/dist/config/merge.d.ts +66 -0
  101. package/dist/config/merge.d.ts.map +1 -0
  102. package/dist/config/types.d.ts +322 -0
  103. package/dist/config/types.d.ts.map +1 -0
  104. package/dist/config/validation.d.ts +100 -0
  105. package/dist/config/validation.d.ts.map +1 -0
  106. package/dist/container/forward-ref.d.ts +116 -0
  107. package/dist/container/forward-ref.d.ts.map +1 -0
  108. package/dist/container/index.d.ts +95 -0
  109. package/dist/container/index.d.ts.map +1 -0
  110. package/dist/context/index.d.ts +143 -0
  111. package/dist/context/index.d.ts.map +1 -0
  112. package/dist/database/index.d.ts +219 -0
  113. package/dist/database/index.d.ts.map +1 -0
  114. package/dist/database/migrations/index.d.ts +146 -0
  115. package/dist/database/migrations/index.d.ts.map +1 -0
  116. package/dist/database/orm/builder.d.ts +122 -0
  117. package/dist/database/orm/builder.d.ts.map +1 -0
  118. package/dist/database/orm/casts/index.d.ts +16 -0
  119. package/dist/database/orm/casts/index.d.ts.map +1 -0
  120. package/dist/database/orm/casts/types.d.ts +16 -0
  121. package/dist/database/orm/casts/types.d.ts.map +1 -0
  122. package/dist/database/orm/compiler.d.ts +90 -0
  123. package/dist/database/orm/compiler.d.ts.map +1 -0
  124. package/dist/database/orm/hooks/index.d.ts +53 -0
  125. package/dist/database/orm/hooks/index.d.ts.map +1 -0
  126. package/dist/database/orm/index.d.ts +21 -0
  127. package/dist/database/orm/index.d.ts.map +1 -0
  128. package/dist/database/orm/model-registry.d.ts +33 -0
  129. package/dist/database/orm/model-registry.d.ts.map +1 -0
  130. package/dist/database/orm/model.d.ts +245 -0
  131. package/dist/database/orm/model.d.ts.map +1 -0
  132. package/dist/database/orm/relationships/base.d.ts +69 -0
  133. package/dist/database/orm/relationships/base.d.ts.map +1 -0
  134. package/dist/database/orm/relationships/belongs-to-many.d.ts +47 -0
  135. package/dist/database/orm/relationships/belongs-to-many.d.ts.map +1 -0
  136. package/dist/database/orm/relationships/belongs-to.d.ts +17 -0
  137. package/dist/database/orm/relationships/belongs-to.d.ts.map +1 -0
  138. package/dist/database/orm/relationships/has-many.d.ts +14 -0
  139. package/dist/database/orm/relationships/has-many.d.ts.map +1 -0
  140. package/dist/database/orm/relationships/has-one.d.ts +14 -0
  141. package/dist/database/orm/relationships/has-one.d.ts.map +1 -0
  142. package/dist/database/orm/relationships/index.d.ts +10 -0
  143. package/dist/database/orm/relationships/index.d.ts.map +1 -0
  144. package/dist/database/orm/scopes/index.d.ts +36 -0
  145. package/dist/database/orm/scopes/index.d.ts.map +1 -0
  146. package/dist/database/schema/index.d.ts +155 -0
  147. package/dist/database/schema/index.d.ts.map +1 -0
  148. package/dist/events/__tests__/event-system.test.d.ts +2 -0
  149. package/dist/events/__tests__/event-system.test.d.ts.map +1 -0
  150. package/dist/events/config.d.ts +16 -0
  151. package/dist/events/config.d.ts.map +1 -0
  152. package/dist/events/example-usage.d.ts +12 -0
  153. package/dist/events/example-usage.d.ts.map +1 -0
  154. package/dist/events/index.d.ts +27 -0
  155. package/dist/events/index.d.ts.map +1 -0
  156. package/dist/events/manager.d.ts +33 -0
  157. package/dist/events/manager.d.ts.map +1 -0
  158. package/dist/events/registry.d.ts +31 -0
  159. package/dist/events/registry.d.ts.map +1 -0
  160. package/dist/events/types.d.ts +105 -0
  161. package/dist/events/types.d.ts.map +1 -0
  162. package/dist/frontend/api-routes.d.ts +189 -0
  163. package/dist/frontend/api-routes.d.ts.map +1 -0
  164. package/dist/frontend/bundler.d.ts +99 -0
  165. package/dist/frontend/bundler.d.ts.map +1 -0
  166. package/dist/frontend/console-client.d.ts +11 -0
  167. package/dist/frontend/console-client.d.ts.map +1 -0
  168. package/dist/frontend/console-stream.d.ts +138 -0
  169. package/dist/frontend/console-stream.d.ts.map +1 -0
  170. package/dist/frontend/dev-server.d.ts +174 -0
  171. package/dist/frontend/dev-server.d.ts.map +1 -0
  172. package/dist/frontend/file-router.d.ts +170 -0
  173. package/dist/frontend/file-router.d.ts.map +1 -0
  174. package/dist/frontend/frameworks/index.d.ts +41 -0
  175. package/dist/frontend/frameworks/index.d.ts.map +1 -0
  176. package/dist/frontend/frameworks/react.d.ts +32 -0
  177. package/dist/frontend/frameworks/react.d.ts.map +1 -0
  178. package/dist/frontend/frameworks/solid.d.ts +42 -0
  179. package/dist/frontend/frameworks/solid.d.ts.map +1 -0
  180. package/dist/frontend/frameworks/svelte.d.ts +57 -0
  181. package/dist/frontend/frameworks/svelte.d.ts.map +1 -0
  182. package/dist/frontend/frameworks/vue.d.ts +36 -0
  183. package/dist/frontend/frameworks/vue.d.ts.map +1 -0
  184. package/dist/frontend/hmr-client.d.ts +22 -0
  185. package/dist/frontend/hmr-client.d.ts.map +1 -0
  186. package/dist/frontend/hmr.d.ts +185 -0
  187. package/dist/frontend/hmr.d.ts.map +1 -0
  188. package/dist/frontend/index.d.ts +34 -0
  189. package/dist/frontend/index.d.ts.map +1 -0
  190. package/dist/frontend/islands.d.ts +135 -0
  191. package/dist/frontend/islands.d.ts.map +1 -0
  192. package/dist/frontend/isr.d.ts +143 -0
  193. package/dist/frontend/isr.d.ts.map +1 -0
  194. package/dist/frontend/layout.d.ts +140 -0
  195. package/dist/frontend/layout.d.ts.map +1 -0
  196. package/dist/frontend/ssr/react.d.ts +118 -0
  197. package/dist/frontend/ssr/react.d.ts.map +1 -0
  198. package/dist/frontend/ssr/solid.d.ts +141 -0
  199. package/dist/frontend/ssr/solid.d.ts.map +1 -0
  200. package/dist/frontend/ssr/svelte.d.ts +158 -0
  201. package/dist/frontend/ssr/svelte.d.ts.map +1 -0
  202. package/dist/frontend/ssr/vue.d.ts +161 -0
  203. package/dist/frontend/ssr/vue.d.ts.map +1 -0
  204. package/dist/frontend/ssr.d.ts +147 -0
  205. package/dist/frontend/ssr.d.ts.map +1 -0
  206. package/dist/frontend/types.d.ts +1902 -0
  207. package/dist/frontend/types.d.ts.map +1 -0
  208. package/dist/graphql/built-in-engine.d.ts +36 -0
  209. package/dist/graphql/built-in-engine.d.ts.map +1 -0
  210. package/dist/graphql/context-builder.d.ts +44 -0
  211. package/dist/graphql/context-builder.d.ts.map +1 -0
  212. package/dist/graphql/decorators.d.ts +162 -0
  213. package/dist/graphql/decorators.d.ts.map +1 -0
  214. package/dist/graphql/execution-pipeline.d.ts +67 -0
  215. package/dist/graphql/execution-pipeline.d.ts.map +1 -0
  216. package/dist/graphql/graphql-module.d.ts +70 -0
  217. package/dist/graphql/graphql-module.d.ts.map +1 -0
  218. package/dist/graphql/index.d.ts +48 -0
  219. package/dist/graphql/index.d.ts.map +1 -0
  220. package/dist/graphql/metadata.d.ts +37 -0
  221. package/dist/graphql/metadata.d.ts.map +1 -0
  222. package/dist/graphql/schema-builder.d.ts +34 -0
  223. package/dist/graphql/schema-builder.d.ts.map +1 -0
  224. package/dist/graphql/subscription-handler.d.ts +47 -0
  225. package/dist/graphql/subscription-handler.d.ts.map +1 -0
  226. package/dist/graphql/types.d.ts +252 -0
  227. package/dist/graphql/types.d.ts.map +1 -0
  228. package/dist/health/index.d.ts +176 -0
  229. package/dist/health/index.d.ts.map +1 -0
  230. package/dist/i18n/engine.d.ts +105 -0
  231. package/dist/i18n/engine.d.ts.map +1 -0
  232. package/dist/i18n/index.d.ts +13 -0
  233. package/dist/i18n/index.d.ts.map +1 -0
  234. package/dist/i18n/loader.d.ts +79 -0
  235. package/dist/i18n/loader.d.ts.map +1 -0
  236. package/dist/i18n/middleware.d.ts +96 -0
  237. package/dist/i18n/middleware.d.ts.map +1 -0
  238. package/dist/i18n/negotiator.d.ts +84 -0
  239. package/dist/i18n/negotiator.d.ts.map +1 -0
  240. package/dist/i18n/types.d.ts +129 -0
  241. package/dist/i18n/types.d.ts.map +1 -0
  242. package/dist/index.d.ts +48 -0
  243. package/dist/index.d.ts.map +1 -0
  244. package/dist/jobs/drivers/memory.d.ts +38 -0
  245. package/dist/jobs/drivers/memory.d.ts.map +1 -0
  246. package/dist/jobs/drivers/redis.d.ts +34 -0
  247. package/dist/jobs/drivers/redis.d.ts.map +1 -0
  248. package/dist/jobs/index.d.ts +12 -0
  249. package/dist/jobs/index.d.ts.map +1 -0
  250. package/dist/jobs/queue.d.ts +93 -0
  251. package/dist/jobs/queue.d.ts.map +1 -0
  252. package/dist/jobs/types.d.ts +193 -0
  253. package/dist/jobs/types.d.ts.map +1 -0
  254. package/dist/jobs/worker.d.ts +91 -0
  255. package/dist/jobs/worker.d.ts.map +1 -0
  256. package/dist/lock/index.d.ts +141 -0
  257. package/dist/lock/index.d.ts.map +1 -0
  258. package/dist/logger/index.d.ts +156 -0
  259. package/dist/logger/index.d.ts.map +1 -0
  260. package/dist/logger/transports/index.d.ts +371 -0
  261. package/dist/logger/transports/index.d.ts.map +1 -0
  262. package/dist/metrics/index.d.ts +163 -0
  263. package/dist/metrics/index.d.ts.map +1 -0
  264. package/dist/middleware/built-in.d.ts +50 -0
  265. package/dist/middleware/built-in.d.ts.map +1 -0
  266. package/dist/middleware/index.d.ts +40 -0
  267. package/dist/middleware/index.d.ts.map +1 -0
  268. package/dist/migrations/index.d.ts +10 -0
  269. package/dist/migrations/index.d.ts.map +1 -0
  270. package/dist/modules/filters.d.ts +150 -0
  271. package/dist/modules/filters.d.ts.map +1 -0
  272. package/dist/modules/guards.d.ts +188 -0
  273. package/dist/modules/guards.d.ts.map +1 -0
  274. package/dist/modules/index.d.ts +266 -0
  275. package/dist/modules/index.d.ts.map +1 -0
  276. package/dist/modules/interceptors.d.ts +242 -0
  277. package/dist/modules/interceptors.d.ts.map +1 -0
  278. package/dist/modules/lazy.d.ts +187 -0
  279. package/dist/modules/lazy.d.ts.map +1 -0
  280. package/dist/modules/lifecycle.d.ts +221 -0
  281. package/dist/modules/lifecycle.d.ts.map +1 -0
  282. package/dist/modules/metadata.d.ts +32 -0
  283. package/dist/modules/metadata.d.ts.map +1 -0
  284. package/dist/modules/pipes.d.ts +287 -0
  285. package/dist/modules/pipes.d.ts.map +1 -0
  286. package/dist/notification/channels/base.d.ts +32 -0
  287. package/dist/notification/channels/base.d.ts.map +1 -0
  288. package/dist/notification/channels/email.d.ts +37 -0
  289. package/dist/notification/channels/email.d.ts.map +1 -0
  290. package/dist/notification/channels/push.d.ts +37 -0
  291. package/dist/notification/channels/push.d.ts.map +1 -0
  292. package/dist/notification/channels/sms.d.ts +37 -0
  293. package/dist/notification/channels/sms.d.ts.map +1 -0
  294. package/dist/notification/channels/whatsapp.d.ts +37 -0
  295. package/dist/notification/channels/whatsapp.d.ts.map +1 -0
  296. package/dist/notification/index.d.ts +15 -0
  297. package/dist/notification/index.d.ts.map +1 -0
  298. package/dist/notification/service.d.ts +100 -0
  299. package/dist/notification/service.d.ts.map +1 -0
  300. package/dist/notification/types.d.ts +253 -0
  301. package/dist/notification/types.d.ts.map +1 -0
  302. package/dist/observability/__tests__/observability.test.d.ts +2 -0
  303. package/dist/observability/__tests__/observability.test.d.ts.map +1 -0
  304. package/dist/observability/breadcrumbs.d.ts +48 -0
  305. package/dist/observability/breadcrumbs.d.ts.map +1 -0
  306. package/dist/observability/index.d.ts +95 -0
  307. package/dist/observability/index.d.ts.map +1 -0
  308. package/dist/observability/interceptor.d.ts +19 -0
  309. package/dist/observability/interceptor.d.ts.map +1 -0
  310. package/dist/observability/service.d.ts +101 -0
  311. package/dist/observability/service.d.ts.map +1 -0
  312. package/dist/observability/trace.d.ts +21 -0
  313. package/dist/observability/trace.d.ts.map +1 -0
  314. package/dist/observability/types.d.ts +172 -0
  315. package/dist/observability/types.d.ts.map +1 -0
  316. package/dist/openapi/__tests__/decorators.test.d.ts +2 -0
  317. package/dist/openapi/__tests__/decorators.test.d.ts.map +1 -0
  318. package/dist/openapi/__tests__/document-builder.test.d.ts +2 -0
  319. package/dist/openapi/__tests__/document-builder.test.d.ts.map +1 -0
  320. package/dist/openapi/__tests__/route-scanner.test.d.ts +2 -0
  321. package/dist/openapi/__tests__/route-scanner.test.d.ts.map +1 -0
  322. package/dist/openapi/__tests__/schema-generator.test.d.ts +2 -0
  323. package/dist/openapi/__tests__/schema-generator.test.d.ts.map +1 -0
  324. package/dist/openapi/decorators.d.ts +173 -0
  325. package/dist/openapi/decorators.d.ts.map +1 -0
  326. package/dist/openapi/document-builder.d.ts +82 -0
  327. package/dist/openapi/document-builder.d.ts.map +1 -0
  328. package/dist/openapi/index.d.ts +48 -0
  329. package/dist/openapi/index.d.ts.map +1 -0
  330. package/dist/openapi/metadata.d.ts +36 -0
  331. package/dist/openapi/metadata.d.ts.map +1 -0
  332. package/dist/openapi/route-scanner.d.ts +34 -0
  333. package/dist/openapi/route-scanner.d.ts.map +1 -0
  334. package/dist/openapi/schema-generator.d.ts +53 -0
  335. package/dist/openapi/schema-generator.d.ts.map +1 -0
  336. package/dist/openapi/swagger-module.d.ts +57 -0
  337. package/dist/openapi/swagger-module.d.ts.map +1 -0
  338. package/dist/openapi/types.d.ts +344 -0
  339. package/dist/openapi/types.d.ts.map +1 -0
  340. package/dist/orm/index.d.ts +10 -0
  341. package/dist/orm/index.d.ts.map +1 -0
  342. package/dist/router/index.d.ts +73 -0
  343. package/dist/router/index.d.ts.map +1 -0
  344. package/dist/router/linear.d.ts +54 -0
  345. package/dist/router/linear.d.ts.map +1 -0
  346. package/dist/router/regex.d.ts +49 -0
  347. package/dist/router/regex.d.ts.map +1 -0
  348. package/dist/router/tree.d.ts +112 -0
  349. package/dist/router/tree.d.ts.map +1 -0
  350. package/dist/rpc/index.d.ts +321 -0
  351. package/dist/rpc/index.d.ts.map +1 -0
  352. package/dist/schema/index.d.ts +10 -0
  353. package/dist/schema/index.d.ts.map +1 -0
  354. package/dist/security/index.d.ts +126 -0
  355. package/dist/security/index.d.ts.map +1 -0
  356. package/dist/ssg/index.d.ts +73 -0
  357. package/dist/ssg/index.d.ts.map +1 -0
  358. package/dist/storage/index.d.ts +99 -0
  359. package/dist/storage/index.d.ts.map +1 -0
  360. package/dist/telemetry/index.d.ts +376 -0
  361. package/dist/telemetry/index.d.ts.map +1 -0
  362. package/dist/template/index.d.ts +7 -0
  363. package/dist/template/index.d.ts.map +1 -0
  364. package/dist/templates/engine.d.ts +60 -0
  365. package/dist/templates/engine.d.ts.map +1 -0
  366. package/dist/templates/index.d.ts +9 -0
  367. package/dist/templates/index.d.ts.map +1 -0
  368. package/dist/templates/loader.d.ts +45 -0
  369. package/dist/templates/loader.d.ts.map +1 -0
  370. package/dist/templates/renderers/markdown.d.ts +46 -0
  371. package/dist/templates/renderers/markdown.d.ts.map +1 -0
  372. package/dist/templates/renderers/simple.d.ts +35 -0
  373. package/dist/templates/renderers/simple.d.ts.map +1 -0
  374. package/dist/templates/types.d.ts +138 -0
  375. package/dist/templates/types.d.ts.map +1 -0
  376. package/dist/testing/index.d.ts +539 -0
  377. package/dist/testing/index.d.ts.map +1 -0
  378. package/dist/types/index.d.ts +116 -0
  379. package/dist/types/index.d.ts.map +1 -0
  380. package/dist/validation/index.d.ts +89 -0
  381. package/dist/validation/index.d.ts.map +1 -0
  382. package/dist/validation/schemas.d.ts +243 -0
  383. package/dist/validation/schemas.d.ts.map +1 -0
  384. package/dist/websocket/index.d.ts +252 -0
  385. package/dist/websocket/index.d.ts.map +1 -0
  386. package/package.json +2 -2
  387. package/src/cli/commands/add-frontend.ts +444 -0
  388. package/src/cli/commands/new.ts +23 -0
  389. package/src/cli/index.ts +1 -0
  390. package/src/cli/templates/frontend/react.ts +2 -1
  391. package/src/cli/templates/frontend/solid.ts +2 -1
  392. package/src/cli/templates/frontend/svelte.ts +2 -1
  393. package/src/cli/templates/frontend/vue.ts +2 -1
  394. package/src/cli/templates/project/api.ts +1 -1
  395. package/src/cli/templates/project/default.ts +1 -1
  396. package/src/cli/templates/project/fullstack.ts +14 -104
  397. package/src/cli/templates/project/website.ts +62 -11
  398. package/tsconfig.declaration.json +14 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * File-based Routing Implementation
3
+ *
4
+ * Provides Next.js-style file-based routing:
5
+ * - pages/ directory scanning
6
+ * - Dynamic routes: [id].tsx, [...slug].tsx
7
+ * - Route generation from file structure
8
+ * - Integration with existing Router
9
+ */
10
+ import { Router } from "../router/index.js";
11
+ import type { DynamicRoute, FileRouterConfig, PartialFileRouterConfig, RouteDefinition, RouteMatch } from "./types.js";
12
+ /**
13
+ * File-based router that scans directories and generates routes
14
+ *
15
+ * Features:
16
+ * - Next.js-style file-based routing
17
+ * - Dynamic routes with [param] syntax
18
+ * - Catch-all routes with [...param] syntax
19
+ * - API routes in pages/api/
20
+ * - Hot reload support
21
+ */
22
+ export declare class FileRouter {
23
+ private config;
24
+ private logger;
25
+ private routes;
26
+ private dynamicRoutes;
27
+ private router;
28
+ private pageModules;
29
+ private apiHandlers;
30
+ constructor(config?: PartialFileRouterConfig);
31
+ /**
32
+ * Normalize partial config to full config with defaults
33
+ */
34
+ private normalizeConfig;
35
+ /**
36
+ * Initialize the file router by scanning the pages directory
37
+ */
38
+ init(): Promise<void>;
39
+ /**
40
+ * Scan the pages directory for route files
41
+ */
42
+ private scanPagesDirectory;
43
+ /**
44
+ * Process a single route file
45
+ */
46
+ private processRouteFile;
47
+ /**
48
+ * Convert file path to route path
49
+ */
50
+ private filePathToRoute;
51
+ /**
52
+ * Determine route type from file path
53
+ */
54
+ private getRouteType;
55
+ /**
56
+ * Parse route pattern and extract parameters
57
+ */
58
+ private parseRoutePattern;
59
+ /**
60
+ * Convert route path to regex
61
+ */
62
+ private routeToRegex;
63
+ /**
64
+ * Generate unique route ID
65
+ */
66
+ private generateRouteId;
67
+ /**
68
+ * Build the router from collected routes
69
+ */
70
+ private buildRouter;
71
+ /**
72
+ * Sort routes by specificity
73
+ * Static routes come before dynamic routes
74
+ */
75
+ private sortRoutesBySpecificity;
76
+ /**
77
+ * Create page handler for a route
78
+ */
79
+ private createPageHandler;
80
+ /**
81
+ * Register API route with all HTTP methods
82
+ */
83
+ private registerApiRoute;
84
+ /**
85
+ * Create API handler for a route and method
86
+ */
87
+ private createApiHandler;
88
+ /**
89
+ * Load page module dynamically
90
+ */
91
+ private loadPageModule;
92
+ /**
93
+ * Load API module dynamically
94
+ */
95
+ private loadApiModule;
96
+ /**
97
+ * Extract params from URL using route definition
98
+ */
99
+ private extractParams;
100
+ /**
101
+ * Create context for request
102
+ */
103
+ private createContext;
104
+ /**
105
+ * Match a request to a route
106
+ */
107
+ match(method: string, pathname: string): RouteMatch | null;
108
+ /**
109
+ * Handle incoming request
110
+ */
111
+ handle(request: Request): Promise<Response>;
112
+ /**
113
+ * Create handler for route
114
+ */
115
+ private createHandler;
116
+ /**
117
+ * Get all routes
118
+ */
119
+ getRoutes(): RouteDefinition[];
120
+ /**
121
+ * Get route by path
122
+ */
123
+ getRoute(path: string): RouteDefinition | undefined;
124
+ /**
125
+ * Get dynamic routes
126
+ */
127
+ getDynamicRoutes(): DynamicRoute[];
128
+ /**
129
+ * Generate URL for a route
130
+ */
131
+ generateUrl(routeId: string, params?: Record<string, string>): string | null;
132
+ /**
133
+ * Reload routes (for hot reload)
134
+ */
135
+ reload(): Promise<void>;
136
+ /**
137
+ * Get the underlying router
138
+ */
139
+ getRouter(): Router;
140
+ /**
141
+ * Get configuration
142
+ */
143
+ getConfig(): FileRouterConfig;
144
+ }
145
+ /**
146
+ * Create a file router
147
+ */
148
+ export declare function createFileRouter(config?: PartialFileRouterConfig): FileRouter;
149
+ /**
150
+ * Check if a path is a dynamic route
151
+ */
152
+ export declare function isDynamicRoute(path: string): boolean;
153
+ /**
154
+ * Check if a path is a catch-all route
155
+ */
156
+ export declare function isCatchAllRoute(path: string): boolean;
157
+ /**
158
+ * Get parameter names from route path
159
+ */
160
+ export declare function getRouteParams(path: string): string[];
161
+ /**
162
+ * Normalize route path
163
+ */
164
+ export declare function normalizeRoutePath(path: string): string;
165
+ /**
166
+ * Compare route specificity
167
+ * Returns negative if a is more specific, positive if b is more specific
168
+ */
169
+ export declare function compareRouteSpecificity(a: string, b: string): number;
170
+ //# sourceMappingURL=file-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-router.d.ts","sourceRoot":"","sources":["../../src/frontend/file-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EACX,YAAY,EAEZ,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EAEf,UAAU,EAGV,MAAM,YAAY,CAAC;AAWpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,WAAW,CAAwD;gBAE/D,MAAM,GAAE,uBAA4B;IAUhD;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;YACW,kBAAkB;IAahC;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;YACW,gBAAgB;IAuC9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,aAAa;IAY3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IA4B1D;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYjD;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,SAAS,IAAI,eAAe,EAAE;IAI9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD;;OAEG;IACH,gBAAgB,IAAI,YAAY,EAAE;IAIlC;;OAEG;IACH,WAAW,CACV,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACjC,MAAM,GAAG,IAAI;IAchB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,SAAS,IAAI,gBAAgB;CAG7B;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,GAAE,uBAA4B,GAClC,UAAU,CAEZ;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAcrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAkBpE"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Framework Build Configurations
3
+ *
4
+ * Exports framework-specific build configurations for all supported frameworks.
5
+ * Each framework module provides configuration for JSX runtime, plugins, and defines.
6
+ */
7
+ import type { FrameworkBuildConfig, FrontendFramework } from "../types.js";
8
+ export { getReactBuildConfig, isReactComponent, getReactRefreshPreamble, reactFrameworkMeta, } from "./react.js";
9
+ export { getVueBuildConfig, isVueComponent, isVueJsx, getVueBlockTypes, vueFrameworkMeta, } from "./vue.js";
10
+ export { getSvelteBuildConfig, isSvelteComponent, getSveltePreprocessConfig, getSvelteCompilerOptions, svelteFrameworkMeta, } from "./svelte.js";
11
+ export { getSolidBuildConfig, isSolidComponent, getSolidRefreshPreamble, getSolidTransformOptions, solidFrameworkMeta, } from "./solid.js";
12
+ export interface FrameworkMeta {
13
+ name: FrontendFramework;
14
+ displayName: string;
15
+ fileExtensions: string[];
16
+ componentExtensions: string[];
17
+ needsRefreshRuntime: boolean;
18
+ supportsHMR: boolean;
19
+ supportsSSR: boolean;
20
+ }
21
+ /**
22
+ * Get framework build configuration by framework name
23
+ */
24
+ export declare function getFrameworkConfig(framework: FrontendFramework): FrameworkBuildConfig;
25
+ /**
26
+ * Get framework metadata by framework name
27
+ */
28
+ export declare function getFrameworkMeta(framework: FrontendFramework): FrameworkMeta;
29
+ /**
30
+ * Detect framework from file extension
31
+ */
32
+ export declare function detectFrameworkFromExtension(filePath: string): FrontendFramework | null;
33
+ /**
34
+ * Get all supported file extensions
35
+ */
36
+ export declare function getAllSupportedExtensions(): string[];
37
+ /**
38
+ * Check if a file extension is supported
39
+ */
40
+ export declare function isSupportedExtension(filePath: string): boolean;
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frontend/frameworks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAS3E,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,iBAAiB,GAC1B,oBAAoB,CActB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,GAAG,aAAa,CAa5E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,MAAM,GACd,iBAAiB,GAAG,IAAI,CAa1B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAOpD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG9D"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * React Framework Build Configuration
3
+ *
4
+ * Provides build configuration specific to React applications,
5
+ * including JSX runtime, automatic import handling, and React-specific defines.
6
+ */
7
+ import type { FrameworkBuildConfig } from "../types.js";
8
+ /**
9
+ * Get React framework build configuration
10
+ */
11
+ export declare function getReactBuildConfig(): FrameworkBuildConfig;
12
+ /**
13
+ * Check if a file is a React component
14
+ */
15
+ export declare function isReactComponent(filePath: string): boolean;
16
+ /**
17
+ * Get React refresh preamble for development
18
+ */
19
+ export declare function getReactRefreshPreamble(): string;
20
+ /**
21
+ * React framework metadata
22
+ */
23
+ export declare const reactFrameworkMeta: {
24
+ name: "react";
25
+ displayName: string;
26
+ fileExtensions: string[];
27
+ componentExtensions: string[];
28
+ needsRefreshRuntime: boolean;
29
+ supportsHMR: boolean;
30
+ supportsSSR: boolean;
31
+ };
32
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/frontend/frameworks/react.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOrE;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,oBAAoB,CA6B1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAOhD;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CASrB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Solid Framework Build Configuration
3
+ *
4
+ * Provides build configuration specific to Solid applications,
5
+ * including Solid JSX transforms and Solid-specific optimizations.
6
+ */
7
+ import type { FrameworkBuildConfig } from "../types.js";
8
+ /**
9
+ * Get Solid framework build configuration
10
+ */
11
+ export declare function getSolidBuildConfig(): FrameworkBuildConfig;
12
+ /**
13
+ * Check if a file is a Solid component
14
+ */
15
+ export declare function isSolidComponent(filePath: string): boolean;
16
+ /**
17
+ * Get Solid refresh preamble for development
18
+ * Solid uses a different HMR mechanism than React
19
+ */
20
+ export declare function getSolidRefreshPreamble(): string;
21
+ /**
22
+ * Solid babel-like transform options
23
+ * For use with custom build configurations
24
+ */
25
+ export declare function getSolidTransformOptions(): {
26
+ generate: "dom";
27
+ hydratable: boolean;
28
+ runtime: "solid-js/web";
29
+ };
30
+ /**
31
+ * Solid framework metadata
32
+ */
33
+ export declare const solidFrameworkMeta: {
34
+ name: "solid";
35
+ displayName: string;
36
+ fileExtensions: string[];
37
+ componentExtensions: string[];
38
+ needsRefreshRuntime: boolean;
39
+ supportsHMR: boolean;
40
+ supportsSSR: boolean;
41
+ };
42
+ //# sourceMappingURL=solid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid.d.ts","sourceRoot":"","sources":["../../../src/frontend/frameworks/solid.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOrE;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,oBAAoB,CA+B1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAQhD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB;;;;EASvC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CASrB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Svelte Framework Build Configuration
3
+ *
4
+ * Provides build configuration specific to Svelte applications,
5
+ * including Svelte SFC support and Svelte-specific preprocessing.
6
+ */
7
+ import type { FrameworkBuildConfig } from "../types.js";
8
+ /**
9
+ * Get Svelte framework build configuration
10
+ */
11
+ export declare function getSvelteBuildConfig(): FrameworkBuildConfig;
12
+ /**
13
+ * Check if a file is a Svelte component
14
+ */
15
+ export declare function isSvelteComponent(filePath: string): boolean;
16
+ /**
17
+ * Get Svelte preprocessor configuration
18
+ * Returns configuration for svelte-preprocess
19
+ */
20
+ export declare function getSveltePreprocessConfig(): {
21
+ typescript: {
22
+ compilerOptions: {
23
+ allowJs: boolean;
24
+ checkJs: boolean;
25
+ };
26
+ };
27
+ postcss: boolean;
28
+ scss: {
29
+ prependData: string;
30
+ };
31
+ };
32
+ /**
33
+ * Svelte compiler options
34
+ */
35
+ export declare function getSvelteCompilerOptions(): {
36
+ cssHash: ({ hash, css, name, }: {
37
+ hash: (s: string) => string;
38
+ css: string;
39
+ name: string;
40
+ }) => string;
41
+ generate: "dom";
42
+ hydratable: boolean;
43
+ preserveWhitespace: boolean;
44
+ };
45
+ /**
46
+ * Svelte framework metadata
47
+ */
48
+ export declare const svelteFrameworkMeta: {
49
+ name: "svelte";
50
+ displayName: string;
51
+ fileExtensions: string[];
52
+ componentExtensions: string[];
53
+ needsRefreshRuntime: boolean;
54
+ supportsHMR: boolean;
55
+ supportsSSR: boolean;
56
+ };
57
+ //# sourceMappingURL=svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.d.ts","sourceRoot":"","sources":["../../../src/frontend/frameworks/svelte.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,oBAAoB,CA2B3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB;;;;;;;;;;;EAcxC;AAED;;GAEG;AACH,wBAAgB,wBAAwB;oCAOnC;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;;;;EAU9D;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CASrB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Vue Framework Build Configuration
3
+ *
4
+ * Provides build configuration specific to Vue applications,
5
+ * including Vue SFC support, JSX configuration, and Vue-specific defines.
6
+ */
7
+ import type { FrameworkBuildConfig } from "../types.js";
8
+ /**
9
+ * Get Vue framework build configuration
10
+ */
11
+ export declare function getVueBuildConfig(): FrameworkBuildConfig;
12
+ /**
13
+ * Check if a file is a Vue component
14
+ */
15
+ export declare function isVueComponent(filePath: string): boolean;
16
+ /**
17
+ * Check if a file uses Vue JSX
18
+ */
19
+ export declare function isVueJsx(filePath: string): boolean;
20
+ /**
21
+ * Get Vue SFC block types
22
+ */
23
+ export declare function getVueBlockTypes(): string[];
24
+ /**
25
+ * Vue framework metadata
26
+ */
27
+ export declare const vueFrameworkMeta: {
28
+ name: "vue";
29
+ displayName: string;
30
+ fileExtensions: string[];
31
+ componentExtensions: string[];
32
+ needsRefreshRuntime: boolean;
33
+ supportsHMR: boolean;
34
+ supportsSSR: boolean;
35
+ };
36
+ //# sourceMappingURL=vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../../src/frontend/frameworks/vue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,oBAAoB,CAiCxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CASrB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * HMR Client Script
3
+ *
4
+ * This script is injected into HTML pages to enable Hot Module Replacement.
5
+ * It handles WebSocket communication, module updates, and framework-specific HMR.
6
+ *
7
+ * The script is kept minimal (< 5KB) for fast injection.
8
+ *
9
+ * @module frontend/hmr-client
10
+ */
11
+ export declare const HMR_CLIENT_SCRIPT = "\n(function() {\n\t'use strict';\n\n\t// ============= Configuration =============\n\tconst HMR_CONFIG = {\n\t\treconnectInterval: 1000,\n\t\tmaxReconnectAttempts: 10,\n\t\theartbeatInterval: 30000,\n\t};\n\n\t// ============= State =============\n\tlet ws = null;\n\tlet clientId = null;\n\tlet reconnectAttempts = 0;\n\tlet reconnectTimer = null;\n\tlet heartbeatTimer = null;\n\tlet subscribedFiles = new Set();\n\tlet moduleCache = new Map();\n\tlet isConnecting = false;\n\n\t// ============= Framework Detection =============\n\tconst framework = detectFramework();\n\n\tfunction detectFramework() {\n\t\tif (typeof window === 'undefined') return 'unknown';\n\t\t\n\t\t// Check for React\n\t\tif (window.React || document.querySelector('[data-reactroot]') || \n\t\t\tdocument.querySelector('[data-reactid]')) {\n\t\t\treturn 'react';\n\t\t}\n\t\t\n\t\t// Check for Vue\n\t\tif (window.Vue || document.querySelector('[data-v-]') ||\n\t\t\tdocument.querySelector('[data-vue-app]')) {\n\t\t\treturn 'vue';\n\t\t}\n\t\t\n\t\t// Check for Svelte\n\t\tif (window.__SVELTE_HMR__ || document.querySelector('[data-svelte]')) {\n\t\t\treturn 'svelte';\n\t\t}\n\t\t\n\t\t// Check for Solid\n\t\tif (window.Solid$$ || document.querySelector('[data-solid]')) {\n\t\t\treturn 'solid';\n\t\t}\n\t\t\n\t\treturn 'unknown';\n\t}\n\n\t// ============= WebSocket Connection =============\n\tfunction connect() {\n\t\tif (isConnecting || (ws && ws.readyState === WebSocket.OPEN)) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tisConnecting = true;\n\t\t\n\t\t// Build WebSocket URL\n\t\tconst protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tconst host = window.location.hostname;\n\t\tconst port = getHMRPort();\n\t\tconst url = protocol + '//' + host + ':' + port + '/_hmr';\n\t\t\n\t\ttry {\n\t\t\tws = new WebSocket(url);\n\t\t\t\n\t\t\tws.onopen = handleOpen;\n\t\t\tws.onclose = handleClose;\n\t\t\tws.onerror = handleError;\n\t\t\tws.onmessage = handleMessage;\n\t\t} catch (e) {\n\t\t\tconsole.error('[HMR] Failed to create WebSocket:', e);\n\t\t\tisConnecting = false;\n\t\t\tscheduleReconnect();\n\t\t}\n\t}\n\n\tfunction getHMRPort() {\n\t\t// Try to get port from script tag or default to dev server port + 1\n\t\tconst scripts = document.querySelectorAll('script[data-hmr-port]');\n\t\tif (scripts.length > 0) {\n\t\t\treturn parseInt(scripts[0].getAttribute('data-hmr-port'), 10);\n\t\t}\n\t\treturn parseInt(window.location.port || '3000', 10) + 1;\n\t}\n\n\tfunction handleOpen() {\n\t\tisConnecting = false;\n\t\treconnectAttempts = 0;\n\t\tconsole.log('[HMR] Connected');\n\t\t\n\t\t// Start heartbeat\n\t\tstartHeartbeat();\n\t\t\n\t\t// Re-subscribe to files\n\t\tsubscribedFiles.forEach(function(fileId) {\n\t\t\tsendMessage({ type: 'subscribe', fileId: fileId });\n\t\t});\n\t}\n\n\tfunction handleClose(event) {\n\t\tisConnecting = false;\n\t\tstopHeartbeat();\n\t\t\n\t\tif (event.code !== 1000) {\n\t\t\tconsole.log('[HMR] Connection closed, attempting to reconnect...');\n\t\t\tscheduleReconnect();\n\t\t}\n\t}\n\n\tfunction handleError(error) {\n\t\tisConnecting = false;\n\t\tconsole.error('[HMR] WebSocket error:', error);\n\t}\n\n\tfunction scheduleReconnect() {\n\t\tif (reconnectTimer) {\n\t\t\tclearTimeout(reconnectTimer);\n\t\t}\n\t\t\n\t\tif (reconnectAttempts >= HMR_CONFIG.maxReconnectAttempts) {\n\t\t\tconsole.error('[HMR] Max reconnect attempts reached. Please refresh the page.');\n\t\t\tshowOverlay({\n\t\t\t\tmessage: 'HMR connection lost. Please refresh the page.',\n\t\t\t\ttype: 'error'\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\t\n\t\treconnectAttempts++;\n\t\tvar delay = HMR_CONFIG.reconnectInterval * reconnectAttempts;\n\t\t\n\t\treconnectTimer = setTimeout(function() {\n\t\t\tconsole.log('[HMR] Reconnecting... (attempt ' + reconnectAttempts + ')');\n\t\t\tconnect();\n\t\t}, delay);\n\t}\n\n\t// ============= Heartbeat =============\n\tfunction startHeartbeat() {\n\t\tstopHeartbeat();\n\t\theartbeatTimer = setInterval(function() {\n\t\t\tif (ws && ws.readyState === WebSocket.OPEN) {\n\t\t\t\tsendMessage({ type: 'ping' });\n\t\t\t}\n\t\t}, HMR_CONFIG.heartbeatInterval);\n\t}\n\n\tfunction stopHeartbeat() {\n\t\tif (heartbeatTimer) {\n\t\t\tclearInterval(heartbeatTimer);\n\t\t\theartbeatTimer = null;\n\t\t}\n\t}\n\n\t// ============= Message Handling =============\n\tfunction sendMessage(message) {\n\t\tif (ws && ws.readyState === WebSocket.OPEN) {\n\t\t\tws.send(JSON.stringify(message));\n\t\t}\n\t}\n\n\tfunction handleMessage(event) {\n\t\ttry {\n\t\t\tvar message = JSON.parse(event.data);\n\t\t\t\n\t\t\tswitch (message.type) {\n\t\t\t\tcase 'connected':\n\t\t\t\t\tclientId = message.clientId;\n\t\t\t\t\tconsole.log('[HMR] Client ID:', clientId);\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'pong':\n\t\t\t\t\t// Heartbeat response\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'update':\n\t\t\t\t\thandleUpdate(message);\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'reload':\n\t\t\t\t\thandleReload(message);\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 'error':\n\t\t\t\t\thandleError(message);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('[HMR] Failed to parse message:', e);\n\t\t}\n\t}\n\n\t// ============= Update Handling =============\n\tfunction handleUpdate(message) {\n\t\tconsole.log('[HMR] Update received:', message.fileId);\n\t\t\n\t\t// Hide any existing error overlay\n\t\thideOverlay();\n\t\t\n\t\tvar changes = message.changes || [];\n\t\tvar hasCSSUpdate = changes.some(function(file) {\n\t\t\treturn file.endsWith('.css') || file.endsWith('.scss') || \n\t\t\t\t file.endsWith('.sass') || file.endsWith('.less');\n\t\t});\n\t\t\n\t\tif (hasCSSUpdate) {\n\t\t\t// Handle CSS updates without flash\n\t\t\tupdateCSS(changes);\n\t\t}\n\t\t\n\t\t// Check if we can do hot update\n\t\tif (canHotUpdate(changes)) {\n\t\t\tperformHotUpdate(message);\n\t\t} else {\n\t\t\t// Fall back to full reload\n\t\t\tconsole.log('[HMR] Cannot hot update, reloading page...');\n\t\t\twindow.location.reload();\n\t\t}\n\t}\n\n\tfunction handleReload(message) {\n\t\tconsole.log('[HMR] Full reload requested');\n\t\thideOverlay();\n\t\twindow.location.reload();\n\t}\n\n\tfunction handleError(message) {\n\t\tconsole.error('[HMR] Error:', message.error);\n\t\tshowOverlay({\n\t\t\tmessage: message.error.message,\n\t\t\tstack: message.error.stack,\n\t\t\tfile: message.error.file,\n\t\t\tline: message.error.line,\n\t\t\tcolumn: message.error.column,\n\t\t\ttype: 'error'\n\t\t});\n\t}\n\n\t// ============= CSS Hot Update =============\n\tfunction updateCSS(changedFiles) {\n\t\tvar links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n\t\t\n\t\tlinks.forEach(function(link) {\n\t\t\tvar href = link.getAttribute('href');\n\t\t\tif (!href) return;\n\t\t\t\n\t\t\t// Check if this stylesheet is affected\n\t\t\tvar isAffected = changedFiles.some(function(file) {\n\t\t\t\treturn href.includes(file.replace(/^.*\\//, '')) ||\n\t\t\t\t\t file.includes(href.replace(/^.*\\//, ''));\n\t\t\t});\n\t\t\t\n\t\t\tif (isAffected) {\n\t\t\t\t// Add timestamp to force reload\n\t\t\t\tvar newHref = href.split('?')[0] + '?v=' + Date.now();\n\t\t\t\t\n\t\t\t\t// Create new link and swap\n\t\t\t\tvar newLink = document.createElement('link');\n\t\t\t\tnewLink.rel = 'stylesheet';\n\t\t\t\tnewLink.href = newHref;\n\t\t\t\t\n\t\t\t\tnewLink.onload = function() {\n\t\t\t\t\tlink.remove();\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tnewLink.onerror = function() {\n\t\t\t\t\tconsole.error('[HMR] Failed to reload CSS:', newHref);\n\t\t\t\t\tlink.remove();\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tlink.parentNode.insertBefore(newLink, link);\n\t\t\t}\n\t\t});\n\t}\n\n\t// ============= Hot Update Logic =============\n\tfunction canHotUpdate(changes) {\n\t\t// Check if all changed files can be hot updated\n\t\treturn changes.every(function(file) {\n\t\t\tvar ext = file.split('.').pop().toLowerCase();\n\t\t\t\n\t\t\t// CSS files can always be hot updated\n\t\t\tif (ext === 'css' || ext === 'scss' || ext === 'sass' || ext === 'less') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\t// JS/TS files need HMR boundary\n\t\t\tif (ext === 'js' || ext === 'jsx' || ext === 'ts' || ext === 'tsx') {\n\t\t\t\treturn hasHMRBoundary(file);\n\t\t\t}\n\t\t\t\n\t\t\t// Framework-specific files\n\t\t\tif (ext === 'vue' || ext === 'svelte') {\n\t\t\t\treturn true; // Vue and Svelte have built-in HMR\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tfunction hasHMRBoundary(file) {\n\t\t// Check if the module accepts hot updates\n\t\t// This is a simplified check - in production, we'd track this from the server\n\t\treturn true; // For now, assume all modules can be hot updated\n\t}\n\n\tfunction performHotUpdate(message) {\n\t\tvar changes = message.changes || [];\n\t\t\n\t\t// Framework-specific update handling\n\t\tswitch (framework) {\n\t\t\tcase 'react':\n\t\t\t\tperformReactUpdate(message);\n\t\t\t\tbreak;\n\t\t\tcase 'vue':\n\t\t\t\tperformVueUpdate(message);\n\t\t\t\tbreak;\n\t\t\tcase 'svelte':\n\t\t\t\tperformSvelteUpdate(message);\n\t\t\t\tbreak;\n\t\t\tcase 'solid':\n\t\t\t\tperformSolidUpdate(message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Generic update - reload scripts\n\t\t\t\tperformGenericUpdate(message);\n\t\t}\n\t}\n\n\t// ============= React Fast Refresh =============\n\tfunction performReactUpdate(message) {\n\t\tif (!window.__HMR_REACT_REFRESH__) {\n\t\t\t// React Refresh not available, fall back to reload\n\t\t\twindow.location.reload();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconsole.log('[HMR] Applying React Fast Refresh...');\n\t\t\n\t\t// Signal to React Refresh that an update is coming\n\t\tif (window.__REACT_REFRESH__) {\n\t\t\ttry {\n\t\t\t\tchanges.forEach(function(file) {\n\t\t\t\t\t// Invalidate the module\n\t\t\t\t\tinvalidateModule(file);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// Trigger React Refresh\n\t\t\t\twindow.__REACT_REFRESH__.performReactRefresh();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[HMR] React Fast Refresh failed:', e);\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t} else {\n\t\t\t// Fallback: reload the page\n\t\t\twindow.location.reload();\n\t\t}\n\t}\n\n\t// ============= Vue HMR =============\n\tfunction performVueUpdate(message) {\n\t\tconsole.log('[HMR] Applying Vue HMR...');\n\t\t\n\t\t// Vue's HMR is handled by vue-loader and vue-hot-reload-api\n\t\tif (window.__VUE_HMR__) {\n\t\t\ttry {\n\t\t\t\tmessage.changes.forEach(function(file) {\n\t\t\t\t\tif (file.endsWith('.vue')) {\n\t\t\t\t\t\twindow.__VUE_HMR__.rerender(file);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[HMR] Vue HMR failed:', e);\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t} else {\n\t\t\twindow.location.reload();\n\t\t}\n\t}\n\n\t// ============= Svelte HMR =============\n\tfunction performSvelteUpdate(message) {\n\t\tconsole.log('[HMR] Applying Svelte HMR...');\n\t\t\n\t\tif (window.__SVELTE_HMR__) {\n\t\t\ttry {\n\t\t\t\tmessage.changes.forEach(function(file) {\n\t\t\t\t\tif (file.endsWith('.svelte')) {\n\t\t\t\t\t\t// Svelte HMR preserves component state\n\t\t\t\t\t\twindow.__SVELTE_HMR__.update(file);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[HMR] Svelte HMR failed:', e);\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t} else {\n\t\t\twindow.location.reload();\n\t\t}\n\t}\n\n\t// ============= Solid HMR =============\n\tfunction performSolidUpdate(message) {\n\t\tconsole.log('[HMR] Applying Solid HMR...');\n\t\t\n\t\tif (window.__SOLID_HMR__) {\n\t\t\ttry {\n\t\t\t\tmessage.changes.forEach(function(file) {\n\t\t\t\t\tinvalidateModule(file);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\twindow.__SOLID_HMR__.update();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('[HMR] Solid HMR failed:', e);\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t} else {\n\t\t\twindow.location.reload();\n\t\t}\n\t}\n\n\t// ============= Generic Update =============\n\tfunction performGenericUpdate(message) {\n\t\tconsole.log('[HMR] Performing generic update...');\n\t\t\n\t\t// For unknown frameworks, reload scripts\n\t\tmessage.changes.forEach(function(file) {\n\t\t\tinvalidateModule(file);\n\t\t});\n\t\t\n\t\t// Reload the page as a fallback\n\t\twindow.location.reload();\n\t}\n\n\t// ============= Module Management =============\n\tfunction invalidateModule(fileId) {\n\t\tmoduleCache.delete(fileId);\n\t\t\n\t\t// Find and reload script tags\n\t\tvar scripts = document.querySelectorAll('script[src]');\n\t\tscripts.forEach(function(script) {\n\t\t\tvar src = script.getAttribute('src');\n\t\t\tif (src && src.includes(fileId)) {\n\t\t\t\treloadScript(script);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction reloadScript(oldScript) {\n\t\tvar src = oldScript.getAttribute('src');\n\t\tvar newSrc = src.split('?')[0] + '?v=' + Date.now();\n\t\t\n\t\tvar newScript = document.createElement('script');\n\t\tnewScript.src = newSrc;\n\t\tnewScript.type = oldScript.type || 'text/javascript';\n\t\tnewScript.async = false;\n\t\t\n\t\t// Copy attributes\n\t\tArray.from(oldScript.attributes).forEach(function(attr) {\n\t\t\tif (attr.name !== 'src') {\n\t\t\t\tnewScript.setAttribute(attr.name, attr.value);\n\t\t\t}\n\t\t});\n\t\t\n\t\toldScript.parentNode.replaceChild(newScript, oldScript);\n\t}\n\n\t// ============= Error Overlay =============\n\tfunction showOverlay(options) {\n\t\t// Remove existing overlay\n\t\thideOverlay();\n\t\t\n\t\tvar overlay = document.createElement('div');\n\t\toverlay.id = '__hmr-overlay__';\n\t\toverlay.style.cssText = [\n\t\t\t'position: fixed',\n\t\t\t'top: 0',\n\t\t\t'left: 0',\n\t\t\t'right: 0',\n\t\t\t'bottom: 0',\n\t\t\t'background: rgba(0, 0, 0, 0.85)',\n\t\t\t'z-index: 99999',\n\t\t\t'display: flex',\n\t\t\t'align-items: center',\n\t\t\t'justify-content: center',\n\t\t\t'font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n\t\t\t'color: white',\n\t\t\t'padding: 20px'\n\t\t].join(';');\n\t\t\n\t\tvar content = document.createElement('div');\n\t\tcontent.style.cssText = [\n\t\t\t'max-width: 800px',\n\t\t\t'max-height: 80vh',\n\t\t\t'overflow: auto',\n\t\t\t'background: #1a1a1a',\n\t\t\t'border-radius: 8px',\n\t\t\t'padding: 20px',\n\t\t\t'box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5)'\n\t\t].join(';');\n\t\t\n\t\tvar title = document.createElement('h2');\n\t\ttitle.style.cssText = 'color: #ff5555; margin: 0 0 15px 0; font-size: 18px;';\n\t\ttitle.textContent = 'HMR Error';\n\t\t\n\t\tvar message = document.createElement('pre');\n\t\tmessage.style.cssText = [\n\t\t\t'background: #282828',\n\t\t\t'padding: 15px',\n\t\t\t'border-radius: 4px',\n\t\t\t'overflow-x: auto',\n\t\t\t'font-size: 13px',\n\t\t\t'line-height: 1.5',\n\t\t\t'white-space: pre-wrap',\n\t\t\t'word-break: break-word'\n\t\t].join(';');\n\t\tmessage.textContent = options.message;\n\t\t\n\t\tcontent.appendChild(title);\n\t\tcontent.appendChild(message);\n\t\t\n\t\tif (options.stack) {\n\t\t\tvar stack = document.createElement('pre');\n\t\t\tstack.style.cssText = [\n\t\t\t\t'background: #282828',\n\t\t\t\t'padding: 15px',\n\t\t\t\t'border-radius: 4px',\n\t\t\t\t'margin-top: 10px',\n\t\t\t\t'font-size: 12px',\n\t\t\t\t'color: #888',\n\t\t\t\t'overflow-x: auto'\n\t\t\t].join(';');\n\t\t\tstack.textContent = options.stack;\n\t\t\tcontent.appendChild(stack);\n\t\t}\n\t\t\n\t\tif (options.file) {\n\t\t\tvar file = document.createElement('div');\n\t\t\tfile.style.cssText = 'margin-top: 15px; color: #888; font-size: 12px;';\n\t\t\tfile.textContent = 'File: ' + options.file + \n\t\t\t\t(options.line ? ':' + options.line + (options.column ? ':' + options.column : '') : '');\n\t\t\tcontent.appendChild(file);\n\t\t}\n\t\t\n\t\tvar closeBtn = document.createElement('button');\n\t\tcloseBtn.style.cssText = [\n\t\t\t'position: absolute',\n\t\t\t'top: 10px',\n\t\t\t'right: 10px',\n\t\t\t'background: transparent',\n\t\t\t'border: none',\n\t\t\t'color: #888',\n\t\t\t'font-size: 20px',\n\t\t\t'cursor: pointer',\n\t\t\t'padding: 5px'\n\t\t].join(';');\n\t\tcloseBtn.textContent = '\u00D7';\n\t\tcloseBtn.onclick = hideOverlay;\n\t\t\n\t\toverlay.style.position = 'relative';\n\t\toverlay.appendChild(closeBtn);\n\t\toverlay.appendChild(content);\n\t\t\n\t\tdocument.body.appendChild(overlay);\n\t}\n\n\tfunction hideOverlay() {\n\t\tvar overlay = document.getElementById('__hmr-overlay__');\n\t\tif (overlay) {\n\t\t\toverlay.remove();\n\t\t}\n\t}\n\n\t// ============= Subscription Management =============\n\tfunction subscribe(fileId) {\n\t\tsubscribedFiles.add(fileId);\n\t\tsendMessage({ type: 'subscribe', fileId: fileId });\n\t}\n\n\tfunction unsubscribe(fileId) {\n\t\tsubscribedFiles.delete(fileId);\n\t\tsendMessage({ type: 'unsubscribe', fileId: fileId });\n\t}\n\n\t// ============= Initialization =============\n\tfunction init() {\n\t\t// Connect to HMR server\n\t\tconnect();\n\t\t\n\t\t// Subscribe to current page\n\t\tvar currentFile = window.location.pathname;\n\t\tsubscribe(currentFile);\n\t\t\n\t\t// Expose HMR API\n\t\twindow.__HMR__ = {\n\t\t\tsubscribe: subscribe,\n\t\t\tunsubscribe: unsubscribe,\n\t\t\tconnect: connect,\n\t\t\tclientId: function() { return clientId; },\n\t\t\tframework: framework\n\t\t};\n\t\t\n\t\tconsole.log('[HMR] Client initialized (framework: ' + framework + ')');\n\t}\n\n\t// Start when DOM is ready\n\tif (document.readyState === 'complete') {\n\t\tinit();\n\t} else {\n\t\tdocument.addEventListener('DOMContentLoaded', init);\n\t}\n})();\n";
12
+ /**
13
+ * Get the HMR client script with optional configuration
14
+ */
15
+ export declare function getHMRClientScript(options?: {
16
+ port?: number;
17
+ }): string;
18
+ /**
19
+ * Inject HMR client script into HTML content
20
+ */
21
+ export declare function injectHMRScript(html: string, port?: number): string;
22
+ //# sourceMappingURL=hmr-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr-client.d.ts","sourceRoot":"","sources":["../../src/frontend/hmr-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,eAAO,MAAM,iBAAiB,m7hBAwmB7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAQT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBnE"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Hot Module Replacement (HMR) Implementation
3
+ *
4
+ * Provides live updates without full page refreshes for a better developer experience.
5
+ * Supports React Fast Refresh, Vue Hot Component Replacement, Svelte HMR, and Solid Hot Reloading.
6
+ *
7
+ * @module frontend/hmr
8
+ */
9
+ import type { FrontendFramework, HMRConfig, HMRUpdate, HMRUpdateError } from "./types.js";
10
+ /**
11
+ * Manages Hot Module Replacement for the development server.
12
+ *
13
+ * Features:
14
+ * - WebSocket server for client communication
15
+ * - File watching with dependency tracking
16
+ * - Framework-specific HMR support (React, Vue, Svelte, Solid)
17
+ * - Debounced file change handling
18
+ * - Error overlay support
19
+ */
20
+ export declare class HMRManager {
21
+ private config;
22
+ private logger;
23
+ private clients;
24
+ private dependencyGraph;
25
+ private pendingUpdates;
26
+ private debounceTimer;
27
+ private framework;
28
+ private devServerPort;
29
+ private watcher;
30
+ constructor(framework: FrontendFramework, devServerPort: number, config?: Partial<HMRConfig>);
31
+ /**
32
+ * Normalize partial config to full config with defaults
33
+ */
34
+ private normalizeConfig;
35
+ /**
36
+ * Get the HMR client script for injection
37
+ */
38
+ getClientScript(): string;
39
+ /**
40
+ * Get the WebSocket URL for HMR
41
+ */
42
+ getWebSocketUrl(): string;
43
+ /**
44
+ * Get the HMR port
45
+ */
46
+ getPort(): number;
47
+ /**
48
+ * Check if HMR is enabled
49
+ */
50
+ isEnabled(): boolean;
51
+ /**
52
+ * Handle WebSocket upgrade request
53
+ */
54
+ handleUpgrade(request: Request): WebSocket | null;
55
+ /**
56
+ * Handle fetch requests for WebSocket server
57
+ */
58
+ private handleWebSocketFetch;
59
+ /**
60
+ * Handle WebSocket connection open
61
+ */
62
+ private handleWebSocketOpen;
63
+ /**
64
+ * Handle WebSocket connection close
65
+ */
66
+ private handleWebSocketClose;
67
+ /**
68
+ * Handle WebSocket message from client
69
+ */
70
+ private handleWebSocketMessage;
71
+ /**
72
+ * Send message to a WebSocket client
73
+ */
74
+ private sendToClient;
75
+ /**
76
+ * Broadcast update to all connected clients
77
+ */
78
+ broadcastUpdate(update: HMRUpdate): void;
79
+ /**
80
+ * Start file watching
81
+ */
82
+ startWatching(rootDir: string): void;
83
+ /**
84
+ * Stop file watching
85
+ */
86
+ stopWatching(): void;
87
+ /**
88
+ * Handle a file change event
89
+ */
90
+ private handleFileChange;
91
+ /**
92
+ * Check if a file should be ignored
93
+ */
94
+ private shouldIgnoreFile;
95
+ /**
96
+ * Schedule debounced update processing
97
+ */
98
+ private scheduleDebouncedUpdate;
99
+ /**
100
+ * Process all pending file updates
101
+ */
102
+ private processPendingUpdates;
103
+ /**
104
+ * Determine the type of update needed
105
+ */
106
+ private determineUpdateType;
107
+ /**
108
+ * Handle module accepted from client
109
+ */
110
+ private handleModuleAccepted;
111
+ /**
112
+ * Register a file in the dependency graph
113
+ */
114
+ registerFile(filePath: string, imports?: string[]): void;
115
+ /**
116
+ * Get files that depend on a given file
117
+ */
118
+ getDependents(filePath: string): string[];
119
+ /**
120
+ * Get files that a file imports
121
+ */
122
+ getImports(filePath: string): string[];
123
+ /**
124
+ * Broadcast an error to all clients
125
+ */
126
+ broadcastError(error: Error | HMRUpdateError): void;
127
+ /**
128
+ * Generate a unique client ID
129
+ */
130
+ private generateClientId;
131
+ /**
132
+ * Generate a file ID from a file path
133
+ */
134
+ private generateFileId;
135
+ /**
136
+ * Get the number of connected clients
137
+ */
138
+ getClientCount(): number;
139
+ /**
140
+ * Get all connected client IDs
141
+ */
142
+ getClientIds(): string[];
143
+ /**
144
+ * Disconnect all clients
145
+ */
146
+ disconnectAll(): void;
147
+ /**
148
+ * Stop the HMR manager
149
+ */
150
+ stop(): void;
151
+ /**
152
+ * Get framework-specific HMR runtime code
153
+ */
154
+ getFrameworkRuntime(): string;
155
+ /**
156
+ * React Fast Refresh runtime
157
+ */
158
+ private getReactRuntime;
159
+ /**
160
+ * Vue HMR runtime
161
+ */
162
+ private getVueRuntime;
163
+ /**
164
+ * Svelte HMR runtime
165
+ */
166
+ private getSvelteRuntime;
167
+ /**
168
+ * Solid HMR runtime
169
+ */
170
+ private getSolidRuntime;
171
+ }
172
+ /**
173
+ * Create an HMR manager
174
+ */
175
+ export declare function createHMRManager(framework: FrontendFramework, devServerPort: number, config?: Partial<HMRConfig>): HMRManager;
176
+ /**
177
+ * Check if a file is an HMR boundary
178
+ * (a file that can accept hot updates without propagating to parents)
179
+ */
180
+ export declare function isHMRBoundary(filePath: string, content: string): boolean;
181
+ /**
182
+ * Parse imports from a file's content
183
+ */
184
+ export declare function parseImports(content: string, filePath: string): string[];
185
+ //# sourceMappingURL=hmr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/frontend/hmr.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAEX,iBAAiB,EAGjB,SAAS,EAGT,SAAS,EACT,cAAc,EACd,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAsD;gBAGpE,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAY5B;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IA+BjD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAqBxC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAwCpC;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,IAAI;IAmB5D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IASzC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAStC;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,cAAc,GAAG,IAAI;IAoBnD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,aAAa,IAAI,IAAI;IAWrB;;OAEG;IACH,IAAI,IAAI,IAAI;IAcZ;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAe7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUvB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACzB,UAAU,CAEZ;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CASxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BxE"}