@fragno-dev/upload 0.1.1 → 0.1.3

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 (301) hide show
  1. package/README.md +148 -12
  2. package/dist/browser/client/clients.js +17 -9
  3. package/dist/browser/client/clients.js.map +1 -1
  4. package/dist/browser/client/helpers.d.ts +15 -6
  5. package/dist/browser/client/helpers.d.ts.map +1 -1
  6. package/dist/browser/client/helpers.js +176 -30
  7. package/dist/browser/client/helpers.js.map +1 -1
  8. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js +6 -6
  9. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js.map +1 -1
  10. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js +2 -2
  11. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js.map +1 -1
  12. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/atom/index.js +2 -1
  13. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/atom/index.js.map +1 -0
  14. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/clean-stores/index.js +6 -0
  15. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/clean-stores/index.js.map +1 -1
  16. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/computed/index.js +8 -5
  17. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/computed/index.js.map +1 -0
  18. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js +1 -1
  19. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js.map +1 -1
  20. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js +1 -1
  21. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js.map +1 -1
  22. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js +1 -1
  23. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js.map +1 -1
  24. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js +1 -1
  25. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js.map +1 -1
  26. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js +16 -0
  27. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js.map +1 -0
  28. package/dist/browser/client/packages/fragment-upload/src/definition.js +1 -42
  29. package/dist/browser/client/packages/fragment-upload/src/definition.js.map +1 -1
  30. package/dist/browser/client/packages/fragment-upload/src/routes/files.js +12 -5
  31. package/dist/browser/client/packages/fragment-upload/src/routes/files.js.map +1 -1
  32. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js +3 -4
  33. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js.map +1 -1
  34. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js +32 -21
  35. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js.map +1 -1
  36. package/dist/browser/client/packages/fragment-upload/src/schema.js +33 -3
  37. package/dist/browser/client/packages/fragment-upload/src/schema.js.map +1 -1
  38. package/dist/browser/client/packages/fragment-upload/src/types.d.ts +1 -2
  39. package/dist/browser/client/packages/fragment-upload/src/types.d.ts.map +1 -1
  40. package/dist/browser/client/packages/fragno/dist/client/client.js +28 -12
  41. package/dist/browser/client/packages/fragno/dist/client/client.js.map +1 -1
  42. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js +11 -3
  43. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js.map +1 -1
  44. package/dist/browser/client/packages/fragno/dist/client/react.js +104 -12
  45. package/dist/browser/client/packages/fragno/dist/client/react.js.map +1 -1
  46. package/dist/browser/client/packages/fragno/dist/client/solid.js +25 -11
  47. package/dist/browser/client/packages/fragno/dist/client/solid.js.map +1 -1
  48. package/dist/browser/client/packages/fragno/dist/client/vanilla.js +21 -1
  49. package/dist/browser/client/packages/fragno/dist/client/vanilla.js.map +1 -1
  50. package/dist/browser/client/packages/fragno/dist/client/vue.js +19 -11
  51. package/dist/browser/client/packages/fragno/dist/client/vue.js.map +1 -1
  52. package/dist/browser/client/react.d.ts +215 -192
  53. package/dist/browser/client/react.d.ts.map +1 -1
  54. package/dist/browser/client/react.js.map +1 -1
  55. package/dist/browser/client/solid.d.ts +218 -196
  56. package/dist/browser/client/solid.d.ts.map +1 -1
  57. package/dist/browser/client/solid.js.map +1 -1
  58. package/dist/browser/client/svelte.d.ts +216 -193
  59. package/dist/browser/client/svelte.d.ts.map +1 -1
  60. package/dist/browser/client/svelte.js.map +1 -1
  61. package/dist/browser/client/vanilla.d.ts +217 -195
  62. package/dist/browser/client/vanilla.d.ts.map +1 -1
  63. package/dist/browser/client/vanilla.js.map +1 -1
  64. package/dist/browser/client/vue.d.ts +217 -194
  65. package/dist/browser/client/vue.d.ts.map +1 -1
  66. package/dist/browser/client/vue.js.map +1 -1
  67. package/dist/cli/commands/files/delete.d.ts +4 -4
  68. package/dist/cli/commands/files/delete.d.ts.map +1 -1
  69. package/dist/cli/commands/files/delete.js +8 -10
  70. package/dist/cli/commands/files/delete.js.map +1 -1
  71. package/dist/cli/commands/files/download-url.d.ts +4 -4
  72. package/dist/cli/commands/files/download-url.d.ts.map +1 -1
  73. package/dist/cli/commands/files/download-url.js +8 -10
  74. package/dist/cli/commands/files/download-url.js.map +1 -1
  75. package/dist/cli/commands/files/download.d.ts +4 -4
  76. package/dist/cli/commands/files/download.d.ts.map +1 -1
  77. package/dist/cli/commands/files/download.js +10 -12
  78. package/dist/cli/commands/files/download.js.map +1 -1
  79. package/dist/cli/commands/files/get.d.ts +4 -4
  80. package/dist/cli/commands/files/get.d.ts.map +1 -1
  81. package/dist/cli/commands/files/get.js +8 -10
  82. package/dist/cli/commands/files/get.js.map +1 -1
  83. package/dist/cli/commands/files/list.d.ts +4 -4
  84. package/dist/cli/commands/files/list.d.ts.map +1 -1
  85. package/dist/cli/commands/files/list.js +6 -8
  86. package/dist/cli/commands/files/list.js.map +1 -1
  87. package/dist/cli/commands/files/update.d.ts +4 -4
  88. package/dist/cli/commands/files/update.d.ts.map +1 -1
  89. package/dist/cli/commands/files/update.js +8 -10
  90. package/dist/cli/commands/files/update.js.map +1 -1
  91. package/dist/cli/commands/files/upload.d.ts +4 -4
  92. package/dist/cli/commands/files/upload.d.ts.map +1 -1
  93. package/dist/cli/commands/files/upload.js +10 -12
  94. package/dist/cli/commands/files/upload.js.map +1 -1
  95. package/dist/cli/commands/uploads/abort.d.ts +2 -2
  96. package/dist/cli/commands/uploads/abort.d.ts.map +1 -1
  97. package/dist/cli/commands/uploads/abort.js.map +1 -1
  98. package/dist/cli/commands/uploads/complete.d.ts +2 -2
  99. package/dist/cli/commands/uploads/complete.d.ts.map +1 -1
  100. package/dist/cli/commands/uploads/complete.js.map +1 -1
  101. package/dist/cli/commands/uploads/content.d.ts +2 -2
  102. package/dist/cli/commands/uploads/content.d.ts.map +1 -1
  103. package/dist/cli/commands/uploads/content.js +1 -1
  104. package/dist/cli/commands/uploads/content.js.map +1 -1
  105. package/dist/cli/commands/uploads/create.d.ts +4 -4
  106. package/dist/cli/commands/uploads/create.d.ts.map +1 -1
  107. package/dist/cli/commands/uploads/create.js +8 -11
  108. package/dist/cli/commands/uploads/create.js.map +1 -1
  109. package/dist/cli/commands/uploads/get.d.ts +2 -2
  110. package/dist/cli/commands/uploads/get.d.ts.map +1 -1
  111. package/dist/cli/commands/uploads/get.js.map +1 -1
  112. package/dist/cli/commands/uploads/parts-complete.d.ts +2 -2
  113. package/dist/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  114. package/dist/cli/commands/uploads/parts-complete.js.map +1 -1
  115. package/dist/cli/commands/uploads/parts-list.d.ts +2 -2
  116. package/dist/cli/commands/uploads/parts-list.d.ts.map +1 -1
  117. package/dist/cli/commands/uploads/parts-list.js.map +1 -1
  118. package/dist/cli/commands/uploads/parts-urls.d.ts +2 -2
  119. package/dist/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  120. package/dist/cli/commands/uploads/parts-urls.js.map +1 -1
  121. package/dist/cli/commands/uploads/progress.d.ts +2 -2
  122. package/dist/cli/commands/uploads/progress.d.ts.map +1 -1
  123. package/dist/cli/commands/uploads/progress.js.map +1 -1
  124. package/dist/cli/commands/uploads/transfer.d.ts +4 -4
  125. package/dist/cli/commands/uploads/transfer.d.ts.map +1 -1
  126. package/dist/cli/commands/uploads/transfer.js +9 -12
  127. package/dist/cli/commands/uploads/transfer.js.map +1 -1
  128. package/dist/cli/index.d.ts +13 -13
  129. package/dist/cli/index.d.ts.map +1 -1
  130. package/dist/cli/index.js +14 -14
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/cli/utils/client.js +22 -5
  133. package/dist/cli/utils/client.js.map +1 -1
  134. package/dist/cli/utils/options.js +7 -43
  135. package/dist/cli/utils/options.js.map +1 -1
  136. package/dist/node/cli/commands/files/delete.d.ts +4 -4
  137. package/dist/node/cli/commands/files/delete.d.ts.map +1 -1
  138. package/dist/node/cli/commands/files/delete.js +8 -10
  139. package/dist/node/cli/commands/files/delete.js.map +1 -1
  140. package/dist/node/cli/commands/files/download-url.d.ts +4 -4
  141. package/dist/node/cli/commands/files/download-url.d.ts.map +1 -1
  142. package/dist/node/cli/commands/files/download-url.js +8 -10
  143. package/dist/node/cli/commands/files/download-url.js.map +1 -1
  144. package/dist/node/cli/commands/files/download.d.ts +4 -4
  145. package/dist/node/cli/commands/files/download.d.ts.map +1 -1
  146. package/dist/node/cli/commands/files/download.js +9 -11
  147. package/dist/node/cli/commands/files/download.js.map +1 -1
  148. package/dist/node/cli/commands/files/get.d.ts +4 -4
  149. package/dist/node/cli/commands/files/get.d.ts.map +1 -1
  150. package/dist/node/cli/commands/files/get.js +8 -10
  151. package/dist/node/cli/commands/files/get.js.map +1 -1
  152. package/dist/node/cli/commands/files/list.d.ts +4 -4
  153. package/dist/node/cli/commands/files/list.d.ts.map +1 -1
  154. package/dist/node/cli/commands/files/list.js +6 -8
  155. package/dist/node/cli/commands/files/list.js.map +1 -1
  156. package/dist/node/cli/commands/files/update.d.ts +4 -4
  157. package/dist/node/cli/commands/files/update.d.ts.map +1 -1
  158. package/dist/node/cli/commands/files/update.js +8 -10
  159. package/dist/node/cli/commands/files/update.js.map +1 -1
  160. package/dist/node/cli/commands/files/upload.d.ts +4 -4
  161. package/dist/node/cli/commands/files/upload.d.ts.map +1 -1
  162. package/dist/node/cli/commands/files/upload.js +9 -11
  163. package/dist/node/cli/commands/files/upload.js.map +1 -1
  164. package/dist/node/cli/commands/uploads/abort.d.ts +2 -2
  165. package/dist/node/cli/commands/uploads/abort.d.ts.map +1 -1
  166. package/dist/node/cli/commands/uploads/abort.js.map +1 -1
  167. package/dist/node/cli/commands/uploads/complete.d.ts +2 -2
  168. package/dist/node/cli/commands/uploads/complete.d.ts.map +1 -1
  169. package/dist/node/cli/commands/uploads/complete.js.map +1 -1
  170. package/dist/node/cli/commands/uploads/content.d.ts +2 -2
  171. package/dist/node/cli/commands/uploads/content.d.ts.map +1 -1
  172. package/dist/node/cli/commands/uploads/content.js.map +1 -1
  173. package/dist/node/cli/commands/uploads/create.d.ts +4 -4
  174. package/dist/node/cli/commands/uploads/create.d.ts.map +1 -1
  175. package/dist/node/cli/commands/uploads/create.js +8 -11
  176. package/dist/node/cli/commands/uploads/create.js.map +1 -1
  177. package/dist/node/cli/commands/uploads/get.d.ts +2 -2
  178. package/dist/node/cli/commands/uploads/get.d.ts.map +1 -1
  179. package/dist/node/cli/commands/uploads/get.js.map +1 -1
  180. package/dist/node/cli/commands/uploads/parts-complete.d.ts +2 -2
  181. package/dist/node/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  182. package/dist/node/cli/commands/uploads/parts-complete.js.map +1 -1
  183. package/dist/node/cli/commands/uploads/parts-list.d.ts +2 -2
  184. package/dist/node/cli/commands/uploads/parts-list.d.ts.map +1 -1
  185. package/dist/node/cli/commands/uploads/parts-list.js.map +1 -1
  186. package/dist/node/cli/commands/uploads/parts-urls.d.ts +2 -2
  187. package/dist/node/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  188. package/dist/node/cli/commands/uploads/parts-urls.js.map +1 -1
  189. package/dist/node/cli/commands/uploads/progress.d.ts +2 -2
  190. package/dist/node/cli/commands/uploads/progress.d.ts.map +1 -1
  191. package/dist/node/cli/commands/uploads/progress.js.map +1 -1
  192. package/dist/node/cli/commands/uploads/transfer.d.ts +4 -4
  193. package/dist/node/cli/commands/uploads/transfer.d.ts.map +1 -1
  194. package/dist/node/cli/commands/uploads/transfer.js +8 -11
  195. package/dist/node/cli/commands/uploads/transfer.js.map +1 -1
  196. package/dist/node/cli/index.d.ts +13 -13
  197. package/dist/node/cli/index.d.ts.map +1 -1
  198. package/dist/node/cli/index.js +14 -14
  199. package/dist/node/cli/index.js.map +1 -1
  200. package/dist/node/cli/utils/client.js +22 -5
  201. package/dist/node/cli/utils/client.js.map +1 -1
  202. package/dist/node/cli/utils/options.js +7 -43
  203. package/dist/node/cli/utils/options.js.map +1 -1
  204. package/dist/node/client/clients.d.ts +217 -194
  205. package/dist/node/client/clients.d.ts.map +1 -1
  206. package/dist/node/client/clients.js +17 -9
  207. package/dist/node/client/clients.js.map +1 -1
  208. package/dist/node/client/helpers.d.ts +15 -6
  209. package/dist/node/client/helpers.d.ts.map +1 -1
  210. package/dist/node/client/helpers.js +176 -30
  211. package/dist/node/client/helpers.js.map +1 -1
  212. package/dist/node/client/react.d.ts +217 -194
  213. package/dist/node/client/react.d.ts.map +1 -1
  214. package/dist/node/client/react.js.map +1 -1
  215. package/dist/node/client/solid.d.ts +218 -196
  216. package/dist/node/client/solid.d.ts.map +1 -1
  217. package/dist/node/client/solid.js.map +1 -1
  218. package/dist/node/client/svelte.d.ts +216 -193
  219. package/dist/node/client/svelte.d.ts.map +1 -1
  220. package/dist/node/client/svelte.js.map +1 -1
  221. package/dist/node/client/vanilla.d.ts +217 -195
  222. package/dist/node/client/vanilla.d.ts.map +1 -1
  223. package/dist/node/client/vanilla.js.map +1 -1
  224. package/dist/node/client/vue.d.ts +217 -194
  225. package/dist/node/client/vue.d.ts.map +1 -1
  226. package/dist/node/client/vue.js.map +1 -1
  227. package/dist/node/config.d.ts +6 -6
  228. package/dist/node/config.d.ts.map +1 -1
  229. package/dist/node/config.js.map +1 -1
  230. package/dist/node/definition.d.ts +588 -219
  231. package/dist/node/definition.d.ts.map +1 -1
  232. package/dist/node/definition.js +27 -3
  233. package/dist/node/definition.js.map +1 -1
  234. package/dist/node/file-key.d.ts +19 -0
  235. package/dist/node/file-key.d.ts.map +1 -0
  236. package/dist/node/file-key.js +47 -0
  237. package/dist/node/file-key.js.map +1 -0
  238. package/dist/node/index.d.ts +582 -175
  239. package/dist/node/index.d.ts.map +1 -1
  240. package/dist/node/index.js +3 -2
  241. package/dist/node/index.js.map +1 -1
  242. package/dist/node/routes/files.js +99 -64
  243. package/dist/node/routes/files.js.map +1 -1
  244. package/dist/node/routes/index.d.ts +1497 -721
  245. package/dist/node/routes/index.d.ts.map +1 -1
  246. package/dist/node/routes/shared.js +5 -9
  247. package/dist/node/routes/shared.js.map +1 -1
  248. package/dist/node/routes/uploads.js +105 -47
  249. package/dist/node/routes/uploads.js.map +1 -1
  250. package/dist/node/schema.d.ts +6 -6
  251. package/dist/node/schema.d.ts.map +1 -1
  252. package/dist/node/schema.js +12 -3
  253. package/dist/node/schema.js.map +1 -1
  254. package/dist/node/services/files.d.ts +6 -2
  255. package/dist/node/services/files.d.ts.map +1 -1
  256. package/dist/node/services/files.js +22 -20
  257. package/dist/node/services/files.js.map +1 -1
  258. package/dist/node/services/helpers.js +37 -15
  259. package/dist/node/services/helpers.js.map +1 -1
  260. package/dist/node/services/uploads.d.ts +10 -5
  261. package/dist/node/services/uploads.d.ts.map +1 -1
  262. package/dist/node/services/uploads.js +340 -63
  263. package/dist/node/services/uploads.js.map +1 -1
  264. package/dist/node/storage/fs.d.ts.map +1 -1
  265. package/dist/node/storage/fs.js +16 -10
  266. package/dist/node/storage/fs.js.map +1 -1
  267. package/dist/node/storage/object-key.js +36 -0
  268. package/dist/node/storage/object-key.js.map +1 -0
  269. package/dist/node/storage/r2-binding.d.ts +59 -0
  270. package/dist/node/storage/r2-binding.d.ts.map +1 -0
  271. package/dist/node/storage/r2-binding.js +245 -0
  272. package/dist/node/storage/r2-binding.js.map +1 -0
  273. package/dist/node/storage/r2.d.ts +6 -5
  274. package/dist/node/storage/r2.d.ts.map +1 -1
  275. package/dist/node/storage/s3.d.ts.map +1 -1
  276. package/dist/node/storage/s3.js +16 -10
  277. package/dist/node/storage/s3.js.map +1 -1
  278. package/dist/node/storage/types.d.ts +6 -5
  279. package/dist/node/storage/types.d.ts.map +1 -1
  280. package/dist/node/types.d.ts +1 -2
  281. package/dist/node/types.d.ts.map +1 -1
  282. package/package.json +26 -46
  283. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js.map +0 -1
  284. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js +0 -6
  285. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js.map +0 -1
  286. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts +0 -7
  287. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts.map +0 -1
  288. package/dist/browser/client/packages/fragment-upload/src/keys.js +0 -28
  289. package/dist/browser/client/packages/fragment-upload/src/keys.js.map +0 -1
  290. package/dist/browser/index-BdjKPO4J.d.ts +0 -177
  291. package/dist/browser/index-BdjKPO4J.d.ts.map +0 -1
  292. package/dist/browser/index.js +0 -3
  293. package/dist/browser/src-vdNJUbjT.js +0 -1982
  294. package/dist/browser/src-vdNJUbjT.js.map +0 -1
  295. package/dist/cli/keys.js +0 -32
  296. package/dist/cli/keys.js.map +0 -1
  297. package/dist/node/keys.d.ts +0 -12
  298. package/dist/node/keys.d.ts.map +0 -1
  299. package/dist/node/keys.js +0 -63
  300. package/dist/node/keys.js.map +0 -1
  301. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -4,7 +4,6 @@ type FileStatus = "ready" | "deleted";
4
4
  type UploadStrategy = "direct-single" | "direct-multipart" | "proxy";
5
5
  type FileMetadata = {
6
6
  fileKey: string;
7
- fileKeyParts: (string | number)[];
8
7
  uploaderId: string | null;
9
8
  filename: string;
10
9
  sizeBytes: number;
@@ -17,7 +16,7 @@ type FileMetadata = {
17
16
  tags: string[] | null;
18
17
  metadata: Record<string, unknown> | null;
19
18
  status: FileStatus;
20
- storageProvider: string;
19
+ provider: string;
21
20
  createdAt: string;
22
21
  updatedAt: string;
23
22
  completedAt: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../../../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,cAAA;AAAA,KAEA,UAAA,GAFc,OAAA,GAAA,SAAA;AAYd,KAAA,cAAA,GAAc,eAAA,GAAA,kBAAA,GAAA,OAAA;AAEd,KAAA,YAAA,GAAY;EAAA,OAAA,EAAA,MAAA;cAQV,EAAA,CAAA,MAAA,GAAA,MAAA,CAAA,EAAA;YAEF,EAAA,MAAA,GAAA,IAAA;UACF,EAAA,MAAA;EAAU,SAAA,EAAA,MAAA;;;;;;cAHN;;YAEF;UACF"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../../../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,cAAA;AAAA,KAEA,UAAA,GAFc,OAAA,GAAA,SAAA;AAYd,KAAA,cAAA,GAAc,eAAA,GAAA,kBAAA,GAAA,OAAA;AAEd,KAAA,YAAA,GAAY;EAAA,OAAA,EAAA,MAAA;YAOV,EAAA,MAAA,GAAA,IAAA;UAEF,EAAA,MAAA;WACF,EAAA,MAAA;EAAU,WAAA,EAAA,MAAA;;;;;cAHN;;YAEF;UACF"}
@@ -1,17 +1,17 @@
1
- import { task } from "../../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/task/index.js";
2
- import { computed } from "../../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js";
3
- import { SSR_ENABLED, addStore, getInitialData } from "../util/ssr.js";
4
1
  import { unwrapObject } from "../util/nanostores.js";
2
+ import { task } from "../../../../node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/task/index.js";
3
+ import { computed } from "../../../../node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/computed/index.js";
4
+ import { SSR_ENABLED, addStore, getInitialData } from "../util/ssr.js";
5
5
  import { resolveRouteFactories } from "../api/route.js";
6
+ import { buildPath, extractPathParams } from "../api/internal/path.js";
6
7
  import { getMountRoute } from "../api/internal/route.js";
7
8
  import { RequestInputContext } from "../api/request-input-context.js";
8
9
  import { RequestOutputContext } from "../api/request-output-context.js";
9
- import { buildPath, extractPathParams } from "../api/internal/path.js";
10
- import { FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError } from "./client-error.js";
11
10
  import { parseContentType } from "../util/content-type.js";
12
- import { handleNdjsonStreamingFirstItem } from "./internal/ndjson-streaming.js";
11
+ import { FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError } from "./client-error.js";
13
12
  import { mergeFetcherConfigs } from "./internal/fetcher-merge.js";
14
- import { nanoquery } from "../../../../node_modules/.pnpm/@nanostores_query@0.3.4_nanostores@1.1.0/node_modules/@nanostores/query/dist/nanoquery.js";
13
+ import { handleNdjsonStreamingFirstItem } from "./internal/ndjson-streaming.js";
14
+ import { nanoquery } from "../../../../node_modules/.pnpm/@nanostores_query@0.3.4_nanostores@1.2.0/node_modules/@nanostores/query/dist/nanoquery.js";
15
15
 
16
16
  //#region ../fragno/dist/client/client.js
17
17
  /**
@@ -74,6 +74,18 @@ function prepareRequestBody(body, contentType) {
74
74
  headers: { "Content-Type": "application/json" }
75
75
  };
76
76
  }
77
+ async function schemaAllowsUndefined(schema) {
78
+ try {
79
+ return !(await schema["~standard"].validate(void 0)).issues;
80
+ } catch {
81
+ return false;
82
+ }
83
+ }
84
+ async function assertBodyProvided(body, inputSchema, errorMessage) {
85
+ if (typeof body !== "undefined" || inputSchema === void 0) return;
86
+ if (await schemaAllowsUndefined(inputSchema)) return;
87
+ throw new Error(errorMessage);
88
+ }
77
89
  /**
78
90
  * Merge request headers from multiple sources.
79
91
  * Returns undefined if there are no headers to merge.
@@ -184,9 +196,13 @@ var ClientBuilder = class {
184
196
  get cacheEntries() {
185
197
  return Object.fromEntries(this.#cache.entries());
186
198
  }
187
- createStore(obj) {
199
+ createStore(input) {
200
+ if (typeof input === "function") return {
201
+ factory: input,
202
+ [STORE_SYMBOL]: true
203
+ };
188
204
  return {
189
- obj,
205
+ obj: input,
190
206
  [STORE_SYMBOL]: true
191
207
  };
192
208
  }
@@ -219,7 +235,7 @@ var ClientBuilder = class {
219
235
  }
220
236
  #getFetcher() {
221
237
  if (this.#fetcherConfig?.type === "function") return this.#fetcherConfig.fetcher;
222
- return fetch;
238
+ return globalThis.fetch.bind(globalThis);
223
239
  }
224
240
  #getFetcherOptions() {
225
241
  if (this.#fetcherConfig?.type === "options") return this.#fetcherConfig.options;
@@ -393,7 +409,7 @@ var ClientBuilder = class {
393
409
  const mutatorStore = this.#createMutatorStore(async ({ data }) => {
394
410
  if (typeof window === "undefined") {}
395
411
  const { body, path, query } = data;
396
- if (typeof body === "undefined" && route.inputSchema !== void 0) throw new Error("Body is required.");
412
+ await assertBodyProvided(body, route.inputSchema, "Body is required.");
397
413
  const response = await executeMutateQuery({
398
414
  body,
399
415
  path,
@@ -432,7 +448,7 @@ var ClientBuilder = class {
432
448
  } });
433
449
  const mutateQuery = async (data) => {
434
450
  const { body, path, query } = data;
435
- if (typeof body === "undefined" && route.inputSchema !== void 0) throw new Error("Body is required for mutateQuery");
451
+ await assertBodyProvided(body, route.inputSchema, "Body is required for mutateQuery");
436
452
  const response = await executeMutateQuery({
437
453
  body,
438
454
  path,
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["resolveRouteFactories","getMountRoute","RequestInputContext","RequestOutputContext","buildPath","extractPathParams","FragnoClientApiError","FragnoClientError","FragnoClientFetchAbortError","FragnoClientFetchError","FragnoClientFetchNetworkError","FragnoClientUnknownApiError","parseContentType","handleNdjsonStreamingFirstItem","SSR_ENABLED","addStore","getInitialData","unwrapObject","mergeFetcherConfigs","computed","task","nanoquery","GET_HOOK_SYMBOL","Symbol","MUTATOR_HOOK_SYMBOL","STORE_SYMBOL","containsFiles","value","File","Blob","FormData","Object","values","some","v","toFormData","formData","key","val","entries","append","name","JSON","stringify","prepareRequestBody","body","contentType","ReadableStream","ArrayBuffer","Uint8Array","headers","Error","mergeRequestHeaders","headerSources","result","hasHeaders","source","Headers","Array","isArray","buildUrl","config","params","baseUrl","mountRoute","path","pathParams","queryParams","normalizedPathParams","normalizedQueryParams","filteredQueryParams","fromEntries","filter","_","searchParams","URLSearchParams","toString","getCacheKey","method","pathParamValues","map","queryParamValues","keys","sort","isStreamingResponse","response","get","subtype","isGetHook","hook","isMutatorHook","isStore","obj","ClientBuilder","publicConfig","fragmentConfig","fetcherConfig","cache","Map","createFetcherStore","createMutatorStore","invalidateKeys","constructor","cacheEntries","createStore","query","getFetcher","fetcher","defaultOptions","getFetcherOptions","#getFetcher","type","fetch","#getFetcherOptions","options","createHook","route","routes","find","r","outputSchema","createRouteQueryHook","createMutator","onInvalidate","createRouteQueryMutator","#createRouteQueryHook","fetcherOptions","callServerSideHandler","handler","fromSSRContext","executeQuery","window","url","error","fromUnknownFetchError","ok","fromResponse","store","args","initialData","d","join","isStreaming","json","firstItem","setData","set","loading","length","data","setError","onErrorRetry","dedupeTime","Infinity","streamingPromise","#createRouteQueryMutator","invalidate","executeMutateQuery","inputSchema","preparedBody","bodyHeaders","mergedHeaders","requestOptions","duplex","mutatorStore","bind","status","onError","console","mutateQuery","#invalidate","prefix","k","startsWith","createClientBuilder","definition","routesOrFactories","authorFetcherConfig","deps","services","serviceDeps","mergedFetcherConfig"],"sources":["../../../../../../../../fragno/dist/client/client.js"],"sourcesContent":["import { resolveRouteFactories } from \"../api/route.js\";\nimport { getMountRoute } from \"../api/internal/route.js\";\nimport { RequestInputContext } from \"../api/request-input-context.js\";\nimport { RequestOutputContext } from \"../api/request-output-context.js\";\nimport { buildPath, extractPathParams } from \"../api/internal/path.js\";\nimport { FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError } from \"./client-error.js\";\nimport { parseContentType } from \"../util/content-type.js\";\nimport { handleNdjsonStreamingFirstItem } from \"./internal/ndjson-streaming.js\";\nimport { SSR_ENABLED, addStore, getInitialData } from \"../util/ssr.js\";\nimport { unwrapObject } from \"../util/nanostores.js\";\nimport { mergeFetcherConfigs } from \"./internal/fetcher-merge.js\";\nimport { computed, task } from \"nanostores\";\nimport { nanoquery } from \"@nanostores/query\";\n\n//#region src/client/client.ts\n/**\n* Symbols used to identify hook types\n*/\nconst GET_HOOK_SYMBOL = Symbol(\"fragno-get-hook\");\nconst MUTATOR_HOOK_SYMBOL = Symbol(\"fragno-mutator-hook\");\nconst STORE_SYMBOL = Symbol(\"fragno-store\");\n/**\n* Check if a value contains files that should be sent as FormData.\n* @internal\n*/\nfunction containsFiles(value) {\n\tif (value instanceof File || value instanceof Blob) return true;\n\tif (value instanceof FormData) return true;\n\tif (typeof value === \"object\" && value !== null) return Object.values(value).some((v) => v instanceof File || v instanceof Blob || v instanceof FormData);\n\treturn false;\n}\n/**\n* Convert an object containing files to FormData.\n* Handles nested File/Blob values by appending them directly.\n* Other values are JSON-stringified.\n* @internal\n*/\nfunction toFormData(value) {\n\tconst formData = new FormData();\n\tfor (const [key, val] of Object.entries(value)) if (val instanceof File) formData.append(key, val, val.name);\n\telse if (val instanceof Blob) formData.append(key, val);\n\telse if (val !== void 0 && val !== null) formData.append(key, typeof val === \"string\" ? val : JSON.stringify(val));\n\treturn formData;\n}\n/**\n* Prepare request body and headers for sending.\n* Handles FormData (file uploads) vs JSON data.\n* @internal\n*/\nfunction prepareRequestBody(body, contentType) {\n\tif (body === void 0) return { body: void 0 };\n\tif (contentType === \"application/octet-stream\") {\n\t\tif (body instanceof ReadableStream || body instanceof Blob || body instanceof File || body instanceof ArrayBuffer || body instanceof Uint8Array) return {\n\t\t\tbody,\n\t\t\theaders: { \"Content-Type\": \"application/octet-stream\" }\n\t\t};\n\t\tthrow new Error(\"Octet-stream routes only accept Blob, File, ArrayBuffer, Uint8Array, or ReadableStream bodies.\");\n\t}\n\tif (body instanceof FormData) return { body };\n\tif (body instanceof File) {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", body, body.name);\n\t\treturn { body: formData };\n\t}\n\tif (body instanceof Blob) {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", body);\n\t\treturn { body: formData };\n\t}\n\tif (typeof body === \"object\" && body !== null && containsFiles(body)) return { body: toFormData(body) };\n\treturn {\n\t\tbody: JSON.stringify(body),\n\t\theaders: { \"Content-Type\": \"application/json\" }\n\t};\n}\n/**\n* Merge request headers from multiple sources.\n* Returns undefined if there are no headers to merge.\n* @internal\n*/\nfunction mergeRequestHeaders(...headerSources) {\n\tconst result = {};\n\tlet hasHeaders = false;\n\tfor (const source of headerSources) {\n\t\tif (!source) continue;\n\t\tif (source instanceof Headers) for (const [key, value] of source.entries()) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t\telse if (Array.isArray(source)) for (const [key, value] of source) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t\telse for (const [key, value] of Object.entries(source)) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t}\n\treturn hasHeaders ? result : void 0;\n}\n/**\n* @internal\n*/\nfunction buildUrl(config, params) {\n\tconst { baseUrl = \"\", mountRoute, path } = config;\n\tconst { pathParams, queryParams } = params ?? {};\n\tconst normalizedPathParams = unwrapObject(pathParams);\n\tconst normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\tconst filteredQueryParams = Object.fromEntries(Object.entries(normalizedQueryParams).filter(([_, value]) => value !== void 0));\n\tconst searchParams = new URLSearchParams(filteredQueryParams);\n\treturn `${baseUrl}${mountRoute}${buildPath(path, normalizedPathParams ?? {})}${searchParams.toString() ? `?${searchParams.toString()}` : \"\"}`;\n}\n/**\n* This method returns an array, which can be passed directly to nanostores.\n*\n* The returned array is always: path, pathParams (In order they appear in the path), queryParams (In alphabetical order)\n* Missing pathParams are replaced with \"<missing>\".\n* Atoms with undefined values are wrapped in computed atoms that map undefined to \"\" to avoid nanoquery treating the key as incomplete.\n* @param path\n* @param params\n* @returns\n* @internal\n*/\nfunction getCacheKey(method, path, params) {\n\tif (!params) return [method, path];\n\tconst { pathParams, queryParams } = params;\n\tconst pathParamValues = extractPathParams(path).map((name) => pathParams?.[name] ?? \"<missing>\");\n\tconst queryParamValues = queryParams ? Object.keys(queryParams).sort().map((key) => {\n\t\tconst value = queryParams[key];\n\t\tif (value && typeof value === \"object\" && \"get\" in value) return computed(value, (v) => v ?? \"\");\n\t\treturn value ?? \"\";\n\t}) : [];\n\treturn [\n\t\tmethod,\n\t\tpath,\n\t\t...pathParamValues,\n\t\t...queryParamValues\n\t];\n}\nfunction isStreamingResponse(response) {\n\tconst contentType = parseContentType(response.headers.get(\"content-type\"));\n\tif (!contentType) return false;\n\tif (!(response.headers.get(\"transfer-encoding\") === \"chunked\")) return false;\n\tif (contentType.subtype === \"octet-stream\") return \"octet-stream\";\n\tif (contentType.subtype === \"x-ndjson\") return \"ndjson\";\n\treturn false;\n}\n/**\n* @internal\n*/\nfunction isGetHook(hook) {\n\treturn typeof hook === \"object\" && hook !== null && GET_HOOK_SYMBOL in hook && hook[GET_HOOK_SYMBOL] === true;\n}\n/**\n* @internal\n*/\nfunction isMutatorHook(hook) {\n\treturn typeof hook === \"object\" && hook !== null && MUTATOR_HOOK_SYMBOL in hook && hook[MUTATOR_HOOK_SYMBOL] === true;\n}\n/**\n* @internal\n*/\nfunction isStore(obj) {\n\treturn typeof obj === \"object\" && obj !== null && STORE_SYMBOL in obj && obj[STORE_SYMBOL] === true;\n}\nvar ClientBuilder = class {\n\t#publicConfig;\n\t#fragmentConfig;\n\t#fetcherConfig;\n\t#cache = /* @__PURE__ */ new Map();\n\t#createFetcherStore;\n\t#createMutatorStore;\n\t#invalidateKeys;\n\tconstructor(publicConfig, fragmentConfig) {\n\t\tthis.#publicConfig = publicConfig;\n\t\tthis.#fragmentConfig = fragmentConfig;\n\t\tthis.#fetcherConfig = publicConfig.fetcherConfig;\n\t\tconst [createFetcherStore, createMutatorStore, { invalidateKeys }] = nanoquery({ cache: this.#cache });\n\t\tthis.#createFetcherStore = createFetcherStore;\n\t\tthis.#createMutatorStore = createMutatorStore;\n\t\tthis.#invalidateKeys = invalidateKeys;\n\t}\n\tget cacheEntries() {\n\t\treturn Object.fromEntries(this.#cache.entries());\n\t}\n\tcreateStore(obj) {\n\t\treturn {\n\t\t\tobj,\n\t\t\t[STORE_SYMBOL]: true\n\t\t};\n\t}\n\t/**\n\t* Build a URL for a custom backend call using the configured baseUrl and mountRoute.\n\t* Useful for fragment authors who need to make custom fetch calls.\n\t*/\n\tbuildUrl(path, params) {\n\t\treturn buildUrl({\n\t\t\tbaseUrl: this.#publicConfig.baseUrl ?? \"\",\n\t\t\tmountRoute: getMountRoute({\n\t\t\t\tname: this.#fragmentConfig.name,\n\t\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t\t}),\n\t\t\tpath\n\t\t}, {\n\t\t\tpathParams: params?.path,\n\t\t\tqueryParams: params?.query\n\t\t});\n\t}\n\t/**\n\t* Get the configured fetcher function for custom backend calls.\n\t* Returns fetch with merged options applied.\n\t*/\n\tgetFetcher() {\n\t\treturn {\n\t\t\tfetcher: this.#getFetcher(),\n\t\t\tdefaultOptions: this.#getFetcherOptions()\n\t\t};\n\t}\n\t#getFetcher() {\n\t\tif (this.#fetcherConfig?.type === \"function\") return this.#fetcherConfig.fetcher;\n\t\treturn fetch;\n\t}\n\t#getFetcherOptions() {\n\t\tif (this.#fetcherConfig?.type === \"options\") return this.#fetcherConfig.options;\n\t}\n\tcreateHook(path, options) {\n\t\tconst route = this.#fragmentConfig.routes.find((r) => r.path === path && r.method === \"GET\" && r.outputSchema !== void 0);\n\t\tif (!route) throw new Error(`Route '${path}' not found or is not a GET route with an output schema.`);\n\t\treturn this.#createRouteQueryHook(route, options);\n\t}\n\tcreateMutator(method, path, onInvalidate) {\n\t\tconst route = this.#fragmentConfig.routes.find((r) => r.method !== \"GET\" && r.path === path && r.method === method);\n\t\tif (!route) throw new Error(`Route '${path}' not found or is a GET route with an input and output schema.`);\n\t\treturn this.#createRouteQueryMutator(route, onInvalidate);\n\t}\n\t#createRouteQueryHook(route, options = {}) {\n\t\tif (route.method !== \"GET\") throw new Error(`Only GET routes are supported for hooks. Route '${route.path}' is a ${route.method} route.`);\n\t\tif (!route.outputSchema) throw new Error(`Output schema is required for GET routes. Route '${route.path}' has no output schema.`);\n\t\tconst baseUrl = this.#publicConfig.baseUrl ?? \"\";\n\t\tconst mountRoute = getMountRoute({\n\t\t\tname: this.#fragmentConfig.name,\n\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t});\n\t\tconst fetcher = this.#getFetcher();\n\t\tconst fetcherOptions = this.#getFetcherOptions();\n\t\tasync function callServerSideHandler(params) {\n\t\t\tconst { pathParams, queryParams } = params ?? {};\n\t\t\tconst normalizedPathParams = unwrapObject(pathParams);\n\t\t\tconst normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\t\t\tconst filteredQueryParams = Object.fromEntries(Object.entries(normalizedQueryParams).filter(([_, value]) => value !== void 0));\n\t\t\tconst searchParams = new URLSearchParams(filteredQueryParams);\n\t\t\treturn await route.handler(RequestInputContext.fromSSRContext({\n\t\t\t\tmethod: route.method,\n\t\t\t\tpath: route.path,\n\t\t\t\tpathParams: normalizedPathParams,\n\t\t\t\tsearchParams\n\t\t\t}), new RequestOutputContext(route.outputSchema));\n\t\t}\n\t\tasync function executeQuery(params) {\n\t\t\tconst { pathParams, queryParams } = params ?? {};\n\t\t\tif (typeof window === \"undefined\") return task(async () => callServerSideHandler({\n\t\t\t\tpathParams,\n\t\t\t\tqueryParams\n\t\t\t}));\n\t\t\tconst url = buildUrl({\n\t\t\t\tbaseUrl,\n\t\t\t\tmountRoute,\n\t\t\t\tpath: route.path\n\t\t\t}, {\n\t\t\t\tpathParams,\n\t\t\t\tqueryParams\n\t\t\t});\n\t\t\tlet response;\n\t\t\ttry {\n\t\t\t\tresponse = fetcherOptions ? await fetcher(url, fetcherOptions) : await fetcher(url);\n\t\t\t} catch (error) {\n\t\t\t\tthrow FragnoClientFetchError.fromUnknownFetchError(error);\n\t\t\t}\n\t\t\tif (!response.ok) throw await FragnoClientApiError.fromResponse(response);\n\t\t\treturn response;\n\t\t}\n\t\treturn {\n\t\t\troute,\n\t\t\tstore: (args) => {\n\t\t\t\tconst { path, query } = args ?? {};\n\t\t\t\tconst key = getCacheKey(route.method, route.path, {\n\t\t\t\t\tpathParams: path,\n\t\t\t\t\tqueryParams: query\n\t\t\t\t});\n\t\t\t\tconst store = this.#createFetcherStore(key, {\n\t\t\t\t\tfetcher: async () => {\n\t\t\t\t\t\tif (SSR_ENABLED) {\n\t\t\t\t\t\t\tconst initialData = getInitialData(key.map((d) => typeof d === \"string\" ? d : d.get()).join(\"\"));\n\t\t\t\t\t\t\tif (initialData) return initialData;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst response = await executeQuery({\n\t\t\t\t\t\t\tpathParams: path,\n\t\t\t\t\t\t\tqueryParams: query\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\t\t\t\tif (!isStreaming) return response.json();\n\t\t\t\t\t\tif (typeof window === \"undefined\") return [];\n\t\t\t\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\t\t\t\tconst { firstItem } = await handleNdjsonStreamingFirstItem(response, {\n\t\t\t\t\t\t\t\tsetData: (value) => {\n\t\t\t\t\t\t\t\t\tstore.set({\n\t\t\t\t\t\t\t\t\t\t...store.get(),\n\t\t\t\t\t\t\t\t\t\tloading: !(Array.isArray(value) && value.length > 0),\n\t\t\t\t\t\t\t\t\t\tdata: value\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsetError: (value) => {\n\t\t\t\t\t\t\t\t\tstore.set({\n\t\t\t\t\t\t\t\t\t\t...store.get(),\n\t\t\t\t\t\t\t\t\t\terror: value\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn [firstItem];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\t\t\t\tthrow new Error(\"Unreachable\");\n\t\t\t\t\t},\n\t\t\t\t\tonErrorRetry: options?.onErrorRetry,\n\t\t\t\t\tdedupeTime: Infinity\n\t\t\t\t});\n\t\t\t\tif (typeof window === \"undefined\") addStore(store);\n\t\t\t\treturn store;\n\t\t\t},\n\t\t\tquery: async (args) => {\n\t\t\t\tconst { path, query } = args ?? {};\n\t\t\t\tconst response = await executeQuery({\n\t\t\t\t\tpathParams: path,\n\t\t\t\t\tqueryParams: query\n\t\t\t\t});\n\t\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\t\tif (!isStreaming) return await response.json();\n\t\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\t\tconst { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n\t\t\t\t\treturn await streamingPromise;\n\t\t\t\t}\n\t\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\t\tthrow new Error(\"Unreachable\");\n\t\t\t},\n\t\t\t[GET_HOOK_SYMBOL]: true\n\t\t};\n\t}\n\t#createRouteQueryMutator(route, onInvalidate = (invalidate, params) => invalidate(\"GET\", route.path, params)) {\n\t\tconst method = route.method;\n\t\tconst baseUrl = this.#publicConfig.baseUrl ?? \"\";\n\t\tconst mountRoute = getMountRoute({\n\t\t\tname: this.#fragmentConfig.name,\n\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t});\n\t\tconst fetcher = this.#getFetcher();\n\t\tconst fetcherOptions = this.#getFetcherOptions();\n\t\tasync function executeMutateQuery({ body, path, query }) {\n\t\t\tif (typeof window === \"undefined\") return task(async () => route.handler(RequestInputContext.fromSSRContext({\n\t\t\t\tinputSchema: route.inputSchema,\n\t\t\t\tmethod,\n\t\t\t\tpath: route.path,\n\t\t\t\tpathParams: path ?? {},\n\t\t\t\tsearchParams: new URLSearchParams(query),\n\t\t\t\tbody\n\t\t\t}), new RequestOutputContext(route.outputSchema)));\n\t\t\tconst url = buildUrl({\n\t\t\t\tbaseUrl,\n\t\t\t\tmountRoute,\n\t\t\t\tpath: route.path\n\t\t\t}, {\n\t\t\t\tpathParams: path,\n\t\t\t\tqueryParams: query\n\t\t\t});\n\t\t\tlet response;\n\t\t\ttry {\n\t\t\t\tconst { body: preparedBody, headers: bodyHeaders } = prepareRequestBody(body, route.contentType);\n\t\t\t\tconst mergedHeaders = mergeRequestHeaders(fetcherOptions?.headers, bodyHeaders);\n\t\t\t\tconst requestOptions = {\n\t\t\t\t\t...fetcherOptions,\n\t\t\t\t\tmethod,\n\t\t\t\t\tbody: preparedBody,\n\t\t\t\t\t...mergedHeaders ? { headers: mergedHeaders } : {}\n\t\t\t\t};\n\t\t\t\tif (preparedBody instanceof ReadableStream) requestOptions.duplex = \"half\";\n\t\t\t\tresponse = await fetcher(url, requestOptions);\n\t\t\t} catch (error) {\n\t\t\t\tthrow FragnoClientFetchError.fromUnknownFetchError(error);\n\t\t\t}\n\t\t\tif (!response.ok) throw await FragnoClientApiError.fromResponse(response);\n\t\t\treturn response;\n\t\t}\n\t\tconst mutatorStore = this.#createMutatorStore(async ({ data }) => {\n\t\t\tif (typeof window === \"undefined\") {}\n\t\t\tconst { body, path, query } = data;\n\t\t\tif (typeof body === \"undefined\" && route.inputSchema !== void 0) throw new Error(\"Body is required.\");\n\t\t\tconst response = await executeMutateQuery({\n\t\t\t\tbody,\n\t\t\t\tpath,\n\t\t\t\tquery\n\t\t\t});\n\t\t\tonInvalidate(this.#invalidate.bind(this), {\n\t\t\t\tpathParams: path ?? {},\n\t\t\t\tqueryParams: query\n\t\t\t});\n\t\t\tif (response.status === 201 || response.status === 204) return;\n\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\tif (!isStreaming) return response.json();\n\t\t\tif (typeof window === \"undefined\") return [];\n\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\tconst { firstItem } = await handleNdjsonStreamingFirstItem(response, {\n\t\t\t\t\tsetData: (value) => {\n\t\t\t\t\t\tmutatorStore.set({\n\t\t\t\t\t\t\t...mutatorStore.get(),\n\t\t\t\t\t\t\tloading: !(Array.isArray(value) && value.length > 0),\n\t\t\t\t\t\t\tdata: value\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tsetError: (value) => {\n\t\t\t\t\t\tmutatorStore.set({\n\t\t\t\t\t\t\t...mutatorStore.get(),\n\t\t\t\t\t\t\terror: value\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn [firstItem];\n\t\t\t}\n\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\tthrow new Error(\"Unreachable\");\n\t\t}, { onError: (error) => {\n\t\t\tconsole.error(\"Error in mutatorStore\", error);\n\t\t} });\n\t\tconst mutateQuery = (async (data) => {\n\t\t\tconst { body, path, query } = data;\n\t\t\tif (typeof body === \"undefined\" && route.inputSchema !== void 0) throw new Error(\"Body is required for mutateQuery\");\n\t\t\tconst response = await executeMutateQuery({\n\t\t\t\tbody,\n\t\t\t\tpath,\n\t\t\t\tquery\n\t\t\t});\n\t\t\tif (response.status === 201 || response.status === 204) return;\n\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\tif (!isStreaming) return response.json();\n\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\tconst { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n\t\t\t\treturn await streamingPromise;\n\t\t\t}\n\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported for mutations\");\n\t\t\tthrow new Error(\"Unreachable\");\n\t\t});\n\t\treturn {\n\t\t\troute,\n\t\t\tmutateQuery,\n\t\t\tmutatorStore,\n\t\t\t[MUTATOR_HOOK_SYMBOL]: true\n\t\t};\n\t}\n\t#invalidate(method, path, params) {\n\t\tconst prefix = getCacheKey(method, path, {\n\t\t\tpathParams: params?.pathParams,\n\t\t\tqueryParams: params?.queryParams\n\t\t}).map((k) => typeof k === \"string\" ? k : k.get()).join(\"\");\n\t\tthis.#invalidateKeys((key) => key.startsWith(prefix));\n\t}\n};\n/**\n* Create a client builder for fragments using the new fragment definition API.\n* This is the same as createClientBuilder but works with FragmentDefinition.\n*/\nfunction createClientBuilder(definition, publicConfig, routesOrFactories, authorFetcherConfig) {\n\tconst routes = resolveRouteFactories({\n\t\tconfig: {},\n\t\tdeps: {},\n\t\tservices: {},\n\t\tserviceDeps: {}\n\t}, routesOrFactories);\n\tconst fragmentConfig = {\n\t\tname: definition.name,\n\t\troutes\n\t};\n\tconst mountRoute = getMountRoute({\n\t\tname: definition.name,\n\t\tmountRoute: publicConfig.mountRoute\n\t});\n\tconst mergedFetcherConfig = mergeFetcherConfigs(authorFetcherConfig, publicConfig.fetcherConfig);\n\treturn new ClientBuilder({\n\t\t...publicConfig,\n\t\tmountRoute,\n\t\tfetcherConfig: mergedFetcherConfig\n\t}, fragmentConfig);\n}\n\n//#endregion\nexport { ClientBuilder, FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError, buildUrl, createClientBuilder, getCacheKey, isGetHook, isMutatorHook, isStore };\n//# sourceMappingURL=client.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["resolveRouteFactories","buildPath","extractPathParams","getMountRoute","RequestInputContext","RequestOutputContext","parseContentType","unwrapObject","SSR_ENABLED","addStore","getInitialData","FragnoClientApiError","FragnoClientError","FragnoClientFetchAbortError","FragnoClientFetchError","FragnoClientFetchNetworkError","FragnoClientUnknownApiError","mergeFetcherConfigs","handleNdjsonStreamingFirstItem","computed","task","nanoquery","GET_HOOK_SYMBOL","Symbol","MUTATOR_HOOK_SYMBOL","STORE_SYMBOL","containsFiles","value","File","Blob","FormData","Object","values","some","v","toFormData","formData","key","val","entries","append","name","JSON","stringify","prepareRequestBody","body","contentType","ReadableStream","ArrayBuffer","Uint8Array","headers","Error","schemaAllowsUndefined","schema","validate","issues","assertBodyProvided","inputSchema","errorMessage","mergeRequestHeaders","headerSources","result","hasHeaders","source","Headers","Array","isArray","buildUrl","config","params","baseUrl","mountRoute","path","pathParams","queryParams","normalizedPathParams","normalizedQueryParams","filteredQueryParams","fromEntries","filter","_","searchParams","URLSearchParams","toString","getCacheKey","method","pathParamValues","map","queryParamValues","keys","sort","isStreamingResponse","response","get","subtype","isGetHook","hook","isMutatorHook","isStore","obj","ClientBuilder","publicConfig","fragmentConfig","fetcherConfig","cache","Map","createFetcherStore","createMutatorStore","invalidateKeys","constructor","cacheEntries","createStore","input","factory","query","getFetcher","fetcher","defaultOptions","getFetcherOptions","#getFetcher","type","globalThis","fetch","bind","#getFetcherOptions","options","createHook","route","routes","find","r","outputSchema","createRouteQueryHook","createMutator","onInvalidate","createRouteQueryMutator","#createRouteQueryHook","fetcherOptions","callServerSideHandler","handler","fromSSRContext","executeQuery","window","url","error","fromUnknownFetchError","ok","fromResponse","store","args","initialData","d","join","isStreaming","json","firstItem","setData","set","loading","length","data","setError","onErrorRetry","dedupeTime","Infinity","streamingPromise","#createRouteQueryMutator","invalidate","executeMutateQuery","preparedBody","bodyHeaders","mergedHeaders","requestOptions","duplex","mutatorStore","status","onError","console","mutateQuery","#invalidate","prefix","k","startsWith","createClientBuilder","definition","routesOrFactories","authorFetcherConfig","deps","services","serviceDeps","mergedFetcherConfig"],"sources":["../../../../../../../../fragno/dist/client/client.js"],"sourcesContent":["import { resolveRouteFactories } from \"../api/route.js\";\nimport { buildPath, extractPathParams } from \"../api/internal/path.js\";\nimport { getMountRoute } from \"../api/internal/route.js\";\nimport { RequestInputContext } from \"../api/request-input-context.js\";\nimport { RequestOutputContext } from \"../api/request-output-context.js\";\nimport { parseContentType } from \"../util/content-type.js\";\nimport { unwrapObject } from \"../util/nanostores.js\";\nimport { SSR_ENABLED, addStore, getInitialData } from \"../util/ssr.js\";\nimport { FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError } from \"./client-error.js\";\nimport { mergeFetcherConfigs } from \"./internal/fetcher-merge.js\";\nimport { handleNdjsonStreamingFirstItem } from \"./internal/ndjson-streaming.js\";\nimport { computed, task } from \"nanostores\";\nimport { nanoquery } from \"@nanostores/query\";\n\n//#region src/client/client.ts\n/**\n* Symbols used to identify hook types\n*/\nconst GET_HOOK_SYMBOL = Symbol(\"fragno-get-hook\");\nconst MUTATOR_HOOK_SYMBOL = Symbol(\"fragno-mutator-hook\");\nconst STORE_SYMBOL = Symbol(\"fragno-store\");\n/**\n* Check if a value contains files that should be sent as FormData.\n* @internal\n*/\nfunction containsFiles(value) {\n\tif (value instanceof File || value instanceof Blob) return true;\n\tif (value instanceof FormData) return true;\n\tif (typeof value === \"object\" && value !== null) return Object.values(value).some((v) => v instanceof File || v instanceof Blob || v instanceof FormData);\n\treturn false;\n}\n/**\n* Convert an object containing files to FormData.\n* Handles nested File/Blob values by appending them directly.\n* Other values are JSON-stringified.\n* @internal\n*/\nfunction toFormData(value) {\n\tconst formData = new FormData();\n\tfor (const [key, val] of Object.entries(value)) if (val instanceof File) formData.append(key, val, val.name);\n\telse if (val instanceof Blob) formData.append(key, val);\n\telse if (val !== void 0 && val !== null) formData.append(key, typeof val === \"string\" ? val : JSON.stringify(val));\n\treturn formData;\n}\n/**\n* Prepare request body and headers for sending.\n* Handles FormData (file uploads) vs JSON data.\n* @internal\n*/\nfunction prepareRequestBody(body, contentType) {\n\tif (body === void 0) return { body: void 0 };\n\tif (contentType === \"application/octet-stream\") {\n\t\tif (body instanceof ReadableStream || body instanceof Blob || body instanceof File || body instanceof ArrayBuffer || body instanceof Uint8Array) return {\n\t\t\tbody,\n\t\t\theaders: { \"Content-Type\": \"application/octet-stream\" }\n\t\t};\n\t\tthrow new Error(\"Octet-stream routes only accept Blob, File, ArrayBuffer, Uint8Array, or ReadableStream bodies.\");\n\t}\n\tif (body instanceof FormData) return { body };\n\tif (body instanceof File) {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", body, body.name);\n\t\treturn { body: formData };\n\t}\n\tif (body instanceof Blob) {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", body);\n\t\treturn { body: formData };\n\t}\n\tif (typeof body === \"object\" && body !== null && containsFiles(body)) return { body: toFormData(body) };\n\treturn {\n\t\tbody: JSON.stringify(body),\n\t\theaders: { \"Content-Type\": \"application/json\" }\n\t};\n}\nasync function schemaAllowsUndefined(schema) {\n\ttry {\n\t\treturn !(await schema[\"~standard\"].validate(void 0)).issues;\n\t} catch {\n\t\treturn false;\n\t}\n}\nasync function assertBodyProvided(body, inputSchema, errorMessage) {\n\tif (typeof body !== \"undefined\" || inputSchema === void 0) return;\n\tif (await schemaAllowsUndefined(inputSchema)) return;\n\tthrow new Error(errorMessage);\n}\n/**\n* Merge request headers from multiple sources.\n* Returns undefined if there are no headers to merge.\n* @internal\n*/\nfunction mergeRequestHeaders(...headerSources) {\n\tconst result = {};\n\tlet hasHeaders = false;\n\tfor (const source of headerSources) {\n\t\tif (!source) continue;\n\t\tif (source instanceof Headers) for (const [key, value] of source.entries()) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t\telse if (Array.isArray(source)) for (const [key, value] of source) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t\telse for (const [key, value] of Object.entries(source)) {\n\t\t\tresult[key] = value;\n\t\t\thasHeaders = true;\n\t\t}\n\t}\n\treturn hasHeaders ? result : void 0;\n}\n/**\n* @internal\n*/\nfunction buildUrl(config, params) {\n\tconst { baseUrl = \"\", mountRoute, path } = config;\n\tconst { pathParams, queryParams } = params ?? {};\n\tconst normalizedPathParams = unwrapObject(pathParams);\n\tconst normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\tconst filteredQueryParams = Object.fromEntries(Object.entries(normalizedQueryParams).filter(([_, value]) => value !== void 0));\n\tconst searchParams = new URLSearchParams(filteredQueryParams);\n\treturn `${baseUrl}${mountRoute}${buildPath(path, normalizedPathParams ?? {})}${searchParams.toString() ? `?${searchParams.toString()}` : \"\"}`;\n}\n/**\n* This method returns an array, which can be passed directly to nanostores.\n*\n* The returned array is always: path, pathParams (In order they appear in the path), queryParams (In alphabetical order)\n* Missing pathParams are replaced with \"<missing>\".\n* Atoms with undefined values are wrapped in computed atoms that map undefined to \"\" to avoid nanoquery treating the key as incomplete.\n* @param path\n* @param params\n* @returns\n* @internal\n*/\nfunction getCacheKey(method, path, params) {\n\tif (!params) return [method, path];\n\tconst { pathParams, queryParams } = params;\n\tconst pathParamValues = extractPathParams(path).map((name) => pathParams?.[name] ?? \"<missing>\");\n\tconst queryParamValues = queryParams ? Object.keys(queryParams).sort().map((key) => {\n\t\tconst value = queryParams[key];\n\t\tif (value && typeof value === \"object\" && \"get\" in value) return computed(value, (v) => v ?? \"\");\n\t\treturn value ?? \"\";\n\t}) : [];\n\treturn [\n\t\tmethod,\n\t\tpath,\n\t\t...pathParamValues,\n\t\t...queryParamValues\n\t];\n}\nfunction isStreamingResponse(response) {\n\tconst contentType = parseContentType(response.headers.get(\"content-type\"));\n\tif (!contentType) return false;\n\tif (!(response.headers.get(\"transfer-encoding\") === \"chunked\")) return false;\n\tif (contentType.subtype === \"octet-stream\") return \"octet-stream\";\n\tif (contentType.subtype === \"x-ndjson\") return \"ndjson\";\n\treturn false;\n}\n/**\n* @internal\n*/\nfunction isGetHook(hook) {\n\treturn typeof hook === \"object\" && hook !== null && GET_HOOK_SYMBOL in hook && hook[GET_HOOK_SYMBOL] === true;\n}\n/**\n* @internal\n*/\nfunction isMutatorHook(hook) {\n\treturn typeof hook === \"object\" && hook !== null && MUTATOR_HOOK_SYMBOL in hook && hook[MUTATOR_HOOK_SYMBOL] === true;\n}\n/**\n* @internal\n*/\nfunction isStore(obj) {\n\treturn typeof obj === \"object\" && obj !== null && STORE_SYMBOL in obj && obj[STORE_SYMBOL] === true;\n}\nvar ClientBuilder = class {\n\t#publicConfig;\n\t#fragmentConfig;\n\t#fetcherConfig;\n\t#cache = /* @__PURE__ */ new Map();\n\t#createFetcherStore;\n\t#createMutatorStore;\n\t#invalidateKeys;\n\tconstructor(publicConfig, fragmentConfig) {\n\t\tthis.#publicConfig = publicConfig;\n\t\tthis.#fragmentConfig = fragmentConfig;\n\t\tthis.#fetcherConfig = publicConfig.fetcherConfig;\n\t\tconst [createFetcherStore, createMutatorStore, { invalidateKeys }] = nanoquery({ cache: this.#cache });\n\t\tthis.#createFetcherStore = createFetcherStore;\n\t\tthis.#createMutatorStore = createMutatorStore;\n\t\tthis.#invalidateKeys = invalidateKeys;\n\t}\n\tget cacheEntries() {\n\t\treturn Object.fromEntries(this.#cache.entries());\n\t}\n\tcreateStore(input) {\n\t\tif (typeof input === \"function\") return {\n\t\t\tfactory: input,\n\t\t\t[STORE_SYMBOL]: true\n\t\t};\n\t\treturn {\n\t\t\tobj: input,\n\t\t\t[STORE_SYMBOL]: true\n\t\t};\n\t}\n\t/**\n\t* Build a URL for a custom backend call using the configured baseUrl and mountRoute.\n\t* Useful for fragment authors who need to make custom fetch calls.\n\t*/\n\tbuildUrl(path, params) {\n\t\treturn buildUrl({\n\t\t\tbaseUrl: this.#publicConfig.baseUrl ?? \"\",\n\t\t\tmountRoute: getMountRoute({\n\t\t\t\tname: this.#fragmentConfig.name,\n\t\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t\t}),\n\t\t\tpath\n\t\t}, {\n\t\t\tpathParams: params?.path,\n\t\t\tqueryParams: params?.query\n\t\t});\n\t}\n\t/**\n\t* Get the configured fetcher function for custom backend calls.\n\t* Returns fetch with merged options applied.\n\t*/\n\tgetFetcher() {\n\t\treturn {\n\t\t\tfetcher: this.#getFetcher(),\n\t\t\tdefaultOptions: this.#getFetcherOptions()\n\t\t};\n\t}\n\t#getFetcher() {\n\t\tif (this.#fetcherConfig?.type === \"function\") return this.#fetcherConfig.fetcher;\n\t\treturn globalThis.fetch.bind(globalThis);\n\t}\n\t#getFetcherOptions() {\n\t\tif (this.#fetcherConfig?.type === \"options\") return this.#fetcherConfig.options;\n\t}\n\tcreateHook(path, options) {\n\t\tconst route = this.#fragmentConfig.routes.find((r) => r.path === path && r.method === \"GET\" && r.outputSchema !== void 0);\n\t\tif (!route) throw new Error(`Route '${path}' not found or is not a GET route with an output schema.`);\n\t\treturn this.#createRouteQueryHook(route, options);\n\t}\n\tcreateMutator(method, path, onInvalidate) {\n\t\tconst route = this.#fragmentConfig.routes.find((r) => r.method !== \"GET\" && r.path === path && r.method === method);\n\t\tif (!route) throw new Error(`Route '${path}' not found or is a GET route with an input and output schema.`);\n\t\treturn this.#createRouteQueryMutator(route, onInvalidate);\n\t}\n\t#createRouteQueryHook(route, options = {}) {\n\t\tif (route.method !== \"GET\") throw new Error(`Only GET routes are supported for hooks. Route '${route.path}' is a ${route.method} route.`);\n\t\tif (!route.outputSchema) throw new Error(`Output schema is required for GET routes. Route '${route.path}' has no output schema.`);\n\t\tconst baseUrl = this.#publicConfig.baseUrl ?? \"\";\n\t\tconst mountRoute = getMountRoute({\n\t\t\tname: this.#fragmentConfig.name,\n\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t});\n\t\tconst fetcher = this.#getFetcher();\n\t\tconst fetcherOptions = this.#getFetcherOptions();\n\t\tasync function callServerSideHandler(params) {\n\t\t\tconst { pathParams, queryParams } = params ?? {};\n\t\t\tconst normalizedPathParams = unwrapObject(pathParams);\n\t\t\tconst normalizedQueryParams = unwrapObject(queryParams) ?? {};\n\t\t\tconst filteredQueryParams = Object.fromEntries(Object.entries(normalizedQueryParams).filter(([_, value]) => value !== void 0));\n\t\t\tconst searchParams = new URLSearchParams(filteredQueryParams);\n\t\t\treturn await route.handler(RequestInputContext.fromSSRContext({\n\t\t\t\tmethod: route.method,\n\t\t\t\tpath: route.path,\n\t\t\t\tpathParams: normalizedPathParams,\n\t\t\t\tsearchParams\n\t\t\t}), new RequestOutputContext(route.outputSchema));\n\t\t}\n\t\tasync function executeQuery(params) {\n\t\t\tconst { pathParams, queryParams } = params ?? {};\n\t\t\tif (typeof window === \"undefined\") return task(async () => callServerSideHandler({\n\t\t\t\tpathParams,\n\t\t\t\tqueryParams\n\t\t\t}));\n\t\t\tconst url = buildUrl({\n\t\t\t\tbaseUrl,\n\t\t\t\tmountRoute,\n\t\t\t\tpath: route.path\n\t\t\t}, {\n\t\t\t\tpathParams,\n\t\t\t\tqueryParams\n\t\t\t});\n\t\t\tlet response;\n\t\t\ttry {\n\t\t\t\tresponse = fetcherOptions ? await fetcher(url, fetcherOptions) : await fetcher(url);\n\t\t\t} catch (error) {\n\t\t\t\tthrow FragnoClientFetchError.fromUnknownFetchError(error);\n\t\t\t}\n\t\t\tif (!response.ok) throw await FragnoClientApiError.fromResponse(response);\n\t\t\treturn response;\n\t\t}\n\t\treturn {\n\t\t\troute,\n\t\t\tstore: (args) => {\n\t\t\t\tconst { path, query } = args ?? {};\n\t\t\t\tconst key = getCacheKey(route.method, route.path, {\n\t\t\t\t\tpathParams: path,\n\t\t\t\t\tqueryParams: query\n\t\t\t\t});\n\t\t\t\tconst store = this.#createFetcherStore(key, {\n\t\t\t\t\tfetcher: async () => {\n\t\t\t\t\t\tif (SSR_ENABLED) {\n\t\t\t\t\t\t\tconst initialData = getInitialData(key.map((d) => typeof d === \"string\" ? d : d.get()).join(\"\"));\n\t\t\t\t\t\t\tif (initialData) return initialData;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst response = await executeQuery({\n\t\t\t\t\t\t\tpathParams: path,\n\t\t\t\t\t\t\tqueryParams: query\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\t\t\t\tif (!isStreaming) return response.json();\n\t\t\t\t\t\tif (typeof window === \"undefined\") return [];\n\t\t\t\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\t\t\t\tconst { firstItem } = await handleNdjsonStreamingFirstItem(response, {\n\t\t\t\t\t\t\t\tsetData: (value) => {\n\t\t\t\t\t\t\t\t\tstore.set({\n\t\t\t\t\t\t\t\t\t\t...store.get(),\n\t\t\t\t\t\t\t\t\t\tloading: !(Array.isArray(value) && value.length > 0),\n\t\t\t\t\t\t\t\t\t\tdata: value\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsetError: (value) => {\n\t\t\t\t\t\t\t\t\tstore.set({\n\t\t\t\t\t\t\t\t\t\t...store.get(),\n\t\t\t\t\t\t\t\t\t\terror: value\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn [firstItem];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\t\t\t\tthrow new Error(\"Unreachable\");\n\t\t\t\t\t},\n\t\t\t\t\tonErrorRetry: options?.onErrorRetry,\n\t\t\t\t\tdedupeTime: Infinity\n\t\t\t\t});\n\t\t\t\tif (typeof window === \"undefined\") addStore(store);\n\t\t\t\treturn store;\n\t\t\t},\n\t\t\tquery: async (args) => {\n\t\t\t\tconst { path, query } = args ?? {};\n\t\t\t\tconst response = await executeQuery({\n\t\t\t\t\tpathParams: path,\n\t\t\t\t\tqueryParams: query\n\t\t\t\t});\n\t\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\t\tif (!isStreaming) return await response.json();\n\t\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\t\tconst { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n\t\t\t\t\treturn await streamingPromise;\n\t\t\t\t}\n\t\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\t\tthrow new Error(\"Unreachable\");\n\t\t\t},\n\t\t\t[GET_HOOK_SYMBOL]: true\n\t\t};\n\t}\n\t#createRouteQueryMutator(route, onInvalidate = (invalidate, params) => invalidate(\"GET\", route.path, params)) {\n\t\tconst method = route.method;\n\t\tconst baseUrl = this.#publicConfig.baseUrl ?? \"\";\n\t\tconst mountRoute = getMountRoute({\n\t\t\tname: this.#fragmentConfig.name,\n\t\t\tmountRoute: this.#publicConfig.mountRoute\n\t\t});\n\t\tconst fetcher = this.#getFetcher();\n\t\tconst fetcherOptions = this.#getFetcherOptions();\n\t\tasync function executeMutateQuery({ body, path, query }) {\n\t\t\tif (typeof window === \"undefined\") return task(async () => route.handler(RequestInputContext.fromSSRContext({\n\t\t\t\tinputSchema: route.inputSchema,\n\t\t\t\tmethod,\n\t\t\t\tpath: route.path,\n\t\t\t\tpathParams: path ?? {},\n\t\t\t\tsearchParams: new URLSearchParams(query),\n\t\t\t\tbody\n\t\t\t}), new RequestOutputContext(route.outputSchema)));\n\t\t\tconst url = buildUrl({\n\t\t\t\tbaseUrl,\n\t\t\t\tmountRoute,\n\t\t\t\tpath: route.path\n\t\t\t}, {\n\t\t\t\tpathParams: path,\n\t\t\t\tqueryParams: query\n\t\t\t});\n\t\t\tlet response;\n\t\t\ttry {\n\t\t\t\tconst { body: preparedBody, headers: bodyHeaders } = prepareRequestBody(body, route.contentType);\n\t\t\t\tconst mergedHeaders = mergeRequestHeaders(fetcherOptions?.headers, bodyHeaders);\n\t\t\t\tconst requestOptions = {\n\t\t\t\t\t...fetcherOptions,\n\t\t\t\t\tmethod,\n\t\t\t\t\tbody: preparedBody,\n\t\t\t\t\t...mergedHeaders ? { headers: mergedHeaders } : {}\n\t\t\t\t};\n\t\t\t\tif (preparedBody instanceof ReadableStream) requestOptions.duplex = \"half\";\n\t\t\t\tresponse = await fetcher(url, requestOptions);\n\t\t\t} catch (error) {\n\t\t\t\tthrow FragnoClientFetchError.fromUnknownFetchError(error);\n\t\t\t}\n\t\t\tif (!response.ok) throw await FragnoClientApiError.fromResponse(response);\n\t\t\treturn response;\n\t\t}\n\t\tconst mutatorStore = this.#createMutatorStore(async ({ data }) => {\n\t\t\tif (typeof window === \"undefined\") {}\n\t\t\tconst { body, path, query } = data;\n\t\t\tawait assertBodyProvided(body, route.inputSchema, \"Body is required.\");\n\t\t\tconst response = await executeMutateQuery({\n\t\t\t\tbody,\n\t\t\t\tpath,\n\t\t\t\tquery\n\t\t\t});\n\t\t\tonInvalidate(this.#invalidate.bind(this), {\n\t\t\t\tpathParams: path ?? {},\n\t\t\t\tqueryParams: query\n\t\t\t});\n\t\t\tif (response.status === 201 || response.status === 204) return;\n\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\tif (!isStreaming) return response.json();\n\t\t\tif (typeof window === \"undefined\") return [];\n\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\tconst { firstItem } = await handleNdjsonStreamingFirstItem(response, {\n\t\t\t\t\tsetData: (value) => {\n\t\t\t\t\t\tmutatorStore.set({\n\t\t\t\t\t\t\t...mutatorStore.get(),\n\t\t\t\t\t\t\tloading: !(Array.isArray(value) && value.length > 0),\n\t\t\t\t\t\t\tdata: value\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tsetError: (value) => {\n\t\t\t\t\t\tmutatorStore.set({\n\t\t\t\t\t\t\t...mutatorStore.get(),\n\t\t\t\t\t\t\terror: value\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn [firstItem];\n\t\t\t}\n\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported.\");\n\t\t\tthrow new Error(\"Unreachable\");\n\t\t}, { onError: (error) => {\n\t\t\tconsole.error(\"Error in mutatorStore\", error);\n\t\t} });\n\t\tconst mutateQuery = (async (data) => {\n\t\t\tconst { body, path, query } = data;\n\t\t\tawait assertBodyProvided(body, route.inputSchema, \"Body is required for mutateQuery\");\n\t\t\tconst response = await executeMutateQuery({\n\t\t\t\tbody,\n\t\t\t\tpath,\n\t\t\t\tquery\n\t\t\t});\n\t\t\tif (response.status === 201 || response.status === 204) return;\n\t\t\tconst isStreaming = isStreamingResponse(response);\n\t\t\tif (!isStreaming) return response.json();\n\t\t\tif (isStreaming === \"ndjson\") {\n\t\t\t\tconst { streamingPromise } = await handleNdjsonStreamingFirstItem(response);\n\t\t\t\treturn await streamingPromise;\n\t\t\t}\n\t\t\tif (isStreaming === \"octet-stream\") throw new Error(\"Octet-stream streaming is not supported for mutations\");\n\t\t\tthrow new Error(\"Unreachable\");\n\t\t});\n\t\treturn {\n\t\t\troute,\n\t\t\tmutateQuery,\n\t\t\tmutatorStore,\n\t\t\t[MUTATOR_HOOK_SYMBOL]: true\n\t\t};\n\t}\n\t#invalidate(method, path, params) {\n\t\tconst prefix = getCacheKey(method, path, {\n\t\t\tpathParams: params?.pathParams,\n\t\t\tqueryParams: params?.queryParams\n\t\t}).map((k) => typeof k === \"string\" ? k : k.get()).join(\"\");\n\t\tthis.#invalidateKeys((key) => key.startsWith(prefix));\n\t}\n};\n/**\n* Create a client builder for fragments using the new fragment definition API.\n* This is the same as createClientBuilder but works with FragmentDefinition.\n*/\nfunction createClientBuilder(definition, publicConfig, routesOrFactories, authorFetcherConfig) {\n\tconst routes = resolveRouteFactories({\n\t\tconfig: {},\n\t\tdeps: {},\n\t\tservices: {},\n\t\tserviceDeps: {}\n\t}, routesOrFactories);\n\tconst fragmentConfig = {\n\t\tname: definition.name,\n\t\troutes\n\t};\n\tconst mountRoute = getMountRoute({\n\t\tname: definition.name,\n\t\tmountRoute: publicConfig.mountRoute\n\t});\n\tconst mergedFetcherConfig = mergeFetcherConfigs(authorFetcherConfig, publicConfig.fetcherConfig);\n\treturn new ClientBuilder({\n\t\t...publicConfig,\n\t\tmountRoute,\n\t\tfetcherConfig: mergedFetcherConfig\n\t}, fragmentConfig);\n}\n\n//#endregion\nexport { ClientBuilder, FragnoClientApiError, FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientFetchNetworkError, FragnoClientUnknownApiError, buildUrl, createClientBuilder, getCacheKey, isGetHook, isMutatorHook, isStore };\n//# sourceMappingURL=client.js.map"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,MAAMsB,kBAAkBC,OAAO,kBAAkB;AACjD,MAAMC,sBAAsBD,OAAO,sBAAsB;AACzD,MAAME,eAAeF,OAAO,eAAe;;;;;AAK3C,SAASG,cAAcC,OAAO;AAC7B,KAAIA,iBAAiBC,QAAQD,iBAAiBE,KAAM,QAAO;AAC3D,KAAIF,iBAAiBG,SAAU,QAAO;AACtC,KAAI,OAAOH,UAAU,YAAYA,UAAU,KAAM,QAAOI,OAAOC,OAAOL,MAAM,CAACM,MAAMC,MAAMA,aAAaN,QAAQM,aAAaL,QAAQK,aAAaJ,SAAS;AACzJ,QAAO;;;;;;;;AAQR,SAASK,WAAWR,OAAO;CAC1B,MAAMS,WAAW,IAAIN,UAAU;AAC/B,MAAK,MAAM,CAACO,KAAKC,QAAQP,OAAOQ,QAAQZ,MAAM,CAAE,KAAIW,eAAeV,KAAMQ,UAASI,OAAOH,KAAKC,KAAKA,IAAIG,KAAK;UACnGH,eAAeT,KAAMO,UAASI,OAAOH,KAAKC,IAAI;UAC9CA,QAAQ,KAAK,KAAKA,QAAQ,KAAMF,UAASI,OAAOH,KAAK,OAAOC,QAAQ,WAAWA,MAAMI,KAAKC,UAAUL,IAAI,CAAC;AAClH,QAAOF;;;;;;;AAOR,SAASQ,mBAAmBC,MAAMC,aAAa;AAC9C,KAAID,SAAS,KAAK,EAAG,QAAO,EAAEA,MAAM,KAAK,GAAG;AAC5C,KAAIC,gBAAgB,4BAA4B;AAC/C,MAAID,gBAAgBE,kBAAkBF,gBAAgBhB,QAAQgB,gBAAgBjB,QAAQiB,gBAAgBG,eAAeH,gBAAgBI,WAAY,QAAO;GACvJJ;GACAK,SAAS,EAAE,gBAAgB,4BAA2B;GACtD;AACD,QAAM,IAAIC,MAAM,iGAAiG;;AAElH,KAAIN,gBAAgBf,SAAU,QAAO,EAAEe,MAAM;AAC7C,KAAIA,gBAAgBjB,MAAM;EACzB,MAAMQ,WAAW,IAAIN,UAAU;AAC/BM,WAASI,OAAO,QAAQK,MAAMA,KAAKJ,KAAK;AACxC,SAAO,EAAEI,MAAMT,UAAU;;AAE1B,KAAIS,gBAAgBhB,MAAM;EACzB,MAAMO,WAAW,IAAIN,UAAU;AAC/BM,WAASI,OAAO,QAAQK,KAAK;AAC7B,SAAO,EAAEA,MAAMT,UAAU;;AAE1B,KAAI,OAAOS,SAAS,YAAYA,SAAS,QAAQnB,cAAcmB,KAAK,CAAE,QAAO,EAAEA,MAAMV,WAAWU,KAAI,EAAG;AACvG,QAAO;EACNA,MAAMH,KAAKC,UAAUE,KAAK;EAC1BK,SAAS,EAAE,gBAAgB,oBAAmB;EAC9C;;AAEF,eAAeE,sBAAsBC,QAAQ;AAC5C,KAAI;AACH,SAAO,EAAE,MAAMA,OAAO,aAAaC,SAAS,KAAK,EAAE,EAAEC;SAC9C;AACP,SAAO;;;AAGT,eAAeC,mBAAmBX,MAAMY,aAAaC,cAAc;AAClE,KAAI,OAAOb,SAAS,eAAeY,gBAAgB,KAAK,EAAG;AAC3D,KAAI,MAAML,sBAAsBK,YAAY,CAAE;AAC9C,OAAM,IAAIN,MAAMO,aAAa;;;;;;;AAO9B,SAASC,oBAAoB,GAAGC,eAAe;CAC9C,MAAMC,SAAS,EAAE;CACjB,IAAIC,aAAa;AACjB,MAAK,MAAMC,UAAUH,eAAe;AACnC,MAAI,CAACG,OAAQ;AACb,MAAIA,kBAAkBC,QAAS,MAAK,MAAM,CAAC3B,KAAKV,UAAUoC,OAAOxB,SAAS,EAAE;AAC3EsB,UAAOxB,OAAOV;AACdmC,gBAAa;;WAELG,MAAMC,QAAQH,OAAO,CAAE,MAAK,MAAM,CAAC1B,KAAKV,UAAUoC,QAAQ;AAClEF,UAAOxB,OAAOV;AACdmC,gBAAa;;MAET,MAAK,MAAM,CAACzB,KAAKV,UAAUI,OAAOQ,QAAQwB,OAAO,EAAE;AACvDF,UAAOxB,OAAOV;AACdmC,gBAAa;;;AAGf,QAAOA,aAAaD,SAAS,KAAK;;;;;AAKnC,SAASM,SAASC,QAAQC,QAAQ;CACjC,MAAM,EAAEC,UAAU,IAAIC,YAAYC,SAASJ;CAC3C,MAAM,EAAEK,YAAYC,gBAAgBL,UAAU,EAAE;CAChD,MAAMM,uBAAuBpE,aAAakE,WAAW;CACrD,MAAMG,wBAAwBrE,aAAamE,YAAY,IAAI,EAAE;CAC7D,MAAMG,sBAAsB9C,OAAO+C,YAAY/C,OAAOQ,QAAQqC,sBAAsB,CAACG,QAAQ,CAACC,GAAGrD,WAAWA,UAAU,KAAK,EAAE,CAAC;CAC9H,MAAMsD,eAAe,IAAIC,gBAAgBL,oBAAoB;AAC7D,QAAO,GAAGP,UAAUC,aAAatE,UAAUuE,MAAMG,wBAAwB,EAAE,CAAC,GAAGM,aAAaE,UAAU,GAAG,IAAIF,aAAaE,UAAU,KAAK;;;;;;;;;;;;;AAa1I,SAASC,YAAYC,QAAQb,MAAMH,QAAQ;AAC1C,KAAI,CAACA,OAAQ,QAAO,CAACgB,QAAQb,KAAK;CAClC,MAAM,EAAEC,YAAYC,gBAAgBL;CACpC,MAAMiB,kBAAkBpF,kBAAkBsE,KAAK,CAACe,KAAK9C,SAASgC,aAAahC,SAAS,YAAY;CAChG,MAAM+C,mBAAmBd,cAAc3C,OAAO0D,KAAKf,YAAY,CAACgB,MAAM,CAACH,KAAKlD,QAAQ;EACnF,MAAMV,QAAQ+C,YAAYrC;AAC1B,MAAIV,SAAS,OAAOA,UAAU,YAAY,SAASA,MAAO,QAAOR,yBAASQ,QAAQO,MAAMA,KAAK,GAAG;AAChG,SAAOP,SAAS;GACf,GAAG,EAAE;AACP,QAAO;EACN0D;EACAb;EACA,GAAGc;EACH,GAAGE;EACH;;AAEF,SAASG,oBAAoBC,UAAU;CACtC,MAAM9C,cAAcxC,iBAAiBsF,SAAS1C,QAAQ2C,IAAI,eAAe,CAAC;AAC1E,KAAI,CAAC/C,YAAa,QAAO;AACzB,KAAI,EAAE8C,SAAS1C,QAAQ2C,IAAI,oBAAoB,KAAK,WAAY,QAAO;AACvE,KAAI/C,YAAYgD,YAAY,eAAgB,QAAO;AACnD,KAAIhD,YAAYgD,YAAY,WAAY,QAAO;AAC/C,QAAO;;;;;AAKR,SAASC,UAAUC,MAAM;AACxB,QAAO,OAAOA,SAAS,YAAYA,SAAS,QAAQ1E,mBAAmB0E,QAAQA,KAAK1E,qBAAqB;;;;;AAK1G,SAAS2E,cAAcD,MAAM;AAC5B,QAAO,OAAOA,SAAS,YAAYA,SAAS,QAAQxE,uBAAuBwE,QAAQA,KAAKxE,yBAAyB;;;;;AAKlH,SAAS0E,QAAQC,KAAK;AACrB,QAAO,OAAOA,QAAQ,YAAYA,QAAQ,QAAQ1E,gBAAgB0E,OAAOA,IAAI1E,kBAAkB;;AAEhG,IAAI2E,gBAAgB,MAAM;CACzB;CACA;CACA;CACA,yBAAyB,IAAIK,KAAK;CAClC;CACA;CACA;CACAI,YAAYR,cAAcC,gBAAgB;AACzC,QAAK,eAAgBD;AACrB,QAAK,iBAAkBC;AACvB,QAAK,gBAAiBD,aAAaE;EACnC,MAAM,CAACG,oBAAoBC,oBAAoB,EAAEC,oBAAoBvF,UAAU,EAAEmF,OAAO,MAAK,OAAQ,CAAC;AACtG,QAAK,qBAAsBE;AAC3B,QAAK,qBAAsBC;AAC3B,QAAK,iBAAkBC;;CAExB,IAAIE,eAAe;AAClB,SAAO/E,OAAO+C,YAAY,MAAK,MAAOvC,SAAS,CAAC;;CAEjDwE,YAAYC,OAAO;AAClB,MAAI,OAAOA,UAAU,WAAY,QAAO;GACvCC,SAASD;IACRvF,eAAe;GAChB;AACD,SAAO;GACN0E,KAAKa;IACJvF,eAAe;GAChB;;;;;;CAMF0C,SAASK,MAAMH,QAAQ;AACtB,SAAOF,SAAS;GACfG,SAAS,MAAK,aAAcA,WAAW;GACvCC,YAAYpE,cAAc;IACzBsC,MAAM,MAAK,eAAgBA;IAC3B8B,YAAY,MAAK,aAAcA;IAC/B,CAAC;GACFC;GACA,EAAE;GACFC,YAAYJ,QAAQG;GACpBE,aAAaL,QAAQ6C;GACrB,CAAC;;;;;;CAMHC,aAAa;AACZ,SAAO;GACNC,SAAS,MAAK,YAAa;GAC3BC,gBAAgB,MAAK,mBAAmB;GACxC;;CAEF,cAAc;AACb,MAAI,MAAK,eAAgBG,SAAS,WAAY,QAAO,MAAK,cAAeJ;AACzE,SAAOK,WAAWC,MAAMC,KAAKF,WAAW;;CAEzC,qBAAqB;AACpB,MAAI,MAAK,eAAgBD,SAAS,UAAW,QAAO,MAAK,cAAeK;;CAEzEC,WAAWtD,MAAMqD,SAAS;EACzB,MAAME,QAAQ,MAAK,eAAgBC,OAAOC,MAAMC,MAAMA,EAAE1D,SAASA,QAAQ0D,EAAE7C,WAAW,SAAS6C,EAAEC,iBAAiB,KAAK,EAAE;AACzH,MAAI,CAACJ,MAAO,OAAM,IAAI5E,MAAM,UAAUqB,KAAI,0DAA2D;AACrG,SAAO,MAAK,qBAAsBuD,OAAOF,QAAQ;;CAElDQ,cAAchD,QAAQb,MAAM8D,cAAc;EACzC,MAAMP,QAAQ,MAAK,eAAgBC,OAAOC,MAAMC,MAAMA,EAAE7C,WAAW,SAAS6C,EAAE1D,SAASA,QAAQ0D,EAAE7C,WAAWA,OAAO;AACnH,MAAI,CAAC0C,MAAO,OAAM,IAAI5E,MAAM,UAAUqB,KAAI,gEAAiE;AAC3G,SAAO,MAAK,wBAAyBuD,OAAOO,aAAa;;CAE1D,sBAAsBP,OAAOF,UAAU,EAAE,EAAE;AAC1C,MAAIE,MAAM1C,WAAW,MAAO,OAAM,IAAIlC,MAAM,mDAAmD4E,MAAMvD,KAAI,SAAUuD,MAAM1C,OAAM,SAAU;AACzI,MAAI,CAAC0C,MAAMI,aAAc,OAAM,IAAIhF,MAAM,oDAAoD4E,MAAMvD,KAAI,yBAA0B;EACjI,MAAMF,UAAU,MAAK,aAAcA,WAAW;EAC9C,MAAMC,aAAapE,cAAc;GAChCsC,MAAM,MAAK,eAAgBA;GAC3B8B,YAAY,MAAK,aAAcA;GAC/B,CAAC;EACF,MAAM6C,UAAU,MAAK,YAAa;EAClC,MAAMqB,iBAAiB,MAAK,mBAAoB;EAChD,eAAeC,sBAAsBrE,QAAQ;GAC5C,MAAM,EAAEI,YAAYC,gBAAgBL,UAAU,EAAE;GAChD,MAAMM,uBAAuBpE,aAAakE,WAAW;GACrD,MAAMG,wBAAwBrE,aAAamE,YAAY,IAAI,EAAE;GAC7D,MAAMG,sBAAsB9C,OAAO+C,YAAY/C,OAAOQ,QAAQqC,sBAAsB,CAACG,QAAQ,CAACC,GAAGrD,WAAWA,UAAU,KAAK,EAAE,CAAC;GAC9H,MAAMsD,eAAe,IAAIC,gBAAgBL,oBAAoB;AAC7D,UAAO,MAAMkD,MAAMY,QAAQvI,oBAAoBwI,eAAe;IAC7DvD,QAAQ0C,MAAM1C;IACdb,MAAMuD,MAAMvD;IACZC,YAAYE;IACZM;IACA,CAAC,EAAE,IAAI5E,qBAAqB0H,MAAMI,aAAa,CAAC;;EAElD,eAAeU,aAAaxE,QAAQ;GACnC,MAAM,EAAEI,YAAYC,gBAAgBL,UAAU,EAAE;AAChD,OAAI,OAAOyE,WAAW,YAAa,QAAO1H,KAAK,YAAYsH,sBAAsB;IAChFjE;IACAC;IACA,CAAC,CAAC;GACH,MAAMqE,MAAM5E,SAAS;IACpBG;IACAC;IACAC,MAAMuD,MAAMvD;IACZ,EAAE;IACFC;IACAC;IACA,CAAC;GACF,IAAIkB;AACJ,OAAI;AACHA,eAAW6C,iBAAiB,MAAMrB,QAAQ2B,KAAKN,eAAe,GAAG,MAAMrB,QAAQ2B,IAAI;YAC3EC,OAAO;AACf,UAAMlI,uBAAuBmI,sBAAsBD,MAAM;;AAE1D,OAAI,CAACpD,SAASsD,GAAI,OAAM,MAAMvI,qBAAqBwI,aAAavD,SAAS;AACzE,UAAOA;;AAER,SAAO;GACNmC;GACAqB,QAAQC,SAAS;IAChB,MAAM,EAAE7E,MAAM0C,UAAUmC,QAAQ,EAAE;IAClC,MAAMhH,MAAM+C,YAAY2C,MAAM1C,QAAQ0C,MAAMvD,MAAM;KACjDC,YAAYD;KACZE,aAAawC;KACb,CAAC;IACF,MAAMkC,QAAQ,MAAK,mBAAoB/G,KAAK;KAC3C+E,SAAS,YAAY;AACpB,UAAI5G,aAAa;OAChB,MAAM8I,cAAc5I,eAAe2B,IAAIkD,KAAKgE,MAAM,OAAOA,MAAM,WAAWA,IAAIA,EAAE1D,KAAK,CAAC,CAAC2D,KAAK,GAAG,CAAC;AAChG,WAAIF,YAAa,QAAOA;;MAEzB,MAAM1D,WAAW,MAAMiD,aAAa;OACnCpE,YAAYD;OACZE,aAAawC;OACb,CAAC;MACF,MAAMuC,cAAc9D,oBAAoBC,SAAS;AACjD,UAAI,CAAC6D,YAAa,QAAO7D,SAAS8D,MAAM;AACxC,UAAI,OAAOZ,WAAW,YAAa,QAAO,EAAE;AAC5C,UAAIW,gBAAgB,UAAU;OAC7B,MAAM,EAAEE,cAAc,MAAMzI,+BAA+B0E,UAAU;QACpEgE,UAAUjI,UAAU;AACnByH,eAAMS,IAAI;UACT,GAAGT,MAAMvD,KAAK;UACdiE,SAAS,EAAE7F,MAAMC,QAAQvC,MAAM,IAAIA,MAAMoI,SAAS;UAClDC,MAAMrI;UACN,CAAC;;QAEHsI,WAAWtI,UAAU;AACpByH,eAAMS,IAAI;UACT,GAAGT,MAAMvD,KAAK;UACdmD,OAAOrH;UACP,CAAC;;QAEH,CAAC;AACF,cAAO,CAACgI,UAAU;;AAEnB,UAAIF,gBAAgB,eAAgB,OAAM,IAAItG,MAAM,2CAA2C;AAC/F,YAAM,IAAIA,MAAM,cAAc;;KAE/B+G,cAAcrC,SAASqC;KACvBC,YAAYC;KACZ,CAAC;AACF,QAAI,OAAOtB,WAAW,YAAarI,UAAS2I,MAAM;AAClD,WAAOA;;GAERlC,OAAO,OAAOmC,SAAS;IACtB,MAAM,EAAE7E,MAAM0C,UAAUmC,QAAQ,EAAE;IAClC,MAAMzD,WAAW,MAAMiD,aAAa;KACnCpE,YAAYD;KACZE,aAAawC;KACb,CAAC;IACF,MAAMuC,cAAc9D,oBAAoBC,SAAS;AACjD,QAAI,CAAC6D,YAAa,QAAO,MAAM7D,SAAS8D,MAAM;AAC9C,QAAID,gBAAgB,UAAU;KAC7B,MAAM,EAAEY,qBAAqB,MAAMnJ,+BAA+B0E,SAAS;AAC3E,YAAO,MAAMyE;;AAEd,QAAIZ,gBAAgB,eAAgB,OAAM,IAAItG,MAAM,2CAA2C;AAC/F,UAAM,IAAIA,MAAM,cAAc;;IAE9B7B,kBAAkB;GACnB;;CAEF,yBAAyByG,OAAOO,gBAAgBiC,YAAYlG,WAAWkG,WAAW,OAAOxC,MAAMvD,MAAMH,OAAO,EAAE;EAC7G,MAAMgB,SAAS0C,MAAM1C;EACrB,MAAMf,UAAU,MAAK,aAAcA,WAAW;EAC9C,MAAMC,aAAapE,cAAc;GAChCsC,MAAM,MAAK,eAAgBA;GAC3B8B,YAAY,MAAK,aAAcA;GAC/B,CAAC;EACF,MAAM6C,UAAU,MAAK,YAAa;EAClC,MAAMqB,iBAAiB,MAAK,mBAAoB;EAChD,eAAe+B,mBAAmB,EAAE3H,MAAM2B,MAAM0C,SAAS;AACxD,OAAI,OAAO4B,WAAW,YAAa,QAAO1H,KAAK,YAAY2G,MAAMY,QAAQvI,oBAAoBwI,eAAe;IAC3GnF,aAAasE,MAAMtE;IACnB4B;IACAb,MAAMuD,MAAMvD;IACZC,YAAYD,QAAQ,EAAE;IACtBS,cAAc,IAAIC,gBAAgBgC,MAAM;IACxCrE;IACA,CAAC,EAAE,IAAIxC,qBAAqB0H,MAAMI,aAAa,CAAC,CAAC;GAClD,MAAMY,MAAM5E,SAAS;IACpBG;IACAC;IACAC,MAAMuD,MAAMvD;IACZ,EAAE;IACFC,YAAYD;IACZE,aAAawC;IACb,CAAC;GACF,IAAItB;AACJ,OAAI;IACH,MAAM,EAAE/C,MAAM4H,cAAcvH,SAASwH,gBAAgB9H,mBAAmBC,MAAMkF,MAAMjF,YAAY;IAChG,MAAM6H,gBAAgBhH,oBAAoB8E,gBAAgBvF,SAASwH,YAAY;IAC/E,MAAME,iBAAiB;KACtB,GAAGnC;KACHpD;KACAxC,MAAM4H;KACN,GAAGE,gBAAgB,EAAEzH,SAASyH,eAAe,GAAG,EAAE;KAClD;AACD,QAAIF,wBAAwB1H,eAAgB6H,gBAAeC,SAAS;AACpEjF,eAAW,MAAMwB,QAAQ2B,KAAK6B,eAAe;YACrC5B,OAAO;AACf,UAAMlI,uBAAuBmI,sBAAsBD,MAAM;;AAE1D,OAAI,CAACpD,SAASsD,GAAI,OAAM,MAAMvI,qBAAqBwI,aAAavD,SAAS;AACzE,UAAOA;;EAER,MAAMkF,eAAe,MAAK,mBAAoB,OAAO,EAAEd,WAAW;AACjE,OAAI,OAAOlB,WAAW,aAAa;GACnC,MAAM,EAAEjG,MAAM2B,MAAM0C,UAAU8C;AAC9B,SAAMxG,mBAAmBX,MAAMkF,MAAMtE,aAAa,oBAAoB;GACtE,MAAMmC,WAAW,MAAM4E,mBAAmB;IACzC3H;IACA2B;IACA0C;IACA,CAAC;AACFoB,gBAAa,MAAK,WAAYX,KAAK,KAAK,EAAE;IACzClD,YAAYD,QAAQ,EAAE;IACtBE,aAAawC;IACb,CAAC;AACF,OAAItB,SAASmF,WAAW,OAAOnF,SAASmF,WAAW,IAAK;GACxD,MAAMtB,cAAc9D,oBAAoBC,SAAS;AACjD,OAAI,CAAC6D,YAAa,QAAO7D,SAAS8D,MAAM;AACxC,OAAI,OAAOZ,WAAW,YAAa,QAAO,EAAE;AAC5C,OAAIW,gBAAgB,UAAU;IAC7B,MAAM,EAAEE,cAAc,MAAMzI,+BAA+B0E,UAAU;KACpEgE,UAAUjI,UAAU;AACnBmJ,mBAAajB,IAAI;OAChB,GAAGiB,aAAajF,KAAK;OACrBiE,SAAS,EAAE7F,MAAMC,QAAQvC,MAAM,IAAIA,MAAMoI,SAAS;OAClDC,MAAMrI;OACN,CAAC;;KAEHsI,WAAWtI,UAAU;AACpBmJ,mBAAajB,IAAI;OAChB,GAAGiB,aAAajF,KAAK;OACrBmD,OAAOrH;OACP,CAAC;;KAEH,CAAC;AACF,WAAO,CAACgI,UAAU;;AAEnB,OAAIF,gBAAgB,eAAgB,OAAM,IAAItG,MAAM,2CAA2C;AAC/F,SAAM,IAAIA,MAAM,cAAc;KAC5B,EAAE6H,UAAUhC,UAAU;AACxBiC,WAAQjC,MAAM,yBAAyBA,MAAM;KAC3C,CAAC;EACJ,MAAMkC,cAAe,OAAOlB,SAAS;GACpC,MAAM,EAAEnH,MAAM2B,MAAM0C,UAAU8C;AAC9B,SAAMxG,mBAAmBX,MAAMkF,MAAMtE,aAAa,mCAAmC;GACrF,MAAMmC,WAAW,MAAM4E,mBAAmB;IACzC3H;IACA2B;IACA0C;IACA,CAAC;AACF,OAAItB,SAASmF,WAAW,OAAOnF,SAASmF,WAAW,IAAK;GACxD,MAAMtB,cAAc9D,oBAAoBC,SAAS;AACjD,OAAI,CAAC6D,YAAa,QAAO7D,SAAS8D,MAAM;AACxC,OAAID,gBAAgB,UAAU;IAC7B,MAAM,EAAEY,qBAAqB,MAAMnJ,+BAA+B0E,SAAS;AAC3E,WAAO,MAAMyE;;AAEd,OAAIZ,gBAAgB,eAAgB,OAAM,IAAItG,MAAM,wDAAwD;AAC5G,SAAM,IAAIA,MAAM,cAAc;;AAE/B,SAAO;GACN4E;GACAmD;GACAJ;IACCtJ,sBAAsB;GACvB;;CAEF,YAAY6D,QAAQb,MAAMH,QAAQ;EACjC,MAAM+G,SAAShG,YAAYC,QAAQb,MAAM;GACxCC,YAAYJ,QAAQI;GACpBC,aAAaL,QAAQK;GACrB,CAAC,CAACa,KAAK8F,MAAM,OAAOA,MAAM,WAAWA,IAAIA,EAAExF,KAAK,CAAC,CAAC2D,KAAK,GAAG;AAC3D,QAAK,gBAAiBnH,QAAQA,IAAIiJ,WAAWF,OAAO,CAAC;;;;;;;AAOvD,SAASG,oBAAoBC,YAAYnF,cAAcoF,mBAAmBC,qBAAqB;CAC9F,MAAM1D,SAAShI,sBAAsB;EACpCoE,QAAQ,EAAE;EACVuH,MAAM,EAAE;EACRC,UAAU,EAAE;EACZC,aAAa,EAAC;EACd,EAAEJ,kBAAkB;CACrB,MAAMnF,iBAAiB;EACtB7D,MAAM+I,WAAW/I;EACjBuF;EACA;CACD,MAAMzD,aAAapE,cAAc;EAChCsC,MAAM+I,WAAW/I;EACjB8B,YAAY8B,aAAa9B;EACzB,CAAC;CACF,MAAMuH,sBAAsB7K,oBAAoByK,qBAAqBrF,aAAaE,cAAc;AAChG,QAAO,IAAIH,cAAc;EACxB,GAAGC;EACH9B;EACAgC,eAAeuF;EACf,EAAExF,eAAe"}
@@ -1,7 +1,7 @@
1
- import { atom } from "../../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js";
1
+ import { atom } from "../../../../node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/atom/index.js";
2
2
  import { isGetHook, isMutatorHook, isStore } from "./client.js";
3
- import { get, writable } from "svelte/store";
4
3
  import { onDestroy } from "svelte";
4
+ import { get, writable } from "svelte/store";
5
5
 
6
6
  //#region ../fragno/dist/client/client.svelte.js
7
7
  function isReadable(value) {
@@ -100,7 +100,15 @@ function createSvelteMutator(hook) {
100
100
  };
101
101
  }
102
102
  function createSvelteStore(hook) {
103
- return hook.obj;
103
+ if ("obj" in hook) return hook.obj;
104
+ return (...args) => {
105
+ const value = hook.factory(...args);
106
+ const disposer = value[Symbol.dispose];
107
+ if (typeof disposer === "function") onDestroy(() => {
108
+ disposer.call(value);
109
+ });
110
+ return value;
111
+ };
104
112
  }
105
113
  function useFragno(clientObj) {
106
114
  const result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"client.svelte.js","names":["isGetHook","isMutatorHook","isStore","atom","get","writable","onDestroy","isReadable","value","isCallable","readableToAtom","a","subscribe","newVal","set","runeToAtom","$effect","createSvelteHook","hook","path","query","pathParams","queryParams","key","Object","entries","v","store","data","loading","error","unsubscribe","updatedStoreValue","createSvelteMutator","mutatorStore","storeValue","mutate","args","body","createSvelteStore","obj","useFragno","clientObj","result","prototype","hasOwnProperty","call"],"sources":["../../../../../../../../fragno/dist/client/client.svelte.js"],"sourcesContent":["import { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { atom } from \"nanostores\";\nimport { get, writable } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\n\n//#region src/client/client.svelte.ts\nfunction isReadable(value) {\n\treturn typeof value === \"object\" && value !== null && \"subscribe\" in value;\n}\nfunction isCallable(value) {\n\treturn typeof value === \"function\";\n}\nfunction readableToAtom(value) {\n\tconst a = atom(get(value));\n\tvalue.subscribe((newVal) => {\n\t\ta.set(newVal);\n\t});\n\treturn a;\n}\nfunction runeToAtom(value) {\n\tconst a = atom(value());\n\t$effect(() => {\n\t\ta.set(value());\n\t});\n\treturn a;\n}\nfunction createSvelteHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParams = {};\n\t\tconst queryParams = {};\n\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\tconst v = value;\n\t\t\tif (isCallable(v)) pathParams[key] = runeToAtom(v);\n\t\t\telse pathParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\tconst v = value;\n\t\t\tif (isCallable(v)) queryParams[key] = runeToAtom(v);\n\t\t\telse queryParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t}\n\t\tconst store = hook.store({\n\t\t\tpath: pathParams,\n\t\t\tquery: queryParams\n\t\t});\n\t\tconst data = writable(void 0);\n\t\tconst loading = writable(false);\n\t\tconst error = writable(void 0);\n\t\tconst unsubscribe = store.subscribe((updatedStoreValue) => {\n\t\t\tdata.set(updatedStoreValue.data);\n\t\t\tloading.set(updatedStoreValue.loading);\n\t\t\terror.set(updatedStoreValue.error);\n\t\t});\n\t\tonDestroy(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn {\n\t\t\tdata,\n\t\t\tloading,\n\t\t\terror\n\t\t};\n\t};\n}\nfunction createSvelteMutator(hook) {\n\treturn () => {\n\t\tconst data = writable(void 0);\n\t\tconst loading = writable(void 0);\n\t\tconst error = writable(void 0);\n\t\tconst unsubscribe = hook.mutatorStore.subscribe((storeValue) => {\n\t\t\tdata.set(storeValue.data);\n\t\t\tloading.set(storeValue.loading);\n\t\t\terror.set(storeValue.error);\n\t\t});\n\t\tonDestroy(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t\tconst mutate = async (args) => {\n\t\t\tconst { body, path, query } = args;\n\t\t\tconst pathParams = {};\n\t\t\tconst queryParams = {};\n\t\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tpathParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tqueryParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t\t}\n\t\t\treturn hook.mutatorStore.mutate({\n\t\t\t\tbody,\n\t\t\t\tpath: pathParams,\n\t\t\t\tquery: queryParams\n\t\t\t});\n\t\t};\n\t\treturn {\n\t\t\tmutate,\n\t\t\tloading,\n\t\t\terror,\n\t\t\tdata\n\t\t};\n\t};\n}\nfunction createSvelteStore(hook) {\n\treturn hook.obj;\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createSvelteHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createSvelteMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createSvelteStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { createSvelteStore, readableToAtom, runeToAtom, useFragno };\n//# sourceMappingURL=client.svelte.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"client.svelte.js","names":["isGetHook","isMutatorHook","isStore","atom","onDestroy","get","writable","isReadable","value","isCallable","readableToAtom","a","subscribe","newVal","set","runeToAtom","$effect","createSvelteHook","hook","path","query","pathParams","queryParams","key","Object","entries","v","store","data","loading","error","unsubscribe","updatedStoreValue","createSvelteMutator","mutatorStore","storeValue","mutate","args","body","createSvelteStore","obj","factory","disposer","Symbol","dispose","call","useFragno","clientObj","result","prototype","hasOwnProperty"],"sources":["../../../../../../../../fragno/dist/client/client.svelte.js"],"sourcesContent":["import { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { atom } from \"nanostores\";\nimport { onDestroy } from \"svelte\";\nimport { get, writable } from \"svelte/store\";\n\n//#region src/client/client.svelte.ts\nfunction isReadable(value) {\n\treturn typeof value === \"object\" && value !== null && \"subscribe\" in value;\n}\nfunction isCallable(value) {\n\treturn typeof value === \"function\";\n}\nfunction readableToAtom(value) {\n\tconst a = atom(get(value));\n\tvalue.subscribe((newVal) => {\n\t\ta.set(newVal);\n\t});\n\treturn a;\n}\nfunction runeToAtom(value) {\n\tconst a = atom(value());\n\t$effect(() => {\n\t\ta.set(value());\n\t});\n\treturn a;\n}\nfunction createSvelteHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParams = {};\n\t\tconst queryParams = {};\n\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\tconst v = value;\n\t\t\tif (isCallable(v)) pathParams[key] = runeToAtom(v);\n\t\t\telse pathParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\tconst v = value;\n\t\t\tif (isCallable(v)) queryParams[key] = runeToAtom(v);\n\t\t\telse queryParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t}\n\t\tconst store = hook.store({\n\t\t\tpath: pathParams,\n\t\t\tquery: queryParams\n\t\t});\n\t\tconst data = writable(void 0);\n\t\tconst loading = writable(false);\n\t\tconst error = writable(void 0);\n\t\tconst unsubscribe = store.subscribe((updatedStoreValue) => {\n\t\t\tdata.set(updatedStoreValue.data);\n\t\t\tloading.set(updatedStoreValue.loading);\n\t\t\terror.set(updatedStoreValue.error);\n\t\t});\n\t\tonDestroy(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn {\n\t\t\tdata,\n\t\t\tloading,\n\t\t\terror\n\t\t};\n\t};\n}\nfunction createSvelteMutator(hook) {\n\treturn () => {\n\t\tconst data = writable(void 0);\n\t\tconst loading = writable(void 0);\n\t\tconst error = writable(void 0);\n\t\tconst unsubscribe = hook.mutatorStore.subscribe((storeValue) => {\n\t\t\tdata.set(storeValue.data);\n\t\t\tloading.set(storeValue.loading);\n\t\t\terror.set(storeValue.error);\n\t\t});\n\t\tonDestroy(() => {\n\t\t\tunsubscribe();\n\t\t});\n\t\tconst mutate = async (args) => {\n\t\t\tconst { body, path, query } = args;\n\t\t\tconst pathParams = {};\n\t\t\tconst queryParams = {};\n\t\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tpathParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tqueryParams[key] = isReadable(v) ? readableToAtom(v) : v;\n\t\t\t}\n\t\t\treturn hook.mutatorStore.mutate({\n\t\t\t\tbody,\n\t\t\t\tpath: pathParams,\n\t\t\t\tquery: queryParams\n\t\t\t});\n\t\t};\n\t\treturn {\n\t\t\tmutate,\n\t\t\tloading,\n\t\t\terror,\n\t\t\tdata\n\t\t};\n\t};\n}\nfunction createSvelteStore(hook) {\n\tif (\"obj\" in hook) return hook.obj;\n\treturn ((...args) => {\n\t\tconst value = hook.factory(...args);\n\t\tconst disposer = value[Symbol.dispose];\n\t\tif (typeof disposer === \"function\") onDestroy(() => {\n\t\t\tdisposer.call(value);\n\t\t});\n\t\treturn value;\n\t});\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createSvelteHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createSvelteMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createSvelteStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { createSvelteStore, readableToAtom, runeToAtom, useFragno };\n//# sourceMappingURL=client.svelte.js.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { listenKeys } from "../../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/listen-keys/index.js";
2
1
  import { isReadableAtom } from "../util/nanostores.js";
2
+ import { listenKeys } from "../../../../node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/listen-keys/index.js";
3
3
  import { isGetHook, isMutatorHook, isStore } from "./client.js";
4
- import { useCallback, useMemo, useRef, useSyncExternalStore } from "react";
4
+ import { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
5
5
 
6
6
  //#region ../fragno/dist/client/react.js
7
7
  function createReactHook(hook) {
@@ -21,17 +21,109 @@ function createReactMutator(hook) {
21
21
  return useStore(useMemo(() => hook.mutatorStore, [hook]));
22
22
  };
23
23
  }
24
- function createReactStore(hook) {
25
- if (isReadableAtom(hook.obj)) return () => useStore(hook.obj);
26
- return () => {
27
- const result = {};
28
- for (const key in hook.obj) {
29
- if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) continue;
30
- const value = hook.obj[key];
31
- if (isReadableAtom(value)) result[key] = useStore(value);
32
- else result[key] = value;
24
+ const isPlainObject = (value) => {
25
+ if (!value || typeof value !== "object") return false;
26
+ const prototype = Object.getPrototypeOf(value);
27
+ return prototype === Object.prototype || prototype === null;
28
+ };
29
+ const areStoreFactoryValuesEqual = (left, right) => {
30
+ if (Object.is(left, right)) return true;
31
+ if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((value, index) => areStoreFactoryValuesEqual(value, right[index]));
32
+ if (left instanceof Date && right instanceof Date) return left.getTime() === right.getTime();
33
+ if (isReadableAtom(left) || isReadableAtom(right)) return left === right;
34
+ if (typeof left === "function" || typeof right === "function") return left === right;
35
+ if (isPlainObject(left) && isPlainObject(right)) {
36
+ const leftKeys = Object.keys(left).sort();
37
+ const rightKeys = Object.keys(right).sort();
38
+ return leftKeys.length === rightKeys.length && leftKeys.every((key, index) => key === rightKeys[index] && areStoreFactoryValuesEqual(left[key], right[key]));
39
+ }
40
+ return false;
41
+ };
42
+ const areStoreFactoryArgsEqual = (left, right) => left.length === right.length && left.every((value, index) => areStoreFactoryValuesEqual(value, right[index]));
43
+ const getStoreDisposer = (value) => {
44
+ const disposer = value[Symbol.dispose];
45
+ return typeof disposer === "function" ? disposer.bind(value) : void 0;
46
+ };
47
+ const createReactStoreObjectView = (value, getAtomValue) => {
48
+ const atomValues = /* @__PURE__ */ new Map();
49
+ const boundMethods = /* @__PURE__ */ new Map();
50
+ return new Proxy(value, { get(target, property, _receiver) {
51
+ const propertyValue = Reflect.get(target, property, target);
52
+ if (isReadableAtom(propertyValue)) {
53
+ if (atomValues.has(propertyValue)) return atomValues.get(propertyValue);
54
+ const atomValue = getAtomValue(propertyValue);
55
+ atomValues.set(propertyValue, atomValue);
56
+ return atomValue;
33
57
  }
34
- return result;
58
+ if (typeof propertyValue === "function") {
59
+ if (boundMethods.has(property)) return boundMethods.get(property);
60
+ const boundMethod = propertyValue.bind(target);
61
+ boundMethods.set(property, boundMethod);
62
+ return boundMethod;
63
+ }
64
+ return propertyValue;
65
+ } });
66
+ };
67
+ function unwrapReactStoreValueOnServer(value) {
68
+ if (isReadableAtom(value)) return value.get();
69
+ return createReactStoreObjectView(value, (store) => store.get());
70
+ }
71
+ function unwrapReactStoreValue(value) {
72
+ if (isReadableAtom(value)) return useStore(value);
73
+ const atomEntries = Object.keys(value).flatMap((key) => {
74
+ const fieldValue = value[key];
75
+ return isReadableAtom(fieldValue) ? [[key, fieldValue]] : [];
76
+ });
77
+ const snapshotRef = useRef(atomEntries.map(([, store]) => store.get()));
78
+ const getSnapshot = () => {
79
+ const nextSnapshot = atomEntries.map(([, store]) => store.get());
80
+ const previousSnapshot = snapshotRef.current;
81
+ if (previousSnapshot.length === nextSnapshot.length && previousSnapshot.every((entry, index) => Object.is(entry, nextSnapshot[index]))) return previousSnapshot;
82
+ snapshotRef.current = nextSnapshot;
83
+ return nextSnapshot;
84
+ };
85
+ const atomValues = useSyncExternalStore((onStoreChange) => {
86
+ const unsubscribes = atomEntries.map(([, store]) => store.listen(onStoreChange));
87
+ return () => {
88
+ for (const unsubscribe of unsubscribes) unsubscribe();
89
+ };
90
+ }, getSnapshot, getSnapshot);
91
+ return useMemo(() => createReactStoreObjectView(value, (store) => {
92
+ const atomIndex = atomEntries.findIndex(([, entryStore]) => entryStore === store);
93
+ return atomIndex === -1 ? store.get() : atomValues[atomIndex];
94
+ }), [
95
+ value,
96
+ atomEntries,
97
+ atomValues
98
+ ]);
99
+ }
100
+ function createReactStore(hook) {
101
+ return (...args) => {
102
+ const stableArgsRef = useRef(args);
103
+ const pendingDisposalsRef = useRef(/* @__PURE__ */ new Map());
104
+ if (!areStoreFactoryArgsEqual(stableArgsRef.current, args)) stableArgsRef.current = args;
105
+ const value = useMemo(() => {
106
+ if ("factory" in hook) return hook.factory(...stableArgsRef.current);
107
+ return hook.obj;
108
+ }, [hook, stableArgsRef.current]);
109
+ useEffect(() => {
110
+ const disposer = getStoreDisposer(value);
111
+ const pendingTimeout = pendingDisposalsRef.current.get(value);
112
+ if (pendingTimeout !== void 0) {
113
+ clearTimeout(pendingTimeout);
114
+ pendingDisposalsRef.current.delete(value);
115
+ }
116
+ return () => {
117
+ if (!disposer) return;
118
+ const timeoutId = setTimeout(() => {
119
+ pendingDisposalsRef.current.delete(value);
120
+ disposer();
121
+ }, 0);
122
+ pendingDisposalsRef.current.set(value, timeoutId);
123
+ };
124
+ }, [value]);
125
+ if (typeof window === "undefined") return unwrapReactStoreValueOnServer(value);
126
+ return unwrapReactStoreValue(value);
35
127
  };
36
128
  }
37
129
  function useFragno(clientObj) {
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":["hydrateFromWindow","isReadableAtom","isGetHook","isMutatorHook","isStore","listenKeys","useCallback","useMemo","useRef","useSyncExternalStore","createReactHook","hook","path","query","pathParamValues","Object","values","queryParamValues","store","window","get","useStore","createReactMutator","mutatorStore","createReactStore","obj","result","key","prototype","hasOwnProperty","call","value","useFragno","clientObj","options","snapshotRef","keys","deps","subscribe","onChange","emitChange","current","length","listen","FragnoHydrator","children"],"sources":["../../../../../../../../fragno/dist/client/react.js"],"sourcesContent":["import { hydrateFromWindow } from \"../util/ssr.js\";\nimport { isReadableAtom } from \"../util/nanostores.js\";\nimport { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { listenKeys } from \"nanostores\";\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\n\n//#region src/client/react.ts\nfunction createReactHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParamValues = path ? Object.values(path) : [];\n\t\tconst queryParamValues = query ? Object.values(query) : [];\n\t\tconst store = useMemo(() => hook.store({\n\t\t\tpath,\n\t\t\tquery\n\t\t}), [hook, ...[...pathParamValues, ...queryParamValues]]);\n\t\tif (typeof window === \"undefined\") return store.get();\n\t\treturn useStore(store);\n\t};\n}\nfunction createReactMutator(hook) {\n\treturn () => {\n\t\treturn useStore(useMemo(() => hook.mutatorStore, [hook]));\n\t};\n}\nfunction createReactStore(hook) {\n\tif (isReadableAtom(hook.obj)) return () => useStore(hook.obj);\n\treturn () => {\n\t\tconst result = {};\n\t\tfor (const key in hook.obj) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(hook.obj, key)) continue;\n\t\t\tconst value = hook.obj[key];\n\t\t\tif (isReadableAtom(value)) result[key] = useStore(value);\n\t\t\telse result[key] = value;\n\t\t}\n\t\treturn result;\n\t};\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createReactHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createReactMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createReactStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\nfunction useStore(store, options = {}) {\n\tconst snapshotRef = useRef(store.get());\n\tconst { keys, deps = [store, keys] } = options;\n\tconst subscribe = useCallback((onChange) => {\n\t\tconst emitChange = (value) => {\n\t\t\tif (snapshotRef.current === value) return;\n\t\t\tsnapshotRef.current = value;\n\t\t\tonChange();\n\t\t};\n\t\temitChange(store.value);\n\t\tif (keys?.length) return listenKeys(store, keys, emitChange);\n\t\treturn store.listen(emitChange);\n\t}, deps);\n\tconst get = () => snapshotRef.current;\n\treturn useSyncExternalStore(subscribe, get, () => {\n\t\treturn get();\n\t});\n}\nfunction FragnoHydrator({ children }) {\n\tuseMemo(() => {\n\t\thydrateFromWindow();\n\t}, []);\n\treturn children;\n}\n\n//#endregion\nexport { FragnoHydrator, useFragno, useStore };\n//# sourceMappingURL=react.js.map"],"mappings":";;;;;;AAOA,SAASU,gBAAgBC,MAAM;AAC9B,SAAQ,EAAEC,MAAMC,UAAU,EAAE,KAAK;EAChC,MAAMC,kBAAkBF,OAAOG,OAAOC,OAAOJ,KAAK,GAAG,EAAE;EACvD,MAAMK,mBAAmBJ,QAAQE,OAAOC,OAAOH,MAAM,GAAG,EAAE;EAC1D,MAAMK,QAAQX,cAAcI,KAAKO,MAAM;GACtCN;GACAC;GACA,CAAC,EAAE,CAACF,MAAM,GAAG,CAAC,GAAGG,iBAAiB,GAAGG,iBAAiB,CAAC,CAAC;AACzD,MAAI,OAAOE,WAAW,YAAa,QAAOD,MAAME,KAAK;AACrD,SAAOC,SAASH,MAAM;;;AAGxB,SAASI,mBAAmBX,MAAM;AACjC,cAAa;AACZ,SAAOU,SAASd,cAAcI,KAAKY,cAAc,CAACZ,KAAK,CAAC,CAAC;;;AAG3D,SAASa,iBAAiBb,MAAM;AAC/B,KAAIV,eAAeU,KAAKc,IAAI,CAAE,cAAaJ,SAASV,KAAKc,IAAI;AAC7D,cAAa;EACZ,MAAMC,SAAS,EAAE;AACjB,OAAK,MAAMC,OAAOhB,KAAKc,KAAK;AAC3B,OAAI,CAACV,OAAOa,UAAUC,eAAeC,KAAKnB,KAAKc,KAAKE,IAAI,CAAE;GAC1D,MAAMI,QAAQpB,KAAKc,IAAIE;AACvB,OAAI1B,eAAe8B,MAAM,CAAEL,QAAOC,OAAON,SAASU,MAAM;OACnDL,QAAOC,OAAOI;;AAEpB,SAAOL;;;AAGT,SAASM,UAAUC,WAAW;CAC7B,MAAMP,SAAS,EAAE;AACjB,MAAK,MAAMC,OAAOM,WAAW;AAC5B,MAAI,CAAClB,OAAOa,UAAUC,eAAeC,KAAKG,WAAWN,IAAI,CAAE;EAC3D,MAAMhB,OAAOsB,UAAUN;AACvB,MAAIzB,UAAUS,KAAK,CAAEe,QAAOC,OAAOjB,gBAAgBC,KAAK;WAC/CR,cAAcQ,KAAK,CAAEe,QAAOC,OAAOL,mBAAmBX,KAAK;WAC3DP,QAAQO,KAAK,CAAEe,QAAOC,OAAOH,iBAAiBb,KAAK;MACvDe,QAAOC,OAAOhB;;AAEpB,QAAOe;;AAER,SAASL,SAASH,OAAOgB,UAAU,EAAE,EAAE;CACtC,MAAMC,cAAc3B,OAAOU,MAAME,KAAK,CAAC;CACvC,MAAM,EAAEgB,MAAMC,OAAO,CAACnB,OAAOkB,KAAI,KAAMF;CACvC,MAAMI,YAAYhC,aAAaiC,aAAa;EAC3C,MAAMC,cAAcT,UAAU;AAC7B,OAAII,YAAYM,YAAYV,MAAO;AACnCI,eAAYM,UAAUV;AACtBQ,aAAU;;AAEXC,aAAWtB,MAAMa,MAAM;AACvB,MAAIK,MAAMM,OAAQ,QAAOrC,WAAWa,OAAOkB,MAAMI,WAAW;AAC5D,SAAOtB,MAAMyB,OAAOH,WAAW;IAC7BH,KAAK;CACR,MAAMjB,YAAYe,YAAYM;AAC9B,QAAOhC,qBAAqB6B,WAAWlB,WAAW;AACjD,SAAOA,KAAK;GACX"}
1
+ {"version":3,"file":"react.js","names":["isReadableAtom","hydrateFromWindow","isGetHook","isMutatorHook","isStore","listenKeys","useCallback","useEffect","useMemo","useRef","useSyncExternalStore","createReactHook","hook","path","query","pathParamValues","Object","values","queryParamValues","store","window","get","useStore","createReactMutator","mutatorStore","isPlainObject","value","prototype","getPrototypeOf","areStoreFactoryValuesEqual","left","right","is","Array","isArray","length","every","index","Date","getTime","leftKeys","keys","sort","rightKeys","key","areStoreFactoryArgsEqual","getStoreDisposer","disposer","Symbol","dispose","bind","createReactStoreObjectView","getAtomValue","atomValues","Map","boundMethods","Proxy","target","property","_receiver","propertyValue","Reflect","has","atomValue","set","boundMethod","unwrapReactStoreValueOnServer","unwrapReactStoreValue","atomEntries","flatMap","fieldValue","snapshotRef","map","getSnapshot","nextSnapshot","previousSnapshot","current","entry","onStoreChange","unsubscribes","listen","unsubscribe","atomIndex","findIndex","entryStore","createReactStore","args","stableArgsRef","pendingDisposalsRef","factory","obj","pendingTimeout","clearTimeout","delete","timeoutId","setTimeout","useFragno","clientObj","result","hasOwnProperty","call","options","deps","subscribe","onChange","emitChange","FragnoHydrator","children"],"sources":["../../../../../../../../fragno/dist/client/react.js"],"sourcesContent":["import { isReadableAtom } from \"../util/nanostores.js\";\nimport { hydrateFromWindow } from \"../util/ssr.js\";\nimport { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { listenKeys } from \"nanostores\";\nimport { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from \"react\";\n\n//#region src/client/react.ts\nfunction createReactHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParamValues = path ? Object.values(path) : [];\n\t\tconst queryParamValues = query ? Object.values(query) : [];\n\t\tconst store = useMemo(() => hook.store({\n\t\t\tpath,\n\t\t\tquery\n\t\t}), [hook, ...[...pathParamValues, ...queryParamValues]]);\n\t\tif (typeof window === \"undefined\") return store.get();\n\t\treturn useStore(store);\n\t};\n}\nfunction createReactMutator(hook) {\n\treturn () => {\n\t\treturn useStore(useMemo(() => hook.mutatorStore, [hook]));\n\t};\n}\nconst isPlainObject = (value) => {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n};\nconst areStoreFactoryValuesEqual = (left, right) => {\n\tif (Object.is(left, right)) return true;\n\tif (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((value, index) => areStoreFactoryValuesEqual(value, right[index]));\n\tif (left instanceof Date && right instanceof Date) return left.getTime() === right.getTime();\n\tif (isReadableAtom(left) || isReadableAtom(right)) return left === right;\n\tif (typeof left === \"function\" || typeof right === \"function\") return left === right;\n\tif (isPlainObject(left) && isPlainObject(right)) {\n\t\tconst leftKeys = Object.keys(left).sort();\n\t\tconst rightKeys = Object.keys(right).sort();\n\t\treturn leftKeys.length === rightKeys.length && leftKeys.every((key, index) => key === rightKeys[index] && areStoreFactoryValuesEqual(left[key], right[key]));\n\t}\n\treturn false;\n};\nconst areStoreFactoryArgsEqual = (left, right) => left.length === right.length && left.every((value, index) => areStoreFactoryValuesEqual(value, right[index]));\nconst getStoreDisposer = (value) => {\n\tconst disposer = value[Symbol.dispose];\n\treturn typeof disposer === \"function\" ? disposer.bind(value) : void 0;\n};\nconst createReactStoreObjectView = (value, getAtomValue) => {\n\tconst atomValues = /* @__PURE__ */ new Map();\n\tconst boundMethods = /* @__PURE__ */ new Map();\n\treturn new Proxy(value, { get(target, property, _receiver) {\n\t\tconst propertyValue = Reflect.get(target, property, target);\n\t\tif (isReadableAtom(propertyValue)) {\n\t\t\tif (atomValues.has(propertyValue)) return atomValues.get(propertyValue);\n\t\t\tconst atomValue = getAtomValue(propertyValue);\n\t\t\tatomValues.set(propertyValue, atomValue);\n\t\t\treturn atomValue;\n\t\t}\n\t\tif (typeof propertyValue === \"function\") {\n\t\t\tif (boundMethods.has(property)) return boundMethods.get(property);\n\t\t\tconst boundMethod = propertyValue.bind(target);\n\t\t\tboundMethods.set(property, boundMethod);\n\t\t\treturn boundMethod;\n\t\t}\n\t\treturn propertyValue;\n\t} });\n};\nfunction unwrapReactStoreValueOnServer(value) {\n\tif (isReadableAtom(value)) return value.get();\n\treturn createReactStoreObjectView(value, (store) => store.get());\n}\nfunction unwrapReactStoreValue(value) {\n\tif (isReadableAtom(value)) return useStore(value);\n\tconst atomEntries = Object.keys(value).flatMap((key) => {\n\t\tconst fieldValue = value[key];\n\t\treturn isReadableAtom(fieldValue) ? [[key, fieldValue]] : [];\n\t});\n\tconst snapshotRef = useRef(atomEntries.map(([, store]) => store.get()));\n\tconst getSnapshot = () => {\n\t\tconst nextSnapshot = atomEntries.map(([, store]) => store.get());\n\t\tconst previousSnapshot = snapshotRef.current;\n\t\tif (previousSnapshot.length === nextSnapshot.length && previousSnapshot.every((entry, index) => Object.is(entry, nextSnapshot[index]))) return previousSnapshot;\n\t\tsnapshotRef.current = nextSnapshot;\n\t\treturn nextSnapshot;\n\t};\n\tconst atomValues = useSyncExternalStore((onStoreChange) => {\n\t\tconst unsubscribes = atomEntries.map(([, store]) => store.listen(onStoreChange));\n\t\treturn () => {\n\t\t\tfor (const unsubscribe of unsubscribes) unsubscribe();\n\t\t};\n\t}, getSnapshot, getSnapshot);\n\treturn useMemo(() => createReactStoreObjectView(value, (store) => {\n\t\tconst atomIndex = atomEntries.findIndex(([, entryStore]) => entryStore === store);\n\t\treturn atomIndex === -1 ? store.get() : atomValues[atomIndex];\n\t}), [\n\t\tvalue,\n\t\tatomEntries,\n\t\tatomValues\n\t]);\n}\nfunction createReactStore(hook) {\n\treturn ((...args) => {\n\t\tconst stableArgsRef = useRef(args);\n\t\tconst pendingDisposalsRef = useRef(/* @__PURE__ */ new Map());\n\t\tif (!areStoreFactoryArgsEqual(stableArgsRef.current, args)) stableArgsRef.current = args;\n\t\tconst value = useMemo(() => {\n\t\t\tif (\"factory\" in hook) return hook.factory(...stableArgsRef.current);\n\t\t\treturn hook.obj;\n\t\t}, [hook, stableArgsRef.current]);\n\t\tuseEffect(() => {\n\t\t\tconst disposer = getStoreDisposer(value);\n\t\t\tconst pendingTimeout = pendingDisposalsRef.current.get(value);\n\t\t\tif (pendingTimeout !== void 0) {\n\t\t\t\tclearTimeout(pendingTimeout);\n\t\t\t\tpendingDisposalsRef.current.delete(value);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tif (!disposer) return;\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\tpendingDisposalsRef.current.delete(value);\n\t\t\t\t\tdisposer();\n\t\t\t\t}, 0);\n\t\t\t\tpendingDisposalsRef.current.set(value, timeoutId);\n\t\t\t};\n\t\t}, [value]);\n\t\tif (typeof window === \"undefined\") return unwrapReactStoreValueOnServer(value);\n\t\treturn unwrapReactStoreValue(value);\n\t});\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createReactHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createReactMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createReactStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\nfunction useStore(store, options = {}) {\n\tconst snapshotRef = useRef(store.get());\n\tconst { keys, deps = [store, keys] } = options;\n\tconst subscribe = useCallback((onChange) => {\n\t\tconst emitChange = (value) => {\n\t\t\tif (snapshotRef.current === value) return;\n\t\t\tsnapshotRef.current = value;\n\t\t\tonChange();\n\t\t};\n\t\temitChange(store.value);\n\t\tif (keys?.length) return listenKeys(store, keys, emitChange);\n\t\treturn store.listen(emitChange);\n\t}, deps);\n\tconst get = () => snapshotRef.current;\n\treturn useSyncExternalStore(subscribe, get, () => {\n\t\treturn get();\n\t});\n}\nfunction FragnoHydrator({ children }) {\n\tuseMemo(() => {\n\t\thydrateFromWindow();\n\t}, []);\n\treturn children;\n}\n\n//#endregion\nexport { FragnoHydrator, useFragno, useStore };\n//# sourceMappingURL=react.js.map"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { atom } from "../../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js";
2
1
  import { isReadableAtom } from "../util/nanostores.js";
2
+ import { atom } from "../../../../node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/atom/index.js";
3
3
  import { isGetHook, isMutatorHook, isStore } from "./client.js";
4
- import { m } from "../../../../node_modules/.pnpm/@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10/node_modules/@nanostores/solid/dist/index.js";
5
- import { createEffect } from "solid-js";
4
+ import { m } from "../../../../node_modules/.pnpm/@nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10/node_modules/@nanostores/solid/dist/index.js";
5
+ import { createEffect, onCleanup } from "solid-js";
6
6
 
7
7
  //#region ../fragno/dist/client/solid.js
8
8
  /**
@@ -79,16 +79,30 @@ function createSolidMutator(hook) {
79
79
  };
80
80
  };
81
81
  }
82
- function createSolidStore(hook) {
83
- if (isReadableAtom(hook.obj)) return m(hook.obj);
82
+ function unwrapSolidStoreValue(value) {
83
+ if (isReadableAtom(value)) return m(value);
84
84
  const result = {};
85
- for (const key in hook.obj) {
86
- if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) continue;
87
- const value = hook.obj[key];
88
- if (isReadableAtom(value)) result[key] = m(value);
89
- else result[key] = value;
85
+ for (const key in value) {
86
+ if (!Object.prototype.hasOwnProperty.call(value, key)) continue;
87
+ const fieldValue = value[key];
88
+ if (isReadableAtom(fieldValue)) result[key] = m(fieldValue);
89
+ else result[key] = fieldValue;
90
+ }
91
+ return result;
92
+ }
93
+ function createSolidStore(hook) {
94
+ if ("obj" in hook) {
95
+ if (isReadableAtom(hook.obj)) return m(hook.obj);
96
+ return () => unwrapSolidStoreValue(hook.obj);
90
97
  }
91
- return () => result;
98
+ return (...args) => {
99
+ const value = hook.factory(...args);
100
+ const disposer = value[Symbol.dispose];
101
+ if (typeof disposer === "function") onCleanup(() => {
102
+ disposer.call(value);
103
+ });
104
+ return unwrapSolidStoreValue(value);
105
+ };
92
106
  }
93
107
  function useFragno(clientObj) {
94
108
  const result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"solid.js","names":["isReadableAtom","isGetHook","isMutatorHook","isStore","atom","useStore","createEffect","isAccessor","value","accessorToAtom","accessor","a","set","createSolidHook","hook","path","query","pathParams","queryParams","key","Object","entries","v","storeValue","store","data","loading","error","createSolidMutator","mutatorStore","mutate","args","body","createSolidStore","obj","result","prototype","hasOwnProperty","call","useFragno","clientObj"],"sources":["../../../../../../../../fragno/dist/client/solid.js"],"sourcesContent":["import { isReadableAtom } from \"../util/nanostores.js\";\nimport { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { atom } from \"nanostores\";\nimport { useStore } from \"@nanostores/solid\";\nimport { createEffect } from \"solid-js\";\n\n//#region src/client/solid.ts\n/**\n* Type guard to check if a value is a SolidJS Accessor.\n*\n* @private\n*/\nfunction isAccessor(value) {\n\treturn typeof value === \"function\";\n}\n/**\n* Converts a SolidJS Accessor to a NanoStore Atom.\n*\n* This is used to convert SolidJS accessors to atoms, so that we can use them in the store.\n*\n* @private\n*/\nfunction accessorToAtom(accessor) {\n\tconst a = atom(accessor());\n\tcreateEffect(() => {\n\t\ta.set(accessor());\n\t});\n\treturn a;\n}\nfunction createSolidHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParams = {};\n\t\tconst queryParams = {};\n\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\tconst v = value;\n\t\t\tpathParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\tconst v = value;\n\t\t\tqueryParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n\t\t}\n\t\tconst storeValue = useStore(hook.store({\n\t\t\tpath: pathParams,\n\t\t\tquery: queryParams\n\t\t}));\n\t\treturn {\n\t\t\tdata: () => storeValue().data,\n\t\t\tloading: () => storeValue().loading,\n\t\t\terror: () => storeValue().error\n\t\t};\n\t};\n}\nfunction createSolidMutator(hook) {\n\treturn () => {\n\t\tconst store = useStore(hook.mutatorStore);\n\t\tconst mutate = async (args) => {\n\t\t\tconst { body, path, query } = args;\n\t\t\tconst pathParams = {};\n\t\t\tconst queryParams = {};\n\t\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tpathParams[key] = isAccessor(v) ? v() : v;\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tqueryParams[key] = isAccessor(v) ? v() : v;\n\t\t\t}\n\t\t\treturn hook.mutatorStore.mutate({\n\t\t\t\tbody,\n\t\t\t\tpath: pathParams,\n\t\t\t\tquery: queryParams\n\t\t\t});\n\t\t};\n\t\treturn {\n\t\t\tmutate,\n\t\t\tdata: () => store().data,\n\t\t\tloading: () => store().loading,\n\t\t\terror: () => store().error\n\t\t};\n\t};\n}\nfunction createSolidStore(hook) {\n\tif (isReadableAtom(hook.obj)) return useStore(hook.obj);\n\tconst result = {};\n\tfor (const key in hook.obj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(hook.obj, key)) continue;\n\t\tconst value = hook.obj[key];\n\t\tif (isReadableAtom(value)) result[key] = useStore(value);\n\t\telse result[key] = value;\n\t}\n\treturn () => result;\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createSolidHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createSolidMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createSolidStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { accessorToAtom, isAccessor, useFragno };\n//# sourceMappingURL=solid.js.map"],"mappings":"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"}
1
+ {"version":3,"file":"solid.js","names":["isReadableAtom","isGetHook","isMutatorHook","isStore","atom","createEffect","onCleanup","useStore","isAccessor","value","accessorToAtom","accessor","a","set","createSolidHook","hook","path","query","pathParams","queryParams","key","Object","entries","v","storeValue","store","data","loading","error","createSolidMutator","mutatorStore","mutate","args","body","unwrapSolidStoreValue","result","prototype","hasOwnProperty","call","fieldValue","createSolidStore","obj","factory","disposer","Symbol","dispose","useFragno","clientObj"],"sources":["../../../../../../../../fragno/dist/client/solid.js"],"sourcesContent":["import { isReadableAtom } from \"../util/nanostores.js\";\nimport { isGetHook, isMutatorHook, isStore } from \"./client.js\";\nimport { atom } from \"nanostores\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { useStore } from \"@nanostores/solid\";\n\n//#region src/client/solid.ts\n/**\n* Type guard to check if a value is a SolidJS Accessor.\n*\n* @private\n*/\nfunction isAccessor(value) {\n\treturn typeof value === \"function\";\n}\n/**\n* Converts a SolidJS Accessor to a NanoStore Atom.\n*\n* This is used to convert SolidJS accessors to atoms, so that we can use them in the store.\n*\n* @private\n*/\nfunction accessorToAtom(accessor) {\n\tconst a = atom(accessor());\n\tcreateEffect(() => {\n\t\ta.set(accessor());\n\t});\n\treturn a;\n}\nfunction createSolidHook(hook) {\n\treturn ({ path, query } = {}) => {\n\t\tconst pathParams = {};\n\t\tconst queryParams = {};\n\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\tconst v = value;\n\t\t\tpathParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\tconst v = value;\n\t\t\tqueryParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n\t\t}\n\t\tconst storeValue = useStore(hook.store({\n\t\t\tpath: pathParams,\n\t\t\tquery: queryParams\n\t\t}));\n\t\treturn {\n\t\t\tdata: () => storeValue().data,\n\t\t\tloading: () => storeValue().loading,\n\t\t\terror: () => storeValue().error\n\t\t};\n\t};\n}\nfunction createSolidMutator(hook) {\n\treturn () => {\n\t\tconst store = useStore(hook.mutatorStore);\n\t\tconst mutate = async (args) => {\n\t\t\tconst { body, path, query } = args;\n\t\t\tconst pathParams = {};\n\t\t\tconst queryParams = {};\n\t\t\tfor (const [key, value] of Object.entries(path ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tpathParams[key] = isAccessor(v) ? v() : v;\n\t\t\t}\n\t\t\tfor (const [key, value] of Object.entries(query ?? {})) {\n\t\t\t\tconst v = value;\n\t\t\t\tqueryParams[key] = isAccessor(v) ? v() : v;\n\t\t\t}\n\t\t\treturn hook.mutatorStore.mutate({\n\t\t\t\tbody,\n\t\t\t\tpath: pathParams,\n\t\t\t\tquery: queryParams\n\t\t\t});\n\t\t};\n\t\treturn {\n\t\t\tmutate,\n\t\t\tdata: () => store().data,\n\t\t\tloading: () => store().loading,\n\t\t\terror: () => store().error\n\t\t};\n\t};\n}\nfunction unwrapSolidStoreValue(value) {\n\tif (isReadableAtom(value)) return useStore(value);\n\tconst result = {};\n\tfor (const key in value) {\n\t\tif (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n\t\tconst fieldValue = value[key];\n\t\tif (isReadableAtom(fieldValue)) result[key] = useStore(fieldValue);\n\t\telse result[key] = fieldValue;\n\t}\n\treturn result;\n}\nfunction createSolidStore(hook) {\n\tif (\"obj\" in hook) {\n\t\tif (isReadableAtom(hook.obj)) return useStore(hook.obj);\n\t\treturn (() => unwrapSolidStoreValue(hook.obj));\n\t}\n\treturn ((...args) => {\n\t\tconst value = hook.factory(...args);\n\t\tconst disposer = value[Symbol.dispose];\n\t\tif (typeof disposer === \"function\") onCleanup(() => {\n\t\t\tdisposer.call(value);\n\t\t});\n\t\treturn unwrapSolidStoreValue(value);\n\t});\n}\nfunction useFragno(clientObj) {\n\tconst result = {};\n\tfor (const key in clientObj) {\n\t\tif (!Object.prototype.hasOwnProperty.call(clientObj, key)) continue;\n\t\tconst hook = clientObj[key];\n\t\tif (isGetHook(hook)) result[key] = createSolidHook(hook);\n\t\telse if (isMutatorHook(hook)) result[key] = createSolidMutator(hook);\n\t\telse if (isStore(hook)) result[key] = createSolidStore(hook);\n\t\telse result[key] = hook;\n\t}\n\treturn result;\n}\n\n//#endregion\nexport { accessorToAtom, isAccessor, useFragno };\n//# sourceMappingURL=solid.js.map"],"mappings":"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"}