@opra/client 1.0.0-alpha.9 → 1.0.0-beta.2

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.
@@ -0,0 +1,8 @@
1
+ /****************************************
2
+ * All rights reserved Panates® 2022-2024
3
+ * http://www.panates.com
4
+ *****************************************/
5
+
6
+ "use strict";var _=Object.create;var w=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var d=(n,e)=>w(n,"name",{value:e,configurable:!0});var ae=(n,e)=>{for(var t in e)w(n,t,{get:e[t],enumerable:!0})},K=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of te(e))!se.call(n,a)&&a!==t&&w(n,a,{get:()=>e[a],enumerable:!(r=ee(e,a))||r.enumerable});return n};var M=(n,e,t)=>(t=n!=null?_(re(n)):{},K(e||!n||!n.__esModule?w(t,"default",{value:n,enumerable:!0}):t,n)),oe=n=>K(w({},"__esModule",{value:!0}),n);var he={};ae(he,{Backend:()=>S,ClientError:()=>b,FetchBackend:()=>P,HttpBackend:()=>R,HttpClientBase:()=>k,HttpEventType:()=>f,HttpObserveType:()=>u,HttpRequestObservable:()=>U,HttpResponse:()=>T,OpraHttpClient:()=>N,kBackend:()=>h,kClient:()=>V,kContext:()=>l,urlPath:()=>ce});module.exports=oe(he);var V=Symbol.for("kClient"),h=Symbol.for("kBackend"),l=Symbol.for("kContext");var O=class O{constructor(e){this.document=e==null?void 0:e.document}};d(O,"Backend");var S=O;var H=class H extends Error{constructor(e,t){super(e.message),this.cause=t,this.issues=e.issues||[],this.status=e.status,t&&(this.cause=t,t.stack&&(this.stack=t.stack))}};d(H,"ClientError");var b=H;var u;(function(n){n.ResponseHeader="response-header",n.Response="response",n.Body="body",n.Events="events"})(u||(u={}));var j=M(require("@browsery/type-is"),1),E=require("@opra/common"),W=require("rxjs"),$=require("rxjs/internal/util/isReadableStreamLike");var A=class A extends S{constructor(e,t){super(t);let r=new URL(e);this.serviceUrl=r.toString().split("?")[0].split("#")[0],this.serviceUrl.endsWith("/")||(this.serviceUrl+="/")}};d(A,"HttpBackend");var R=A;var L=class L{constructor(e){this.hasBody=!1,this.headers=(e==null?void 0:e.headers)instanceof Headers?e==null?void 0:e.headers:new Headers(e==null?void 0:e.headers),this.status=(e==null?void 0:e.status)||200,this.statusText=(e==null?void 0:e.statusText)||"OK",this.url=(e==null?void 0:e.url)||null,this.ok=this.status>=200&&this.status<300,this.body=e==null?void 0:e.body,this.hasBody=(e==null?void 0:e.body)!=null||!!(e!=null&&e.hasBody),this.contentType=(this.headers.get("content-type")||"").split(";")[0]}clone(e){return new L({...this,...e})}};d(L,"HttpResponse");var T=L;var f;(function(n){n.Sent="Sent",n.UploadProgress="UploadProgress",n.ResponseHeader="ResponseHeader",n.DownloadProgress="DownloadProgress",n.Response="Response",n.User="User"})(f||(f={}));var I=class I extends R{constructor(e,t){var r,a,s,o,c,m;super(e,t),this.interceptors=Array.from(new Set([...(t==null?void 0:t.interceptors)||[]])),this.defaults={...t==null?void 0:t.defaults,headers:((r=t==null?void 0:t.defaults)==null?void 0:r.headers)instanceof Headers?(a=t==null?void 0:t.defaults)==null?void 0:a.headers:new Headers((s=t==null?void 0:t.defaults)==null?void 0:s.headers),params:((o=t==null?void 0:t.defaults)==null?void 0:o.params)instanceof URLSearchParams?(c=t==null?void 0:t.defaults)==null?void 0:c.params:new URLSearchParams((m=t==null?void 0:t.defaults)==null?void 0:m.params)}}handle(e){return new W.Observable(t=>{(async()=>{let r=this.prepareRequest(e);if(r.body&&e.reportProgress){let y=r.body,p=r.headers.get("content-length")||"0",i=parseInt(p,10)||0,x=0,v=new TransformStream({transform(g,D){D.enqueue(g),x+=g.byteLength,t.next({type:f.UploadProgress,request:r,total:i,loaded:x})}});r=new Request(r.url,{cache:r.cache,credentials:r.credentials,headers:r.headers,integrity:r.integrity,keepalive:r.keepalive,method:r.method,mode:r.mode,redirect:r.redirect,referrer:r.referrer,referrerPolicy:r.referrerPolicy,signal:r.signal,body:y.pipeThrough(v),window:e.window,duplex:"half"})}let a=this.send(r);t.next({request:r,type:f.Sent});let s=await a,o=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,hasBody:!!s.body});t.next({request:r,type:f.ResponseHeader,response:o});let c;if(s.body)if(e.reportProgress){let y=s.body,p=s.headers.get("content-length")||"0",i=parseInt(p,10)||0,x=0,v=new Response(new ReadableStream({async start(g){let D=y.getReader();for(;;){let{done:Z,value:G}=await D.read();if(Z)break;x+=G.byteLength,g.enqueue(G),t.next({type:f.DownloadProgress,request:r,total:i,loaded:x})}g.close()}}));c=await this.parseBody(v)}else c=await this.parseBody(s);let m=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,body:c});t.next({request:r,type:f.Response,response:m}),t.complete()})().catch(r=>t.error(r))})}send(e){return fetch(e)}prepareRequest(e){let t=e.headers||new Headers,r={...e,headers:t};this.defaults.headers.forEach((o,c)=>{t.has(c)||t.set(c,o)});let a=new URL(r.url,this.serviceUrl);this.defaults.params.size&&(this.defaults.params.forEach((o,c)=>{a.searchParams.has(c)||a.searchParams.set(c,o)}),r.url=a.toString());let s=r.body;if(s){let o="";typeof s=="string"||typeof s=="number"||typeof s=="boolean"?(o='text/plain; charset="UTF-8"',r.body=new Blob([String(s)],{type:o}),t.set("Content-Length",String(r.body.size)),delete r.duplex):(0,$.isReadableStreamLike)(s)?(o="application/octet-stream",r.duplex="half"):Buffer.isBuffer(s)?(o="application/octet-stream",t.set("Content-Length",String(s.length)),delete r.duplex):(0,E.isBlob)(s)?(o=s.type||"application/octet-stream",t.set("Content-Length",String(s.size)),delete r.duplex):((0,E.isFormData)(s)||(o='application/json;charset="UTF-8"',r.body=new Blob([JSON.stringify(s)],{type:o}),t.set("Content-Length",String(r.body.size))),delete r.duplex),o&&!t.has("Content-Type")&&t.set("Content-Type",o)}return new Request(a.toString(),r)}createResponse(e){return new T(e)}async parseBody(e){let t,r=e.headers.get("Content-Type")||"";if(j.default.is(r,["json","application/*+json"]))t=await e.json(),typeof t=="string"&&(t=JSON.parse(t));else if(j.default.is(r,["text"]))t=await e.text();else if(j.default.is(r,["multipart"]))t=await e.formData();else{let a=await e.arrayBuffer();a.byteLength&&(t=a)}return t}};d(I,"FetchBackend");var P=I;var Y=require("@opra/common");var Q=M(require("@browsery/type-is"),1),X=require("@opra/common"),B=require("rxjs");var z=class z{constructor(e,t){this.chain=e.reduceRight((r,a)=>(s,o)=>a.intercept(s,{handle:d(c=>r(c,o),"handle")}),ne),this.finalHandler=t}handle(e){return this.chain(e,t=>this.finalHandler.handle(t))}};d(z,"HttpInterceptorHandler");var q=z;function ne(n,e){return e(n)}d(ne,"chainEnd");var C=class C extends B.Observable{constructor(e,t){super(r=>{let a=this[l].observe;new q(e.interceptors||[],this[h]).handle(this[l]).subscribe({next(s){if(a===u.Events){r.next(s);return}if(a===u.ResponseHeader&&s.type===f.ResponseHeader){r.next(s.response),r.complete();return}if(s.type===f.Response){let{response:o}=s;if(a===u.Response){r.next(o),r.complete();return}let c=Q.default.is(s.response.contentType||"",[X.MimeTypes.opra_response_json]);if(o.status>=400&&o.status<600){r.error(new b({message:o.status+" "+o.statusText,status:o.status,issues:c?o.body.errors:void 0})),r.complete();return}r.next(s.response.body),r.complete()}},error(s){r.error(s)},complete(){r.complete()}})}),Object.defineProperty(this,h,{enumerable:!1,value:e}),Object.defineProperty(this,l,{enumerable:!1,value:{...t,observe:u.Body,headers:new Headers(t==null?void 0:t.headers)}})}clone(){return new C(this[h],this[l])}options(e){return Object.assign(this[l],e),this}header(e,t){let r=this[l].headers;return typeof e=="object"?((e instanceof Headers?e:new Headers(e)).forEach((s,o)=>{o.toLowerCase()==="set-cookie"?r.append(o,s):r.set(o,s)}),this):(t==null||t===""?r.delete(e):r.append(e,String(t)),this)}param(e,t){t&&typeof t=="object"&&(t=JSON.stringify(t));let r=this[l].url.searchParams;return typeof e=="object"?(typeof e.forEach=="function"?e.forEach((a,s)=>r.set(String(s),String(a))):Object.entries(e).forEach(a=>r.set(String(a[0]),String(a[1]))),this):(t==null?r.delete(e):r.set(e,String(t)),this)}observe(e){if(e===this[l].observe)return this;let t=this.clone();return t[l].observe=e||u.Body,t}getBody(){return(0,B.lastValueFrom)(this.observe(u.Body))}getResponse(){return(0,B.lastValueFrom)(this.observe(u.Response))}};d(C,"HttpRequestObservable");var U=C;var de=/^(\/*)(.+)/,F=class F{constructor(e){Object.defineProperty(this,h,{enumerable:!1,value:e})}get serviceUrl(){return this[h].serviceUrl}async fetchDocument(e){let t={},r=d(async s=>{let o=this.request("$schema",{headers:new Headers({accept:"application/json"})});s&&o.param("id",s);let c=await o.getBody().catch(m=>{throw m.message="Error fetching api schema from url ("+this.serviceUrl+`).
7
+ `+m.message,m});if(c.references){let m=c.references;c.references={};for(let[y,p]of Object.entries(m)){if(t[p.id]===null)throw new Error("Circular reference detected");t[p.id]=null;let i=await r(p.id);c.references[y]=t[p.id]=i}}return c},"getDocument"),a=await r(e==null?void 0:e.documentId);return await Y.ApiDocumentFactory.createDocument(a).catch(s=>{throw s.message=`Error loading api document.
8
+ `+s.message,s})}request(e,t){var a;e=((a=de.exec(e))==null?void 0:a[2])||"";let r=new U(this[h],{...t,method:(t==null?void 0:t.method)||"GET",url:new URL(e,this.serviceUrl)});return t!=null&&t.params&&r.param(t.params),r}delete(e,t){return this.request(e,{...t,method:"DELETE"})}get(e,t){return this.request(e,{...t,method:"GET"})}patch(e,t,r){return this.request(e,{...r,method:"PATCH",body:t})}post(e,t,r){return this.request(e,{...r,method:"POST",body:t})}put(e,t,r){return this.request(e,{...r,method:"PUT",body:t})}};d(F,"HttpClientBase");var k=F;var J=class J extends k{constructor(e,t){super(new P(e,t))}get defaults(){return this[h].defaults}};d(J,"OpraHttpClient");var N=J;function ce(n,...e){let t="",r;for(r=0;r<n.length;r++)t+=n[0]+encodeURIComponent(e[r]);return t}d(ce,"urlPath");
@@ -0,0 +1,8 @@
1
+ /****************************************
2
+ * All rights reserved Panates® 2022-2024
3
+ * http://www.panates.com
4
+ *****************************************/
5
+
6
+ var G=Object.defineProperty;var n=(c,e)=>G(c,"name",{value:e,configurable:!0});var K=Symbol.for("kClient"),h=Symbol.for("kBackend"),l=Symbol.for("kContext");var q=class q{constructor(e){this.document=e==null?void 0:e.document}};n(q,"Backend");var w=q;var C=class C extends Error{constructor(e,t){super(e.message),this.cause=t,this.issues=e.issues||[],this.status=e.status,t&&(this.cause=t,t.stack&&(this.stack=t.stack))}};n(C,"ClientError");var S=C;var m;(function(c){c.ResponseHeader="response-header",c.Response="response",c.Body="body",c.Events="events"})(m||(m={}));import D from"@browsery/type-is";import{isBlob as M,isFormData as V}from"@opra/common";import{Observable as W}from"rxjs";import{isReadableStreamLike as $}from"rxjs/internal/util/isReadableStreamLike";var v=class v extends w{constructor(e,t){super(t);let r=new URL(e);this.serviceUrl=r.toString().split("?")[0].split("#")[0],this.serviceUrl.endsWith("/")||(this.serviceUrl+="/")}};n(v,"HttpBackend");var b=v;var T=class T{constructor(e){this.hasBody=!1,this.headers=(e==null?void 0:e.headers)instanceof Headers?e==null?void 0:e.headers:new Headers(e==null?void 0:e.headers),this.status=(e==null?void 0:e.status)||200,this.statusText=(e==null?void 0:e.statusText)||"OK",this.url=(e==null?void 0:e.url)||null,this.ok=this.status>=200&&this.status<300,this.body=e==null?void 0:e.body,this.hasBody=(e==null?void 0:e.body)!=null||!!(e!=null&&e.hasBody),this.contentType=(this.headers.get("content-type")||"").split(";")[0]}clone(e){return new T({...this,...e})}};n(T,"HttpResponse");var R=T;var f;(function(c){c.Sent="Sent",c.UploadProgress="UploadProgress",c.ResponseHeader="ResponseHeader",c.DownloadProgress="DownloadProgress",c.Response="Response",c.User="User"})(f||(f={}));var O=class O extends b{constructor(e,t){var r,o,s,a,d,u;super(e,t),this.interceptors=Array.from(new Set([...(t==null?void 0:t.interceptors)||[]])),this.defaults={...t==null?void 0:t.defaults,headers:((r=t==null?void 0:t.defaults)==null?void 0:r.headers)instanceof Headers?(o=t==null?void 0:t.defaults)==null?void 0:o.headers:new Headers((s=t==null?void 0:t.defaults)==null?void 0:s.headers),params:((a=t==null?void 0:t.defaults)==null?void 0:a.params)instanceof URLSearchParams?(d=t==null?void 0:t.defaults)==null?void 0:d.params:new URLSearchParams((u=t==null?void 0:t.defaults)==null?void 0:u.params)}}handle(e){return new W(t=>{(async()=>{let r=this.prepareRequest(e);if(r.body&&e.reportProgress){let y=r.body,p=r.headers.get("content-length")||"0",i=parseInt(p,10)||0,x=0,j=new TransformStream({transform(g,E){E.enqueue(g),x+=g.byteLength,t.next({type:f.UploadProgress,request:r,total:i,loaded:x})}});r=new Request(r.url,{cache:r.cache,credentials:r.credentials,headers:r.headers,integrity:r.integrity,keepalive:r.keepalive,method:r.method,mode:r.mode,redirect:r.redirect,referrer:r.referrer,referrerPolicy:r.referrerPolicy,signal:r.signal,body:y.pipeThrough(j),window:e.window,duplex:"half"})}let o=this.send(r);t.next({request:r,type:f.Sent});let s=await o,a=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,hasBody:!!s.body});t.next({request:r,type:f.ResponseHeader,response:a});let d;if(s.body)if(e.reportProgress){let y=s.body,p=s.headers.get("content-length")||"0",i=parseInt(p,10)||0,x=0,j=new Response(new ReadableStream({async start(g){let E=y.getReader();for(;;){let{done:J,value:z}=await E.read();if(J)break;x+=z.byteLength,g.enqueue(z),t.next({type:f.DownloadProgress,request:r,total:i,loaded:x})}g.close()}}));d=await this.parseBody(j)}else d=await this.parseBody(s);let u=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,body:d});t.next({request:r,type:f.Response,response:u}),t.complete()})().catch(r=>t.error(r))})}send(e){return fetch(e)}prepareRequest(e){let t=e.headers||new Headers,r={...e,headers:t};this.defaults.headers.forEach((a,d)=>{t.has(d)||t.set(d,a)});let o=new URL(r.url,this.serviceUrl);this.defaults.params.size&&(this.defaults.params.forEach((a,d)=>{o.searchParams.has(d)||o.searchParams.set(d,a)}),r.url=o.toString());let s=r.body;if(s){let a="";typeof s=="string"||typeof s=="number"||typeof s=="boolean"?(a='text/plain; charset="UTF-8"',r.body=new Blob([String(s)],{type:a}),t.set("Content-Length",String(r.body.size)),delete r.duplex):$(s)?(a="application/octet-stream",r.duplex="half"):Buffer.isBuffer(s)?(a="application/octet-stream",t.set("Content-Length",String(s.length)),delete r.duplex):M(s)?(a=s.type||"application/octet-stream",t.set("Content-Length",String(s.size)),delete r.duplex):(V(s)||(a='application/json;charset="UTF-8"',r.body=new Blob([JSON.stringify(s)],{type:a}),t.set("Content-Length",String(r.body.size))),delete r.duplex),a&&!t.has("Content-Type")&&t.set("Content-Type",a)}return new Request(o.toString(),r)}createResponse(e){return new R(e)}async parseBody(e){let t,r=e.headers.get("Content-Type")||"";if(D.is(r,["json","application/*+json"]))t=await e.json(),typeof t=="string"&&(t=JSON.parse(t));else if(D.is(r,["text"]))t=await e.text();else if(D.is(r,["multipart"]))t=await e.formData();else{let o=await e.arrayBuffer();o.byteLength&&(t=o)}return t}};n(O,"FetchBackend");var P=O;import{ApiDocumentFactory as _}from"@opra/common";import X from"@browsery/type-is";import{MimeTypes as Y}from"@opra/common";import{lastValueFrom as F,Observable as Z}from"rxjs";var H=class H{constructor(e,t){this.chain=e.reduceRight((r,o)=>(s,a)=>o.intercept(s,{handle:n(d=>r(d,a),"handle")}),Q),this.finalHandler=t}handle(e){return this.chain(e,t=>this.finalHandler.handle(t))}};n(H,"HttpInterceptorHandler");var B=H;function Q(c,e){return e(c)}n(Q,"chainEnd");var k=class k extends Z{constructor(e,t){super(r=>{let o=this[l].observe;new B(e.interceptors||[],this[h]).handle(this[l]).subscribe({next(s){if(o===m.Events){r.next(s);return}if(o===m.ResponseHeader&&s.type===f.ResponseHeader){r.next(s.response),r.complete();return}if(s.type===f.Response){let{response:a}=s;if(o===m.Response){r.next(a),r.complete();return}let d=X.is(s.response.contentType||"",[Y.opra_response_json]);if(a.status>=400&&a.status<600){r.error(new S({message:a.status+" "+a.statusText,status:a.status,issues:d?a.body.errors:void 0})),r.complete();return}r.next(s.response.body),r.complete()}},error(s){r.error(s)},complete(){r.complete()}})}),Object.defineProperty(this,h,{enumerable:!1,value:e}),Object.defineProperty(this,l,{enumerable:!1,value:{...t,observe:m.Body,headers:new Headers(t==null?void 0:t.headers)}})}clone(){return new k(this[h],this[l])}options(e){return Object.assign(this[l],e),this}header(e,t){let r=this[l].headers;return typeof e=="object"?((e instanceof Headers?e:new Headers(e)).forEach((s,a)=>{a.toLowerCase()==="set-cookie"?r.append(a,s):r.set(a,s)}),this):(t==null||t===""?r.delete(e):r.append(e,String(t)),this)}param(e,t){t&&typeof t=="object"&&(t=JSON.stringify(t));let r=this[l].url.searchParams;return typeof e=="object"?(typeof e.forEach=="function"?e.forEach((o,s)=>r.set(String(s),String(o))):Object.entries(e).forEach(o=>r.set(String(o[0]),String(o[1]))),this):(t==null?r.delete(e):r.set(e,String(t)),this)}observe(e){if(e===this[l].observe)return this;let t=this.clone();return t[l].observe=e||m.Body,t}getBody(){return F(this.observe(m.Body))}getResponse(){return F(this.observe(m.Response))}};n(k,"HttpRequestObservable");var U=k;var ee=/^(\/*)(.+)/,A=class A{constructor(e){Object.defineProperty(this,h,{enumerable:!1,value:e})}get serviceUrl(){return this[h].serviceUrl}async fetchDocument(e){let t={},r=n(async s=>{let a=this.request("$schema",{headers:new Headers({accept:"application/json"})});s&&a.param("id",s);let d=await a.getBody().catch(u=>{throw u.message="Error fetching api schema from url ("+this.serviceUrl+`).
7
+ `+u.message,u});if(d.references){let u=d.references;d.references={};for(let[y,p]of Object.entries(u)){if(t[p.id]===null)throw new Error("Circular reference detected");t[p.id]=null;let i=await r(p.id);d.references[y]=t[p.id]=i}}return d},"getDocument"),o=await r(e==null?void 0:e.documentId);return await _.createDocument(o).catch(s=>{throw s.message=`Error loading api document.
8
+ `+s.message,s})}request(e,t){var o;e=((o=ee.exec(e))==null?void 0:o[2])||"";let r=new U(this[h],{...t,method:(t==null?void 0:t.method)||"GET",url:new URL(e,this.serviceUrl)});return t!=null&&t.params&&r.param(t.params),r}delete(e,t){return this.request(e,{...t,method:"DELETE"})}get(e,t){return this.request(e,{...t,method:"GET"})}patch(e,t,r){return this.request(e,{...r,method:"PATCH",body:t})}post(e,t,r){return this.request(e,{...r,method:"POST",body:t})}put(e,t,r){return this.request(e,{...r,method:"PUT",body:t})}};n(A,"HttpClientBase");var L=A;var I=class I extends L{constructor(e,t){super(new P(e,t))}get defaults(){return this[h].defaults}};n(I,"OpraHttpClient");var N=I;function Me(c,...e){let t="",r;for(r=0;r<c.length;r++)t+=c[0]+encodeURIComponent(e[r]);return t}n(Me,"urlPath");export{w as Backend,S as ClientError,P as FetchBackend,b as HttpBackend,L as HttpClientBase,f as HttpEventType,m as HttpObserveType,U as HttpRequestObservable,R as HttpResponse,N as OpraHttpClient,h as kBackend,K as kClient,l as kContext,Me as urlPath};
@@ -4,6 +4,7 @@ exports.HttpClientBase = void 0;
4
4
  const common_1 = require("@opra/common");
5
5
  const constants_js_1 = require("../constants.js");
6
6
  const http_request_observable_js_1 = require("./http-request-observable.js");
7
+ const SPLIT_BACKSLASH_PATTERN = /^(\/*)(.+)/;
7
8
  /**
8
9
  *
9
10
  * @class OpraClientBase
@@ -51,6 +52,8 @@ class HttpClientBase {
51
52
  });
52
53
  }
53
54
  request(path, options) {
55
+ /** Remove leading backslashes */
56
+ path = SPLIT_BACKSLASH_PATTERN.exec(path)?.[2] || '';
54
57
  const observable = new http_request_observable_js_1.HttpRequestObservable(this[constants_js_1.kBackend], {
55
58
  ...options,
56
59
  method: options?.method || 'GET',
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.urlPath = void 0;
3
+ exports.urlPath = urlPath;
4
4
  function urlPath(strings, ...values) {
5
5
  let str = '';
6
6
  let i;
@@ -9,4 +9,3 @@ function urlPath(strings, ...values) {
9
9
  }
10
10
  return str;
11
11
  }
12
- exports.urlPath = urlPath;
@@ -1,6 +1,7 @@
1
1
  import { ApiDocumentFactory } from '@opra/common';
2
2
  import { kBackend } from '../constants.js';
3
3
  import { HttpRequestObservable } from './http-request-observable.js';
4
+ const SPLIT_BACKSLASH_PATTERN = /^(\/*)(.+)/;
4
5
  /**
5
6
  *
6
7
  * @class OpraClientBase
@@ -48,6 +49,8 @@ export class HttpClientBase {
48
49
  });
49
50
  }
50
51
  request(path, options) {
52
+ /** Remove leading backslashes */
53
+ path = SPLIT_BACKSLASH_PATTERN.exec(path)?.[2] || '';
51
54
  const observable = new HttpRequestObservable(this[kBackend], {
52
55
  ...options,
53
56
  method: options?.method || 'GET',
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json CHANGED
@@ -1,78 +1,67 @@
1
1
  {
2
2
  "name": "@opra/client",
3
- "version": "1.0.0-alpha.9",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "Opra Client package",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/panates/opra.git",
10
- "directory": "packages/client"
11
- },
12
- "scripts": {
13
- "compile": "tsc",
14
- "prebuild": "npm run check && npm run lint && npm run clean",
15
- "build": "npm run build:cjs && npm run build:esm && npm run build:browser",
16
- "build:cjs": "tsc -b tsconfig-build-cjs.json",
17
- "build:esm": "tsc -b tsconfig-build-esm.json",
18
- "build:browser": "node esbuild.mjs",
19
- "postbuild": "cp README.md package.json ../../LICENSE ../../build/client && cp ../../package.cjs.json ../../build/client/cjs/package.json",
20
- "lint": "eslint . --max-warnings=0",
21
- "lint:fix": "eslint . --max-warnings=0 --fix",
22
- "format": "prettier . --write --log-level=warn",
23
- "check": "madge --circular src/**",
24
- "test": "jest --passWithNoTests",
25
- "cover": "jest --passWithNoTests --collect-coverage",
26
- "clean": "npm run clean:src && npm run clean:test && npm run clean:dist && npm run clean:cover",
27
- "clean:src": "ts-cleanup -s src --all",
28
- "clean:test": "ts-cleanup -s test --all",
29
- "clean:dist": "rimraf ../../build/client",
30
- "clean:cover": "rimraf ../../coverage/client"
31
- },
32
- "type": "module",
33
- "module": "./esm/index.js",
34
- "main": "./cjs/index.js",
35
- "browser": "./browser.js",
36
- "types": "./types/index.d.ts",
37
7
  "dependencies": {
38
- "@browsery/fs": "^0.4.0",
39
- "@browsery/highland": "^2.13.5",
40
- "@browsery/http-parser": "^0.5.8",
41
- "@browsery/i18next": "^23.11.5",
42
- "@browsery/stream": "^4.3.0",
43
- "@browsery/type-is": "^1.6.18-r2",
44
- "@browsery/util": "^0.12.5",
45
- "@opra/common": "^1.0.0-alpha.9",
8
+ "@opra/common": "^1.0.0-beta.2",
46
9
  "accepts": "^1.3.8",
47
- "buffer": "^6.0.3",
48
10
  "cookie": "^0.6.0",
49
- "crypto-browserify": "^3.12.0",
50
11
  "encodeurl": "^2.0.0",
51
- "events": "^3.3.0",
52
- "fast-tokenizer": "^1.3.0",
12
+ "fast-tokenizer": "^1.7.0",
53
13
  "lodash.omit": "^4.5.0",
54
- "path-browserify": "^1.0.1",
55
14
  "process": "^0.11.10",
56
15
  "putil-isplainobject": "^1.1.5",
57
- "putil-merge": "^3.12.1",
16
+ "putil-merge": "^3.13.0",
58
17
  "putil-promisify": "^1.10.1",
59
18
  "putil-varhelpers": "^1.6.5",
60
19
  "reflect-metadata": "^0.2.2",
61
20
  "rxjs": ">=7.0.0",
62
- "ts-gems": "^3.4.0",
63
- "ts-lib": "^0.0.5",
21
+ "ts-gems": "^3.5.0",
22
+ "tslib": "^2.7.0",
64
23
  "uid": "^2.0.1"
65
24
  },
66
- "devDependencies": {
67
- "body-parser": "^1.20.2",
68
- "express": "^4.19.2"
25
+ "type": "module",
26
+ "exports": {
27
+ ".": {
28
+ "browser": {
29
+ "import": {
30
+ "types": "./types/index.d.ts",
31
+ "default": "./browser/index.mjs"
32
+ },
33
+ "require": {
34
+ "types": "./types/index.d.cts",
35
+ "default": "./browser/index.cjs"
36
+ },
37
+ "default": "./browser/index.mjs"
38
+ },
39
+ "import": {
40
+ "types": "./types/index.d.ts",
41
+ "default": "./esm/index.js"
42
+ },
43
+ "require": {
44
+ "types": "./types/index.d.cts",
45
+ "default": "./cjs/index.js"
46
+ },
47
+ "default": "./esm/index.js"
48
+ },
49
+ "./package.json": "./package.json"
50
+ },
51
+ "main": "./cjs/index.js",
52
+ "module": "./esm/index.js",
53
+ "types": "./types/index.d.ts",
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/panates/opra.git",
57
+ "directory": "packages/client"
69
58
  },
70
59
  "sideEffects": false,
71
60
  "files": [
72
61
  "cjs/",
73
62
  "esm/",
63
+ "browser/",
74
64
  "types/",
75
- "browser.js",
76
65
  "LICENSE",
77
66
  "README.md"
78
67
  ],
@@ -85,4 +74,4 @@
85
74
  "request",
86
75
  "fetch"
87
76
  ]
88
- }
77
+ }
@@ -1,6 +1,6 @@
1
1
  import { ApiDocument } from '@opra/common';
2
2
  import { Observable } from 'rxjs';
3
- import { HttpEvent } from '../http/interfaces/http-event.js';
3
+ import type { HttpEvent } from '../http/interfaces/http-event.js';
4
4
  export declare abstract class Backend implements Backend {
5
5
  document?: ApiDocument;
6
6
  protected constructor(options?: Backend.Options);
@@ -1,4 +1,4 @@
1
- import { ErrorIssue } from '@opra/common';
1
+ import type { ErrorIssue } from '@opra/common';
2
2
  export declare class ClientError extends Error {
3
3
  cause?: Error | undefined;
4
4
  issues: ErrorIssue[];
@@ -1,9 +1,9 @@
1
1
  import { Observable } from 'rxjs';
2
- import { Combine, StrictOmit } from 'ts-gems';
2
+ import type { Combine, StrictOmit } from 'ts-gems';
3
3
  import { HttpBackend } from './http-backend.js';
4
4
  import { HttpResponse } from './http-response.js';
5
- import { HttpEvent } from './interfaces/http-event.js';
6
- import { HttpInterceptor } from './interfaces/http-interceptor.js';
5
+ import { type HttpEvent } from './interfaces/http-event.js';
6
+ import type { HttpInterceptor } from './interfaces/http-interceptor.js';
7
7
  /**
8
8
  *
9
9
  * @class FetchBackend
@@ -32,7 +32,7 @@ export declare namespace FetchBackend {
32
32
  duplex?: string;
33
33
  reportProgress?: boolean;
34
34
  }
35
- interface RequestOptions extends Pick<RequestInit, 'cache' | 'credentials' | 'integrity' | 'keepalive' | 'mode' | 'redirect' | 'referrer' | 'referrerPolicy' | 'reportProgress'> {
35
+ interface RequestOptions extends Partial<Pick<RequestInit, 'cache' | 'credentials' | 'integrity' | 'keepalive' | 'mode' | 'redirect' | 'referrer' | 'referrerPolicy' | 'reportProgress'>> {
36
36
  }
37
37
  type RequestDefaults = RequestOptions & {
38
38
  headers: Headers;
@@ -7,7 +7,7 @@ import type { HttpInterceptor } from './interfaces/http-interceptor.js';
7
7
  */
8
8
  export declare abstract class HttpBackend extends Backend implements HttpHandler {
9
9
  readonly serviceUrl: string;
10
- interceptors: HttpInterceptor<any>[];
10
+ interceptors?: HttpInterceptor<any>[];
11
11
  protected constructor(serviceUrl: string, options?: HttpBackend.Options);
12
12
  }
13
13
  /**
@@ -1,5 +1,5 @@
1
- import { ApiDocument, URLSearchParamsInit } from '@opra/common';
2
- import { StrictOmit } from 'ts-gems';
1
+ import { ApiDocument, type URLSearchParamsInit } from '@opra/common';
2
+ import type { StrictOmit } from 'ts-gems';
3
3
  import { kBackend } from '../constants.js';
4
4
  import { HttpBackend } from './http-backend.js';
5
5
  import { HttpRequestObservable } from './http-request-observable.js';
@@ -1,8 +1,8 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { HttpBackend } from './http-backend.js';
3
- import { HttpEvent } from './interfaces/http-event.js';
4
- import { HttpHandler } from './interfaces/http-handler.js';
5
- import { HttpInterceptor } from './interfaces/http-interceptor.js';
3
+ import type { HttpEvent } from './interfaces/http-event.js';
4
+ import type { HttpHandler } from './interfaces/http-handler.js';
5
+ import type { HttpInterceptor } from './interfaces/http-interceptor.js';
6
6
  export declare class HttpInterceptorHandler<TRequest extends HttpBackend.RequestInit> implements HttpHandler<TRequest> {
7
7
  private readonly chain;
8
8
  private readonly finalHandler;
@@ -1,10 +1,10 @@
1
- import { URLSearchParamsInit } from '@opra/common';
1
+ import { type URLSearchParamsInit } from '@opra/common';
2
2
  import { Observable } from 'rxjs';
3
3
  import { kBackend, kContext } from '../constants.js';
4
4
  import { HttpObserveType } from './enums/http-observable-type.enum.js';
5
5
  import { HttpBackend } from './http-backend.js';
6
6
  import { HttpResponse } from './http-response.js';
7
- import { HttpEvent } from './interfaces/http-event.js';
7
+ import { type HttpEvent } from './interfaces/http-event.js';
8
8
  /**
9
9
  *
10
10
  * @class HttpRequestObservable
@@ -1,4 +1,3 @@
1
- /// <reference lib="dom" />
2
1
  export declare namespace HttpResponse {
3
2
  interface Initiator {
4
3
  headers?: HeadersInit;
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { HttpBackend } from '../http-backend.js';
3
- import { HttpEvent } from './http-event.js';
3
+ import type { HttpEvent } from './http-event.js';
4
4
  export type HttpHandlerFn<TRequest extends HttpBackend.RequestInit = HttpBackend.RequestInit> = (req: TRequest) => Observable<HttpEvent>;
5
5
  export interface HttpHandler<TRequest extends HttpBackend.RequestInit = HttpBackend.RequestInit> {
6
6
  handle(req: TRequest): Observable<HttpEvent>;
@@ -1,7 +1,7 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { HttpBackend } from '../http-backend.js';
3
- import { HttpEvent } from './http-event.js';
4
- import { HttpHandler, HttpHandlerFn } from './http-handler.js';
3
+ import type { HttpEvent } from './http-event.js';
4
+ import type { HttpHandler, HttpHandlerFn } from './http-handler.js';
5
5
  export type HttpInterceptorFn<TRequest extends HttpBackend.RequestInit = HttpBackend.RequestInit> = (req: TRequest, next: HttpHandlerFn<TRequest>) => Observable<HttpEvent<unknown>>;
6
6
  export interface HttpInterceptor<TRequest extends HttpBackend.RequestInit = HttpBackend.RequestInit> {
7
7
  intercept(req: TRequest, next: HttpHandler<TRequest>): Observable<HttpEvent>;
@@ -0,0 +1,14 @@
1
+ export { kBackend, kClient, kContext } from './constants.js';
2
+ export * from './core/backend.js';
3
+ export * from './core/client-error.js';
4
+ export * from './http/enums/http-observable-type.enum.js';
5
+ export * from './http/fetch-backend.js';
6
+ export * from './http/http-backend.js';
7
+ export * from './http/http-client.js';
8
+ export * from './http/http-client-base.js';
9
+ export * from './http/http-request-observable.js';
10
+ export * from './http/http-response.js';
11
+ export * from './http/http-utils.js';
12
+ export * from './http/interfaces/http-event.js';
13
+ export * from './http/interfaces/http-handler.js';
14
+ export * from './http/interfaces/http-interceptor.js';
package/browser.js DELETED
@@ -1,8 +0,0 @@
1
- /****************************************
2
- * All rights reserved Panates® 2022-2024
3
- * http://www.panates.com
4
- *****************************************/
5
-
6
- var M=Object.defineProperty,$=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var N=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var G=(o,e,t)=>e in o?M(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,h=(o,e)=>{for(var t in e||(e={}))X.call(e,t)&&G(o,t,e[t]);if(N)for(var t of N(e))Y.call(e,t)&&G(o,t,e[t]);return o},l=(o,e)=>$(o,Q(e)),d=(o,e)=>M(o,"name",{value:e,configurable:!0});var Z=Symbol.for("kClient"),f=Symbol.for("kBackend"),u=Symbol.for("kContext");var v=class v{constructor(e){this.document=e==null?void 0:e.document}};d(v,"Backend");var S=v;var D=class D extends Error{constructor(e,t){super(e.message),this.cause=t,this.issues=e.issues||[],this.status=e.status,t&&(this.cause=t,t.stack&&(this.stack=t.stack))}};d(D,"ClientError");var R=D;var y;(function(o){o.ResponseHeader="response-header",o.Response="response",o.Body="body",o.Events="events"})(y||(y={}));import H from"@browsery/type-is";import{isBlob as _,isFormData as ee}from"@opra/common";import{Observable as te}from"rxjs";import{isReadableStreamLike as re}from"rxjs/internal/util/isReadableStreamLike";var O=class O extends S{constructor(e,t){super(t);let r=new URL(e);this.serviceUrl=r.toString().split("?")[0].split("#")[0],this.serviceUrl.endsWith("/")||(this.serviceUrl+="/")}};d(O,"HttpBackend");var P=O;var B=class B{constructor(e){this.hasBody=!1,this.headers=(e==null?void 0:e.headers)instanceof Headers?e==null?void 0:e.headers:new Headers(e==null?void 0:e.headers),this.status=(e==null?void 0:e.status)||200,this.statusText=(e==null?void 0:e.statusText)||"OK",this.url=(e==null?void 0:e.url)||null,this.ok=this.status>=200&&this.status<300,this.body=e==null?void 0:e.body,this.hasBody=(e==null?void 0:e.body)!=null||!!(e!=null&&e.hasBody),this.contentType=(this.headers.get("content-type")||"").split(";")[0]}clone(e){return new B(h(h({},this),e))}};d(B,"HttpResponse");var T=B;var m;(function(o){o.Sent="Sent",o.UploadProgress="UploadProgress",o.ResponseHeader="ResponseHeader",o.DownloadProgress="DownloadProgress",o.Response="Response",o.User="User"})(m||(m={}));var I=class I extends P{constructor(e,t){var r,n,s,a,c,p;super(e,t),this.interceptors=Array.from(new Set([...(t==null?void 0:t.interceptors)||[]])),this.defaults=l(h({},t==null?void 0:t.defaults),{headers:((r=t==null?void 0:t.defaults)==null?void 0:r.headers)instanceof Headers?(n=t==null?void 0:t.defaults)==null?void 0:n.headers:new Headers((s=t==null?void 0:t.defaults)==null?void 0:s.headers),params:((a=t==null?void 0:t.defaults)==null?void 0:a.params)instanceof URLSearchParams?(c=t==null?void 0:t.defaults)==null?void 0:c.params:new URLSearchParams((p=t==null?void 0:t.defaults)==null?void 0:p.params)})}handle(e){return new te(t=>{(async()=>{let r=this.prepareRequest(e);if(r.body&&e.reportProgress){let x=r.body,i=r.headers.get("content-length")||"0",g=parseInt(i,10)||0,w=0,E=new TransformStream({transform(b,C){C.enqueue(b),w+=b.byteLength,t.next({type:m.UploadProgress,request:r,total:g,loaded:w})}});r=new Request(r.url,{cache:r.cache,credentials:r.credentials,headers:r.headers,integrity:r.integrity,keepalive:r.keepalive,method:r.method,mode:r.mode,redirect:r.redirect,referrer:r.referrer,referrerPolicy:r.referrerPolicy,signal:r.signal,body:x.pipeThrough(E),window:e.window,duplex:"half"})}let n=this.send(r);t.next({request:r,type:m.Sent});let s=await n,a=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,hasBody:!!s.body});t.next({request:r,type:m.ResponseHeader,response:a});let c;if(s.body)if(e.reportProgress){let x=s.body,i=s.headers.get("content-length")||"0",g=parseInt(i,10)||0,w=0,E=new Response(new ReadableStream({async start(b){let C=x.getReader();for(;;){let{done:W,value:J}=await C.read();if(W)break;w+=J.byteLength,b.enqueue(J),t.next({type:m.DownloadProgress,request:r,total:g,loaded:w})}b.close()}}));c=await this.parseBody(E)}else c=await this.parseBody(s);let p=this.createResponse({url:s.url,headers:s.headers,status:s.status,statusText:s.statusText,body:c});t.next({request:r,type:m.Response,response:p}),t.complete()})().catch(r=>t.error(r))})}send(e){return fetch(e)}prepareRequest(e){let t=e.headers||new Headers,r=l(h({},e),{headers:t});this.defaults.headers.forEach((a,c)=>{t.has(c)||t.set(c,a)});let n=new URL(r.url,this.serviceUrl);this.defaults.params.size&&(this.defaults.params.forEach((a,c)=>{n.searchParams.has(c)||n.searchParams.set(c,a)}),r.url=n.toString());let s=r.body;if(s){let a="";typeof s=="string"||typeof s=="number"||typeof s=="boolean"?(a='text/plain; charset="UTF-8"',r.body=new Blob([String(s)],{type:a}),t.set("Content-Length",String(r.body.size)),delete r.duplex):re(s)?(a="application/octet-stream",r.duplex="half"):Buffer.isBuffer(s)?(a="application/octet-stream",t.set("Content-Length",String(s.length)),delete r.duplex):_(s)?(a=s.type||"application/octet-stream",t.set("Content-Length",String(s.size)),delete r.duplex):(ee(s)||(a='application/json;charset="UTF-8"',r.body=new Blob([JSON.stringify(s)],{type:a}),t.set("Content-Length",String(r.body.size))),delete r.duplex),a&&!t.has("Content-Type")&&t.set("Content-Type",a)}return new Request(n.toString(),r)}createResponse(e){return new T(e)}async parseBody(e){let t,r=e.headers.get("Content-Type")||"";if(H.is(r,["json","application/*+json"]))t=await e.json(),typeof t=="string"&&(t=JSON.parse(t));else if(H.is(r,["text"]))t=await e.text();else if(H.is(r,["multipart"]))t=await e.formData();else{let n=await e.arrayBuffer();n.byteLength&&(t=n)}return t}};d(I,"FetchBackend");var U=I;import{ApiDocumentFactory as de}from"@opra/common";import ae from"@browsery/type-is";import{MimeTypes as oe}from"@opra/common";import{lastValueFrom as K,Observable as ne}from"rxjs";var z=class z{constructor(e,t){this.chain=e.reduceRight((r,n)=>(s,a)=>n.intercept(s,{handle:d(c=>r(c,a),"handle")}),se),this.finalHandler=t}handle(e){return this.chain(e,t=>this.finalHandler.handle(t))}};d(z,"HttpInterceptorHandler");var k=z;function se(o,e){return e(o)}d(se,"chainEnd");var j=class j extends ne{constructor(e,t){super(r=>{let n=this[u].observe;new k(e.interceptors||[],this[f]).handle(this[u]).subscribe({next(s){if(n===y.Events){r.next(s);return}if(n===y.ResponseHeader&&s.type===m.ResponseHeader){r.next(s.response),r.complete();return}if(s.type===m.Response){let{response:a}=s;if(n===y.Response){r.next(a),r.complete();return}let c=ae.is(s.response.contentType||"",[oe.opra_response_json]);if(a.status>=400&&a.status<600){r.error(new R({message:a.status+" "+a.statusText,status:a.status,issues:c?a.body.errors:void 0})),r.complete();return}r.next(s.response.body),r.complete()}},error(s){r.error(s)},complete(){r.complete()}})}),Object.defineProperty(this,f,{enumerable:!1,value:e}),Object.defineProperty(this,u,{enumerable:!1,value:l(h({},t),{observe:y.Body,headers:new Headers(t==null?void 0:t.headers)})})}clone(){return new j(this[f],this[u])}options(e){return Object.assign(this[u],e),this}header(e,t){let r=this[u].headers;return typeof e=="object"?((e instanceof Headers?e:new Headers(e)).forEach((s,a)=>{a.toLowerCase()==="set-cookie"?r.append(a,s):r.set(a,s)}),this):(t==null||t===""?r.delete(e):r.append(e,String(t)),this)}param(e,t){t&&typeof t=="object"&&(t=JSON.stringify(t));let r=this[u].url.searchParams;return typeof e=="object"?(typeof e.forEach=="function"?e.forEach((n,s)=>r.set(String(s),String(n))):Object.entries(e).forEach(n=>r.set(String(n[0]),String(n[1]))),this):(t==null?r.delete(e):r.set(e,String(t)),this)}observe(e){if(e===this[u].observe)return this;let t=this.clone();return t[u].observe=e||y.Body,t}getBody(){return K(this.observe(y.Body))}getResponse(){return K(this.observe(y.Response))}};d(j,"HttpRequestObservable");var L=j;var F=class F{constructor(e){Object.defineProperty(this,f,{enumerable:!1,value:e})}get serviceUrl(){return this[f].serviceUrl}async fetchDocument(e){let t={},r=d(async s=>{let a=this.request("$schema",{headers:new Headers({accept:"application/json"})});s&&a.param("id",s);let c=await a.getBody().catch(p=>{throw p.message="Error fetching api schema from url ("+this.serviceUrl+`).
7
- `+p.message,p});if(c.references){let p=c.references;c.references={};for(let[x,i]of Object.entries(p)){if(t[i.id]===null)throw new Error("Circular reference detected");t[i.id]=null;let g=await r(i.id);c.references[x]=t[i.id]=g}}return c},"getDocument"),n=await r(e==null?void 0:e.documentId);return await de.createDocument(n).catch(s=>{throw s.message=`Error loading api document.
8
- `+s.message,s})}request(e,t){let r=new L(this[f],l(h({},t),{method:(t==null?void 0:t.method)||"GET",url:new URL(e,this.serviceUrl)}));return t!=null&&t.params&&r.param(t.params),r}delete(e,t){return this.request(e,l(h({},t),{method:"DELETE"}))}get(e,t){return this.request(e,l(h({},t),{method:"GET"}))}patch(e,t,r){return this.request(e,l(h({},r),{method:"PATCH",body:t}))}post(e,t,r){return this.request(e,l(h({},r),{method:"POST",body:t}))}put(e,t,r){return this.request(e,l(h({},r),{method:"PUT",body:t}))}};d(F,"HttpClientBase");var q=F;var A=class A extends q{constructor(e,t){super(new U(e,t))}get defaults(){return this[f].defaults}};d(A,"OpraHttpClient");var V=A;function Ze(o,...e){let t="",r;for(r=0;r<o.length;r++)t+=o[0]+encodeURIComponent(e[r]);return t}d(Ze,"urlPath");export{S as Backend,R as ClientError,U as FetchBackend,P as HttpBackend,q as HttpClientBase,m as HttpEventType,y as HttpObserveType,L as HttpRequestObservable,T as HttpResponse,V as OpraHttpClient,f as kBackend,Z as kClient,u as kContext,Ze as urlPath};