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
@@ -0,0 +1,63 @@
1
+ import { createEffect, onCleanup } from './signal.js'
2
+
3
+ export interface MetaDescriptor {
4
+ /** `<meta name="...">` value. Mutually exclusive with `property`. */
5
+ name?: string
6
+ /** `<meta property="...">` value (Open Graph, etc.). Mutually exclusive with `name`. */
7
+ property?: string
8
+ content: string | (() => string)
9
+ }
10
+
11
+ export interface UseHeadOptions {
12
+ /** Reactive document title. A function re-runs whenever its signals change. */
13
+ title?: string | (() => string)
14
+ /** Meta tags to add/update in `<head>`. Existing tags are updated in place. */
15
+ meta?: MetaDescriptor[]
16
+ }
17
+
18
+ /**
19
+ * Update `document.title` and `<meta>` tags from inside a client island.
20
+ * String values are set once; function values are wrapped in `createEffect`
21
+ * and update reactively whenever their signals change.
22
+ *
23
+ * No-op on the server — use `ctx.head` from the page handler for initial SSR values.
24
+ *
25
+ * @example
26
+ * useHead({
27
+ * title: () => `${article()} — My Site`,
28
+ * meta: [{ name: 'description', content: () => article().summary }],
29
+ * })
30
+ */
31
+ export function useHead(options: UseHeadOptions): void {
32
+ if (typeof document === 'undefined') return
33
+
34
+ if (options.title !== undefined) {
35
+ const title = options.title
36
+ createEffect(() => {
37
+ document.title = typeof title === 'function' ? title() : title
38
+ })
39
+ }
40
+
41
+ for (const descriptor of options.meta ?? []) {
42
+ const attr = descriptor.name !== undefined ? 'name' : 'property'
43
+ const attrValue = (descriptor.name ?? descriptor.property) as string
44
+
45
+ let el = document.querySelector(`meta[${attr}="${attrValue}"]`) as HTMLMetaElement | null
46
+ const created = !el
47
+ if (!el) {
48
+ el = document.createElement('meta')
49
+ el.setAttribute(attr, attrValue)
50
+ document.head.appendChild(el)
51
+ }
52
+
53
+ const metaEl = el
54
+ const content = descriptor.content
55
+ createEffect(() => {
56
+ metaEl.content = typeof content === 'function' ? content() : content
57
+ })
58
+
59
+ if (created) {
60
+ onCleanup(() => metaEl.remove())
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,3 @@
1
+ import type { DavauxConfig } from '../config.js';
2
+ export declare function loadConfig(cwd: string): Promise<DavauxConfig>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/build/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAMhD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAgCnE"}
@@ -0,0 +1,38 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, rm } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ const CONFIG_FILES = ["davaux.config.ts", "davaux.config.js", "davaux.config.mjs"];
5
+ async function loadConfig(cwd) {
6
+ for (const name of CONFIG_FILES) {
7
+ const configPath = resolve(cwd, name);
8
+ if (!existsSync(configPath)) continue;
9
+ const cacheDir = resolve(cwd, "node_modules", ".cache", "davaux");
10
+ await mkdir(cacheDir, { recursive: true });
11
+ const outfile = join(cacheDir, `config-${Date.now()}.mjs`);
12
+ try {
13
+ const { build } = await import("esbuild");
14
+ await build({
15
+ entryPoints: [configPath],
16
+ outfile,
17
+ format: "esm",
18
+ platform: "node",
19
+ target: "node22",
20
+ bundle: true,
21
+ // Keep node built-ins and framework packages as external imports;
22
+ // everything else (user plugin deps) is bundled in.
23
+ external: ["node:*", "esbuild", "davaux", "davaux/*"],
24
+ logLevel: "silent"
25
+ });
26
+ const mod = await import(outfile);
27
+ return mod.default ?? {};
28
+ } finally {
29
+ await rm(outfile, { force: true }).catch(() => {
30
+ });
31
+ }
32
+ }
33
+ return {};
34
+ }
35
+ export {
36
+ loadConfig
37
+ };
38
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/build/config.ts"],
4
+ "sourcesContent": ["import { existsSync } from 'node:fs'\nimport { mkdir, rm } from 'node:fs/promises'\nimport { join, resolve } from 'node:path'\nimport type { DavauxConfig } from '../config.js'\n\nconst CONFIG_FILES = ['davaux.config.ts', 'davaux.config.js', 'davaux.config.mjs']\n\n// Compile and import the project's davaux.config.* file.\n// Returns an empty object if no config file is found.\nexport async function loadConfig(cwd: string): Promise<DavauxConfig> {\n for (const name of CONFIG_FILES) {\n const configPath = resolve(cwd, name)\n if (!existsSync(configPath)) continue\n\n // Write to node_modules/.cache/davaux/ so Node.js resolves externals\n // (esbuild, davaux, etc.) via the project's own node_modules tree.\n const cacheDir = resolve(cwd, 'node_modules', '.cache', 'davaux')\n await mkdir(cacheDir, { recursive: true })\n const outfile = join(cacheDir, `config-${Date.now()}.mjs`)\n\n try {\n const { build } = await import('esbuild')\n await build({\n entryPoints: [configPath],\n outfile,\n format: 'esm',\n platform: 'node',\n target: 'node22',\n bundle: true,\n // Keep node built-ins and framework packages as external imports;\n // everything else (user plugin deps) is bundled in.\n external: ['node:*', 'esbuild', 'davaux', 'davaux/*'],\n logLevel: 'silent',\n })\n const mod = await import(outfile)\n return (mod.default ?? {}) as DavauxConfig\n } finally {\n await rm(outfile, { force: true }).catch(() => {})\n }\n }\n return {}\n}\n"],
5
+ "mappings": "AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU;AAC1B,SAAS,MAAM,eAAe;AAG9B,MAAM,eAAe,CAAC,oBAAoB,oBAAoB,mBAAmB;AAIjF,eAAsB,WAAW,KAAoC;AACnE,aAAW,QAAQ,cAAc;AAC/B,UAAM,aAAa,QAAQ,KAAK,IAAI;AACpC,QAAI,CAAC,WAAW,UAAU,EAAG;AAI7B,UAAM,WAAW,QAAQ,KAAK,gBAAgB,UAAU,QAAQ;AAChE,UAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,UAAM,UAAU,KAAK,UAAU,UAAU,KAAK,IAAI,CAAC,MAAM;AAEzD,QAAI;AACF,YAAM,EAAE,MAAM,IAAI,MAAM,OAAO,SAAS;AACxC,YAAM,MAAM;AAAA,QACV,aAAa,CAAC,UAAU;AAAA,QACxB;AAAA,QACA,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA;AAAA;AAAA,QAGR,UAAU,CAAC,UAAU,WAAW,UAAU,UAAU;AAAA,QACpD,UAAU;AAAA,MACZ,CAAC;AACD,YAAM,MAAM,MAAM,OAAO;AACzB,aAAQ,IAAI,WAAW,CAAC;AAAA,IAC1B,UAAE;AACA,YAAM,GAAG,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO,CAAC;AACV;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export { collectCss, cssCollectorPlugin, generateIslandsEntry, islandServerPlugin, } from './plugins.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,13 @@
1
+ import {
2
+ collectCss,
3
+ cssCollectorPlugin,
4
+ generateIslandsEntry,
5
+ islandServerPlugin
6
+ } from "./plugins.js";
7
+ export {
8
+ collectCss,
9
+ cssCollectorPlugin,
10
+ generateIslandsEntry,
11
+ islandServerPlugin
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/build/index.ts"],
4
+ "sourcesContent": ["export {\n collectCss,\n cssCollectorPlugin,\n generateIslandsEntry,\n islandServerPlugin,\n} from './plugins.js'\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ import { type Plugin } from 'esbuild';
2
+ import type { IslandFile } from '../types.js';
3
+ export declare function islandServerPlugin(islandsDirs: string | string[]): Plugin;
4
+ export declare function collectCss(scanDir: string, stylesOutFile: string, minify?: boolean): Promise<boolean>;
5
+ export declare function cssCollectorPlugin(dauxDir: string, stylesOutFile: string): Plugin;
6
+ export declare function generateIslandsEntry(islands: IslandFile[]): string;
7
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/build/plugins.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAa7C,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAwCzE;AAQD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,UAAQ,GACb,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAOD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAOjF;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAWlE"}
@@ -0,0 +1,85 @@
1
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { transform } from "esbuild";
4
+ function islandServerPlugin(islandsDirs) {
5
+ const dirs = Array.isArray(islandsDirs) ? islandsDirs : [islandsDirs];
6
+ return {
7
+ name: "davaux-island-server",
8
+ setup(build) {
9
+ build.onLoad({ filter: /\.(tsx?|jsx?)$/ }, async (args) => {
10
+ if (args.namespace !== "file") return;
11
+ if (!dirs.some((d) => args.path.startsWith(d))) return;
12
+ const id = basename(args.path).replace(/\.(tsx?|jsx?)$/, "");
13
+ return {
14
+ contents: [
15
+ `import Component from ${JSON.stringify(`${args.path}?island-raw`)};`,
16
+ `import { island } from 'davaux/island';`,
17
+ `export default island(Component, ${JSON.stringify(id)});`
18
+ ].join("\n"),
19
+ loader: "js",
20
+ resolveDir: dirname(args.path)
21
+ };
22
+ });
23
+ build.onResolve({ filter: /\?island-raw$/ }, (args) => ({
24
+ path: args.path.replace(/\?island-raw$/, ""),
25
+ namespace: "island-raw"
26
+ }));
27
+ build.onLoad({ filter: /.*/, namespace: "island-raw" }, async (args) => {
28
+ let source = await readFile(args.path, "utf8");
29
+ source = source.replace(/\/\*\*?\s*@jsxImportSource\s+\S+\s*\*\//g, "");
30
+ source = `/** @jsxImportSource davaux */
31
+ ${source}`;
32
+ const ext = args.path.match(/\.(tsx?|jsx?)$/)?.[1] ?? "ts";
33
+ return { contents: source, loader: ext, resolveDir: dirname(args.path) };
34
+ });
35
+ }
36
+ };
37
+ }
38
+ async function collectCss(scanDir, stylesOutFile, minify = false) {
39
+ const cssFiles = [];
40
+ async function walk(dir) {
41
+ const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
42
+ for (const e of entries) {
43
+ const full = join(dir, e.name);
44
+ if (e.isDirectory()) await walk(full);
45
+ else if (e.name.endsWith(".css") && full !== stylesOutFile) cssFiles.push(full);
46
+ }
47
+ }
48
+ await walk(scanDir);
49
+ if (cssFiles.length === 0) return false;
50
+ let css = (await Promise.all(cssFiles.map((f) => readFile(f, "utf8")))).join("\n");
51
+ if (minify) {
52
+ const result = await transform(css, { loader: "css", minify: true });
53
+ css = result.code;
54
+ }
55
+ await mkdir(dirname(stylesOutFile), { recursive: true });
56
+ await writeFile(stylesOutFile, css);
57
+ return true;
58
+ }
59
+ function cssCollectorPlugin(dauxDir, stylesOutFile) {
60
+ return {
61
+ name: "davaux-css-collector",
62
+ setup(build) {
63
+ build.onEnd(() => void collectCss(dauxDir, stylesOutFile));
64
+ }
65
+ };
66
+ }
67
+ function generateIslandsEntry(islands) {
68
+ return [
69
+ `import { hydrate } from 'davaux/client'`,
70
+ ...islands.map((isle, i) => `import __island_${i} from ${JSON.stringify(isle.filePath)}`),
71
+ "",
72
+ "hydrate({",
73
+ ...islands.map(
74
+ (isle, i) => ` ${JSON.stringify(isle.id)}: async () => ({ default: __island_${i} }),`
75
+ ),
76
+ "})"
77
+ ].join("\n");
78
+ }
79
+ export {
80
+ collectCss,
81
+ cssCollectorPlugin,
82
+ generateIslandsEntry,
83
+ islandServerPlugin
84
+ };
85
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/build/plugins.ts"],
4
+ "sourcesContent": ["import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises'\nimport { basename, dirname, join } from 'node:path'\nimport { type Plugin, transform } from 'esbuild'\nimport type { IslandFile } from '../types.js'\n\n// \u2500\u2500\u2500 Island server plugin \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//\n// When the routes bundle imports a file from the islands directory, this plugin\n// intercepts at load time and returns a thin server wrapper instead of the raw\n// source. The wrapper re-exports the component wrapped with island() so the\n// route gets back a function that renders SSR HTML + serialized props.\n//\n// The actual island source is loaded under the 'island-raw' namespace, which:\n// 1. Strips any @jsxImportSource pragma (server context sets its own)\n// 2. Allows the route context's jsxImportSource:'davaux' + alias to apply\n\nexport function islandServerPlugin(islandsDirs: string | string[]): Plugin {\n const dirs = Array.isArray(islandsDirs) ? islandsDirs : [islandsDirs]\n return {\n name: 'davaux-island-server',\n setup(build) {\n // Intercept file-namespace loads of island source files\n build.onLoad({ filter: /\\.(tsx?|jsx?)$/ }, async (args) => {\n if (args.namespace !== 'file') return\n if (!dirs.some((d) => args.path.startsWith(d))) return\n\n const id = basename(args.path).replace(/\\.(tsx?|jsx?)$/, '')\n return {\n contents: [\n `import Component from ${JSON.stringify(`${args.path}?island-raw`)};`,\n `import { island } from 'davaux/island';`,\n `export default island(Component, ${JSON.stringify(id)});`,\n ].join('\\n'),\n loader: 'js',\n resolveDir: dirname(args.path),\n }\n })\n\n // Resolve the ?island-raw marker \u2192 island-raw namespace (bypasses the wrapper)\n build.onResolve({ filter: /\\?island-raw$/ }, (args) => ({\n path: args.path.replace(/\\?island-raw$/, ''),\n namespace: 'island-raw',\n }))\n\n // Load the raw island source, stripping any file-level @jsxImportSource pragma\n // and replacing it with the standard 'davaux' runtime so the island renders to\n // HTML strings on the server (OML is only needed at the route/page level).\n build.onLoad({ filter: /.*/, namespace: 'island-raw' }, async (args) => {\n let source = await readFile(args.path, 'utf8')\n source = source.replace(/\\/\\*\\*?\\s*@jsxImportSource\\s+\\S+\\s*\\*\\//g, '')\n source = `/** @jsxImportSource davaux */\\n${source}`\n const ext = (args.path.match(/\\.(tsx?|jsx?)$/)?.[1] ?? 'ts') as 'tsx' | 'ts' | 'jsx' | 'js'\n return { contents: source, loader: ext, resolveDir: dirname(args.path) }\n })\n },\n }\n}\n\n// \u2500\u2500\u2500 CSS collector \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//\n// Scans a directory recursively for all *.css files produced by esbuild\n// (side-effect CSS imports in routes and islands) and concatenates them into a\n// single stylesheet. Returns true if CSS was found and written, false otherwise.\n\nexport async function collectCss(\n scanDir: string,\n stylesOutFile: string,\n minify = false,\n): Promise<boolean> {\n const cssFiles: string[] = []\n async function walk(dir: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => [])\n for (const e of entries) {\n const full = join(dir, e.name)\n if (e.isDirectory()) await walk(full)\n else if (e.name.endsWith('.css') && full !== stylesOutFile) cssFiles.push(full)\n }\n }\n await walk(scanDir)\n if (cssFiles.length === 0) return false\n let css = (await Promise.all(cssFiles.map((f) => readFile(f, 'utf8')))).join('\\n')\n if (minify) {\n const result = await transform(css, { loader: 'css', minify: true })\n css = result.code\n }\n await mkdir(dirname(stylesOutFile), { recursive: true })\n await writeFile(stylesOutFile, css)\n return true\n}\n\n// \u2500\u2500\u2500 CSS collector plugin \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//\n// Wraps collectCss as an esbuild onEnd plugin. Added to both the routes and\n// islands contexts so either rebuild updates the combined stylesheet.\n\nexport function cssCollectorPlugin(dauxDir: string, stylesOutFile: string): Plugin {\n return {\n name: 'davaux-css-collector',\n setup(build) {\n build.onEnd(() => void collectCss(dauxDir, stylesOutFile))\n },\n }\n}\n\n// \u2500\u2500\u2500 Island client bundle entry \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\nexport function generateIslandsEntry(islands: IslandFile[]): string {\n return [\n `import { hydrate } from 'davaux/client'`,\n ...islands.map((isle, i) => `import __island_${i} from ${JSON.stringify(isle.filePath)}`),\n '',\n 'hydrate({',\n ...islands.map(\n (isle, i) => ` ${JSON.stringify(isle.id)}: async () => ({ default: __island_${i} }),`,\n ),\n '})',\n ].join('\\n')\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}