katanakit-js 5.0.1 → 6.0.4

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/README.md +243 -33
  2. package/dist/adapters/angular/fetch.js +1 -1
  3. package/dist/adapters/angular/fetch.js.map +1 -1
  4. package/dist/adapters/bun/dummyjson.service.d.ts +28 -5
  5. package/dist/adapters/bun/dummyjson.service.d.ts.map +1 -1
  6. package/dist/adapters/bun/dummyjson.service.js +22 -18
  7. package/dist/adapters/bun/dummyjson.service.js.map +1 -1
  8. package/dist/adapters/bun/main.js +3 -2
  9. package/dist/adapters/bun/main.js.map +1 -1
  10. package/dist/adapters/bun/server.d.ts +3 -2
  11. package/dist/adapters/bun/server.d.ts.map +1 -1
  12. package/dist/adapters/bun/server.js +3 -2
  13. package/dist/adapters/bun/server.js.map +1 -1
  14. package/dist/adapters/insforge/index.d.ts +3 -0
  15. package/dist/adapters/insforge/index.d.ts.map +1 -0
  16. package/dist/adapters/insforge/index.js +2 -0
  17. package/dist/adapters/insforge/index.js.map +1 -0
  18. package/dist/adapters/insforge/insforge.service.d.ts +147 -0
  19. package/dist/adapters/insforge/insforge.service.d.ts.map +1 -0
  20. package/dist/adapters/insforge/insforge.service.js +474 -0
  21. package/dist/adapters/insforge/insforge.service.js.map +1 -0
  22. package/dist/adapters/notion/index.d.ts +1 -1
  23. package/dist/adapters/notion/index.d.ts.map +1 -1
  24. package/dist/adapters/notion/index.js +1 -1
  25. package/dist/adapters/notion/index.js.map +1 -1
  26. package/dist/adapters/notion/notion.service.d.ts +30 -1
  27. package/dist/adapters/notion/notion.service.d.ts.map +1 -1
  28. package/dist/adapters/notion/notion.service.js +107 -54
  29. package/dist/adapters/notion/notion.service.js.map +1 -1
  30. package/dist/adapters/react/fetch.js +1 -1
  31. package/dist/adapters/react/fetch.js.map +1 -1
  32. package/dist/adapters/solid/fetch.js +1 -1
  33. package/dist/adapters/solid/fetch.js.map +1 -1
  34. package/dist/adapters/svelte/fetch.js +1 -1
  35. package/dist/adapters/svelte/fetch.js.map +1 -1
  36. package/dist/adapters/telegram/index.d.ts +1 -1
  37. package/dist/adapters/telegram/index.d.ts.map +1 -1
  38. package/dist/adapters/telegram/index.js +1 -1
  39. package/dist/adapters/telegram/index.js.map +1 -1
  40. package/dist/adapters/telegram/telegram.service.d.ts +25 -1
  41. package/dist/adapters/telegram/telegram.service.d.ts.map +1 -1
  42. package/dist/adapters/telegram/telegram.service.js +28 -1
  43. package/dist/adapters/telegram/telegram.service.js.map +1 -1
  44. package/dist/adapters/vue/vue.service.js +1 -1
  45. package/dist/adapters/vue/vue.service.js.map +1 -1
  46. package/dist/adapters/whatsapp/index.d.ts +1 -1
  47. package/dist/adapters/whatsapp/index.d.ts.map +1 -1
  48. package/dist/adapters/whatsapp/index.js +1 -1
  49. package/dist/adapters/whatsapp/index.js.map +1 -1
  50. package/dist/adapters/whatsapp/whatsapp.service.d.ts +30 -1
  51. package/dist/adapters/whatsapp/whatsapp.service.d.ts.map +1 -1
  52. package/dist/adapters/whatsapp/whatsapp.service.js +33 -1
  53. package/dist/adapters/whatsapp/whatsapp.service.js.map +1 -1
  54. package/dist/adapters/wordpress/index.d.ts +1 -1
  55. package/dist/adapters/wordpress/index.d.ts.map +1 -1
  56. package/dist/adapters/wordpress/index.js +1 -1
  57. package/dist/adapters/wordpress/index.js.map +1 -1
  58. package/dist/adapters/wordpress/wordpress.service.d.ts +34 -1
  59. package/dist/adapters/wordpress/wordpress.service.d.ts.map +1 -1
  60. package/dist/adapters/wordpress/wordpress.service.js +203 -86
  61. package/dist/adapters/wordpress/wordpress.service.js.map +1 -1
  62. package/dist/config/seo.service.d.ts.map +1 -1
  63. package/dist/config/seo.service.js +42 -4
  64. package/dist/config/seo.service.js.map +1 -1
  65. package/dist/core/index.d.ts +5 -0
  66. package/dist/core/index.d.ts.map +1 -1
  67. package/dist/core/index.js +5 -0
  68. package/dist/core/index.js.map +1 -1
  69. package/dist/core/services/error.service.d.ts +21 -1
  70. package/dist/core/services/error.service.d.ts.map +1 -1
  71. package/dist/core/services/error.service.js +39 -0
  72. package/dist/core/services/error.service.js.map +1 -1
  73. package/dist/core/services/faker.service.d.ts +160 -0
  74. package/dist/core/services/faker.service.d.ts.map +1 -0
  75. package/dist/core/services/faker.service.js +235 -0
  76. package/dist/core/services/faker.service.js.map +1 -0
  77. package/dist/core/services/http.service.d.ts +85 -35
  78. package/dist/core/services/http.service.d.ts.map +1 -1
  79. package/dist/core/services/http.service.js +178 -65
  80. package/dist/core/services/http.service.js.map +1 -1
  81. package/dist/core/services/media.service.d.ts +97 -0
  82. package/dist/core/services/media.service.d.ts.map +1 -0
  83. package/dist/core/services/media.service.js +239 -0
  84. package/dist/core/services/media.service.js.map +1 -0
  85. package/dist/core/services/query.service.d.ts +1 -1
  86. package/dist/core/services/query.service.js +1 -1
  87. package/dist/core/services/reactive.service.d.ts.map +1 -1
  88. package/dist/core/services/reactive.service.js +5 -14
  89. package/dist/core/services/reactive.service.js.map +1 -1
  90. package/dist/core/services/result.service.d.ts +41 -0
  91. package/dist/core/services/result.service.d.ts.map +1 -0
  92. package/dist/core/services/result.service.js +60 -0
  93. package/dist/core/services/result.service.js.map +1 -0
  94. package/dist/core/services/utils.service.d.ts +27 -0
  95. package/dist/core/services/utils.service.d.ts.map +1 -1
  96. package/dist/core/services/utils.service.js +37 -0
  97. package/dist/core/services/utils.service.js.map +1 -1
  98. package/dist/core/services/validation.service.d.ts +22 -0
  99. package/dist/core/services/validation.service.d.ts.map +1 -0
  100. package/dist/core/services/validation.service.js +41 -0
  101. package/dist/core/services/validation.service.js.map +1 -0
  102. package/dist/core/services/youtube.service.d.ts +79 -0
  103. package/dist/core/services/youtube.service.d.ts.map +1 -0
  104. package/dist/core/services/youtube.service.js +388 -0
  105. package/dist/core/services/youtube.service.js.map +1 -0
  106. package/dist/index.d.ts +1 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +1 -0
  109. package/dist/index.js.map +1 -1
  110. package/dist/infrastructure/filesystem/filesystem.service.d.ts +267 -0
  111. package/dist/infrastructure/filesystem/filesystem.service.d.ts.map +1 -0
  112. package/dist/infrastructure/filesystem/filesystem.service.js +453 -0
  113. package/dist/infrastructure/filesystem/filesystem.service.js.map +1 -0
  114. package/dist/infrastructure/filesystem/path.service.d.ts +115 -0
  115. package/dist/infrastructure/filesystem/path.service.d.ts.map +1 -0
  116. package/dist/infrastructure/filesystem/path.service.js +154 -0
  117. package/dist/infrastructure/filesystem/path.service.js.map +1 -0
  118. package/dist/infrastructure/index.d.ts +3 -0
  119. package/dist/infrastructure/index.d.ts.map +1 -1
  120. package/dist/infrastructure/index.js +3 -0
  121. package/dist/infrastructure/index.js.map +1 -1
  122. package/dist/infrastructure/media/media.service.d.ts +15 -0
  123. package/dist/infrastructure/media/media.service.d.ts.map +1 -0
  124. package/dist/infrastructure/media/media.service.js +44 -0
  125. package/dist/infrastructure/media/media.service.js.map +1 -0
  126. package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
  127. package/dist/infrastructure/storage/storage.service.js +10 -8
  128. package/dist/infrastructure/storage/storage.service.js.map +1 -1
  129. package/dist/schemas/access.schema.d.ts +69 -0
  130. package/dist/schemas/access.schema.d.ts.map +1 -0
  131. package/dist/schemas/access.schema.js +36 -0
  132. package/dist/schemas/access.schema.js.map +1 -0
  133. package/dist/schemas/ai.schema.d.ts +53 -0
  134. package/dist/schemas/ai.schema.d.ts.map +1 -0
  135. package/dist/schemas/ai.schema.js +34 -0
  136. package/dist/schemas/ai.schema.js.map +1 -0
  137. package/dist/schemas/common.schema.d.ts +49 -0
  138. package/dist/schemas/common.schema.d.ts.map +1 -0
  139. package/dist/schemas/common.schema.js +23 -0
  140. package/dist/schemas/common.schema.js.map +1 -0
  141. package/dist/schemas/core.schema.d.ts +164 -0
  142. package/dist/schemas/core.schema.d.ts.map +1 -0
  143. package/dist/schemas/core.schema.js +109 -0
  144. package/dist/schemas/core.schema.js.map +1 -0
  145. package/dist/schemas/faker.schema.d.ts +12 -0
  146. package/dist/schemas/faker.schema.d.ts.map +1 -0
  147. package/dist/schemas/faker.schema.js +12 -0
  148. package/dist/schemas/faker.schema.js.map +1 -0
  149. package/dist/schemas/filesystem.schema.d.ts +71 -0
  150. package/dist/schemas/filesystem.schema.d.ts.map +1 -0
  151. package/dist/schemas/filesystem.schema.js +56 -0
  152. package/dist/schemas/filesystem.schema.js.map +1 -0
  153. package/dist/schemas/index.d.ts +13 -0
  154. package/dist/schemas/index.d.ts.map +1 -0
  155. package/dist/schemas/index.js +13 -0
  156. package/dist/schemas/index.js.map +1 -0
  157. package/dist/schemas/insforge.schema.d.ts +69 -0
  158. package/dist/schemas/insforge.schema.d.ts.map +1 -0
  159. package/dist/schemas/insforge.schema.js +82 -0
  160. package/dist/schemas/insforge.schema.js.map +1 -0
  161. package/dist/schemas/media.schema.d.ts +51 -0
  162. package/dist/schemas/media.schema.d.ts.map +1 -0
  163. package/dist/schemas/media.schema.js +50 -0
  164. package/dist/schemas/media.schema.js.map +1 -0
  165. package/dist/schemas/notion.schema.d.ts +1058 -0
  166. package/dist/schemas/notion.schema.d.ts.map +1 -0
  167. package/dist/schemas/notion.schema.js +248 -0
  168. package/dist/schemas/notion.schema.js.map +1 -0
  169. package/dist/schemas/rss.schema.d.ts +35 -0
  170. package/dist/schemas/rss.schema.d.ts.map +1 -0
  171. package/dist/schemas/rss.schema.js +44 -0
  172. package/dist/schemas/rss.schema.js.map +1 -0
  173. package/dist/schemas/wordpress.schema.d.ts +1304 -0
  174. package/dist/schemas/wordpress.schema.d.ts.map +1 -0
  175. package/dist/schemas/wordpress.schema.js +404 -0
  176. package/dist/schemas/wordpress.schema.js.map +1 -0
  177. package/dist/schemas/youtube.schema.d.ts +122 -0
  178. package/dist/schemas/youtube.schema.d.ts.map +1 -0
  179. package/dist/schemas/youtube.schema.js +113 -0
  180. package/dist/schemas/youtube.schema.js.map +1 -0
  181. package/dist/types/index.d.ts +286 -804
  182. package/dist/types/index.d.ts.map +1 -1
  183. package/package.json +42 -23
@@ -1,5 +1,16 @@
1
+ import { useTryJsonParse } from "./result.service.js";
2
+ import { useSplitConfig } from "./utils.service.js";
1
3
  /** Module-level API registry. */
2
4
  let apis = {};
5
+ /**
6
+ * Internal: narrows an unknown literal entry to an {@link ApiEntry}.
7
+ *
8
+ * @param value - A non-method value from a `defineApiConfig` literal.
9
+ * @returns `true` when the value looks like a registered API entry.
10
+ */
11
+ function isApiEntry(value) {
12
+ return typeof value === "object" && value !== null && "baseUri" in value && "endpoints" in value;
13
+ }
3
14
  /**
4
15
  * Internal: retrieves a registered API entry or throws.
5
16
  *
@@ -20,25 +31,18 @@ function getApiEntry(apiName) {
20
31
  * @param response - The fetch Response to read.
21
32
  * @returns The parsed body or `null` for empty responses.
22
33
  */
23
- async function readBody(response) {
34
+ /** Error bodies are truncated so a hostile response cannot exhaust memory. */
35
+ const MAX_ERROR_BODY_CHARS = 32 * 1024;
36
+ async function readBody(response, maxChars) {
24
37
  const text = await response.text();
25
38
  if (!text)
26
39
  return null;
27
- const contentType = response.headers.get("content-type") ?? "";
28
- if (contentType.includes("application/json")) {
29
- try {
30
- return JSON.parse(text);
31
- }
32
- catch {
33
- return text;
34
- }
35
- }
36
- try {
37
- return JSON.parse(text);
38
- }
39
- catch {
40
- return text;
40
+ if (maxChars !== undefined && text.length > maxChars) {
41
+ return `${text.slice(0, maxChars)}… [truncated]`;
41
42
  }
43
+ // JSON first; non-JSON bodies fall back to the raw text.
44
+ const parsed = useTryJsonParse(text);
45
+ return parsed.ok ? parsed.data : text;
42
46
  }
43
47
  /**
44
48
  * Internal: serializes a request body.
@@ -67,9 +71,59 @@ function serializeBody(body) {
67
71
  body: JSON.stringify(body),
68
72
  };
69
73
  }
74
+ /**
75
+ * Declares the API registry in a single call — the config-file entry point.
76
+ *
77
+ * Registers every {@link ApiEntry} you list and returns them alongside the
78
+ * props, flags and methods declared on the same literal, so one `export default`
79
+ * is the whole setup: no second `useInitApis(...)` step.
80
+ *
81
+ * Only object entries shaped like `{ baseUri, endpoints }` reach the registry;
82
+ * boolean flags are kept on `config` for your own methods to read.
83
+ *
84
+ * @typeParam T - The literal passed in.
85
+ * @param input - API entries, flags and methods in one object literal.
86
+ * @returns The registered config plus the declared methods (see {@link ConfigFacade}).
87
+ * @throws {Error} If a non-method value is an object that is not an API entry.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * import { defineApiConfig } from "katanakit-js";
92
+ *
93
+ * export default defineApiConfig({
94
+ * pokeapi: { baseUri: "https://pokeapi.co/api/v2", endpoints: { byId: "/pokemon/:id/" } },
95
+ * debug: true,
96
+ * getPokemon: async function () {
97
+ * return useFetch("pokeapi", "byId", { params: { id: 25 } });
98
+ * },
99
+ * });
100
+ * ```
101
+ *
102
+ * @remarks Methods must be written with `function`, not as arrows — `this.config`
103
+ * is undefined inside an arrow function.
104
+ */
105
+ export function defineApiConfig(input) {
106
+ const { config, methods } = useSplitConfig(input);
107
+ const registered = {};
108
+ for (const [name, value] of Object.entries(config)) {
109
+ if (isApiEntry(value)) {
110
+ registered[name] = value;
111
+ continue;
112
+ }
113
+ if (typeof value === "object" && value !== null) {
114
+ throw new Error(`[FetchApiManager] defineApiConfig: "${name}" is not an API entry ` +
115
+ `(expected an object with baseUri and endpoints).`);
116
+ }
117
+ }
118
+ useInitApis(registered);
119
+ // `methods` is a generic spread, so TS cannot prove the exact facade shape.
120
+ return { config, ...methods };
121
+ }
70
122
  /**
71
123
  * Registers (merges) API definitions into the client registry.
72
- * Prefer the clearer alias {@link useInitApis}.
124
+ *
125
+ * @deprecated Use {@link defineApiConfig}, which registers the config and
126
+ * returns it with any methods declared on the same literal.
73
127
  *
74
128
  * @param apisConfig - The API definitions to merge into the registry.
75
129
  *
@@ -91,6 +145,9 @@ export function useInit(apisConfig) {
91
145
  /**
92
146
  * Registers (merges) API definitions into the client registry.
93
147
  *
148
+ * @deprecated Use {@link defineApiConfig}, which registers the config and
149
+ * returns it with any methods declared on the same literal.
150
+ *
94
151
  * @param apisConfig - The API definitions to merge into the registry.
95
152
  *
96
153
  * @example
@@ -140,41 +197,42 @@ export function useGetApisConfig() {
140
197
  return useGetApis();
141
198
  }
142
199
  /**
143
- * Builds a safe http(s) URL from a registered API + endpoint without making
144
- * a network request.
145
- *
146
- * Use cases:
147
- * - **Navigation links** — generate `<a href>` URLs for download links, pagination, etc.
148
- * - **Image/file sources** — build `<img src>` or `<video src>` URLs from API endpoints.
149
- * - **Third-party libraries** — pass URLs to charting, mapping, or analytics libraries that
150
- * handle their own fetching.
151
- * - **Debugging** — log the full URL before making a request to verify params and query strings.
152
- * - **SSR** — construct URLs server-side for pre-rendering or metadata generation.
153
- *
154
- * @param apiName - The registered API key (from `useInitApis`).
155
- * @param endpointName - The endpoint key within that API.
156
- * @param options - Optional URL building options (path params, query params, ignore defaults).
157
- * @returns The fully constructed URL string.
158
- * @throws {Error} If the API or endpoint is not registered, or the URL scheme is not http(s).
200
+ * Returns the URL of a registered endpoint **without calling `fetch`**.
201
+ *
202
+ * It builds the same URL {@link useFetch} would request — same registry, same
203
+ * `:param` substitution, same `query` merge with `defaultQueryParams`, same
204
+ * http(s) guard — then stops and hands you the string.
205
+ *
206
+ * Use it when you need the **address**, not the response:
207
+ *
208
+ * - `<a href>` / `<img src>` — links and media built from an endpoint name
209
+ * - libraries that fetch on their own (charts, maps, analytics)
210
+ * - logging the exact URL you are about to request
211
+ * - SSR / prerender, where nothing should be requested
212
+ *
213
+ * @param apiName - Registered API key (from {@link defineApiConfig}).
214
+ * @param endpointName - Endpoint key inside that API.
215
+ * @param options - `params` fills `:placeholders`, `query` becomes the search string.
216
+ * @returns The fully built URL.
217
+ * @throws {Error} Unknown API, unknown endpoint, or a scheme that is not http(s).
159
218
  *
160
219
  * @example
161
220
  * ```ts
162
221
  * import { useBuildUrl } from "katanakit-js";
163
222
  *
164
- * // Basic URL with path params
165
- * const url = useBuildUrl("pokeapi", "pokemonById", { params: { id: 25 } });
223
+ * useBuildUrl("pokeapi", "pokemonById", { params: { id: 25 } });
166
224
  * // → "https://pokeapi.co/api/v2/pokemon/25"
167
225
  *
168
- * // URL with query params
169
- * const download = useBuildUrl("myApi", "export", { query: { format: "pdf" } });
226
+ * useBuildUrl("myApi", "export", { query: { format: "pdf" } });
170
227
  * // → "https://api.myapp.com/v1/export?format=pdf"
171
228
  *
172
- * // Use in a template
173
229
  * <a href={useBuildUrl("myApi", "download", { params: { id: 42 } })}>Download</a>
174
- *
175
- * // Debug before fetching
176
- * console.log("Will fetch:", useBuildUrl("myApi", "users", { query: { page: 1 } }));
177
230
  * ```
231
+ *
232
+ * @remarks Synchronous, so it **throws** instead of returning a Safe Result —
233
+ * Safe Result covers fallible async work, and this never leaves the process.
234
+ * To see the URL a request actually used, read `result.url` off a `useFetch`
235
+ * result instead.
178
236
  */
179
237
  export function useBuildUrl(apiName, endpointName, options = {}) {
180
238
  const { params, query, ignoreDefaultQuery = false } = options;
@@ -206,7 +264,9 @@ export function useBuildUrl(apiName, endpointName, options = {}) {
206
264
  }
207
265
  /**
208
266
  * Builds a safe http(s) URL from a registered API + endpoint.
209
- * Alias for {@link useBuildUrl}.
267
+ *
268
+ * @deprecated Use {@link useBuildUrl}. This is a behaviourally identical wrapper around it and
269
+ * exists only for backwards compatibility — scheduled for removal in the next major.
210
270
  *
211
271
  * @param apiName - The registered API key.
212
272
  * @param endpointName - The endpoint key within the API.
@@ -223,29 +283,70 @@ export function useBuildUrl(apiName, endpointName, options = {}) {
223
283
  export function useBuildApiUrl(apiName, endpointName, options = {}) {
224
284
  return useBuildUrl(apiName, endpointName, options);
225
285
  }
286
+ /**
287
+ * Picks the URL-building keys out of an options bag so nothing else leaks into
288
+ * the `RequestInit` handed to `fetch`.
289
+ *
290
+ * `useGet`/`usePost`/… accept `UrlOptions`, but JS callers can stuff arbitrary
291
+ * keys in there; spreading the whole bag would let a stray `method`, `headers`
292
+ * or `body` silently override what the wrapper already set.
293
+ *
294
+ * @param urlOptions - Legacy URL options, if any.
295
+ * @returns Only `params`, `query` and `ignoreDefaultQuery`, when defined.
296
+ */
297
+ function pickUrl(urlOptions) {
298
+ if (!urlOptions)
299
+ return {};
300
+ const { params, query, ignoreDefaultQuery } = urlOptions;
301
+ return {
302
+ ...(params !== undefined && { params }),
303
+ ...(query !== undefined && { query }),
304
+ ...(ignoreDefaultQuery !== undefined && { ignoreDefaultQuery }),
305
+ };
306
+ }
226
307
  /**
227
308
  * Fetches a registered endpoint and returns a Safe Result.
228
309
  *
310
+ * URL options sit at the top level, next to `method`/`headers`/`body` — no
311
+ * nesting, same shape as `useGet` and Nuxt's `useFetch`.
312
+ *
229
313
  * @param apiName - The registered API key.
230
314
  * @param endpointName - The endpoint key within the API.
231
- * @param options - Optional fetch options (method, headers, body, urlOptions).
232
- * @returns A {@link FetchResult} with data or error.
315
+ * @param options - Fetch options: `params`, `query`, `transform` and any `RequestInit` field.
316
+ * @returns A {@link FetchResult} with data or error. Never throws — a failing
317
+ * `transform` comes back as an error result too.
233
318
  *
234
319
  * @example
235
320
  * ```ts
236
321
  * import { useFetch } from "katanakit-js";
237
322
  *
238
- * const result = await useFetch("pokeapi", "pokemonById", {
323
+ * const result = await useFetch<{ results: unknown[] }>("pokeapi", "pokemons", {
239
324
  * method: "GET",
240
- * urlOptions: { params: { id: 25 } },
325
+ * query: { limit: 2 },
326
+ * transform: (body) => ({ results: (body as { results: unknown[] }).results }),
241
327
  * });
242
- * if (result.ok) console.log(result.data);
328
+ * if (result.ok) console.log(result.data.results);
329
+ * ```
330
+ *
331
+ * @example Legacy nested form (deprecated)
332
+ * ```ts
333
+ * useFetch("pokeapi", "pokemonById", { urlOptions: { params: { id: 25 } } });
243
334
  * ```
244
335
  */
245
- export async function useFetch(apiName, endpointName, { urlOptions, ...init } = {}) {
336
+ export async function useFetch(apiName, endpointName, { params, query, ignoreDefaultQuery, urlOptions, transform, ...init } = {}) {
246
337
  let url = "";
338
+ // The flat keys and the deprecated `urlOptions` nest describe the same
339
+ // thing; the flat form wins. `undefined` means "not given", so it must not
340
+ // overwrite a value coming from the legacy nest.
341
+ const buildOptions = { ...urlOptions };
342
+ if (params !== undefined)
343
+ buildOptions.params = params;
344
+ if (query !== undefined)
345
+ buildOptions.query = query;
346
+ if (ignoreDefaultQuery !== undefined)
347
+ buildOptions.ignoreDefaultQuery = ignoreDefaultQuery;
247
348
  try {
248
- url = useBuildUrl(apiName, endpointName, urlOptions);
349
+ url = useBuildUrl(apiName, endpointName, buildOptions);
249
350
  }
250
351
  catch (err) {
251
352
  const message = err instanceof Error ? err.message : String(err);
@@ -266,7 +367,7 @@ export async function useFetch(apiName, endpointName, { urlOptions, ...init } =
266
367
  // host (SSRF). Callers that need redirects can pass `redirect: "follow"`.
267
368
  const response = await fetch(url, { redirect: "error", ...init });
268
369
  if (!response.ok) {
269
- const errorDetails = await readBody(response);
370
+ const errorDetails = await readBody(response, MAX_ERROR_BODY_CHARS);
270
371
  return {
271
372
  data: null,
272
373
  error: {
@@ -280,18 +381,30 @@ export async function useFetch(apiName, endpointName, { urlOptions, ...init } =
280
381
  };
281
382
  }
282
383
  // 204 No Content and empty bodies are valid success responses.
283
- if (response.status === 204) {
284
- return {
285
- data: null,
286
- error: null,
287
- url: response.url || url,
288
- status: 204,
289
- ok: true,
290
- };
384
+ const body = response.status === 204 ? null : await readBody(response);
385
+ let data = body;
386
+ if (transform) {
387
+ try {
388
+ data = await transform(body);
389
+ }
390
+ catch (err) {
391
+ // A failing transform is still a failed request — return it as a
392
+ // Safe Result instead of letting it escape `useFetch`.
393
+ const message = err instanceof Error ? err.message : String(err);
394
+ return {
395
+ data: null,
396
+ error: {
397
+ message: `Transform Error: ${message}`,
398
+ status: response.status,
399
+ },
400
+ url: response.url || url,
401
+ status: response.status,
402
+ ok: false,
403
+ };
404
+ }
291
405
  }
292
- const body = await readBody(response);
293
406
  return {
294
- data: body,
407
+ data: data,
295
408
  error: null,
296
409
  url: response.url || url,
297
410
  status: response.status,
@@ -327,7 +440,7 @@ export async function useFetch(apiName, endpointName, { urlOptions, ...init } =
327
440
  *
328
441
  * const result = await useFetchApi("pokeapi", "pokemonById", {
329
442
  * method: "GET",
330
- * urlOptions: { params: { id: 25 } },
443
+ * params: { id: 25 },
331
444
  * });
332
445
  * if (result.ok) console.log(result.data);
333
446
  * ```
@@ -353,7 +466,7 @@ export async function useFetchApi(apiName, endpointName, options) {
353
466
  * ```
354
467
  */
355
468
  export async function useGet(apiName, endpointName, urlOptions) {
356
- return useFetch(apiName, endpointName, { method: "GET", urlOptions });
469
+ return useFetch(apiName, endpointName, { method: "GET", ...pickUrl(urlOptions) });
357
470
  }
358
471
  /**
359
472
  * GET helper over a registered API endpoint.
@@ -396,7 +509,7 @@ export async function usePost(apiName, endpointName, body, urlOptions) {
396
509
  return useFetch(apiName, endpointName, {
397
510
  method: "POST",
398
511
  ...serializeBody(body),
399
- urlOptions,
512
+ ...pickUrl(urlOptions),
400
513
  });
401
514
  }
402
515
  /**
@@ -419,7 +532,7 @@ export async function usePut(apiName, endpointName, body, urlOptions) {
419
532
  return useFetch(apiName, endpointName, {
420
533
  method: "PUT",
421
534
  ...serializeBody(body),
422
- urlOptions,
535
+ ...pickUrl(urlOptions),
423
536
  });
424
537
  }
425
538
  /**
@@ -442,7 +555,7 @@ export async function usePatch(apiName, endpointName, body, urlOptions) {
442
555
  return useFetch(apiName, endpointName, {
443
556
  method: "PATCH",
444
557
  ...serializeBody(body),
445
- urlOptions,
558
+ ...pickUrl(urlOptions),
446
559
  });
447
560
  }
448
561
  /**
@@ -463,7 +576,7 @@ export async function usePatch(apiName, endpointName, body, urlOptions) {
463
576
  export async function useDelete(apiName, endpointName, urlOptions) {
464
577
  return useFetch(apiName, endpointName, {
465
578
  method: "DELETE",
466
- urlOptions,
579
+ ...pickUrl(urlOptions),
467
580
  });
468
581
  }
469
582
  //# sourceMappingURL=http.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.service.js","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.service.js","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { FetchResult, MediaSource, SmartVideoOptions, YoutubeEmbedOptions, YoutubeThumbnailQuality } from "../../types/index.js";
2
+ /**
3
+ * Extracts a YouTube video id from a watch / shorts / live / embed /
4
+ * `youtu.be` URL or a bare 11-char id. Returns `null` when not matched.
5
+ *
6
+ * @param input - URL or bare video id.
7
+ * @returns The 11-char video id or `null`.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * useGetYoutubeVideoId("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
12
+ * useGetYoutubeVideoId("https://youtu.be/dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
13
+ * useGetYoutubeVideoId("dQw4w9WgXcQ"); // "dQw4w9WgXcQ"
14
+ * ```
15
+ */
16
+ export declare function useGetYoutubeVideoId(input: string): string | null;
17
+ /**
18
+ * Extracts a Vimeo video id from a URL or bare numeric id.
19
+ *
20
+ * @param input - URL or bare numeric id.
21
+ * @returns The numeric id or `null`.
22
+ */
23
+ export declare function useGetVimeoVideoId(input: string): string | null;
24
+ /**
25
+ * Normalizes any supported input into a {@link MediaSource}.
26
+ * Pure and SSR-safe: no DOM, no fetch.
27
+ *
28
+ * @param input - YouTube/Vimeo URL or id, or direct video file URL.
29
+ * @returns Normalized `{ provider, id, raw }`.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * useParseMediaSource("https://youtu.be/dQw4w9WgXcQ");
34
+ * // { provider: "youtube", id: "dQw4w9WgXcQ", raw: "…" }
35
+ * ```
36
+ */
37
+ export declare function useParseMediaSource(input: string): MediaSource;
38
+ /**
39
+ * Builds the privacy-enhanced YouTube embed URL (`youtube-nocookie`).
40
+ *
41
+ * @param videoId - 11-char YouTube video id.
42
+ * @param options - Player options (start/end/autoplay/extra params).
43
+ * @returns Embed URL ready for `<iframe src>`.
44
+ */
45
+ export declare function useBuildYoutubeEmbedUrl(videoId: string, options?: YoutubeEmbedOptions): string;
46
+ /**
47
+ * Builds the Vimeo player embed URL with privacy defaults.
48
+ *
49
+ * @param videoId - Numeric Vimeo video id.
50
+ * @returns Player URL ready for `<iframe src>`.
51
+ */
52
+ export declare function useBuildVimeoEmbedUrl(videoId: string): string;
53
+ /**
54
+ * Builds the public YouTube thumbnail URL (no API key needed).
55
+ *
56
+ * @param videoId - 11-char YouTube video id.
57
+ * @param quality - Thumbnail quality (defaults to `hqdefault`).
58
+ * @returns Thumbnail image URL.
59
+ */
60
+ export declare function useBuildYoutubeThumbnail(videoId: string, quality?: YoutubeThumbnailQuality): string;
61
+ /**
62
+ * Validates unknown input (parsed JSON, frontmatter, CMS payloads) against
63
+ * the `SmartVideoOptions` schema. Returns a Safe Result instead of throwing.
64
+ *
65
+ * @param input - Unknown value to validate.
66
+ * @returns `FetchResult<SmartVideoOptions>` with typed options or a `Validation Error`.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * const result = useParseSmartVideoOptions(JSON.parse(raw));
71
+ * if (result.ok) useBuildVideoEmbed(result.data);
72
+ * ```
73
+ */
74
+ export declare function useParseSmartVideoOptions(input: unknown): FetchResult<SmartVideoOptions>;
75
+ /**
76
+ * Builds the semantically correct embed HTML for any supported source.
77
+ *
78
+ * - Direct files (`.mp4`/`.webm`) → `<figure><video controls …>` (native).
79
+ * - YouTube / Vimeo → `<figure><iframe …>` (embedded context), or a
80
+ * click-to-play facade (`<button>` + thumbnail) when `facade: true`
81
+ * so `.md/.mdx` posts never pay the iframe cost on load.
82
+ *
83
+ * Pure string builder: SSR-safe, no DOM access. Escape is applied to
84
+ * all interpolated attributes.
85
+ *
86
+ * @param options - Source + a11y + presentation options.
87
+ * @returns `{ provider, id, html }` with the ready-to-inject markup.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * const { html } = useBuildVideoEmbed({ src: "https://youtu.be/…", title: "My talk" });
92
+ * ```
93
+ */
94
+ export declare function useBuildVideoEmbed(options: SmartVideoOptions): MediaSource & {
95
+ html: string;
96
+ };
97
+ //# sourceMappingURL=media.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/media.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,MAAM,sBAAsB,CAAC;AAsB9B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgCjE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAS9D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAC/B,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,uBAAqC,GAC5C,MAAM,CAER;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAExF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAsD7F"}