@happy-ts/fetch-t 1.0.1 → 1.0.3

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/main.cjs CHANGED
@@ -15,7 +15,7 @@ function fetchT(url, init) {
15
15
  if (typeof url === "string") {
16
16
  assertUrl(url);
17
17
  }
18
- const { abortable = false, responseType = "text", ...rest } = init ?? {};
18
+ const { abortable = false, responseType, ...rest } = init ?? {};
19
19
  let controller;
20
20
  if (abortable) {
21
21
  controller = new AbortController();
@@ -43,7 +43,7 @@ function fetchT(url, init) {
43
43
  return happyRusty.Ok(await res.text());
44
44
  }
45
45
  default: {
46
- throw new Error("Invalid response type");
46
+ return happyRusty.Ok(res);
47
47
  }
48
48
  }
49
49
  }).catch((err) => {
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":["../src/fetch/assertions.ts","../src/fetch/fetch.ts"],"sourcesContent":["/**\n * assert function\n * @param expr\n * @param createMsg return a string message to throw\n */\nfunction invariant(expr: unknown, createMsg: () => string): void {\n if (!expr) {\n throw new TypeError(createMsg());\n }\n}\n\n/**\n * assert url is a string\n *\n * @param url\n */\nexport function assertUrl(url: string): void {\n invariant(typeof url === 'string', () => `Url must be a string. Received ${ JSON.stringify(url) }`);\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Err, Ok } from '@happy-js/happy-rusty';\nimport { assertUrl } from './assertions.ts';\nimport type { FetchInit, FetchResponse, FetchTask } from './defines.ts';\n\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'text',\n}): FetchTask<string>;\n/**\n * Return `FetchResponse<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'text',\n}): FetchResponse<string>;\n/**\n * Return `FetchTask<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'arraybuffer',\n}): FetchTask<ArrayBuffer>;\n/**\n * Return `FetchResponse<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'arraybuffer',\n}): FetchResponse<ArrayBuffer>;\n/**\n * Return `FetchTask<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'blob',\n}): FetchTask<Blob>;\n/**\n * Return `FetchResponse<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'blob',\n}): FetchResponse<Blob>;\n/**\n * Return `FetchTask<T>`.\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'json',\n}): FetchTask<T>;\n/**\n * Return `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit & {\n responseType: 'json',\n}): FetchResponse<T>;\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n}): FetchTask<string>;\n/**\n * Return `FetchResponse<string>`.\n */\nexport function fetchT(url: string | URL, init?: RequestInit): FetchResponse<string>;\n/**\n * Request the url and return the corresponding type based on the responseType.\n * @param url url to fetch\n * @param init fetch init\n * @returns {FetchTask} an abort able fetch task\n */\nexport function fetchT<T>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {\n if (typeof url === 'string') {\n assertUrl(url);\n }\n\n // default not abort able\n // default responseType is text\n const { abortable = false, responseType = 'text', ...rest } = init ?? {};\n\n let controller: AbortController;\n\n if (abortable) {\n controller = new AbortController();\n rest.signal = controller.signal;\n }\n\n const response: FetchResponse<T> = fetch(url, rest).then(async (res): FetchResponse<T> => {\n if (!res.ok) {\n return Err(new Error(`fetch status: ${ res.status }`));\n }\n\n switch (responseType) {\n case 'arraybuffer': {\n return Ok(await res.arrayBuffer() as T);\n }\n case 'blob': {\n return Ok(await res.blob() as T);\n }\n case 'json': {\n try {\n return Ok(await res.json() as T);\n } catch {\n return Err(new Error('Response is invalid json while responseType is json'));\n }\n }\n case 'text': {\n return Ok(await res.text() as T);\n }\n default: {\n throw new Error('Invalid response type');\n }\n }\n }).catch((err) => {\n return Err(err);\n });\n\n if (abortable) {\n return {\n abort(reason?: any): void {\n controller.abort(reason);\n },\n get aborted(): boolean {\n return controller.signal.aborted;\n },\n response,\n };\n } else {\n return response;\n }\n}"],"names":["Err","Ok"],"mappings":";;;;AAKA,SAAS,SAAA,CAAU,MAAe,SAA+B,EAAA;AAC7D,EAAA,IAAI,CAAC,IAAM,EAAA;AACP,IAAM,MAAA,IAAI,SAAU,CAAA,SAAA,EAAW,CAAA,CAAA;AAAA,GACnC;AACJ,CAAA;AAOO,SAAS,UAAU,GAAmB,EAAA;AACzC,EAAU,SAAA,CAAA,OAAO,QAAQ,QAAU,EAAA,MAAM,kCAAmC,IAAK,CAAA,SAAA,CAAU,GAAG,CAAE,CAAE,CAAA,CAAA,CAAA;AACtG;;ACuEgB,SAAA,MAAA,CAAU,KAAmB,IAAmD,EAAA;AAC5F,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AACzB,IAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,GACjB;AAIA,EAAM,MAAA,EAAE,YAAY,KAAO,EAAA,YAAA,GAAe,QAAQ,GAAG,IAAA,EAAS,GAAA,IAAA,IAAQ,EAAC,CAAA;AAEvE,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACX,IAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,UAAW,CAAA,MAAA,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,WAA6B,KAAM,CAAA,GAAA,EAAK,IAAI,CAAE,CAAA,IAAA,CAAK,OAAO,GAA0B,KAAA;AACtF,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACT,MAAA,OAAOA,eAAI,IAAI,KAAA,CAAM,iBAAkB,GAAI,CAAA,MAAO,EAAE,CAAC,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,QAAQ,YAAc;AAAA,MAClB,KAAK,aAAe,EAAA;AAChB,QAAA,OAAOC,aAAG,CAAA,MAAM,GAAI,CAAA,WAAA,EAAkB,CAAA,CAAA;AAAA,OAC1C;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAOA,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAI,IAAA;AACA,UAAA,OAAOA,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,SAC3B,CAAA,MAAA;AACJ,UAAA,OAAOD,cAAI,CAAA,IAAI,KAAM,CAAA,qDAAqD,CAAC,CAAA,CAAA;AAAA,SAC/E;AAAA,OACJ;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAOC,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,SAAS;AACL,QAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,OAC3C;AAAA,KACJ;AAAA,GACH,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AACd,IAAA,OAAOD,eAAI,GAAG,CAAA,CAAA;AAAA,GACjB,CAAA,CAAA;AAED,EAAA,IAAI,SAAW,EAAA;AACX,IAAO,OAAA;AAAA,MACH,MAAM,MAAoB,EAAA;AACtB,QAAA,UAAA,CAAW,MAAM,MAAM,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,IAAI,OAAmB,GAAA;AACnB,QAAA,OAAO,WAAW,MAAO,CAAA,OAAA,CAAA;AAAA,OAC7B;AAAA,MACA,QAAA;AAAA,KACJ,CAAA;AAAA,GACG,MAAA;AACH,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AACJ;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":["../src/fetch/assertions.ts","../src/fetch/fetch.ts"],"sourcesContent":["/**\n * assert function\n * @param expr\n * @param createMsg return a string message to throw\n */\nfunction invariant(expr: unknown, createMsg: () => string): void {\n if (!expr) {\n throw new TypeError(createMsg());\n }\n}\n\n/**\n * assert url is a string\n *\n * @param url\n */\nexport function assertUrl(url: string): void {\n invariant(typeof url === 'string', () => `Url must be a string. Received ${ JSON.stringify(url) }`);\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Err, Ok } from '@happy-js/happy-rusty';\nimport { assertUrl } from './assertions.ts';\nimport type { FetchInit, FetchResponse, FetchTask } from './defines.ts';\n\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'text';\n}): FetchTask<string>;\n/**\n * Return `FetchTask<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'arraybuffer';\n}): FetchTask<ArrayBuffer>;\n/**\n * Return `FetchTask<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'blob';\n}): FetchTask<Blob>;\n/**\n * Return `FetchTask<T>`.\n */\nexport function fetchT<T>(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'json';\n}): FetchTask<T>;\n/**\n * Return `FetchResponse<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'text';\n}): FetchResponse<string>;\n/**\n * Return `FetchResponse<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'arraybuffer';\n}): FetchResponse<ArrayBuffer>;\n/**\n * Return `FetchResponse<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'blob';\n}): FetchResponse<Blob>;\n/**\n * Return `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T>(url: string | URL, init: FetchInit & {\n responseType: 'json';\n}): FetchResponse<T>;\n/**\n * Return `FetchTask<Response>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n}): FetchTask<Response>;\n/**\n * Return `FetchTask<T>` or `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit): FetchTask<T> | FetchResponse<T>;\n/**\n * Return `FetchResponse<Response>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init?: RequestInit): FetchResponse<Response>;\n/**\n * Request the url and return the corresponding type based on the responseType.\n * @param url url to fetch\n * @param init fetch init\n * @returns {FetchTask<T> | FetchResponse<T>} an abort able fetch task or just response\n */\nexport function fetchT<T = any>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {\n if (typeof url === 'string') {\n assertUrl(url);\n }\n\n // default not abort able\n const { abortable = false, responseType, ...rest } = init ?? {};\n\n let controller: AbortController;\n\n if (abortable) {\n controller = new AbortController();\n rest.signal = controller.signal;\n }\n\n const response: FetchResponse<T> = fetch(url, rest).then(async (res): FetchResponse<T> => {\n if (!res.ok) {\n return Err(new Error(`fetch status: ${ res.status }`));\n }\n\n switch (responseType) {\n case 'arraybuffer': {\n return Ok(await res.arrayBuffer() as T);\n }\n case 'blob': {\n return Ok(await res.blob() as T);\n }\n case 'json': {\n try {\n return Ok(await res.json() as T);\n } catch {\n return Err(new Error('Response is invalid json while responseType is json'));\n }\n }\n case 'text': {\n return Ok(await res.text() as T);\n }\n default: {\n // default return the Response object\n return Ok(res as T);\n }\n }\n }).catch((err) => {\n return Err(err);\n });\n\n if (abortable) {\n return {\n abort(reason?: any): void {\n controller.abort(reason);\n },\n get aborted(): boolean {\n return controller.signal.aborted;\n },\n response,\n };\n } else {\n return response;\n }\n}"],"names":["Err","Ok"],"mappings":";;;;AAKA,SAAS,SAAA,CAAU,MAAe,SAA+B,EAAA;AAC7D,EAAA,IAAI,CAAC,IAAM,EAAA;AACP,IAAM,MAAA,IAAI,SAAU,CAAA,SAAA,EAAW,CAAA,CAAA;AAAA,GACnC;AACJ,CAAA;AAOO,SAAS,UAAU,GAAmB,EAAA;AACzC,EAAU,SAAA,CAAA,OAAO,QAAQ,QAAU,EAAA,MAAM,kCAAmC,IAAK,CAAA,SAAA,CAAU,GAAG,CAAE,CAAE,CAAA,CAAA,CAAA;AACtG;;AC+EgB,SAAA,MAAA,CAAgB,KAAmB,IAAmD,EAAA;AAClG,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AACzB,IAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,GACjB;AAGA,EAAM,MAAA,EAAE,YAAY,KAAO,EAAA,YAAA,EAAc,GAAG,IAAK,EAAA,GAAI,QAAQ,EAAC,CAAA;AAE9D,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACX,IAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,UAAW,CAAA,MAAA,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,WAA6B,KAAM,CAAA,GAAA,EAAK,IAAI,CAAE,CAAA,IAAA,CAAK,OAAO,GAA0B,KAAA;AACtF,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACT,MAAA,OAAOA,eAAI,IAAI,KAAA,CAAM,iBAAkB,GAAI,CAAA,MAAO,EAAE,CAAC,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,QAAQ,YAAc;AAAA,MAClB,KAAK,aAAe,EAAA;AAChB,QAAA,OAAOC,aAAG,CAAA,MAAM,GAAI,CAAA,WAAA,EAAkB,CAAA,CAAA;AAAA,OAC1C;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAOA,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAI,IAAA;AACA,UAAA,OAAOA,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,SAC3B,CAAA,MAAA;AACJ,UAAA,OAAOD,cAAI,CAAA,IAAI,KAAM,CAAA,qDAAqD,CAAC,CAAA,CAAA;AAAA,SAC/E;AAAA,OACJ;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAOC,aAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,SAAS;AAEL,QAAA,OAAOA,cAAG,GAAQ,CAAA,CAAA;AAAA,OACtB;AAAA,KACJ;AAAA,GACH,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AACd,IAAA,OAAOD,eAAI,GAAG,CAAA,CAAA;AAAA,GACjB,CAAA,CAAA;AAED,EAAA,IAAI,SAAW,EAAA;AACX,IAAO,OAAA;AAAA,MACH,MAAM,MAAoB,EAAA;AACtB,QAAA,UAAA,CAAW,MAAM,MAAM,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,IAAI,OAAmB,GAAA;AACnB,QAAA,OAAO,WAAW,MAAO,CAAA,OAAA,CAAA;AAAA,OAC7B;AAAA,MACA,QAAA;AAAA,KACJ,CAAA;AAAA,GACG,MAAA;AACH,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AACJ;;;;"}
package/dist/main.mjs CHANGED
@@ -13,7 +13,7 @@ function fetchT(url, init) {
13
13
  if (typeof url === "string") {
14
14
  assertUrl(url);
15
15
  }
16
- const { abortable = false, responseType = "text", ...rest } = init ?? {};
16
+ const { abortable = false, responseType, ...rest } = init ?? {};
17
17
  let controller;
18
18
  if (abortable) {
19
19
  controller = new AbortController();
@@ -41,7 +41,7 @@ function fetchT(url, init) {
41
41
  return Ok(await res.text());
42
42
  }
43
43
  default: {
44
- throw new Error("Invalid response type");
44
+ return Ok(res);
45
45
  }
46
46
  }
47
47
  }).catch((err) => {
package/dist/main.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":["../src/fetch/assertions.ts","../src/fetch/fetch.ts"],"sourcesContent":["/**\n * assert function\n * @param expr\n * @param createMsg return a string message to throw\n */\nfunction invariant(expr: unknown, createMsg: () => string): void {\n if (!expr) {\n throw new TypeError(createMsg());\n }\n}\n\n/**\n * assert url is a string\n *\n * @param url\n */\nexport function assertUrl(url: string): void {\n invariant(typeof url === 'string', () => `Url must be a string. Received ${ JSON.stringify(url) }`);\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Err, Ok } from '@happy-js/happy-rusty';\nimport { assertUrl } from './assertions.ts';\nimport type { FetchInit, FetchResponse, FetchTask } from './defines.ts';\n\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'text',\n}): FetchTask<string>;\n/**\n * Return `FetchResponse<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'text',\n}): FetchResponse<string>;\n/**\n * Return `FetchTask<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'arraybuffer',\n}): FetchTask<ArrayBuffer>;\n/**\n * Return `FetchResponse<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'arraybuffer',\n}): FetchResponse<ArrayBuffer>;\n/**\n * Return `FetchTask<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'blob',\n}): FetchTask<Blob>;\n/**\n * Return `FetchResponse<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'blob',\n}): FetchResponse<Blob>;\n/**\n * Return `FetchTask<T>`.\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit & {\n abortable: true,\n responseType: 'json',\n}): FetchTask<T>;\n/**\n * Return `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit & {\n responseType: 'json',\n}): FetchResponse<T>;\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true,\n}): FetchTask<string>;\n/**\n * Return `FetchResponse<string>`.\n */\nexport function fetchT(url: string | URL, init?: RequestInit): FetchResponse<string>;\n/**\n * Request the url and return the corresponding type based on the responseType.\n * @param url url to fetch\n * @param init fetch init\n * @returns {FetchTask} an abort able fetch task\n */\nexport function fetchT<T>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {\n if (typeof url === 'string') {\n assertUrl(url);\n }\n\n // default not abort able\n // default responseType is text\n const { abortable = false, responseType = 'text', ...rest } = init ?? {};\n\n let controller: AbortController;\n\n if (abortable) {\n controller = new AbortController();\n rest.signal = controller.signal;\n }\n\n const response: FetchResponse<T> = fetch(url, rest).then(async (res): FetchResponse<T> => {\n if (!res.ok) {\n return Err(new Error(`fetch status: ${ res.status }`));\n }\n\n switch (responseType) {\n case 'arraybuffer': {\n return Ok(await res.arrayBuffer() as T);\n }\n case 'blob': {\n return Ok(await res.blob() as T);\n }\n case 'json': {\n try {\n return Ok(await res.json() as T);\n } catch {\n return Err(new Error('Response is invalid json while responseType is json'));\n }\n }\n case 'text': {\n return Ok(await res.text() as T);\n }\n default: {\n throw new Error('Invalid response type');\n }\n }\n }).catch((err) => {\n return Err(err);\n });\n\n if (abortable) {\n return {\n abort(reason?: any): void {\n controller.abort(reason);\n },\n get aborted(): boolean {\n return controller.signal.aborted;\n },\n response,\n };\n } else {\n return response;\n }\n}"],"names":[],"mappings":";;AAKA,SAAS,SAAA,CAAU,MAAe,SAA+B,EAAA;AAC7D,EAAA,IAAI,CAAC,IAAM,EAAA;AACP,IAAM,MAAA,IAAI,SAAU,CAAA,SAAA,EAAW,CAAA,CAAA;AAAA,GACnC;AACJ,CAAA;AAOO,SAAS,UAAU,GAAmB,EAAA;AACzC,EAAU,SAAA,CAAA,OAAO,QAAQ,QAAU,EAAA,MAAM,kCAAmC,IAAK,CAAA,SAAA,CAAU,GAAG,CAAE,CAAE,CAAA,CAAA,CAAA;AACtG;;ACuEgB,SAAA,MAAA,CAAU,KAAmB,IAAmD,EAAA;AAC5F,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AACzB,IAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,GACjB;AAIA,EAAM,MAAA,EAAE,YAAY,KAAO,EAAA,YAAA,GAAe,QAAQ,GAAG,IAAA,EAAS,GAAA,IAAA,IAAQ,EAAC,CAAA;AAEvE,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACX,IAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,UAAW,CAAA,MAAA,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,WAA6B,KAAM,CAAA,GAAA,EAAK,IAAI,CAAE,CAAA,IAAA,CAAK,OAAO,GAA0B,KAAA;AACtF,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACT,MAAA,OAAO,IAAI,IAAI,KAAA,CAAM,iBAAkB,GAAI,CAAA,MAAO,EAAE,CAAC,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,QAAQ,YAAc;AAAA,MAClB,KAAK,aAAe,EAAA;AAChB,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,WAAA,EAAkB,CAAA,CAAA;AAAA,OAC1C;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAI,IAAA;AACA,UAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,SAC3B,CAAA,MAAA;AACJ,UAAA,OAAO,GAAI,CAAA,IAAI,KAAM,CAAA,qDAAqD,CAAC,CAAA,CAAA;AAAA,SAC/E;AAAA,OACJ;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,SAAS;AACL,QAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;AAAA,OAC3C;AAAA,KACJ;AAAA,GACH,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AACd,IAAA,OAAO,IAAI,GAAG,CAAA,CAAA;AAAA,GACjB,CAAA,CAAA;AAED,EAAA,IAAI,SAAW,EAAA;AACX,IAAO,OAAA;AAAA,MACH,MAAM,MAAoB,EAAA;AACtB,QAAA,UAAA,CAAW,MAAM,MAAM,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,IAAI,OAAmB,GAAA;AACnB,QAAA,OAAO,WAAW,MAAO,CAAA,OAAA,CAAA;AAAA,OAC7B;AAAA,MACA,QAAA;AAAA,KACJ,CAAA;AAAA,GACG,MAAA;AACH,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AACJ;;;;"}
1
+ {"version":3,"file":"main.mjs","sources":["../src/fetch/assertions.ts","../src/fetch/fetch.ts"],"sourcesContent":["/**\n * assert function\n * @param expr\n * @param createMsg return a string message to throw\n */\nfunction invariant(expr: unknown, createMsg: () => string): void {\n if (!expr) {\n throw new TypeError(createMsg());\n }\n}\n\n/**\n * assert url is a string\n *\n * @param url\n */\nexport function assertUrl(url: string): void {\n invariant(typeof url === 'string', () => `Url must be a string. Received ${ JSON.stringify(url) }`);\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Err, Ok } from '@happy-js/happy-rusty';\nimport { assertUrl } from './assertions.ts';\nimport type { FetchInit, FetchResponse, FetchTask } from './defines.ts';\n\n/**\n * Return `FetchTask<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'text';\n}): FetchTask<string>;\n/**\n * Return `FetchTask<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'arraybuffer';\n}): FetchTask<ArrayBuffer>;\n/**\n * Return `FetchTask<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'blob';\n}): FetchTask<Blob>;\n/**\n * Return `FetchTask<T>`.\n */\nexport function fetchT<T>(url: string | URL, init: FetchInit & {\n abortable: true;\n responseType: 'json';\n}): FetchTask<T>;\n/**\n * Return `FetchResponse<string>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'text';\n}): FetchResponse<string>;\n/**\n * Return `FetchResponse<ArrayBuffer>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'arraybuffer';\n}): FetchResponse<ArrayBuffer>;\n/**\n * Return `FetchResponse<Blob>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n responseType: 'blob';\n}): FetchResponse<Blob>;\n/**\n * Return `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T>(url: string | URL, init: FetchInit & {\n responseType: 'json';\n}): FetchResponse<T>;\n/**\n * Return `FetchTask<Response>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init: FetchInit & {\n abortable: true;\n}): FetchTask<Response>;\n/**\n * Return `FetchTask<T>` or `FetchResponse<T>`.\n * @param url\n * @param init\n */\nexport function fetchT<T = any>(url: string | URL, init: FetchInit): FetchTask<T> | FetchResponse<T>;\n/**\n * Return `FetchResponse<Response>`.\n * @param url\n * @param init\n */\nexport function fetchT(url: string | URL, init?: RequestInit): FetchResponse<Response>;\n/**\n * Request the url and return the corresponding type based on the responseType.\n * @param url url to fetch\n * @param init fetch init\n * @returns {FetchTask<T> | FetchResponse<T>} an abort able fetch task or just response\n */\nexport function fetchT<T = any>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {\n if (typeof url === 'string') {\n assertUrl(url);\n }\n\n // default not abort able\n const { abortable = false, responseType, ...rest } = init ?? {};\n\n let controller: AbortController;\n\n if (abortable) {\n controller = new AbortController();\n rest.signal = controller.signal;\n }\n\n const response: FetchResponse<T> = fetch(url, rest).then(async (res): FetchResponse<T> => {\n if (!res.ok) {\n return Err(new Error(`fetch status: ${ res.status }`));\n }\n\n switch (responseType) {\n case 'arraybuffer': {\n return Ok(await res.arrayBuffer() as T);\n }\n case 'blob': {\n return Ok(await res.blob() as T);\n }\n case 'json': {\n try {\n return Ok(await res.json() as T);\n } catch {\n return Err(new Error('Response is invalid json while responseType is json'));\n }\n }\n case 'text': {\n return Ok(await res.text() as T);\n }\n default: {\n // default return the Response object\n return Ok(res as T);\n }\n }\n }).catch((err) => {\n return Err(err);\n });\n\n if (abortable) {\n return {\n abort(reason?: any): void {\n controller.abort(reason);\n },\n get aborted(): boolean {\n return controller.signal.aborted;\n },\n response,\n };\n } else {\n return response;\n }\n}"],"names":[],"mappings":";;AAKA,SAAS,SAAA,CAAU,MAAe,SAA+B,EAAA;AAC7D,EAAA,IAAI,CAAC,IAAM,EAAA;AACP,IAAM,MAAA,IAAI,SAAU,CAAA,SAAA,EAAW,CAAA,CAAA;AAAA,GACnC;AACJ,CAAA;AAOO,SAAS,UAAU,GAAmB,EAAA;AACzC,EAAU,SAAA,CAAA,OAAO,QAAQ,QAAU,EAAA,MAAM,kCAAmC,IAAK,CAAA,SAAA,CAAU,GAAG,CAAE,CAAE,CAAA,CAAA,CAAA;AACtG;;AC+EgB,SAAA,MAAA,CAAgB,KAAmB,IAAmD,EAAA;AAClG,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AACzB,IAAA,SAAA,CAAU,GAAG,CAAA,CAAA;AAAA,GACjB;AAGA,EAAM,MAAA,EAAE,YAAY,KAAO,EAAA,YAAA,EAAc,GAAG,IAAK,EAAA,GAAI,QAAQ,EAAC,CAAA;AAE9D,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,IAAI,SAAW,EAAA;AACX,IAAA,UAAA,GAAa,IAAI,eAAgB,EAAA,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,UAAW,CAAA,MAAA,CAAA;AAAA,GAC7B;AAEA,EAAA,MAAM,WAA6B,KAAM,CAAA,GAAA,EAAK,IAAI,CAAE,CAAA,IAAA,CAAK,OAAO,GAA0B,KAAA;AACtF,IAAI,IAAA,CAAC,IAAI,EAAI,EAAA;AACT,MAAA,OAAO,IAAI,IAAI,KAAA,CAAM,iBAAkB,GAAI,CAAA,MAAO,EAAE,CAAC,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,QAAQ,YAAc;AAAA,MAClB,KAAK,aAAe,EAAA;AAChB,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,WAAA,EAAkB,CAAA,CAAA;AAAA,OAC1C;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAI,IAAA;AACA,UAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,SAC3B,CAAA,MAAA;AACJ,UAAA,OAAO,GAAI,CAAA,IAAI,KAAM,CAAA,qDAAqD,CAAC,CAAA,CAAA;AAAA,SAC/E;AAAA,OACJ;AAAA,MACA,KAAK,MAAQ,EAAA;AACT,QAAA,OAAO,EAAG,CAAA,MAAM,GAAI,CAAA,IAAA,EAAW,CAAA,CAAA;AAAA,OACnC;AAAA,MACA,SAAS;AAEL,QAAA,OAAO,GAAG,GAAQ,CAAA,CAAA;AAAA,OACtB;AAAA,KACJ;AAAA,GACH,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AACd,IAAA,OAAO,IAAI,GAAG,CAAA,CAAA;AAAA,GACjB,CAAA,CAAA;AAED,EAAA,IAAI,SAAW,EAAA;AACX,IAAO,OAAA;AAAA,MACH,MAAM,MAAoB,EAAA;AACtB,QAAA,UAAA,CAAW,MAAM,MAAM,CAAA,CAAA;AAAA,OAC3B;AAAA,MACA,IAAI,OAAmB,GAAA;AACnB,QAAA,OAAO,WAAW,MAAO,CAAA,OAAA,CAAA;AAAA,OAC7B;AAAA,MACA,QAAA;AAAA,KACJ,CAAA;AAAA,GACG,MAAA;AACH,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AACJ;;;;"}
package/dist/types.d.ts CHANGED
@@ -46,39 +46,46 @@ declare function fetchT(url: string | URL, init: FetchInit & {
46
46
  responseType: 'text';
47
47
  }): FetchTask<string>;
48
48
  /**
49
- * Return `FetchResponse<string>`.
49
+ * Return `FetchTask<ArrayBuffer>`.
50
50
  * @param url
51
51
  * @param init
52
52
  */
53
53
  declare function fetchT(url: string | URL, init: FetchInit & {
54
- responseType: 'text';
55
- }): FetchResponse<string>;
54
+ abortable: true;
55
+ responseType: 'arraybuffer';
56
+ }): FetchTask<ArrayBuffer>;
56
57
  /**
57
- * Return `FetchTask<ArrayBuffer>`.
58
+ * Return `FetchTask<Blob>`.
58
59
  * @param url
59
60
  * @param init
60
61
  */
61
62
  declare function fetchT(url: string | URL, init: FetchInit & {
62
63
  abortable: true;
63
- responseType: 'arraybuffer';
64
- }): FetchTask<ArrayBuffer>;
64
+ responseType: 'blob';
65
+ }): FetchTask<Blob>;
65
66
  /**
66
- * Return `FetchResponse<ArrayBuffer>`.
67
+ * Return `FetchTask<T>`.
68
+ */
69
+ declare function fetchT<T>(url: string | URL, init: FetchInit & {
70
+ abortable: true;
71
+ responseType: 'json';
72
+ }): FetchTask<T>;
73
+ /**
74
+ * Return `FetchResponse<string>`.
67
75
  * @param url
68
76
  * @param init
69
77
  */
70
78
  declare function fetchT(url: string | URL, init: FetchInit & {
71
- responseType: 'arraybuffer';
72
- }): FetchResponse<ArrayBuffer>;
79
+ responseType: 'text';
80
+ }): FetchResponse<string>;
73
81
  /**
74
- * Return `FetchTask<Blob>`.
82
+ * Return `FetchResponse<ArrayBuffer>`.
75
83
  * @param url
76
84
  * @param init
77
85
  */
78
86
  declare function fetchT(url: string | URL, init: FetchInit & {
79
- abortable: true;
80
- responseType: 'blob';
81
- }): FetchTask<Blob>;
87
+ responseType: 'arraybuffer';
88
+ }): FetchResponse<ArrayBuffer>;
82
89
  /**
83
90
  * Return `FetchResponse<Blob>`.
84
91
  * @param url
@@ -87,33 +94,34 @@ declare function fetchT(url: string | URL, init: FetchInit & {
87
94
  declare function fetchT(url: string | URL, init: FetchInit & {
88
95
  responseType: 'blob';
89
96
  }): FetchResponse<Blob>;
90
- /**
91
- * Return `FetchTask<T>`.
92
- */
93
- declare function fetchT<T = any>(url: string | URL, init: FetchInit & {
94
- abortable: true;
95
- responseType: 'json';
96
- }): FetchTask<T>;
97
97
  /**
98
98
  * Return `FetchResponse<T>`.
99
99
  * @param url
100
100
  * @param init
101
101
  */
102
- declare function fetchT<T = any>(url: string | URL, init: FetchInit & {
102
+ declare function fetchT<T>(url: string | URL, init: FetchInit & {
103
103
  responseType: 'json';
104
104
  }): FetchResponse<T>;
105
105
  /**
106
- * Return `FetchTask<string>`.
106
+ * Return `FetchTask<Response>`.
107
107
  * @param url
108
108
  * @param init
109
109
  */
110
110
  declare function fetchT(url: string | URL, init: FetchInit & {
111
111
  abortable: true;
112
- }): FetchTask<string>;
112
+ }): FetchTask<Response>;
113
113
  /**
114
- * Return `FetchResponse<string>`.
114
+ * Return `FetchTask<T>` or `FetchResponse<T>`.
115
+ * @param url
116
+ * @param init
117
+ */
118
+ declare function fetchT<T = any>(url: string | URL, init: FetchInit): FetchTask<T> | FetchResponse<T>;
119
+ /**
120
+ * Return `FetchResponse<Response>`.
121
+ * @param url
122
+ * @param init
115
123
  */
116
- declare function fetchT(url: string | URL, init?: RequestInit): FetchResponse<string>;
124
+ declare function fetchT(url: string | URL, init?: RequestInit): FetchResponse<Response>;
117
125
 
118
- export { type FetchInit, type FetchTask, fetchT };
126
+ export { type FetchInit, type FetchResponse, type FetchTask, fetchT };
119
127
  //# sourceMappingURL=types.d.ts.map
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Cancelable fetch wrapper with the ability to specify the return type.",
4
4
  "author": "jiang115jie@gmail.com",
5
5
  "license": "GPL-3.0",
6
- "version": "1.0.1",
6
+ "version": "1.0.3",
7
7
  "type": "module",
8
8
  "source": "./src/mod.ts",
9
9
  "main": "./dist/main.cjs",
@@ -9,92 +9,99 @@ import type { FetchInit, FetchResponse, FetchTask } from './defines.ts';
9
9
  * @param init
10
10
  */
11
11
  export function fetchT(url: string | URL, init: FetchInit & {
12
- abortable: true,
13
- responseType: 'text',
12
+ abortable: true;
13
+ responseType: 'text';
14
14
  }): FetchTask<string>;
15
15
  /**
16
- * Return `FetchResponse<string>`.
16
+ * Return `FetchTask<ArrayBuffer>`.
17
17
  * @param url
18
18
  * @param init
19
19
  */
20
20
  export function fetchT(url: string | URL, init: FetchInit & {
21
- responseType: 'text',
22
- }): FetchResponse<string>;
21
+ abortable: true;
22
+ responseType: 'arraybuffer';
23
+ }): FetchTask<ArrayBuffer>;
23
24
  /**
24
- * Return `FetchTask<ArrayBuffer>`.
25
+ * Return `FetchTask<Blob>`.
25
26
  * @param url
26
27
  * @param init
27
28
  */
28
29
  export function fetchT(url: string | URL, init: FetchInit & {
29
- abortable: true,
30
- responseType: 'arraybuffer',
31
- }): FetchTask<ArrayBuffer>;
30
+ abortable: true;
31
+ responseType: 'blob';
32
+ }): FetchTask<Blob>;
32
33
  /**
33
- * Return `FetchResponse<ArrayBuffer>`.
34
+ * Return `FetchTask<T>`.
35
+ */
36
+ export function fetchT<T>(url: string | URL, init: FetchInit & {
37
+ abortable: true;
38
+ responseType: 'json';
39
+ }): FetchTask<T>;
40
+ /**
41
+ * Return `FetchResponse<string>`.
34
42
  * @param url
35
43
  * @param init
36
44
  */
37
45
  export function fetchT(url: string | URL, init: FetchInit & {
38
- responseType: 'arraybuffer',
39
- }): FetchResponse<ArrayBuffer>;
46
+ responseType: 'text';
47
+ }): FetchResponse<string>;
40
48
  /**
41
- * Return `FetchTask<Blob>`.
49
+ * Return `FetchResponse<ArrayBuffer>`.
42
50
  * @param url
43
51
  * @param init
44
52
  */
45
53
  export function fetchT(url: string | URL, init: FetchInit & {
46
- abortable: true,
47
- responseType: 'blob',
48
- }): FetchTask<Blob>;
54
+ responseType: 'arraybuffer';
55
+ }): FetchResponse<ArrayBuffer>;
49
56
  /**
50
57
  * Return `FetchResponse<Blob>`.
51
58
  * @param url
52
59
  * @param init
53
60
  */
54
61
  export function fetchT(url: string | URL, init: FetchInit & {
55
- responseType: 'blob',
62
+ responseType: 'blob';
56
63
  }): FetchResponse<Blob>;
57
- /**
58
- * Return `FetchTask<T>`.
59
- */
60
- export function fetchT<T = any>(url: string | URL, init: FetchInit & {
61
- abortable: true,
62
- responseType: 'json',
63
- }): FetchTask<T>;
64
64
  /**
65
65
  * Return `FetchResponse<T>`.
66
66
  * @param url
67
67
  * @param init
68
68
  */
69
- export function fetchT<T = any>(url: string | URL, init: FetchInit & {
70
- responseType: 'json',
69
+ export function fetchT<T>(url: string | URL, init: FetchInit & {
70
+ responseType: 'json';
71
71
  }): FetchResponse<T>;
72
72
  /**
73
- * Return `FetchTask<string>`.
73
+ * Return `FetchTask<Response>`.
74
74
  * @param url
75
75
  * @param init
76
76
  */
77
77
  export function fetchT(url: string | URL, init: FetchInit & {
78
- abortable: true,
79
- }): FetchTask<string>;
78
+ abortable: true;
79
+ }): FetchTask<Response>;
80
80
  /**
81
- * Return `FetchResponse<string>`.
81
+ * Return `FetchTask<T>` or `FetchResponse<T>`.
82
+ * @param url
83
+ * @param init
84
+ */
85
+ export function fetchT<T = any>(url: string | URL, init: FetchInit): FetchTask<T> | FetchResponse<T>;
86
+ /**
87
+ * Return `FetchResponse<Response>`.
88
+ * @param url
89
+ * @param init
82
90
  */
83
- export function fetchT(url: string | URL, init?: RequestInit): FetchResponse<string>;
91
+ export function fetchT(url: string | URL, init?: RequestInit): FetchResponse<Response>;
84
92
  /**
85
93
  * Request the url and return the corresponding type based on the responseType.
86
94
  * @param url url to fetch
87
95
  * @param init fetch init
88
- * @returns {FetchTask} an abort able fetch task
96
+ * @returns {FetchTask<T> | FetchResponse<T>} an abort able fetch task or just response
89
97
  */
90
- export function fetchT<T>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {
98
+ export function fetchT<T = any>(url: string | URL, init?: FetchInit): FetchTask<T> | FetchResponse<T> {
91
99
  if (typeof url === 'string') {
92
100
  assertUrl(url);
93
101
  }
94
102
 
95
103
  // default not abort able
96
- // default responseType is text
97
- const { abortable = false, responseType = 'text', ...rest } = init ?? {};
104
+ const { abortable = false, responseType, ...rest } = init ?? {};
98
105
 
99
106
  let controller: AbortController;
100
107
 
@@ -126,7 +133,8 @@ export function fetchT<T>(url: string | URL, init?: FetchInit): FetchTask<T> | F
126
133
  return Ok(await res.text() as T);
127
134
  }
128
135
  default: {
129
- throw new Error('Invalid response type');
136
+ // default return the Response object
137
+ return Ok(res as T);
130
138
  }
131
139
  }
132
140
  }).catch((err) => {
package/src/mod.ts CHANGED
@@ -1,2 +1,2 @@
1
- export type { FetchInit, FetchTask } from './fetch/defines.ts';
1
+ export type { FetchInit, FetchResponse, FetchTask } from './fetch/defines.ts';
2
2
  export { fetchT } from './fetch/fetch.ts';