@zap-studio/fetch 0.5.4 → 0.5.6

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 (64) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +1 -1
  3. package/README.md +19 -5
  4. package/dist/constants.d.ts +17 -0
  5. package/dist/constants.d.ts.map +1 -0
  6. package/dist/{constants.mjs → constants.js} +1 -1
  7. package/dist/constants.js.map +1 -0
  8. package/dist/errors.d.ts +41 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/{errors.mjs → errors.js} +1 -1
  11. package/dist/errors.js.map +1 -0
  12. package/dist/fetch-D0IXjsUD.js +222 -0
  13. package/dist/fetch-D0IXjsUD.js.map +1 -0
  14. package/dist/fetch.d.ts +114 -0
  15. package/dist/fetch.d.ts.map +1 -0
  16. package/dist/fetch.js +3 -0
  17. package/dist/headers.d.ts +26 -0
  18. package/dist/headers.d.ts.map +1 -0
  19. package/dist/{headers.mjs → headers.js} +6 -6
  20. package/dist/headers.js.map +1 -0
  21. package/dist/index.d.ts +8 -0
  22. package/dist/index.js +7 -0
  23. package/dist/request.d.ts +30 -0
  24. package/dist/request.d.ts.map +1 -0
  25. package/dist/{request.mjs → request.js} +15 -12
  26. package/dist/request.js.map +1 -0
  27. package/dist/types.d.ts +168 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +0 -0
  30. package/dist/url.d.ts +26 -0
  31. package/dist/url.d.ts.map +1 -0
  32. package/dist/{url.mjs → url.js} +36 -37
  33. package/dist/url.js.map +1 -0
  34. package/package.json +19 -28
  35. package/dist/constants.d.mts +0 -18
  36. package/dist/constants.d.mts.map +0 -1
  37. package/dist/constants.mjs.map +0 -1
  38. package/dist/errors.d.mts +0 -41
  39. package/dist/errors.d.mts.map +0 -1
  40. package/dist/errors.mjs.map +0 -1
  41. package/dist/headers.d.mts +0 -26
  42. package/dist/headers.d.mts.map +0 -1
  43. package/dist/headers.mjs.map +0 -1
  44. package/dist/index.d.mts +0 -115
  45. package/dist/index.d.mts.map +0 -1
  46. package/dist/index.mjs +0 -103
  47. package/dist/index.mjs.map +0 -1
  48. package/dist/internal.d.mts +0 -33
  49. package/dist/internal.d.mts.map +0 -1
  50. package/dist/internal.mjs +0 -76
  51. package/dist/internal.mjs.map +0 -1
  52. package/dist/methods.d.mts +0 -23
  53. package/dist/methods.d.mts.map +0 -1
  54. package/dist/methods.mjs +0 -58
  55. package/dist/methods.mjs.map +0 -1
  56. package/dist/request.d.mts +0 -31
  57. package/dist/request.d.mts.map +0 -1
  58. package/dist/request.mjs.map +0 -1
  59. package/dist/types.d.mts +0 -169
  60. package/dist/types.d.mts.map +0 -1
  61. package/dist/types.mjs +0 -1
  62. package/dist/url.d.mts +0 -27
  63. package/dist/url.d.mts.map +0 -1
  64. package/dist/url.mjs.map +0 -1
package/dist/types.d.mts DELETED
@@ -1,169 +0,0 @@
1
- import { StandardSchemaV1 } from "@zap-studio/validation";
2
-
3
- //#region src/types.d.ts
4
- /**
5
- * Accepted `fetch` input type (`string`, `URL`, or `Request`).
6
- */
7
- type FetchInput = Parameters<typeof fetch>[0];
8
- type URLSearchParamsInput = ConstructorParameters<typeof URLSearchParams>[0];
9
- type RequestBodyInit = RequestInit & {
10
- json?: never;
11
- };
12
- type JsonBodyInit = Omit<RequestInit, "body"> & {
13
- /**
14
- * JSON body convenience. When provided, this is JSON-stringified into `body`.
15
- * @default undefined
16
- */
17
- json: unknown;
18
- body?: never;
19
- };
20
- type CustomRequestInit = {
21
- /**
22
- * Per-request query/search params
23
- * @default undefined
24
- */
25
- searchParams?: URLSearchParamsInput;
26
- /**
27
- * Whether to throw a FetchError on HTTP errors (non-2xx responses)
28
- * @default true
29
- */
30
- throwOnFetchError?: boolean;
31
- /**
32
- * Whether to throw a ValidationError on validation errors
33
- * @default true
34
- */
35
- throwOnValidationError?: boolean;
36
- };
37
- /**
38
- * Extended RequestInit type to include custom fetch options
39
- *
40
- * @example
41
- * const options: ExtendedRequestInit = {
42
- * method: "POST",
43
- * json: { name: "Ada" },
44
- * throwOnFetchError: true,
45
- * };
46
- */
47
- type ExtendedRequestInit = (RequestBodyInit | JsonBodyInit) & CustomRequestInit;
48
- /**
49
- * Internal defaults used by fetchInternal
50
- *
51
- * @example
52
- * const defaults: FetchDefaults = {
53
- * baseURL: "https://api.example.com",
54
- * throwOnFetchError: true,
55
- * throwOnValidationError: true,
56
- * };
57
- */
58
- interface FetchDefaults {
59
- /**
60
- * Base URL to prepend to all requests
61
- * @default ""
62
- */
63
- baseURL: string;
64
- /**
65
- * Default headers to include in all requests (can be overridden per request)
66
- * @default undefined
67
- */
68
- headers?: HeadersInit;
69
- /**
70
- * Default query/search params applied to every request (can be overridden per request)
71
- * @default undefined
72
- */
73
- searchParams?: URLSearchParamsInput;
74
- /**
75
- * Whether to throw a `FetchError` on HTTP errors (non-2xx responses)
76
- * @default true
77
- */
78
- throwOnFetchError: boolean;
79
- /**
80
- * Whether to throw a `ValidationError` on validation errors
81
- * @default true
82
- */
83
- throwOnValidationError: boolean;
84
- }
85
- /**
86
- * Type-safe fetch function with Standard Schema validation support
87
- */
88
- interface $Fetch {
89
- /**
90
- * Fetch with schema validation and throwOnValidationError: false
91
- * @param input - URL or path to fetch
92
- * @param schema - Standard Schema for response validation
93
- * @param options - Extended request options with throwOnValidationError: false
94
- * @returns Standard Schema Result object with value or issues
95
- * @throws {FetchError} When `throwOnFetchError` is `true` and the response is not ok.
96
- * @throws {TypeError} When request construction, JSON request serialization, headers,
97
- * search params, native `fetch`, or `response.json()` body reading fail with a
98
- * `TypeError`.
99
- * @throws {DOMException} When native `fetch` or `response.json()` rejects an aborted
100
- * request/body read as an `AbortError` DOMException.
101
- * @throws {SyntaxError} When `response.json()` cannot parse the response body.
102
- * @throws Any error thrown or rejected by the provided Standard Schema validator.
103
- */
104
- <TSchema extends StandardSchemaV1>(input: FetchInput, schema: TSchema, options: ExtendedRequestInit & {
105
- throwOnValidationError: false;
106
- }): Promise<StandardSchemaV1.Result<StandardSchemaV1.InferOutput<TSchema>>>;
107
- /**
108
- * Fetch with schema validation and throwOnValidationError: true or undefined (default)
109
- * @param input - URL or path to fetch
110
- * @param schema - Standard Schema for response validation
111
- * @param options - Extended request options
112
- * @returns Validated data of type TSchema
113
- * @throws {FetchError} When `throwOnFetchError` is `true` and the response is not ok.
114
- * @throws {ValidationError} When validation returns issues.
115
- * @throws {TypeError} When request construction, JSON request serialization, headers,
116
- * search params, native `fetch`, or `response.json()` body reading fail with a
117
- * `TypeError`.
118
- * @throws {DOMException} When native `fetch` or `response.json()` rejects an aborted
119
- * request/body read as an `AbortError` DOMException.
120
- * @throws {SyntaxError} When `response.json()` cannot parse the response body.
121
- * @throws Any error thrown or rejected by the provided Standard Schema validator.
122
- */
123
- <TSchema extends StandardSchemaV1>(input: FetchInput, schema: TSchema, options?: ExtendedRequestInit & {
124
- throwOnValidationError?: true;
125
- }): Promise<StandardSchemaV1.InferOutput<TSchema>>;
126
- /**
127
- * Fetch without schema validation
128
- * @param input - URL or path to fetch
129
- * @param options - Extended request options
130
- * @returns Raw Response object
131
- * @throws {FetchError} When `throwOnFetchError` is `true` and the response is not ok.
132
- * @throws {TypeError} When request construction, JSON request serialization, headers,
133
- * search params, or native `fetch` fail with a `TypeError`.
134
- * @throws {DOMException} When native `fetch` rejects an aborted request as an
135
- * `AbortError` DOMException.
136
- */
137
- (input: FetchInput, options?: ExtendedRequestInit): Promise<Response>;
138
- }
139
- /**
140
- * API HTTP method-specific fetch functions
141
- *
142
- * @example
143
- * const user = await api.get("/users/1", UserSchema);
144
- */
145
- interface ApiMethods {
146
- /**
147
- * DELETE method fetch function
148
- */
149
- delete: $Fetch;
150
- /**
151
- * GET method fetch function
152
- */
153
- get: $Fetch;
154
- /**
155
- * PATCH method fetch function
156
- */
157
- patch: $Fetch;
158
- /**
159
- * POST method fetch function
160
- */
161
- post: $Fetch;
162
- /**
163
- * PUT method fetch function
164
- */
165
- put: $Fetch;
166
- }
167
- //#endregion
168
- export { $Fetch, ApiMethods, ExtendedRequestInit, FetchDefaults, FetchInput };
169
- //# sourceMappingURL=types.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;AAWkD;KAAtC,UAAA,GAAa,UAAA,QAAkB,KAAA;AAAA,KAEtC,oBAAA,GAAuB,qBAAA,QAA6B,eAAA;AAAA,KAEpD,eAAA,GAAkB,WAAA;EACrB,IAAA;AAAA;AAAA,KAGG,YAAA,GAAe,IAAA,CAAK,WAAA;;;;AAHvB;EAQA,IAAA;EACA,IAAA;AAAA;AAAA,KAGG,iBAAA;;;;;EAKH,YAAA,GAAe,oBAAA;EARf;;;;EAaA,iBAAA;;;;;EAKA,sBAAA;AAAA;;;;;;;;;;;KAaU,mBAAA,IAAuB,eAAA,GAAkB,YAAA,IAAgB,iBAAA;;AAYrE;;;;;;;;;UAAiB,aAAA;;;;AA+BjB;EA1BE,OAAA;;;;;EAKA,OAAA,GAAU,WAAA;;;;;EAKV,YAAA,GAAe,oBAAA;;;;;EAKf,iBAAA;;;;;EAKA,sBAAA;AAAA;;;;UAMe,MAAA;;;;;;;;;;;;;;;;mBAgBE,gBAAA,EACf,KAAA,EAAO,UAAA,EACP,MAAA,EAAQ,OAAA,EACR,OAAA,EAAS,mBAAA;IAAwB,sBAAA;EAAA,IAChC,OAAA,CAAQ,gBAAA,CAAiB,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,OAAA;;;;;;;;;;;;;;;;AA8ClE;mBA5BmB,gBAAA,EACf,KAAA,EAAO,UAAA,EACP,MAAA,EAAQ,OAAA,EACR,OAAA,GAAU,mBAAA;IACR,sBAAA;EAAA,IAED,OAAA,CAAQ,gBAAA,CAAiB,WAAA,CAAY,OAAA;;;;;;;;;;;;GAavC,KAAA,EAAO,UAAA,EAAY,OAAA,GAAU,mBAAA,GAAsB,OAAA,CAAQ,QAAA;AAAA;;;;;;;UAS7C,UAAA;;;;EAIf,MAAA,EAAQ,MAAA;;;;EAIR,GAAA,EAAK,MAAA;;;;EAIL,KAAA,EAAO,MAAA;;;;EAIP,IAAA,EAAM,MAAA;;;;EAIN,GAAA,EAAK,MAAA;AAAA"}
package/dist/types.mjs DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/url.d.mts DELETED
@@ -1,27 +0,0 @@
1
- import { ExtendedRequestInit, FetchDefaults } from "./types.mjs";
2
-
3
- //#region src/url.d.ts
4
- /**
5
- * Resolves final request URL by applying baseURL and layered search params.
6
- *
7
- * Search param precedence:
8
- * 1. `defaults.searchParams`
9
- * 2. search params already present in `resourceUrl`
10
- * 3. per-request `searchParams`
11
- *
12
- * @example
13
- * const finalUrl = resolveRequestUrl(
14
- * "/users?page=2",
15
- * { ...defaults, baseURL: "https://api.example.com", searchParams: { locale: "en" } },
16
- * { page: "3" },
17
- * );
18
- * // https://api.example.com/users?locale=en&page=3
19
- *
20
- * @throws {TypeError} When `baseURL` and `resourceUrl` cannot be resolved by
21
- * `URL`, or when default/per-request search params cannot be converted by
22
- * `URLSearchParams`.
23
- */
24
- declare function resolveRequestUrl(resourceUrl: string, defaults: FetchDefaults, searchParams: ExtendedRequestInit["searchParams"] | undefined): string;
25
- //#endregion
26
- export { resolveRequestUrl };
27
- //# sourceMappingURL=url.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.d.mts","names":[],"sources":["../src/url.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;iBA4BgB,iBAAA,CACd,WAAA,UACA,QAAA,EAAU,aAAA,EACV,YAAA,EAAc,mBAAA"}
package/dist/url.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"url.mjs","names":[],"sources":["../src/url.ts"],"sourcesContent":["/**\n * URL resolution and query merging utilities.\n *\n * @module @zap-studio/fetch/url\n */\n\nimport type { ExtendedRequestInit, FetchDefaults } from \"./types.js\";\n\n/**\n * Resolves final request URL by applying baseURL and layered search params.\n *\n * Search param precedence:\n * 1. `defaults.searchParams`\n * 2. search params already present in `resourceUrl`\n * 3. per-request `searchParams`\n *\n * @example\n * const finalUrl = resolveRequestUrl(\n * \"/users?page=2\",\n * { ...defaults, baseURL: \"https://api.example.com\", searchParams: { locale: \"en\" } },\n * { page: \"3\" },\n * );\n * // https://api.example.com/users?locale=en&page=3\n *\n * @throws {TypeError} When `baseURL` and `resourceUrl` cannot be resolved by\n * `URL`, or when default/per-request search params cannot be converted by\n * `URLSearchParams`.\n */\nexport function resolveRequestUrl(\n resourceUrl: string,\n defaults: FetchDefaults,\n searchParams: ExtendedRequestInit[\"searchParams\"] | undefined,\n): string {\n const url = defaults.baseURL\n ? new URL(resourceUrl, ensureTrailingSlash(defaults.baseURL)).toString()\n : resourceUrl;\n\n return resolveSearchParams(url, defaults.searchParams, searchParams);\n}\n\n/**\n * Resolves search params by applying default params, URL params, then request params.\n */\nfunction resolveSearchParams(\n url: string,\n defaultSearchParams: FetchDefaults[\"searchParams\"] | undefined,\n searchParams: ExtendedRequestInit[\"searchParams\"] | undefined,\n): string {\n if (!defaultSearchParams && searchParams === undefined) {\n return url;\n }\n\n const hashIndex = url.indexOf(\"#\");\n const hasFragment = hashIndex >= 0;\n const urlWithoutHash = hasFragment ? url.slice(0, hashIndex) : url;\n const hash = hasFragment ? url.slice(hashIndex + 1) : \"\";\n const queryIndex = urlWithoutHash.indexOf(\"?\");\n const pathname = queryIndex >= 0 ? urlWithoutHash.slice(0, queryIndex) : urlWithoutHash;\n const urlSearchParams = queryIndex >= 0 ? urlWithoutHash.slice(queryIndex + 1) : undefined;\n const resolvedSearchParams = new URLSearchParams();\n\n mergeSearchParams(resolvedSearchParams, defaultSearchParams);\n mergeSearchParams(resolvedSearchParams, urlSearchParams);\n mergeSearchParams(resolvedSearchParams, searchParams);\n\n const resolvedSearch = resolvedSearchParams.toString();\n const fragmentSuffix = hasFragment ? `#${hash}` : \"\";\n\n if (!resolvedSearch) {\n return `${pathname}${fragmentSuffix}`;\n }\n\n return `${pathname}?${resolvedSearch}${fragmentSuffix}`;\n}\n\n/**\n * Ensures a URL has a trailing slash for relative URL resolution.\n */\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith(\"/\") ? url : `${url}/`;\n}\n\n/**\n * Copies search params into target, overriding duplicate keys.\n */\nfunction mergeSearchParams(\n target: URLSearchParams,\n source: ExtendedRequestInit[\"searchParams\"] | undefined,\n): void {\n for (const [key, value] of new URLSearchParams(source)) {\n target.set(key, value);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,kBACd,aACA,UACA,cACQ;AAKR,QAAO,oBAJK,SAAS,UACjB,IAAI,IAAI,aAAa,oBAAoB,SAAS,QAAQ,CAAC,CAAC,UAAU,GACtE,aAE4B,SAAS,cAAc,aAAa;;;;;AAMtE,SAAS,oBACP,KACA,qBACA,cACQ;AACR,KAAI,CAAC,uBAAuB,iBAAiB,KAAA,EAC3C,QAAO;CAGT,MAAM,YAAY,IAAI,QAAQ,IAAI;CAClC,MAAM,cAAc,aAAa;CACjC,MAAM,iBAAiB,cAAc,IAAI,MAAM,GAAG,UAAU,GAAG;CAC/D,MAAM,OAAO,cAAc,IAAI,MAAM,YAAY,EAAE,GAAG;CACtD,MAAM,aAAa,eAAe,QAAQ,IAAI;CAC9C,MAAM,WAAW,cAAc,IAAI,eAAe,MAAM,GAAG,WAAW,GAAG;CACzE,MAAM,kBAAkB,cAAc,IAAI,eAAe,MAAM,aAAa,EAAE,GAAG,KAAA;CACjF,MAAM,uBAAuB,IAAI,iBAAiB;AAElD,mBAAkB,sBAAsB,oBAAoB;AAC5D,mBAAkB,sBAAsB,gBAAgB;AACxD,mBAAkB,sBAAsB,aAAa;CAErD,MAAM,iBAAiB,qBAAqB,UAAU;CACtD,MAAM,iBAAiB,cAAc,IAAI,SAAS;AAElD,KAAI,CAAC,eACH,QAAO,GAAG,WAAW;AAGvB,QAAO,GAAG,SAAS,GAAG,iBAAiB;;;;;AAMzC,SAAS,oBAAoB,KAAqB;AAChD,QAAO,IAAI,SAAS,IAAI,GAAG,MAAM,GAAG,IAAI;;;;;AAM1C,SAAS,kBACP,QACA,QACM;AACN,MAAK,MAAM,CAAC,KAAK,UAAU,IAAI,gBAAgB,OAAO,CACpD,QAAO,IAAI,KAAK,MAAM"}