@oazapfts/runtime 1.0.2 → 1.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.
package/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var D=Object.defineProperty,x=Object.defineProperties;var A=Object.getOwnPropertyDescriptors;var g=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var H=(r,e,t)=>e in r?D(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,u=(r,e)=>{for(var t in e||(e={}))j.call(e,t)&&H(r,t,e[t]);if(g)for(var t of g(e))O.call(e,t)&&H(r,t,e[t]);return r},y=(r,e)=>x(r,A(e));var S=(r,e)=>{var t={};for(var s in r)j.call(r,s)&&e.indexOf(s)<0&&(t[s]=r[s]);if(r!=null&&g)for(var s of g(r))e.indexOf(s)<0&&O.call(r,s)&&(t[s]=r[s]);return t};var E=(r,e,t)=>(H(r,typeof e!="symbol"?e+"":e,t),t);var m=(r,e,t)=>new Promise((s,h)=>{var a=n=>{try{c(t.next(n))}catch(o){h(o)}},i=n=>{try{c(t.throw(n))}catch(o){h(o)}},c=n=>n.done?s(n.value):Promise.resolve(n.value).then(a,i);c((t=t.apply(r,e)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const U=require("./query.cjs"),B=require("./util.cjs"),w=require("./headers.cjs");function F(r={}){function e(a,i){return m(this,null,function*(){const c=yield h(a,i);let n;try{n=yield c.text()}catch(o){}return{status:c.status,headers:c.headers,contentType:c.headers.get("content-type"),data:n}})}function t(c){return m(this,arguments,function*(a,i={}){const{status:n,headers:o,contentType:f,data:p}=yield e(a,y(u({},i),{headers:w.mergeHeaders({Accept:"application/json"},i.headers)}));return(f?f.includes("json"):!1)?{status:n,headers:o,data:p?JSON.parse(p):null}:{status:n,headers:o,data:p}})}function s(c){return m(this,arguments,function*(a,i={}){const n=yield h(a,i);let o;try{o=yield n.blob()}catch(f){}return{status:n.status,headers:n.headers,data:o}})}function h(c){return m(this,arguments,function*(a,i={}){const d=y(u(u({},r),i),{headers:w.mergeHeaders(r.headers,i.headers)}),{baseUrl:n,fetch:o}=d,f=S(d,["baseUrl","fetch"]),p=B.joinUrl(n,a);return yield(o||fetch)(p,f)})}return{ok:C,fetchText:e,fetchJson:t,fetchBlob:s,mergeHeaders:w.mergeHeaders,json(n){var o=n,{body:a,headers:i}=o,c=S(o,["body","headers"]);return y(u(u({},c),a!=null&&{body:JSON.stringify(a)}),{headers:w.mergeHeaders({"Content-Type":"application/json"},i)})},form(n){var o=n,{body:a,headers:i}=o,c=S(o,["body","headers"]);return y(u(u({},c),a!=null&&{body:U.form(a)}),{headers:w.mergeHeaders({"Content-Type":"application/x-www-form-urlencoded"},i)})},multipart(n){var o=n,{body:a,headers:i}=o,c=S(o,["body","headers"]);if(a==null)return y(u({},c),{body:a,headers:w.normalizeHeaders(i)});const f=new(r.formDataConstructor||c.formDataConstructor||FormData),p=(l,d)=>{typeof d=="string"||d instanceof Blob?f.append(l,d):f.append(l,new Blob([JSON.stringify(d)],{type:"application/json"}))};return Object.entries(a).forEach(([l,d])=>{Array.isArray(d)?d.forEach(k=>p(l,k)):p(l,d)}),y(u({},c),{body:f,headers:w.normalizeHeaders(i)})}}}function N(r,e){return m(this,null,function*(){const{status:t,data:s,headers:h}=yield r,a=e[t];if(a)return a(s);if(e.default)return e.default(t,s);throw new b(t,s,h)})}const J=[200,201,202,204];function C(r){return m(this,null,function*(){const e=yield r;if(J.some(t=>t==e.status))return e.data;throw new b(e.status,e.data,e.headers)})}function T(r){return(...e)=>C(r(...e))}function z(r){const e={};return Object.entries(r).forEach(([t,s])=>{e[t]=typeof s=="function"?T(s):s}),e}class b extends Error{constructor(t,s,h){super(`Error: ${t}`);E(this,"status");E(this,"data");E(this,"headers");this.status=t,this.data=s,this.headers=h}}exports.HttpError=b;exports.SUCCESS_CODES=J;exports.handle=N;exports.ok=C;exports.okify=T;exports.optimistic=z;exports.runtime=F;
1
+ "use strict";var D=Object.defineProperty,x=Object.defineProperties;var A=Object.getOwnPropertyDescriptors;var g=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var E=(r,e,t)=>e in r?D(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,f=(r,e)=>{for(var t in e||(e={}))j.call(e,t)&&E(r,t,e[t]);if(g)for(var t of g(e))O.call(e,t)&&E(r,t,e[t]);return r},y=(r,e)=>x(r,A(e));var S=(r,e)=>{var t={};for(var s in r)j.call(r,s)&&e.indexOf(s)<0&&(t[s]=r[s]);if(r!=null&&g)for(var s of g(r))e.indexOf(s)<0&&O.call(r,s)&&(t[s]=r[s]);return t};var b=(r,e,t)=>(E(r,typeof e!="symbol"?e+"":e,t),t);var m=(r,e,t)=>new Promise((s,h)=>{var n=a=>{try{c(t.next(a))}catch(o){h(o)}},i=a=>{try{c(t.throw(a))}catch(o){h(o)}},c=a=>a.done?s(a.value):Promise.resolve(a.value).then(n,i);c((t=t.apply(r,e)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const U=require("./query.cjs"),B=require("./util.cjs"),w=require("./headers.cjs");function F(r={}){function e(n,i){return m(this,null,function*(){const c=yield h(n,i);let a;try{a=yield c.text()}catch(o){}return{status:c.status,headers:c.headers,contentType:c.headers.get("content-type"),data:a}})}function t(c){return m(this,arguments,function*(n,i={}){const{status:a,headers:o,contentType:u,data:p}=yield e(n,y(f({},i),{headers:w.mergeHeaders({Accept:"application/json"},i.headers)}));return(u?u.includes("json"):!1)?{status:a,headers:o,data:p?JSON.parse(p):null}:{status:a,headers:o,data:p}})}function s(c){return m(this,arguments,function*(n,i={}){const a=yield h(n,i);let o;try{o=yield a.blob()}catch(u){}return{status:a.status,headers:a.headers,data:o}})}function h(c){return m(this,arguments,function*(n,i={}){const d=y(f(f({},r),i),{headers:w.mergeHeaders(r.headers,i.headers)}),{baseUrl:a,fetch:o}=d,u=S(d,["baseUrl","fetch"]),p=B.joinUrl(a,n);return yield(o||fetch)(p,u)})}return{ok:H,fetchText:e,fetchJson:t,fetchBlob:s,mergeHeaders:w.mergeHeaders,json(a){var o=a,{body:n,headers:i}=o,c=S(o,["body","headers"]);return y(f(f({},c),n!=null&&{body:JSON.stringify(n)}),{headers:w.mergeHeaders({"Content-Type":"application/json"},i)})},form(a){var o=a,{body:n,headers:i}=o,c=S(o,["body","headers"]);return y(f(f({},c),n!=null&&{body:U.form(n)}),{headers:w.mergeHeaders({"Content-Type":"application/x-www-form-urlencoded"},i)})},multipart(a){var o=a,{body:n,headers:i}=o,c=S(o,["body","headers"]);if(n==null)return y(f({},c),{body:n,headers:w.normalizeHeaders(i)});const u=new(r.formDataConstructor||c.formDataConstructor||FormData),p=(l,d)=>{typeof d=="string"||d instanceof Blob?u.append(l,d):typeof d=="number"||typeof d=="boolean"?u.append(l,String(d)):u.append(l,new Blob([JSON.stringify(d)],{type:"application/json"}))};return Object.entries(n).forEach(([l,d])=>{Array.isArray(d)?d.forEach(k=>p(l,k)):p(l,d)}),y(f({},c),{body:u,headers:w.normalizeHeaders(i)})}}}function N(r,e){return m(this,null,function*(){const{status:t,data:s,headers:h}=yield r,n=e[t];if(n)return n(s);if(e.default)return e.default(t,s);throw new C(t,s,h)})}const J=[200,201,202,204];function H(r){return m(this,null,function*(){const e=yield r;if(J.some(t=>t==e.status))return e.data;throw new C(e.status,e.data,e.headers)})}function T(r){return(...e)=>H(r(...e))}function z(r){const e={};return Object.entries(r).forEach(([t,s])=>{e[t]=typeof s=="function"?T(s):s}),e}class C extends Error{constructor(t,s,h){super(`Error: ${t}`);b(this,"status");b(this,"data");b(this,"headers");this.status=t,this.data=s,this.headers=h}}exports.HttpError=C;exports.SUCCESS_CODES=J;exports.handle=N;exports.ok=H;exports.okify=T;exports.optimistic=z;exports.runtime=F;
2
2
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/runtime.ts","../src/index.ts"],"sourcesContent":["import * as qs from \"./query\";\nimport { joinUrl } from \"./util\";\nimport { ok } from \"./index\";\nimport { CustomHeaders, mergeHeaders, normalizeHeaders } from \"./headers\";\n\nexport { type CustomHeaders };\n\nexport type RequestOpts = {\n baseUrl?: string;\n fetch?: typeof fetch;\n formDataConstructor?: new () => FormData;\n headers?: HeadersInit | CustomHeaders;\n} & Omit<RequestInit, \"body\" | \"headers\">;\n\nexport type Defaults<Headers extends RequestOpts[\"headers\"] = CustomHeaders> =\n Omit<RequestOpts, \"headers\" | \"baseUrl\"> & {\n baseUrl: string;\n headers: Headers;\n };\n\ntype FetchRequestOpts = RequestOpts & {\n body?: string | FormData | Blob;\n};\n\ntype JsonRequestOpts = RequestOpts & {\n body?: any;\n};\n\ntype FormRequestOpts = RequestOpts & {\n body?: Record<string, any>;\n};\n\nexport type ApiResponse = { status: number; data?: any };\n\nexport type WithHeaders<T extends ApiResponse> = T & { headers: Headers };\n\ntype MultipartRequestOpts = RequestOpts & {\n body?: Record<string, unknown>;\n};\n\nexport function runtime(defaults: RequestOpts = {}) {\n async function fetchText(url: string, req?: FetchRequestOpts) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.text();\n } catch (err) {}\n\n return {\n status: res.status,\n headers: res.headers,\n contentType: res.headers.get(\"content-type\"),\n data,\n };\n }\n\n async function fetchJson<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const { status, headers, contentType, data } = await fetchText(url, {\n ...req,\n headers: mergeHeaders(\n {\n Accept: \"application/json\",\n },\n req.headers,\n ),\n });\n\n const isJson = contentType ? contentType.includes(\"json\") : false;\n\n if (isJson) {\n return {\n status,\n headers,\n data: data ? JSON.parse(data) : null,\n } as WithHeaders<T>;\n }\n\n return { status, headers, data } as WithHeaders<T>;\n }\n\n async function fetchBlob<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.blob();\n } catch (err) {}\n return { status: res.status, headers: res.headers, data } as WithHeaders<T>;\n }\n\n async function doFetch(url: string, req: FetchRequestOpts = {}) {\n const {\n baseUrl,\n fetch: customFetch,\n ...init\n } = {\n ...defaults,\n ...req,\n headers: mergeHeaders(defaults.headers, req.headers),\n };\n const href = joinUrl(baseUrl, url);\n const res = await (customFetch || fetch)(href, init);\n return res;\n }\n\n return {\n ok,\n fetchText,\n fetchJson,\n fetchBlob,\n mergeHeaders,\n\n json({ body, headers, ...req }: JsonRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: JSON.stringify(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n headers,\n ),\n };\n },\n\n form({ body, headers, ...req }: FormRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: qs.form(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n headers,\n ),\n };\n },\n\n multipart({ body, headers, ...req }: MultipartRequestOpts) {\n if (body == null)\n return { ...req, body, headers: normalizeHeaders(headers) };\n\n const data = new (defaults.formDataConstructor ||\n req.formDataConstructor ||\n FormData)();\n\n const append = (name: string, value: unknown) => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(name, value);\n } else {\n data.append(\n name,\n new Blob([JSON.stringify(value)], { type: \"application/json\" }),\n );\n }\n };\n\n Object.entries(body).forEach(([name, value]) => {\n if (Array.isArray(value)) {\n value.forEach((v) => append(name, v));\n } else {\n append(name, value);\n }\n });\n\n return {\n ...req,\n body: data,\n headers: normalizeHeaders(headers),\n };\n },\n };\n}\n","import type { ApiResponse, WithHeaders } from \"./runtime\";\n\nexport * from \"./runtime\";\n\n/**\n * Type to access a response's data property for a given status.\n */\nexport type DataType<T extends ApiResponse, S extends number> = T extends {\n status: S;\n}\n ? T[\"data\"]\n : never;\n\n/**\n * Object with methods to handle possible status codes of an ApiResponse.\n */\nexport type ResponseHandler<T extends ApiResponse> = {\n [P in T[\"status\"]]?: (res: DataType<T, P>) => any;\n} & {\n default?: (status: number, data: any) => any;\n};\n\nexport type FunctionReturnType<T> = T extends (...args: any[]) => any\n ? ReturnType<T>\n : never;\n\n/**\n * Utility function to handle different status codes.\n *\n * Example:\n *\n * const userId = await handle(api.register({ email, password }), {\n * 200: (user: User) => user.id,\n * 400: (err: string) => console.log(err),\n * })\n **/\nexport async function handle<\n T extends WithHeaders<ApiResponse>,\n H extends ResponseHandler<T>,\n>(promise: Promise<T>, handler: H): Promise<FunctionReturnType<H[keyof H]>> {\n const { status, data, headers } = await promise;\n const statusHandler = (handler as any)[status];\n if (statusHandler) return statusHandler(data);\n if (handler.default) return handler.default(status, data);\n throw new HttpError(status, data, headers);\n}\n\nexport const SUCCESS_CODES = [200, 201, 202, 204] as const;\nexport type SuccessCodes = (typeof SUCCESS_CODES)[number];\n\nexport type SuccessResponse<T extends ApiResponse> = DataType<T, SuccessCodes>;\n\n/**\n * Utility function to directly return any successful response\n * and throw a HttpError otherwise.\n *\n * Example:\n *\n * try {\n * const userId = await ok(api.register({ email, password }));\n * }\n * catch (err) {\n * console.log(err.status)\n * }\n */\nexport async function ok<T extends WithHeaders<ApiResponse>>(\n promise: Promise<T>,\n): Promise<SuccessResponse<T>> {\n const res = await promise;\n if (SUCCESS_CODES.some((s) => s == res.status)) return res.data;\n throw new HttpError(res.status, res.data, res.headers);\n}\n\nexport type Args<T> = T extends (...args: infer U) => any ? U : any;\nexport type ApiFunction = (...args: any[]) => Promise<WithHeaders<ApiResponse>>;\nexport type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer V>\n ? V\n : never;\n\nexport type OkResponse<T extends ApiFunction> = SuccessResponse<\n AsyncReturnType<T>\n>;\n\nexport type Okify<T extends ApiFunction> = (\n ...args: Args<T>\n) => Promise<OkResponse<T>>;\n\n/**\n * Utility function to wrap an API function with `ok(...)`.\n */\nexport function okify<T extends ApiFunction>(fn: T): Okify<T> {\n return (...args: Args<T>) => ok(fn(...args));\n}\n\ntype OptimisticApi<T> = {\n [K in keyof T]: T[K] extends ApiFunction ? Okify<T[K]> : T[K];\n};\n\n/**\n * Utility to `okify` each function of an API.\n */\nexport function optimistic<T extends Record<string, ApiFunction | unknown>>(\n api: T,\n): OptimisticApi<T> {\n const okApi: any = {};\n Object.entries(api).forEach(([key, value]) => {\n okApi[key] = typeof value === \"function\" ? okify(value as any) : value;\n });\n return okApi;\n}\n\nexport class HttpError extends Error {\n status: number;\n data?: any;\n headers: Headers;\n\n constructor(status: number, data: any, headers: Headers) {\n super(`Error: ${status}`);\n this.status = status;\n this.data = data;\n this.headers = headers;\n }\n}\n"],"names":["runtime","defaults","fetchText","url","req","__async","res","doFetch","data","err","fetchJson","_0","status","headers","contentType","__spreadProps","__spreadValues","mergeHeaders","fetchBlob","_a","baseUrl","customFetch","init","__objRest","href","joinUrl","ok","_b","body","_c","_d","qs.form","_e","_f","normalizeHeaders","append","name","value","v","handle","promise","handler","statusHandler","HttpError","SUCCESS_CODES","s","okify","fn","args","optimistic","api","okApi","key","__publicField"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/runtime.ts","../src/index.ts"],"sourcesContent":["import * as qs from \"./query\";\nimport { joinUrl } from \"./util\";\nimport { ok } from \"./index\";\nimport { CustomHeaders, mergeHeaders, normalizeHeaders } from \"./headers\";\n\nexport { type CustomHeaders };\n\nexport type RequestOpts = {\n baseUrl?: string;\n fetch?: typeof fetch;\n formDataConstructor?: new () => FormData;\n headers?: HeadersInit | CustomHeaders;\n} & Omit<RequestInit, \"body\" | \"headers\">;\n\nexport type Defaults<Headers extends RequestOpts[\"headers\"] = CustomHeaders> =\n Omit<RequestOpts, \"headers\" | \"baseUrl\"> & {\n baseUrl: string;\n headers: Headers;\n };\n\ntype FetchRequestOpts = RequestOpts & {\n body?: string | FormData | Blob;\n};\n\ntype JsonRequestOpts = RequestOpts & {\n body?: any;\n};\n\ntype FormRequestOpts = RequestOpts & {\n body?: Record<string, any>;\n};\n\nexport type ApiResponse = { status: number; data?: any };\n\nexport type WithHeaders<T extends ApiResponse> = T & { headers: Headers };\n\ntype MultipartRequestOpts = RequestOpts & {\n body?: Record<string, unknown>;\n};\n\nexport function runtime(defaults: RequestOpts = {}) {\n async function fetchText(url: string, req?: FetchRequestOpts) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.text();\n } catch (err) {}\n\n return {\n status: res.status,\n headers: res.headers,\n contentType: res.headers.get(\"content-type\"),\n data,\n };\n }\n\n async function fetchJson<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const { status, headers, contentType, data } = await fetchText(url, {\n ...req,\n headers: mergeHeaders(\n {\n Accept: \"application/json\",\n },\n req.headers,\n ),\n });\n\n const isJson = contentType ? contentType.includes(\"json\") : false;\n\n if (isJson) {\n return {\n status,\n headers,\n data: data ? JSON.parse(data) : null,\n } as WithHeaders<T>;\n }\n\n return { status, headers, data } as WithHeaders<T>;\n }\n\n async function fetchBlob<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.blob();\n } catch (err) {}\n return { status: res.status, headers: res.headers, data } as WithHeaders<T>;\n }\n\n async function doFetch(url: string, req: FetchRequestOpts = {}) {\n const {\n baseUrl,\n fetch: customFetch,\n ...init\n } = {\n ...defaults,\n ...req,\n headers: mergeHeaders(defaults.headers, req.headers),\n };\n const href = joinUrl(baseUrl, url);\n const res = await (customFetch || fetch)(href, init);\n return res;\n }\n\n return {\n ok,\n fetchText,\n fetchJson,\n fetchBlob,\n mergeHeaders,\n\n json({ body, headers, ...req }: JsonRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: JSON.stringify(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n headers,\n ),\n };\n },\n\n form({ body, headers, ...req }: FormRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: qs.form(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n headers,\n ),\n };\n },\n\n multipart({ body, headers, ...req }: MultipartRequestOpts) {\n if (body == null)\n return { ...req, body, headers: normalizeHeaders(headers) };\n\n const data = new (defaults.formDataConstructor ||\n req.formDataConstructor ||\n FormData)();\n\n const append = (name: string, value: unknown) => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(name, value);\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n data.append(name, String(value));\n } else {\n data.append(\n name,\n new Blob([JSON.stringify(value)], { type: \"application/json\" }),\n );\n }\n };\n\n Object.entries(body).forEach(([name, value]) => {\n if (Array.isArray(value)) {\n value.forEach((v) => append(name, v));\n } else {\n append(name, value);\n }\n });\n\n return {\n ...req,\n body: data,\n headers: normalizeHeaders(headers),\n };\n },\n };\n}\n","import type { ApiResponse, WithHeaders } from \"./runtime\";\n\nexport * from \"./runtime\";\n\n/**\n * Type to access a response's data property for a given status.\n */\nexport type DataType<T extends ApiResponse, S extends number> = T extends {\n status: S;\n}\n ? T[\"data\"]\n : never;\n\n/**\n * Object with methods to handle possible status codes of an ApiResponse.\n */\nexport type ResponseHandler<T extends ApiResponse> = {\n [P in T[\"status\"]]?: (res: DataType<T, P>) => any;\n} & {\n default?: (status: number, data: any) => any;\n};\n\nexport type FunctionReturnType<T> = T extends (...args: any[]) => any\n ? ReturnType<T>\n : never;\n\n/**\n * Utility function to handle different status codes.\n *\n * Example:\n *\n * const userId = await handle(api.register({ email, password }), {\n * 200: (user: User) => user.id,\n * 400: (err: string) => console.log(err),\n * })\n **/\nexport async function handle<\n T extends WithHeaders<ApiResponse>,\n H extends ResponseHandler<T>,\n>(promise: Promise<T>, handler: H): Promise<FunctionReturnType<H[keyof H]>> {\n const { status, data, headers } = await promise;\n const statusHandler = (handler as any)[status];\n if (statusHandler) return statusHandler(data);\n if (handler.default) return handler.default(status, data);\n throw new HttpError(status, data, headers);\n}\n\nexport const SUCCESS_CODES = [200, 201, 202, 204] as const;\nexport type SuccessCodes = (typeof SUCCESS_CODES)[number];\n\nexport type SuccessResponse<T extends ApiResponse> = DataType<T, SuccessCodes>;\n\n/**\n * Utility function to directly return any successful response\n * and throw a HttpError otherwise.\n *\n * Example:\n *\n * try {\n * const userId = await ok(api.register({ email, password }));\n * }\n * catch (err) {\n * console.log(err.status)\n * }\n */\nexport async function ok<T extends WithHeaders<ApiResponse>>(\n promise: Promise<T>,\n): Promise<SuccessResponse<T>> {\n const res = await promise;\n if (SUCCESS_CODES.some((s) => s == res.status)) return res.data;\n throw new HttpError(res.status, res.data, res.headers);\n}\n\nexport type Args<T> = T extends (...args: infer U) => any ? U : any;\nexport type ApiFunction = (...args: any[]) => Promise<WithHeaders<ApiResponse>>;\nexport type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer V>\n ? V\n : never;\n\nexport type OkResponse<T extends ApiFunction> = SuccessResponse<\n AsyncReturnType<T>\n>;\n\nexport type Okify<T extends ApiFunction> = (\n ...args: Args<T>\n) => Promise<OkResponse<T>>;\n\n/**\n * Utility function to wrap an API function with `ok(...)`.\n */\nexport function okify<T extends ApiFunction>(fn: T): Okify<T> {\n return (...args: Args<T>) => ok(fn(...args));\n}\n\ntype OptimisticApi<T> = {\n [K in keyof T]: T[K] extends ApiFunction ? Okify<T[K]> : T[K];\n};\n\n/**\n * Utility to `okify` each function of an API.\n */\nexport function optimistic<T extends Record<string, ApiFunction | unknown>>(\n api: T,\n): OptimisticApi<T> {\n const okApi: any = {};\n Object.entries(api).forEach(([key, value]) => {\n okApi[key] = typeof value === \"function\" ? okify(value as any) : value;\n });\n return okApi;\n}\n\nexport class HttpError extends Error {\n status: number;\n data?: any;\n headers: Headers;\n\n constructor(status: number, data: any, headers: Headers) {\n super(`Error: ${status}`);\n this.status = status;\n this.data = data;\n this.headers = headers;\n }\n}\n"],"names":["runtime","defaults","fetchText","url","req","__async","res","doFetch","data","err","fetchJson","_0","status","headers","contentType","__spreadProps","__spreadValues","mergeHeaders","fetchBlob","_a","baseUrl","customFetch","init","__objRest","href","joinUrl","ok","_b","body","_c","_d","qs.form","_e","_f","normalizeHeaders","append","name","value","v","handle","promise","handler","statusHandler","HttpError","SUCCESS_CODES","s","okify","fn","args","optimistic","api","okApi","key","__publicField"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -134,6 +134,7 @@ export declare function runtime(defaults?: RequestOpts): {
134
134
  keepalive?: boolean | undefined;
135
135
  method?: string | undefined;
136
136
  mode?: RequestMode | undefined;
137
+ priority?: RequestPriority | undefined;
137
138
  redirect?: RequestRedirect | undefined;
138
139
  referrer?: string | undefined;
139
140
  referrerPolicy?: ReferrerPolicy | undefined;
@@ -152,6 +153,7 @@ export declare function runtime(defaults?: RequestOpts): {
152
153
  keepalive?: boolean | undefined;
153
154
  method?: string | undefined;
154
155
  mode?: RequestMode | undefined;
156
+ priority?: RequestPriority | undefined;
155
157
  redirect?: RequestRedirect | undefined;
156
158
  referrer?: string | undefined;
157
159
  referrerPolicy?: ReferrerPolicy | undefined;
@@ -170,6 +172,7 @@ export declare function runtime(defaults?: RequestOpts): {
170
172
  keepalive?: boolean | undefined;
171
173
  method?: string | undefined;
172
174
  mode?: RequestMode | undefined;
175
+ priority?: RequestPriority | undefined;
173
176
  redirect?: RequestRedirect | undefined;
174
177
  referrer?: string | undefined;
175
178
  referrerPolicy?: ReferrerPolicy | undefined;
@@ -187,6 +190,7 @@ export declare function runtime(defaults?: RequestOpts): {
187
190
  keepalive?: boolean | undefined;
188
191
  method?: string | undefined;
189
192
  mode?: RequestMode | undefined;
193
+ priority?: RequestPriority | undefined;
190
194
  redirect?: RequestRedirect | undefined;
191
195
  referrer?: string | undefined;
192
196
  referrerPolicy?: ReferrerPolicy | undefined;
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { form as w } from "./query.js";
2
- import { joinUrl as j } from "./util.js";
3
- import { mergeHeaders as d, normalizeHeaders as p } from "./headers.js";
4
- function O(a = {}) {
2
+ import { joinUrl as b } from "./util.js";
3
+ import { mergeHeaders as d, normalizeHeaders as h } from "./headers.js";
4
+ function J(o = {}) {
5
5
  async function e(r, n) {
6
- const t = await h(r, n);
6
+ const t = await p(r, n);
7
7
  let s;
8
8
  try {
9
9
  s = await t.text();
@@ -16,8 +16,8 @@ function O(a = {}) {
16
16
  data: s
17
17
  };
18
18
  }
19
- async function o(r, n = {}) {
20
- const { status: t, headers: s, contentType: u, data: i } = await e(r, {
19
+ async function i(r, n = {}) {
20
+ const { status: t, headers: s, contentType: u, data: c } = await e(r, {
21
21
  ...n,
22
22
  headers: d(
23
23
  {
@@ -29,11 +29,11 @@ function O(a = {}) {
29
29
  return (u ? u.includes("json") : !1) ? {
30
30
  status: t,
31
31
  headers: s,
32
- data: i ? JSON.parse(i) : null
33
- } : { status: t, headers: s, data: i };
32
+ data: c ? JSON.parse(c) : null
33
+ } : { status: t, headers: s, data: c };
34
34
  }
35
- async function c(r, n = {}) {
36
- const t = await h(r, n);
35
+ async function f(r, n = {}) {
36
+ const t = await p(r, n);
37
37
  let s;
38
38
  try {
39
39
  s = await t.blob();
@@ -41,23 +41,23 @@ function O(a = {}) {
41
41
  }
42
42
  return { status: t.status, headers: t.headers, data: s };
43
43
  }
44
- async function h(r, n = {}) {
44
+ async function p(r, n = {}) {
45
45
  const {
46
46
  baseUrl: t,
47
47
  fetch: s,
48
48
  ...u
49
49
  } = {
50
- ...a,
50
+ ...o,
51
51
  ...n,
52
- headers: d(a.headers, n.headers)
53
- }, i = j(t, r);
54
- return await (s || fetch)(i, u);
52
+ headers: d(o.headers, n.headers)
53
+ }, c = b(t, r);
54
+ return await (s || fetch)(c, u);
55
55
  }
56
56
  return {
57
- ok: l,
57
+ ok: y,
58
58
  fetchText: e,
59
- fetchJson: o,
60
- fetchBlob: c,
59
+ fetchJson: i,
60
+ fetchBlob: f,
61
61
  mergeHeaders: d,
62
62
  json({ body: r, headers: n, ...t }) {
63
63
  return {
@@ -85,62 +85,62 @@ function O(a = {}) {
85
85
  },
86
86
  multipart({ body: r, headers: n, ...t }) {
87
87
  if (r == null)
88
- return { ...t, body: r, headers: p(n) };
89
- const s = new (a.formDataConstructor || t.formDataConstructor || FormData)(), u = (i, f) => {
90
- typeof f == "string" || f instanceof Blob ? s.append(i, f) : s.append(
91
- i,
92
- new Blob([JSON.stringify(f)], { type: "application/json" })
88
+ return { ...t, body: r, headers: h(n) };
89
+ const s = new (o.formDataConstructor || t.formDataConstructor || FormData)(), u = (c, a) => {
90
+ typeof a == "string" || a instanceof Blob ? s.append(c, a) : typeof a == "number" || typeof a == "boolean" ? s.append(c, String(a)) : s.append(
91
+ c,
92
+ new Blob([JSON.stringify(a)], { type: "application/json" })
93
93
  );
94
94
  };
95
- return Object.entries(r).forEach(([i, f]) => {
96
- Array.isArray(f) ? f.forEach((m) => u(i, m)) : u(i, f);
95
+ return Object.entries(r).forEach(([c, a]) => {
96
+ Array.isArray(a) ? a.forEach((m) => u(c, m)) : u(c, a);
97
97
  }), {
98
98
  ...t,
99
99
  body: s,
100
- headers: p(n)
100
+ headers: h(n)
101
101
  };
102
102
  }
103
103
  };
104
104
  }
105
- async function g(a, e) {
106
- const { status: o, data: c, headers: h } = await a, r = e[o];
105
+ async function O(o, e) {
106
+ const { status: i, data: f, headers: p } = await o, r = e[i];
107
107
  if (r)
108
- return r(c);
108
+ return r(f);
109
109
  if (e.default)
110
- return e.default(o, c);
111
- throw new y(o, c, h);
110
+ return e.default(i, f);
111
+ throw new l(i, f, p);
112
112
  }
113
- const E = [200, 201, 202, 204];
114
- async function l(a) {
115
- const e = await a;
116
- if (E.some((o) => o == e.status))
113
+ const j = [200, 201, 202, 204];
114
+ async function y(o) {
115
+ const e = await o;
116
+ if (j.some((i) => i == e.status))
117
117
  return e.data;
118
- throw new y(e.status, e.data, e.headers);
118
+ throw new l(e.status, e.data, e.headers);
119
119
  }
120
- function b(a) {
121
- return (...e) => l(a(...e));
120
+ function E(o) {
121
+ return (...e) => y(o(...e));
122
122
  }
123
- function x(a) {
123
+ function x(o) {
124
124
  const e = {};
125
- return Object.entries(a).forEach(([o, c]) => {
126
- e[o] = typeof c == "function" ? b(c) : c;
125
+ return Object.entries(o).forEach(([i, f]) => {
126
+ e[i] = typeof f == "function" ? E(f) : f;
127
127
  }), e;
128
128
  }
129
- class y extends Error {
129
+ class l extends Error {
130
130
  status;
131
131
  data;
132
132
  headers;
133
- constructor(e, o, c) {
134
- super(`Error: ${e}`), this.status = e, this.data = o, this.headers = c;
133
+ constructor(e, i, f) {
134
+ super(`Error: ${e}`), this.status = e, this.data = i, this.headers = f;
135
135
  }
136
136
  }
137
137
  export {
138
- y as HttpError,
139
- E as SUCCESS_CODES,
140
- g as handle,
141
- l as ok,
142
- b as okify,
138
+ l as HttpError,
139
+ j as SUCCESS_CODES,
140
+ O as handle,
141
+ y as ok,
142
+ E as okify,
143
143
  x as optimistic,
144
- O as runtime
144
+ J as runtime
145
145
  };
146
146
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/runtime.ts","../src/index.ts"],"sourcesContent":["import * as qs from \"./query\";\nimport { joinUrl } from \"./util\";\nimport { ok } from \"./index\";\nimport { CustomHeaders, mergeHeaders, normalizeHeaders } from \"./headers\";\n\nexport { type CustomHeaders };\n\nexport type RequestOpts = {\n baseUrl?: string;\n fetch?: typeof fetch;\n formDataConstructor?: new () => FormData;\n headers?: HeadersInit | CustomHeaders;\n} & Omit<RequestInit, \"body\" | \"headers\">;\n\nexport type Defaults<Headers extends RequestOpts[\"headers\"] = CustomHeaders> =\n Omit<RequestOpts, \"headers\" | \"baseUrl\"> & {\n baseUrl: string;\n headers: Headers;\n };\n\ntype FetchRequestOpts = RequestOpts & {\n body?: string | FormData | Blob;\n};\n\ntype JsonRequestOpts = RequestOpts & {\n body?: any;\n};\n\ntype FormRequestOpts = RequestOpts & {\n body?: Record<string, any>;\n};\n\nexport type ApiResponse = { status: number; data?: any };\n\nexport type WithHeaders<T extends ApiResponse> = T & { headers: Headers };\n\ntype MultipartRequestOpts = RequestOpts & {\n body?: Record<string, unknown>;\n};\n\nexport function runtime(defaults: RequestOpts = {}) {\n async function fetchText(url: string, req?: FetchRequestOpts) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.text();\n } catch (err) {}\n\n return {\n status: res.status,\n headers: res.headers,\n contentType: res.headers.get(\"content-type\"),\n data,\n };\n }\n\n async function fetchJson<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const { status, headers, contentType, data } = await fetchText(url, {\n ...req,\n headers: mergeHeaders(\n {\n Accept: \"application/json\",\n },\n req.headers,\n ),\n });\n\n const isJson = contentType ? contentType.includes(\"json\") : false;\n\n if (isJson) {\n return {\n status,\n headers,\n data: data ? JSON.parse(data) : null,\n } as WithHeaders<T>;\n }\n\n return { status, headers, data } as WithHeaders<T>;\n }\n\n async function fetchBlob<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.blob();\n } catch (err) {}\n return { status: res.status, headers: res.headers, data } as WithHeaders<T>;\n }\n\n async function doFetch(url: string, req: FetchRequestOpts = {}) {\n const {\n baseUrl,\n fetch: customFetch,\n ...init\n } = {\n ...defaults,\n ...req,\n headers: mergeHeaders(defaults.headers, req.headers),\n };\n const href = joinUrl(baseUrl, url);\n const res = await (customFetch || fetch)(href, init);\n return res;\n }\n\n return {\n ok,\n fetchText,\n fetchJson,\n fetchBlob,\n mergeHeaders,\n\n json({ body, headers, ...req }: JsonRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: JSON.stringify(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n headers,\n ),\n };\n },\n\n form({ body, headers, ...req }: FormRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: qs.form(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n headers,\n ),\n };\n },\n\n multipart({ body, headers, ...req }: MultipartRequestOpts) {\n if (body == null)\n return { ...req, body, headers: normalizeHeaders(headers) };\n\n const data = new (defaults.formDataConstructor ||\n req.formDataConstructor ||\n FormData)();\n\n const append = (name: string, value: unknown) => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(name, value);\n } else {\n data.append(\n name,\n new Blob([JSON.stringify(value)], { type: \"application/json\" }),\n );\n }\n };\n\n Object.entries(body).forEach(([name, value]) => {\n if (Array.isArray(value)) {\n value.forEach((v) => append(name, v));\n } else {\n append(name, value);\n }\n });\n\n return {\n ...req,\n body: data,\n headers: normalizeHeaders(headers),\n };\n },\n };\n}\n","import type { ApiResponse, WithHeaders } from \"./runtime\";\n\nexport * from \"./runtime\";\n\n/**\n * Type to access a response's data property for a given status.\n */\nexport type DataType<T extends ApiResponse, S extends number> = T extends {\n status: S;\n}\n ? T[\"data\"]\n : never;\n\n/**\n * Object with methods to handle possible status codes of an ApiResponse.\n */\nexport type ResponseHandler<T extends ApiResponse> = {\n [P in T[\"status\"]]?: (res: DataType<T, P>) => any;\n} & {\n default?: (status: number, data: any) => any;\n};\n\nexport type FunctionReturnType<T> = T extends (...args: any[]) => any\n ? ReturnType<T>\n : never;\n\n/**\n * Utility function to handle different status codes.\n *\n * Example:\n *\n * const userId = await handle(api.register({ email, password }), {\n * 200: (user: User) => user.id,\n * 400: (err: string) => console.log(err),\n * })\n **/\nexport async function handle<\n T extends WithHeaders<ApiResponse>,\n H extends ResponseHandler<T>,\n>(promise: Promise<T>, handler: H): Promise<FunctionReturnType<H[keyof H]>> {\n const { status, data, headers } = await promise;\n const statusHandler = (handler as any)[status];\n if (statusHandler) return statusHandler(data);\n if (handler.default) return handler.default(status, data);\n throw new HttpError(status, data, headers);\n}\n\nexport const SUCCESS_CODES = [200, 201, 202, 204] as const;\nexport type SuccessCodes = (typeof SUCCESS_CODES)[number];\n\nexport type SuccessResponse<T extends ApiResponse> = DataType<T, SuccessCodes>;\n\n/**\n * Utility function to directly return any successful response\n * and throw a HttpError otherwise.\n *\n * Example:\n *\n * try {\n * const userId = await ok(api.register({ email, password }));\n * }\n * catch (err) {\n * console.log(err.status)\n * }\n */\nexport async function ok<T extends WithHeaders<ApiResponse>>(\n promise: Promise<T>,\n): Promise<SuccessResponse<T>> {\n const res = await promise;\n if (SUCCESS_CODES.some((s) => s == res.status)) return res.data;\n throw new HttpError(res.status, res.data, res.headers);\n}\n\nexport type Args<T> = T extends (...args: infer U) => any ? U : any;\nexport type ApiFunction = (...args: any[]) => Promise<WithHeaders<ApiResponse>>;\nexport type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer V>\n ? V\n : never;\n\nexport type OkResponse<T extends ApiFunction> = SuccessResponse<\n AsyncReturnType<T>\n>;\n\nexport type Okify<T extends ApiFunction> = (\n ...args: Args<T>\n) => Promise<OkResponse<T>>;\n\n/**\n * Utility function to wrap an API function with `ok(...)`.\n */\nexport function okify<T extends ApiFunction>(fn: T): Okify<T> {\n return (...args: Args<T>) => ok(fn(...args));\n}\n\ntype OptimisticApi<T> = {\n [K in keyof T]: T[K] extends ApiFunction ? Okify<T[K]> : T[K];\n};\n\n/**\n * Utility to `okify` each function of an API.\n */\nexport function optimistic<T extends Record<string, ApiFunction | unknown>>(\n api: T,\n): OptimisticApi<T> {\n const okApi: any = {};\n Object.entries(api).forEach(([key, value]) => {\n okApi[key] = typeof value === \"function\" ? okify(value as any) : value;\n });\n return okApi;\n}\n\nexport class HttpError extends Error {\n status: number;\n data?: any;\n headers: Headers;\n\n constructor(status: number, data: any, headers: Headers) {\n super(`Error: ${status}`);\n this.status = status;\n this.data = data;\n this.headers = headers;\n }\n}\n"],"names":["runtime","defaults","fetchText","url","req","res","doFetch","data","fetchJson","status","headers","contentType","mergeHeaders","fetchBlob","baseUrl","customFetch","init","href","joinUrl","ok","body","qs.form","normalizeHeaders","append","name","value","v","handle","promise","handler","statusHandler","HttpError","SUCCESS_CODES","s","okify","fn","args","optimistic","api","okApi","key"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/runtime.ts","../src/index.ts"],"sourcesContent":["import * as qs from \"./query\";\nimport { joinUrl } from \"./util\";\nimport { ok } from \"./index\";\nimport { CustomHeaders, mergeHeaders, normalizeHeaders } from \"./headers\";\n\nexport { type CustomHeaders };\n\nexport type RequestOpts = {\n baseUrl?: string;\n fetch?: typeof fetch;\n formDataConstructor?: new () => FormData;\n headers?: HeadersInit | CustomHeaders;\n} & Omit<RequestInit, \"body\" | \"headers\">;\n\nexport type Defaults<Headers extends RequestOpts[\"headers\"] = CustomHeaders> =\n Omit<RequestOpts, \"headers\" | \"baseUrl\"> & {\n baseUrl: string;\n headers: Headers;\n };\n\ntype FetchRequestOpts = RequestOpts & {\n body?: string | FormData | Blob;\n};\n\ntype JsonRequestOpts = RequestOpts & {\n body?: any;\n};\n\ntype FormRequestOpts = RequestOpts & {\n body?: Record<string, any>;\n};\n\nexport type ApiResponse = { status: number; data?: any };\n\nexport type WithHeaders<T extends ApiResponse> = T & { headers: Headers };\n\ntype MultipartRequestOpts = RequestOpts & {\n body?: Record<string, unknown>;\n};\n\nexport function runtime(defaults: RequestOpts = {}) {\n async function fetchText(url: string, req?: FetchRequestOpts) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.text();\n } catch (err) {}\n\n return {\n status: res.status,\n headers: res.headers,\n contentType: res.headers.get(\"content-type\"),\n data,\n };\n }\n\n async function fetchJson<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const { status, headers, contentType, data } = await fetchText(url, {\n ...req,\n headers: mergeHeaders(\n {\n Accept: \"application/json\",\n },\n req.headers,\n ),\n });\n\n const isJson = contentType ? contentType.includes(\"json\") : false;\n\n if (isJson) {\n return {\n status,\n headers,\n data: data ? JSON.parse(data) : null,\n } as WithHeaders<T>;\n }\n\n return { status, headers, data } as WithHeaders<T>;\n }\n\n async function fetchBlob<T extends ApiResponse>(\n url: string,\n req: FetchRequestOpts = {},\n ) {\n const res = await doFetch(url, req);\n let data;\n try {\n data = await res.blob();\n } catch (err) {}\n return { status: res.status, headers: res.headers, data } as WithHeaders<T>;\n }\n\n async function doFetch(url: string, req: FetchRequestOpts = {}) {\n const {\n baseUrl,\n fetch: customFetch,\n ...init\n } = {\n ...defaults,\n ...req,\n headers: mergeHeaders(defaults.headers, req.headers),\n };\n const href = joinUrl(baseUrl, url);\n const res = await (customFetch || fetch)(href, init);\n return res;\n }\n\n return {\n ok,\n fetchText,\n fetchJson,\n fetchBlob,\n mergeHeaders,\n\n json({ body, headers, ...req }: JsonRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: JSON.stringify(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/json\",\n },\n headers,\n ),\n };\n },\n\n form({ body, headers, ...req }: FormRequestOpts) {\n return {\n ...req,\n ...(body != null && { body: qs.form(body) }),\n headers: mergeHeaders(\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n headers,\n ),\n };\n },\n\n multipart({ body, headers, ...req }: MultipartRequestOpts) {\n if (body == null)\n return { ...req, body, headers: normalizeHeaders(headers) };\n\n const data = new (defaults.formDataConstructor ||\n req.formDataConstructor ||\n FormData)();\n\n const append = (name: string, value: unknown) => {\n if (typeof value === \"string\" || value instanceof Blob) {\n data.append(name, value);\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n data.append(name, String(value));\n } else {\n data.append(\n name,\n new Blob([JSON.stringify(value)], { type: \"application/json\" }),\n );\n }\n };\n\n Object.entries(body).forEach(([name, value]) => {\n if (Array.isArray(value)) {\n value.forEach((v) => append(name, v));\n } else {\n append(name, value);\n }\n });\n\n return {\n ...req,\n body: data,\n headers: normalizeHeaders(headers),\n };\n },\n };\n}\n","import type { ApiResponse, WithHeaders } from \"./runtime\";\n\nexport * from \"./runtime\";\n\n/**\n * Type to access a response's data property for a given status.\n */\nexport type DataType<T extends ApiResponse, S extends number> = T extends {\n status: S;\n}\n ? T[\"data\"]\n : never;\n\n/**\n * Object with methods to handle possible status codes of an ApiResponse.\n */\nexport type ResponseHandler<T extends ApiResponse> = {\n [P in T[\"status\"]]?: (res: DataType<T, P>) => any;\n} & {\n default?: (status: number, data: any) => any;\n};\n\nexport type FunctionReturnType<T> = T extends (...args: any[]) => any\n ? ReturnType<T>\n : never;\n\n/**\n * Utility function to handle different status codes.\n *\n * Example:\n *\n * const userId = await handle(api.register({ email, password }), {\n * 200: (user: User) => user.id,\n * 400: (err: string) => console.log(err),\n * })\n **/\nexport async function handle<\n T extends WithHeaders<ApiResponse>,\n H extends ResponseHandler<T>,\n>(promise: Promise<T>, handler: H): Promise<FunctionReturnType<H[keyof H]>> {\n const { status, data, headers } = await promise;\n const statusHandler = (handler as any)[status];\n if (statusHandler) return statusHandler(data);\n if (handler.default) return handler.default(status, data);\n throw new HttpError(status, data, headers);\n}\n\nexport const SUCCESS_CODES = [200, 201, 202, 204] as const;\nexport type SuccessCodes = (typeof SUCCESS_CODES)[number];\n\nexport type SuccessResponse<T extends ApiResponse> = DataType<T, SuccessCodes>;\n\n/**\n * Utility function to directly return any successful response\n * and throw a HttpError otherwise.\n *\n * Example:\n *\n * try {\n * const userId = await ok(api.register({ email, password }));\n * }\n * catch (err) {\n * console.log(err.status)\n * }\n */\nexport async function ok<T extends WithHeaders<ApiResponse>>(\n promise: Promise<T>,\n): Promise<SuccessResponse<T>> {\n const res = await promise;\n if (SUCCESS_CODES.some((s) => s == res.status)) return res.data;\n throw new HttpError(res.status, res.data, res.headers);\n}\n\nexport type Args<T> = T extends (...args: infer U) => any ? U : any;\nexport type ApiFunction = (...args: any[]) => Promise<WithHeaders<ApiResponse>>;\nexport type AsyncReturnType<T> = T extends (...args: any[]) => Promise<infer V>\n ? V\n : never;\n\nexport type OkResponse<T extends ApiFunction> = SuccessResponse<\n AsyncReturnType<T>\n>;\n\nexport type Okify<T extends ApiFunction> = (\n ...args: Args<T>\n) => Promise<OkResponse<T>>;\n\n/**\n * Utility function to wrap an API function with `ok(...)`.\n */\nexport function okify<T extends ApiFunction>(fn: T): Okify<T> {\n return (...args: Args<T>) => ok(fn(...args));\n}\n\ntype OptimisticApi<T> = {\n [K in keyof T]: T[K] extends ApiFunction ? Okify<T[K]> : T[K];\n};\n\n/**\n * Utility to `okify` each function of an API.\n */\nexport function optimistic<T extends Record<string, ApiFunction | unknown>>(\n api: T,\n): OptimisticApi<T> {\n const okApi: any = {};\n Object.entries(api).forEach(([key, value]) => {\n okApi[key] = typeof value === \"function\" ? okify(value as any) : value;\n });\n return okApi;\n}\n\nexport class HttpError extends Error {\n status: number;\n data?: any;\n headers: Headers;\n\n constructor(status: number, data: any, headers: Headers) {\n super(`Error: ${status}`);\n this.status = status;\n this.data = data;\n this.headers = headers;\n }\n}\n"],"names":["runtime","defaults","fetchText","url","req","res","doFetch","data","fetchJson","status","headers","contentType","mergeHeaders","fetchBlob","baseUrl","customFetch","init","href","joinUrl","ok","body","qs.form","normalizeHeaders","append","name","value","v","handle","promise","handler","statusHandler","HttpError","SUCCESS_CODES","s","okify","fn","args","optimistic","api","okApi","key"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oazapfts/runtime",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Runtime for OpenApi TypeScript client generator",
5
5
  "type": "module",
6
6
  "main": "index.cjs",
@@ -34,7 +34,7 @@
34
34
  "directory": "packages/runtime"
35
35
  },
36
36
  "scripts": {
37
- "build": "rm -rf dist && tsc && vite build --mode esm && vite build --mode cjs",
37
+ "build": "rm -rf dist && vite build --mode esm && vite build --mode cjs",
38
38
  "prepack": "sed -i 's|||g' package.json && mv * ."
39
39
  },
40
40
  "release": {