@fragno-dev/core 0.1.7 → 0.1.9

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 (183) hide show
  1. package/.turbo/turbo-build.log +131 -64
  2. package/CHANGELOG.md +19 -0
  3. package/dist/api/api.d.ts +38 -2
  4. package/dist/api/api.d.ts.map +1 -0
  5. package/dist/api/api.js +9 -2
  6. package/dist/api/api.js.map +1 -0
  7. package/dist/api/bind-services.d.ts +6 -0
  8. package/dist/api/bind-services.d.ts.map +1 -0
  9. package/dist/api/bind-services.js +20 -0
  10. package/dist/api/bind-services.js.map +1 -0
  11. package/dist/api/error.d.ts +26 -0
  12. package/dist/api/error.d.ts.map +1 -0
  13. package/dist/{api-DngJDcmO.js → api/error.js} +2 -8
  14. package/dist/api/error.js.map +1 -0
  15. package/dist/api/fragment-definition-builder.d.ts +313 -0
  16. package/dist/api/fragment-definition-builder.d.ts.map +1 -0
  17. package/dist/api/fragment-definition-builder.js +326 -0
  18. package/dist/api/fragment-definition-builder.js.map +1 -0
  19. package/dist/api/fragment-instantiator.d.ts +216 -0
  20. package/dist/api/fragment-instantiator.d.ts.map +1 -0
  21. package/dist/api/fragment-instantiator.js +487 -0
  22. package/dist/api/fragment-instantiator.js.map +1 -0
  23. package/dist/api/fragno-response.d.ts +30 -0
  24. package/dist/api/fragno-response.d.ts.map +1 -0
  25. package/dist/api/fragno-response.js +73 -0
  26. package/dist/api/fragno-response.js.map +1 -0
  27. package/dist/api/internal/path.d.ts +50 -0
  28. package/dist/api/internal/path.d.ts.map +1 -0
  29. package/dist/api/internal/path.js +76 -0
  30. package/dist/api/internal/path.js.map +1 -0
  31. package/dist/api/internal/response-stream.d.ts +43 -0
  32. package/dist/api/internal/response-stream.d.ts.map +1 -0
  33. package/dist/api/internal/response-stream.js +81 -0
  34. package/dist/api/internal/response-stream.js.map +1 -0
  35. package/dist/api/internal/route.js +10 -0
  36. package/dist/api/internal/route.js.map +1 -0
  37. package/dist/api/mutable-request-state.d.ts +82 -0
  38. package/dist/api/mutable-request-state.d.ts.map +1 -0
  39. package/dist/api/mutable-request-state.js +97 -0
  40. package/dist/api/mutable-request-state.js.map +1 -0
  41. package/dist/api/request-context-storage.d.ts +42 -0
  42. package/dist/api/request-context-storage.d.ts.map +1 -0
  43. package/dist/api/request-context-storage.js +43 -0
  44. package/dist/api/request-context-storage.js.map +1 -0
  45. package/dist/api/request-input-context.d.ts +89 -0
  46. package/dist/api/request-input-context.d.ts.map +1 -0
  47. package/dist/api/request-input-context.js +118 -0
  48. package/dist/api/request-input-context.js.map +1 -0
  49. package/dist/api/request-middleware.d.ts +50 -0
  50. package/dist/api/request-middleware.d.ts.map +1 -0
  51. package/dist/api/request-middleware.js +83 -0
  52. package/dist/api/request-middleware.js.map +1 -0
  53. package/dist/api/request-output-context.d.ts +41 -0
  54. package/dist/api/request-output-context.d.ts.map +1 -0
  55. package/dist/api/request-output-context.js +119 -0
  56. package/dist/api/request-output-context.js.map +1 -0
  57. package/dist/api/route-handler-input-options.d.ts +21 -0
  58. package/dist/api/route-handler-input-options.d.ts.map +1 -0
  59. package/dist/api/route.d.ts +54 -3
  60. package/dist/api/route.d.ts.map +1 -0
  61. package/dist/api/route.js +29 -2
  62. package/dist/api/route.js.map +1 -0
  63. package/dist/api/shared-types.d.ts +47 -0
  64. package/dist/api/shared-types.d.ts.map +1 -0
  65. package/dist/api/shared-types.js +1 -0
  66. package/dist/client/client-error.d.ts +60 -0
  67. package/dist/client/client-error.d.ts.map +1 -0
  68. package/dist/client/client-error.js +92 -0
  69. package/dist/client/client-error.js.map +1 -0
  70. package/dist/client/client.d.ts +210 -4
  71. package/dist/client/client.d.ts.map +1 -0
  72. package/dist/client/client.js +397 -6
  73. package/dist/client/client.js.map +1 -0
  74. package/dist/client/client.svelte.d.ts +5 -3
  75. package/dist/client/client.svelte.d.ts.map +1 -1
  76. package/dist/client/client.svelte.js +1 -5
  77. package/dist/client/client.svelte.js.map +1 -1
  78. package/dist/client/internal/fetcher-merge.js +36 -0
  79. package/dist/client/internal/fetcher-merge.js.map +1 -0
  80. package/dist/client/internal/ndjson-streaming.js +139 -0
  81. package/dist/client/internal/ndjson-streaming.js.map +1 -0
  82. package/dist/client/react.d.ts +5 -3
  83. package/dist/client/react.d.ts.map +1 -1
  84. package/dist/client/react.js +3 -5
  85. package/dist/client/react.js.map +1 -1
  86. package/dist/client/solid.d.ts +5 -3
  87. package/dist/client/solid.d.ts.map +1 -1
  88. package/dist/client/solid.js +2 -5
  89. package/dist/client/solid.js.map +1 -1
  90. package/dist/client/vanilla.d.ts +5 -3
  91. package/dist/client/vanilla.d.ts.map +1 -1
  92. package/dist/client/vanilla.js +2 -43
  93. package/dist/client/vanilla.js.map +1 -1
  94. package/dist/client/vue.d.ts +5 -3
  95. package/dist/client/vue.d.ts.map +1 -1
  96. package/dist/client/vue.js +1 -5
  97. package/dist/client/vue.js.map +1 -1
  98. package/dist/http/http-status.d.ts +26 -0
  99. package/dist/http/http-status.d.ts.map +1 -0
  100. package/dist/integrations/react-ssr.js +1 -1
  101. package/dist/internal/symbols.d.ts +9 -0
  102. package/dist/internal/symbols.d.ts.map +1 -0
  103. package/dist/internal/symbols.js +10 -0
  104. package/dist/internal/symbols.js.map +1 -0
  105. package/dist/mod-client.d.ts +36 -0
  106. package/dist/mod-client.d.ts.map +1 -0
  107. package/dist/mod-client.js +21 -0
  108. package/dist/mod-client.js.map +1 -0
  109. package/dist/mod.d.ts +7 -4
  110. package/dist/mod.js +4 -6
  111. package/dist/request/request.d.ts +4 -0
  112. package/dist/request/request.js +5 -0
  113. package/dist/test/test.d.ts +62 -35
  114. package/dist/test/test.d.ts.map +1 -1
  115. package/dist/test/test.js +75 -40
  116. package/dist/test/test.js.map +1 -1
  117. package/dist/util/async.js +40 -0
  118. package/dist/util/async.js.map +1 -0
  119. package/dist/util/content-type.js +49 -0
  120. package/dist/util/content-type.js.map +1 -0
  121. package/dist/util/nanostores.js +31 -0
  122. package/dist/util/nanostores.js.map +1 -0
  123. package/dist/{ssr-BByDVfFD.js → util/ssr.js} +2 -2
  124. package/dist/util/ssr.js.map +1 -0
  125. package/dist/util/types-util.d.ts +8 -0
  126. package/dist/util/types-util.d.ts.map +1 -0
  127. package/package.json +19 -12
  128. package/src/api/api.ts +41 -6
  129. package/src/api/bind-services.ts +42 -0
  130. package/src/api/fragment-definition-builder.extend.test.ts +810 -0
  131. package/src/api/fragment-definition-builder.test.ts +499 -0
  132. package/src/api/fragment-definition-builder.ts +1088 -0
  133. package/src/api/fragment-instantiator.test.ts +1488 -0
  134. package/src/api/fragment-instantiator.ts +1053 -0
  135. package/src/api/fragment-services.test.ts +727 -0
  136. package/src/api/request-context-storage.ts +64 -0
  137. package/src/api/request-middleware.test.ts +301 -225
  138. package/src/api/route.test.ts +87 -1
  139. package/src/api/route.ts +345 -24
  140. package/src/api/shared-types.ts +43 -0
  141. package/src/client/client-builder.test.ts +23 -23
  142. package/src/client/client.ssr.test.ts +3 -3
  143. package/src/client/client.svelte.test.ts +15 -15
  144. package/src/client/client.test.ts +22 -22
  145. package/src/client/client.ts +72 -12
  146. package/src/client/internal/fetcher-merge.ts +1 -1
  147. package/src/client/react.test.ts +2 -2
  148. package/src/client/solid.test.ts +2 -2
  149. package/src/client/vanilla.test.ts +2 -2
  150. package/src/client/vue.test.ts +2 -2
  151. package/src/internal/symbols.ts +5 -0
  152. package/src/mod-client.ts +59 -0
  153. package/src/mod.ts +26 -9
  154. package/src/request/request.ts +8 -0
  155. package/src/test/test.test.ts +200 -381
  156. package/src/test/test.ts +190 -117
  157. package/tsdown.config.ts +8 -5
  158. package/dist/api/fragment-builder.d.ts +0 -4
  159. package/dist/api/fragment-builder.js +0 -3
  160. package/dist/api/fragment-instantiation.d.ts +0 -4
  161. package/dist/api/fragment-instantiation.js +0 -6
  162. package/dist/api-BWN97TOr.d.ts +0 -377
  163. package/dist/api-BWN97TOr.d.ts.map +0 -1
  164. package/dist/api-DngJDcmO.js.map +0 -1
  165. package/dist/client-C5LsYHEI.js +0 -782
  166. package/dist/client-C5LsYHEI.js.map +0 -1
  167. package/dist/fragment-builder-DOnCVBqc.js +0 -47
  168. package/dist/fragment-builder-DOnCVBqc.js.map +0 -1
  169. package/dist/fragment-builder-MGr68GNb.d.ts +0 -409
  170. package/dist/fragment-builder-MGr68GNb.d.ts.map +0 -1
  171. package/dist/fragment-instantiation-C4wvwl6V.js +0 -446
  172. package/dist/fragment-instantiation-C4wvwl6V.js.map +0 -1
  173. package/dist/request-output-context-CdIjwmEN.js +0 -320
  174. package/dist/request-output-context-CdIjwmEN.js.map +0 -1
  175. package/dist/route-Bl9Zr1Yv.d.ts +0 -26
  176. package/dist/route-Bl9Zr1Yv.d.ts.map +0 -1
  177. package/dist/route-C5Uryylh.js +0 -21
  178. package/dist/route-C5Uryylh.js.map +0 -1
  179. package/dist/ssr-BByDVfFD.js.map +0 -1
  180. package/src/api/fragment-builder.ts +0 -80
  181. package/src/api/fragment-instantiation.test.ts +0 -460
  182. package/src/api/fragment-instantiation.ts +0 -499
  183. package/src/api/fragment.test.ts +0 -537
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher-merge.js","names":[],"sources":["../../../src/client/internal/fetcher-merge.ts"],"sourcesContent":["import type { FetcherConfig } from \"../../api/shared-types\";\n\n/**\n * Merge two fetcher configurations, with user config taking precedence.\n * If user provides a custom function, it takes full precedence.\n * Otherwise, deep merge RequestInit options.\n */\nexport function mergeFetcherConfigs(\n authorConfig?: FetcherConfig,\n userConfig?: FetcherConfig,\n): FetcherConfig | undefined {\n // If user provides custom function, it takes full precedence\n if (userConfig?.type === \"function\") {\n return userConfig;\n }\n\n if (!userConfig && authorConfig?.type === \"function\") {\n return authorConfig;\n }\n\n // Deep merge RequestInit options\n const authorOpts = authorConfig?.type === \"options\" ? authorConfig.options : {};\n const userOpts = userConfig?.type === \"options\" ? userConfig.options : {};\n\n // If both are empty, return undefined\n if (Object.keys(authorOpts).length === 0 && Object.keys(userOpts).length === 0) {\n return undefined;\n }\n\n return {\n type: \"options\",\n options: {\n ...authorOpts,\n ...userOpts,\n headers: mergeHeaders(authorOpts.headers, userOpts.headers),\n },\n };\n}\n\n/**\n * Merge headers from author and user configs.\n * User headers override author headers.\n */\nfunction mergeHeaders(author?: HeadersInit, user?: HeadersInit): HeadersInit | undefined {\n if (!author && !user) {\n return undefined;\n }\n\n // Convert to Headers objects and merge\n const merged = new Headers(author);\n new Headers(user).forEach((value, key) => merged.set(key, value));\n\n // If no headers after merge, return undefined\n if (merged.keys().next().done) {\n return undefined;\n }\n\n return merged;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,oBACd,cACA,YAC2B;AAE3B,KAAI,YAAY,SAAS,WACvB,QAAO;AAGT,KAAI,CAAC,cAAc,cAAc,SAAS,WACxC,QAAO;CAIT,MAAM,aAAa,cAAc,SAAS,YAAY,aAAa,UAAU,EAAE;CAC/E,MAAM,WAAW,YAAY,SAAS,YAAY,WAAW,UAAU,EAAE;AAGzE,KAAI,OAAO,KAAK,WAAW,CAAC,WAAW,KAAK,OAAO,KAAK,SAAS,CAAC,WAAW,EAC3E;AAGF,QAAO;EACL,MAAM;EACN,SAAS;GACP,GAAG;GACH,GAAG;GACH,SAAS,aAAa,WAAW,SAAS,SAAS,QAAQ;GAC5D;EACF;;;;;;AAOH,SAAS,aAAa,QAAsB,MAA6C;AACvF,KAAI,CAAC,UAAU,CAAC,KACd;CAIF,MAAM,SAAS,IAAI,QAAQ,OAAO;AAClC,KAAI,QAAQ,KAAK,CAAC,SAAS,OAAO,QAAQ,OAAO,IAAI,KAAK,MAAM,CAAC;AAGjE,KAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KACvB;AAGF,QAAO"}
@@ -0,0 +1,139 @@
1
+ import { FragnoClientError, FragnoClientFetchAbortError, FragnoClientFetchError, FragnoClientUnknownApiError } from "../client-error.js";
2
+
3
+ //#region src/client/internal/ndjson-streaming.ts
4
+ /**
5
+ * Creates a promise that rejects when the abort signal is triggered
6
+ */
7
+ function createAbortPromise(abortSignal) {
8
+ return new Promise((_, reject) => {
9
+ const abortHandler = () => {
10
+ reject(new FragnoClientFetchAbortError("Operation was aborted"));
11
+ };
12
+ if (abortSignal.aborted) abortHandler();
13
+ else abortSignal.addEventListener("abort", abortHandler, { once: true });
14
+ });
15
+ }
16
+ /**
17
+ * Handles NDJSON streaming responses by returning the first item from the fetcher
18
+ * and then continuing to stream updates via the store's mutate method.
19
+ *
20
+ * This makes it so that we can wait until the first chunk before updating the store, if we did
21
+ * not do this, `loading` would briefly be false before the first item would be populated in the
22
+ * result.
23
+ *
24
+ * @param response - The fetch Response object containing the NDJSON stream
25
+ * @param store - The fetcher store to update with streaming data
26
+ * @param abortSignal - Optional AbortSignal to cancel the streaming operation
27
+ * @returns A promise that resolves to an object containing the first item and a streaming promise
28
+ */
29
+ async function handleNdjsonStreamingFirstItem(response, store, options = {}) {
30
+ if (!response.body) throw new FragnoClientFetchError("Streaming response has no body", "NO_BODY");
31
+ const { abortSignal } = options;
32
+ if (abortSignal?.aborted) throw new FragnoClientFetchAbortError("Operation was aborted");
33
+ const decoder = new TextDecoder();
34
+ const reader = response.body.getReader();
35
+ let buffer = "";
36
+ let firstItem = null;
37
+ const items = [];
38
+ try {
39
+ while (firstItem === null) {
40
+ if (abortSignal?.aborted) {
41
+ reader.releaseLock();
42
+ throw new FragnoClientFetchAbortError("Operation was aborted");
43
+ }
44
+ const { done, value } = await (abortSignal ? Promise.race([reader.read(), createAbortPromise(abortSignal)]) : reader.read());
45
+ if (done) break;
46
+ buffer += decoder.decode(value, { stream: true });
47
+ const lines = buffer.split("\n");
48
+ buffer = lines.pop() || "";
49
+ for (const line of lines) {
50
+ if (!line.trim()) continue;
51
+ try {
52
+ const jsonObject = JSON.parse(line);
53
+ items.push(jsonObject);
54
+ if (firstItem === null) {
55
+ firstItem = jsonObject;
56
+ const streamingPromise = continueStreaming(reader, decoder, buffer, items, store, abortSignal);
57
+ return {
58
+ firstItem,
59
+ streamingPromise
60
+ };
61
+ }
62
+ } catch (parseError) {
63
+ throw new FragnoClientUnknownApiError("Failed to parse NDJSON line", 500, { cause: parseError });
64
+ }
65
+ }
66
+ }
67
+ if (firstItem === null) {
68
+ reader.releaseLock();
69
+ throw new FragnoClientUnknownApiError("NDJSON stream contained no valid items", 500);
70
+ }
71
+ reader.releaseLock();
72
+ throw new FragnoClientFetchError("Unexpected end of stream processing", "NO_BODY");
73
+ } catch (error) {
74
+ if (error instanceof FragnoClientError) {
75
+ store?.setError(error);
76
+ throw error;
77
+ } else {
78
+ const clientError = new FragnoClientUnknownApiError("Unknown streaming error", 500, { cause: error });
79
+ store?.setError(clientError);
80
+ throw clientError;
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Continues streaming the remaining items in the background
86
+ */
87
+ async function continueStreaming(reader, decoder, initialBuffer, items, store, abortSignal) {
88
+ let buffer = initialBuffer;
89
+ try {
90
+ while (true) {
91
+ if (abortSignal?.aborted) throw new FragnoClientFetchAbortError("Operation was aborted");
92
+ const { done, value } = await (abortSignal ? Promise.race([reader.read(), createAbortPromise(abortSignal)]) : reader.read());
93
+ if (done) {
94
+ if (buffer.trim()) {
95
+ const lines$1 = buffer.split("\n");
96
+ for (const line of lines$1) {
97
+ if (!line.trim()) continue;
98
+ try {
99
+ const jsonObject = JSON.parse(line);
100
+ items.push(jsonObject);
101
+ store?.setData([...items]);
102
+ } catch (parseError) {
103
+ throw new FragnoClientUnknownApiError("Failed to parse NDJSON line", 400, { cause: parseError });
104
+ }
105
+ }
106
+ }
107
+ break;
108
+ }
109
+ buffer += decoder.decode(value, { stream: true });
110
+ const lines = buffer.split("\n");
111
+ buffer = lines.pop() || "";
112
+ for (const line of lines) {
113
+ if (!line.trim()) continue;
114
+ try {
115
+ const jsonObject = JSON.parse(line);
116
+ items.push(jsonObject);
117
+ store?.setData([...items]);
118
+ } catch (parseError) {
119
+ throw new FragnoClientUnknownApiError("Failed to parse NDJSON line", 400, { cause: parseError });
120
+ }
121
+ }
122
+ }
123
+ } catch (error) {
124
+ if (error instanceof FragnoClientError) store?.setError(error);
125
+ else {
126
+ const clientError = new FragnoClientUnknownApiError("Unknown streaming error", 400, { cause: error });
127
+ store?.setError(clientError);
128
+ throw clientError;
129
+ }
130
+ throw error;
131
+ } finally {
132
+ reader.releaseLock();
133
+ }
134
+ return items;
135
+ }
136
+
137
+ //#endregion
138
+ export { handleNdjsonStreamingFirstItem };
139
+ //# sourceMappingURL=ndjson-streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-streaming.js","names":["firstItem: StandardSchemaV1.InferOutput<TOutputSchema> | null","items: StandardSchemaV1.InferOutput<TOutputSchema>[]","lines"],"sources":["../../../src/client/internal/ndjson-streaming.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport {\n FragnoClientError,\n FragnoClientFetchError,\n FragnoClientFetchAbortError,\n FragnoClientUnknownApiError,\n} from \"../client-error\";\n\n/**\n * Creates a promise that rejects when the abort signal is triggered\n */\nfunction createAbortPromise(abortSignal: AbortSignal): Promise<never> {\n return new Promise<never>((_, reject) => {\n const abortHandler = () => {\n reject(new FragnoClientFetchAbortError(\"Operation was aborted\"));\n };\n\n if (abortSignal.aborted) {\n abortHandler();\n } else {\n abortSignal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n });\n}\n\n/**\n * Result of NDJSON streaming that includes the first item and a promise for the streaming continuation\n */\nexport interface NdjsonStreamingResult<T> {\n firstItem: T;\n streamingPromise: Promise<T[]>;\n}\n\nexport interface NdjsonStreamingStore<\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n> {\n setData(value: StandardSchemaV1.InferOutput<TOutputSchema>): void;\n setError(value: FragnoClientError<TErrorCode>): void;\n}\n\n/**\n * Handles NDJSON streaming responses by returning the first item from the fetcher\n * and then continuing to stream updates via the store's mutate method.\n *\n * This makes it so that we can wait until the first chunk before updating the store, if we did\n * not do this, `loading` would briefly be false before the first item would be populated in the\n * result.\n *\n * @param response - The fetch Response object containing the NDJSON stream\n * @param store - The fetcher store to update with streaming data\n * @param abortSignal - Optional AbortSignal to cancel the streaming operation\n * @returns A promise that resolves to an object containing the first item and a streaming promise\n */\nexport async function handleNdjsonStreamingFirstItem<\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n>(\n response: Response,\n store?: NdjsonStreamingStore<TOutputSchema, TErrorCode>,\n options: { abortSignal?: AbortSignal } = {},\n): Promise<NdjsonStreamingResult<StandardSchemaV1.InferOutput<TOutputSchema>>> {\n if (!response.body) {\n throw new FragnoClientFetchError(\"Streaming response has no body\", \"NO_BODY\");\n }\n\n const { abortSignal } = options;\n\n if (abortSignal?.aborted) {\n throw new FragnoClientFetchAbortError(\"Operation was aborted\");\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = \"\";\n let firstItem: StandardSchemaV1.InferOutput<TOutputSchema> | null = null;\n const items: StandardSchemaV1.InferOutput<TOutputSchema>[] = [];\n\n try {\n // Read until we get the first item\n while (firstItem === null) {\n // Check for abort signal before each read\n if (abortSignal?.aborted) {\n reader.releaseLock();\n throw new FragnoClientFetchAbortError(\"Operation was aborted\");\n }\n\n const { done, value } = await (abortSignal\n ? Promise.race([reader.read(), createAbortPromise(abortSignal)])\n : reader.read());\n\n if (done) {\n break;\n }\n\n // Decode the chunk and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n try {\n const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;\n items.push(jsonObject);\n\n if (firstItem === null) {\n firstItem = jsonObject;\n // We don't call store.setKey here for the first item\n // The caller will handle it via the return value\n\n // Start background streaming for remaining items and return the promise\n const streamingPromise = continueStreaming(\n reader,\n decoder,\n buffer,\n items,\n store,\n abortSignal,\n );\n return {\n firstItem,\n streamingPromise,\n };\n }\n } catch (parseError) {\n throw new FragnoClientUnknownApiError(\"Failed to parse NDJSON line\", 500, {\n cause: parseError,\n });\n }\n }\n }\n\n // If we get here and haven't returned a first item, the stream was empty\n if (firstItem === null) {\n reader.releaseLock();\n throw new FragnoClientUnknownApiError(\"NDJSON stream contained no valid items\", 500);\n }\n\n // This should never be reached, but TypeScript needs it\n reader.releaseLock();\n throw new FragnoClientFetchError(\"Unexpected end of stream processing\", \"NO_BODY\");\n } catch (error) {\n // Handle errors during streaming\n if (error instanceof FragnoClientError) {\n store?.setError(error);\n throw error;\n } else {\n // TODO: Not sure about the typing here\n const clientError = new FragnoClientUnknownApiError(\"Unknown streaming error\", 500, {\n cause: error,\n }) as unknown as FragnoClientError<TErrorCode>;\n store?.setError(clientError);\n throw clientError;\n }\n }\n}\n\n/**\n * Continues streaming the remaining items in the background\n */\n// FIXME: Shitty code\nasync function continueStreaming<TOutputSchema extends StandardSchemaV1, TErrorCode extends string>(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n decoder: TextDecoder,\n initialBuffer: string,\n items: StandardSchemaV1.InferOutput<TOutputSchema>[],\n store?: NdjsonStreamingStore<TOutputSchema, TErrorCode>,\n abortSignal?: AbortSignal,\n): Promise<StandardSchemaV1.InferOutput<TOutputSchema>[]> {\n let buffer = initialBuffer;\n\n try {\n while (true) {\n // Check for abort signal before each read\n if (abortSignal?.aborted) {\n throw new FragnoClientFetchAbortError(\"Operation was aborted\");\n }\n\n const { done, value } = await (abortSignal\n ? Promise.race([reader.read(), createAbortPromise(abortSignal)])\n : reader.read());\n\n if (done) {\n // Process any remaining buffer content\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n try {\n const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;\n items.push(jsonObject);\n store?.setData([...items]);\n } catch (parseError) {\n throw new FragnoClientUnknownApiError(\"Failed to parse NDJSON line\", 400, {\n cause: parseError,\n });\n }\n }\n }\n break;\n }\n\n // Decode the chunk and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n try {\n const jsonObject = JSON.parse(line) as StandardSchemaV1.InferOutput<TOutputSchema>;\n items.push(jsonObject);\n store?.setData([...items]);\n } catch (parseError) {\n throw new FragnoClientUnknownApiError(\"Failed to parse NDJSON line\", 400, {\n cause: parseError,\n });\n }\n }\n }\n } catch (error) {\n if (error instanceof FragnoClientError) {\n store?.setError(error);\n } else {\n const clientError = new FragnoClientUnknownApiError(\"Unknown streaming error\", 400, {\n cause: error,\n }) as unknown as FragnoClientError<TErrorCode>;\n store?.setError(clientError);\n throw clientError;\n }\n\n throw error;\n } finally {\n reader.releaseLock();\n }\n\n return items;\n}\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import { _ as QueryParamsHint, g as MaybeExtractPathParamsOrWiden, h as HasPathParams, m as ExtractPathParamsOrWiden, r as NonGetHTTPMethod, u as InferOr } from "../api-BWN97TOr.js";
2
- import "../route-Bl9Zr1Yv.js";
3
- import { C as FragnoClientMutatorData, I as FragnoClientError, S as FragnoClientHookData, w as FragnoStoreData } from "../fragment-builder-MGr68GNb.js";
1
+ import { ExtractPathParamsOrWiden, HasPathParams, MaybeExtractPathParamsOrWiden, QueryParamsHint } from "../api/internal/path.js";
2
+ import { InferOr } from "../util/types-util.js";
3
+ import { NonGetHTTPMethod } from "../api/api.js";
4
+ import { FragnoClientError } from "./client-error.js";
5
+ import { FragnoClientHookData, FragnoClientMutatorData, FragnoStoreData } from "./client.js";
4
6
  import { ReadableAtom, Store, StoreValue } from "nanostores";
5
7
  import { FetcherValue } from "@nanostores/query";
6
8
  import * as react0 from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","names":[],"sources":["../../src/client/react.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAkBY,KAAA,eAAe,CAAA,iBAAA,KAAA,EAAA,gBAAA,MAAA,EAAA,wBAGH,gBAHG,EAAA,qBAAA,MAAA,EAAA,2BAAA,MAAA,CAAA,GAAA,CAAA,IAO4B,CAP5B,EAAA;EAGH,IAAA,CAAA,EAIf,6BAJe,CAIe,OAJf,EAAA,MAAA,GAI+B,YAJ/B,CAAA,MAAA,CAAA,CAAA;EAIe,KAAA,CAAA,EAC7B,eAD6B,CACb,kBADa,EAAA,MAAA,GACc,YADd,CAAA,MAAA,CAAA,CAAA;CAAgB,EAAA,GAEjD,YAFiD,CAGrD,gBAAA,CAAiB,WAHoC,CAGxB,eAHwB,CAAA,EAIrD,iBAJqD,CAInC,WAJmC,CAIvB,YAJuB,CAAA,CAAA,CAAA;AAA9C,KAOG,kBAPH,CAAA,iBAQU,gBARV,EAAA,gBAAA,MAAA,EAAA,qBAUc,gBAVd,GAAA,SAAA,EAAA,wBAWe,gBAXf,GAAA,SAAA,EAAA,qBAAA,MAAA,EAAA,2BAAA,MAAA,CAAA,GAAA,GAAA,GAAA;EACiB,MAAA,EAAA,CAAA;IAAA,IAAA;IAAA,IAAA;IAAA;EAExB,CAFwB,EAAA;IAA2B,IAAA,CAAA,EAmB1C,OAnB0C,CAmBlC,YAnBkC,EAAA,SAAA,CAAA;IAA3C,IAAA,CAAA,EAoBC,aApBD,CAoBe,OApBf,CAAA,SAAA,IAAA,GAqBF,wBArBE,CAqBuB,OArBvB,EAAA,MAAA,GAqBuC,YArBvC,CAAA,MAAA,CAAA,CAAA,GAAA,SAAA;IAEqB,KAAA,CAAA,EAqBnB,eArBmB,CAqBH,kBArBG,EAAA,MAAA,GAqBwB,YArBxB,CAAA,MAAA,CAAA,CAAA;EAA7B,CAAA,EAAA,GAsBM,OAtBN,CAsBc,OAtBG,CAsBK,eAtBL,EAAA,SAAA,CAAA,CAAA;EACa,OAAA,CAAA,EAAA,OAAA,GAAA,SAAA;EAAZ,KAAA,CAAA,EAuBV,iBAvBU,CAuBQ,WAvBR,CAuBoB,YAvBpB,CAAA,CAAA,MAAA,CAAA,CAAA,GAAA,SAAA;EAAlB,IAAA,CAAA,EAwBO,OAxBP,CAwBe,eAxBf,EAAA,SAAA,CAAA,GAAA,SAAA;CAFI;;AAKN;;AAGuB,KAsEX,gBAtEW,CAAA,UAAA,MAAA,CAAA,GAAA,GAAA,GAsEgC,CAtEhC,SAsE0C,KAtE1C,CAAA,KAAA,OAAA,CAAA,GAuEnB,UAvEmB,CAuER,MAvEQ,CAAA,GAAA,QACC,MAwEN,CAxEM,GAwEF,CAxEE,CAwEA,CAxEA,CAAA,SAwEW,KAxEX,GAwEmB,UAxEnB,CAwE8B,CAxE9B,CAwEgC,CAxEhC,CAAA,CAAA,GAwEsC,CAxEtC,CAwEwC,CAxExC,CAAA,EAKpB;AACA,iBA+FY,SA/FZ,CAAA,UA+FgC,MA/FhC,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,SAAA,EAgGS,CAhGT,CAAA,EAAA,QACA,MAiGU,CAjGV,GAiGc,CAjGd,CAiGgB,CAjGhB,CAAA,SAiG2B,oBAjG3B,CAAA,KAAA,EAAA,KAAA,MAAA,EAAA,KAAA,cAAA,EAAA,KAAA,WAAA,EAAA,KAAA,iBAAA,CAAA,GAwGE,eAxGF,CAAA,KAAA,EAwGyB,KAxGzB,EAwGgC,aAxGhC,EAwG+C,UAxG/C,EAwG2D,gBAxG3D,CAAA,GAyGE,CAzGF,CAyGI,CAzGJ,CAAA,SAyGe,uBAzGf,CAAA,KAAA,QAAA,EAAA,KAAA,MAAA,EAAA,KAAA,OAAA,EAAA,KAAA,QAAA,EAAA,KAAA,OAAA,EAAA,KAAA,iBAAA,CAAA,GAiHI,kBAjHJ,CAiHuB,OAjHvB,EAiHgC,KAjHhC,EAiHuC,MAjHvC,EAiH+C,OAjH/C,EAiHwD,MAjHxD,EAiHgE,gBAjHhE,CAAA,GAkHI,CAlHJ,CAkHM,CAlHN,CAAA,SAkHiB,eAlHjB,CAAA,KAAA,UAAA,CAAA,GAmHM,gBAnHN,CAmHuB,SAnHvB,CAAA,GAoHM,CApHN,CAoHQ,CApHR,CAAA,EAEe;KA4Id,SA5IM,CAAA,CAAA,CAAA,GA4IS,CA5IT,SAAA;EACc,MAAA,EAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,EAAA,OAAA,EAAA,GAAA,OAAA;CAAd,GA2IqE,CA3IrE,GAAA,KAAA;AACsB,UA4IhB,eA5IgB,CAAA,SAAA,CAAA,CAAA;EAAgB;;;;;;EAGjC,IAAA,CAAA,EAgJP,cAhJO;EAAR;;;EAEE,IAAA,CAAA,EAmJD,SAnJC,CAmJS,SAnJT,CAAA,EAAA;;AACD,iBAqJO,QArJP,CAAA,kBAqJkC,KArJlC,CAAA,CAAA,KAAA,EAsJA,SAtJA,EAAA,OAAA,CAAA,EAuJE,eAvJF,CAuJkB,SAvJlB,CAAA,CAAA,EAwJN,UAxJM,CAwJK,SAxJL,CAAA;AAAO,iBAsLA,cAAA,CAtLA;EAAA;CAAA,EAAA;EAoDJ,QAAA,EAkI6C,KAAA,CAAM,SAlInC;CAA2B,CAAA,EAkIiB,MAAA,CAAE,SAlInB"}
1
+ {"version":3,"file":"react.d.ts","names":[],"sources":["../../src/client/react.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- import "../api-DngJDcmO.js";
2
- import "../request-output-context-CdIjwmEN.js";
3
- import "../route-C5Uryylh.js";
4
- import { a as isGetHook, c as isReadableAtom, o as isMutatorHook, s as isStore } from "../client-C5LsYHEI.js";
5
- import { o as hydrateFromWindow } from "../ssr-BByDVfFD.js";
1
+ import { hydrateFromWindow } from "../util/ssr.js";
2
+ import { isReadableAtom } from "../util/nanostores.js";
3
+ import { isGetHook, isMutatorHook, isStore } from "./client.js";
6
4
  import { listenKeys } from "nanostores";
7
5
  import { useCallback, useMemo, useRef, useSyncExternalStore } from "react";
8
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":["result: any"],"sources":["../../src/client/react.ts"],"sourcesContent":["import type { FetcherValue } from \"@nanostores/query\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { listenKeys, type ReadableAtom, type Store, type StoreValue } from \"nanostores\";\nimport { useCallback, useMemo, useRef, useSyncExternalStore, type DependencyList } from \"react\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport type { FragnoClientMutatorData, FragnoClientHookData } from \"./client\";\nimport { isGetHook, isMutatorHook, isStore, type FragnoStoreData } from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport { hydrateFromWindow } from \"../util/ssr\";\nimport type { InferOr } from \"../util/types-util\";\nimport type {\n ExtractPathParamsOrWiden,\n HasPathParams,\n MaybeExtractPathParamsOrWiden,\n QueryParamsHint,\n} from \"../api/internal/path\";\nimport { isReadableAtom } from \"../util/nanostores\";\n\nexport type FragnoReactHook<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | ReadableAtom<string>>;\n}) => FetcherValue<\n StandardSchemaV1.InferOutput<TOutputSchema>,\n FragnoClientError<NonNullable<TErrorCode>>\n>;\n\nexport type FragnoReactMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = () => {\n mutate: ({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: HasPathParams<TPath> extends true\n ? ExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>\n : undefined;\n query?: QueryParamsHint<TQueryParameters, string | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n loading?: boolean | undefined;\n error?: FragnoClientError<NonNullable<TErrorCode>[number]> | undefined;\n data?: InferOr<TOutputSchema, undefined> | undefined;\n};\n\n// Helper function to create a React hook from a GET hook\nfunction createReactHook<\n TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoReactHook<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const pathParamValues = path ? Object.values(path) : [];\n const queryParamValues = query ? Object.values(query) : [];\n\n const deps = [...pathParamValues, ...queryParamValues];\n\n const store = useMemo(() => hook.store({ path, query }), [hook, ...deps]);\n\n if (typeof window === \"undefined\") {\n // TODO(Wilco): Handle server-side rendering. In React we have to implement onShellReady\n // and onAllReady in renderToPipable stream.\n const serverSideData = store.get();\n return serverSideData;\n }\n\n return useStore(store);\n };\n}\n\n// Helper function to create a React mutator from a mutator hook\nfunction createReactMutator<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInput extends StandardSchemaV1 | undefined,\n TOutput extends StandardSchemaV1 | undefined,\n TError extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>,\n): FragnoReactMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters> {\n return () => {\n const store = useMemo(() => hook.mutatorStore, [hook]);\n return useStore(store);\n };\n}\n\n/**\n * Type helper that unwraps any Store fields of the object into StoreValues\n */\nexport type FragnoReactStore<T extends object> = () => T extends Store<infer TStore>\n ? StoreValue<TStore>\n : {\n [K in keyof T]: T[K] extends Store ? StoreValue<T[K]> : T[K];\n };\n\nfunction createReactStore<const T extends object>(hook: FragnoStoreData<T>): FragnoReactStore<T> {\n if (isReadableAtom(hook.obj)) {\n return () => useStore(hook.obj as Store);\n }\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n\n for (const key in hook.obj) {\n if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) {\n continue;\n }\n\n const value = hook.obj[key];\n if (isReadableAtom(value)) {\n result[key] = useStore(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n };\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoReactHook<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n infer TMethod,\n infer TPath,\n infer TInput,\n infer TOutput,\n infer TError,\n infer TQueryParameters\n >\n ? FragnoReactMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>\n : T[K] extends FragnoStoreData<infer TStoreObj>\n ? FragnoReactStore<TStoreObj>\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any; // We need one any cast here due to TypeScript's limitations with mapped types\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createReactHook(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createReactMutator(hook);\n } else if (isStore(hook)) {\n result[key] = createReactStore(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n\ntype StoreKeys<T> = T extends { setKey: (k: infer K, v: unknown) => unknown } ? K : never;\n\nexport interface UseStoreOptions<SomeStore> {\n /**\n * @default\n * ```ts\n * [store, options.keys]\n * ```\n */\n deps?: DependencyList;\n\n /**\n * Will re-render components only on specific key changes.\n */\n keys?: StoreKeys<SomeStore>[];\n}\n\nexport function useStore<SomeStore extends Store>(\n store: SomeStore,\n options: UseStoreOptions<SomeStore> = {},\n): StoreValue<SomeStore> {\n const snapshotRef = useRef<StoreValue<SomeStore>>(store.get());\n\n const { keys, deps = [store, keys] } = options;\n\n const subscribe = useCallback((onChange: () => void) => {\n const emitChange = (value: StoreValue<SomeStore>) => {\n if (snapshotRef.current === value) {\n return;\n }\n snapshotRef.current = value;\n onChange();\n };\n\n emitChange(store.value);\n if (keys?.length) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return listenKeys(store as any, keys, emitChange);\n }\n return store.listen(emitChange);\n }, deps);\n\n const get = () => snapshotRef.current as StoreValue<SomeStore>;\n\n return useSyncExternalStore(subscribe, get, () => {\n // Server-side rendering\n return get();\n });\n}\n\nexport function FragnoHydrator({ children }: { children: React.ReactNode }) {\n // Ensure initial data is transferred from window before any hooks run\n // Running in useMemo makes this happen during render, ahead of effects\n useMemo(() => {\n hydrateFromWindow();\n }, []);\n return children;\n}\n"],"mappings":";;;;;;;;;AAyDA,SAAS,gBAOP,MAC8E;AAC9E,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAM,kBAAkB,OAAO,OAAO,OAAO,KAAK,GAAG,EAAE;EACvD,MAAM,mBAAmB,QAAQ,OAAO,OAAO,MAAM,GAAG,EAAE;EAI1D,MAAM,QAAQ,cAAc,KAAK,MAAM;GAAE;GAAM;GAAO,CAAC,EAAE,CAAC,MAAM,GAFnD,CAAC,GAAG,iBAAiB,GAAG,iBAAiB,CAEkB,CAAC;AAEzE,MAAI,OAAO,WAAW,YAIpB,QADuB,MAAM,KAAK;AAIpC,SAAO,SAAS,MAAM;;;AAK1B,SAAS,mBAQP,MAC+E;AAC/E,cAAa;AAEX,SAAO,SADO,cAAc,KAAK,cAAc,CAAC,KAAK,CAAC,CAChC;;;AAa1B,SAAS,iBAAyC,MAA+C;AAC/F,KAAI,eAAe,KAAK,IAAI,CAC1B,cAAa,SAAS,KAAK,IAAa;AAG1C,cAAa;EAEX,MAAMA,SAAc,EAAE;AAEtB,OAAK,MAAM,OAAO,KAAK,KAAK;AAC1B,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,IAAI,CACtD;GAGF,MAAM,QAAQ,KAAK,IAAI;AACvB,OAAI,eAAe,MAAM,CACvB,QAAO,OAAO,SAAS,MAAM;OAE7B,QAAO,OAAO;;AAIlB,SAAO;;;AAIX,SAAgB,UACd,WAsBA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,gBAAgB,KAAK;WAC1B,cAAc,KAAK,CAC5B,QAAO,OAAO,mBAAmB,KAAK;WAC7B,QAAQ,KAAK,CACtB,QAAO,OAAO,iBAAiB,KAAK;MAGpC,QAAO,OAAO;;AAIlB,QAAO;;AAoBT,SAAgB,SACd,OACA,UAAsC,EAAE,EACjB;CACvB,MAAM,cAAc,OAA8B,MAAM,KAAK,CAAC;CAE9D,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,KAAK,KAAK;CAEvC,MAAM,YAAY,aAAa,aAAyB;EACtD,MAAM,cAAc,UAAiC;AACnD,OAAI,YAAY,YAAY,MAC1B;AAEF,eAAY,UAAU;AACtB,aAAU;;AAGZ,aAAW,MAAM,MAAM;AACvB,MAAI,MAAM,OAER,QAAO,WAAW,OAAc,MAAM,WAAW;AAEnD,SAAO,MAAM,OAAO,WAAW;IAC9B,KAAK;CAER,MAAM,YAAY,YAAY;AAE9B,QAAO,qBAAqB,WAAW,WAAW;AAEhD,SAAO,KAAK;GACZ;;AAGJ,SAAgB,eAAe,EAAE,YAA2C;AAG1E,eAAc;AACZ,qBAAmB;IAClB,EAAE,CAAC;AACN,QAAO"}
1
+ {"version":3,"file":"react.js","names":["result: any"],"sources":["../../src/client/react.ts"],"sourcesContent":["import type { FetcherValue } from \"@nanostores/query\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { listenKeys, type ReadableAtom, type Store, type StoreValue } from \"nanostores\";\nimport { useCallback, useMemo, useRef, useSyncExternalStore, type DependencyList } from \"react\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport type { FragnoClientMutatorData, FragnoClientHookData } from \"./client\";\nimport { isGetHook, isMutatorHook, isStore, type FragnoStoreData } from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport { hydrateFromWindow } from \"../util/ssr\";\nimport type { InferOr } from \"../util/types-util\";\nimport type {\n ExtractPathParamsOrWiden,\n HasPathParams,\n MaybeExtractPathParamsOrWiden,\n QueryParamsHint,\n} from \"../api/internal/path\";\nimport { isReadableAtom } from \"../util/nanostores\";\n\nexport type FragnoReactHook<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | ReadableAtom<string>>;\n}) => FetcherValue<\n StandardSchemaV1.InferOutput<TOutputSchema>,\n FragnoClientError<NonNullable<TErrorCode>>\n>;\n\nexport type FragnoReactMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = () => {\n mutate: ({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: HasPathParams<TPath> extends true\n ? ExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>\n : undefined;\n query?: QueryParamsHint<TQueryParameters, string | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n loading?: boolean | undefined;\n error?: FragnoClientError<NonNullable<TErrorCode>[number]> | undefined;\n data?: InferOr<TOutputSchema, undefined> | undefined;\n};\n\n// Helper function to create a React hook from a GET hook\nfunction createReactHook<\n TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoReactHook<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const pathParamValues = path ? Object.values(path) : [];\n const queryParamValues = query ? Object.values(query) : [];\n\n const deps = [...pathParamValues, ...queryParamValues];\n\n const store = useMemo(() => hook.store({ path, query }), [hook, ...deps]);\n\n if (typeof window === \"undefined\") {\n // TODO(Wilco): Handle server-side rendering. In React we have to implement onShellReady\n // and onAllReady in renderToPipable stream.\n const serverSideData = store.get();\n return serverSideData;\n }\n\n return useStore(store);\n };\n}\n\n// Helper function to create a React mutator from a mutator hook\nfunction createReactMutator<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInput extends StandardSchemaV1 | undefined,\n TOutput extends StandardSchemaV1 | undefined,\n TError extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>,\n): FragnoReactMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters> {\n return () => {\n const store = useMemo(() => hook.mutatorStore, [hook]);\n return useStore(store);\n };\n}\n\n/**\n * Type helper that unwraps any Store fields of the object into StoreValues\n */\nexport type FragnoReactStore<T extends object> = () => T extends Store<infer TStore>\n ? StoreValue<TStore>\n : {\n [K in keyof T]: T[K] extends Store ? StoreValue<T[K]> : T[K];\n };\n\nfunction createReactStore<const T extends object>(hook: FragnoStoreData<T>): FragnoReactStore<T> {\n if (isReadableAtom(hook.obj)) {\n return () => useStore(hook.obj as Store);\n }\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n\n for (const key in hook.obj) {\n if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) {\n continue;\n }\n\n const value = hook.obj[key];\n if (isReadableAtom(value)) {\n result[key] = useStore(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n };\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoReactHook<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n infer TMethod,\n infer TPath,\n infer TInput,\n infer TOutput,\n infer TError,\n infer TQueryParameters\n >\n ? FragnoReactMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>\n : T[K] extends FragnoStoreData<infer TStoreObj>\n ? FragnoReactStore<TStoreObj>\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any; // We need one any cast here due to TypeScript's limitations with mapped types\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createReactHook(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createReactMutator(hook);\n } else if (isStore(hook)) {\n result[key] = createReactStore(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n\ntype StoreKeys<T> = T extends { setKey: (k: infer K, v: unknown) => unknown } ? K : never;\n\nexport interface UseStoreOptions<SomeStore> {\n /**\n * @default\n * ```ts\n * [store, options.keys]\n * ```\n */\n deps?: DependencyList;\n\n /**\n * Will re-render components only on specific key changes.\n */\n keys?: StoreKeys<SomeStore>[];\n}\n\nexport function useStore<SomeStore extends Store>(\n store: SomeStore,\n options: UseStoreOptions<SomeStore> = {},\n): StoreValue<SomeStore> {\n const snapshotRef = useRef<StoreValue<SomeStore>>(store.get());\n\n const { keys, deps = [store, keys] } = options;\n\n const subscribe = useCallback((onChange: () => void) => {\n const emitChange = (value: StoreValue<SomeStore>) => {\n if (snapshotRef.current === value) {\n return;\n }\n snapshotRef.current = value;\n onChange();\n };\n\n emitChange(store.value);\n if (keys?.length) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return listenKeys(store as any, keys, emitChange);\n }\n return store.listen(emitChange);\n }, deps);\n\n const get = () => snapshotRef.current as StoreValue<SomeStore>;\n\n return useSyncExternalStore(subscribe, get, () => {\n // Server-side rendering\n return get();\n });\n}\n\nexport function FragnoHydrator({ children }: { children: React.ReactNode }) {\n // Ensure initial data is transferred from window before any hooks run\n // Running in useMemo makes this happen during render, ahead of effects\n useMemo(() => {\n hydrateFromWindow();\n }, []);\n return children;\n}\n"],"mappings":";;;;;;;AAyDA,SAAS,gBAOP,MAC8E;AAC9E,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAM,kBAAkB,OAAO,OAAO,OAAO,KAAK,GAAG,EAAE;EACvD,MAAM,mBAAmB,QAAQ,OAAO,OAAO,MAAM,GAAG,EAAE;EAI1D,MAAM,QAAQ,cAAc,KAAK,MAAM;GAAE;GAAM;GAAO,CAAC,EAAE,CAAC,MAAM,GAFnD,CAAC,GAAG,iBAAiB,GAAG,iBAAiB,CAEkB,CAAC;AAEzE,MAAI,OAAO,WAAW,YAIpB,QADuB,MAAM,KAAK;AAIpC,SAAO,SAAS,MAAM;;;AAK1B,SAAS,mBAQP,MAC+E;AAC/E,cAAa;AAEX,SAAO,SADO,cAAc,KAAK,cAAc,CAAC,KAAK,CAAC,CAChC;;;AAa1B,SAAS,iBAAyC,MAA+C;AAC/F,KAAI,eAAe,KAAK,IAAI,CAC1B,cAAa,SAAS,KAAK,IAAa;AAG1C,cAAa;EAEX,MAAMA,SAAc,EAAE;AAEtB,OAAK,MAAM,OAAO,KAAK,KAAK;AAC1B,OAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,IAAI,CACtD;GAGF,MAAM,QAAQ,KAAK,IAAI;AACvB,OAAI,eAAe,MAAM,CACvB,QAAO,OAAO,SAAS,MAAM;OAE7B,QAAO,OAAO;;AAIlB,SAAO;;;AAIX,SAAgB,UACd,WAsBA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,gBAAgB,KAAK;WAC1B,cAAc,KAAK,CAC5B,QAAO,OAAO,mBAAmB,KAAK;WAC7B,QAAQ,KAAK,CACtB,QAAO,OAAO,iBAAiB,KAAK;MAGpC,QAAO,OAAO;;AAIlB,QAAO;;AAoBT,SAAgB,SACd,OACA,UAAsC,EAAE,EACjB;CACvB,MAAM,cAAc,OAA8B,MAAM,KAAK,CAAC;CAE9D,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,KAAK,KAAK;CAEvC,MAAM,YAAY,aAAa,aAAyB;EACtD,MAAM,cAAc,UAAiC;AACnD,OAAI,YAAY,YAAY,MAC1B;AAEF,eAAY,UAAU;AACtB,aAAU;;AAGZ,aAAW,MAAM,MAAM;AACvB,MAAI,MAAM,OAER,QAAO,WAAW,OAAc,MAAM,WAAW;AAEnD,SAAO,MAAM,OAAO,WAAW;IAC9B,KAAK;CAER,MAAM,YAAY,YAAY;AAE9B,QAAO,qBAAqB,WAAW,WAAW;AAEhD,SAAO,KAAK;GACZ;;AAGJ,SAAgB,eAAe,EAAE,YAA2C;AAG1E,eAAc;AACZ,qBAAmB;IAClB,EAAE,CAAC;AACN,QAAO"}
@@ -1,6 +1,8 @@
1
- import { _ as QueryParamsHint, g as MaybeExtractPathParamsOrWiden, r as NonGetHTTPMethod, u as InferOr } from "../api-BWN97TOr.js";
2
- import "../route-Bl9Zr1Yv.js";
3
- import { C as FragnoClientMutatorData, I as FragnoClientError, S as FragnoClientHookData, w as FragnoStoreData } from "../fragment-builder-MGr68GNb.js";
1
+ import { MaybeExtractPathParamsOrWiden, QueryParamsHint } from "../api/internal/path.js";
2
+ import { InferOr } from "../util/types-util.js";
3
+ import { NonGetHTTPMethod } from "../api/api.js";
4
+ import { FragnoClientError } from "./client-error.js";
5
+ import { FragnoClientHookData, FragnoClientMutatorData, FragnoStoreData } from "./client.js";
4
6
  import { ReadableAtom, Store, StoreValue } from "nanostores";
5
7
  import { Accessor } from "solid-js";
6
8
  import { StandardSchemaV1 } from "@standard-schema/spec";
@@ -1 +1 @@
1
- {"version":3,"file":"solid.d.ts","names":[],"sources":["../../src/client/solid.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"solid.d.ts","names":[],"sources":["../../src/client/solid.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,8 +1,5 @@
1
- import "../api-DngJDcmO.js";
2
- import "../request-output-context-CdIjwmEN.js";
3
- import "../route-C5Uryylh.js";
4
- import { a as isGetHook, c as isReadableAtom, o as isMutatorHook, s as isStore } from "../client-C5LsYHEI.js";
5
- import "../ssr-BByDVfFD.js";
1
+ import { isReadableAtom } from "../util/nanostores.js";
2
+ import { isGetHook, isMutatorHook, isStore } from "./client.js";
6
3
  import { atom } from "nanostores";
7
4
  import { useStore } from "@nanostores/solid";
8
5
  import { createEffect } from "solid-js";
@@ -1 +1 @@
1
- {"version":3,"file":"solid.js","names":["pathParams: Record<string, string | ReadableAtom<string>>","queryParams: Record<string, string | ReadableAtom<string>>","result: any"],"sources":["../../src/client/solid.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { atom, type ReadableAtom, type Store, type StoreValue } from \"nanostores\";\nimport { useStore } from \"@nanostores/solid\";\nimport type { Accessor } from \"solid-js\";\nimport { createEffect } from \"solid-js\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport {\n isGetHook,\n isMutatorHook,\n isStore,\n type FragnoClientHookData,\n type FragnoClientMutatorData,\n type FragnoStoreData,\n} from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport type { InferOr } from \"../util/types-util\";\nimport type { MaybeExtractPathParamsOrWiden, QueryParamsHint } from \"../api/internal/path\";\nimport { isReadableAtom } from \"../util/nanostores\";\n\nexport type FragnoSolidHook<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n}) => {\n data: Accessor<InferOr<TOutputSchema, undefined>>;\n loading: Accessor<boolean>;\n error: Accessor<FragnoClientError<TErrorCode[number]> | undefined>;\n};\n\nexport type FragnoSolidMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = () => {\n mutate: (args: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n loading: Accessor<boolean | undefined>;\n error: Accessor<FragnoClientError<TErrorCode[number]> | undefined>;\n data: Accessor<InferOr<TOutputSchema, undefined>>;\n};\n\n/**\n * Type guard to check if a value is a SolidJS Accessor.\n *\n * @private\n */\nexport function isAccessor(value: unknown): value is Accessor<string> {\n return typeof value === \"function\";\n}\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 */\nexport function accessorToAtom<T>(accessor: Accessor<T>): ReadableAtom<T> {\n const a = atom(accessor());\n\n createEffect(() => {\n a.set(accessor());\n });\n\n return a;\n}\n\n// Helper function to create a SolidJS signal from a GET hook\n// We want 1 store per hook, so on updates to params, we need to update the store instead of creating a new one.\n// Nanostores only works with atoms (or strings), so we need to convert SolidJS accessors to atoms.\nfunction createSolidHook<\n TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoSolidHook<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const pathParams: Record<string, string | ReadableAtom<string>> = {};\n const queryParams: Record<string, string | ReadableAtom<string>> = {};\n\n for (const [key, value] of Object.entries(path ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n pathParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n }\n\n for (const [key, value] of Object.entries(query ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n queryParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n }\n\n const store = hook.store({\n path: pathParams as MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>,\n query: queryParams,\n });\n\n const storeValue = useStore(store);\n\n return {\n data: () => storeValue().data as InferOr<TOutputSchema, undefined>,\n loading: () => storeValue().loading,\n error: () => storeValue().error,\n };\n };\n}\n\n// Helper function to create a SolidJS mutator from a mutator hook\nfunction createSolidMutator<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n): FragnoSolidMutator<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters> {\n return () => {\n const store = useStore(hook.mutatorStore);\n\n // Create a wrapped mutate function that handles SolidJS accessors\n const mutate = async (args: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n }) => {\n const { body, path, query } = args;\n\n const pathParams: Record<string, string | ReadableAtom<string>> = {};\n const queryParams: Record<string, string | ReadableAtom<string>> = {};\n\n for (const [key, value] of Object.entries(path ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n // For mutations, we read the current value of the accessor\n pathParams[key] = isAccessor(v) ? v() : v;\n }\n\n for (const [key, value] of Object.entries(query ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n // For mutations, we read the current value of the accessor\n queryParams[key] = isAccessor(v) ? v() : v;\n }\n\n // Call the store's mutate function with normalized params\n return hook.mutatorStore.mutate({\n body,\n path: pathParams as MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>,\n query: queryParams,\n });\n };\n\n return {\n mutate,\n data: () => store().data as InferOr<TOutputSchema, undefined>,\n loading: () => store().loading,\n error: () => store().error,\n };\n };\n}\n\nexport type FragnoSolidStore<T extends object> = T extends Store\n ? Accessor<StoreValue<T>>\n : () => {\n [K in keyof T]: T[K] extends Store ? Accessor<StoreValue<T[K]>> : T[K];\n };\n\nfunction createSolidStore<const T extends object>(\n hook: FragnoStoreData<T>,\n): Accessor<StoreValue<T>> | (() => Accessor<StoreValue<T>>) {\n // If the store object itself is a single atom, wrap it with useStore\n if (isReadableAtom(hook.obj)) {\n return useStore(hook.obj);\n }\n\n // For objects containing atoms, wrap each atom property with useStore\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n\n for (const key in hook.obj) {\n if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) {\n continue;\n }\n\n const value = hook.obj[key];\n if (isReadableAtom(value)) {\n result[key] = useStore(value);\n } else {\n result[key] = value;\n }\n }\n\n return () => result;\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoSolidHook<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n infer TMethod,\n infer TPath,\n infer TInput,\n infer TOutput,\n infer TError,\n infer TQueryParameters\n >\n ? FragnoSolidMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>\n : T[K] extends FragnoStoreData<infer TStoreObj>\n ? FragnoSolidStore<TStoreObj>\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any;\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createSolidHook(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createSolidMutator(hook);\n } else if (isStore(hook)) {\n result[key] = createSolidStore(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyDA,SAAgB,WAAW,OAA2C;AACpE,QAAO,OAAO,UAAU;;;;;;;;;AAU1B,SAAgB,eAAkB,UAAwC;CACxE,MAAM,IAAI,KAAK,UAAU,CAAC;AAE1B,oBAAmB;AACjB,IAAE,IAAI,UAAU,CAAC;GACjB;AAEF,QAAO;;AAMT,SAAS,gBAOP,MAC8E;AAC9E,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAMA,aAA4D,EAAE;EACpE,MAAMC,cAA6D,EAAE;AAErE,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE,CAAC,EAAE;GACrD,MAAM,IAAI;AACV,cAAW,OAAO,WAAW,EAAE,GAAG,eAAe,EAAE,GAAG;;AAGxD,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;GACtD,MAAM,IAAI;AACV,eAAY,OAAO,WAAW,EAAE,GAAG,eAAe,EAAE,GAAG;;EAQzD,MAAM,aAAa,SALL,KAAK,MAAM;GACvB,MAAM;GACN,OAAO;GACR,CAAC,CAEgC;AAElC,SAAO;GACL,YAAY,YAAY,CAAC;GACzB,eAAe,YAAY,CAAC;GAC5B,aAAa,YAAY,CAAC;GAC3B;;;AAKL,SAAS,mBAQP,MAQ+F;AAC/F,cAAa;EACX,MAAM,QAAQ,SAAS,KAAK,aAAa;EAGzC,MAAM,SAAS,OAAO,SAIhB;GACJ,MAAM,EAAE,MAAM,MAAM,UAAU;GAE9B,MAAMD,aAA4D,EAAE;GACpE,MAAMC,cAA6D,EAAE;AAErE,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE,CAAC,EAAE;IACrD,MAAM,IAAI;AAEV,eAAW,OAAO,WAAW,EAAE,GAAG,GAAG,GAAG;;AAG1C,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;IACtD,MAAM,IAAI;AAEV,gBAAY,OAAO,WAAW,EAAE,GAAG,GAAG,GAAG;;AAI3C,UAAO,KAAK,aAAa,OAAO;IAC9B;IACA,MAAM;IACN,OAAO;IACR,CAAC;;AAGJ,SAAO;GACL;GACA,YAAY,OAAO,CAAC;GACpB,eAAe,OAAO,CAAC;GACvB,aAAa,OAAO,CAAC;GACtB;;;AAUL,SAAS,iBACP,MAC2D;AAE3D,KAAI,eAAe,KAAK,IAAI,CAC1B,QAAO,SAAS,KAAK,IAAI;CAK3B,MAAMC,SAAc,EAAE;AAEtB,MAAK,MAAM,OAAO,KAAK,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,IAAI,CACtD;EAGF,MAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,eAAe,MAAM,CACvB,QAAO,OAAO,SAAS,MAAM;MAE7B,QAAO,OAAO;;AAIlB,cAAa;;AAGf,SAAgB,UACd,WAsBA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,gBAAgB,KAAK;WAC1B,cAAc,KAAK,CAC5B,QAAO,OAAO,mBAAmB,KAAK;WAC7B,QAAQ,KAAK,CACtB,QAAO,OAAO,iBAAiB,KAAK;MAGpC,QAAO,OAAO;;AAIlB,QAAO"}
1
+ {"version":3,"file":"solid.js","names":["pathParams: Record<string, string | ReadableAtom<string>>","queryParams: Record<string, string | ReadableAtom<string>>","result: any"],"sources":["../../src/client/solid.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { atom, type ReadableAtom, type Store, type StoreValue } from \"nanostores\";\nimport { useStore } from \"@nanostores/solid\";\nimport type { Accessor } from \"solid-js\";\nimport { createEffect } from \"solid-js\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport {\n isGetHook,\n isMutatorHook,\n isStore,\n type FragnoClientHookData,\n type FragnoClientMutatorData,\n type FragnoStoreData,\n} from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport type { InferOr } from \"../util/types-util\";\nimport type { MaybeExtractPathParamsOrWiden, QueryParamsHint } from \"../api/internal/path\";\nimport { isReadableAtom } from \"../util/nanostores\";\n\nexport type FragnoSolidHook<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n}) => {\n data: Accessor<InferOr<TOutputSchema, undefined>>;\n loading: Accessor<boolean>;\n error: Accessor<FragnoClientError<TErrorCode[number]> | undefined>;\n};\n\nexport type FragnoSolidMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = () => {\n mutate: (args: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n loading: Accessor<boolean | undefined>;\n error: Accessor<FragnoClientError<TErrorCode[number]> | undefined>;\n data: Accessor<InferOr<TOutputSchema, undefined>>;\n};\n\n/**\n * Type guard to check if a value is a SolidJS Accessor.\n *\n * @private\n */\nexport function isAccessor(value: unknown): value is Accessor<string> {\n return typeof value === \"function\";\n}\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 */\nexport function accessorToAtom<T>(accessor: Accessor<T>): ReadableAtom<T> {\n const a = atom(accessor());\n\n createEffect(() => {\n a.set(accessor());\n });\n\n return a;\n}\n\n// Helper function to create a SolidJS signal from a GET hook\n// We want 1 store per hook, so on updates to params, we need to update the store instead of creating a new one.\n// Nanostores only works with atoms (or strings), so we need to convert SolidJS accessors to atoms.\nfunction createSolidHook<\n TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoSolidHook<TMethod, TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const pathParams: Record<string, string | ReadableAtom<string>> = {};\n const queryParams: Record<string, string | ReadableAtom<string>> = {};\n\n for (const [key, value] of Object.entries(path ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n pathParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n }\n\n for (const [key, value] of Object.entries(query ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n queryParams[key] = isAccessor(v) ? accessorToAtom(v) : v;\n }\n\n const store = hook.store({\n path: pathParams as MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>,\n query: queryParams,\n });\n\n const storeValue = useStore(store);\n\n return {\n data: () => storeValue().data as InferOr<TOutputSchema, undefined>,\n loading: () => storeValue().loading,\n error: () => storeValue().error,\n };\n };\n}\n\n// Helper function to create a SolidJS mutator from a mutator hook\nfunction createSolidMutator<\n TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<\n TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n): FragnoSolidMutator<TMethod, TPath, TInputSchema, TOutputSchema, TErrorCode, TQueryParameters> {\n return () => {\n const store = useStore(hook.mutatorStore);\n\n // Create a wrapped mutate function that handles SolidJS accessors\n const mutate = async (args: {\n body?: InferOr<TInputSchema, undefined>;\n path?: MaybeExtractPathParamsOrWiden<TPath, string | Accessor<string> | ReadableAtom<string>>;\n query?: QueryParamsHint<TQueryParameters, string | Accessor<string> | ReadableAtom<string>>;\n }) => {\n const { body, path, query } = args;\n\n const pathParams: Record<string, string | ReadableAtom<string>> = {};\n const queryParams: Record<string, string | ReadableAtom<string>> = {};\n\n for (const [key, value] of Object.entries(path ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n // For mutations, we read the current value of the accessor\n pathParams[key] = isAccessor(v) ? v() : v;\n }\n\n for (const [key, value] of Object.entries(query ?? {})) {\n const v = value as string | Accessor<string> | ReadableAtom<string>;\n // For mutations, we read the current value of the accessor\n queryParams[key] = isAccessor(v) ? v() : v;\n }\n\n // Call the store's mutate function with normalized params\n return hook.mutatorStore.mutate({\n body,\n path: pathParams as MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>,\n query: queryParams,\n });\n };\n\n return {\n mutate,\n data: () => store().data as InferOr<TOutputSchema, undefined>,\n loading: () => store().loading,\n error: () => store().error,\n };\n };\n}\n\nexport type FragnoSolidStore<T extends object> = T extends Store\n ? Accessor<StoreValue<T>>\n : () => {\n [K in keyof T]: T[K] extends Store ? Accessor<StoreValue<T[K]>> : T[K];\n };\n\nfunction createSolidStore<const T extends object>(\n hook: FragnoStoreData<T>,\n): Accessor<StoreValue<T>> | (() => Accessor<StoreValue<T>>) {\n // If the store object itself is a single atom, wrap it with useStore\n if (isReadableAtom(hook.obj)) {\n return useStore(hook.obj);\n }\n\n // For objects containing atoms, wrap each atom property with useStore\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n\n for (const key in hook.obj) {\n if (!Object.prototype.hasOwnProperty.call(hook.obj, key)) {\n continue;\n }\n\n const value = hook.obj[key];\n if (isReadableAtom(value)) {\n result[key] = useStore(value);\n } else {\n result[key] = value;\n }\n }\n\n return () => result;\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoSolidHook<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n infer TMethod,\n infer TPath,\n infer TInput,\n infer TOutput,\n infer TError,\n infer TQueryParameters\n >\n ? FragnoSolidMutator<TMethod, TPath, TInput, TOutput, TError, TQueryParameters>\n : T[K] extends FragnoStoreData<infer TStoreObj>\n ? FragnoSolidStore<TStoreObj>\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any;\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createSolidHook(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createSolidMutator(hook);\n } else if (isStore(hook)) {\n result[key] = createSolidStore(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;AAyDA,SAAgB,WAAW,OAA2C;AACpE,QAAO,OAAO,UAAU;;;;;;;;;AAU1B,SAAgB,eAAkB,UAAwC;CACxE,MAAM,IAAI,KAAK,UAAU,CAAC;AAE1B,oBAAmB;AACjB,IAAE,IAAI,UAAU,CAAC;GACjB;AAEF,QAAO;;AAMT,SAAS,gBAOP,MAC8E;AAC9E,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAMA,aAA4D,EAAE;EACpE,MAAMC,cAA6D,EAAE;AAErE,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE,CAAC,EAAE;GACrD,MAAM,IAAI;AACV,cAAW,OAAO,WAAW,EAAE,GAAG,eAAe,EAAE,GAAG;;AAGxD,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;GACtD,MAAM,IAAI;AACV,eAAY,OAAO,WAAW,EAAE,GAAG,eAAe,EAAE,GAAG;;EAQzD,MAAM,aAAa,SALL,KAAK,MAAM;GACvB,MAAM;GACN,OAAO;GACR,CAAC,CAEgC;AAElC,SAAO;GACL,YAAY,YAAY,CAAC;GACzB,eAAe,YAAY,CAAC;GAC5B,aAAa,YAAY,CAAC;GAC3B;;;AAKL,SAAS,mBAQP,MAQ+F;AAC/F,cAAa;EACX,MAAM,QAAQ,SAAS,KAAK,aAAa;EAGzC,MAAM,SAAS,OAAO,SAIhB;GACJ,MAAM,EAAE,MAAM,MAAM,UAAU;GAE9B,MAAMD,aAA4D,EAAE;GACpE,MAAMC,cAA6D,EAAE;AAErE,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE,CAAC,EAAE;IACrD,MAAM,IAAI;AAEV,eAAW,OAAO,WAAW,EAAE,GAAG,GAAG,GAAG;;AAG1C,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE,CAAC,EAAE;IACtD,MAAM,IAAI;AAEV,gBAAY,OAAO,WAAW,EAAE,GAAG,GAAG,GAAG;;AAI3C,UAAO,KAAK,aAAa,OAAO;IAC9B;IACA,MAAM;IACN,OAAO;IACR,CAAC;;AAGJ,SAAO;GACL;GACA,YAAY,OAAO,CAAC;GACpB,eAAe,OAAO,CAAC;GACvB,aAAa,OAAO,CAAC;GACtB;;;AAUL,SAAS,iBACP,MAC2D;AAE3D,KAAI,eAAe,KAAK,IAAI,CAC1B,QAAO,SAAS,KAAK,IAAI;CAK3B,MAAMC,SAAc,EAAE;AAEtB,MAAK,MAAM,OAAO,KAAK,KAAK;AAC1B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,KAAK,IAAI,CACtD;EAGF,MAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,eAAe,MAAM,CACvB,QAAO,OAAO,SAAS,MAAM;MAE7B,QAAO,OAAO;;AAIlB,cAAa;;AAGf,SAAgB,UACd,WAsBA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,gBAAgB,KAAK;WAC1B,cAAc,KAAK,CAC5B,QAAO,OAAO,mBAAmB,KAAK;WAC7B,QAAQ,KAAK,CACtB,QAAO,OAAO,iBAAiB,KAAK;MAGpC,QAAO,OAAO;;AAIlB,QAAO"}
@@ -1,6 +1,8 @@
1
- import { g as MaybeExtractPathParamsOrWiden, h as HasPathParams, m as ExtractPathParamsOrWiden, r as NonGetHTTPMethod, u as InferOr } from "../api-BWN97TOr.js";
2
- import "../route-Bl9Zr1Yv.js";
3
- import { C as FragnoClientMutatorData, I as FragnoClientError, S as FragnoClientHookData } from "../fragment-builder-MGr68GNb.js";
1
+ import { ExtractPathParamsOrWiden, HasPathParams, MaybeExtractPathParamsOrWiden } from "../api/internal/path.js";
2
+ import { InferOr } from "../util/types-util.js";
3
+ import { NonGetHTTPMethod } from "../api/api.js";
4
+ import { FragnoClientError } from "./client-error.js";
5
+ import { FragnoClientHookData, FragnoClientMutatorData } from "./client.js";
4
6
  import { ReadableAtom } from "nanostores";
5
7
  import { StandardSchemaV1 } from "@standard-schema/spec";
6
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"vanilla.d.ts","names":[],"sources":["../../src/client/vanilla.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"vanilla.d.ts","names":[],"sources":["../../src/client/vanilla.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,47 +1,6 @@
1
- import "../api-DngJDcmO.js";
2
- import "../request-output-context-CdIjwmEN.js";
3
- import "../route-C5Uryylh.js";
4
- import { a as isGetHook, o as isMutatorHook } from "../client-C5LsYHEI.js";
5
- import "../ssr-BByDVfFD.js";
1
+ import { isGetHook, isMutatorHook } from "./client.js";
2
+ import { createAsyncIteratorFromCallback } from "../util/async.js";
6
3
 
7
- //#region src/util/async.ts
8
- /**
9
- * Creates an async iterator from a subscribe function that follows the observable pattern.
10
- *
11
- * @template T The type of values produced by the store.
12
- * @param subscribe A function that subscribes to store updates. It receives a callback to be
13
- * called on each update, and returns an unsubscribe function.
14
- * @returns An async generator that yields store values as they are produced.
15
- */
16
- function createAsyncIteratorFromCallback(subscribe) {
17
- const queue = [];
18
- let unsubscribe = null;
19
- let resolveNext = null;
20
- const unsubscribeFunc = subscribe((value) => {
21
- if (resolveNext) {
22
- resolveNext({
23
- value,
24
- done: false
25
- });
26
- resolveNext = null;
27
- } else queue.push(value);
28
- });
29
- if (typeof unsubscribeFunc === "function") unsubscribe = unsubscribeFunc;
30
- return (async function* () {
31
- try {
32
- while (true) if (queue.length > 0) yield queue.shift();
33
- else yield await new Promise((resolve) => {
34
- resolveNext = (result) => {
35
- if (!result.done) resolve(result.value);
36
- };
37
- });
38
- } finally {
39
- if (unsubscribe) unsubscribe();
40
- }
41
- })();
42
- }
43
-
44
- //#endregion
45
4
  //#region src/client/vanilla.ts
46
5
  function createVanillaListeners(hook) {
47
6
  return ({ path, query } = {}) => {
@@ -1 +1 @@
1
- {"version":3,"file":"vanilla.js","names":["queue: T[]","unsubscribe: UnsubscribeFn | null","resolveNext: ((value: IteratorResult<T>) => void) | null"],"sources":["../../src/util/async.ts","../../src/client/vanilla.ts"],"sourcesContent":["type SubscribeFn<T> = (callback: (value: T) => void) => UnsubscribeFn | void;\ntype UnsubscribeFn = () => void;\n\n/**\n * Creates an async iterator from a subscribe function that follows the observable pattern.\n *\n * @template T The type of values produced by the store.\n * @param subscribe A function that subscribes to store updates. It receives a callback to be\n * called on each update, and returns an unsubscribe function.\n * @returns An async generator that yields store values as they are produced.\n */\nexport function createAsyncIteratorFromCallback<T>(\n subscribe: SubscribeFn<T>,\n): AsyncGenerator<T, void, unknown> {\n const queue: T[] = [];\n let unsubscribe: UnsubscribeFn | null = null;\n let resolveNext: ((value: IteratorResult<T>) => void) | null = null;\n\n const unsubscribeFunc = subscribe((value) => {\n if (resolveNext) {\n // If there's a pending promise, resolve it immediately\n resolveNext({ value, done: false });\n resolveNext = null;\n } else {\n // Otherwise, queue the value\n queue.push(value);\n }\n });\n\n // Store unsubscribe function if one was returned\n if (typeof unsubscribeFunc === \"function\") {\n unsubscribe = unsubscribeFunc;\n }\n\n return (async function* () {\n try {\n while (true) {\n if (queue.length > 0) {\n // Yield queued values\n yield queue.shift()!;\n } else {\n // Wait for the next value\n yield await new Promise<T>((resolve) => {\n resolveNext = (result) => {\n if (!result.done) {\n resolve(result.value);\n }\n };\n });\n }\n }\n } finally {\n // Clean up subscription on iterator termination\n if (unsubscribe) {\n unsubscribe();\n }\n }\n })();\n}\n\n/**\n * Waits for an async iterator to yield a value that meets a condition.\n *\n * @template T The type of values produced by the iterator.\n * @param iterable The async iterable to wait for.\n * @param condition A function that checks if a value meets the condition.\n * @param options Optional configuration options.\n * @returns A promise that resolves to the first value that meets the condition.\n */\nexport async function waitForAsyncIterator<T>(\n iterable: AsyncIterable<T>,\n condition: (value: T) => boolean,\n options: { timeout?: number } = {},\n): Promise<T> {\n const { timeout = 1000 } = options;\n\n // Create a timeout promise that rejects after the specified time\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`waitForAsyncIterator: Timeout after ${timeout}ms`));\n }, timeout);\n });\n\n // Create a promise that resolves when the condition is met\n const iteratorPromise = (async () => {\n for await (const value of iterable) {\n if (condition(value)) {\n return value;\n }\n }\n throw new Error(\"waitForAsyncIterator: Iterator completed without meeting condition\");\n })();\n\n // Race between the timeout and the iterator\n return Promise.race([iteratorPromise, timeoutPromise]);\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ReadableAtom } from \"nanostores\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport {\n isGetHook,\n isMutatorHook,\n type FragnoClientMutatorData,\n type FragnoClientHookData,\n} from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport { createAsyncIteratorFromCallback } from \"../util/async\";\nimport type { InferOr } from \"../util/types-util\";\nimport type {\n ExtractPathParamsOrWiden,\n HasPathParams,\n MaybeExtractPathParamsOrWiden,\n} from \"../api/internal/path\";\n\nexport type StoreData<\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCodes extends string,\n> = {\n loading: boolean;\n error?: FragnoClientError<TErrorCodes>;\n data?: InferOr<TOutputSchema, undefined>;\n};\n\nexport type FragnoVanillaListeners<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | ReadableAtom<string>>;\n}) => {\n /** Called for every change in the store. */\n listen: (callback: (value: StoreData<TOutputSchema, TErrorCode[number]>) => void) => () => void;\n /** Called once initially, then called for every change in the store. */\n subscribe: (\n callback: (value: StoreData<TOutputSchema, TErrorCode[number]>) => void,\n ) => () => void;\n get: () => StoreData<TOutputSchema, TErrorCode[number]>;\n refetch: () => void;\n /**\n * Produces an item for every change in the store.\n * Note: the iterator does NOT return.\n *\n * @example\n * ```typescript\n * const store = useFragno(clientObj).store;\n * for await (const value of store[Symbol.asyncIterator]()) {\n * console.log(value);\n * }\n * ```\n */\n [Symbol.asyncIterator]: () => AsyncGenerator<\n StoreData<TOutputSchema, TErrorCode[number]>,\n void,\n unknown\n >;\n};\n\nfunction createVanillaListeners<\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoVanillaListeners<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const store = hook.store({ path, query });\n\n return {\n listen: (callback) => {\n return store.listen(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n );\n },\n subscribe: (callback) => {\n return store.subscribe(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n );\n },\n refetch: () => {\n return store.revalidate();\n },\n get: () => {\n return store.get() as StoreData<TOutputSchema, TErrorCode[number]>;\n },\n [Symbol.asyncIterator]() {\n return createAsyncIteratorFromCallback((callback) =>\n store.listen(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n ),\n );\n },\n };\n };\n}\n\nexport type FragnoVanillaMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | ReadableAtom<string>>;\n}) => {\n subscribe: (\n callback: (value: {\n loading: boolean;\n error?: FragnoClientError<TErrorCode[number]>;\n data?: InferOr<TOutputSchema, undefined>;\n }) => void,\n ) => () => void;\n get: () => StoreData<TOutputSchema, TErrorCode[number]>;\n mutate: ({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: HasPathParams<TPath> extends true\n ? ExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>\n : undefined;\n query?: Record<string, string | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n [Symbol.asyncIterator]: () => AsyncGenerator<\n StoreData<TOutputSchema, TErrorCode[number]>,\n void,\n unknown\n >;\n};\n\nfunction createVanillaMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<\n _TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n): FragnoVanillaMutator<\n _TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n> {\n return () => {\n // TODO(Wilco): it should be possible for `loading` to be undefined, before a mutation has taken place.\n const store = hook.mutatorStore;\n return {\n subscribe: (callback) => {\n return store.subscribe((value) => {\n callback({\n loading: value.loading ?? false,\n error: value.error,\n data: value.data,\n });\n });\n },\n get: () => {\n const { loading, error, data } = store.get();\n return {\n loading: loading ?? false,\n error,\n data: data,\n };\n },\n mutate: ({ body, path, query }) => {\n return store.mutate({ body, path, query });\n },\n [Symbol.asyncIterator]() {\n return createAsyncIteratorFromCallback((callback) =>\n store.listen((value) => {\n callback({\n loading: value.loading ?? false,\n error: value.error,\n data: value.data,\n });\n }),\n );\n },\n };\n };\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoVanillaListeners<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n NonGetHTTPMethod,\n infer TPath,\n infer TInputSchema,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoVanillaMutator<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any; // We need one any cast here due to TypeScript's limitations with mapped types\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createVanillaListeners(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createVanillaMutator(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAWA,SAAgB,gCACd,WACkC;CAClC,MAAMA,QAAa,EAAE;CACrB,IAAIC,cAAoC;CACxC,IAAIC,cAA2D;CAE/D,MAAM,kBAAkB,WAAW,UAAU;AAC3C,MAAI,aAAa;AAEf,eAAY;IAAE;IAAO,MAAM;IAAO,CAAC;AACnC,iBAAc;QAGd,OAAM,KAAK,MAAM;GAEnB;AAGF,KAAI,OAAO,oBAAoB,WAC7B,eAAc;AAGhB,SAAQ,mBAAmB;AACzB,MAAI;AACF,UAAO,KACL,KAAI,MAAM,SAAS,EAEjB,OAAM,MAAM,OAAO;OAGnB,OAAM,MAAM,IAAI,SAAY,YAAY;AACtC,mBAAe,WAAW;AACxB,SAAI,CAAC,OAAO,KACV,SAAQ,OAAO,MAAM;;KAGzB;YAGE;AAER,OAAI,YACF,cAAa;;KAGf;;;;;ACON,SAAS,uBAMP,MACmF;AACnF,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAM,QAAQ,KAAK,MAAM;GAAE;GAAM;GAAO,CAAC;AAEzC,SAAO;GACL,SAAS,aAAa;AACpB,WAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,WACrC,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH;;GAEH,YAAY,aAAa;AACvB,WAAO,MAAM,WAAW,EAAE,SAAS,OAAO,WACxC,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH;;GAEH,eAAe;AACb,WAAO,MAAM,YAAY;;GAE3B,WAAW;AACT,WAAO,MAAM,KAAK;;GAEpB,CAAC,OAAO,iBAAiB;AACvB,WAAO,iCAAiC,aACtC,MAAM,QAAQ,EAAE,SAAS,OAAO,WAC9B,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH,CACF;;GAEJ;;;AAyCL,SAAS,qBAQP,MAeA;AACA,cAAa;EAEX,MAAM,QAAQ,KAAK;AACnB,SAAO;GACL,YAAY,aAAa;AACvB,WAAO,MAAM,WAAW,UAAU;AAChC,cAAS;MACP,SAAS,MAAM,WAAW;MAC1B,OAAO,MAAM;MACb,MAAM,MAAM;MACb,CAAC;MACF;;GAEJ,WAAW;IACT,MAAM,EAAE,SAAS,OAAO,SAAS,MAAM,KAAK;AAC5C,WAAO;KACL,SAAS,WAAW;KACpB;KACM;KACP;;GAEH,SAAS,EAAE,MAAM,MAAM,YAAY;AACjC,WAAO,MAAM,OAAO;KAAE;KAAM;KAAM;KAAO,CAAC;;GAE5C,CAAC,OAAO,iBAAiB;AACvB,WAAO,iCAAiC,aACtC,MAAM,QAAQ,UAAU;AACtB,cAAS;MACP,SAAS,MAAM,WAAW;MAC1B,OAAO,MAAM;MACb,MAAM,MAAM;MACb,CAAC;MACF,CACH;;GAEJ;;;AAIL,SAAgB,UACd,WA2BA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,uBAAuB,KAAK;WACjC,cAAc,KAAK,CAC5B,QAAO,OAAO,qBAAqB,KAAK;MAGxC,QAAO,OAAO;;AAIlB,QAAO"}
1
+ {"version":3,"file":"vanilla.js","names":[],"sources":["../../src/client/vanilla.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ReadableAtom } from \"nanostores\";\nimport type { NonGetHTTPMethod } from \"../api/api\";\nimport {\n isGetHook,\n isMutatorHook,\n type FragnoClientMutatorData,\n type FragnoClientHookData,\n} from \"./client\";\nimport type { FragnoClientError } from \"./client-error\";\nimport { createAsyncIteratorFromCallback } from \"../util/async\";\nimport type { InferOr } from \"../util/types-util\";\nimport type {\n ExtractPathParamsOrWiden,\n HasPathParams,\n MaybeExtractPathParamsOrWiden,\n} from \"../api/internal/path\";\n\nexport type StoreData<\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCodes extends string,\n> = {\n loading: boolean;\n error?: FragnoClientError<TErrorCodes>;\n data?: InferOr<TOutputSchema, undefined>;\n};\n\nexport type FragnoVanillaListeners<\n _TMethod extends \"GET\",\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | ReadableAtom<string>>;\n}) => {\n /** Called for every change in the store. */\n listen: (callback: (value: StoreData<TOutputSchema, TErrorCode[number]>) => void) => () => void;\n /** Called once initially, then called for every change in the store. */\n subscribe: (\n callback: (value: StoreData<TOutputSchema, TErrorCode[number]>) => void,\n ) => () => void;\n get: () => StoreData<TOutputSchema, TErrorCode[number]>;\n refetch: () => void;\n /**\n * Produces an item for every change in the store.\n * Note: the iterator does NOT return.\n *\n * @example\n * ```typescript\n * const store = useFragno(clientObj).store;\n * for await (const value of store[Symbol.asyncIterator]()) {\n * console.log(value);\n * }\n * ```\n */\n [Symbol.asyncIterator]: () => AsyncGenerator<\n StoreData<TOutputSchema, TErrorCode[number]>,\n void,\n unknown\n >;\n};\n\nfunction createVanillaListeners<\n TPath extends string,\n TOutputSchema extends StandardSchemaV1,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientHookData<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>,\n): FragnoVanillaListeners<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters> {\n return ({ path, query } = {}) => {\n const store = hook.store({ path, query });\n\n return {\n listen: (callback) => {\n return store.listen(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n );\n },\n subscribe: (callback) => {\n return store.subscribe(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n );\n },\n refetch: () => {\n return store.revalidate();\n },\n get: () => {\n return store.get() as StoreData<TOutputSchema, TErrorCode[number]>;\n },\n [Symbol.asyncIterator]() {\n return createAsyncIteratorFromCallback((callback) =>\n store.listen(({ loading, error, data }) =>\n callback({\n loading,\n error,\n data: data as InferOr<TOutputSchema, undefined>,\n }),\n ),\n );\n },\n };\n };\n}\n\nexport type FragnoVanillaMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n> = (args?: {\n path?: MaybeExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>;\n query?: Record<TQueryParameters, string | ReadableAtom<string>>;\n}) => {\n subscribe: (\n callback: (value: {\n loading: boolean;\n error?: FragnoClientError<TErrorCode[number]>;\n data?: InferOr<TOutputSchema, undefined>;\n }) => void,\n ) => () => void;\n get: () => StoreData<TOutputSchema, TErrorCode[number]>;\n mutate: ({\n body,\n path,\n query,\n }: {\n body?: InferOr<TInputSchema, undefined>;\n path?: HasPathParams<TPath> extends true\n ? ExtractPathParamsOrWiden<TPath, string | ReadableAtom<string>>\n : undefined;\n query?: Record<string, string | ReadableAtom<string>>;\n }) => Promise<InferOr<TOutputSchema, undefined>>;\n [Symbol.asyncIterator]: () => AsyncGenerator<\n StoreData<TOutputSchema, TErrorCode[number]>,\n void,\n unknown\n >;\n};\n\nfunction createVanillaMutator<\n _TMethod extends NonGetHTTPMethod,\n TPath extends string,\n TInputSchema extends StandardSchemaV1 | undefined,\n TOutputSchema extends StandardSchemaV1 | undefined,\n TErrorCode extends string,\n TQueryParameters extends string,\n>(\n hook: FragnoClientMutatorData<\n _TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >,\n): FragnoVanillaMutator<\n _TMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n> {\n return () => {\n // TODO(Wilco): it should be possible for `loading` to be undefined, before a mutation has taken place.\n const store = hook.mutatorStore;\n return {\n subscribe: (callback) => {\n return store.subscribe((value) => {\n callback({\n loading: value.loading ?? false,\n error: value.error,\n data: value.data,\n });\n });\n },\n get: () => {\n const { loading, error, data } = store.get();\n return {\n loading: loading ?? false,\n error,\n data: data,\n };\n },\n mutate: ({ body, path, query }) => {\n return store.mutate({ body, path, query });\n },\n [Symbol.asyncIterator]() {\n return createAsyncIteratorFromCallback((callback) =>\n store.listen((value) => {\n callback({\n loading: value.loading ?? false,\n error: value.error,\n data: value.data,\n });\n }),\n );\n },\n };\n };\n}\n\nexport function useFragno<T extends Record<string, unknown>>(\n clientObj: T,\n): {\n [K in keyof T]: T[K] extends FragnoClientHookData<\n \"GET\",\n infer TPath,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoVanillaListeners<\"GET\", TPath, TOutputSchema, TErrorCode, TQueryParameters>\n : T[K] extends FragnoClientMutatorData<\n NonGetHTTPMethod,\n infer TPath,\n infer TInputSchema,\n infer TOutputSchema,\n infer TErrorCode,\n infer TQueryParameters\n >\n ? FragnoVanillaMutator<\n NonGetHTTPMethod,\n TPath,\n TInputSchema,\n TOutputSchema,\n TErrorCode,\n TQueryParameters\n >\n : T[K];\n} {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = {} as any; // We need one any cast here due to TypeScript's limitations with mapped types\n\n for (const key in clientObj) {\n if (!Object.prototype.hasOwnProperty.call(clientObj, key)) {\n continue;\n }\n\n const hook = clientObj[key];\n if (isGetHook(hook)) {\n result[key] = createVanillaListeners(hook);\n } else if (isMutatorHook(hook)) {\n result[key] = createVanillaMutator(hook);\n } else {\n // Pass through non-hook values unchanged\n result[key] = hook;\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AAgEA,SAAS,uBAMP,MACmF;AACnF,SAAQ,EAAE,MAAM,UAAU,EAAE,KAAK;EAC/B,MAAM,QAAQ,KAAK,MAAM;GAAE;GAAM;GAAO,CAAC;AAEzC,SAAO;GACL,SAAS,aAAa;AACpB,WAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,WACrC,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH;;GAEH,YAAY,aAAa;AACvB,WAAO,MAAM,WAAW,EAAE,SAAS,OAAO,WACxC,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH;;GAEH,eAAe;AACb,WAAO,MAAM,YAAY;;GAE3B,WAAW;AACT,WAAO,MAAM,KAAK;;GAEpB,CAAC,OAAO,iBAAiB;AACvB,WAAO,iCAAiC,aACtC,MAAM,QAAQ,EAAE,SAAS,OAAO,WAC9B,SAAS;KACP;KACA;KACM;KACP,CAAC,CACH,CACF;;GAEJ;;;AAyCL,SAAS,qBAQP,MAeA;AACA,cAAa;EAEX,MAAM,QAAQ,KAAK;AACnB,SAAO;GACL,YAAY,aAAa;AACvB,WAAO,MAAM,WAAW,UAAU;AAChC,cAAS;MACP,SAAS,MAAM,WAAW;MAC1B,OAAO,MAAM;MACb,MAAM,MAAM;MACb,CAAC;MACF;;GAEJ,WAAW;IACT,MAAM,EAAE,SAAS,OAAO,SAAS,MAAM,KAAK;AAC5C,WAAO;KACL,SAAS,WAAW;KACpB;KACM;KACP;;GAEH,SAAS,EAAE,MAAM,MAAM,YAAY;AACjC,WAAO,MAAM,OAAO;KAAE;KAAM;KAAM;KAAO,CAAC;;GAE5C,CAAC,OAAO,iBAAiB;AACvB,WAAO,iCAAiC,aACtC,MAAM,QAAQ,UAAU;AACtB,cAAS;MACP,SAAS,MAAM,WAAW;MAC1B,OAAO,MAAM;MACb,MAAM,MAAM;MACb,CAAC;MACF,CACH;;GAEJ;;;AAIL,SAAgB,UACd,WA2BA;CAEA,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,OAAO,WAAW;AAC3B,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,CACvD;EAGF,MAAM,OAAO,UAAU;AACvB,MAAI,UAAU,KAAK,CACjB,QAAO,OAAO,uBAAuB,KAAK;WACjC,cAAc,KAAK,CAC5B,QAAO,OAAO,qBAAqB,KAAK;MAGxC,QAAO,OAAO;;AAIlB,QAAO"}
@@ -1,6 +1,8 @@
1
- import { _ as QueryParamsHint, g as MaybeExtractPathParamsOrWiden, r as NonGetHTTPMethod, u as InferOr } from "../api-BWN97TOr.js";
2
- import "../route-Bl9Zr1Yv.js";
3
- import { C as FragnoClientMutatorData, I as FragnoClientError, S as FragnoClientHookData } from "../fragment-builder-MGr68GNb.js";
1
+ import { MaybeExtractPathParamsOrWiden, QueryParamsHint } from "../api/internal/path.js";
2
+ import { InferOr } from "../util/types-util.js";
3
+ import { NonGetHTTPMethod } from "../api/api.js";
4
+ import { FragnoClientError } from "./client-error.js";
5
+ import { FragnoClientHookData, FragnoClientMutatorData } from "./client.js";
4
6
  import { ReadableAtom, Store, StoreValue } from "nanostores";
5
7
  import { DeepReadonly, Ref, ShallowRef, UnwrapNestedRefs } from "vue";
6
8
  import { StandardSchemaV1 } from "@standard-schema/spec";
@@ -1 +1 @@
1
- {"version":3,"file":"vue.d.ts","names":[],"sources":["../../src/client/vue.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"vue.d.ts","names":[],"sources":["../../src/client/vue.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- import "../api-DngJDcmO.js";
2
- import "../request-output-context-CdIjwmEN.js";
3
- import "../route-C5Uryylh.js";
4
- import { a as isGetHook, o as isMutatorHook } from "../client-C5LsYHEI.js";
5
- import "../ssr-BByDVfFD.js";
1
+ import { isGetHook, isMutatorHook } from "./client.js";
6
2
  import { atom } from "nanostores";
7
3
  import { computed as computed$1, getCurrentScope, isRef, onScopeDispose, ref, shallowRef, watch } from "vue";
8
4