@zap-studio/fetch 0.5.4 → 0.5.5

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.
package/dist/url.d.mts CHANGED
@@ -1,27 +1,26 @@
1
1
  import { ExtendedRequestInit, FetchDefaults } from "./types.mjs";
2
-
3
2
  //#region src/url.d.ts
4
3
  /**
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;
4
+ * Resolves final request URL by applying baseURL and layered search params.
5
+ *
6
+ * Search param precedence:
7
+ * 1. `defaults.searchParams`
8
+ * 2. search params already present in `resourceUrl`
9
+ * 3. per-request `searchParams`
10
+ *
11
+ * @example
12
+ * const finalUrl = resolveRequestUrl(
13
+ * "/users?page=2",
14
+ * { ...defaults, baseURL: "https://api.example.com", searchParams: { locale: "en" } },
15
+ * { page: "3" },
16
+ * );
17
+ * // https://api.example.com/users?locale=en&page=3
18
+ *
19
+ * @throws {TypeError} When `baseURL` and `resourceUrl` cannot be resolved by
20
+ * `URL`, or when default/per-request search params cannot be converted by
21
+ * `URLSearchParams`.
22
+ */
23
+ declare const resolveRequestUrl: (resourceUrl: string, defaults: FetchDefaults, searchParams?: ExtendedRequestInit["searchParams"]) => string;
25
24
  //#endregion
26
25
  export { resolveRequestUrl };
27
26
  //# sourceMappingURL=url.d.mts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"url.d.mts","names":[],"sources":["../src/url.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;cAmFa,oBACX,qBACA,UAAU,eACV,eAAe"}
package/dist/url.mjs CHANGED
@@ -1,5 +1,36 @@
1
1
  //#region src/url.ts
2
2
  /**
3
+ * Copies search params into target, overriding duplicate keys.
4
+ */
5
+ const mergeSearchParams = (target, source) => {
6
+ for (const [key, value] of new URLSearchParams(source)) target.set(key, value);
7
+ };
8
+ /**
9
+ * Ensures a URL has a trailing slash for relative URL resolution.
10
+ */
11
+ const ensureTrailingSlash = (url) => url.endsWith("/") ? url : `${url}/`;
12
+ /**
13
+ * Resolves search params by applying default params, URL params, then request params.
14
+ */
15
+ const resolveSearchParams = (url, defaultSearchParams, searchParams) => {
16
+ if (defaultSearchParams === void 0 && searchParams === void 0) return url;
17
+ const hashIndex = url.indexOf("#");
18
+ const hasFragment = hashIndex !== -1;
19
+ const urlWithoutHash = hasFragment ? url.slice(0, hashIndex) : url;
20
+ const hash = hasFragment ? url.slice(hashIndex + 1) : "";
21
+ const queryIndex = urlWithoutHash.indexOf("?");
22
+ const pathname = queryIndex === -1 ? urlWithoutHash : urlWithoutHash.slice(0, queryIndex);
23
+ const urlSearchParams = queryIndex === -1 ? void 0 : urlWithoutHash.slice(queryIndex + 1);
24
+ const resolvedSearchParams = new URLSearchParams();
25
+ mergeSearchParams(resolvedSearchParams, defaultSearchParams);
26
+ mergeSearchParams(resolvedSearchParams, urlSearchParams);
27
+ mergeSearchParams(resolvedSearchParams, searchParams);
28
+ const resolvedSearch = resolvedSearchParams.toString();
29
+ const fragmentSuffix = hasFragment ? `#${hash}` : "";
30
+ if (resolvedSearch.length === 0) return `${pathname}${fragmentSuffix}`;
31
+ return `${pathname}?${resolvedSearch}${fragmentSuffix}`;
32
+ };
33
+ /**
3
34
  * Resolves final request URL by applying baseURL and layered search params.
4
35
  *
5
36
  * Search param precedence:
@@ -19,42 +50,10 @@
19
50
  * `URL`, or when default/per-request search params cannot be converted by
20
51
  * `URLSearchParams`.
21
52
  */
22
- function resolveRequestUrl(resourceUrl, defaults, searchParams) {
23
- return resolveSearchParams(defaults.baseURL ? new URL(resourceUrl, ensureTrailingSlash(defaults.baseURL)).toString() : resourceUrl, defaults.searchParams, searchParams);
24
- }
25
- /**
26
- * Resolves search params by applying default params, URL params, then request params.
27
- */
28
- function resolveSearchParams(url, defaultSearchParams, searchParams) {
29
- if (!defaultSearchParams && searchParams === void 0) return url;
30
- const hashIndex = url.indexOf("#");
31
- const hasFragment = hashIndex >= 0;
32
- const urlWithoutHash = hasFragment ? url.slice(0, hashIndex) : url;
33
- const hash = hasFragment ? url.slice(hashIndex + 1) : "";
34
- const queryIndex = urlWithoutHash.indexOf("?");
35
- const pathname = queryIndex >= 0 ? urlWithoutHash.slice(0, queryIndex) : urlWithoutHash;
36
- const urlSearchParams = queryIndex >= 0 ? urlWithoutHash.slice(queryIndex + 1) : void 0;
37
- const resolvedSearchParams = new URLSearchParams();
38
- mergeSearchParams(resolvedSearchParams, defaultSearchParams);
39
- mergeSearchParams(resolvedSearchParams, urlSearchParams);
40
- mergeSearchParams(resolvedSearchParams, searchParams);
41
- const resolvedSearch = resolvedSearchParams.toString();
42
- const fragmentSuffix = hasFragment ? `#${hash}` : "";
43
- if (!resolvedSearch) return `${pathname}${fragmentSuffix}`;
44
- return `${pathname}?${resolvedSearch}${fragmentSuffix}`;
45
- }
46
- /**
47
- * Ensures a URL has a trailing slash for relative URL resolution.
48
- */
49
- function ensureTrailingSlash(url) {
50
- return url.endsWith("/") ? url : `${url}/`;
51
- }
52
- /**
53
- * Copies search params into target, overriding duplicate keys.
54
- */
55
- function mergeSearchParams(target, source) {
56
- for (const [key, value] of new URLSearchParams(source)) target.set(key, value);
57
- }
53
+ const resolveRequestUrl = (resourceUrl, defaults, searchParams) => {
54
+ const url = defaults.baseURL ? new URL(resourceUrl, ensureTrailingSlash(defaults.baseURL)).toString() : resourceUrl;
55
+ return resolveSearchParams(url, defaults.searchParams, searchParams);
56
+ };
58
57
  //#endregion
59
58
  export { resolveRequestUrl };
60
59
 
package/dist/url.mjs.map CHANGED
@@ -1 +1 @@
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"}
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 * Copies search params into target, overriding duplicate keys.\n */\nconst 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\n/**\n * Ensures a URL has a trailing slash for relative URL resolution.\n */\nconst ensureTrailingSlash = (url: string): string =>\n url.endsWith(\"/\") ? url : `${url}/`;\n\n/**\n * Resolves search params by applying default params, URL params, then request params.\n */\nconst resolveSearchParams = (\n url: string,\n defaultSearchParams: FetchDefaults[\"searchParams\"] | undefined,\n searchParams: ExtendedRequestInit[\"searchParams\"] | undefined\n): string => {\n if (defaultSearchParams === undefined && searchParams === undefined) {\n return url;\n }\n\n const hashIndex = url.indexOf(\"#\");\n const hasFragment = hashIndex !== -1;\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 =\n queryIndex === -1 ? urlWithoutHash : urlWithoutHash.slice(0, queryIndex);\n const urlSearchParams =\n queryIndex === -1 ? undefined : urlWithoutHash.slice(queryIndex + 1);\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.length === 0) {\n return `${pathname}${fragmentSuffix}`;\n }\n\n return `${pathname}?${resolvedSearch}${fragmentSuffix}`;\n};\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 const resolveRequestUrl = (\n resourceUrl: string,\n defaults: FetchDefaults,\n searchParams?: ExtendedRequestInit[\"searchParams\"]\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"],"mappings":";;;;AAWA,MAAM,qBACJ,QACA,WACS;CACT,KAAK,MAAM,CAAC,KAAK,UAAU,IAAI,gBAAgB,MAAM,GACnD,OAAO,IAAI,KAAK,KAAK;AAEzB;;;;AAKA,MAAM,uBAAuB,QAC3B,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,IAAI;;;;AAKnC,MAAM,uBACJ,KACA,qBACA,iBACW;CACX,IAAI,wBAAwB,KAAA,KAAa,iBAAiB,KAAA,GACxD,OAAO;CAGT,MAAM,YAAY,IAAI,QAAQ,GAAG;CACjC,MAAM,cAAc,cAAc;CAClC,MAAM,iBAAiB,cAAc,IAAI,MAAM,GAAG,SAAS,IAAI;CAC/D,MAAM,OAAO,cAAc,IAAI,MAAM,YAAY,CAAC,IAAI;CACtD,MAAM,aAAa,eAAe,QAAQ,GAAG;CAC7C,MAAM,WACJ,eAAe,KAAK,iBAAiB,eAAe,MAAM,GAAG,UAAU;CACzE,MAAM,kBACJ,eAAe,KAAK,KAAA,IAAY,eAAe,MAAM,aAAa,CAAC;CACrE,MAAM,uBAAuB,IAAI,gBAAgB;CAEjD,kBAAkB,sBAAsB,mBAAmB;CAC3D,kBAAkB,sBAAsB,eAAe;CACvD,kBAAkB,sBAAsB,YAAY;CAEpD,MAAM,iBAAiB,qBAAqB,SAAS;CACrD,MAAM,iBAAiB,cAAc,IAAI,SAAS;CAElD,IAAI,eAAe,WAAW,GAC5B,OAAO,GAAG,WAAW;CAGvB,OAAO,GAAG,SAAS,GAAG,iBAAiB;AACzC;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,qBACX,aACA,UACA,iBACW;CACX,MAAM,MAAM,SAAS,UACjB,IAAI,IAAI,aAAa,oBAAoB,SAAS,OAAO,CAAC,CAAC,CAAC,SAAS,IACrE;CAEJ,OAAO,oBAAoB,KAAK,SAAS,cAAc,YAAY;AACrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zap-studio/fetch",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "private": false,
5
5
  "description": "A type-safe fetch wrapper for HTTP requests with runtime schema validation.",
6
6
  "keywords": [
@@ -52,26 +52,25 @@
52
52
  "access": "public"
53
53
  },
54
54
  "dependencies": {
55
- "@zap-studio/validation": "0.3.4"
55
+ "@zap-studio/validation": "0.3.5"
56
56
  },
57
57
  "devDependencies": {
58
- "@better-fetch/fetch": "^1.1.21",
59
- "arktype": "^2.2.0",
60
- "axios": "^1.15.2",
58
+ "@better-fetch/fetch": "^1.3.1",
59
+ "arktype": "^2.2.3",
60
+ "axios": "^1.18.1",
61
61
  "ky": "^2.0.2",
62
62
  "ofetch": "^1.5.1",
63
- "typescript": "^6.0.3",
64
- "valibot": "^1.3.1",
65
- "vite-plus": "^0.1.19",
66
- "zod": "^4.3.6",
63
+ "tsdown": "^0.22.4",
64
+ "typescript": "^7.0.2",
65
+ "valibot": "^1.4.2",
66
+ "vitest": "^4.1.10",
67
+ "zod": "^4.4.3",
67
68
  "@zap-studio/typescript": "0.0.0"
68
69
  },
69
70
  "engines": {
70
71
  "node": ">=18.0.0"
71
72
  },
72
73
  "scripts": {
73
- "build": "vp pack",
74
- "test": "vp test run",
75
- "test:watch": "vp test watch"
74
+ "build": "tsdown --config ./tsdown.config.ts"
76
75
  }
77
76
  }