@apollion-dsi/relay 0.25.9
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/README.MD +71 -0
- package/lib/index.esm.js +1 -0
- package/lib/index.js +1 -0
- package/package.json +79 -0
package/README.MD
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @apollion-dsi/relay
|
|
2
|
+
|
|
3
|
+
Helpers para configurar e usar **Relay** (`react-relay` / `relay-runtime`)
|
|
4
|
+
no padrão do Apollion DS. Cobre criação de Environment com auth,
|
|
5
|
+
upload multipart, subscriptions via WebSocket e cookies de sessão.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@apollion-dsi/relay)
|
|
8
|
+
|
|
9
|
+
## Stack
|
|
10
|
+
|
|
11
|
+
- **react-relay** 20.x
|
|
12
|
+
- **relay-runtime** 20.x
|
|
13
|
+
- **graphql** 15.x
|
|
14
|
+
- **graphql-ws** 6.x (subscriptions)
|
|
15
|
+
- **fetch-multipart-graphql** (uploads)
|
|
16
|
+
- **js-cookie** (sessão)
|
|
17
|
+
|
|
18
|
+
## Instalação
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
yarn add @apollion-dsi/relay react@19.2.6
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
> Para gerar artefatos Relay, o consumidor também precisa de
|
|
25
|
+
> `relay-compiler` como dev dependency e configurar `relay.config.js`.
|
|
26
|
+
|
|
27
|
+
## Uso básico
|
|
28
|
+
|
|
29
|
+
Crie um Relay Environment para a aplicação:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { CreateRelayEnvironment } from '@apollion-dsi/relay';
|
|
33
|
+
|
|
34
|
+
export const { Environment } = new CreateRelayEnvironment({
|
|
35
|
+
url: 'https://api.example.com/graphql',
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Depois, embrulhe a árvore React com `RelayEnvironmentProvider`:
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
import { RelayEnvironmentProvider } from 'react-relay';
|
|
43
|
+
import { Environment } from './relay';
|
|
44
|
+
import { App } from './app';
|
|
45
|
+
|
|
46
|
+
<RelayEnvironmentProvider environment={Environment}>
|
|
47
|
+
<App />
|
|
48
|
+
</RelayEnvironmentProvider>;
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Recursos do helper
|
|
52
|
+
|
|
53
|
+
- **Auth header** automático via cookie / token configurável.
|
|
54
|
+
- **Multipart uploads** (`fetch-multipart-graphql`) — envie arquivos
|
|
55
|
+
diretamente em mutations.
|
|
56
|
+
- **Subscriptions** via `graphql-ws`.
|
|
57
|
+
- **Network retry / refresh** plugável.
|
|
58
|
+
|
|
59
|
+
## Scripts (workspace)
|
|
60
|
+
|
|
61
|
+
| Script | O que faz |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `yarn workspace @apollion-dsi/relay run validate` | Lint + types + prettier + Jest + build. |
|
|
64
|
+
| `yarn workspace @apollion-dsi/relay run coverage` | Jest coverage. |
|
|
65
|
+
| `yarn workspace @apollion-dsi/relay run build` | esbuild + emit de types. |
|
|
66
|
+
| `yarn workspace @apollion-dsi/relay run audit-dependencies` | audit-ci. |
|
|
67
|
+
| `yarn workspace @apollion-dsi/relay run pretest` | `relay-compiler` (gera `__generated__` antes dos testes). |
|
|
68
|
+
|
|
69
|
+
## Licença
|
|
70
|
+
|
|
71
|
+
MIT.
|
package/lib/index.esm.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var X=Object.defineProperty;var o=(e,t)=>X(e,"name",{value:t,configurable:!0});import{Environment as ce,Network as ue,RecordSource as pe,Store as le}from"relay-runtime";import{Observable as oe,QueryResponseCache as ne}from"relay-runtime";var S=!!(typeof window!="undefined"&&window.document&&window.document.createElement),f={canUseDOM:S,canUseWorkers:typeof Worker!="undefined",canUseEventListeners:S&&!!(window.addEventListener||window.attachEvent),canUseViewport:S&&!!window.screen,isInWorker:!S};function V(e){return async t=>{let r=e.timeout,n=e.retries,i=0,s=0;return new Promise((c,l)=>{let p={};p.sendTimedRequest=()=>{i++,s=Date.now();let u=!0,d=new AbortController,m=setTimeout(()=>{if(u=!1,d.abort(),p.shouldRetry(i))e.useDebug&&console.log("fetchWithRetries: HTTP timeout, retrying."),p.retryRequest();else{let a=new Error(`fetchWithRetries(): Failed to get response from server, tried ${i} times.`);a.name="TimeOutError",l(a)}},r);fetch(e.url,{...t,signal:d.signal}).then(async a=>{if(clearTimeout(m),u)if(a.status>=200&&a.status<300)c(a);else if(p.shouldRetry(i)&&e.retryWhen.includes(a.status))e.useDebug&&console.log("fetchWithRetries: HTTP error, retrying..."),p.retryRequest();else{let P=new Error(`fetchWithRetries(): Still no successful response after ${i} retries, giving up.`);P.response=a,l(P)}}).catch(a=>{clearTimeout(m),a.name!=="AbortError"&&l(a)})},p.retryRequest=()=>{let u=n[i-1],d=s+u;setTimeout(p.sendTimedRequest,d-Date.now())},p.shouldRetry=u=>f.canUseDOM&&e.useRetries&&u<=n.length,p.sendTimedRequest()})}}o(V,"fetchWithRetries");import{PatchResolver as Z}from"fetch-multipart-graphql";var O=o(e=>e.operationKind==="mutation","isMutation"),k=o(e=>e.operationKind==="query","isQuery"),j=o(e=>!!(e&&e.force),"forceFetch"),ee=o(()=>f.canUseDOM?window.location.search.startsWith("?")?"&":"?":"","getParamsDelimiter"),v=o(()=>f.canUseDOM?window.location.pathname:"","getBrowserLocation"),g=o((e,t,r)=>{let n=e;(e!==t||r.loginRoute!==t)&&(n=`${t}${ee()}redirect=${e}`),window.location.href=n},"redirectUser");function te(e,t,r){let n=new FormData;n.append("operations",JSON.stringify({query:e.text,variables:t,operationName:e.name}));let i={};for(let s=0;s<r.files.length;s++)n.append(`${s}`,r.files[s]),i[`${s}`]=[r.path(s)];return n.append("map",JSON.stringify(i)),n}o(te,"getRequestBodyWithUploadables");function re(e,t){return JSON.stringify({name:e.name,query:e.text,variables:t})}o(re,"getRequestBodyWithoutUplodables");function B(e,t,r){return r?te(e,t,r):re(e,t)}o(B,"getRequestBody");var K=o((e,t)=>{let r=new Headers;if(t?r.append("Accept","*/*"):(r.append("Accept","application/json"),r.append("Content-type","application/json")),e.useAuthorization){let{sessionToken:n}=e.StorageHandler.getTokens();n&&v()!==e.loginRoute&&r.append("Authorization",`Bearer ${n}`)}return e.partner&&r.append("X-Partner",e.partner),r},"getHeaders"),_=o((e,t,r)=>{if(e.status<300&&e.headers&&e.headers.get("Content-Type")&&e.headers.get("Content-Type").indexOf("multipart/mixed")>=0){let n=e.body.getReader(),i=new TextDecoder,s=new Z({onResponse:o(c=>t.next(c),"onResponse")});n.read().then(o(function c({value:l,done:p}){if(p)t.complete();else{let u;try{u=i.decode(l),s.handleChunk(u)}catch(d){let m=d;m.response=e,m.statusCode=e.status,m.bodyText=u,t.error(m)}n.read().then(c)}},"sendNext"))}else e.headers&&e.headers.get("Content-Type")&&e.headers.get("Content-Type").indexOf("application/json")>=0?e.json().then(r):e.text().then(n=>{t.next([n]),t.complete()})},"handleData"),h=1e3,U=h*60;var J=o(e=>{let t=new ne({ttl:e.cacheTime,size:e.cacheSize}),r=V(e);async function n(){try{let{sessionToken:s}=e.StorageHandler.getTokens();return(await fetch(`${e.authUrl}user/me`,{headers:{"Content-Type":"application/json",Authorization:s}})).status===200}catch(s){return console.warn(`[Auth] ${s.message}`),!1}}o(n,"checkLoggedUser");async function i(s,c,l,p,u){try{let d=String(s.text);if(e.useCache&&k(s)&&!j(l)){let a=t.get(d,c);if(a){u.next(a),u.complete();return}}e.useCache&&O(s)&&t.clear();let m=await r({method:"POST",headers:K(e,p),body:B(s,c,p)});_(m,u,async a=>{if(e.useCache&&k(s)&&t.set(d,c,a),!u.closed){if(O(s)&&a.errors&&u.error(a.errors),a.errors){if(await n()||(e.StorageHandler.clear(),g("/",e.loginRoute,e)),e.redirectOnError){let z=[];Array.isArray(a.errors)&&(z=a.errors.map(({status_code:C})=>C));let F=v();z.some(C=>e.authenticationErrors.includes(C))&&F!==e.loginRoute&&(e.StorageHandler.clear(),g(F,e.loginRoute,e))}u.error(a.errors)}else a.data?u.next(a):u.error(a);u.complete()}})}catch(d){if(f.canUseDOM&&!["AbortError","TimeOutError"].includes(d.name)&&e.StorageHandler.clear(),e.redirectOnError){let a=v();a!==e.loginRoute&&g(a,e.loginRoute,e)}await n()||(e.StorageHandler.clear(),g("/",e.loginRoute,e)),u.error(d)}}return o(i,"fetchFn"),(s,c,l,p)=>oe.create(u=>{i(s,c,l,p,u)})},"createFetchFunction");import se from"js-cookie";var A=class A{get(t){throw new Error('Must implement a "GET" method')}set(t,r){throw new Error('Must implement a "SET" method')}delete(t){throw new Error('Must implement a "DELETE" method')}};o(A,"DefaultStrategy");var T=A,M=class M extends T{constructor(){super(),this.strategy=localStorage}get(t){return this.strategy.getItem(t)}set(t,r){this.strategy.setItem(t,r)}delete(t){this.strategy.removeItem(t)}};o(M,"LocalStorageStrategy");var D=M,q=class q extends T{constructor(){super(),this.strategy=se}get(t){return this.strategy.get(t)}set(t,r){this.strategy.set(t,r)}delete(t){this.strategy.remove(t)}};o(q,"CookieStrategy");var I=q,y=Symbol("storage-handler"),R=Symbol("prop-session"),b=Symbol("prop-refresh"),H=class H{constructor(t){this[R]=t.sessionStorageProp,this[b]=t.refreshStorageProp,t.storageType==="cookie"?this[y]=new I:this[y]=new D}getTokens(){return{refreshToken:this[y].get(this[b]),sessionToken:this[y].get(this[R])}}setTokens(t){this[y].set(this[b],t.refreshToken),this[y].set(this[R],t.sessionToken)}clear(){this[y].delete(this[b]),this[y].delete(this[R])}hasChangedSession({sessionToken:t}){let{sessionToken:r}=this.getTokens();return t!==r}};o(H,"StorageClass");var E=H;import{createClient as ie}from"graphql-ws";import{Observable as ae}from"relay-runtime";function Q(e){return()=>{let t=ie({url:e.socket});return(r,n)=>ae.create(i=>t.subscribe({operationName:r.name,query:r.text||"",variables:n},{next:o(s=>i.next(s),"next"),error:o(s=>i.error(s),"error"),complete:o(()=>i.complete(),"complete")}))}}o(Q,"setupSubscription");var Y=Symbol("mount-environment"),N=Symbol("handler-fetch"),L=Symbol("handler-subscription"),W=class W{constructor(t){if(this.url=t.url,this.authUrl=t.authUrl,this.socket=t.socket,this.storageType=t.storageType||"localStorage",this.cacheSize=t.cacheSize||250,this.cacheTime=t.cacheTime||U*8,this.timeout=t.timeout||U*15,this.sessionStorageProp=t.sessionStorageProp||"USER_SESSION_TOKEN",this.refreshStorageProp=t.refreshStorageProp||"USER_REFRESH_TOKEN",this.loginRoute=t.loginRoute||"/",this.useCache=t.useCache||!1,this.useDebug=t.useDebug||!1,this.useAuthorization=t.useAuthorization||!1,this.useRetries=t.useRetries||!1,this.useSubscription=t.useSubscription||!1,this.redirectOnError=t.redirectOnError||!1,this.retryWhen=t.retryWhen||[503,504,521,522,524],this.authenticationErrors=t.authenticationErrors||[401,403],this.retries=t.retries||[h,h*2,h*3,h*5,h*8,h*13,h*21,h*34],this.partner=t.partner||void 0,!this.url)throw new Error("[HTTPFetchEndpoint] You must at least set url parameter.");if(this.useAuthorization&&!this.authUrl)throw new Error('[useAuthorization] Authorization is set but no "authUrl" was provided.');if(this.StorageHandler=new E(this),this.useSubscription){if(!this.socket)throw new Error("[useSubscription] If you choose to use WebSocket you must set a socket endpoint.");this[L]=Q(this)}this[N]=J(this),this[Y]()}[(N,L,Y)](){let t=ue.create(this[N],this[L]||null),r=new pe,n=new le(r);this.Environment=new ce({network:t,store:n})}};o(W,"RelayEnvironment");var w=W;import $ from"react";var G=$.createContext(void 0);function Xe({children:e,environment:t}){return $.createElement(G.Provider,{value:{environment:t}},e)}o(Xe,"EnvironmentProvider");function Ze(){let e=$.useContext(G);if(e===void 0)throw new Error("useEnvironment must be used within a EnvironmentProvider");if(e.environment===null||e.environment===void 0)throw new Error("You should provide a Relay Environment to EnvironmentProvider component");return e}o(Ze,"useEnvironment");import{nanoid as de}from"nanoid";import{ConnectionHandler as x}from"relay-runtime";function me(e){return e!==null&&typeof e=="object"}o(me,"isObject");var ut=de();function pt({parentId:e,itemId:t,parentFieldName:r,store:n}){let i=n.get(e),s=i.getLinkedRecords(r);i.setLinkedRecords(s.filter(c=>c.dataID!==t),r)}o(pt,"listRecordRemoveUpdater");function lt({parentId:e,item:t,type:r,parentFieldName:n,store:i}){let s=i.create(t.id,r);Object.keys(t).forEach(p=>{s.setValue(t[p],p)});let c=i.get(e),l=c.getLinkedRecords(n);c.setLinkedRecords([...l,s],n)}o(lt,"listRecordAddUpdater");function he(e,t,r,n,i=!1){if(n){let s=e.get(t),c=x.getConnection(s,r);if(!c)return;i?x.insertEdgeBefore(c,n):x.insertEdgeAfter(c,n)}}o(he,"connectionUpdater");function dt({parentId:e,store:t,connectionName:r,item:n,customNode:i,itemType:s}){let c=i||t.create(n.id,s);!i&&Object.keys(n).forEach(p=>{c.setValue(n[p],p)});let l=t.create(`client:newEdge:${String(c.getDataID).match(/[^:]+$/)[0]}`,`${s}Edge`);l.setLinkedRecord(c,"node"),he(t,e,r,l)}o(dt,"optimisticConnectionUpdater");function mt({parentId:e,connectionName:t,nodeId:r,store:n}){let i=n.get(e),s=x.getConnection(i,t);if(!s){console.warn(`Connection ${t} not found on ${e}`);return}x.deleteNode(s,r)}o(mt,"connectionDeleteEdgeUpdater");function ht({object:e,proxy:t}){Object.keys(e).forEach(r=>{me(e[r])||Array.isArray(e[r])||t.setValue(e[r],r)})}o(ht,"copyObjScalarsToProxy");import{commitMutation as ye}from"relay-runtime";var St=o((e,t)=>new Promise((r,n)=>{ye(e,{...t,onError:n,onCompleted:r})}),"commitMutation");export{ut as ClientMutationID,w as CreateRelayEnvironment,Xe as EnvironmentProvider,St as commitMutation,mt as connectionDeleteEdgeUpdater,he as connectionUpdater,ht as copyObjScalarsToProxy,me as isObject,lt as listRecordAddUpdater,pt as listRecordRemoveUpdater,dt as optimisticConnectionUpdater,Ze as useEnvironment};
|
package/lib/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var le=Object.create;var b=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,ye=Object.prototype.hasOwnProperty;var n=(e,t)=>b(e,"name",{value:t,configurable:!0});var fe=(e,t)=>{for(var r in t)b(e,r,{get:t[r],enumerable:!0})},K=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of me(t))!ye.call(e,i)&&i!==r&&b(e,i,{get:()=>t[i],enumerable:!(o=de(t,i))||o.enumerable});return e};var _=(e,t,r)=>(r=e!=null?le(he(e)):{},K(t||!e||!e.__esModule?b(r,"default",{value:e,enumerable:!0}):r,e)),ge=e=>K(b({},"__esModule",{value:!0}),e);var Ue={};fe(Ue,{ClientMutationID:()=>ve,CreateRelayEnvironment:()=>T,EnvironmentProvider:()=>xe,commitMutation:()=>ke,connectionDeleteEdgeUpdater:()=>Ce,connectionUpdater:()=>ue,copyObjScalarsToProxy:()=>Oe,isObject:()=>ce,listRecordAddUpdater:()=>we,listRecordRemoveUpdater:()=>Te,optimisticConnectionUpdater:()=>Pe,useEnvironment:()=>Se});module.exports=ge(Ue);var f=require("relay-runtime");var C=require("relay-runtime");var w=!!(typeof window!="undefined"&&window.document&&window.document.createElement),g={canUseDOM:w,canUseWorkers:typeof Worker!="undefined",canUseEventListeners:w&&!!(window.addEventListener||window.attachEvent),canUseViewport:w&&!!window.screen,isInWorker:!w};function J(e){return async t=>{let r=e.timeout,o=e.retries,i=0,s=0;return new Promise((c,l)=>{let p={};p.sendTimedRequest=()=>{i++,s=Date.now();let u=!0,d=new AbortController,m=setTimeout(()=>{if(u=!1,d.abort(),p.shouldRetry(i))e.useDebug&&console.log("fetchWithRetries: HTTP timeout, retrying."),p.retryRequest();else{let a=new Error(`fetchWithRetries(): Failed to get response from server, tried ${i} times.`);a.name="TimeOutError",l(a)}},r);fetch(e.url,{...t,signal:d.signal}).then(async a=>{if(clearTimeout(m),u)if(a.status>=200&&a.status<300)c(a);else if(p.shouldRetry(i)&&e.retryWhen.includes(a.status))e.useDebug&&console.log("fetchWithRetries: HTTP error, retrying..."),p.retryRequest();else{let U=new Error(`fetchWithRetries(): Still no successful response after ${i} retries, giving up.`);U.response=a,l(U)}}).catch(a=>{clearTimeout(m),a.name!=="AbortError"&&l(a)})},p.retryRequest=()=>{let u=o[i-1],d=s+u;setTimeout(p.sendTimedRequest,d-Date.now())},p.shouldRetry=u=>g.canUseDOM&&e.useRetries&&u<=o.length,p.sendTimedRequest()})}}n(J,"fetchWithRetries");var Q=require("fetch-multipart-graphql");var I=n(e=>e.operationKind==="mutation","isMutation"),A=n(e=>e.operationKind==="query","isQuery"),Y=n(e=>!!(e&&e.force),"forceFetch"),Re=n(()=>g.canUseDOM?window.location.search.startsWith("?")?"&":"?":"","getParamsDelimiter"),P=n(()=>g.canUseDOM?window.location.pathname:"","getBrowserLocation"),E=n((e,t,r)=>{let o=e;(e!==t||r.loginRoute!==t)&&(o=`${t}${Re()}redirect=${e}`),window.location.href=o},"redirectUser");function be(e,t,r){let o=new FormData;o.append("operations",JSON.stringify({query:e.text,variables:t,operationName:e.name}));let i={};for(let s=0;s<r.files.length;s++)o.append(`${s}`,r.files[s]),i[`${s}`]=[r.path(s)];return o.append("map",JSON.stringify(i)),o}n(be,"getRequestBodyWithUploadables");function Ee(e,t){return JSON.stringify({name:e.name,query:e.text,variables:t})}n(Ee,"getRequestBodyWithoutUplodables");function G(e,t,r){return r?be(e,t,r):Ee(e,t)}n(G,"getRequestBody");var X=n((e,t)=>{let r=new Headers;if(t?r.append("Accept","*/*"):(r.append("Accept","application/json"),r.append("Content-type","application/json")),e.useAuthorization){let{sessionToken:o}=e.StorageHandler.getTokens();o&&P()!==e.loginRoute&&r.append("Authorization",`Bearer ${o}`)}return e.partner&&r.append("X-Partner",e.partner),r},"getHeaders"),Z=n((e,t,r)=>{if(e.status<300&&e.headers&&e.headers.get("Content-Type")&&e.headers.get("Content-Type").indexOf("multipart/mixed")>=0){let o=e.body.getReader(),i=new TextDecoder,s=new Q.PatchResolver({onResponse:n(c=>t.next(c),"onResponse")});o.read().then(n(function c({value:l,done:p}){if(p)t.complete();else{let u;try{u=i.decode(l),s.handleChunk(u)}catch(d){let m=d;m.response=e,m.statusCode=e.status,m.bodyText=u,t.error(m)}o.read().then(c)}},"sendNext"))}else e.headers&&e.headers.get("Content-Type")&&e.headers.get("Content-Type").indexOf("application/json")>=0?e.json().then(r):e.text().then(o=>{t.next([o]),t.complete()})},"handleData"),h=1e3,M=h*60;var ee=n(e=>{let t=new C.QueryResponseCache({ttl:e.cacheTime,size:e.cacheSize}),r=J(e);async function o(){try{let{sessionToken:s}=e.StorageHandler.getTokens();return(await fetch(`${e.authUrl}user/me`,{headers:{"Content-Type":"application/json",Authorization:s}})).status===200}catch(s){return console.warn(`[Auth] ${s.message}`),!1}}n(o,"checkLoggedUser");async function i(s,c,l,p,u){try{let d=String(s.text);if(e.useCache&&A(s)&&!Y(l)){let a=t.get(d,c);if(a){u.next(a),u.complete();return}}e.useCache&&I(s)&&t.clear();let m=await r({method:"POST",headers:X(e,p),body:G(s,c,p)});Z(m,u,async a=>{if(e.useCache&&A(s)&&t.set(d,c,a),!u.closed){if(I(s)&&a.errors&&u.error(a.errors),a.errors){if(await o()||(e.StorageHandler.clear(),E("/",e.loginRoute,e)),e.redirectOnError){let j=[];Array.isArray(a.errors)&&(j=a.errors.map(({status_code:D})=>D));let B=P();j.some(D=>e.authenticationErrors.includes(D))&&B!==e.loginRoute&&(e.StorageHandler.clear(),E(B,e.loginRoute,e))}u.error(a.errors)}else a.data?u.next(a):u.error(a);u.complete()}})}catch(d){if(g.canUseDOM&&!["AbortError","TimeOutError"].includes(d.name)&&e.StorageHandler.clear(),e.redirectOnError){let a=P();a!==e.loginRoute&&E(a,e.loginRoute,e)}await o()||(e.StorageHandler.clear(),E("/",e.loginRoute,e)),u.error(d)}}return n(i,"fetchFn"),(s,c,l,p)=>C.Observable.create(u=>{i(s,c,l,p,u)})},"createFetchFunction");var te=_(require("js-cookie"));var N=class N{get(t){throw new Error('Must implement a "GET" method')}set(t,r){throw new Error('Must implement a "SET" method')}delete(t){throw new Error('Must implement a "DELETE" method')}};n(N,"DefaultStrategy");var O=N,L=class L extends O{constructor(){super(),this.strategy=localStorage}get(t){return this.strategy.getItem(t)}set(t,r){this.strategy.setItem(t,r)}delete(t){this.strategy.removeItem(t)}};n(L,"LocalStorageStrategy");var q=L,W=class W extends O{constructor(){super(),this.strategy=te.default}get(t){return this.strategy.get(t)}set(t,r){this.strategy.set(t,r)}delete(t){this.strategy.remove(t)}};n(W,"CookieStrategy");var H=W,y=Symbol("storage-handler"),x=Symbol("prop-session"),S=Symbol("prop-refresh"),$=class ${constructor(t){this[x]=t.sessionStorageProp,this[S]=t.refreshStorageProp,t.storageType==="cookie"?this[y]=new H:this[y]=new q}getTokens(){return{refreshToken:this[y].get(this[S]),sessionToken:this[y].get(this[x])}}setTokens(t){this[y].set(this[S],t.refreshToken),this[y].set(this[x],t.sessionToken)}clear(){this[y].delete(this[S]),this[y].delete(this[x])}hasChangedSession({sessionToken:t}){let{sessionToken:r}=this.getTokens();return t!==r}};n($,"StorageClass");var v=$;var re=require("graphql-ws"),oe=require("relay-runtime");function ne(e){return()=>{let t=(0,re.createClient)({url:e.socket});return(r,o)=>oe.Observable.create(i=>t.subscribe({operationName:r.name,query:r.text||"",variables:o},{next:n(s=>i.next(s),"next"),error:n(s=>i.error(s),"error"),complete:n(()=>i.complete(),"complete")}))}}n(ne,"setupSubscription");var se=Symbol("mount-environment"),z=Symbol("handler-fetch"),F=Symbol("handler-subscription"),V=class V{constructor(t){if(this.url=t.url,this.authUrl=t.authUrl,this.socket=t.socket,this.storageType=t.storageType||"localStorage",this.cacheSize=t.cacheSize||250,this.cacheTime=t.cacheTime||M*8,this.timeout=t.timeout||M*15,this.sessionStorageProp=t.sessionStorageProp||"USER_SESSION_TOKEN",this.refreshStorageProp=t.refreshStorageProp||"USER_REFRESH_TOKEN",this.loginRoute=t.loginRoute||"/",this.useCache=t.useCache||!1,this.useDebug=t.useDebug||!1,this.useAuthorization=t.useAuthorization||!1,this.useRetries=t.useRetries||!1,this.useSubscription=t.useSubscription||!1,this.redirectOnError=t.redirectOnError||!1,this.retryWhen=t.retryWhen||[503,504,521,522,524],this.authenticationErrors=t.authenticationErrors||[401,403],this.retries=t.retries||[h,h*2,h*3,h*5,h*8,h*13,h*21,h*34],this.partner=t.partner||void 0,!this.url)throw new Error("[HTTPFetchEndpoint] You must at least set url parameter.");if(this.useAuthorization&&!this.authUrl)throw new Error('[useAuthorization] Authorization is set but no "authUrl" was provided.');if(this.StorageHandler=new v(this),this.useSubscription){if(!this.socket)throw new Error("[useSubscription] If you choose to use WebSocket you must set a socket endpoint.");this[F]=ne(this)}this[z]=ee(this),this[se]()}[(z,F,se)](){let t=f.Network.create(this[z],this[F]||null),r=new f.RecordSource,o=new f.Store(r);this.Environment=new f.Environment({network:t,store:o})}};n(V,"RelayEnvironment");var T=V;var k=_(require("react"));var ie=k.default.createContext(void 0);function xe({children:e,environment:t}){return k.default.createElement(ie.Provider,{value:{environment:t}},e)}n(xe,"EnvironmentProvider");function Se(){let e=k.default.useContext(ie);if(e===void 0)throw new Error("useEnvironment must be used within a EnvironmentProvider");if(e.environment===null||e.environment===void 0)throw new Error("You should provide a Relay Environment to EnvironmentProvider component");return e}n(Se,"useEnvironment");var ae=require("nanoid"),R=require("relay-runtime");function ce(e){return e!==null&&typeof e=="object"}n(ce,"isObject");var ve=(0,ae.nanoid)();function Te({parentId:e,itemId:t,parentFieldName:r,store:o}){let i=o.get(e),s=i.getLinkedRecords(r);i.setLinkedRecords(s.filter(c=>c.dataID!==t),r)}n(Te,"listRecordRemoveUpdater");function we({parentId:e,item:t,type:r,parentFieldName:o,store:i}){let s=i.create(t.id,r);Object.keys(t).forEach(p=>{s.setValue(t[p],p)});let c=i.get(e),l=c.getLinkedRecords(o);c.setLinkedRecords([...l,s],o)}n(we,"listRecordAddUpdater");function ue(e,t,r,o,i=!1){if(o){let s=e.get(t),c=R.ConnectionHandler.getConnection(s,r);if(!c)return;i?R.ConnectionHandler.insertEdgeBefore(c,o):R.ConnectionHandler.insertEdgeAfter(c,o)}}n(ue,"connectionUpdater");function Pe({parentId:e,store:t,connectionName:r,item:o,customNode:i,itemType:s}){let c=i||t.create(o.id,s);!i&&Object.keys(o).forEach(p=>{c.setValue(o[p],p)});let l=t.create(`client:newEdge:${String(c.getDataID).match(/[^:]+$/)[0]}`,`${s}Edge`);l.setLinkedRecord(c,"node"),ue(t,e,r,l)}n(Pe,"optimisticConnectionUpdater");function Ce({parentId:e,connectionName:t,nodeId:r,store:o}){let i=o.get(e),s=R.ConnectionHandler.getConnection(i,t);if(!s){console.warn(`Connection ${t} not found on ${e}`);return}R.ConnectionHandler.deleteNode(s,r)}n(Ce,"connectionDeleteEdgeUpdater");function Oe({object:e,proxy:t}){Object.keys(e).forEach(r=>{ce(e[r])||Array.isArray(e[r])||t.setValue(e[r],r)})}n(Oe,"copyObjScalarsToProxy");var pe=require("relay-runtime");var ke=n((e,t)=>new Promise((r,o)=>{(0,pe.commitMutation)(e,{...t,onError:o,onCompleted:r})}),"commitMutation");0&&(module.exports={ClientMutationID,CreateRelayEnvironment,EnvironmentProvider,commitMutation,connectionDeleteEdgeUpdater,connectionUpdater,copyObjScalarsToProxy,isObject,listRecordAddUpdater,listRecordRemoveUpdater,optimisticConnectionUpdater,useEnvironment});
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@apollion-dsi/relay",
|
|
3
|
+
"version": "0.25.9",
|
|
4
|
+
"description": "Frontend services regarding Relay Environment",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"module": "lib/index.esm.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"lib/**/*"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"scripts": {
|
|
13
|
+
"prepare": "yarn build",
|
|
14
|
+
"pretest": "relay-compiler",
|
|
15
|
+
"audit-dependencies": "audit-ci --config audit-ci.json",
|
|
16
|
+
"coverage": "jest --coverage",
|
|
17
|
+
"lint": "eslint src --quiet",
|
|
18
|
+
"lint:full": "eslint src",
|
|
19
|
+
"lint:fix": "eslint src --fix",
|
|
20
|
+
"check-types": "tsc --noEmit",
|
|
21
|
+
"prettier": "prettier --check **/*.{ts,tsx} --ignore-path .gitignore --no-error-on-unmatched-pattern",
|
|
22
|
+
"format": "yarn prettier --write",
|
|
23
|
+
"validate": "./scripts/validate.sh",
|
|
24
|
+
"validate:tests": "jest --coverage",
|
|
25
|
+
"build": "node ./esbuild",
|
|
26
|
+
"postbuild": "tsc --emitDeclarationOnly",
|
|
27
|
+
"test": "yarn validate",
|
|
28
|
+
"code:check": "yarn lint && yarn coverage"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"react": "19.2.6"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"fetch-multipart-graphql": "2.3.1",
|
|
35
|
+
"graphql": "15.10.1",
|
|
36
|
+
"graphql-ws": "6.0.8",
|
|
37
|
+
"js-cookie": "3.0.5",
|
|
38
|
+
"nanoid": "5.1.11",
|
|
39
|
+
"react-relay": "20.1.1",
|
|
40
|
+
"relay-runtime": "20.1.1",
|
|
41
|
+
"relay-test-utils": "20.1.1"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@apollion-dsi/eslint-config": "0.6.0",
|
|
45
|
+
"@babel/core": "7.29.0",
|
|
46
|
+
"@babel/plugin-transform-class-properties": "7.27.1",
|
|
47
|
+
"@babel/plugin-transform-runtime": "7.29.0",
|
|
48
|
+
"@babel/preset-env": "7.29.5",
|
|
49
|
+
"@babel/preset-react": "7.28.5",
|
|
50
|
+
"@babel/preset-typescript": "7.28.5",
|
|
51
|
+
"@testing-library/dom": "10.4.1",
|
|
52
|
+
"@testing-library/jest-dom": "6.9.1",
|
|
53
|
+
"@testing-library/react": "16.3.2",
|
|
54
|
+
"@types/jest": "30.0.0",
|
|
55
|
+
"@types/js-cookie": "3.0.6",
|
|
56
|
+
"@types/lodash": "4.17.24",
|
|
57
|
+
"@types/react": "19.2.14",
|
|
58
|
+
"@types/react-relay": "18.2.1",
|
|
59
|
+
"@types/relay-runtime": "20.1.1",
|
|
60
|
+
"@types/relay-test-utils": "19.0.0",
|
|
61
|
+
"audit-ci": "7.1.0",
|
|
62
|
+
"babel-jest": "30.4.1",
|
|
63
|
+
"babel-plugin-relay": "20.1.1",
|
|
64
|
+
"esbuild": "0.28.0",
|
|
65
|
+
"eslint": "9.29.0",
|
|
66
|
+
"express": "4.21.2",
|
|
67
|
+
"express-graphql": "0.12.0",
|
|
68
|
+
"graphql-relay": "0.9.0",
|
|
69
|
+
"isomorphic-fetch": "3.0.0",
|
|
70
|
+
"jest": "30.4.2",
|
|
71
|
+
"jest-environment-jsdom": "30.4.1",
|
|
72
|
+
"npm-run-all": "4.1.5",
|
|
73
|
+
"prettier": "3.8.3",
|
|
74
|
+
"react": "19.2.6",
|
|
75
|
+
"react-dom": "19.2.6",
|
|
76
|
+
"relay-compiler": "20.1.1",
|
|
77
|
+
"typescript": "6.0.3"
|
|
78
|
+
}
|
|
79
|
+
}
|