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
@@ -0,0 +1,235 @@
1
+ /** Cached lazy faker instance (reset on failure so a later call can retry). */
2
+ let fakerPromise = null;
3
+ /** Loads faker on first use, or rejects with an actionable install error. */
4
+ async function loadFaker() {
5
+ if (!fakerPromise) {
6
+ fakerPromise = import("@faker-js/faker")
7
+ .then((module) => module.faker)
8
+ .catch((error) => {
9
+ fakerPromise = null;
10
+ throw new Error('[Faker] The optional peer dependency "@faker-js/faker" is not installed. Run "bun add @faker-js/faker" (or "npm install @faker-js/faker").', { cause: error });
11
+ });
12
+ }
13
+ return fakerPromise;
14
+ }
15
+ /**
16
+ * Seeds the faker instance for reproducible output, or rolls a new random seed.
17
+ *
18
+ * The sequence depends on the seed, the number of calls made since it was set
19
+ * and the faker major version — keep the call order stable for stable output.
20
+ *
21
+ * @param seed - Optional numeric seed. Omit it to generate a fresh random seed
22
+ * (log the returned value and pass it back later to replay the exact run).
23
+ * @returns The seed that was set.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { useFakeSeed, useFakeUuid } from "katanakit-js";
28
+ *
29
+ * const seed = await useFakeSeed(); // random, but loggable/replayable
30
+ * await useFakeSeed(seed); // replays the same sequence
31
+ * await useFakeUuid();
32
+ * ```
33
+ */
34
+ export async function useFakeSeed(seed) {
35
+ const faker = await loadFaker();
36
+ return seed === undefined ? faker.seed() : faker.seed(seed);
37
+ }
38
+ /**
39
+ * Pins the reference date faker uses for relative date helpers, so
40
+ * date-dependent output stays reproducible next to {@link useFakeSeed}.
41
+ *
42
+ * @param refDate - Static date (`Date`, ISO string or epoch ms) or a factory
43
+ * returning a fresh `Date` on every call. Omit it to reset to the current time.
44
+ * @returns The reference date now in effect.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * import { useFakeSeed, useFakeSetDefaultRefDate, useFakeDate } from "katanakit-js";
49
+ *
50
+ * await useFakeSeed(42);
51
+ * await useFakeSetDefaultRefDate("2026-01-01");
52
+ * await useFakeDate(); // reproducible between 1970-01-01 and 2026-01-01
53
+ * ```
54
+ */
55
+ export async function useFakeSetDefaultRefDate(refDate) {
56
+ const faker = await loadFaker();
57
+ faker.setDefaultRefDate(refDate);
58
+ return faker.defaultRefDate();
59
+ }
60
+ /**
61
+ * Generates a v4 UUID.
62
+ *
63
+ * @returns A random UUID string.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const id = await useFakeUuid();
68
+ * ```
69
+ */
70
+ export async function useFakeUuid() {
71
+ const faker = await loadFaker();
72
+ return faker.string.uuid();
73
+ }
74
+ /**
75
+ * Generates a fake email address.
76
+ *
77
+ * @returns An email address.
78
+ */
79
+ export async function useFakeEmail() {
80
+ const faker = await loadFaker();
81
+ return faker.internet.email();
82
+ }
83
+ /**
84
+ * Generates a fake full name.
85
+ *
86
+ * @returns A full name, e.g. `"Ada Lovelace"`.
87
+ */
88
+ export async function useFakeFullName() {
89
+ const faker = await loadFaker();
90
+ return faker.person.fullName();
91
+ }
92
+ /**
93
+ * Generates a fake first name.
94
+ *
95
+ * @returns A first name.
96
+ */
97
+ export async function useFakeFirstName() {
98
+ const faker = await loadFaker();
99
+ return faker.person.firstName();
100
+ }
101
+ /**
102
+ * Generates a fake last name.
103
+ *
104
+ * @returns A last name.
105
+ */
106
+ export async function useFakeLastName() {
107
+ const faker = await loadFaker();
108
+ return faker.person.lastName();
109
+ }
110
+ /**
111
+ * Generates a fake phone number.
112
+ *
113
+ * @returns A phone number string.
114
+ */
115
+ export async function useFakePhone() {
116
+ const faker = await loadFaker();
117
+ return faker.phone.number();
118
+ }
119
+ /**
120
+ * Generates a fake company name.
121
+ *
122
+ * @returns A company name.
123
+ */
124
+ export async function useFakeCompanyName() {
125
+ const faker = await loadFaker();
126
+ return faker.company.name();
127
+ }
128
+ /**
129
+ * Generates a fake URL.
130
+ *
131
+ * @returns An absolute URL.
132
+ */
133
+ export async function useFakeUrl() {
134
+ const faker = await loadFaker();
135
+ return faker.internet.url();
136
+ }
137
+ /**
138
+ * Generates lorem-ipsum text.
139
+ *
140
+ * @param words - Number of words (default: `12`).
141
+ * @returns A space-separated string of words.
142
+ */
143
+ export async function useFakeText(words = 12) {
144
+ const faker = await loadFaker();
145
+ return faker.lorem.words(words);
146
+ }
147
+ /**
148
+ * Generates an integer within an inclusive range.
149
+ *
150
+ * @param min - Lower bound (default: `0`).
151
+ * @param max - Upper bound (default: `100`).
152
+ * @returns A random integer between `min` and `max`.
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * const age = await useFakeNumber(18, 65);
157
+ * ```
158
+ */
159
+ export async function useFakeNumber(min = 0, max = 100) {
160
+ const faker = await loadFaker();
161
+ return faker.number.int({ max, min });
162
+ }
163
+ /**
164
+ * Generates a random boolean.
165
+ *
166
+ * @returns `true` or `false`.
167
+ */
168
+ export async function useFakeBoolean() {
169
+ const faker = await loadFaker();
170
+ return faker.datatype.boolean();
171
+ }
172
+ /**
173
+ * Generates a random date within an optional range.
174
+ *
175
+ * @param from - Lower bound (default: `1970-01-01`).
176
+ * @param to - Upper bound (default: faker's reference date, see
177
+ * {@link useFakeSetDefaultRefDate} — the current time when unset).
178
+ * @returns A `Date` instance.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * const hiredAt = await useFakeDate(new Date("2020-01-01"), new Date("2025-12-31"));
183
+ * ```
184
+ */
185
+ export async function useFakeDate(from, to) {
186
+ const faker = await loadFaker();
187
+ return faker.date.between({
188
+ from: from ?? "1970-01-01",
189
+ to: to ?? faker.defaultRefDate(),
190
+ });
191
+ }
192
+ /**
193
+ * Generates a generic fake vehicle (brand, model, type, fuel, color, vin, plate).
194
+ *
195
+ * @returns A {@link FakeVehicle} object.
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * const vehicle = await useFakeVehicle();
200
+ * // { brand: "Jeep", model: "Wrangler", plate: "HJ47FNP", ... }
201
+ * ```
202
+ */
203
+ export async function useFakeVehicle() {
204
+ const faker = await loadFaker();
205
+ return {
206
+ brand: faker.vehicle.manufacturer(),
207
+ color: faker.vehicle.color(),
208
+ fuel: faker.vehicle.fuel(),
209
+ model: faker.vehicle.model(),
210
+ plate: faker.vehicle.vrm(),
211
+ type: faker.vehicle.type(),
212
+ vin: faker.vehicle.vin(),
213
+ };
214
+ }
215
+ /**
216
+ * Builds an array of fake items from a factory (sync or async).
217
+ *
218
+ * @typeParam T - Item type produced by the factory.
219
+ * @param factory - Called once per item; receives the zero-based index.
220
+ * @param count - Number of items to generate (non-negative integer).
221
+ * @returns A promise resolving to the generated array.
222
+ *
223
+ * @example
224
+ * ```ts
225
+ * const vehicles = await useFakeList(() => useFakeVehicle(), 5);
226
+ * const relations = await useFakeList((index) => ({ user: users[index % users.length] }), 10);
227
+ * ```
228
+ */
229
+ export async function useFakeList(factory, count) {
230
+ if (!Number.isInteger(count) || count < 0) {
231
+ throw new Error("[Faker] count must be a non-negative integer.");
232
+ }
233
+ return Promise.all(Array.from({ length: count }, (_, index) => factory(index)));
234
+ }
235
+ //# sourceMappingURL=faker.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faker.service.js","sourceRoot":"","sources":["../../../src/core/services/faker.service.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,41 @@
1
- import type { ApisConfig, FetchOptions, FetchResult, UrlOptions } from "../../types/index.js";
1
+ import type { ApiConfigValue, ApisConfig, ConfigFacade, ConfigValues, FetchOptions, FetchResult, UrlOptions } from "../../types/index.js";
2
+ /**
3
+ * Declares the API registry in a single call — the config-file entry point.
4
+ *
5
+ * Registers every {@link ApiEntry} you list and returns them alongside the
6
+ * props, flags and methods declared on the same literal, so one `export default`
7
+ * is the whole setup: no second `useInitApis(...)` step.
8
+ *
9
+ * Only object entries shaped like `{ baseUri, endpoints }` reach the registry;
10
+ * boolean flags are kept on `config` for your own methods to read.
11
+ *
12
+ * @typeParam T - The literal passed in.
13
+ * @param input - API entries, flags and methods in one object literal.
14
+ * @returns The registered config plus the declared methods (see {@link ConfigFacade}).
15
+ * @throws {Error} If a non-method value is an object that is not an API entry.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { defineApiConfig } from "katanakit-js";
20
+ *
21
+ * export default defineApiConfig({
22
+ * pokeapi: { baseUri: "https://pokeapi.co/api/v2", endpoints: { byId: "/pokemon/:id/" } },
23
+ * debug: true,
24
+ * getPokemon: async function () {
25
+ * return useFetch("pokeapi", "byId", { params: { id: 25 } });
26
+ * },
27
+ * });
28
+ * ```
29
+ *
30
+ * @remarks Methods must be written with `function`, not as arrows — `this.config`
31
+ * is undefined inside an arrow function.
32
+ */
33
+ export declare function defineApiConfig<T extends object>(input: T & ThisType<ConfigFacade<T>> & ConfigValues<NoInfer<T>, ApiConfigValue>): ConfigFacade<T>;
2
34
  /**
3
35
  * Registers (merges) API definitions into the client registry.
4
- * Prefer the clearer alias {@link useInitApis}.
36
+ *
37
+ * @deprecated Use {@link defineApiConfig}, which registers the config and
38
+ * returns it with any methods declared on the same literal.
5
39
  *
6
40
  * @param apisConfig - The API definitions to merge into the registry.
7
41
  *
@@ -21,6 +55,9 @@ export declare function useInit(apisConfig: ApisConfig): void;
21
55
  /**
22
56
  * Registers (merges) API definitions into the client registry.
23
57
  *
58
+ * @deprecated Use {@link defineApiConfig}, which registers the config and
59
+ * returns it with any methods declared on the same literal.
60
+ *
24
61
  * @param apisConfig - The API definitions to merge into the registry.
25
62
  *
26
63
  * @example
@@ -64,46 +101,49 @@ export declare function useGetApis(): ApisConfig;
64
101
  */
65
102
  export declare function useGetApisConfig(): ApisConfig;
66
103
  /**
67
- * Builds a safe http(s) URL from a registered API + endpoint without making
68
- * a network request.
69
- *
70
- * Use cases:
71
- * - **Navigation links** — generate `<a href>` URLs for download links, pagination, etc.
72
- * - **Image/file sources** — build `<img src>` or `<video src>` URLs from API endpoints.
73
- * - **Third-party libraries** — pass URLs to charting, mapping, or analytics libraries that
74
- * handle their own fetching.
75
- * - **Debugging** — log the full URL before making a request to verify params and query strings.
76
- * - **SSR** — construct URLs server-side for pre-rendering or metadata generation.
77
- *
78
- * @param apiName - The registered API key (from `useInitApis`).
79
- * @param endpointName - The endpoint key within that API.
80
- * @param options - Optional URL building options (path params, query params, ignore defaults).
81
- * @returns The fully constructed URL string.
82
- * @throws {Error} If the API or endpoint is not registered, or the URL scheme is not http(s).
104
+ * Returns the URL of a registered endpoint **without calling `fetch`**.
105
+ *
106
+ * It builds the same URL {@link useFetch} would request — same registry, same
107
+ * `:param` substitution, same `query` merge with `defaultQueryParams`, same
108
+ * http(s) guard — then stops and hands you the string.
109
+ *
110
+ * Use it when you need the **address**, not the response:
111
+ *
112
+ * - `<a href>` / `<img src>` — links and media built from an endpoint name
113
+ * - libraries that fetch on their own (charts, maps, analytics)
114
+ * - logging the exact URL you are about to request
115
+ * - SSR / prerender, where nothing should be requested
116
+ *
117
+ * @param apiName - Registered API key (from {@link defineApiConfig}).
118
+ * @param endpointName - Endpoint key inside that API.
119
+ * @param options - `params` fills `:placeholders`, `query` becomes the search string.
120
+ * @returns The fully built URL.
121
+ * @throws {Error} Unknown API, unknown endpoint, or a scheme that is not http(s).
83
122
  *
84
123
  * @example
85
124
  * ```ts
86
125
  * import { useBuildUrl } from "katanakit-js";
87
126
  *
88
- * // Basic URL with path params
89
- * const url = useBuildUrl("pokeapi", "pokemonById", { params: { id: 25 } });
127
+ * useBuildUrl("pokeapi", "pokemonById", { params: { id: 25 } });
90
128
  * // → "https://pokeapi.co/api/v2/pokemon/25"
91
129
  *
92
- * // URL with query params
93
- * const download = useBuildUrl("myApi", "export", { query: { format: "pdf" } });
130
+ * useBuildUrl("myApi", "export", { query: { format: "pdf" } });
94
131
  * // → "https://api.myapp.com/v1/export?format=pdf"
95
132
  *
96
- * // Use in a template
97
133
  * <a href={useBuildUrl("myApi", "download", { params: { id: 42 } })}>Download</a>
98
- *
99
- * // Debug before fetching
100
- * console.log("Will fetch:", useBuildUrl("myApi", "users", { query: { page: 1 } }));
101
134
  * ```
135
+ *
136
+ * @remarks Synchronous, so it **throws** instead of returning a Safe Result —
137
+ * Safe Result covers fallible async work, and this never leaves the process.
138
+ * To see the URL a request actually used, read `result.url` off a `useFetch`
139
+ * result instead.
102
140
  */
103
141
  export declare function useBuildUrl(apiName: string, endpointName: string, options?: UrlOptions): string;
104
142
  /**
105
143
  * Builds a safe http(s) URL from a registered API + endpoint.
106
- * Alias for {@link useBuildUrl}.
144
+ *
145
+ * @deprecated Use {@link useBuildUrl}. This is a behaviourally identical wrapper around it and
146
+ * exists only for backwards compatibility — scheduled for removal in the next major.
107
147
  *
108
148
  * @param apiName - The registered API key.
109
149
  * @param endpointName - The endpoint key within the API.
@@ -121,23 +161,33 @@ export declare function useBuildApiUrl(apiName: string, endpointName: string, op
121
161
  /**
122
162
  * Fetches a registered endpoint and returns a Safe Result.
123
163
  *
164
+ * URL options sit at the top level, next to `method`/`headers`/`body` — no
165
+ * nesting, same shape as `useGet` and Nuxt's `useFetch`.
166
+ *
124
167
  * @param apiName - The registered API key.
125
168
  * @param endpointName - The endpoint key within the API.
126
- * @param options - Optional fetch options (method, headers, body, urlOptions).
127
- * @returns A {@link FetchResult} with data or error.
169
+ * @param options - Fetch options: `params`, `query`, `transform` and any `RequestInit` field.
170
+ * @returns A {@link FetchResult} with data or error. Never throws — a failing
171
+ * `transform` comes back as an error result too.
128
172
  *
129
173
  * @example
130
174
  * ```ts
131
175
  * import { useFetch } from "katanakit-js";
132
176
  *
133
- * const result = await useFetch("pokeapi", "pokemonById", {
177
+ * const result = await useFetch<{ results: unknown[] }>("pokeapi", "pokemons", {
134
178
  * method: "GET",
135
- * urlOptions: { params: { id: 25 } },
179
+ * query: { limit: 2 },
180
+ * transform: (body) => ({ results: (body as { results: unknown[] }).results }),
136
181
  * });
137
- * if (result.ok) console.log(result.data);
182
+ * if (result.ok) console.log(result.data.results);
183
+ * ```
184
+ *
185
+ * @example Legacy nested form (deprecated)
186
+ * ```ts
187
+ * useFetch("pokeapi", "pokemonById", { urlOptions: { params: { id: 25 } } });
138
188
  * ```
139
189
  */
140
- export declare function useFetch<T = unknown>(apiName: string, endpointName: string, { urlOptions, ...init }?: FetchOptions): Promise<FetchResult<T>>;
190
+ export declare function useFetch<T = unknown>(apiName: string, endpointName: string, { params, query, ignoreDefaultQuery, urlOptions, transform, ...init }?: FetchOptions<T>): Promise<FetchResult<T>>;
141
191
  /**
142
192
  * Fetches a registered endpoint and returns a Safe Result.
143
193
  * Alias for {@link useFetch}.
@@ -153,12 +203,12 @@ export declare function useFetch<T = unknown>(apiName: string, endpointName: str
153
203
  *
154
204
  * const result = await useFetchApi("pokeapi", "pokemonById", {
155
205
  * method: "GET",
156
- * urlOptions: { params: { id: 25 } },
206
+ * params: { id: 25 },
157
207
  * });
158
208
  * if (result.ok) console.log(result.data);
159
209
  * ```
160
210
  */
161
- export declare function useFetchApi<T = unknown>(apiName: string, endpointName: string, options?: FetchOptions): Promise<FetchResult<T>>;
211
+ export declare function useFetchApi<T = unknown>(apiName: string, endpointName: string, options?: FetchOptions<T>): Promise<FetchResult<T>>;
162
212
  /**
163
213
  * GET helper over a registered API endpoint.
164
214
  *
@@ -1 +1 @@
1
- {"version":3,"file":"http.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/http.service.ts"],"names":[],"mappings":"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"}