@oazapfts/runtime 1.0.3 → 1.1.0

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/headers.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"headers.cjs","sources":["../src/headers.ts"],"sourcesContent":["export type CustomHeaders = Record<\n string,\n string | null | boolean | number | undefined\n>;\n\nexport function mergeHeaders(\n base: HeadersInit | CustomHeaders | undefined,\n overwrite?: HeadersInit | CustomHeaders,\n) {\n const baseHeaders = normalizeHeaders(base);\n const overwriteHeaders = normalizeHeaders(overwrite);\n\n overwriteHeaders.forEach((value, key) => {\n baseHeaders.set(key, value);\n });\n\n return baseHeaders;\n}\n\nexport function normalizeHeaders(\n headers: HeadersInit | CustomHeaders | undefined,\n) {\n // This might be custom header config containing null | boolean | number | undefined\n // By default Headers constructor will convert them to string but we don't want that\n // for nullish values.\n if (headers && !(headers instanceof Headers) && !Array.isArray(headers)) {\n return new Headers(\n Object.fromEntries(\n Object.entries(headers)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)]),\n ),\n );\n }\n\n return new Headers(headers);\n}\n"],"names":["mergeHeaders","base","overwrite","baseHeaders","normalizeHeaders","value","key","headers","v","k"],"mappings":"gFAKgB,SAAAA,EACdC,EACAC,EACA,CACM,MAAAC,EAAcC,EAAiBH,CAAI,EAGxB,OAFQG,EAAiBF,CAAS,EAElC,QAAQ,CAACG,EAAOC,IAAQ,CAC3BH,EAAA,IAAIG,EAAKD,CAAK,CAAA,CAC3B,EAEMF,CACT,CAEO,SAASC,EACdG,EACA,CAII,OAAAA,GAAW,EAAEA,aAAmB,UAAY,CAAC,MAAM,QAAQA,CAAO,EAC7D,IAAI,QACT,OAAO,YACL,OAAO,QAAQA,CAAO,EACnB,OAAO,CAAC,EAAGC,CAAC,IAAMA,GAAK,IAAI,EAC3B,IAAI,CAAC,CAACC,EAAGD,CAAC,IAAM,CAACC,EAAG,OAAOD,CAAC,CAAC,CAAC,CACnC,CAAA,EAIG,IAAI,QAAQD,CAAO,CAC5B"}
1
+ {"version":3,"file":"headers.cjs","sources":["../src/headers.ts"],"sourcesContent":["export type CustomHeaders = Record<\n string,\n string | null | boolean | number | undefined\n>;\n\nexport function mergeHeaders(\n base: HeadersInit | CustomHeaders | undefined,\n overwrite?: HeadersInit | CustomHeaders,\n) {\n const baseHeaders = normalizeHeaders(base);\n const overwriteHeaders = normalizeHeaders(overwrite);\n\n overwriteHeaders.forEach((value, key) => {\n baseHeaders.set(key, value);\n });\n\n return baseHeaders;\n}\n\nexport function normalizeHeaders(\n headers: HeadersInit | CustomHeaders | undefined,\n) {\n // This might be custom header config containing null | boolean | number | undefined\n // By default Headers constructor will convert them to string but we don't want that\n // for nullish values.\n if (headers && !(headers instanceof Headers) && !Array.isArray(headers)) {\n return new Headers(\n Object.fromEntries(\n Object.entries(headers)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)]),\n ),\n );\n }\n\n return new Headers(headers);\n}\n"],"names":["mergeHeaders","base","overwrite","baseHeaders","normalizeHeaders","value","key","headers","v","k"],"mappings":"gFAKO,SAASA,EACdC,EACAC,EACA,CACA,MAAMC,EAAcC,EAAiBH,CAAI,EAGzC,OAFyBG,EAAiBF,CAAS,EAElC,QAAQ,CAACG,EAAOC,IAAQ,CACvCH,EAAY,IAAIG,EAAKD,CAAK,CAC5B,CAAC,EAEMF,CACT,CAEO,SAASC,EACdG,EACA,CAIA,OAAIA,GAAW,EAAEA,aAAmB,UAAY,CAAC,MAAM,QAAQA,CAAO,EAC7D,IAAI,QACT,OAAO,YACL,OAAO,QAAQA,CAAO,EACnB,OAAO,CAAC,CAAA,CAAGC,CAAC,IAAMA,GAAK,IAAI,EAC3B,IAAI,CAAC,CAACC,EAAGD,CAAC,IAAM,CAACC,EAAG,OAAOD,CAAC,CAAC,CAAC,CAAA,CACnC,EAIG,IAAI,QAAQD,CAAO,CAC5B"}
package/headers.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sources":["../src/headers.ts"],"sourcesContent":["export type CustomHeaders = Record<\n string,\n string | null | boolean | number | undefined\n>;\n\nexport function mergeHeaders(\n base: HeadersInit | CustomHeaders | undefined,\n overwrite?: HeadersInit | CustomHeaders,\n) {\n const baseHeaders = normalizeHeaders(base);\n const overwriteHeaders = normalizeHeaders(overwrite);\n\n overwriteHeaders.forEach((value, key) => {\n baseHeaders.set(key, value);\n });\n\n return baseHeaders;\n}\n\nexport function normalizeHeaders(\n headers: HeadersInit | CustomHeaders | undefined,\n) {\n // This might be custom header config containing null | boolean | number | undefined\n // By default Headers constructor will convert them to string but we don't want that\n // for nullish values.\n if (headers && !(headers instanceof Headers) && !Array.isArray(headers)) {\n return new Headers(\n Object.fromEntries(\n Object.entries(headers)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)]),\n ),\n );\n }\n\n return new Headers(headers);\n}\n"],"names":["mergeHeaders","base","overwrite","baseHeaders","normalizeHeaders","value","key","headers","v","k"],"mappings":"AAKgB,SAAAA,EACdC,GACAC,GACA;AACM,QAAAC,IAAcC,EAAiBH,CAAI;AAGxB,SAFQG,EAAiBF,CAAS,EAElC,QAAQ,CAACG,GAAOC,MAAQ;AAC3B,IAAAH,EAAA,IAAIG,GAAKD,CAAK;AAAA,EAAA,CAC3B,GAEMF;AACT;AAEO,SAASC,EACdG,GACA;AAII,SAAAA,KAAW,EAAEA,aAAmB,YAAY,CAAC,MAAM,QAAQA,CAAO,IAC7D,IAAI;AAAA,IACT,OAAO;AAAA,MACL,OAAO,QAAQA,CAAO,EACnB,OAAO,CAAC,GAAGC,CAAC,MAAMA,KAAK,IAAI,EAC3B,IAAI,CAAC,CAACC,GAAGD,CAAC,MAAM,CAACC,GAAG,OAAOD,CAAC,CAAC,CAAC;AAAA,IACnC;AAAA,EAAA,IAIG,IAAI,QAAQD,CAAO;AAC5B;"}
1
+ {"version":3,"file":"headers.js","sources":["../src/headers.ts"],"sourcesContent":["export type CustomHeaders = Record<\n string,\n string | null | boolean | number | undefined\n>;\n\nexport function mergeHeaders(\n base: HeadersInit | CustomHeaders | undefined,\n overwrite?: HeadersInit | CustomHeaders,\n) {\n const baseHeaders = normalizeHeaders(base);\n const overwriteHeaders = normalizeHeaders(overwrite);\n\n overwriteHeaders.forEach((value, key) => {\n baseHeaders.set(key, value);\n });\n\n return baseHeaders;\n}\n\nexport function normalizeHeaders(\n headers: HeadersInit | CustomHeaders | undefined,\n) {\n // This might be custom header config containing null | boolean | number | undefined\n // By default Headers constructor will convert them to string but we don't want that\n // for nullish values.\n if (headers && !(headers instanceof Headers) && !Array.isArray(headers)) {\n return new Headers(\n Object.fromEntries(\n Object.entries(headers)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)]),\n ),\n );\n }\n\n return new Headers(headers);\n}\n"],"names":["mergeHeaders","base","overwrite","baseHeaders","normalizeHeaders","value","key","headers","v","k"],"mappings":"AAKO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAcC,EAAiBH,CAAI;AAGzC,SAFyBG,EAAiBF,CAAS,EAElC,QAAQ,CAACG,GAAOC,MAAQ;AACvC,IAAAH,EAAY,IAAIG,GAAKD,CAAK;AAAA,EAC5B,CAAC,GAEMF;AACT;AAEO,SAASC,EACdG,GACA;AAIA,SAAIA,KAAW,EAAEA,aAAmB,YAAY,CAAC,MAAM,QAAQA,CAAO,IAC7D,IAAI;AAAA,IACT,OAAO;AAAA,MACL,OAAO,QAAQA,CAAO,EACnB,OAAO,CAAC,CAAA,EAAGC,CAAC,MAAMA,KAAK,IAAI,EAC3B,IAAI,CAAC,CAACC,GAAGD,CAAC,MAAM,CAACC,GAAG,OAAOD,CAAC,CAAC,CAAC;AAAA,IAAA;AAAA,EACnC,IAIG,IAAI,QAAQD,CAAO;AAC5B;"}
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,h=(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,f)=>{var n=a=>{try{c(t.next(a))}catch(o){f(o)}},i=a=>{try{c(t.throw(a))}catch(o){f(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 f(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(h({},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 f(n,i);let o;try{o=yield a.blob()}catch(u){}return{status:a.status,headers:a.headers,data:o}})}function f(c){return m(this,arguments,function*(n,i={}){const d=y(h(h({},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:b,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(h(h({},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(h(h({},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(h({},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"?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(h({},c),{body:u,headers:w.normalizeHeaders(i)})}}}function N(r,e){return m(this,null,function*(){const{status:t,data:s,headers:f}=yield r,n=e[t];if(n)return n(s);if(e.default)return e.default(t,s);throw new C(t,s,f)})}const J=[200,201,202,204];function b(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)=>b(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,f){super(`Error: ${t}`);E(this,"status");E(this,"data");E(this,"headers");this.status=t,this.data=s,this.headers=f}}exports.HttpError=C;exports.SUCCESS_CODES=J;exports.handle=N;exports.ok=b;exports.okify=T;exports.optimistic=z;exports.runtime=F;
1
+ "use strict";var k=Object.defineProperty,F=Object.defineProperties;var x=Object.getOwnPropertyDescriptors;var g=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable;var E=(e,t,r)=>t in e?k(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,h=(e,t)=>{for(var r in t||(t={}))j.call(t,r)&&E(e,r,t[r]);if(g)for(var r of g(t))O.call(t,r)&&E(e,r,t[r]);return e},l=(e,t)=>F(e,x(t));var S=(e,t)=>{var r={};for(var s in e)j.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&g)for(var s of g(e))t.indexOf(s)<0&&O.call(e,s)&&(r[s]=e[s]);return r};var b=(e,t,r)=>E(e,typeof t!="symbol"?t+"":t,r);var m=(e,t,r)=>new Promise((s,f)=>{var n=a=>{try{c(r.next(a))}catch(o){f(o)}},i=a=>{try{c(r.throw(a))}catch(o){f(o)}},c=a=>a.done?s(a.value):Promise.resolve(a.value).then(n,i);c((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("./query.cjs"),U=require("./util.cjs"),w=require("./headers.cjs");function B(e={}){function t(n,i){return m(this,null,function*(){const c=yield f(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 r(c){return m(this,arguments,function*(n,i={}){const{status:a,headers:o,contentType:u,data:p}=yield t(n,l(h({},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 f(n,i);let o;try{o=yield a.blob()}catch(u){}return{status:a.status,headers:a.headers,data:o}})}function f(c){return m(this,arguments,function*(n,i={}){const d=l(h(h({},e),i),{headers:w.mergeHeaders(e.headers,i.headers)}),{baseUrl:a,fetch:o}=d,u=S(d,["baseUrl","fetch"]),p=U.joinUrl(a,n);return yield(o||fetch)(p,u)})}return{ok:H,fetchText:t,fetchJson:r,fetchBlob:s,mergeHeaders:w.mergeHeaders,json(a){var o=a,{body:n,headers:i}=o,c=S(o,["body","headers"]);return l(h(h({},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 l(h(h({},c),n!=null&&{body:A.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 l(h({},c),{body:n,headers:w.normalizeHeaders(i)});const u=new(c.FormData||c.formDataConstructor||e.FormData||e.formDataConstructor||FormData),p=(y,d)=>{typeof d=="string"||d instanceof Blob?u.append(y,d):typeof d=="number"||typeof d=="boolean"?u.append(y,String(d)):u.append(y,new Blob([JSON.stringify(d)],{type:"application/json"}))};return Object.entries(n).forEach(([y,d])=>{Array.isArray(d)?d.forEach(T=>p(y,T)):p(y,d)}),l(h({},c),{body:u,headers:w.normalizeHeaders(i)})}}}function N(e,t){return m(this,null,function*(){const{status:r,data:s,headers:f}=yield e,n=t[r];if(n)return n(s);if(t.default)return t.default(r,s);throw new C(r,s,f)})}const D=[200,201,202,204];function H(e){return m(this,null,function*(){const t=yield e;if(D.some(r=>r==t.status))return t.data;throw new C(t.status,t.data,t.headers)})}function J(e){return(...t)=>H(e(...t))}function z(e){const t={};return Object.entries(e).forEach(([r,s])=>{t[r]=typeof s=="function"?J(s):s}),t}class C extends Error{constructor(r,s,f){super(`Error: ${r}`);b(this,"status");b(this,"data");b(this,"headers");this.status=r,this.data=s,this.headers=f}}exports.HttpError=C;exports.SUCCESS_CODES=D;exports.handle=N;exports.ok=H;exports.okify=J;exports.optimistic=z;exports.runtime=B;
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 if (typeof value === \"number\") {\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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"}
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 /** @deprecated Use RequestOpts.FormData instead */\n formDataConstructor?: new () => FormData;\n FormData?: 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 (\n req.FormData ||\n req.formDataConstructor ||\n defaults.FormData ||\n defaults.formDataConstructor ||\n FormData\n )();\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":"8+BA0CO,SAASA,EAAQC,EAAwB,GAAI,CAClD,SAAeC,EAAUC,EAAaC,EAAwB,QAAAC,EAAA,sBAC5D,MAAMC,EAAM,MAAMC,EAAQJ,EAAKC,CAAG,EAClC,IAAII,EACJ,GAAI,CACFA,EAAO,MAAMF,EAAI,KAAA,CACnB,OAASG,EAAK,CAAC,CAEf,MAAO,CACL,OAAQH,EAAI,OACZ,QAASA,EAAI,QACb,YAAaA,EAAI,QAAQ,IAAI,cAAc,EAC3C,KAAAE,CAAA,CAEJ,GAEA,SAAeE,EACbC,EAEA,QAAAN,EAAA,yBAFAF,EACAC,EAAwB,GACxB,CACA,KAAM,CAAE,OAAAQ,UAAQC,EAAS,YAAAC,EAAa,KAAAN,GAAS,MAAMN,EAAUC,EAAKY,EAAAC,EAAA,GAC/DZ,GAD+D,CAElE,QAASa,EAAAA,aACP,CACE,OAAQ,kBAAA,EAEVb,EAAI,OAAA,CACN,EACD,EAID,OAFeU,EAAcA,EAAY,SAAS,MAAM,EAAI,IAGnD,CACL,OAAAF,EAAA,QACAC,EACA,KAAML,EAAO,KAAK,MAAMA,CAAI,EAAI,IAAA,EAI7B,CAAE,OAAAI,UAAQC,EAAS,KAAAL,CAAA,CAC5B,GAEA,SAAeU,EACbP,EAEA,QAAAN,EAAA,yBAFAF,EACAC,EAAwB,GACxB,CACA,MAAME,EAAM,MAAMC,EAAQJ,EAAKC,CAAG,EAClC,IAAII,EACJ,GAAI,CACFA,EAAO,MAAMF,EAAI,KAAA,CACnB,OAASG,EAAK,CAAC,CACf,MAAO,CAAE,OAAQH,EAAI,OAAQ,QAASA,EAAI,QAAS,KAAAE,CAAA,CACrD,GAEA,SAAeD,EAAQI,EAAyC,QAAAN,EAAA,yBAAzCF,EAAaC,EAAwB,GAAI,CAC9D,MAIIe,EAAAJ,EAAAC,IAAA,GACCf,GACAG,GAFD,CAGF,QAASa,EAAAA,aAAahB,EAAS,QAASG,EAAI,OAAO,CAAA,GANnD,SAAAgB,EACA,MAAOC,GAELF,EADCG,EAAAC,EACDJ,EADC,CAFH,UACA,UAOIK,EAAOC,EAAAA,QAAQL,EAASjB,CAAG,EAEjC,OADY,MAAOkB,GAAe,OAAOG,EAAMF,CAAI,CAErD,GAEA,MAAO,CACL,GAAAI,EACA,UAAAxB,EACA,UAAAQ,EACA,UAAAQ,EAAA,aACAD,EAAAA,aAEA,KAAKE,EAA4C,CAA5C,IAAAQ,EAAAR,EAAE,MAAAS,EAAA,QAAMf,GAARc,EAAoBvB,EAAAmB,EAApBI,EAAoB,CAAlB,OAAA,YACL,OAAOZ,EAAAC,IAAA,GACFZ,GACCwB,GAAQ,MAAQ,CAAE,KAAM,KAAK,UAAUA,CAAI,CAAA,GAF1C,CAGL,QAASX,EAAAA,aACP,CACE,eAAgB,kBAAA,EAElBJ,CAAA,CACF,EAEJ,EAEA,KAAKgB,EAA4C,CAA5C,IAAAC,EAAAD,EAAE,MAAAD,EAAA,QAAMf,GAARiB,EAAoB1B,EAAAmB,EAApBO,EAAoB,CAAlB,OAAA,YACL,OAAOf,EAAAC,IAAA,GACFZ,GACCwB,GAAQ,MAAQ,CAAE,KAAMG,EAAAA,KAAQH,CAAI,CAAA,GAFnC,CAGL,QAASX,EAAAA,aACP,CACE,eAAgB,mCAAA,EAElBJ,CAAA,CACF,EAEJ,EAEA,UAAUmB,EAAiD,CAAjD,IAAAC,EAAAD,EAAE,MAAAJ,EAAA,QAAMf,GAARoB,EAAoB7B,EAAAmB,EAApBU,EAAoB,CAAlB,OAAA,YACV,GAAIL,GAAQ,KACV,OAAOb,EAAAC,EAAA,GAAKZ,GAAL,CAAU,KAAAwB,EAAM,QAASM,EAAAA,iBAAiBrB,CAAO,CAAA,GAE1D,MAAML,EAAO,IACXJ,EAAI,UACJA,EAAI,qBACJH,EAAS,UACTA,EAAS,qBACT,UAGIkC,EAAS,CAACC,EAAcC,IAAmB,CAC3C,OAAOA,GAAU,UAAYA,aAAiB,KAChD7B,EAAK,OAAO4B,EAAMC,CAAK,EACd,OAAOA,GAAU,UAAY,OAAOA,GAAU,UACvD7B,EAAK,OAAO4B,EAAM,OAAOC,CAAK,CAAC,EAE/B7B,EAAK,OACH4B,EACA,IAAI,KAAK,CAAC,KAAK,UAAUC,CAAK,CAAC,EAAG,CAAE,KAAM,kBAAA,CAAoB,CAAA,CAGpE,EAEA,cAAO,QAAQT,CAAI,EAAE,QAAQ,CAAC,CAACQ,EAAMC,CAAK,IAAM,CAC1C,MAAM,QAAQA,CAAK,EACrBA,EAAM,QAASC,GAAMH,EAAOC,EAAME,CAAC,CAAC,EAEpCH,EAAOC,EAAMC,CAAK,CAEtB,CAAC,EAEMtB,EAAAC,EAAA,GACFZ,GADE,CAEL,KAAMI,EACN,QAAS0B,EAAAA,iBAAiBrB,CAAO,CAAA,EAErC,CAAA,CAEJ,CCrJA,SAAsB0B,EAGpBC,EAAqBC,EAAqD,QAAApC,EAAA,sBAC1E,KAAM,CAAE,OAAAO,EAAQ,KAAAJ,EAAM,QAAAK,CAAA,EAAY,MAAM2B,EAClCE,EAAiBD,EAAgB7B,CAAM,EAC7C,GAAI8B,EAAe,OAAOA,EAAclC,CAAI,EAC5C,GAAIiC,EAAQ,QAAS,OAAOA,EAAQ,QAAQ7B,EAAQJ,CAAI,EACxD,MAAM,IAAImC,EAAU/B,EAAQJ,EAAMK,CAAO,CAC3C,GAEO,MAAM+B,EAAgB,CAAC,IAAK,IAAK,IAAK,GAAG,EAkBhD,SAAsBlB,EACpBc,EAC6B,QAAAnC,EAAA,sBAC7B,MAAMC,EAAM,MAAMkC,EAClB,GAAII,EAAc,KAAMC,GAAMA,GAAKvC,EAAI,MAAM,EAAG,OAAOA,EAAI,KAC3D,MAAM,IAAIqC,EAAUrC,EAAI,OAAQA,EAAI,KAAMA,EAAI,OAAO,CACvD,GAmBO,SAASwC,EAA6BC,EAAiB,CAC5D,MAAO,IAAIC,IAAkBtB,EAAGqB,EAAG,GAAGC,CAAI,CAAC,CAC7C,CASO,SAASC,EACdC,EACkB,CAClB,MAAMC,EAAa,CAAA,EACnB,cAAO,QAAQD,CAAG,EAAE,QAAQ,CAAC,CAACE,EAAKf,CAAK,IAAM,CAC5Cc,EAAMC,CAAG,EAAI,OAAOf,GAAU,WAAaS,EAAMT,CAAY,EAAIA,CACnE,CAAC,EACMc,CACT,CAEO,MAAMR,UAAkB,KAAM,CAKnC,YAAY/B,EAAgBJ,EAAWK,EAAkB,CACvD,MAAM,UAAUD,CAAM,EAAE,EAL1ByC,EAAA,eACAA,EAAA,aACAA,EAAA,gBAIE,KAAK,OAASzC,EACd,KAAK,KAAOJ,EACZ,KAAK,QAAUK,CACjB,CACF"}
package/index.d.ts CHANGED
@@ -98,7 +98,9 @@ declare type OptimisticApi<T> = {
98
98
  export declare type RequestOpts = {
99
99
  baseUrl?: string;
100
100
  fetch?: typeof fetch;
101
+ /** @deprecated Use RequestOpts.FormData instead */
101
102
  formDataConstructor?: new () => FormData;
103
+ FormData?: new () => FormData;
102
104
  headers?: HeadersInit | CustomHeaders;
103
105
  } & Omit<RequestInit, "body" | "headers">;
104
106
 
@@ -120,14 +122,16 @@ export declare function runtime(defaults?: RequestOpts): {
120
122
  data: string | undefined;
121
123
  }>;
122
124
  fetchJson: <T extends ApiResponse>(url: string, req?: FetchRequestOpts) => Promise<WithHeaders<T>>;
123
- fetchBlob: <T_1 extends ApiResponse>(url: string, req?: FetchRequestOpts) => Promise<WithHeaders<T_1>>;
125
+ fetchBlob: <T extends ApiResponse>(url: string, req?: FetchRequestOpts) => Promise<WithHeaders<T>>;
124
126
  mergeHeaders: typeof mergeHeaders;
125
127
  json({ body, headers, ...req }: JsonRequestOpts): {
126
128
  headers: Headers;
127
129
  body?: string | undefined;
128
- baseUrl?: string | undefined;
129
- fetch?: typeof fetch | undefined;
130
- formDataConstructor?: (new () => FormData) | undefined;
130
+ baseUrl?: string;
131
+ fetch?: typeof fetch;
132
+ /** @deprecated Use RequestOpts.FormData instead */
133
+ formDataConstructor?: new () => FormData;
134
+ FormData?: new () => FormData;
131
135
  cache?: RequestCache | undefined;
132
136
  credentials?: RequestCredentials | undefined;
133
137
  integrity?: string | undefined;
@@ -138,15 +142,17 @@ export declare function runtime(defaults?: RequestOpts): {
138
142
  redirect?: RequestRedirect | undefined;
139
143
  referrer?: string | undefined;
140
144
  referrerPolicy?: ReferrerPolicy | undefined;
141
- signal?: AbortSignal | null | undefined;
145
+ signal?: (AbortSignal | null) | undefined;
142
146
  window?: null | undefined;
143
147
  };
144
148
  form({ body, headers, ...req }: FormRequestOpts): {
145
149
  headers: Headers;
146
150
  body?: string | undefined;
147
- baseUrl?: string | undefined;
148
- fetch?: typeof fetch | undefined;
149
- formDataConstructor?: (new () => FormData) | undefined;
151
+ baseUrl?: string;
152
+ fetch?: typeof fetch;
153
+ /** @deprecated Use RequestOpts.FormData instead */
154
+ formDataConstructor?: new () => FormData;
155
+ FormData?: new () => FormData;
150
156
  cache?: RequestCache | undefined;
151
157
  credentials?: RequestCredentials | undefined;
152
158
  integrity?: string | undefined;
@@ -157,15 +163,17 @@ export declare function runtime(defaults?: RequestOpts): {
157
163
  redirect?: RequestRedirect | undefined;
158
164
  referrer?: string | undefined;
159
165
  referrerPolicy?: ReferrerPolicy | undefined;
160
- signal?: AbortSignal | null | undefined;
166
+ signal?: (AbortSignal | null) | undefined;
161
167
  window?: null | undefined;
162
168
  };
163
169
  multipart({ body, headers, ...req }: MultipartRequestOpts): {
164
170
  body: undefined;
165
171
  headers: Headers;
166
- baseUrl?: string | undefined;
167
- fetch?: typeof fetch | undefined;
168
- formDataConstructor?: (new () => FormData) | undefined;
172
+ baseUrl?: string;
173
+ fetch?: typeof fetch;
174
+ /** @deprecated Use RequestOpts.FormData instead */
175
+ formDataConstructor?: new () => FormData;
176
+ FormData?: new () => FormData;
169
177
  cache?: RequestCache | undefined;
170
178
  credentials?: RequestCredentials | undefined;
171
179
  integrity?: string | undefined;
@@ -176,14 +184,16 @@ export declare function runtime(defaults?: RequestOpts): {
176
184
  redirect?: RequestRedirect | undefined;
177
185
  referrer?: string | undefined;
178
186
  referrerPolicy?: ReferrerPolicy | undefined;
179
- signal?: AbortSignal | null | undefined;
187
+ signal?: (AbortSignal | null) | undefined;
180
188
  window?: null | undefined;
181
189
  } | {
182
190
  body: FormData;
183
191
  headers: Headers;
184
- baseUrl?: string | undefined;
185
- fetch?: typeof fetch | undefined;
186
- formDataConstructor?: (new () => FormData) | undefined;
192
+ baseUrl?: string;
193
+ fetch?: typeof fetch;
194
+ /** @deprecated Use RequestOpts.FormData instead */
195
+ formDataConstructor?: new () => FormData;
196
+ FormData?: new () => FormData;
187
197
  cache?: RequestCache | undefined;
188
198
  credentials?: RequestCredentials | undefined;
189
199
  integrity?: string | undefined;
@@ -194,7 +204,7 @@ export declare function runtime(defaults?: RequestOpts): {
194
204
  redirect?: RequestRedirect | undefined;
195
205
  referrer?: string | undefined;
196
206
  referrerPolicy?: ReferrerPolicy | undefined;
197
- signal?: AbortSignal | null | undefined;
207
+ signal?: (AbortSignal | null) | undefined;
198
208
  window?: null | undefined;
199
209
  };
200
210
  };
package/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { form as w } from "./query.js";
2
2
  import { joinUrl as b } from "./util.js";
3
3
  import { mergeHeaders as d, normalizeHeaders as h } from "./headers.js";
4
- function J(a = {}) {
5
- async function e(r, n) {
6
- const t = await p(r, n);
4
+ function D(a = {}) {
5
+ async function r(e, n) {
6
+ const t = await p(e, n);
7
7
  let s;
8
8
  try {
9
9
  s = await t.text();
@@ -16,8 +16,8 @@ function J(a = {}) {
16
16
  data: s
17
17
  };
18
18
  }
19
- async function i(r, n = {}) {
20
- const { status: t, headers: s, contentType: u, data: o } = await e(r, {
19
+ async function i(e, n = {}) {
20
+ const { status: t, headers: s, contentType: u, data: c } = await r(e, {
21
21
  ...n,
22
22
  headers: d(
23
23
  {
@@ -29,11 +29,11 @@ function J(a = {}) {
29
29
  return (u ? u.includes("json") : !1) ? {
30
30
  status: t,
31
31
  headers: s,
32
- data: o ? JSON.parse(o) : null
33
- } : { status: t, headers: s, data: o };
32
+ data: c ? JSON.parse(c) : null
33
+ } : { status: t, headers: s, data: c };
34
34
  }
35
- async function f(r, n = {}) {
36
- const t = await p(r, n);
35
+ async function f(e, n = {}) {
36
+ const t = await p(e, n);
37
37
  let s;
38
38
  try {
39
39
  s = await t.blob();
@@ -41,7 +41,7 @@ function J(a = {}) {
41
41
  }
42
42
  return { status: t.status, headers: t.headers, data: s };
43
43
  }
44
- async function p(r, n = {}) {
44
+ async function p(e, n = {}) {
45
45
  const {
46
46
  baseUrl: t,
47
47
  fetch: s,
@@ -50,19 +50,19 @@ function J(a = {}) {
50
50
  ...a,
51
51
  ...n,
52
52
  headers: d(a.headers, n.headers)
53
- }, o = b(t, r);
54
- return await (s || fetch)(o, u);
53
+ }, c = b(t, e);
54
+ return await (s || fetch)(c, u);
55
55
  }
56
56
  return {
57
57
  ok: y,
58
- fetchText: e,
58
+ fetchText: r,
59
59
  fetchJson: i,
60
60
  fetchBlob: f,
61
61
  mergeHeaders: d,
62
- json({ body: r, headers: n, ...t }) {
62
+ json({ body: e, headers: n, ...t }) {
63
63
  return {
64
64
  ...t,
65
- ...r != null && { body: JSON.stringify(r) },
65
+ ...e != null && { body: JSON.stringify(e) },
66
66
  headers: d(
67
67
  {
68
68
  "Content-Type": "application/json"
@@ -71,10 +71,10 @@ function J(a = {}) {
71
71
  )
72
72
  };
73
73
  },
74
- form({ body: r, headers: n, ...t }) {
74
+ form({ body: e, headers: n, ...t }) {
75
75
  return {
76
76
  ...t,
77
- ...r != null && { body: w(r) },
77
+ ...e != null && { body: w(e) },
78
78
  headers: d(
79
79
  {
80
80
  "Content-Type": "application/x-www-form-urlencoded"
@@ -83,17 +83,17 @@ function J(a = {}) {
83
83
  )
84
84
  };
85
85
  },
86
- multipart({ body: r, headers: n, ...t }) {
87
- if (r == null)
88
- return { ...t, body: r, headers: h(n) };
89
- const s = new (a.formDataConstructor || t.formDataConstructor || FormData)(), u = (o, c) => {
90
- typeof c == "string" || c instanceof Blob ? s.append(o, c) : typeof c == "number" ? s.append(o, String(c)) : s.append(
91
- o,
92
- new Blob([JSON.stringify(c)], { type: "application/json" })
86
+ multipart({ body: e, headers: n, ...t }) {
87
+ if (e == null)
88
+ return { ...t, body: e, headers: h(n) };
89
+ const s = new (t.FormData || t.formDataConstructor || a.FormData || a.formDataConstructor || FormData)(), u = (c, o) => {
90
+ typeof o == "string" || o instanceof Blob ? s.append(c, o) : typeof o == "number" || typeof o == "boolean" ? s.append(c, String(o)) : s.append(
91
+ c,
92
+ new Blob([JSON.stringify(o)], { type: "application/json" })
93
93
  );
94
94
  };
95
- return Object.entries(r).forEach(([o, c]) => {
96
- Array.isArray(c) ? c.forEach((m) => u(o, m)) : u(o, c);
95
+ return Object.entries(e).forEach(([c, o]) => {
96
+ Array.isArray(o) ? o.forEach((m) => u(c, m)) : u(c, o);
97
97
  }), {
98
98
  ...t,
99
99
  body: s,
@@ -102,45 +102,42 @@ function J(a = {}) {
102
102
  }
103
103
  };
104
104
  }
105
- async function O(a, e) {
106
- const { status: i, data: f, headers: p } = await a, r = e[i];
107
- if (r)
108
- return r(f);
109
- if (e.default)
110
- return e.default(i, f);
105
+ async function J(a, r) {
106
+ const { status: i, data: f, headers: p } = await a, e = r[i];
107
+ if (e) return e(f);
108
+ if (r.default) return r.default(i, f);
111
109
  throw new l(i, f, p);
112
110
  }
113
111
  const j = [200, 201, 202, 204];
114
112
  async function y(a) {
115
- const e = await a;
116
- if (j.some((i) => i == e.status))
117
- return e.data;
118
- throw new l(e.status, e.data, e.headers);
113
+ const r = await a;
114
+ if (j.some((i) => i == r.status)) return r.data;
115
+ throw new l(r.status, r.data, r.headers);
119
116
  }
120
117
  function E(a) {
121
- return (...e) => y(a(...e));
118
+ return (...r) => y(a(...r));
122
119
  }
123
- function x(a) {
124
- const e = {};
120
+ function O(a) {
121
+ const r = {};
125
122
  return Object.entries(a).forEach(([i, f]) => {
126
- e[i] = typeof f == "function" ? E(f) : f;
127
- }), e;
123
+ r[i] = typeof f == "function" ? E(f) : f;
124
+ }), r;
128
125
  }
129
126
  class l extends Error {
130
127
  status;
131
128
  data;
132
129
  headers;
133
- constructor(e, i, f) {
134
- super(`Error: ${e}`), this.status = e, this.data = i, this.headers = f;
130
+ constructor(r, i, f) {
131
+ super(`Error: ${r}`), this.status = r, this.data = i, this.headers = f;
135
132
  }
136
133
  }
137
134
  export {
138
135
  l as HttpError,
139
136
  j as SUCCESS_CODES,
140
- O as handle,
137
+ J as handle,
141
138
  y as ok,
142
139
  E as okify,
143
- x as optimistic,
144
- J as runtime
140
+ O as optimistic,
141
+ D as runtime
145
142
  };
146
143
  //# 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 if (typeof value === \"number\") {\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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"}
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 /** @deprecated Use RequestOpts.FormData instead */\n formDataConstructor?: new () => FormData;\n FormData?: 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 (\n req.FormData ||\n req.formDataConstructor ||\n defaults.FormData ||\n defaults.formDataConstructor ||\n FormData\n )();\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":";;;AA0CO,SAASA,EAAQC,IAAwB,IAAI;AAClD,iBAAeC,EAAUC,GAAaC,GAAwB;AAC5D,UAAMC,IAAM,MAAMC,EAAQH,GAAKC,CAAG;AAClC,QAAIG;AACJ,QAAI;AACF,MAAAA,IAAO,MAAMF,EAAI,KAAA;AAAA,IACnB,QAAc;AAAA,IAAC;AAEf,WAAO;AAAA,MACL,QAAQA,EAAI;AAAA,MACZ,SAASA,EAAI;AAAA,MACb,aAAaA,EAAI,QAAQ,IAAI,cAAc;AAAA,MAC3C,MAAAE;AAAA,IAAA;AAAA,EAEJ;AAEA,iBAAeC,EACbL,GACAC,IAAwB,IACxB;AACA,UAAM,EAAE,QAAAK,GAAQ,SAAAC,GAAS,aAAAC,GAAa,MAAAJ,MAAS,MAAML,EAAUC,GAAK;AAAA,MAClE,GAAGC;AAAA,MACH,SAASQ;AAAA,QACP;AAAA,UACE,QAAQ;AAAA,QAAA;AAAA,QAEVR,EAAI;AAAA,MAAA;AAAA,IACN,CACD;AAID,YAFeO,IAAcA,EAAY,SAAS,MAAM,IAAI,MAGnD;AAAA,MACL,QAAAF;AAAA,MACA,SAAAC;AAAA,MACA,MAAMH,IAAO,KAAK,MAAMA,CAAI,IAAI;AAAA,IAAA,IAI7B,EAAE,QAAAE,GAAQ,SAAAC,GAAS,MAAAH,EAAA;AAAA,EAC5B;AAEA,iBAAeM,EACbV,GACAC,IAAwB,IACxB;AACA,UAAMC,IAAM,MAAMC,EAAQH,GAAKC,CAAG;AAClC,QAAIG;AACJ,QAAI;AACF,MAAAA,IAAO,MAAMF,EAAI,KAAA;AAAA,IACnB,QAAc;AAAA,IAAC;AACf,WAAO,EAAE,QAAQA,EAAI,QAAQ,SAASA,EAAI,SAAS,MAAAE,EAAA;AAAA,EACrD;AAEA,iBAAeD,EAAQH,GAAaC,IAAwB,IAAI;AAC9D,UAAM;AAAA,MACJ,SAAAU;AAAA,MACA,OAAOC;AAAA,MACP,GAAGC;AAAA,IAAA,IACD;AAAA,MACF,GAAGf;AAAA,MACH,GAAGG;AAAA,MACH,SAASQ,EAAaX,EAAS,SAASG,EAAI,OAAO;AAAA,IAAA,GAE/Ca,IAAOC,EAAQJ,GAASX,CAAG;AAEjC,WADY,OAAOY,KAAe,OAAOE,GAAMD,CAAI;AAAA,EAErD;AAEA,SAAO;AAAA,IACL,IAAAG;AAAA,IACA,WAAAjB;AAAA,IACA,WAAAM;AAAA,IACA,WAAAK;AAAA,IACA,cAAAD;AAAA,IAEA,KAAK,EAAE,MAAAQ,GAAM,SAAAV,GAAS,GAAGN,KAAwB;AAC/C,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,GAAIgB,KAAQ,QAAQ,EAAE,MAAM,KAAK,UAAUA,CAAI,EAAA;AAAA,QAC/C,SAASR;AAAA,UACP;AAAA,YACE,gBAAgB;AAAA,UAAA;AAAA,UAElBF;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IAEA,KAAK,EAAE,MAAAU,GAAM,SAAAV,GAAS,GAAGN,KAAwB;AAC/C,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,GAAIgB,KAAQ,QAAQ,EAAE,MAAMC,EAAQD,CAAI,EAAA;AAAA,QACxC,SAASR;AAAA,UACP;AAAA,YACE,gBAAgB;AAAA,UAAA;AAAA,UAElBF;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IAEA,UAAU,EAAE,MAAAU,GAAM,SAAAV,GAAS,GAAGN,KAA6B;AACzD,UAAIgB,KAAQ;AACV,eAAO,EAAE,GAAGhB,GAAK,MAAAgB,GAAM,SAASE,EAAiBZ,CAAO,EAAA;AAE1D,YAAMH,IAAO,KACXH,EAAI,YACJA,EAAI,uBACJH,EAAS,YACTA,EAAS,uBACT,UAAA,GAGIsB,IAAS,CAACC,GAAcC,MAAmB;AAC/C,QAAI,OAAOA,KAAU,YAAYA,aAAiB,OAChDlB,EAAK,OAAOiB,GAAMC,CAAK,IACd,OAAOA,KAAU,YAAY,OAAOA,KAAU,YACvDlB,EAAK,OAAOiB,GAAM,OAAOC,CAAK,CAAC,IAE/BlB,EAAK;AAAA,UACHiB;AAAA,UACA,IAAI,KAAK,CAAC,KAAK,UAAUC,CAAK,CAAC,GAAG,EAAE,MAAM,mBAAA,CAAoB;AAAA,QAAA;AAAA,MAGpE;AAEA,oBAAO,QAAQL,CAAI,EAAE,QAAQ,CAAC,CAACI,GAAMC,CAAK,MAAM;AAC9C,QAAI,MAAM,QAAQA,CAAK,IACrBA,EAAM,QAAQ,CAACC,MAAMH,EAAOC,GAAME,CAAC,CAAC,IAEpCH,EAAOC,GAAMC,CAAK;AAAA,MAEtB,CAAC,GAEM;AAAA,QACL,GAAGrB;AAAA,QACH,MAAMG;AAAA,QACN,SAASe,EAAiBZ,CAAO;AAAA,MAAA;AAAA,IAErC;AAAA,EAAA;AAEJ;ACrJA,eAAsBiB,EAGpBC,GAAqBC,GAAqD;AAC1E,QAAM,EAAE,QAAApB,GAAQ,MAAAF,GAAM,SAAAG,EAAA,IAAY,MAAMkB,GAClCE,IAAiBD,EAAgBpB,CAAM;AAC7C,MAAIqB,EAAe,QAAOA,EAAcvB,CAAI;AAC5C,MAAIsB,EAAQ,QAAS,QAAOA,EAAQ,QAAQpB,GAAQF,CAAI;AACxD,QAAM,IAAIwB,EAAUtB,GAAQF,GAAMG,CAAO;AAC3C;AAEO,MAAMsB,IAAgB,CAAC,KAAK,KAAK,KAAK,GAAG;AAkBhD,eAAsBb,EACpBS,GAC6B;AAC7B,QAAMvB,IAAM,MAAMuB;AAClB,MAAII,EAAc,KAAK,CAACC,MAAMA,KAAK5B,EAAI,MAAM,EAAG,QAAOA,EAAI;AAC3D,QAAM,IAAI0B,EAAU1B,EAAI,QAAQA,EAAI,MAAMA,EAAI,OAAO;AACvD;AAmBO,SAAS6B,EAA6BC,GAAiB;AAC5D,SAAO,IAAIC,MAAkBjB,EAAGgB,EAAG,GAAGC,CAAI,CAAC;AAC7C;AASO,SAASC,EACdC,GACkB;AAClB,QAAMC,IAAa,CAAA;AACnB,gBAAO,QAAQD,CAAG,EAAE,QAAQ,CAAC,CAACE,GAAKf,CAAK,MAAM;AAC5C,IAAAc,EAAMC,CAAG,IAAI,OAAOf,KAAU,aAAaS,EAAMT,CAAY,IAAIA;AAAA,EACnE,CAAC,GACMc;AACT;AAEO,MAAMR,UAAkB,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAYtB,GAAgBF,GAAWG,GAAkB;AACvD,UAAM,UAAUD,CAAM,EAAE,GACxB,KAAK,SAASA,GACd,KAAK,OAAOF,GACZ,KAAK,UAAUG;AAAA,EACjB;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oazapfts/runtime",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "Runtime for OpenApi TypeScript client generator",
5
5
  "type": "module",
6
6
  "main": "index.cjs",
package/query.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.cjs","sources":["../src/query.ts"],"sourcesContent":["import { encode, delimited, encodeReserved } from \"./util\";\n\n/**\n * Join params using an ampersand and prepends a questionmark if not empty.\n */\nexport function query(...params: string[]) {\n const s = params.filter(Boolean).join(\"&\");\n return s && `?${s}`;\n}\n\n/**\n * Serializes nested objects according to the `deepObject` style specified in\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#style-values\n */\nexport function deep(\n params: Record<string, any>,\n [k, v] = encodeReserved,\n): string {\n const qk = encode([(s) => s, k]);\n const qv = encode([(s) => s, v]);\n // don't add index to arrays\n // https://github.com/expressjs/body-parser/issues/289\n const visit = (obj: any, prefix = \"\"): string =>\n Object.entries(obj)\n .filter(([, v]) => v !== undefined)\n .map(([prop, v]) => {\n const index = Array.isArray(obj) ? \"\" : prop;\n const key = prefix ? qk`${prefix}[${index}]` : prop;\n if (typeof v === \"object\") {\n return visit(v, key);\n }\n return qv`${key}=${v}`;\n })\n .join(\"&\");\n\n return visit(params);\n}\n\n/**\n * Property values of type array or object generate separate parameters\n * for each value of the array, or key-value-pair of the map.\n * For other types of properties this property has no effect.\n * See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#encoding-object\n */\nexport function explode(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => q`${name}=${v}`).join(\"&\");\n }\n if (typeof value === \"object\") {\n return explode(value, encoders);\n }\n return q`${name}=${value}`;\n })\n .join(\"&\");\n}\n\nexport function json(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n const v = JSON.stringify(value);\n return q`${name}=${v}`;\n })\n .join(\"&\");\n}\n\nexport const form = delimited();\nexport const pipe = delimited(\"|\");\nexport const space = delimited(\"%20\");\n"],"names":["query","params","s","deep","k","v","encodeReserved","qk","encode","qv","visit","obj","prefix","prop","index","key","explode","encoders","q","value","name","json","form","delimited","pipe","space"],"mappings":"8GAKO,SAASA,KAASC,EAAkB,CACzC,MAAMC,EAAID,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG,EAClC,OAAAC,GAAK,IAAIA,CAAC,EACnB,CAMO,SAASC,EACdF,EACA,CAACG,EAAGC,CAAC,EAAIC,EAAAA,eACD,CACR,MAAMC,EAAKC,EAAAA,OAAO,CAAE,GAAM,EAAGJ,CAAC,CAAC,EACzBK,EAAKD,EAAAA,OAAO,CAAE,GAAM,EAAGH,CAAC,CAAC,EAGzBK,EAAQ,CAACC,EAAUC,EAAS,KAChC,OAAO,QAAQD,CAAG,EACf,OAAO,CAAC,CAAA,CAAGN,CAAC,IAAMA,IAAM,MAAS,EACjC,IAAI,CAAC,CAACQ,EAAMR,CAAC,IAAM,CAClB,MAAMS,EAAQ,MAAM,QAAQH,CAAG,EAAI,GAAKE,EAClCE,EAAMH,EAASL,IAAKK,CAAM,IAAIE,CAAK,IAAMD,EAC3C,OAAA,OAAOR,GAAM,SACRK,EAAML,EAAGU,CAAG,EAEdN,IAAKM,CAAG,IAAIV,CAAC,EAAA,CACrB,EACA,KAAK,GAAG,EAEb,OAAOK,EAAMT,CAAM,CACrB,CAQgB,SAAAe,EACdf,EACAgB,EAAWX,iBACH,CACF,MAAAY,EAAIV,SAAOS,CAAQ,EACzB,OAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,CAAGkB,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IACZ,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKd,GAAMa,IAAIE,CAAI,IAAIf,CAAC,EAAE,EAAE,KAAK,GAAG,EAE/C,OAAOc,GAAU,SACZH,EAAQG,EAAOF,CAAQ,EAEzBC,IAAIE,CAAI,IAAID,CAAK,EACzB,EACA,KAAK,GAAG,CACb,CAEgB,SAAAE,EACdpB,EACAgB,EAAWX,iBACH,CACF,MAAAY,EAAIV,SAAOS,CAAQ,EACzB,OAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,CAAGkB,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IAAM,CAChB,MAAAd,EAAI,KAAK,UAAUc,CAAK,EACvB,OAAAD,IAAIE,CAAI,IAAIf,CAAC,EAAA,CACrB,EACA,KAAK,GAAG,CACb,CAEO,MAAMiB,EAAOC,EAAAA,UAAU,EACjBC,EAAOD,YAAU,GAAG,EACpBE,EAAQF,YAAU,KAAK"}
1
+ {"version":3,"file":"query.cjs","sources":["../src/query.ts"],"sourcesContent":["import { encode, delimited, encodeReserved } from \"./util\";\n\n/**\n * Join params using an ampersand and prepends a questionmark if not empty.\n */\nexport function query(...params: string[]) {\n const s = params.filter(Boolean).join(\"&\");\n return s && `?${s}`;\n}\n\n/**\n * Serializes nested objects according to the `deepObject` style specified in\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#style-values\n */\nexport function deep(\n params: Record<string, any>,\n [k, v] = encodeReserved,\n): string {\n const qk = encode([(s) => s, k]);\n const qv = encode([(s) => s, v]);\n // don't add index to arrays\n // https://github.com/expressjs/body-parser/issues/289\n const visit = (obj: any, prefix = \"\"): string =>\n Object.entries(obj)\n .filter(([, v]) => v !== undefined)\n .map(([prop, v]) => {\n const index = Array.isArray(obj) ? \"\" : prop;\n const key = prefix ? qk`${prefix}[${index}]` : prop;\n if (typeof v === \"object\") {\n return visit(v, key);\n }\n return qv`${key}=${v}`;\n })\n .join(\"&\");\n\n return visit(params);\n}\n\n/**\n * Property values of type array or object generate separate parameters\n * for each value of the array, or key-value-pair of the map.\n * For other types of properties this property has no effect.\n * See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#encoding-object\n */\nexport function explode(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => q`${name}=${v}`).join(\"&\");\n }\n if (typeof value === \"object\") {\n return explode(value, encoders);\n }\n return q`${name}=${value}`;\n })\n .join(\"&\");\n}\n\nexport function json(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n const v = JSON.stringify(value);\n return q`${name}=${v}`;\n })\n .join(\"&\");\n}\n\nexport const form = delimited();\nexport const pipe = delimited(\"|\");\nexport const space = delimited(\"%20\");\n"],"names":["query","params","s","deep","k","v","encodeReserved","qk","encode","qv","visit","obj","prefix","prop","index","key","explode","encoders","q","value","name","json","form","delimited","pipe","space"],"mappings":"8GAKO,SAASA,KAASC,EAAkB,CACzC,MAAMC,EAAID,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG,EACzC,OAAOC,GAAK,IAAIA,CAAC,EACnB,CAMO,SAASC,EACdF,EACA,CAACG,EAAGC,CAAC,EAAIC,EAAAA,eACD,CACR,MAAMC,EAAKC,EAAAA,OAAO,CAAE,GAAM,EAAGJ,CAAC,CAAC,EACzBK,EAAKD,EAAAA,OAAO,CAAE,GAAM,EAAGH,CAAC,CAAC,EAGzBK,EAAQ,CAACC,EAAUC,EAAS,KAChC,OAAO,QAAQD,CAAG,EACf,OAAO,CAAC,EAAGN,CAAC,IAAMA,IAAM,MAAS,EACjC,IAAI,CAAC,CAACQ,EAAMR,CAAC,IAAM,CAClB,MAAMS,EAAQ,MAAM,QAAQH,CAAG,EAAI,GAAKE,EAClCE,EAAMH,EAASL,IAAKK,CAAM,IAAIE,CAAK,IAAMD,EAC/C,OAAI,OAAOR,GAAM,SACRK,EAAML,EAAGU,CAAG,EAEdN,IAAKM,CAAG,IAAIV,CAAC,EACtB,CAAC,EACA,KAAK,GAAG,EAEb,OAAOK,EAAMT,CAAM,CACrB,CAQO,SAASe,EACdf,EACAgB,EAAWX,iBACH,CACR,MAAMY,EAAIV,EAAAA,OAAOS,CAAQ,EACzB,OAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,CAAGkB,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IACZ,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKd,GAAMa,IAAIE,CAAI,IAAIf,CAAC,EAAE,EAAE,KAAK,GAAG,EAE/C,OAAOc,GAAU,SACZH,EAAQG,EAAOF,CAAQ,EAEzBC,IAAIE,CAAI,IAAID,CAAK,EACzB,EACA,KAAK,GAAG,CACb,CAEO,SAASE,EACdpB,EACAgB,EAAWX,iBACH,CACR,MAAMY,EAAIV,EAAAA,OAAOS,CAAQ,EACzB,OAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,CAAGkB,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IAAM,CACtB,MAAMd,EAAI,KAAK,UAAUc,CAAK,EAC9B,OAAOD,IAAIE,CAAI,IAAIf,CAAC,EACtB,CAAC,EACA,KAAK,GAAG,CACb,CAEO,MAAMiB,EAAOC,EAAAA,UAAA,EACPC,EAAOD,EAAAA,UAAU,GAAG,EACpBE,EAAQF,EAAAA,UAAU,KAAK"}
package/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sources":["../src/query.ts"],"sourcesContent":["import { encode, delimited, encodeReserved } from \"./util\";\n\n/**\n * Join params using an ampersand and prepends a questionmark if not empty.\n */\nexport function query(...params: string[]) {\n const s = params.filter(Boolean).join(\"&\");\n return s && `?${s}`;\n}\n\n/**\n * Serializes nested objects according to the `deepObject` style specified in\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#style-values\n */\nexport function deep(\n params: Record<string, any>,\n [k, v] = encodeReserved,\n): string {\n const qk = encode([(s) => s, k]);\n const qv = encode([(s) => s, v]);\n // don't add index to arrays\n // https://github.com/expressjs/body-parser/issues/289\n const visit = (obj: any, prefix = \"\"): string =>\n Object.entries(obj)\n .filter(([, v]) => v !== undefined)\n .map(([prop, v]) => {\n const index = Array.isArray(obj) ? \"\" : prop;\n const key = prefix ? qk`${prefix}[${index}]` : prop;\n if (typeof v === \"object\") {\n return visit(v, key);\n }\n return qv`${key}=${v}`;\n })\n .join(\"&\");\n\n return visit(params);\n}\n\n/**\n * Property values of type array or object generate separate parameters\n * for each value of the array, or key-value-pair of the map.\n * For other types of properties this property has no effect.\n * See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#encoding-object\n */\nexport function explode(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => q`${name}=${v}`).join(\"&\");\n }\n if (typeof value === \"object\") {\n return explode(value, encoders);\n }\n return q`${name}=${value}`;\n })\n .join(\"&\");\n}\n\nexport function json(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n const v = JSON.stringify(value);\n return q`${name}=${v}`;\n })\n .join(\"&\");\n}\n\nexport const form = delimited();\nexport const pipe = delimited(\"|\");\nexport const space = delimited(\"%20\");\n"],"names":["query","params","s","deep","k","v","encodeReserved","qk","encode","qv","visit","obj","prefix","prop","index","key","explode","encoders","q","value","name","json","form","delimited","pipe","space"],"mappings":";AAKO,SAASA,KAASC,GAAkB;AACzC,QAAMC,IAAID,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG;AAClC,SAAAC,KAAK,IAAIA,CAAC;AACnB;AAMO,SAASC,EACdF,GACA,CAACG,GAAGC,CAAC,IAAIC,GACD;AACR,QAAMC,IAAKC,EAAO,CAAC,CAACN,MAAMA,GAAGE,CAAC,CAAC,GACzBK,IAAKD,EAAO,CAAC,CAACN,MAAMA,GAAGG,CAAC,CAAC,GAGzBK,IAAQ,CAACC,GAAUC,IAAS,OAChC,OAAO,QAAQD,CAAG,EACf,OAAO,CAAC,CAAA,EAAGN,CAAC,MAAMA,MAAM,MAAS,EACjC,IAAI,CAAC,CAACQ,GAAMR,CAAC,MAAM;AAClB,UAAMS,IAAQ,MAAM,QAAQH,CAAG,IAAI,KAAKE,GAClCE,IAAMH,IAASL,IAAKK,CAAM,IAAIE,CAAK,MAAMD;AAC3C,WAAA,OAAOR,KAAM,WACRK,EAAML,GAAGU,CAAG,IAEdN,IAAKM,CAAG,IAAIV,CAAC;AAAA,EAAA,CACrB,EACA,KAAK,GAAG;AAEb,SAAOK,EAAMT,CAAM;AACrB;AAQgB,SAAAe,EACdf,GACAgB,IAAWX,GACH;AACF,QAAAY,IAAIV,EAAOS,CAAQ;AACzB,SAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,EAAGkB,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MACZ,MAAM,QAAQA,CAAK,IACdA,EAAM,IAAI,CAACd,MAAMa,IAAIE,CAAI,IAAIf,CAAC,EAAE,EAAE,KAAK,GAAG,IAE/C,OAAOc,KAAU,WACZH,EAAQG,GAAOF,CAAQ,IAEzBC,IAAIE,CAAI,IAAID,CAAK,EACzB,EACA,KAAK,GAAG;AACb;AAEgB,SAAAE,EACdpB,GACAgB,IAAWX,GACH;AACF,QAAAY,IAAIV,EAAOS,CAAQ;AACzB,SAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,EAAGkB,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MAAM;AAChB,UAAAd,IAAI,KAAK,UAAUc,CAAK;AACvB,WAAAD,IAAIE,CAAI,IAAIf,CAAC;AAAA,EAAA,CACrB,EACA,KAAK,GAAG;AACb;AAEO,MAAMiB,IAAOC,EAAU,GACjBC,IAAOD,EAAU,GAAG,GACpBE,IAAQF,EAAU,KAAK;"}
1
+ {"version":3,"file":"query.js","sources":["../src/query.ts"],"sourcesContent":["import { encode, delimited, encodeReserved } from \"./util\";\n\n/**\n * Join params using an ampersand and prepends a questionmark if not empty.\n */\nexport function query(...params: string[]) {\n const s = params.filter(Boolean).join(\"&\");\n return s && `?${s}`;\n}\n\n/**\n * Serializes nested objects according to the `deepObject` style specified in\n * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#style-values\n */\nexport function deep(\n params: Record<string, any>,\n [k, v] = encodeReserved,\n): string {\n const qk = encode([(s) => s, k]);\n const qv = encode([(s) => s, v]);\n // don't add index to arrays\n // https://github.com/expressjs/body-parser/issues/289\n const visit = (obj: any, prefix = \"\"): string =>\n Object.entries(obj)\n .filter(([, v]) => v !== undefined)\n .map(([prop, v]) => {\n const index = Array.isArray(obj) ? \"\" : prop;\n const key = prefix ? qk`${prefix}[${index}]` : prop;\n if (typeof v === \"object\") {\n return visit(v, key);\n }\n return qv`${key}=${v}`;\n })\n .join(\"&\");\n\n return visit(params);\n}\n\n/**\n * Property values of type array or object generate separate parameters\n * for each value of the array, or key-value-pair of the map.\n * For other types of properties this property has no effect.\n * See https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#encoding-object\n */\nexport function explode(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => q`${name}=${v}`).join(\"&\");\n }\n if (typeof value === \"object\") {\n return explode(value, encoders);\n }\n return q`${name}=${value}`;\n })\n .join(\"&\");\n}\n\nexport function json(\n params: Record<string, any>,\n encoders = encodeReserved,\n): string {\n const q = encode(encoders);\n return Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => {\n const v = JSON.stringify(value);\n return q`${name}=${v}`;\n })\n .join(\"&\");\n}\n\nexport const form = delimited();\nexport const pipe = delimited(\"|\");\nexport const space = delimited(\"%20\");\n"],"names":["query","params","s","deep","k","v","encodeReserved","qk","encode","qv","visit","obj","prefix","prop","index","key","explode","encoders","q","value","name","json","form","delimited","pipe","space"],"mappings":";AAKO,SAASA,KAASC,GAAkB;AACzC,QAAMC,IAAID,EAAO,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC,SAAOC,KAAK,IAAIA,CAAC;AACnB;AAMO,SAASC,EACdF,GACA,CAACG,GAAGC,CAAC,IAAIC,GACD;AACR,QAAMC,IAAKC,EAAO,CAAC,CAACN,MAAMA,GAAGE,CAAC,CAAC,GACzBK,IAAKD,EAAO,CAAC,CAACN,MAAMA,GAAGG,CAAC,CAAC,GAGzBK,IAAQ,CAACC,GAAUC,IAAS,OAChC,OAAO,QAAQD,CAAG,EACf,OAAO,CAAC,GAAGN,CAAC,MAAMA,MAAM,MAAS,EACjC,IAAI,CAAC,CAACQ,GAAMR,CAAC,MAAM;AAClB,UAAMS,IAAQ,MAAM,QAAQH,CAAG,IAAI,KAAKE,GAClCE,IAAMH,IAASL,IAAKK,CAAM,IAAIE,CAAK,MAAMD;AAC/C,WAAI,OAAOR,KAAM,WACRK,EAAML,GAAGU,CAAG,IAEdN,IAAKM,CAAG,IAAIV,CAAC;AAAA,EACtB,CAAC,EACA,KAAK,GAAG;AAEb,SAAOK,EAAMT,CAAM;AACrB;AAQO,SAASe,EACdf,GACAgB,IAAWX,GACH;AACR,QAAMY,IAAIV,EAAOS,CAAQ;AACzB,SAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,EAAGkB,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MACZ,MAAM,QAAQA,CAAK,IACdA,EAAM,IAAI,CAACd,MAAMa,IAAIE,CAAI,IAAIf,CAAC,EAAE,EAAE,KAAK,GAAG,IAE/C,OAAOc,KAAU,WACZH,EAAQG,GAAOF,CAAQ,IAEzBC,IAAIE,CAAI,IAAID,CAAK,EACzB,EACA,KAAK,GAAG;AACb;AAEO,SAASE,EACdpB,GACAgB,IAAWX,GACH;AACR,QAAMY,IAAIV,EAAOS,CAAQ;AACzB,SAAO,OAAO,QAAQhB,CAAM,EACzB,OAAO,CAAC,CAAA,EAAGkB,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MAAM;AACtB,UAAMd,IAAI,KAAK,UAAUc,CAAK;AAC9B,WAAOD,IAAIE,CAAI,IAAIf,CAAC;AAAA,EACtB,CAAC,EACA,KAAK,GAAG;AACb;AAEO,MAAMiB,IAAOC,EAAA,GACPC,IAAOD,EAAU,GAAG,GACpBE,IAAQF,EAAU,KAAK;"}
package/util.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.cjs","sources":["../src/util.ts"],"sourcesContent":["type Encoders = Array<(s: string) => string>;\n\n// Encode param names and values as URIComponent\nexport const encodeReserved = [encodeURIComponent, encodeURIComponent];\nexport const allowReserved = [encodeURIComponent, encodeURI];\n\n/**\n * Creates a tag-function to encode template strings with the given encoders.\n */\nexport function encode(encoders: Encoders, delimiter = \",\") {\n const q = (v: any, i: number) => {\n const encoder = encoders[i % encoders.length];\n if (typeof v === \"undefined\") {\n return \"\";\n }\n if (typeof v === \"object\") {\n if (Array.isArray(v)) {\n return v.map(encoder).join(delimiter);\n }\n const flat = Object.entries(v).reduce(\n (flat, entry) => [...flat, ...entry],\n [] as any,\n );\n return flat.map(encoder).join(delimiter);\n }\n\n return encoder(String(v));\n };\n\n return (strings: TemplateStringsArray, ...values: any[]) => {\n return strings.reduce((prev, s, i) => {\n return `${prev}${s}${q(values[i], i)}`;\n }, \"\");\n };\n}\n\n/**\n * Separate array values by the given delimiter.\n */\nexport function delimited(delimiter = \",\") {\n return (params: Record<string, any>, encoders = encodeReserved) =>\n Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => encode(encoders, delimiter)`${name}=${value}`)\n .join(\"&\");\n}\n\nexport function joinUrl(...parts: Array<string | undefined>) {\n return parts\n .filter(Boolean)\n .map((s, i) => (i === 0 ? s : s!.replace(/^\\/+/, \"\")))\n .map((s, i, a) => (i === a.length - 1 ? s : s!.replace(/\\/+$/, \"\")))\n .join(\"/\");\n}\n"],"names":["encodeReserved","allowReserved","encode","encoders","delimiter","q","v","i","encoder","flat","entry","strings","values","prev","s","delimited","params","value","name","joinUrl","parts","a"],"mappings":"gFAGa,MAAAA,EAAiB,CAAC,mBAAoB,kBAAkB,EACxDC,EAAgB,CAAC,mBAAoB,SAAS,EAK3C,SAAAC,EAAOC,EAAoBC,EAAY,IAAK,CACpD,MAAAC,EAAI,CAACC,EAAQC,IAAc,CAC/B,MAAMC,EAAUL,EAASI,EAAIJ,EAAS,MAAM,EACxC,OAAA,OAAOG,GAAM,YACR,GAEL,OAAOA,GAAM,SACX,MAAM,QAAQA,CAAC,EACVA,EAAE,IAAIE,CAAO,EAAE,KAAKJ,CAAS,EAEzB,OAAO,QAAQE,CAAC,EAAE,OAC7B,CAACG,EAAMC,IAAU,CAAC,GAAGD,EAAM,GAAGC,CAAK,EACnC,CAAC,CAAA,EAES,IAAIF,CAAO,EAAE,KAAKJ,CAAS,EAGlCI,EAAQ,OAAOF,CAAC,CAAC,CAAA,EAGnB,MAAA,CAACK,KAAkCC,IACjCD,EAAQ,OAAO,CAACE,EAAMC,EAAG,IACvB,GAAGD,CAAI,GAAGC,CAAC,GAAGT,EAAEO,EAAO,CAAC,EAAG,CAAC,CAAC,GACnC,EAAE,CAET,CAKgB,SAAAG,EAAUX,EAAY,IAAK,CACzC,MAAO,CAACY,EAA6Bb,EAAWH,IAC9C,OAAO,QAAQgB,CAAM,EAClB,OAAO,CAAC,CAAA,CAAGC,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IAAMf,EAAOC,EAAUC,CAAS,IAAIc,CAAI,IAAID,CAAK,EAAE,EACpE,KAAK,GAAG,CACf,CAEO,SAASE,KAAWC,EAAkC,CAC3D,OAAOA,EACJ,OAAO,OAAO,EACd,IAAI,CAACN,EAAGP,IAAOA,IAAM,EAAIO,EAAIA,EAAG,QAAQ,OAAQ,EAAE,CAAE,EACpD,IAAI,CAACA,EAAGP,EAAGc,IAAOd,IAAMc,EAAE,OAAS,EAAIP,EAAIA,EAAG,QAAQ,OAAQ,EAAE,CAAE,EAClE,KAAK,GAAG,CACb"}
1
+ {"version":3,"file":"util.cjs","sources":["../src/util.ts"],"sourcesContent":["type Encoders = Array<(s: string) => string>;\n\n// Encode param names and values as URIComponent\nexport const encodeReserved = [encodeURIComponent, encodeURIComponent];\nexport const allowReserved = [encodeURIComponent, encodeURI];\n\n/**\n * Creates a tag-function to encode template strings with the given encoders.\n */\nexport function encode(encoders: Encoders, delimiter = \",\") {\n const q = (v: any, i: number) => {\n const encoder = encoders[i % encoders.length];\n if (typeof v === \"undefined\") {\n return \"\";\n }\n if (typeof v === \"object\") {\n if (Array.isArray(v)) {\n return v.map(encoder).join(delimiter);\n }\n const flat = Object.entries(v).reduce(\n (flat, entry) => [...flat, ...entry],\n [] as any,\n );\n return flat.map(encoder).join(delimiter);\n }\n\n return encoder(String(v));\n };\n\n return (strings: TemplateStringsArray, ...values: any[]) => {\n return strings.reduce((prev, s, i) => {\n return `${prev}${s}${q(values[i], i)}`;\n }, \"\");\n };\n}\n\n/**\n * Separate array values by the given delimiter.\n */\nexport function delimited(delimiter = \",\") {\n return (params: Record<string, any>, encoders = encodeReserved) =>\n Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => encode(encoders, delimiter)`${name}=${value}`)\n .join(\"&\");\n}\n\nexport function joinUrl(...parts: Array<string | undefined>) {\n return parts\n .filter(Boolean)\n .map((s, i) => (i === 0 ? s : s!.replace(/^\\/+/, \"\")))\n .map((s, i, a) => (i === a.length - 1 ? s : s!.replace(/\\/+$/, \"\")))\n .join(\"/\");\n}\n"],"names":["encodeReserved","allowReserved","encode","encoders","delimiter","q","v","i","encoder","flat","entry","strings","values","prev","s","delimited","params","value","name","joinUrl","parts","a"],"mappings":"gFAGO,MAAMA,EAAiB,CAAC,mBAAoB,kBAAkB,EACxDC,EAAgB,CAAC,mBAAoB,SAAS,EAKpD,SAASC,EAAOC,EAAoBC,EAAY,IAAK,CAC1D,MAAMC,EAAI,CAACC,EAAQC,IAAc,CAC/B,MAAMC,EAAUL,EAASI,EAAIJ,EAAS,MAAM,EAC5C,OAAI,OAAOG,GAAM,YACR,GAEL,OAAOA,GAAM,SACX,MAAM,QAAQA,CAAC,EACVA,EAAE,IAAIE,CAAO,EAAE,KAAKJ,CAAS,EAEzB,OAAO,QAAQE,CAAC,EAAE,OAC7B,CAACG,EAAMC,IAAU,CAAC,GAAGD,EAAM,GAAGC,CAAK,EACnC,CAAA,CAAC,EAES,IAAIF,CAAO,EAAE,KAAKJ,CAAS,EAGlCI,EAAQ,OAAOF,CAAC,CAAC,CAC1B,EAEA,MAAO,CAACK,KAAkCC,IACjCD,EAAQ,OAAO,CAACE,EAAMC,EAAG,IACvB,GAAGD,CAAI,GAAGC,CAAC,GAAGT,EAAEO,EAAO,CAAC,EAAG,CAAC,CAAC,GACnC,EAAE,CAET,CAKO,SAASG,EAAUX,EAAY,IAAK,CACzC,MAAO,CAACY,EAA6Bb,EAAWH,IAC9C,OAAO,QAAQgB,CAAM,EAClB,OAAO,CAAC,CAAA,CAAGC,CAAK,IAAMA,IAAU,MAAS,EACzC,IAAI,CAAC,CAACC,EAAMD,CAAK,IAAMf,EAAOC,EAAUC,CAAS,IAAIc,CAAI,IAAID,CAAK,EAAE,EACpE,KAAK,GAAG,CACf,CAEO,SAASE,KAAWC,EAAkC,CAC3D,OAAOA,EACJ,OAAO,OAAO,EACd,IAAI,CAACN,EAAGP,IAAOA,IAAM,EAAIO,EAAIA,EAAG,QAAQ,OAAQ,EAAE,CAAE,EACpD,IAAI,CAACA,EAAGP,EAAGc,IAAOd,IAAMc,EAAE,OAAS,EAAIP,EAAIA,EAAG,QAAQ,OAAQ,EAAE,CAAE,EAClE,KAAK,GAAG,CACb"}
package/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["type Encoders = Array<(s: string) => string>;\n\n// Encode param names and values as URIComponent\nexport const encodeReserved = [encodeURIComponent, encodeURIComponent];\nexport const allowReserved = [encodeURIComponent, encodeURI];\n\n/**\n * Creates a tag-function to encode template strings with the given encoders.\n */\nexport function encode(encoders: Encoders, delimiter = \",\") {\n const q = (v: any, i: number) => {\n const encoder = encoders[i % encoders.length];\n if (typeof v === \"undefined\") {\n return \"\";\n }\n if (typeof v === \"object\") {\n if (Array.isArray(v)) {\n return v.map(encoder).join(delimiter);\n }\n const flat = Object.entries(v).reduce(\n (flat, entry) => [...flat, ...entry],\n [] as any,\n );\n return flat.map(encoder).join(delimiter);\n }\n\n return encoder(String(v));\n };\n\n return (strings: TemplateStringsArray, ...values: any[]) => {\n return strings.reduce((prev, s, i) => {\n return `${prev}${s}${q(values[i], i)}`;\n }, \"\");\n };\n}\n\n/**\n * Separate array values by the given delimiter.\n */\nexport function delimited(delimiter = \",\") {\n return (params: Record<string, any>, encoders = encodeReserved) =>\n Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => encode(encoders, delimiter)`${name}=${value}`)\n .join(\"&\");\n}\n\nexport function joinUrl(...parts: Array<string | undefined>) {\n return parts\n .filter(Boolean)\n .map((s, i) => (i === 0 ? s : s!.replace(/^\\/+/, \"\")))\n .map((s, i, a) => (i === a.length - 1 ? s : s!.replace(/\\/+$/, \"\")))\n .join(\"/\");\n}\n"],"names":["encodeReserved","allowReserved","encode","encoders","delimiter","q","v","i","encoder","flat","entry","strings","values","prev","s","delimited","params","value","name","joinUrl","parts","a"],"mappings":"AAGa,MAAAA,IAAiB,CAAC,oBAAoB,kBAAkB,GACxDC,IAAgB,CAAC,oBAAoB,SAAS;AAK3C,SAAAC,EAAOC,GAAoBC,IAAY,KAAK;AACpD,QAAAC,IAAI,CAACC,GAAQC,MAAc;AAC/B,UAAMC,IAAUL,EAASI,IAAIJ,EAAS,MAAM;AACxC,WAAA,OAAOG,IAAM,MACR,KAEL,OAAOA,KAAM,WACX,MAAM,QAAQA,CAAC,IACVA,EAAE,IAAIE,CAAO,EAAE,KAAKJ,CAAS,IAEzB,OAAO,QAAQE,CAAC,EAAE;AAAA,MAC7B,CAACG,GAAMC,MAAU,CAAC,GAAGD,GAAM,GAAGC,CAAK;AAAA,MACnC,CAAC;AAAA,IAAA,EAES,IAAIF,CAAO,EAAE,KAAKJ,CAAS,IAGlCI,EAAQ,OAAOF,CAAC,CAAC;AAAA,EAAA;AAGnB,SAAA,CAACK,MAAkCC,MACjCD,EAAQ,OAAO,CAACE,GAAMC,GAAG,MACvB,GAAGD,CAAI,GAAGC,CAAC,GAAGT,EAAEO,EAAO,CAAC,GAAG,CAAC,CAAC,IACnC,EAAE;AAET;AAKgB,SAAAG,EAAUX,IAAY,KAAK;AACzC,SAAO,CAACY,GAA6Bb,IAAWH,MAC9C,OAAO,QAAQgB,CAAM,EAClB,OAAO,CAAC,CAAA,EAAGC,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MAAMf,EAAOC,GAAUC,CAAS,IAAIc,CAAI,IAAID,CAAK,EAAE,EACpE,KAAK,GAAG;AACf;AAEO,SAASE,KAAWC,GAAkC;AAC3D,SAAOA,EACJ,OAAO,OAAO,EACd,IAAI,CAACN,GAAGP,MAAOA,MAAM,IAAIO,IAAIA,EAAG,QAAQ,QAAQ,EAAE,CAAE,EACpD,IAAI,CAACA,GAAGP,GAAGc,MAAOd,MAAMc,EAAE,SAAS,IAAIP,IAAIA,EAAG,QAAQ,QAAQ,EAAE,CAAE,EAClE,KAAK,GAAG;AACb;"}
1
+ {"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["type Encoders = Array<(s: string) => string>;\n\n// Encode param names and values as URIComponent\nexport const encodeReserved = [encodeURIComponent, encodeURIComponent];\nexport const allowReserved = [encodeURIComponent, encodeURI];\n\n/**\n * Creates a tag-function to encode template strings with the given encoders.\n */\nexport function encode(encoders: Encoders, delimiter = \",\") {\n const q = (v: any, i: number) => {\n const encoder = encoders[i % encoders.length];\n if (typeof v === \"undefined\") {\n return \"\";\n }\n if (typeof v === \"object\") {\n if (Array.isArray(v)) {\n return v.map(encoder).join(delimiter);\n }\n const flat = Object.entries(v).reduce(\n (flat, entry) => [...flat, ...entry],\n [] as any,\n );\n return flat.map(encoder).join(delimiter);\n }\n\n return encoder(String(v));\n };\n\n return (strings: TemplateStringsArray, ...values: any[]) => {\n return strings.reduce((prev, s, i) => {\n return `${prev}${s}${q(values[i], i)}`;\n }, \"\");\n };\n}\n\n/**\n * Separate array values by the given delimiter.\n */\nexport function delimited(delimiter = \",\") {\n return (params: Record<string, any>, encoders = encodeReserved) =>\n Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([name, value]) => encode(encoders, delimiter)`${name}=${value}`)\n .join(\"&\");\n}\n\nexport function joinUrl(...parts: Array<string | undefined>) {\n return parts\n .filter(Boolean)\n .map((s, i) => (i === 0 ? s : s!.replace(/^\\/+/, \"\")))\n .map((s, i, a) => (i === a.length - 1 ? s : s!.replace(/\\/+$/, \"\")))\n .join(\"/\");\n}\n"],"names":["encodeReserved","allowReserved","encode","encoders","delimiter","q","v","i","encoder","flat","entry","strings","values","prev","s","delimited","params","value","name","joinUrl","parts","a"],"mappings":"AAGO,MAAMA,IAAiB,CAAC,oBAAoB,kBAAkB,GACxDC,IAAgB,CAAC,oBAAoB,SAAS;AAKpD,SAASC,EAAOC,GAAoBC,IAAY,KAAK;AAC1D,QAAMC,IAAI,CAACC,GAAQC,MAAc;AAC/B,UAAMC,IAAUL,EAASI,IAAIJ,EAAS,MAAM;AAC5C,WAAI,OAAOG,IAAM,MACR,KAEL,OAAOA,KAAM,WACX,MAAM,QAAQA,CAAC,IACVA,EAAE,IAAIE,CAAO,EAAE,KAAKJ,CAAS,IAEzB,OAAO,QAAQE,CAAC,EAAE;AAAA,MAC7B,CAACG,GAAMC,MAAU,CAAC,GAAGD,GAAM,GAAGC,CAAK;AAAA,MACnC,CAAA;AAAA,IAAC,EAES,IAAIF,CAAO,EAAE,KAAKJ,CAAS,IAGlCI,EAAQ,OAAOF,CAAC,CAAC;AAAA,EAC1B;AAEA,SAAO,CAACK,MAAkCC,MACjCD,EAAQ,OAAO,CAACE,GAAMC,GAAG,MACvB,GAAGD,CAAI,GAAGC,CAAC,GAAGT,EAAEO,EAAO,CAAC,GAAG,CAAC,CAAC,IACnC,EAAE;AAET;AAKO,SAASG,EAAUX,IAAY,KAAK;AACzC,SAAO,CAACY,GAA6Bb,IAAWH,MAC9C,OAAO,QAAQgB,CAAM,EAClB,OAAO,CAAC,CAAA,EAAGC,CAAK,MAAMA,MAAU,MAAS,EACzC,IAAI,CAAC,CAACC,GAAMD,CAAK,MAAMf,EAAOC,GAAUC,CAAS,IAAIc,CAAI,IAAID,CAAK,EAAE,EACpE,KAAK,GAAG;AACf;AAEO,SAASE,KAAWC,GAAkC;AAC3D,SAAOA,EACJ,OAAO,OAAO,EACd,IAAI,CAACN,GAAGP,MAAOA,MAAM,IAAIO,IAAIA,EAAG,QAAQ,QAAQ,EAAE,CAAE,EACpD,IAAI,CAACA,GAAGP,GAAGc,MAAOd,MAAMc,EAAE,SAAS,IAAIP,IAAIA,EAAG,QAAQ,QAAQ,EAAE,CAAE,EAClE,KAAK,GAAG;AACb;"}