davaux 0.8.0

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 (333) hide show
  1. package/BASELINE.md +169 -0
  2. package/CLAUDE.md +518 -0
  3. package/LICENSE +21 -0
  4. package/README.md +36 -0
  5. package/ROADMAP.md +198 -0
  6. package/build.mjs +101 -0
  7. package/client/control.ts +247 -0
  8. package/client/hydrate.ts +37 -0
  9. package/client/index.ts +19 -0
  10. package/client/jsx-runtime.ts +209 -0
  11. package/client/resource.ts +122 -0
  12. package/client/signal.ts +211 -0
  13. package/client/store.ts +110 -0
  14. package/client/useHead.ts +63 -0
  15. package/dist/build/config.d.ts +3 -0
  16. package/dist/build/config.d.ts.map +1 -0
  17. package/dist/build/config.js +38 -0
  18. package/dist/build/config.js.map +7 -0
  19. package/dist/build/index.d.ts +2 -0
  20. package/dist/build/index.d.ts.map +1 -0
  21. package/dist/build/index.js +13 -0
  22. package/dist/build/index.js.map +7 -0
  23. package/dist/build/plugins.d.ts +7 -0
  24. package/dist/build/plugins.d.ts.map +1 -0
  25. package/dist/build/plugins.js +85 -0
  26. package/dist/build/plugins.js.map +7 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +427 -0
  30. package/dist/cli.js.map +7 -0
  31. package/dist/client/control.d.ts +49 -0
  32. package/dist/client/control.d.ts.map +1 -0
  33. package/dist/client/control.js +154 -0
  34. package/dist/client/control.js.map +7 -0
  35. package/dist/client/hydrate.d.ts +7 -0
  36. package/dist/client/hydrate.d.ts.map +1 -0
  37. package/dist/client/hydrate.js +23 -0
  38. package/dist/client/hydrate.js.map +7 -0
  39. package/dist/client/index.d.ts +12 -0
  40. package/dist/client/index.d.ts.map +1 -0
  41. package/dist/client/index.js +32 -0
  42. package/dist/client/index.js.map +7 -0
  43. package/dist/client/jsx-runtime.d.ts +40 -0
  44. package/dist/client/jsx-runtime.d.ts.map +1 -0
  45. package/dist/client/jsx-runtime.js +139 -0
  46. package/dist/client/jsx-runtime.js.map +7 -0
  47. package/dist/client/resource.d.ts +31 -0
  48. package/dist/client/resource.d.ts.map +1 -0
  49. package/dist/client/resource.js +64 -0
  50. package/dist/client/resource.js.map +7 -0
  51. package/dist/client/signal.d.ts +90 -0
  52. package/dist/client/signal.d.ts.map +1 -0
  53. package/dist/client/signal.js +115 -0
  54. package/dist/client/signal.js.map +7 -0
  55. package/dist/client/store.d.ts +26 -0
  56. package/dist/client/store.d.ts.map +1 -0
  57. package/dist/client/store.js +63 -0
  58. package/dist/client/store.js.map +7 -0
  59. package/dist/client/useHead.d.ts +28 -0
  60. package/dist/client/useHead.d.ts.map +1 -0
  61. package/dist/client/useHead.js +33 -0
  62. package/dist/client/useHead.js.map +7 -0
  63. package/dist/config.d.ts +182 -0
  64. package/dist/config.d.ts.map +1 -0
  65. package/dist/config.js +21 -0
  66. package/dist/config.js.map +7 -0
  67. package/dist/create-multisite.d.ts +2 -0
  68. package/dist/create-multisite.d.ts.map +1 -0
  69. package/dist/create-multisite.js +291 -0
  70. package/dist/create-multisite.js.map +7 -0
  71. package/dist/create.d.ts +2 -0
  72. package/dist/create.d.ts.map +1 -0
  73. package/dist/create.js +179 -0
  74. package/dist/create.js.map +7 -0
  75. package/dist/dev/blueprints.d.ts +11 -0
  76. package/dist/dev/blueprints.d.ts.map +1 -0
  77. package/dist/dev/blueprints.js +65 -0
  78. package/dist/dev/blueprints.js.map +7 -0
  79. package/dist/dev/components.d.ts +19 -0
  80. package/dist/dev/components.d.ts.map +1 -0
  81. package/dist/dev/components.js +87 -0
  82. package/dist/dev/components.js.map +7 -0
  83. package/dist/dev/insert.d.ts +11 -0
  84. package/dist/dev/insert.d.ts.map +1 -0
  85. package/dist/dev/insert.js +160 -0
  86. package/dist/dev/insert.js.map +7 -0
  87. package/dist/dev/remove.d.ts +53 -0
  88. package/dist/dev/remove.d.ts.map +1 -0
  89. package/dist/dev/remove.js +518 -0
  90. package/dist/dev/remove.js.map +7 -0
  91. package/dist/dev/watch.d.ts +26 -0
  92. package/dist/dev/watch.d.ts.map +1 -0
  93. package/dist/dev/watch.js +2905 -0
  94. package/dist/dev/watch.js.map +7 -0
  95. package/dist/errors.d.ts +6 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +63 -0
  98. package/dist/errors.js.map +7 -0
  99. package/dist/generate.d.ts +2 -0
  100. package/dist/generate.d.ts.map +1 -0
  101. package/dist/generate.js +191 -0
  102. package/dist/generate.js.map +7 -0
  103. package/dist/index.d.ts +9 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +57 -0
  106. package/dist/index.js.map +7 -0
  107. package/dist/island.d.ts +24 -0
  108. package/dist/island.d.ts.map +1 -0
  109. package/dist/island.js +15 -0
  110. package/dist/island.js.map +7 -0
  111. package/dist/jsx-runtime.d.ts +406 -0
  112. package/dist/jsx-runtime.d.ts.map +1 -0
  113. package/dist/jsx-runtime.js +90 -0
  114. package/dist/jsx-runtime.js.map +7 -0
  115. package/dist/link.d.ts +27 -0
  116. package/dist/link.d.ts.map +1 -0
  117. package/dist/link.js +29 -0
  118. package/dist/link.js.map +7 -0
  119. package/dist/oml/fragment.d.ts +16 -0
  120. package/dist/oml/fragment.d.ts.map +1 -0
  121. package/dist/oml/fragment.js +26 -0
  122. package/dist/oml/fragment.js.map +7 -0
  123. package/dist/oml/index.d.ts +11 -0
  124. package/dist/oml/index.d.ts.map +1 -0
  125. package/dist/oml/index.js +21 -0
  126. package/dist/oml/index.js.map +7 -0
  127. package/dist/oml/jsx-runtime.d.ts +34 -0
  128. package/dist/oml/jsx-runtime.d.ts.map +1 -0
  129. package/dist/oml/jsx-runtime.js +59 -0
  130. package/dist/oml/jsx-runtime.js.map +7 -0
  131. package/dist/oml/jsx.d.ts +14 -0
  132. package/dist/oml/jsx.d.ts.map +1 -0
  133. package/dist/oml/jsx.js +96 -0
  134. package/dist/oml/jsx.js.map +7 -0
  135. package/dist/oml/page.d.ts +7 -0
  136. package/dist/oml/page.d.ts.map +1 -0
  137. package/dist/oml/page.js +6 -0
  138. package/dist/oml/page.js.map +7 -0
  139. package/dist/oml/render.d.ts +13 -0
  140. package/dist/oml/render.d.ts.map +1 -0
  141. package/dist/oml/render.js +117 -0
  142. package/dist/oml/render.js.map +7 -0
  143. package/dist/oml/types.d.ts +79 -0
  144. package/dist/oml/types.d.ts.map +1 -0
  145. package/dist/oml/types.js +64 -0
  146. package/dist/oml/types.js.map +7 -0
  147. package/dist/router/handler.d.ts +53 -0
  148. package/dist/router/handler.d.ts.map +1 -0
  149. package/dist/router/handler.js +342 -0
  150. package/dist/router/handler.js.map +7 -0
  151. package/dist/router/matcher.d.ts +21 -0
  152. package/dist/router/matcher.d.ts.map +1 -0
  153. package/dist/router/matcher.js +28 -0
  154. package/dist/router/matcher.js.map +7 -0
  155. package/dist/router/scanner.d.ts +17 -0
  156. package/dist/router/scanner.d.ts.map +1 -0
  157. package/dist/router/scanner.js +197 -0
  158. package/dist/router/scanner.js.map +7 -0
  159. package/dist/server/index.d.ts +23 -0
  160. package/dist/server/index.d.ts.map +1 -0
  161. package/dist/server/index.js +29 -0
  162. package/dist/server/index.js.map +7 -0
  163. package/dist/signal.d.ts +15 -0
  164. package/dist/signal.d.ts.map +1 -0
  165. package/dist/signal.js +29 -0
  166. package/dist/signal.js.map +7 -0
  167. package/dist/ssg.d.ts +45 -0
  168. package/dist/ssg.d.ts.map +1 -0
  169. package/dist/ssg.js +175 -0
  170. package/dist/ssg.js.map +7 -0
  171. package/dist/test/actions.test.d.ts +2 -0
  172. package/dist/test/actions.test.d.ts.map +1 -0
  173. package/dist/test/body-limits.test.d.ts +2 -0
  174. package/dist/test/body-limits.test.d.ts.map +1 -0
  175. package/dist/test/errors.test.d.ts +2 -0
  176. package/dist/test/errors.test.d.ts.map +1 -0
  177. package/dist/test/fixtures/routes/[id].page.d.ts +4 -0
  178. package/dist/test/fixtures/routes/[id].page.d.ts.map +1 -0
  179. package/dist/test/fixtures/routes/_error.d.ts +3 -0
  180. package/dist/test/fixtures/routes/_error.d.ts.map +1 -0
  181. package/dist/test/fixtures/routes/_global.d.ts +3 -0
  182. package/dist/test/fixtures/routes/_global.d.ts.map +1 -0
  183. package/dist/test/fixtures/routes/_layout-template.d.ts +3 -0
  184. package/dist/test/fixtures/routes/_layout-template.d.ts.map +1 -0
  185. package/dist/test/fixtures/routes/_layout.d.ts +3 -0
  186. package/dist/test/fixtures/routes/_layout.d.ts.map +1 -0
  187. package/dist/test/fixtures/routes/_layout_scripts.d.ts +3 -0
  188. package/dist/test/fixtures/routes/_layout_scripts.d.ts.map +1 -0
  189. package/dist/test/fixtures/routes/_middleware.d.ts +3 -0
  190. package/dist/test/fixtures/routes/_middleware.d.ts.map +1 -0
  191. package/dist/test/fixtures/routes/_redirect301_mw.d.ts +3 -0
  192. package/dist/test/fixtures/routes/_redirect301_mw.d.ts.map +1 -0
  193. package/dist/test/fixtures/routes/_redirect_mw.d.ts +3 -0
  194. package/dist/test/fixtures/routes/_redirect_mw.d.ts.map +1 -0
  195. package/dist/test/fixtures/routes/about.page.d.ts +3 -0
  196. package/dist/test/fixtures/routes/about.page.d.ts.map +1 -0
  197. package/dist/test/fixtures/routes/action.page.d.ts +6 -0
  198. package/dist/test/fixtures/routes/action.page.d.ts.map +1 -0
  199. package/dist/test/fixtures/routes/api/form-all.post.d.ts +3 -0
  200. package/dist/test/fixtures/routes/api/form-all.post.d.ts.map +1 -0
  201. package/dist/test/fixtures/routes/api/form-limited.post.d.ts +6 -0
  202. package/dist/test/fixtures/routes/api/form-limited.post.d.ts.map +1 -0
  203. package/dist/test/fixtures/routes/api/response-obj.get.d.ts +3 -0
  204. package/dist/test/fixtures/routes/api/response-obj.get.d.ts.map +1 -0
  205. package/dist/test/fixtures/routes/api/upload.post.d.ts +12 -0
  206. package/dist/test/fixtures/routes/api/upload.post.d.ts.map +1 -0
  207. package/dist/test/fixtures/routes/api/users.get.d.ts +6 -0
  208. package/dist/test/fixtures/routes/api/users.get.d.ts.map +1 -0
  209. package/dist/test/fixtures/routes/api/xml.get.d.ts +3 -0
  210. package/dist/test/fixtures/routes/api/xml.get.d.ts.map +1 -0
  211. package/dist/test/fixtures/routes/auth/_middleware.d.ts +3 -0
  212. package/dist/test/fixtures/routes/auth/_middleware.d.ts.map +1 -0
  213. package/dist/test/fixtures/routes/auth/protected.page.d.ts +3 -0
  214. package/dist/test/fixtures/routes/auth/protected.page.d.ts.map +1 -0
  215. package/dist/test/fixtures/routes/index.page.d.ts +3 -0
  216. package/dist/test/fixtures/routes/index.page.d.ts.map +1 -0
  217. package/dist/test/fixtures/routes/oml.page.d.ts +3 -0
  218. package/dist/test/fixtures/routes/oml.page.d.ts.map +1 -0
  219. package/dist/test/fixtures/routes/redirect.page.d.ts +3 -0
  220. package/dist/test/fixtures/routes/redirect.page.d.ts.map +1 -0
  221. package/dist/test/fixtures/routes/ssg/[slug].page.d.ts +5 -0
  222. package/dist/test/fixtures/routes/ssg/[slug].page.d.ts.map +1 -0
  223. package/dist/test/fixtures/routes/ssg/server.page.d.ts +4 -0
  224. package/dist/test/fixtures/routes/ssg/server.page.d.ts.map +1 -0
  225. package/dist/test/fixtures/routes/state.page.d.ts +3 -0
  226. package/dist/test/fixtures/routes/state.page.d.ts.map +1 -0
  227. package/dist/test/fixtures/routes/throw.page.d.ts +3 -0
  228. package/dist/test/fixtures/routes/throw.page.d.ts.map +1 -0
  229. package/dist/test/fixtures/routes/wiki/[...slug].page.d.ts +3 -0
  230. package/dist/test/fixtures/routes/wiki/[...slug].page.d.ts.map +1 -0
  231. package/dist/test/helpers.d.ts +37 -0
  232. package/dist/test/helpers.d.ts.map +1 -0
  233. package/dist/test/layouts.test.d.ts +2 -0
  234. package/dist/test/layouts.test.d.ts.map +1 -0
  235. package/dist/test/middleware.test.d.ts +2 -0
  236. package/dist/test/middleware.test.d.ts.map +1 -0
  237. package/dist/test/multipart.test.d.ts +2 -0
  238. package/dist/test/multipart.test.d.ts.map +1 -0
  239. package/dist/test/oml-routing.test.d.ts +2 -0
  240. package/dist/test/oml-routing.test.d.ts.map +1 -0
  241. package/dist/test/oml.test.d.ts +2 -0
  242. package/dist/test/oml.test.d.ts.map +1 -0
  243. package/dist/test/redirects.test.d.ts +2 -0
  244. package/dist/test/redirects.test.d.ts.map +1 -0
  245. package/dist/test/routing.test.d.ts +2 -0
  246. package/dist/test/routing.test.d.ts.map +1 -0
  247. package/dist/test/ssg.test.d.ts +2 -0
  248. package/dist/test/ssg.test.d.ts.map +1 -0
  249. package/dist/test/web-response.test.d.ts +2 -0
  250. package/dist/test/web-response.test.d.ts.map +1 -0
  251. package/dist/types.d.ts +314 -0
  252. package/dist/types.d.ts.map +1 -0
  253. package/dist/types.js +292 -0
  254. package/dist/types.js.map +7 -0
  255. package/package.json +103 -0
  256. package/pka.config.json +32 -0
  257. package/src/build/config.ts +42 -0
  258. package/src/build/index.ts +6 -0
  259. package/src/build/plugins.ts +118 -0
  260. package/src/cli.ts +502 -0
  261. package/src/config.ts +197 -0
  262. package/src/create-multisite.ts +310 -0
  263. package/src/create.ts +194 -0
  264. package/src/dev/blueprints.ts +75 -0
  265. package/src/dev/components.ts +108 -0
  266. package/src/dev/insert.ts +221 -0
  267. package/src/dev/remove.ts +677 -0
  268. package/src/dev/watch.ts +3098 -0
  269. package/src/env.d.ts +5 -0
  270. package/src/errors.ts +64 -0
  271. package/src/generate.ts +228 -0
  272. package/src/index.ts +67 -0
  273. package/src/island.ts +47 -0
  274. package/src/jsx-runtime.d.ts +408 -0
  275. package/src/jsx-runtime.d.ts.map +1 -0
  276. package/src/jsx-runtime.ts +536 -0
  277. package/src/link.ts +49 -0
  278. package/src/oml/fragment.ts +54 -0
  279. package/src/oml/index.ts +21 -0
  280. package/src/oml/jsx-runtime.ts +121 -0
  281. package/src/oml/jsx.ts +151 -0
  282. package/src/oml/page.ts +13 -0
  283. package/src/oml/render.ts +181 -0
  284. package/src/oml/types.ts +159 -0
  285. package/src/router/handler.ts +515 -0
  286. package/src/router/matcher.ts +52 -0
  287. package/src/router/scanner.ts +272 -0
  288. package/src/server/index.ts +49 -0
  289. package/src/signal.ts +39 -0
  290. package/src/ssg.ts +253 -0
  291. package/src/test/actions.test.ts +40 -0
  292. package/src/test/body-limits.test.ts +83 -0
  293. package/src/test/errors.test.ts +53 -0
  294. package/src/test/fixtures/routes/[id].page.ts +3 -0
  295. package/src/test/fixtures/routes/_error.ts +6 -0
  296. package/src/test/fixtures/routes/_global.ts +8 -0
  297. package/src/test/fixtures/routes/_layout-template.ts +7 -0
  298. package/src/test/fixtures/routes/_layout.ts +7 -0
  299. package/src/test/fixtures/routes/_layout_scripts.ts +8 -0
  300. package/src/test/fixtures/routes/_middleware.ts +8 -0
  301. package/src/test/fixtures/routes/_redirect301_mw.ts +5 -0
  302. package/src/test/fixtures/routes/_redirect_mw.ts +5 -0
  303. package/src/test/fixtures/routes/about.page.ts +6 -0
  304. package/src/test/fixtures/routes/action.page.ts +11 -0
  305. package/src/test/fixtures/routes/api/form-all.post.ts +5 -0
  306. package/src/test/fixtures/routes/api/form-limited.post.ts +6 -0
  307. package/src/test/fixtures/routes/api/response-obj.get.ts +17 -0
  308. package/src/test/fixtures/routes/api/upload.post.ts +14 -0
  309. package/src/test/fixtures/routes/api/users.get.ts +3 -0
  310. package/src/test/fixtures/routes/api/xml.get.ts +5 -0
  311. package/src/test/fixtures/routes/auth/_middleware.ts +11 -0
  312. package/src/test/fixtures/routes/auth/protected.page.ts +3 -0
  313. package/src/test/fixtures/routes/index.page.ts +3 -0
  314. package/src/test/fixtures/routes/oml.page.ts +7 -0
  315. package/src/test/fixtures/routes/redirect.page.ts +3 -0
  316. package/src/test/fixtures/routes/ssg/[slug].page.ts +8 -0
  317. package/src/test/fixtures/routes/ssg/server.page.ts +5 -0
  318. package/src/test/fixtures/routes/state.page.ts +4 -0
  319. package/src/test/fixtures/routes/throw.page.ts +5 -0
  320. package/src/test/fixtures/routes/wiki/[...slug].page.ts +3 -0
  321. package/src/test/helpers.ts +132 -0
  322. package/src/test/layouts.test.ts +76 -0
  323. package/src/test/middleware.test.ts +69 -0
  324. package/src/test/multipart.test.ts +91 -0
  325. package/src/test/oml-routing.test.ts +59 -0
  326. package/src/test/oml.test.ts +429 -0
  327. package/src/test/redirects.test.ts +32 -0
  328. package/src/test/routing.test.ts +118 -0
  329. package/src/test/ssg.test.ts +273 -0
  330. package/src/test/web-response.test.ts +33 -0
  331. package/src/types.ts +670 -0
  332. package/tsconfig.client.json +17 -0
  333. package/tsconfig.json +20 -0
package/dist/cli.js ADDED
@@ -0,0 +1,427 @@
1
+ #!/usr/bin/env node
2
+ import { createReadStream, existsSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
3
+ import { createServer } from "node:http";
4
+ import { createRequire } from "node:module";
5
+ import { extname, join, resolve } from "node:path";
6
+ import { collectCss, generateIslandsEntry, islandServerPlugin } from "./build/plugins.js";
7
+ import { collectEsbuildPlugins, collectScannerSuffixes, pathsToAlias } from "./config.js";
8
+ import { handleBuildError } from "./errors.js";
9
+ const [, , command, ...args] = process.argv;
10
+ const cwd = process.cwd();
11
+ switch (command) {
12
+ case "create":
13
+ await runCreate();
14
+ break;
15
+ case "create-multisite":
16
+ await runCreateMultisite();
17
+ break;
18
+ case "generate":
19
+ await runGenerate();
20
+ break;
21
+ case "dev":
22
+ await runDev();
23
+ break;
24
+ case "build":
25
+ await runBuild();
26
+ break;
27
+ case "static":
28
+ await runStatic();
29
+ break;
30
+ case "start":
31
+ await runStart();
32
+ break;
33
+ case "preview":
34
+ await runPreview();
35
+ break;
36
+ default:
37
+ console.error(`davaux: unknown command "${command ?? ""}"`);
38
+ console.error(
39
+ " Usage: davaux <create|create-multisite|generate|dev|build|start|static|preview> [options]"
40
+ );
41
+ process.exit(1);
42
+ }
43
+ async function runCreate() {
44
+ const { scaffold } = await import("./create.js");
45
+ await scaffold(args[0], cwd);
46
+ }
47
+ async function runCreateMultisite() {
48
+ const { scaffoldMultisite } = await import("./create-multisite.js");
49
+ await scaffoldMultisite(args[0], cwd);
50
+ }
51
+ async function runGenerate() {
52
+ const { generate } = await import("./generate.js");
53
+ generate(args, cwd);
54
+ }
55
+ async function runDev() {
56
+ loadEnv(cwd);
57
+ const serverSrc = resolve(cwd, "server.ts");
58
+ if (existsSync(serverSrc)) {
59
+ console.warn("[davaux] server.ts detected \u2014 custom server entry is not used in dev mode");
60
+ console.warn(
61
+ ' Use "node --watch --import tsx/esm server.ts" to develop with your custom server'
62
+ );
63
+ }
64
+ const { startDev } = await import("./dev/watch.js");
65
+ const { loadConfig } = await import("./build/config.js");
66
+ const config = await loadConfig(cwd);
67
+ const middlewareSrc = resolve(cwd, "src", "middleware.ts");
68
+ await startDev({
69
+ cwd,
70
+ port: Number(getFlag("--port", args) ?? config.server?.port ?? 3e3),
71
+ hostname: getFlag("--hostname", args) ?? config.server?.hostname ?? "localhost",
72
+ paths: config.paths,
73
+ plugins: config.plugins ?? [],
74
+ external: config.external,
75
+ middlewareSrc: existsSync(middlewareSrc) ? middlewareSrc : void 0,
76
+ editor: config.editor
77
+ });
78
+ }
79
+ async function runBuild() {
80
+ rmSync(resolve(cwd, "dist"), { recursive: true, force: true });
81
+ const { build } = await import("esbuild");
82
+ const { loadConfig } = await import("./build/config.js");
83
+ const config = await loadConfig(cwd);
84
+ const davauxPlugins = config.plugins ?? [];
85
+ const extraPlugins = collectEsbuildPlugins(davauxPlugins);
86
+ const extraSuffixes = collectScannerSuffixes(davauxPlugins);
87
+ const userAlias = pathsToAlias(config.paths ?? {});
88
+ const routesDir = resolve(cwd, "src", "routes");
89
+ const islandsDir = resolve(cwd, "src", "islands");
90
+ if (!existsSync(routesDir)) {
91
+ console.error(`[davaux] No routes directory found at ${routesDir}`);
92
+ process.exit(1);
93
+ }
94
+ const { scanRoutes } = await import("./router/scanner.js");
95
+ const { scanIslands } = await import("./router/scanner.js");
96
+ const { routes, layouts, middlewares, errorPage } = await scanRoutes(routesDir, extraSuffixes);
97
+ const islands = await scanIslands(islandsDir);
98
+ const outDir = resolve(cwd, "dist");
99
+ const serverEntries = [
100
+ ...routes.map((r) => r.filePath),
101
+ ...layouts.map((l) => l.filePath),
102
+ ...middlewares.map((m) => m.filePath),
103
+ ...errorPage ? [errorPage] : []
104
+ ];
105
+ const serverExternal = ["node:*", "davaux", ...config.external ?? []];
106
+ if (serverEntries.length === 0) {
107
+ console.log("[davaux] No routes found \u2014 nothing to build.");
108
+ } else {
109
+ await build({
110
+ entryPoints: serverEntries,
111
+ outdir: outDir,
112
+ outbase: routesDir,
113
+ format: "esm",
114
+ platform: "node",
115
+ target: "node22",
116
+ bundle: true,
117
+ jsx: "automatic",
118
+ jsxImportSource: "davaux",
119
+ external: serverExternal,
120
+ alias: { ...userAlias, "davaux/client": "davaux/signal" },
121
+ sourcemap: true,
122
+ plugins: [islandServerPlugin(islandsDir), ...extraPlugins]
123
+ }).catch((err) => handleBuildError("Server build", err));
124
+ console.log(
125
+ `[davaux] Built ${routes.length} route(s) and ${layouts.length} layout(s) to ${outDir}`
126
+ );
127
+ }
128
+ const middlewareSrc = resolve(cwd, "src", "middleware.ts");
129
+ if (existsSync(middlewareSrc)) {
130
+ await build({
131
+ entryPoints: [middlewareSrc],
132
+ outfile: resolve(outDir, "middleware.js"),
133
+ format: "esm",
134
+ platform: "node",
135
+ target: "node22",
136
+ bundle: true,
137
+ jsx: "automatic",
138
+ jsxImportSource: "davaux",
139
+ external: serverExternal,
140
+ alias: { ...userAlias, "davaux/client": "davaux/signal" },
141
+ sourcemap: true
142
+ }).catch((err) => handleBuildError("Middleware build", err));
143
+ }
144
+ const clientScripts = [];
145
+ if (islands.length > 0) {
146
+ const islandsOutFile = resolve(cwd, "dist", "_davaux", "islands.js");
147
+ await build({
148
+ stdin: {
149
+ contents: generateIslandsEntry(islands),
150
+ loader: "ts",
151
+ resolveDir: cwd
152
+ },
153
+ outfile: islandsOutFile,
154
+ format: "esm",
155
+ platform: "browser",
156
+ target: "es2022",
157
+ bundle: true,
158
+ jsx: "automatic",
159
+ jsxImportSource: "davaux/client",
160
+ alias: userAlias,
161
+ tsconfigRaw: JSON.stringify({
162
+ compilerOptions: { jsx: "react-jsx", jsxImportSource: "davaux/client" }
163
+ }),
164
+ sourcemap: true,
165
+ plugins: [...extraPlugins]
166
+ }).catch((err) => handleBuildError("Islands build", err));
167
+ clientScripts.push("/_davaux/islands.js");
168
+ console.log(`[davaux] Built islands bundle (${islands.length} island(s))`);
169
+ }
170
+ const clientEntry = resolve(cwd, "src", "client.ts");
171
+ if (existsSync(clientEntry)) {
172
+ const clientOutFile = resolve(cwd, "dist", "_davaux", "client.js");
173
+ await build({
174
+ entryPoints: [clientEntry],
175
+ outfile: clientOutFile,
176
+ format: "esm",
177
+ platform: "browser",
178
+ target: "es2022",
179
+ bundle: true,
180
+ jsx: "automatic",
181
+ jsxImportSource: "davaux/client",
182
+ alias: userAlias,
183
+ tsconfigRaw: JSON.stringify({
184
+ compilerOptions: { jsx: "react-jsx", jsxImportSource: "davaux/client" }
185
+ }),
186
+ sourcemap: true,
187
+ plugins: [...extraPlugins]
188
+ }).catch((err) => handleBuildError("Client build", err));
189
+ clientScripts.push("/_davaux/client.js");
190
+ console.log(`[davaux] Built client bundle to ${clientOutFile}`);
191
+ }
192
+ const stylesOutFile = resolve(cwd, "dist", "_davaux", "styles.css");
193
+ const hasCss = await collectCss(outDir, stylesOutFile, true);
194
+ if (hasCss) console.log("[davaux] Collected CSS into dist/_davaux/styles.css");
195
+ try {
196
+ const r = createRequire(import.meta.url);
197
+ const templateForCjs = r.resolve("template-for-polyfill");
198
+ const templateForJs = readFileSync(
199
+ templateForCjs.replace(/template-for-polyfill\.cjs$/, "template-for-polyfill.js"),
200
+ "utf-8"
201
+ );
202
+ const htmlSettersMain = r.resolve("html-setters-polyfill");
203
+ const htmlSettersJs = readFileSync(
204
+ htmlSettersMain.replace(/index\.js$/, "index.min.js"),
205
+ "utf-8"
206
+ );
207
+ writeFileSync(
208
+ resolve(cwd, "dist", "_davaux", "partial-updates.js"),
209
+ `${templateForJs}
210
+ ${htmlSettersJs}`
211
+ );
212
+ } catch {
213
+ console.warn("[davaux] Could not copy partial-updates polyfills \u2014 install template-for-polyfill and html-setters-polyfill if you use ctx.defer()");
214
+ }
215
+ const serverSrc = resolve(cwd, "server.ts");
216
+ if (existsSync(serverSrc)) {
217
+ await build({
218
+ entryPoints: [serverSrc],
219
+ outfile: resolve(outDir, "server.js"),
220
+ format: "esm",
221
+ platform: "node",
222
+ target: "node22",
223
+ bundle: true,
224
+ external: [...serverExternal, "davaux/*"],
225
+ sourcemap: true
226
+ }).catch((err) => handleBuildError("Server entry build", err));
227
+ console.log("[davaux] Built server.ts \u2192 dist/server.js");
228
+ }
229
+ }
230
+ async function runStatic() {
231
+ loadEnv(cwd);
232
+ await runBuild();
233
+ const { generateStatic } = await import("./ssg.js");
234
+ const { scanRoutes } = await import("./router/scanner.js");
235
+ const { loadConfig } = await import("./build/config.js");
236
+ const config = await loadConfig(cwd);
237
+ const distDir = resolve(cwd, "dist");
238
+ const publicDir = resolve(cwd, "public");
239
+ const outDir = resolve(cwd, getFlag("--out", args) ?? config.ssg?.outDir ?? "out");
240
+ const islandsFile = resolve(distDir, "_davaux", "islands.js");
241
+ const clientFile = resolve(distDir, "_davaux", "client.js");
242
+ const stylesFile = resolve(distDir, "_davaux", "styles.css");
243
+ const clientScripts = [];
244
+ if (existsSync(islandsFile)) clientScripts.push("/_davaux/islands.js");
245
+ if (existsSync(clientFile)) clientScripts.push("/_davaux/client.js");
246
+ const clientStylesheets = [];
247
+ if (existsSync(stylesFile)) clientStylesheets.push("/_davaux/styles.css");
248
+ const scan = await scanRoutes(distDir);
249
+ const middlewareDist = resolve(distDir, "middleware.js");
250
+ await generateStatic({
251
+ outDir,
252
+ distDir,
253
+ publicDir,
254
+ scan,
255
+ clientScripts,
256
+ clientStylesheets,
257
+ appMiddlewarePath: existsSync(middlewareDist) ? middlewareDist : void 0,
258
+ trailingSlash: config.ssg?.trailingSlash,
259
+ basePath: config.ssg?.basePath,
260
+ notFound: config.ssg?.notFound,
261
+ sitemap: config.ssg?.sitemap
262
+ });
263
+ }
264
+ async function runPreview() {
265
+ const { loadConfig } = await import("./build/config.js");
266
+ const config = await loadConfig(cwd);
267
+ const outDir = resolve(cwd, getFlag("--dir", args) ?? config.ssg?.outDir ?? "out");
268
+ const port = Number(getFlag("--port", args) ?? config.server?.port ?? 4173);
269
+ const hostname = getFlag("--hostname", args) ?? "localhost";
270
+ if (!existsSync(outDir)) {
271
+ console.error(`[davaux] Preview directory not found: ${outDir}`);
272
+ console.error(' Run "davaux static" first to generate the output.');
273
+ process.exit(1);
274
+ }
275
+ function serveFile(res, filePath, status = 200) {
276
+ if (existsSync(filePath) && statSync(filePath).isFile()) {
277
+ res.writeHead(status, {
278
+ "Content-Type": MIME[extname(filePath)] ?? "application/octet-stream"
279
+ });
280
+ createReadStream(filePath).pipe(res);
281
+ return true;
282
+ }
283
+ return false;
284
+ }
285
+ const server = createServer((req, res) => {
286
+ const pathname = new URL(req.url ?? "/", "http://x").pathname;
287
+ const safePath = join(outDir, pathname);
288
+ if (!safePath.startsWith(`${outDir}/`) && safePath !== outDir) {
289
+ res.writeHead(403, { "Content-Type": "text/plain" });
290
+ res.end("Forbidden");
291
+ return;
292
+ }
293
+ if (serveFile(res, safePath)) return;
294
+ if (serveFile(res, join(safePath, "index.html"))) return;
295
+ const notFoundPage = join(outDir, "404.html");
296
+ if (serveFile(res, notFoundPage, 404)) return;
297
+ res.writeHead(404, { "Content-Type": "text/plain" });
298
+ res.end("Not found");
299
+ });
300
+ server.listen(port, hostname, () => {
301
+ console.log(`
302
+ davaux preview http://${hostname}:${port}`);
303
+ console.log(` Serving: ${outDir}
304
+ `);
305
+ });
306
+ }
307
+ const MIME = {
308
+ ".js": "application/javascript",
309
+ ".mjs": "application/javascript",
310
+ ".css": "text/css",
311
+ ".html": "text/html",
312
+ ".json": "application/json",
313
+ ".png": "image/png",
314
+ ".jpg": "image/jpeg",
315
+ ".jpeg": "image/jpeg",
316
+ ".gif": "image/gif",
317
+ ".svg": "image/svg+xml",
318
+ ".ico": "image/x-icon",
319
+ ".woff": "font/woff",
320
+ ".woff2": "font/woff2"
321
+ };
322
+ async function runStart() {
323
+ loadEnv(cwd);
324
+ const distDir = resolve(cwd, "dist");
325
+ const publicDir = resolve(cwd, "public");
326
+ const islandsFile = resolve(cwd, "dist", "_davaux", "islands.js");
327
+ const clientFile = resolve(cwd, "dist", "_davaux", "client.js");
328
+ const polyfillFile = resolve(cwd, "dist", "_davaux", "partial-updates.js");
329
+ const { loadConfig } = await import("./build/config.js");
330
+ const { scanRoutes } = await import("./router/scanner.js");
331
+ const { buildApp } = await import("./router/handler.js");
332
+ const { startServer } = await import("./server/index.js");
333
+ const [config, scanResult] = await Promise.all([loadConfig(cwd), scanRoutes(distDir)]);
334
+ const stylesFile = resolve(cwd, "dist", "_davaux", "styles.css");
335
+ const middlewareDist = resolve(distDir, "middleware.js");
336
+ const clientScripts = [];
337
+ if (existsSync(islandsFile)) clientScripts.push("/_davaux/islands.js");
338
+ if (existsSync(clientFile)) clientScripts.push("/_davaux/client.js");
339
+ const clientStylesheets = [];
340
+ if (existsSync(stylesFile)) clientStylesheets.push("/_davaux/styles.css");
341
+ const app = buildApp(
342
+ scanResult,
343
+ false,
344
+ clientScripts,
345
+ clientStylesheets,
346
+ existsSync(middlewareDist) ? middlewareDist : void 0,
347
+ "",
348
+ false,
349
+ config.oml?.cache
350
+ );
351
+ const serveStatics = (req, res) => {
352
+ const path = req.url?.split("?")[0] ?? "/";
353
+ if (path === "/_davaux/styles.css" && existsSync(stylesFile)) {
354
+ res.writeHead(200, { "Content-Type": "text/css" });
355
+ createReadStream(stylesFile).pipe(res);
356
+ return Promise.resolve(true);
357
+ }
358
+ if (path === "/_davaux/islands.js" && existsSync(islandsFile)) {
359
+ res.writeHead(200, { "Content-Type": "application/javascript" });
360
+ createReadStream(islandsFile).pipe(res);
361
+ return Promise.resolve(true);
362
+ }
363
+ if (path === "/_davaux/client.js" && existsSync(clientFile)) {
364
+ res.writeHead(200, { "Content-Type": "application/javascript" });
365
+ createReadStream(clientFile).pipe(res);
366
+ return Promise.resolve(true);
367
+ }
368
+ if (path === "/_davaux/partial-updates.js" && existsSync(polyfillFile)) {
369
+ res.writeHead(200, { "Content-Type": "application/javascript" });
370
+ createReadStream(polyfillFile).pipe(res);
371
+ return Promise.resolve(true);
372
+ }
373
+ if (existsSync(publicDir)) {
374
+ const filePath = join(publicDir, new URL(path, "http://x").pathname);
375
+ if ((filePath.startsWith(`${publicDir}/`) || filePath === publicDir) && existsSync(filePath) && statSync(filePath).isFile()) {
376
+ res.writeHead(200, {
377
+ "Content-Type": MIME[extname(filePath)] ?? "application/octet-stream"
378
+ });
379
+ createReadStream(filePath).pipe(res);
380
+ return Promise.resolve(true);
381
+ }
382
+ }
383
+ return Promise.resolve(false);
384
+ };
385
+ const serverDist = resolve(distDir, "server.js");
386
+ if (existsSync(serverDist)) {
387
+ const serverMod = await import(serverDist);
388
+ if (typeof serverMod.default !== "function") {
389
+ console.error(
390
+ "[davaux] dist/server.js must export a default function: (app: CompiledApp, serveStatics) => void"
391
+ );
392
+ process.exit(1);
393
+ }
394
+ await serverMod.default(app, serveStatics);
395
+ } else {
396
+ startServer(app, {
397
+ port: Number(getFlag("--port", args) ?? config.server?.port ?? 3e3),
398
+ hostname: getFlag("--hostname", args) ?? config.server?.hostname ?? "localhost",
399
+ onRequest: serveStatics
400
+ });
401
+ }
402
+ }
403
+ function getFlag(name, argv) {
404
+ const idx = argv.indexOf(name);
405
+ return idx !== -1 ? argv[idx + 1] : void 0;
406
+ }
407
+ function loadEnv(cwd2) {
408
+ for (const name of [".env", ".env.local"]) {
409
+ const filePath = resolve(cwd2, name);
410
+ if (!existsSync(filePath)) continue;
411
+ const content = readFileSync(filePath, "utf-8");
412
+ for (const line of content.split("\n")) {
413
+ const trimmed = line.trim();
414
+ if (!trimmed || trimmed.startsWith("#")) continue;
415
+ const eq = trimmed.indexOf("=");
416
+ if (eq === -1) continue;
417
+ const key = trimmed.slice(0, eq).trim();
418
+ if (!key) continue;
419
+ let value = trimmed.slice(eq + 1).trim();
420
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
421
+ value = value.slice(1, -1);
422
+ }
423
+ if (!(key in process.env)) process.env[key] = value;
424
+ }
425
+ }
426
+ }
427
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts"],
4
+ "sourcesContent": ["import { createReadStream, existsSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs'\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { extname, join, resolve } from 'node:path'\nimport { collectCss, generateIslandsEntry, islandServerPlugin } from './build/plugins.js'\nimport { collectEsbuildPlugins, collectScannerSuffixes, pathsToAlias } from './config.js'\nimport { handleBuildError } from './errors.js'\n\nconst [, , command, ...args] = process.argv\nconst cwd = process.cwd()\n\nswitch (command) {\n case 'create':\n await runCreate()\n break\n case 'create-multisite':\n await runCreateMultisite()\n break\n case 'generate':\n await runGenerate()\n break\n case 'dev':\n await runDev()\n break\n case 'build':\n await runBuild()\n break\n case 'static':\n await runStatic()\n break\n case 'start':\n await runStart()\n break\n case 'preview':\n await runPreview()\n break\n default:\n console.error(`davaux: unknown command \"${command ?? ''}\"`)\n console.error(\n ' Usage: davaux <create|create-multisite|generate|dev|build|start|static|preview> [options]',\n )\n process.exit(1)\n}\n\nasync function runCreate() {\n const { scaffold } = await import('./create.js')\n await scaffold(args[0], cwd)\n}\n\nasync function runCreateMultisite() {\n const { scaffoldMultisite } = await import('./create-multisite.js')\n await scaffoldMultisite(args[0], cwd)\n}\n\nasync function runGenerate() {\n const { generate } = await import('./generate.js')\n generate(args, cwd)\n}\n\nasync function runDev() {\n loadEnv(cwd)\n const serverSrc = resolve(cwd, 'server.ts')\n if (existsSync(serverSrc)) {\n console.warn('[davaux] server.ts detected \u2014 custom server entry is not used in dev mode')\n console.warn(\n ' Use \"node --watch --import tsx/esm server.ts\" to develop with your custom server',\n )\n }\n const { startDev } = await import('./dev/watch.js')\n const { loadConfig } = await import('./build/config.js')\n const config = await loadConfig(cwd)\n const middlewareSrc = resolve(cwd, 'src', 'middleware.ts')\n await startDev({\n cwd,\n port: Number(getFlag('--port', args) ?? config.server?.port ?? 3000),\n hostname: getFlag('--hostname', args) ?? config.server?.hostname ?? 'localhost',\n paths: config.paths,\n plugins: config.plugins ?? [],\n external: config.external,\n middlewareSrc: existsSync(middlewareSrc) ? middlewareSrc : undefined,\n editor: config.editor,\n })\n}\n\n// \u2500\u2500\u2500 Build \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function runBuild() {\n rmSync(resolve(cwd, 'dist'), { recursive: true, force: true })\n\n const { build } = await import('esbuild')\n const { loadConfig } = await import('./build/config.js')\n const config = await loadConfig(cwd)\n const davauxPlugins = config.plugins ?? []\n const extraPlugins = collectEsbuildPlugins(davauxPlugins)\n const extraSuffixes = collectScannerSuffixes(davauxPlugins)\n const userAlias = pathsToAlias(config.paths ?? {})\n const routesDir = resolve(cwd, 'src', 'routes')\n const islandsDir = resolve(cwd, 'src', 'islands')\n\n if (!existsSync(routesDir)) {\n console.error(`[davaux] No routes directory found at ${routesDir}`)\n process.exit(1)\n }\n\n const { scanRoutes } = await import('./router/scanner.js')\n const { scanIslands } = await import('./router/scanner.js')\n const { routes, layouts, middlewares, errorPage } = await scanRoutes(routesDir, extraSuffixes)\n const islands = await scanIslands(islandsDir)\n\n const outDir = resolve(cwd, 'dist')\n const serverEntries = [\n ...routes.map((r) => r.filePath),\n ...layouts.map((l) => l.filePath),\n ...middlewares.map((m) => m.filePath),\n ...(errorPage ? [errorPage] : []),\n ]\n\n const serverExternal = ['node:*', 'davaux', ...(config.external ?? [])]\n\n if (serverEntries.length === 0) {\n console.log('[davaux] No routes found \u2014 nothing to build.')\n } else {\n await build({\n entryPoints: serverEntries,\n outdir: outDir,\n outbase: routesDir,\n format: 'esm',\n platform: 'node',\n target: 'node22',\n bundle: true,\n jsx: 'automatic',\n jsxImportSource: 'davaux',\n external: serverExternal,\n alias: { ...userAlias, 'davaux/client': 'davaux/signal' },\n sourcemap: true,\n plugins: [islandServerPlugin(islandsDir), ...extraPlugins],\n }).catch((err) => handleBuildError('Server build', err))\n console.log(\n `[davaux] Built ${routes.length} route(s) and ${layouts.length} layout(s) to ${outDir}`,\n )\n }\n\n // Build src/middleware.ts separately if it exists (not under routesDir, so needs its own outfile)\n const middlewareSrc = resolve(cwd, 'src', 'middleware.ts')\n if (existsSync(middlewareSrc)) {\n await build({\n entryPoints: [middlewareSrc],\n outfile: resolve(outDir, 'middleware.js'),\n format: 'esm',\n platform: 'node',\n target: 'node22',\n bundle: true,\n jsx: 'automatic',\n jsxImportSource: 'davaux',\n external: serverExternal,\n alias: { ...userAlias, 'davaux/client': 'davaux/signal' },\n sourcemap: true,\n }).catch((err) => handleBuildError('Middleware build', err))\n }\n\n const clientScripts: string[] = []\n\n // Islands client bundle (auto-generated from scanned islands)\n if (islands.length > 0) {\n const islandsOutFile = resolve(cwd, 'dist', '_davaux', 'islands.js')\n await build({\n stdin: {\n contents: generateIslandsEntry(islands),\n loader: 'ts',\n resolveDir: cwd,\n },\n outfile: islandsOutFile,\n format: 'esm',\n platform: 'browser',\n target: 'es2022',\n bundle: true,\n jsx: 'automatic',\n jsxImportSource: 'davaux/client',\n alias: userAlias,\n tsconfigRaw: JSON.stringify({\n compilerOptions: { jsx: 'react-jsx', jsxImportSource: 'davaux/client' },\n }),\n sourcemap: true,\n plugins: [...extraPlugins],\n }).catch((err) => handleBuildError('Islands build', err))\n clientScripts.push('/_davaux/islands.js')\n console.log(`[davaux] Built islands bundle (${islands.length} island(s))`)\n }\n\n // Optional user-authored client bundle\n const clientEntry = resolve(cwd, 'src', 'client.ts')\n if (existsSync(clientEntry)) {\n const clientOutFile = resolve(cwd, 'dist', '_davaux', 'client.js')\n await build({\n entryPoints: [clientEntry],\n outfile: clientOutFile,\n format: 'esm',\n platform: 'browser',\n target: 'es2022',\n bundle: true,\n jsx: 'automatic',\n jsxImportSource: 'davaux/client',\n alias: userAlias,\n tsconfigRaw: JSON.stringify({\n compilerOptions: { jsx: 'react-jsx', jsxImportSource: 'davaux/client' },\n }),\n sourcemap: true,\n plugins: [...extraPlugins],\n }).catch((err) => handleBuildError('Client build', err))\n clientScripts.push('/_davaux/client.js')\n console.log(`[davaux] Built client bundle to ${clientOutFile}`)\n }\n\n // Collect CSS side-effect outputs from all builds into a single stylesheet\n const stylesOutFile = resolve(cwd, 'dist', '_davaux', 'styles.css')\n const hasCss = await collectCss(outDir, stylesOutFile, true)\n if (hasCss) console.log('[davaux] Collected CSS into dist/_davaux/styles.css')\n\n // Copy partial-updates polyfills (self-detecting \u2014 no-op when native support lands)\n try {\n const r = createRequire(import.meta.url)\n const templateForCjs = r.resolve('template-for-polyfill')\n const templateForJs = readFileSync(\n templateForCjs.replace(/template-for-polyfill\\.cjs$/, 'template-for-polyfill.js'),\n 'utf-8',\n )\n const htmlSettersMain = r.resolve('html-setters-polyfill')\n const htmlSettersJs = readFileSync(\n htmlSettersMain.replace(/index\\.js$/, 'index.min.js'),\n 'utf-8',\n )\n writeFileSync(\n resolve(cwd, 'dist', '_davaux', 'partial-updates.js'),\n `${templateForJs}\\n${htmlSettersJs}`,\n )\n } catch {\n console.warn('[davaux] Could not copy partial-updates polyfills \u2014 install template-for-polyfill and html-setters-polyfill if you use ctx.defer()')\n }\n\n // Compile server.ts if present \u2014 enables custom server entry (HTTPS, clustering, etc.)\n const serverSrc = resolve(cwd, 'server.ts')\n if (existsSync(serverSrc)) {\n await build({\n entryPoints: [serverSrc],\n outfile: resolve(outDir, 'server.js'),\n format: 'esm',\n platform: 'node',\n target: 'node22',\n bundle: true,\n external: [...serverExternal, 'davaux/*'],\n sourcemap: true,\n }).catch((err) => handleBuildError('Server entry build', err))\n console.log('[davaux] Built server.ts \u2192 dist/server.js')\n }\n}\n\n// \u2500\u2500\u2500 Static \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function runStatic() {\n loadEnv(cwd)\n await runBuild()\n\n const { generateStatic } = await import('./ssg.js')\n const { scanRoutes } = await import('./router/scanner.js')\n const { loadConfig } = await import('./build/config.js')\n const config = await loadConfig(cwd)\n\n const distDir = resolve(cwd, 'dist')\n const publicDir = resolve(cwd, 'public')\n const outDir = resolve(cwd, getFlag('--out', args) ?? config.ssg?.outDir ?? 'out')\n\n const islandsFile = resolve(distDir, '_davaux', 'islands.js')\n const clientFile = resolve(distDir, '_davaux', 'client.js')\n const stylesFile = resolve(distDir, '_davaux', 'styles.css')\n\n const clientScripts: string[] = []\n if (existsSync(islandsFile)) clientScripts.push('/_davaux/islands.js')\n if (existsSync(clientFile)) clientScripts.push('/_davaux/client.js')\n\n const clientStylesheets: string[] = []\n if (existsSync(stylesFile)) clientStylesheets.push('/_davaux/styles.css')\n\n const scan = await scanRoutes(distDir)\n\n const middlewareDist = resolve(distDir, 'middleware.js')\n await generateStatic({\n outDir,\n distDir,\n publicDir,\n scan,\n clientScripts,\n clientStylesheets,\n appMiddlewarePath: existsSync(middlewareDist) ? middlewareDist : undefined,\n trailingSlash: config.ssg?.trailingSlash,\n basePath: config.ssg?.basePath,\n notFound: config.ssg?.notFound,\n sitemap: config.ssg?.sitemap,\n })\n}\n\n// \u2500\u2500\u2500 Preview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function runPreview() {\n const { loadConfig } = await import('./build/config.js')\n const config = await loadConfig(cwd)\n const outDir = resolve(cwd, getFlag('--dir', args) ?? config.ssg?.outDir ?? 'out')\n const port = Number(getFlag('--port', args) ?? config.server?.port ?? 4173)\n const hostname = getFlag('--hostname', args) ?? 'localhost'\n\n if (!existsSync(outDir)) {\n console.error(`[davaux] Preview directory not found: ${outDir}`)\n console.error(' Run \"davaux static\" first to generate the output.')\n process.exit(1)\n }\n\n function serveFile(\n res: import('node:http').ServerResponse,\n filePath: string,\n status = 200,\n ): boolean {\n if (existsSync(filePath) && statSync(filePath).isFile()) {\n res.writeHead(status, {\n 'Content-Type': MIME[extname(filePath)] ?? 'application/octet-stream',\n })\n createReadStream(filePath).pipe(res)\n return true\n }\n return false\n }\n\n const server = createServer((req, res) => {\n const pathname = new URL(req.url ?? '/', 'http://x').pathname\n const safePath = join(outDir, pathname)\n\n if (!safePath.startsWith(`${outDir}/`) && safePath !== outDir) {\n res.writeHead(403, { 'Content-Type': 'text/plain' })\n res.end('Forbidden')\n return\n }\n\n if (serveFile(res, safePath)) return\n if (serveFile(res, join(safePath, 'index.html'))) return\n\n const notFoundPage = join(outDir, '404.html')\n if (serveFile(res, notFoundPage, 404)) return\n\n res.writeHead(404, { 'Content-Type': 'text/plain' })\n res.end('Not found')\n })\n\n server.listen(port, hostname, () => {\n console.log(`\\n davaux preview http://${hostname}:${port}`)\n console.log(` Serving: ${outDir}\\n`)\n })\n}\n\n// \u2500\u2500\u2500 Start \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst MIME: Record<string, string> = {\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.css': 'text/css',\n '.html': 'text/html',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n}\n\nasync function runStart() {\n loadEnv(cwd)\n const distDir = resolve(cwd, 'dist')\n const publicDir = resolve(cwd, 'public')\n const islandsFile = resolve(cwd, 'dist', '_davaux', 'islands.js')\n const clientFile = resolve(cwd, 'dist', '_davaux', 'client.js')\n const polyfillFile = resolve(cwd, 'dist', '_davaux', 'partial-updates.js')\n\n const { loadConfig } = await import('./build/config.js')\n const { scanRoutes } = await import('./router/scanner.js')\n const { buildApp } = await import('./router/handler.js')\n const { startServer } = await import('./server/index.js')\n\n const [config, scanResult] = await Promise.all([loadConfig(cwd), scanRoutes(distDir)])\n\n const stylesFile = resolve(cwd, 'dist', '_davaux', 'styles.css')\n const middlewareDist = resolve(distDir, 'middleware.js')\n const clientScripts: string[] = []\n if (existsSync(islandsFile)) clientScripts.push('/_davaux/islands.js')\n if (existsSync(clientFile)) clientScripts.push('/_davaux/client.js')\n const clientStylesheets: string[] = []\n if (existsSync(stylesFile)) clientStylesheets.push('/_davaux/styles.css')\n\n const app = buildApp(\n scanResult,\n false,\n clientScripts,\n clientStylesheets,\n existsSync(middlewareDist) ? middlewareDist : undefined,\n '',\n false,\n config.oml?.cache,\n )\n\n const serveStatics = (req: IncomingMessage, res: ServerResponse): Promise<boolean> => {\n const path = req.url?.split('?')[0] ?? '/'\n\n if (path === '/_davaux/styles.css' && existsSync(stylesFile)) {\n res.writeHead(200, { 'Content-Type': 'text/css' })\n createReadStream(stylesFile).pipe(res)\n return Promise.resolve(true)\n }\n\n if (path === '/_davaux/islands.js' && existsSync(islandsFile)) {\n res.writeHead(200, { 'Content-Type': 'application/javascript' })\n createReadStream(islandsFile).pipe(res)\n return Promise.resolve(true)\n }\n\n if (path === '/_davaux/client.js' && existsSync(clientFile)) {\n res.writeHead(200, { 'Content-Type': 'application/javascript' })\n createReadStream(clientFile).pipe(res)\n return Promise.resolve(true)\n }\n\n if (path === '/_davaux/partial-updates.js' && existsSync(polyfillFile)) {\n res.writeHead(200, { 'Content-Type': 'application/javascript' })\n createReadStream(polyfillFile).pipe(res)\n return Promise.resolve(true)\n }\n\n if (existsSync(publicDir)) {\n const filePath = join(publicDir, new URL(path, 'http://x').pathname)\n if (\n (filePath.startsWith(`${publicDir}/`) || filePath === publicDir) &&\n existsSync(filePath) &&\n statSync(filePath).isFile()\n ) {\n res.writeHead(200, {\n 'Content-Type': MIME[extname(filePath)] ?? 'application/octet-stream',\n })\n createReadStream(filePath).pipe(res)\n return Promise.resolve(true)\n }\n }\n\n return Promise.resolve(false)\n }\n\n const serverDist = resolve(distDir, 'server.js')\n if (existsSync(serverDist)) {\n const serverMod = await import(serverDist)\n if (typeof serverMod.default !== 'function') {\n console.error(\n '[davaux] dist/server.js must export a default function: (app: CompiledApp, serveStatics) => void',\n )\n process.exit(1)\n }\n await serverMod.default(app, serveStatics)\n } else {\n startServer(app, {\n port: Number(getFlag('--port', args) ?? config.server?.port ?? 3000),\n hostname: getFlag('--hostname', args) ?? config.server?.hostname ?? 'localhost',\n onRequest: serveStatics,\n })\n }\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getFlag(name: string, argv: string[]): string | undefined {\n const idx = argv.indexOf(name)\n return idx !== -1 ? argv[idx + 1] : undefined\n}\n\nfunction loadEnv(cwd: string): void {\n for (const name of ['.env', '.env.local']) {\n const filePath = resolve(cwd, name)\n if (!existsSync(filePath)) continue\n const content = readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eq = trimmed.indexOf('=')\n if (eq === -1) continue\n const key = trimmed.slice(0, eq).trim()\n if (!key) continue\n let value = trimmed.slice(eq + 1).trim()\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n if (!(key in process.env)) process.env[key] = value\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["cwd"]
7
+ }
@@ -0,0 +1,49 @@
1
+ export interface ForProps<T> {
2
+ each: (() => T[]) | T[];
3
+ /** When provided, enables keyed diffing: nodes are reused/moved instead of
4
+ * destroyed and recreated on every array change. The key must be unique
5
+ * within the list. Same key → same DOM node; the index signal updates in place. */
6
+ key?: (item: T) => string | number;
7
+ children: (item: T, index: () => number) => Node;
8
+ }
9
+ /**
10
+ * Render a reactive list. Re-renders the full list on every array change by default.
11
+ * Pass `key` to enable keyed diffing — each item's DOM node is created once per key
12
+ * and moved or removed rather than destroyed and recreated on every update.
13
+ * The `index` argument to the render function is a reactive signal that stays
14
+ * correct as items are inserted, removed, or reordered.
15
+ */
16
+ export declare function For<T>(props: ForProps<T>): Node;
17
+ export interface ShowProps {
18
+ when: (() => boolean) | boolean;
19
+ children: Node | Node[] | (() => Node | Node[]);
20
+ fallback?: Node | (() => Node);
21
+ }
22
+ /**
23
+ * Conditionally render content. Children and fallback are cached after first
24
+ * construction and only attached or detached as the condition toggles.
25
+ *
26
+ * Pass a function child `() => <Node>` to defer construction until `when` is
27
+ * first true — useful when children contain expensive effects or data fetching.
28
+ */
29
+ export declare function Show(props: ShowProps): Node;
30
+ export interface ErrorBoundaryProps {
31
+ /** Rendered when children throw. Receives the caught error if passed as a function. */
32
+ fallback: Node | ((error: Error) => Node);
33
+ /** Must be a function so construction is deferred into the try/catch. */
34
+ children: () => Node | Node[];
35
+ }
36
+ /**
37
+ * Catch errors thrown during the initial construction of children — including
38
+ * errors in the first run of any `createEffect` inside them — and render
39
+ * `fallback` instead.
40
+ *
41
+ * Children must be a function so their construction is deferred into the
42
+ * boundary's try/catch. A plain JSX child would be evaluated before
43
+ * `ErrorBoundary` runs and could not be caught.
44
+ *
45
+ * Errors from subsequent reactive updates are not caught — add try/catch
46
+ * inside those effects for fine-grained recovery.
47
+ */
48
+ export declare function ErrorBoundary(props: ErrorBoundaryProps): Node;
49
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../client/control.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;IACvB;;wFAEoF;IACpF,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAA;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,MAAM,KAAK,IAAI,CAAA;CACjD;AAED;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CA4F/C;AAOD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,OAAO,CAAA;IAC/B,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,CAAA;IAC/C,QAAQ,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAuD3C;AAID,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,CAAA;IACzC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,EAAE,CAAA;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CA6B7D"}