effect-query 0.0.1-alpha.3 → 0.1.1
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 +24 -0
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -5
- package/src/errors.ts +0 -74
- package/src/index.ts +0 -86
- package/src/infiniteQueryOptions.ts +0 -142
- package/src/mutationOptions.ts +0 -95
- package/src/queryOptions.ts +0 -134
- package/src/runner.ts +0 -32
- package/src/types.ts +0 -5
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://github.com/voidhashcom/effect-query/raw/main/banner.png" alt="Effect Query Logo">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Effect Query
|
|
6
|
+
|
|
7
|
+
Integration of Effect-ts with Tanstack Query. Run your Effects from Tanstack Query. Fully type-safe and compatible with Effect RPC and Effect HttpApi.
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Install the package
|
|
13
|
+
npm install effect-query
|
|
14
|
+
|
|
15
|
+
# Install peer dependencies (if not already installed)
|
|
16
|
+
npm install @tanstack/react-query effect
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Read the full documentation [here](https://github.com/voidhashcom/effect-query)
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
Made with ❤️ by <a href="https://voidhash.com">Voidhash</a>
|
|
24
|
+
</p>
|
package/dist/index.cjs
CHANGED
|
@@ -213,8 +213,8 @@ var EffectQueryRunner = class {
|
|
|
213
213
|
}
|
|
214
214
|
async run(effect$1, span, options = {}) {
|
|
215
215
|
var _this = this;
|
|
216
|
-
const
|
|
217
|
-
return await _this.runtime.runPromiseExit(
|
|
216
|
+
const runnable = effect.Effect.scoped(effect$1.pipe(effect.Effect.withSpan(span), effect.Effect.tapErrorCause(effect.Effect.logError)));
|
|
217
|
+
return await _this.runtime.runPromiseExit(runnable, { signal: options.signal });
|
|
218
218
|
}
|
|
219
219
|
};
|
|
220
220
|
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;ADDyD,KEctD,0BFboD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEiBrC,mBFjBqC,GEiBf,mBFjBe,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EEoB9C,oBFpB8C,CEoBzB,SFpByB,EEoBd,UFpBc,CAAA,EAAA,GEqBpD,MAAA,CAAO,MFrB6C,CEqBtC,WFrBsC,EEqB3B,gBFrB2B,EEqBX,iBFrBW,CAAA;AAAA,KEuBpD,8CFrBuB,CAAA,YAAA,EAAA,MAAA,EAAA,QEwBlB,YFxBkB,CEwBL,YFxBK,EAAA,OAAA,CAAA,EAAA,kBEyBR,mBFzBQ,GEyBc,mBFzBd,CAAA,GE0BxB,mCF1BwB,CE0BY,YF1BZ,EE0B0B,MF1B1B,EE0BkC,KF1BlC,EE0ByC,SF1BzC,CAAA;KE4BvB,yCFxBmB,CAAA,YAAA,EAAA,MAAA,EAAA,QE2Bd,YF3Bc,CE2BD,YF3BC,EAAA,OAAA,CAAA,EAAA,kBE4BJ,mBF5BI,GE4BkB,mBF5BlB,CAAA,GE6BpB,8BF7BoB,CE6BW,YF7BX,EE6ByB,MF7BzB,EE6BiC,KF7BjC,EE6BwC,SF7BxC,CAAA;KE+BnB,4CF/BsC,CAAA,YAAA,EAAA,MAAA,EAAA,QEkCjC,YFlCiC,CEkCpB,YFlCoB,EAAA,OAAA,CAAA,EAAA,kBEmCvB,mBFnCuB,GEmCD,mBFnCC,CAAA,GEoCvC,iCFpCuC,CEoCL,YFpCK,EEoCS,MFpCT,EEoCiB,KFpCjB,EEoCwB,SFpCxB,CAAA;AACrC,KEqCM,+BFrCN,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEyCc,mBFzCd,GEyCoC,mBFzCpC,CAAA,GE0CF,IF1CE,CE2CF,8CF3CE,CE4CA,WF5CA,EE6CA,gBF7CA,EE8CA,WF9CA,EE+CA,SF/CA,CAAA,GEiDF,4CFjDE,CEkDA,WFlDA,EEmDA,gBFnDA,EEoDA,WFpDA,EEqDA,SFrDA,CAAA,GEuDF,yCFvDE,CEwDA,WFxDA,EEyDA,gBFzDA,EE0DA,WF1DA,EE2DA,SF3DA,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACF,QAAA,EE8DQ,mBF9DR;EACA,OAAA,EE8DO,0BF9DP,CE+DA,WF/DA,EEgEA,gBFhEA,EEiEA,iBFjEA,EEkEA,mBFlEA,CAAA;CAEU;;;AAdiB,KGW1B,yBHTsD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GAAA,CAAA,SAAA,EGe9C,YHf8C,EAAA,GGgBtD,MAAA,CAAO,MHhB+C,CGgBxC,WHhBwC,EGgB7B,gBHhB6B,EGgBb,iBHhBa,CAAA;AACrD,KGiBM,+BHjB6C,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GGsBrD,IHtBqD,CGuBvD,kBHvBuD,CGuBpC,WHvBoC,EGuBzB,gBHvByB,EGuBT,YHvBS,CAAA,EAAA,aAAA,GAAA,YAAA,CAAA,GAAA;EAEpD,WAAA,EAAA,MAAA;EAIa,UAAM,EGsBlB,yBHtBkB,CGuBhB,WHvBgB,EGwBhB,gBHxBgB,EGyBhB,iBHzBgB,EG0BhB,YH1BgB,CAAA,GAAA,OG4BX,SH5BW;CAAmB;;;AAPgB,KIatD,kBJZC,CAAA,WAAmD,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIgBrC,mBJhBqC,GIgBf,mBJhBe,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EImB9C,oBJnB8C,CImBzB,SJnByB,EImBd,UJnBc,CAAA,EAAA,GIoBpD,MAAA,CAAO,MJpB6C,CIoBtC,WJpBsC,EIoB3B,gBJpB2B,EIoBX,iBJpBW,CAAA;AAAA,KIsBpD,sCJpBuB,CAAA,YAAA,EAAA,MAAA,EAAA,QIuBlB,YJvBkB,EAAA,kBIwBR,mBJxBQ,GIwBc,mBJxBd,CAAA,GIyBxB,2BJzBwB,CIyBI,YJzBJ,EIyBkB,MJzBlB,EIyB0B,KJzB1B,EIyBiC,SJzBjC,CAAA;KI2BvB,iCJvBmB,CAAA,YAAA,EAAA,MAAA,EAAA,QI0Bd,YJ1Bc,EAAA,kBI2BJ,mBJ3BI,GI2BkB,mBJ3BlB,CAAA,GI4BpB,sBJ5BoB,CI4BG,YJ5BH,EI4BiB,MJ5BjB,EI4ByB,KJ5BzB,EI4BgC,SJ5BhC,CAAA;KI8BnB,oCJ9BsC,CAAA,YAAA,EAAA,MAAA,EAAA,QIiCjC,YJjCiC,EAAA,kBIkCvB,mBJlCuB,GIkCD,mBJlCC,CAAA,GImCvC,yBJnCuC,CImCb,YJnCa,EImCC,MJnCD,EImCS,KJnCT,EImCgB,SJnChB,CAAA;AACrC,KIoCM,uBJpCN,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIwCc,mBJxCd,GIwCoC,mBJxCpC,CAAA,GIyCF,IJzCE,CI0CF,sCJ1CE,CI2CA,WJ3CA,EI4CA,gBJ5CA,EI6CA,WJ7CA,EI8CA,SJ9CA,CAAA,GIgDF,oCJhDE,CIiDA,WJjDA,EIkDA,gBJlDA,EImDA,WJnDA,EIoDA,SJpDA,CAAA,GIsDF,iCJtDE,CIuDA,WJvDA,EIwDA,gBJxDA,EIyDA,WJzDA,EI0DA,SJ1DA,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACF,QAAA,EI6DQ,mBJ7DR;EACA,OAAA,EI6DO,kBJ7DP,CI8DA,WJ9DA,EI+DA,gBJ/DA,EIgEA,iBJhEA,EIiEA,mBJjEA,CAAA;CAEU;;;iBKCE,gCACP,KAAA,CAAM,MAAM;ELdf,YAAA,EAAA,CAAA,SAAqD,EAAA,uBAAA;IACrD,IAAA,EAAA,MAAA;EAED,CAAA,EAAA,eAAA,CAAA,CAAA,OAAuB,EKsBb,uBLtBa,CKuBpB,SLvBoB,EKwBpB,cLxBoB,EKyBpB,eLzBoB,CAAA,EAAA,GK0BrB,sBAAA,CAAA,eL1BqB,CK0BrB,SL1BqB,EAAA,CK0BrB,cL1BqB,CAAA,SAAA,CAAA,KAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,kBL1BqB,CK0BrB,cL1BqB,CAAA,EK0BrB,SL1BqB,EK0BrB,mBAAA,CL1BqB;EAIV,oBAAM,EAAA,CAAA,SAAA,EAAA,uBAAA;IAAmB,IAAA,EAAA,MAAA;EACrC,CAAA,EAAA,eAAA,CAAA,CAAA,OAAA,EK0CS,+BL1CT,CK2CE,SL3CF,EK4CE,cL5CF,EK6CE,eL7CF,CAAA,EAAA,GK8CC,sBAAA,CAAA,uBL9CD,CK8CC,SL9CD,EAAA,CK8CC,cL9CD,CAAA,SAAA,CAAA,KAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,kBL9CD,CK8CC,cL9CD,CAAA,EK8CC,SL9CD,EK8CC,mBAAA,EL9CD,OAAA,CAAA;EACF,eAAA,EAAA,CAAA,SAAA,EAAA,uBAAA;IACA,IAAA,EAAA,MAAA;EAEU,CAAA,EAAA,eAAA,EAAA,UAAA,CAAA,CAAA,OAAA,EKwDC,+BLxDD,CKyDN,SLzDM,EK0DN,cL1DM,EK2DN,eL3DM,EK4DN,UL5DM,CAAA,EAAA,GK6DP,sBAAA,CAAA,kBL7DO,CK6DP,SL7DO,EAAA,CK6DP,cL7DO,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAA,GK6DP,iBL7DO,CAAA,OAAA,CAAA,GK6DP,kBL7DO,CK6DP,cL7DO,CAAA,EK6DP,UL7DO,EAAA,OAAA,CAAA;CACa"}
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;cAEM;cACA;KAED;;AAL0B,CAAA,GAEzB,KAAA,GAAA,KAAA,EAAA,YAAqD,OAAA,CAAA,GAAA;EACrD,MAAA,EAAA,CAAA,KAAA,EAMY,KAAA,CAAM,KANiC,CAAA,OAAA,CAAA,EAAA,GAMd,SANc;AAAA,CAAA,GAEpD,CAAA,CAKC,QALD,CAAA,SAAA,CAAA,KAAuB,CAAA,GAMxB,MANwB,CAAA,KAAA,EAAA,KAAA,CAAA,GAOxB,QAPwB,SAAA;EAIV,IAAM,EAAA,MAAA;CAAmB,GAAA,QAK7B,QAJR,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA,EAKa,OALb,CAKqB,QALrB,EAAA;EACF,IAAA,EAIyC,CAJzC;AACA,CAAA,CAAA,EAAA,GAIS,SAJT,EAEU,GAIR,MAJQ,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AACa,cAKd,kBALc,CAAA,iBAAA;EAAkB,IAAA,EAAA,MAAA;CAA1B,GAAA,KAAA,GAAA,KAAA,CAAA,SAOT,KAAA,CAPS;EACN,SAAA,IAAA,EAAA,OAOW,qBAPX;EAEP,SAAA,OAAA,EAMc,QANd;EAAM,SAAA,YAAA,EAOa,KAAA,CAAM,KAPnB,CAOyB,QAPzB,CAAA;EAEC,WAAA,CAAA,OAAA,EAAkB,MAAA,EAAA,OAAA,EAQlB,QARkB,EAAA,KAAA,EASpB,KAAA,CAAM,KATc,CASR,QATQ,CAAA;EAGP,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EAeX,uBAfW,CAgBlB,QAhBkB,SAAA;IACJ,IAAA,EAAA,MAAA;EACiB,CAAA,GAcK,QAdL,GAAA,KAAA,EAe/B,OAf+B,CAAA,CAAA,EAiBhC,OAjBgC;;AAGxB,cA+BA,iBA/BA,CAAA,OAAA,CAAA,SA+BmC,KAAA,CA/BnC;EACU,SAAA,IAAA,EAAA,OA+BC,oBA/BD;EAAZ,SAAM,WAAA,EAgCO,KAAA,CAAM,KAhCb,CAgCmB,OAhCnB,CAAA;EAUX,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAuBiC,OAvBjC;EAAoC,KAAA,CAAA,OAAA,CAAA,CAAA,OAAA,EA8B7B,uBA9B6B,CAAA,KAAA,EA8BE,OA9BF,CAAA,GA8Ba,MA9Bb,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EA+BrC,OA/BqC;;;;KCvC9B,mBAAA,6BAGV;;;ADDyD,KEctD,0BFboD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEiBrC,mBFjBqC,GEiBf,mBFjBe,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EEoB9C,oBFpB8C,CEoBzB,SFpByB,EEoBd,UFpBc,CAAA,EAAA,GEqBpD,MAAA,CAAO,MFrB6C,CEqBtC,WFrBsC,EEqB3B,gBFrB2B,EEqBX,iBFrBW,CAAA;AAAA,KEuBpD,8CFrBuB,CAAA,YAAA,EAAA,MAAA,EAAA,QEwBlB,YFxBkB,CEwBL,YFxBK,EAAA,OAAA,CAAA,EAAA,kBEyBR,mBFzBQ,GEyBc,mBFzBd,CAAA,GE0BxB,mCF1BwB,CE0BY,YF1BZ,EE0B0B,MF1B1B,EE0BkC,KF1BlC,EE0ByC,SF1BzC,CAAA;KE4BvB,yCFxBmB,CAAA,YAAA,EAAA,MAAA,EAAA,QE2Bd,YF3Bc,CE2BD,YF3BC,EAAA,OAAA,CAAA,EAAA,kBE4BJ,mBF5BI,GE4BkB,mBF5BlB,CAAA,GE6BpB,8BF7BoB,CE6BW,YF7BX,EE6ByB,MF7BzB,EE6BiC,KF7BjC,EE6BwC,SF7BxC,CAAA;KE+BnB,4CF/BsC,CAAA,YAAA,EAAA,MAAA,EAAA,QEkCjC,YFlCiC,CEkCpB,YFlCoB,EAAA,OAAA,CAAA,EAAA,kBEmCvB,mBFnCuB,GEmCD,mBFnCC,CAAA,GEoCvC,iCFpCuC,CEoCL,YFpCK,EEoCS,MFpCT,EEoCiB,KFpCjB,EEoCwB,SFpCxB,CAAA;AACrC,KEqCM,+BFrCN,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBEyCc,mBFzCd,GEyCoC,mBFzCpC,CAAA,GE0CF,IF1CE,CE2CF,8CF3CE,CE4CA,WF5CA,EE6CA,gBF7CA,EE8CA,WF9CA,EE+CA,SF/CA,CAAA,GEiDF,4CFjDE,CEkDA,WFlDA,EEmDA,gBFnDA,EEoDA,WFpDA,EEqDA,SFrDA,CAAA,GEuDF,yCFvDE,CEwDA,WFxDA,EEyDA,gBFzDA,EE0DA,WF1DA,EE2DA,SF3DA,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACF,QAAA,EE8DQ,mBF9DR;EACA,OAAA,EE8DO,0BF9DP,CE+DA,WF/DA,EEgEA,gBFhEA,EEiEA,iBFjEA,EEkEA,mBFlEA,CAAA;CAEU;;;AAdiB,KGW1B,yBHTsD,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GAAA,CAAA,SAAA,EGe9C,YHf8C,EAAA,GGgBtD,MAAA,CAAO,MHhB+C,CGgBxC,WHhBwC,EGgB7B,gBHhB6B,EGgBb,iBHhBa,CAAA;AACrD,KGiBM,+BHjB6C,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,YAAA,CAAA,GGsBrD,IHtBqD,CGuBvD,kBHvBuD,CGuBpC,WHvBoC,EGuBzB,gBHvByB,EGuBT,YHvBS,CAAA,EAAA,aAAA,GAAA,YAAA,CAAA,GAAA;EAEpD,WAAA,EAAA,MAAA;EAIa,UAAM,EGsBlB,yBHtBkB,CGuBhB,WHvBgB,EGwBhB,gBHxBgB,EGyBhB,iBHzBgB,EG0BhB,YH1BgB,CAAA,GAAA,OG4BX,SH5BW;CAAmB;;;AAPgB,KIatD,kBJZC,CAAA,WAAmD,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIgBrC,mBJhBqC,GIgBf,mBJhBe,EAAA,aAAA,KAAA,CAAA,GAAA,CAAA,OAAA,EImB9C,oBJnB8C,CImBzB,SJnByB,EImBd,UJnBc,CAAA,EAAA,GIoBpD,MAAA,CAAO,MJpB6C,CIoBtC,WJpBsC,EIoB3B,gBJpB2B,EIoBX,iBJpBW,CAAA;AAAA,KIsBpD,sCJpBuB,CAAA,YAAA,EAAA,MAAA,EAAA,QIuBlB,YJvBkB,EAAA,kBIwBR,mBJxBQ,GIwBc,mBJxBd,CAAA,GIyBxB,2BJzBwB,CIyBI,YJzBJ,EIyBkB,MJzBlB,EIyB0B,KJzB1B,EIyBiC,SJzBjC,CAAA;KI2BvB,iCJvBmB,CAAA,YAAA,EAAA,MAAA,EAAA,QI0Bd,YJ1Bc,EAAA,kBI2BJ,mBJ3BI,GI2BkB,mBJ3BlB,CAAA,GI4BpB,sBJ5BoB,CI4BG,YJ5BH,EI4BiB,MJ5BjB,EI4ByB,KJ5BzB,EI4BgC,SJ5BhC,CAAA;KI8BnB,oCJ9BsC,CAAA,YAAA,EAAA,MAAA,EAAA,QIiCjC,YJjCiC,EAAA,kBIkCvB,mBJlCuB,GIkCD,mBJlCC,CAAA,GImCvC,yBJnCuC,CImCb,YJnCa,EImCC,MJnCD,EImCS,KJnCT,EImCgB,SJnChB,CAAA;AACrC,KIoCM,uBJpCN,CAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,kBIwCc,mBJxCd,GIwCoC,mBJxCpC,CAAA,GIyCF,IJzCE,CI0CF,sCJ1CE,CI2CA,WJ3CA,EI4CA,gBJ5CA,EI6CA,WJ7CA,EI8CA,SJ9CA,CAAA,GIgDF,oCJhDE,CIiDA,WJjDA,EIkDA,gBJlDA,EImDA,WJnDA,EIoDA,SJpDA,CAAA,GIsDF,iCJtDE,CIuDA,WJvDA,EIwDA,gBJxDA,EIyDA,WJzDA,EI0DA,SJ1DA,CAAA,EAAA,SAAA,GAAA,UAAA,CAAA,GAAA;EACF,QAAA,EI6DQ,mBJ7DR;EACA,OAAA,EI6DO,kBJ7DP,CI8DA,WJ9DA,EI+DA,gBJ/DA,EIgEA,iBJhEA,EIiEA,mBJjEA,CAAA;CAEU;;;iBKCE,gCACP,KAAA,CAAM,MAAM;ELdf,YAAA,EAAA,CAAA,SAAqD,EAAA,uBAAA;IACrD,IAAA,EAAA,MAAA;EAED,CAAA,EAAA,eAAA,CAAA,CAAA,OAAuB,EKsBb,uBLtBa,CKuBpB,SLvBoB,EKwBpB,cLxBoB,EKyBpB,eLzBoB,CAAA,EAAA,GK0BrB,sBAAA,CAAA,eL1BqB,CK0BrB,SL1BqB,EAAA,CK0BrB,cL1BqB,CAAA,SAAA,CAAA,KAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,iBL1BqB,CAAA,OAAA,CAAA,GK0BrB,kBL1BqB,CK0BrB,cL1BqB,CAAA,EK0BrB,SL1BqB,EK0BrB,mBAAA,CL1BqB;EAIV,oBAAM,EAAA,CAAA,SAAA,EAAA,uBAAA;IAAmB,IAAA,EAAA,MAAA;EACrC,CAAA,EAAA,eAAA,CAAA,CAAA,OAAA,EK0CS,+BL1CT,CK2CE,SL3CF,EK4CE,cL5CF,EK6CE,eL7CF,CAAA,EAAA,GK8CC,sBAAA,CAAA,uBL9CD,CK8CC,SL9CD,EAAA,CK8CC,cL9CD,CAAA,SAAA,CAAA,KAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,iBL9CD,CAAA,OAAA,CAAA,GK8CC,kBL9CD,CK8CC,cL9CD,CAAA,EK8CC,SL9CD,EK8CC,mBAAA,EL9CD,OAAA,CAAA;EACF,eAAA,EAAA,CAAA,SAAA,EAAA,uBAAA;IACA,IAAA,EAAA,MAAA;EAEU,CAAA,EAAA,eAAA,EAAA,UAAA,CAAA,CAAA,OAAA,EKwDC,+BLxDD,CKyDN,SLzDM,EK0DN,cL1DM,EK2DN,eL3DM,EK4DN,UL5DM,CAAA,EAAA,GK6DP,sBAAA,CAAA,kBL7DO,CK6DP,SL7DO,EAAA,CK6DP,cL7DO,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAA,GK6DP,iBL7DO,CAAA,OAAA,CAAA,GK6DP,kBL7DO,CK6DP,cL7DO,CAAA,EK6DP,UL7DO,EAAA,OAAA,CAAA;CACa"}
|
package/dist/index.mjs
CHANGED
|
@@ -188,8 +188,8 @@ var EffectQueryRunner = class {
|
|
|
188
188
|
}
|
|
189
189
|
async run(effect, span, options = {}) {
|
|
190
190
|
var _this = this;
|
|
191
|
-
const
|
|
192
|
-
return await _this.runtime.runPromiseExit(
|
|
191
|
+
const runnable = Effect.scoped(effect.pipe(Effect.withSpan(span), Effect.tapErrorCause(Effect.logError)));
|
|
192
|
+
return await _this.runtime.runPromiseExit(runnable, { signal: options.signal });
|
|
193
193
|
}
|
|
194
194
|
};
|
|
195
195
|
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n >","mutationFn: MutationFunction<TFnResult, TVariables>","queryFn: QueryFunction<TFnResult, EffectQueryQueryKey>","this"],"sources":["../src/errors.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/runner.ts","../src/index.ts"],"sourcesContent":["import { Cause } from \"effect\";\n\nconst EffectQueryFailureTag = \"EffectQueryFailure\" as const;\nconst EffectQueryDefectTag = \"EffectQueryDefect\" as const;\n\ntype EffectQueryErrorMatcher<\n TFailure extends { _tag: string } | never = never,\n TReturn = unknown,\n> = {\n OrElse: (cause: Cause.Cause<unknown>) => TReturn;\n} & ([TFailure] extends [never]\n ? Record<never, never>\n : TFailure extends { _tag: string }\n ? {\n [K in TFailure[\"_tag\"]]?: (\n failure: Extract<TFailure, { _tag: K }>\n ) => TReturn;\n }\n : Record<never, never>);\n\nexport class EffectQueryFailure<\n TFailure extends { _tag: string } | never = never,\n> extends Error {\n readonly _tag: typeof EffectQueryFailureTag;\n readonly failure: TFailure;\n readonly failureCause: Cause.Cause<TFailure>;\n constructor(\n message: string,\n failure: TFailure,\n cause: Cause.Cause<TFailure>\n ) {\n super(message);\n this._tag = EffectQueryFailureTag;\n this.failure = failure;\n this.failureCause = cause;\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<\n TFailure extends { _tag: string } ? TFailure : never,\n TReturn\n >\n ): TReturn {\n if (\n this.failure &&\n typeof this.failure === \"object\" &&\n \"_tag\" in this.failure\n ) {\n const tag = this.failure._tag;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic tag matching requires any\n const handler = (matcher as any)[tag];\n if (typeof handler === \"function\") {\n return handler(this.failure);\n }\n }\n return matcher.OrElse(this.failureCause);\n }\n}\n\nexport class EffectQueryDefect<TDefect> extends Error {\n readonly _tag: typeof EffectQueryDefectTag;\n readonly defectCause: Cause.Cause<TDefect>;\n constructor(message: string, defect: TDefect) {\n super(message);\n this._tag = EffectQueryDefectTag;\n this.defectCause = Cause.die(defect);\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>\n ): TReturn {\n return matcher.OrElse(this.defectCause);\n }\n}\n","import {\n type DefinedInitialDataInfiniteOptions,\n type InfiniteData,\n infiniteQueryOptions,\n type QueryFunctionContext,\n type SkipToken,\n type UndefinedInitialDataInfiniteOptions,\n type UnusedSkipTokenInfiniteOptions,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectInfiniteQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectInfiniteQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectInfiniteQueryOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n > = async (queryFnContext) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return infiniteQueryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey as EffectQueryQueryKey,\n queryFn,\n }) as UseInfiniteQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import {\n type MutationFunction,\n mutationOptions,\n type skipToken,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\n\ntype EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = (\n variables: TVariables\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\nexport type EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = Omit<\n UseMutationOptions<TFnResult, TFnErrorResult, TVariables>,\n \"mutationKey\" | \"mutationFn\"\n> & {\n mutationKey: string;\n mutationFn:\n | EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n | typeof skipToken;\n};\n\n/**\n * @internal\n */\nexport function effectQueryMutationOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n>(\n inputOptions: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n }\n) {\n const spanName = inputOptions.mutationKey;\n const mutationFn: MutationFunction<TFnResult, TVariables> = async (\n variables: TVariables\n ) => {\n const effect = (\n inputOptions.mutationFn as EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n )(variables);\n const result = await context.runner.run(effect, spanName);\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n return mutationOptions({\n ...inputOptions,\n mutationFn,\n }) as UseMutationOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? never\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TVariables\n >;\n}\n","import {\n type DefinedInitialDataOptions,\n type QueryFunction,\n type QueryFunctionContext,\n queryOptions,\n type UndefinedInitialDataOptions,\n type UnusedSkipTokenOptions,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectQueryQueryOptions<\n TRuntimeInput,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TRuntimeInput>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: QueryFunction<TFnResult, EffectQueryQueryKey> = async (\n queryFnContext\n ) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return queryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey,\n queryFn,\n }) as UseQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import { Effect, type Exit, type Scope } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\n\nexport class EffectQueryRunner<TRuntimeInput> {\n readonly runtime: ManagedRuntime<TRuntimeInput, never>;\n constructor(runtime: ManagedRuntime<TRuntimeInput, never>) {\n this.runtime = runtime;\n }\n\n async run<TResult, TError, TRequirements>(\n effect: Effect.Effect<TResult, TError, TRequirements>,\n span: string,\n options: { signal?: AbortSignal } = {}\n ): Promise<Exit.Exit<TResult, TError>> {\n // This is a workaround to allow the effect to run without a scope (it will be provided by the caller)\n const effectToRun = effect as Effect.Effect<\n TResult,\n TError,\n TRuntimeInput | Scope.Scope\n >;\n return await this.runtime.runPromiseExit(\n effectToRun.pipe(\n Effect.withSpan(span),\n Effect.scoped,\n Effect.tapErrorCause(Effect.logError)\n ),\n {\n signal: options.signal,\n }\n );\n }\n}\n","import { type Layer, ManagedRuntime } from \"effect\";\nimport {\n type EffectInfiniteQueryOptionsInput,\n effectInfiniteQueryOptions,\n} from \"./infiniteQueryOptions\";\nimport {\n type EffectQueryMutationOptionsInput,\n effectQueryMutationOptions,\n} from \"./mutationOptions\";\nimport {\n type EffectQueryOptionsInput,\n effectQueryQueryOptions,\n} from \"./queryOptions\";\nimport { EffectQueryRunner } from \"./runner\";\n\nexport function createEffectQuery<Input>(\n layer: Layer.Layer<Input, never, never>\n) {\n const runtime = ManagedRuntime.make(layer);\n const runner = new EffectQueryRunner(runtime);\n\n return {\n queryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectQueryQueryOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(\n {\n queryKey: options.queryKey,\n queryFn: options.queryFn,\n },\n {\n runner,\n }\n ),\n infiniteQueryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectInfiniteQueryOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(options, { runner }),\n mutationOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n >(\n options: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n ) =>\n effectQueryMutationOptions<\n Input,\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >(options, { runner }),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAiB7B,IAAa,qBAAb,cAEU,MAAM;CAId,YACE,SACA,SACA,OACA;AACA,QAAM,QAAQ;wBARP;wBACA;wBACA;AAOP,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,eAAe;;CAGtB,MACE,SAIS;AACT,MACE,KAAK,WACL,OAAO,KAAK,YAAY,YACxB,UAAU,KAAK,SACf;GAGA,MAAM,UAAW,QAFL,KAAK,QAAQ;AAGzB,OAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,KAAK,QAAQ;;AAGhC,SAAO,QAAQ,OAAO,KAAK,aAAa;;;AAI5C,IAAa,oBAAb,cAAgD,MAAM;CAGpD,YAAY,SAAiB,QAAiB;AAC5C,QAAM,QAAQ;wBAHP;wBACA;AAGP,OAAK,OAAO;AACZ,OAAK,cAAc,MAAM,IAAI,OAAO;;CAGtC,MACE,SACS;AACT,SAAO,QAAQ,OAAO,KAAK,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACa3C,SAAgB,2BAMd,cAKA,SAIA;CACA,MAAM,CAAC,YAAY,aAAa;CAEhC,MAAMA,UASF,OAAO,mBAAmB;EAC5B,MAAM,SAAS,aAAa,QAAQ,eAAe;EACnD,MAAM,SAAS,MAAM,QAAQ,OAAO,IAAI,QAAQ,UAAU,EACxD,QAAQ,QAAQ,QACjB,CAAC;AACF,SAAO,KAAK,MAAM,QAAQ;GACxB,YAAY,UAAU;GACtB,YAAY,UAAU;AACpB,QAAI,MAAM,SAAS,QAAQ;KACzB,MAAM,UAAU,MAAM;AACtB,WAAM,IAAI,mBAAmB,MAAM,OAAO,MAAM,EAAE,SAAS,MAAM;;AAEnE,UAAM,IAAI,kBAAkB,MAAM,OAAO,MAAM,EAAE,MAAM;;GAE1D,CAAC;;AAIJ,QAAO,uDACF;EACH,UAAU,aAAa;EACvB;IACA;;;;;;;;AC3FJ,SAAgB,2BAOd,cAMA,SAGA;CACA,MAAM,WAAW,aAAa;CAC9B,MAAMC,aAAsD,OAC1D,cACG;EACH,MAAM,SACJ,aAAa,WAMb,UAAU;EACZ,MAAM,SAAS,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS;AACzD,SAAO,KAAK,MAAM,QAAQ;GACxB,YAAY,UAAU;GACtB,YAAY,UAAU;AACpB,QAAI,MAAM,SAAS,QAAQ;KACzB,MAAM,UAAU,MAAM;AACtB,WAAM,IAAI,mBAAmB,MAAM,OAAO,MAAM,EAAE,SAAS,MAAM;;AAEnE,UAAM,IAAI,kBAAkB,MAAM,OAAO,MAAM,EAAE,MAAM;;GAE1D,CAAC;;AAGJ,QAAO,kDACF,qBACH,cACA;;;;;;;;ACJJ,SAAgB,wBAMd,cAKA,SAIA;CACA,MAAM,CAAC,YAAY,aAAa;CAEhC,MAAMC,UAAyD,OAC7D,mBACG;EACH,MAAM,SAAS,aAAa,QAAQ,eAAe;EACnD,MAAM,SAAS,MAAM,QAAQ,OAAO,IAAI,QAAQ,UAAU,EACxD,QAAQ,QAAQ,QACjB,CAAC;AACF,SAAO,KAAK,MAAM,QAAQ;GACxB,YAAY,UAAU;GACtB,YAAY,UAAU;AACpB,QAAI,MAAM,SAAS,QAAQ;KACzB,MAAM,UAAU,MAAM;AACtB,WAAM,IAAI,mBAAmB,MAAM,OAAO,MAAM,EAAE,SAAS,MAAM;;AAEnE,UAAM,IAAI,kBAAkB,MAAM,OAAO,MAAM,EAAE,MAAM;;GAE1D,CAAC;;AAIJ,QAAO,+CACF;EACH,UAAU,aAAa;EACvB;IACA;;;;;AC1HJ,IAAa,oBAAb,MAA8C;CAE5C,YAAY,SAA+C;wBADlD;AAEP,OAAK,UAAU;;CAGjB,MAAM,IACJ,QACA,MACA,UAAoC,EAAE,EACD;;EAErC,MAAM,cAAc;AAKpB,SAAO,MAAMC,MAAK,QAAQ,eACxB,YAAY,KACV,OAAO,SAAS,KAAK,EACrB,OAAO,QACP,OAAO,cAAc,OAAO,SAAS,CACtC,EACD,EACE,QAAQ,QAAQ,QACjB,CACF;;;;;;ACdL,SAAgB,kBACd,OACA;CAEA,MAAM,SAAS,IAAI,kBADH,eAAe,KAAK,MAAM,CACG;AAE7C,QAAO;EACL,eAKE,YAMA,wBAME;GACE,UAAU,QAAQ;GAClB,SAAS,QAAQ;GAClB,EACD,EACE,QACD,CACF;EACH,uBAKE,YAMA,2BAKE,SAAS,EAAE,QAAQ,CAAC;EACxB,kBAME,YAOA,2BAME,SAAS,EAAE,QAAQ,CAAC;EACzB"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n >","mutationFn: MutationFunction<TFnResult, TVariables>","queryFn: QueryFunction<TFnResult, EffectQueryQueryKey>","this"],"sources":["../src/errors.ts","../src/infiniteQueryOptions.ts","../src/mutationOptions.ts","../src/queryOptions.ts","../src/runner.ts","../src/index.ts"],"sourcesContent":["import { Cause } from \"effect\";\n\nconst EffectQueryFailureTag = \"EffectQueryFailure\" as const;\nconst EffectQueryDefectTag = \"EffectQueryDefect\" as const;\n\ntype EffectQueryErrorMatcher<\n TFailure extends { _tag: string } | never = never,\n TReturn = unknown,\n> = {\n OrElse: (cause: Cause.Cause<unknown>) => TReturn;\n} & ([TFailure] extends [never]\n ? Record<never, never>\n : TFailure extends { _tag: string }\n ? {\n [K in TFailure[\"_tag\"]]?: (\n failure: Extract<TFailure, { _tag: K }>\n ) => TReturn;\n }\n : Record<never, never>);\n\nexport class EffectQueryFailure<\n TFailure extends { _tag: string } | never = never,\n> extends Error {\n readonly _tag: typeof EffectQueryFailureTag;\n readonly failure: TFailure;\n readonly failureCause: Cause.Cause<TFailure>;\n constructor(\n message: string,\n failure: TFailure,\n cause: Cause.Cause<TFailure>\n ) {\n super(message);\n this._tag = EffectQueryFailureTag;\n this.failure = failure;\n this.failureCause = cause;\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<\n TFailure extends { _tag: string } ? TFailure : never,\n TReturn\n >\n ): TReturn {\n if (\n this.failure &&\n typeof this.failure === \"object\" &&\n \"_tag\" in this.failure\n ) {\n const tag = this.failure._tag;\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic tag matching requires any\n const handler = (matcher as any)[tag];\n if (typeof handler === \"function\") {\n return handler(this.failure);\n }\n }\n return matcher.OrElse(this.failureCause);\n }\n}\n\nexport class EffectQueryDefect<TDefect> extends Error {\n readonly _tag: typeof EffectQueryDefectTag;\n readonly defectCause: Cause.Cause<TDefect>;\n constructor(message: string, defect: TDefect) {\n super(message);\n this._tag = EffectQueryDefectTag;\n this.defectCause = Cause.die(defect);\n }\n\n match<TReturn>(\n matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>\n ): TReturn {\n return matcher.OrElse(this.defectCause);\n }\n}\n","import {\n type DefinedInitialDataInfiniteOptions,\n type InfiniteData,\n infiniteQueryOptions,\n type QueryFunctionContext,\n type SkipToken,\n type UndefinedInitialDataInfiniteOptions,\n type UnusedSkipTokenInfiniteOptions,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectInfiniteQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectInfiniteQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = InfiniteData<TQueryFnData, unknown>,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectInfiniteQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectInfiniteQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectInfiniteQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectInfiniteQueryOptions<\n // biome-ignore lint/suspicious/noExplicitAny: generic\n TManagedRuntime extends ManagedRuntime<any, never>,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TManagedRuntime>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: Exclude<\n UseInfiniteQueryOptions<\n TFnResult,\n TFnErrorResult,\n InfiniteData<TFnResult, unknown>,\n EffectQueryQueryKey,\n unknown\n >[\"queryFn\"],\n SkipToken | undefined\n > = async (queryFnContext) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return infiniteQueryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey as EffectQueryQueryKey,\n queryFn,\n }) as UseInfiniteQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import {\n type MutationFunction,\n mutationOptions,\n type skipToken,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\n\ntype EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = (\n variables: TVariables\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\nexport type EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables,\n> = Omit<\n UseMutationOptions<TFnResult, TFnErrorResult, TVariables>,\n \"mutationKey\" | \"mutationFn\"\n> & {\n mutationKey: string;\n mutationFn:\n | EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n | typeof skipToken;\n};\n\n/**\n * @internal\n */\nexport function effectQueryMutationOptions<\n // biome-ignore lint/suspicious/noExplicitAny: generic\n TManagedRuntime extends ManagedRuntime<any, never>,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n>(\n inputOptions: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >,\n context: {\n runner: EffectQueryRunner<TManagedRuntime>;\n }\n) {\n const spanName = inputOptions.mutationKey;\n const mutationFn: MutationFunction<TFnResult, TVariables> = async (\n variables: TVariables\n ) => {\n const effect = (\n inputOptions.mutationFn as EffectfulMutationFunction<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n )(variables);\n const result = await context.runner.run(effect, spanName);\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n return mutationOptions({\n ...inputOptions,\n mutationFn,\n }) as UseMutationOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? never\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TVariables\n >;\n}\n","import {\n type DefinedInitialDataOptions,\n type QueryFunction,\n type QueryFunctionContext,\n queryOptions,\n type UndefinedInitialDataOptions,\n type UnusedSkipTokenOptions,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { Cause, type Effect, Exit } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\nimport { EffectQueryDefect, EffectQueryFailure } from \"./errors\";\nimport type { EffectQueryRunner } from \"./runner\";\nimport type { EffectQueryQueryKey } from \"./types\";\n\ntype EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n TPageParam = never,\n> = (\n context: QueryFunctionContext<TQueryKey, TPageParam>\n) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;\n\ntype EffectQueryUndefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryUnusedSkipTokenOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;\n\ntype EffectQueryDefinedInitialDataOptions<\n TQueryFnData,\n TError,\n TData = TQueryFnData,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;\n\nexport type EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,\n> = Omit<\n | EffectQueryUndefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryDefinedInitialDataOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >\n | EffectQueryUnusedSkipTokenOptions<\n TFnResult,\n TFnErrorResult,\n TFnResult,\n TQueryKey\n >,\n \"queryFn\" | \"queryKey\"\n> & {\n queryKey: EffectQueryQueryKey;\n queryFn: EffectQueryQueryFn<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n EffectQueryQueryKey\n >;\n};\n\n/**\n * @internal\n */\nexport function effectQueryQueryOptions<\n // biome-ignore lint/suspicious/noExplicitAny: generic\n TManagedRuntime extends ManagedRuntime<any, never>,\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n>(\n inputOptions: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >,\n context: {\n runner: EffectQueryRunner<TManagedRuntime>;\n signal?: AbortSignal;\n }\n) {\n const [spanName] = inputOptions.queryKey;\n\n const queryFn: QueryFunction<TFnResult, EffectQueryQueryKey> = async (\n queryFnContext\n ) => {\n const effect = inputOptions.queryFn(queryFnContext);\n const result = await context.runner.run(effect, spanName, {\n signal: context.signal,\n });\n return Exit.match(result, {\n onSuccess: (value) => value,\n onFailure: (cause) => {\n if (cause._tag === \"Fail\") {\n const failure = cause.error;\n throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);\n }\n throw new EffectQueryDefect(Cause.pretty(cause), cause);\n },\n });\n };\n\n // The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.\n return queryOptions({\n ...inputOptions,\n queryKey: inputOptions.queryKey,\n queryFn,\n }) as UseQueryOptions<\n TFnResult,\n [TFnErrorResult] extends [never]\n ? EffectQueryDefect<unknown>\n : EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,\n TFnResult,\n EffectQueryQueryKey\n >;\n}\n","import { Effect, type Exit } from \"effect\";\nimport type { ManagedRuntime } from \"effect/ManagedRuntime\";\n\nexport class EffectQueryRunner<\n // biome-ignore lint/suspicious/noExplicitAny: generic\n TManagedRuntime extends ManagedRuntime<any, never>,\n> {\n readonly runtime: TManagedRuntime;\n constructor(runtime: TManagedRuntime) {\n this.runtime = runtime;\n }\n\n async run<TResult, TError, TRequirements>(\n effect: Effect.Effect<TResult, TError, TRequirements>,\n span: string,\n options: { signal?: AbortSignal } = {}\n ): Promise<Exit.Exit<TResult, TError>> {\n const runnable = Effect.scoped(\n effect.pipe(Effect.withSpan(span), Effect.tapErrorCause(Effect.logError))\n );\n return await this.runtime.runPromiseExit(runnable, {\n signal: options.signal,\n });\n }\n}\n","import { type Layer, ManagedRuntime } from \"effect\";\nimport {\n type EffectInfiniteQueryOptionsInput,\n effectInfiniteQueryOptions,\n} from \"./infiniteQueryOptions\";\nimport {\n type EffectQueryMutationOptionsInput,\n effectQueryMutationOptions,\n} from \"./mutationOptions\";\nimport {\n type EffectQueryOptionsInput,\n effectQueryQueryOptions,\n} from \"./queryOptions\";\nimport { EffectQueryRunner } from \"./runner\";\n\nexport function createEffectQuery<Input>(\n layer: Layer.Layer<Input, never, never>\n) {\n const runtime = ManagedRuntime.make(layer);\n const runner = new EffectQueryRunner(runtime);\n\n return {\n queryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectQueryQueryOptions<\n typeof runtime,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(\n {\n queryKey: options.queryKey,\n queryFn: options.queryFn,\n },\n {\n runner,\n }\n ),\n infiniteQueryOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n >(\n options: EffectInfiniteQueryOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >\n ) =>\n effectInfiniteQueryOptions<\n typeof runtime,\n TFnResult,\n TFnErrorResult,\n TFnRequirements\n >(options, { runner }),\n mutationOptions: <\n TFnResult,\n TFnErrorResult extends { _tag: string },\n TFnRequirements,\n TVariables,\n >(\n options: EffectQueryMutationOptionsInput<\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >\n ) =>\n effectQueryMutationOptions<\n typeof runtime,\n TFnResult,\n TFnErrorResult,\n TFnRequirements,\n TVariables\n >(options, { runner }),\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "effect-query",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Effect adapter for Tanstack Query",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
22
|
"dist",
|
|
23
|
-
"src",
|
|
24
23
|
"README.md",
|
|
25
24
|
"package.json",
|
|
26
25
|
"!**/*.test.*",
|
|
@@ -32,15 +31,13 @@
|
|
|
32
31
|
"@biomejs/biome": "^2.2.6",
|
|
33
32
|
"@tanstack/react-query": "^5.90.5",
|
|
34
33
|
"effect": "^3.18.4",
|
|
35
|
-
"react": "^19.2.0",
|
|
36
34
|
"tsdown": "^0.15.9",
|
|
37
35
|
"ultracite": "^5.6.4",
|
|
38
36
|
"vitest": "^4.0.1"
|
|
39
37
|
},
|
|
40
38
|
"peerDependencies": {
|
|
41
39
|
"@tanstack/react-query": "^5.90.5",
|
|
42
|
-
"effect": "^3.18.4"
|
|
43
|
-
"react": "^19.2.0"
|
|
40
|
+
"effect": "^3.18.4"
|
|
44
41
|
},
|
|
45
42
|
"scripts": {
|
|
46
43
|
"build": "tsdown",
|
package/src/errors.ts
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { Cause } from "effect";
|
|
2
|
-
|
|
3
|
-
const EffectQueryFailureTag = "EffectQueryFailure" as const;
|
|
4
|
-
const EffectQueryDefectTag = "EffectQueryDefect" as const;
|
|
5
|
-
|
|
6
|
-
type EffectQueryErrorMatcher<
|
|
7
|
-
TFailure extends { _tag: string } | never = never,
|
|
8
|
-
TReturn = unknown,
|
|
9
|
-
> = {
|
|
10
|
-
OrElse: (cause: Cause.Cause<unknown>) => TReturn;
|
|
11
|
-
} & ([TFailure] extends [never]
|
|
12
|
-
? Record<never, never>
|
|
13
|
-
: TFailure extends { _tag: string }
|
|
14
|
-
? {
|
|
15
|
-
[K in TFailure["_tag"]]?: (
|
|
16
|
-
failure: Extract<TFailure, { _tag: K }>
|
|
17
|
-
) => TReturn;
|
|
18
|
-
}
|
|
19
|
-
: Record<never, never>);
|
|
20
|
-
|
|
21
|
-
export class EffectQueryFailure<
|
|
22
|
-
TFailure extends { _tag: string } | never = never,
|
|
23
|
-
> extends Error {
|
|
24
|
-
readonly _tag: typeof EffectQueryFailureTag;
|
|
25
|
-
readonly failure: TFailure;
|
|
26
|
-
readonly failureCause: Cause.Cause<TFailure>;
|
|
27
|
-
constructor(
|
|
28
|
-
message: string,
|
|
29
|
-
failure: TFailure,
|
|
30
|
-
cause: Cause.Cause<TFailure>
|
|
31
|
-
) {
|
|
32
|
-
super(message);
|
|
33
|
-
this._tag = EffectQueryFailureTag;
|
|
34
|
-
this.failure = failure;
|
|
35
|
-
this.failureCause = cause;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
match<TReturn>(
|
|
39
|
-
matcher: EffectQueryErrorMatcher<
|
|
40
|
-
TFailure extends { _tag: string } ? TFailure : never,
|
|
41
|
-
TReturn
|
|
42
|
-
>
|
|
43
|
-
): TReturn {
|
|
44
|
-
if (
|
|
45
|
-
this.failure &&
|
|
46
|
-
typeof this.failure === "object" &&
|
|
47
|
-
"_tag" in this.failure
|
|
48
|
-
) {
|
|
49
|
-
const tag = this.failure._tag;
|
|
50
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic tag matching requires any
|
|
51
|
-
const handler = (matcher as any)[tag];
|
|
52
|
-
if (typeof handler === "function") {
|
|
53
|
-
return handler(this.failure);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return matcher.OrElse(this.failureCause);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class EffectQueryDefect<TDefect> extends Error {
|
|
61
|
-
readonly _tag: typeof EffectQueryDefectTag;
|
|
62
|
-
readonly defectCause: Cause.Cause<TDefect>;
|
|
63
|
-
constructor(message: string, defect: TDefect) {
|
|
64
|
-
super(message);
|
|
65
|
-
this._tag = EffectQueryDefectTag;
|
|
66
|
-
this.defectCause = Cause.die(defect);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
match<TReturn>(
|
|
70
|
-
matcher: EffectQueryErrorMatcher<never, TReturn> & Record<string, unknown>
|
|
71
|
-
): TReturn {
|
|
72
|
-
return matcher.OrElse(this.defectCause);
|
|
73
|
-
}
|
|
74
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { type Layer, ManagedRuntime } from "effect";
|
|
2
|
-
import {
|
|
3
|
-
type EffectInfiniteQueryOptionsInput,
|
|
4
|
-
effectInfiniteQueryOptions,
|
|
5
|
-
} from "./infiniteQueryOptions";
|
|
6
|
-
import {
|
|
7
|
-
type EffectQueryMutationOptionsInput,
|
|
8
|
-
effectQueryMutationOptions,
|
|
9
|
-
} from "./mutationOptions";
|
|
10
|
-
import {
|
|
11
|
-
type EffectQueryOptionsInput,
|
|
12
|
-
effectQueryQueryOptions,
|
|
13
|
-
} from "./queryOptions";
|
|
14
|
-
import { EffectQueryRunner } from "./runner";
|
|
15
|
-
|
|
16
|
-
export function createEffectQuery<Input>(
|
|
17
|
-
layer: Layer.Layer<Input, never, never>
|
|
18
|
-
) {
|
|
19
|
-
const runtime = ManagedRuntime.make(layer);
|
|
20
|
-
const runner = new EffectQueryRunner(runtime);
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
queryOptions: <
|
|
24
|
-
TFnResult,
|
|
25
|
-
TFnErrorResult extends { _tag: string },
|
|
26
|
-
TFnRequirements,
|
|
27
|
-
>(
|
|
28
|
-
options: EffectQueryOptionsInput<
|
|
29
|
-
TFnResult,
|
|
30
|
-
TFnErrorResult,
|
|
31
|
-
TFnRequirements
|
|
32
|
-
>
|
|
33
|
-
) =>
|
|
34
|
-
effectQueryQueryOptions<
|
|
35
|
-
Input,
|
|
36
|
-
TFnResult,
|
|
37
|
-
TFnErrorResult,
|
|
38
|
-
TFnRequirements
|
|
39
|
-
>(
|
|
40
|
-
{
|
|
41
|
-
queryKey: options.queryKey,
|
|
42
|
-
queryFn: options.queryFn,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
runner,
|
|
46
|
-
}
|
|
47
|
-
),
|
|
48
|
-
infiniteQueryOptions: <
|
|
49
|
-
TFnResult,
|
|
50
|
-
TFnErrorResult extends { _tag: string },
|
|
51
|
-
TFnRequirements,
|
|
52
|
-
>(
|
|
53
|
-
options: EffectInfiniteQueryOptionsInput<
|
|
54
|
-
TFnResult,
|
|
55
|
-
TFnErrorResult,
|
|
56
|
-
TFnRequirements
|
|
57
|
-
>
|
|
58
|
-
) =>
|
|
59
|
-
effectInfiniteQueryOptions<
|
|
60
|
-
Input,
|
|
61
|
-
TFnResult,
|
|
62
|
-
TFnErrorResult,
|
|
63
|
-
TFnRequirements
|
|
64
|
-
>(options, { runner }),
|
|
65
|
-
mutationOptions: <
|
|
66
|
-
TFnResult,
|
|
67
|
-
TFnErrorResult extends { _tag: string },
|
|
68
|
-
TFnRequirements,
|
|
69
|
-
TVariables,
|
|
70
|
-
>(
|
|
71
|
-
options: EffectQueryMutationOptionsInput<
|
|
72
|
-
TFnResult,
|
|
73
|
-
TFnErrorResult,
|
|
74
|
-
TFnRequirements,
|
|
75
|
-
TVariables
|
|
76
|
-
>
|
|
77
|
-
) =>
|
|
78
|
-
effectQueryMutationOptions<
|
|
79
|
-
Input,
|
|
80
|
-
TFnResult,
|
|
81
|
-
TFnErrorResult,
|
|
82
|
-
TFnRequirements,
|
|
83
|
-
TVariables
|
|
84
|
-
>(options, { runner }),
|
|
85
|
-
};
|
|
86
|
-
}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DefinedInitialDataInfiniteOptions,
|
|
3
|
-
type InfiniteData,
|
|
4
|
-
infiniteQueryOptions,
|
|
5
|
-
type QueryFunctionContext,
|
|
6
|
-
type SkipToken,
|
|
7
|
-
type UndefinedInitialDataInfiniteOptions,
|
|
8
|
-
type UnusedSkipTokenInfiniteOptions,
|
|
9
|
-
type UseInfiniteQueryOptions,
|
|
10
|
-
} from "@tanstack/react-query";
|
|
11
|
-
import { Cause, type Effect, Exit } from "effect";
|
|
12
|
-
import { EffectQueryDefect, EffectQueryFailure } from "./errors";
|
|
13
|
-
import type { EffectQueryRunner } from "./runner";
|
|
14
|
-
import type { EffectQueryQueryKey } from "./types";
|
|
15
|
-
|
|
16
|
-
type EffectInfiniteQueryQueryFn<
|
|
17
|
-
TFnResult,
|
|
18
|
-
TFnErrorResult,
|
|
19
|
-
TFnRequirements,
|
|
20
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
21
|
-
TPageParam = never,
|
|
22
|
-
> = (
|
|
23
|
-
context: QueryFunctionContext<TQueryKey, TPageParam>
|
|
24
|
-
) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
|
|
25
|
-
|
|
26
|
-
type EffectInfiniteQueryUndefinedInitialDataOptions<
|
|
27
|
-
TQueryFnData,
|
|
28
|
-
TError,
|
|
29
|
-
TData = InfiniteData<TQueryFnData, unknown>,
|
|
30
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
31
|
-
> = UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
32
|
-
|
|
33
|
-
type EffectInfiniteQueryUnusedSkipTokenOptions<
|
|
34
|
-
TQueryFnData,
|
|
35
|
-
TError,
|
|
36
|
-
TData = InfiniteData<TQueryFnData, unknown>,
|
|
37
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
38
|
-
> = UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
39
|
-
|
|
40
|
-
type EffectInfiniteQueryDefinedInitialDataOptions<
|
|
41
|
-
TQueryFnData,
|
|
42
|
-
TError,
|
|
43
|
-
TData = InfiniteData<TQueryFnData, unknown>,
|
|
44
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
45
|
-
> = DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
46
|
-
|
|
47
|
-
export type EffectInfiniteQueryOptionsInput<
|
|
48
|
-
TFnResult,
|
|
49
|
-
TFnErrorResult,
|
|
50
|
-
TFnRequirements,
|
|
51
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
52
|
-
> = Omit<
|
|
53
|
-
| EffectInfiniteQueryUndefinedInitialDataOptions<
|
|
54
|
-
TFnResult,
|
|
55
|
-
TFnErrorResult,
|
|
56
|
-
TFnResult,
|
|
57
|
-
TQueryKey
|
|
58
|
-
>
|
|
59
|
-
| EffectInfiniteQueryDefinedInitialDataOptions<
|
|
60
|
-
TFnResult,
|
|
61
|
-
TFnErrorResult,
|
|
62
|
-
TFnResult,
|
|
63
|
-
TQueryKey
|
|
64
|
-
>
|
|
65
|
-
| EffectInfiniteQueryUnusedSkipTokenOptions<
|
|
66
|
-
TFnResult,
|
|
67
|
-
TFnErrorResult,
|
|
68
|
-
TFnResult,
|
|
69
|
-
TQueryKey
|
|
70
|
-
>,
|
|
71
|
-
"queryFn" | "queryKey"
|
|
72
|
-
> & {
|
|
73
|
-
queryKey: EffectQueryQueryKey;
|
|
74
|
-
queryFn: EffectInfiniteQueryQueryFn<
|
|
75
|
-
TFnResult,
|
|
76
|
-
TFnErrorResult,
|
|
77
|
-
TFnRequirements,
|
|
78
|
-
EffectQueryQueryKey
|
|
79
|
-
>;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* @internal
|
|
84
|
-
*/
|
|
85
|
-
export function effectInfiniteQueryOptions<
|
|
86
|
-
TRuntimeInput,
|
|
87
|
-
TFnResult,
|
|
88
|
-
TFnErrorResult extends { _tag: string },
|
|
89
|
-
TFnRequirements,
|
|
90
|
-
>(
|
|
91
|
-
inputOptions: EffectInfiniteQueryOptionsInput<
|
|
92
|
-
TFnResult,
|
|
93
|
-
TFnErrorResult,
|
|
94
|
-
TFnRequirements
|
|
95
|
-
>,
|
|
96
|
-
context: {
|
|
97
|
-
runner: EffectQueryRunner<TRuntimeInput>;
|
|
98
|
-
signal?: AbortSignal;
|
|
99
|
-
}
|
|
100
|
-
) {
|
|
101
|
-
const [spanName] = inputOptions.queryKey;
|
|
102
|
-
|
|
103
|
-
const queryFn: Exclude<
|
|
104
|
-
UseInfiniteQueryOptions<
|
|
105
|
-
TFnResult,
|
|
106
|
-
TFnErrorResult,
|
|
107
|
-
InfiniteData<TFnResult, unknown>,
|
|
108
|
-
EffectQueryQueryKey,
|
|
109
|
-
unknown
|
|
110
|
-
>["queryFn"],
|
|
111
|
-
SkipToken | undefined
|
|
112
|
-
> = async (queryFnContext) => {
|
|
113
|
-
const effect = inputOptions.queryFn(queryFnContext);
|
|
114
|
-
const result = await context.runner.run(effect, spanName, {
|
|
115
|
-
signal: context.signal,
|
|
116
|
-
});
|
|
117
|
-
return Exit.match(result, {
|
|
118
|
-
onSuccess: (value) => value,
|
|
119
|
-
onFailure: (cause) => {
|
|
120
|
-
if (cause._tag === "Fail") {
|
|
121
|
-
const failure = cause.error;
|
|
122
|
-
throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
|
|
123
|
-
}
|
|
124
|
-
throw new EffectQueryDefect(Cause.pretty(cause), cause);
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
// The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.
|
|
130
|
-
return infiniteQueryOptions({
|
|
131
|
-
...inputOptions,
|
|
132
|
-
queryKey: inputOptions.queryKey as EffectQueryQueryKey,
|
|
133
|
-
queryFn,
|
|
134
|
-
}) as UseInfiniteQueryOptions<
|
|
135
|
-
TFnResult,
|
|
136
|
-
[TFnErrorResult] extends [never]
|
|
137
|
-
? EffectQueryDefect<unknown>
|
|
138
|
-
: EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
|
|
139
|
-
TFnResult,
|
|
140
|
-
EffectQueryQueryKey
|
|
141
|
-
>;
|
|
142
|
-
}
|
package/src/mutationOptions.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type MutationFunction,
|
|
3
|
-
mutationOptions,
|
|
4
|
-
type skipToken,
|
|
5
|
-
type UseMutationOptions,
|
|
6
|
-
} from "@tanstack/react-query";
|
|
7
|
-
import { Cause, type Effect, Exit } from "effect";
|
|
8
|
-
import { EffectQueryDefect, EffectQueryFailure } from "./errors";
|
|
9
|
-
import type { EffectQueryRunner } from "./runner";
|
|
10
|
-
|
|
11
|
-
type EffectfulMutationFunction<
|
|
12
|
-
TFnResult,
|
|
13
|
-
TFnErrorResult,
|
|
14
|
-
TFnRequirements,
|
|
15
|
-
TVariables,
|
|
16
|
-
> = (
|
|
17
|
-
variables: TVariables
|
|
18
|
-
) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
|
|
19
|
-
|
|
20
|
-
export type EffectQueryMutationOptionsInput<
|
|
21
|
-
TFnResult,
|
|
22
|
-
TFnErrorResult,
|
|
23
|
-
TFnRequirements,
|
|
24
|
-
TVariables,
|
|
25
|
-
> = Omit<
|
|
26
|
-
UseMutationOptions<TFnResult, TFnErrorResult, TVariables>,
|
|
27
|
-
"mutationKey" | "mutationFn"
|
|
28
|
-
> & {
|
|
29
|
-
mutationKey: string;
|
|
30
|
-
mutationFn:
|
|
31
|
-
| EffectfulMutationFunction<
|
|
32
|
-
TFnResult,
|
|
33
|
-
TFnErrorResult,
|
|
34
|
-
TFnRequirements,
|
|
35
|
-
TVariables
|
|
36
|
-
>
|
|
37
|
-
| typeof skipToken;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* @internal
|
|
42
|
-
*/
|
|
43
|
-
export function effectQueryMutationOptions<
|
|
44
|
-
TRuntimeInput,
|
|
45
|
-
TFnResult,
|
|
46
|
-
TFnErrorResult extends { _tag: string },
|
|
47
|
-
TFnRequirements,
|
|
48
|
-
TVariables,
|
|
49
|
-
>(
|
|
50
|
-
inputOptions: EffectQueryMutationOptionsInput<
|
|
51
|
-
TFnResult,
|
|
52
|
-
TFnErrorResult,
|
|
53
|
-
TFnRequirements,
|
|
54
|
-
TVariables
|
|
55
|
-
>,
|
|
56
|
-
context: {
|
|
57
|
-
runner: EffectQueryRunner<TRuntimeInput>;
|
|
58
|
-
}
|
|
59
|
-
) {
|
|
60
|
-
const spanName = inputOptions.mutationKey;
|
|
61
|
-
const mutationFn: MutationFunction<TFnResult, TVariables> = async (
|
|
62
|
-
variables: TVariables
|
|
63
|
-
) => {
|
|
64
|
-
const effect = (
|
|
65
|
-
inputOptions.mutationFn as EffectfulMutationFunction<
|
|
66
|
-
TFnResult,
|
|
67
|
-
TFnErrorResult,
|
|
68
|
-
TFnRequirements,
|
|
69
|
-
TVariables
|
|
70
|
-
>
|
|
71
|
-
)(variables);
|
|
72
|
-
const result = await context.runner.run(effect, spanName);
|
|
73
|
-
return Exit.match(result, {
|
|
74
|
-
onSuccess: (value) => value,
|
|
75
|
-
onFailure: (cause) => {
|
|
76
|
-
if (cause._tag === "Fail") {
|
|
77
|
-
const failure = cause.error;
|
|
78
|
-
throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
|
|
79
|
-
}
|
|
80
|
-
throw new EffectQueryDefect(Cause.pretty(cause), cause);
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
return mutationOptions({
|
|
86
|
-
...inputOptions,
|
|
87
|
-
mutationFn,
|
|
88
|
-
}) as UseMutationOptions<
|
|
89
|
-
TFnResult,
|
|
90
|
-
[TFnErrorResult] extends [never]
|
|
91
|
-
? never
|
|
92
|
-
: EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
|
|
93
|
-
TVariables
|
|
94
|
-
>;
|
|
95
|
-
}
|
package/src/queryOptions.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DefinedInitialDataOptions,
|
|
3
|
-
type QueryFunction,
|
|
4
|
-
type QueryFunctionContext,
|
|
5
|
-
queryOptions,
|
|
6
|
-
type UndefinedInitialDataOptions,
|
|
7
|
-
type UnusedSkipTokenOptions,
|
|
8
|
-
type UseQueryOptions,
|
|
9
|
-
} from "@tanstack/react-query";
|
|
10
|
-
import { Cause, type Effect, Exit } from "effect";
|
|
11
|
-
import { EffectQueryDefect, EffectQueryFailure } from "./errors";
|
|
12
|
-
import type { EffectQueryRunner } from "./runner";
|
|
13
|
-
import type { EffectQueryQueryKey } from "./types";
|
|
14
|
-
|
|
15
|
-
type EffectQueryQueryFn<
|
|
16
|
-
TFnResult,
|
|
17
|
-
TFnErrorResult,
|
|
18
|
-
TFnRequirements,
|
|
19
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
20
|
-
TPageParam = never,
|
|
21
|
-
> = (
|
|
22
|
-
context: QueryFunctionContext<TQueryKey, TPageParam>
|
|
23
|
-
) => Effect.Effect<TFnResult, TFnErrorResult, TFnRequirements>;
|
|
24
|
-
|
|
25
|
-
type EffectQueryUndefinedInitialDataOptions<
|
|
26
|
-
TQueryFnData,
|
|
27
|
-
TError,
|
|
28
|
-
TData = TQueryFnData,
|
|
29
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
30
|
-
> = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
31
|
-
|
|
32
|
-
type EffectQueryUnusedSkipTokenOptions<
|
|
33
|
-
TQueryFnData,
|
|
34
|
-
TError,
|
|
35
|
-
TData = TQueryFnData,
|
|
36
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
37
|
-
> = UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
38
|
-
|
|
39
|
-
type EffectQueryDefinedInitialDataOptions<
|
|
40
|
-
TQueryFnData,
|
|
41
|
-
TError,
|
|
42
|
-
TData = TQueryFnData,
|
|
43
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
44
|
-
> = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>;
|
|
45
|
-
|
|
46
|
-
export type EffectQueryOptionsInput<
|
|
47
|
-
TFnResult,
|
|
48
|
-
TFnErrorResult,
|
|
49
|
-
TFnRequirements,
|
|
50
|
-
TQueryKey extends EffectQueryQueryKey = EffectQueryQueryKey,
|
|
51
|
-
> = Omit<
|
|
52
|
-
| EffectQueryUndefinedInitialDataOptions<
|
|
53
|
-
TFnResult,
|
|
54
|
-
TFnErrorResult,
|
|
55
|
-
TFnResult,
|
|
56
|
-
TQueryKey
|
|
57
|
-
>
|
|
58
|
-
| EffectQueryDefinedInitialDataOptions<
|
|
59
|
-
TFnResult,
|
|
60
|
-
TFnErrorResult,
|
|
61
|
-
TFnResult,
|
|
62
|
-
TQueryKey
|
|
63
|
-
>
|
|
64
|
-
| EffectQueryUnusedSkipTokenOptions<
|
|
65
|
-
TFnResult,
|
|
66
|
-
TFnErrorResult,
|
|
67
|
-
TFnResult,
|
|
68
|
-
TQueryKey
|
|
69
|
-
>,
|
|
70
|
-
"queryFn" | "queryKey"
|
|
71
|
-
> & {
|
|
72
|
-
queryKey: EffectQueryQueryKey;
|
|
73
|
-
queryFn: EffectQueryQueryFn<
|
|
74
|
-
TFnResult,
|
|
75
|
-
TFnErrorResult,
|
|
76
|
-
TFnRequirements,
|
|
77
|
-
EffectQueryQueryKey
|
|
78
|
-
>;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* @internal
|
|
83
|
-
*/
|
|
84
|
-
export function effectQueryQueryOptions<
|
|
85
|
-
TRuntimeInput,
|
|
86
|
-
TFnResult,
|
|
87
|
-
TFnErrorResult extends { _tag: string },
|
|
88
|
-
TFnRequirements,
|
|
89
|
-
>(
|
|
90
|
-
inputOptions: EffectQueryOptionsInput<
|
|
91
|
-
TFnResult,
|
|
92
|
-
TFnErrorResult,
|
|
93
|
-
TFnRequirements
|
|
94
|
-
>,
|
|
95
|
-
context: {
|
|
96
|
-
runner: EffectQueryRunner<TRuntimeInput>;
|
|
97
|
-
signal?: AbortSignal;
|
|
98
|
-
}
|
|
99
|
-
) {
|
|
100
|
-
const [spanName] = inputOptions.queryKey;
|
|
101
|
-
|
|
102
|
-
const queryFn: QueryFunction<TFnResult, EffectQueryQueryKey> = async (
|
|
103
|
-
queryFnContext
|
|
104
|
-
) => {
|
|
105
|
-
const effect = inputOptions.queryFn(queryFnContext);
|
|
106
|
-
const result = await context.runner.run(effect, spanName, {
|
|
107
|
-
signal: context.signal,
|
|
108
|
-
});
|
|
109
|
-
return Exit.match(result, {
|
|
110
|
-
onSuccess: (value) => value,
|
|
111
|
-
onFailure: (cause) => {
|
|
112
|
-
if (cause._tag === "Fail") {
|
|
113
|
-
const failure = cause.error;
|
|
114
|
-
throw new EffectQueryFailure(Cause.pretty(cause), failure, cause);
|
|
115
|
-
}
|
|
116
|
-
throw new EffectQueryDefect(Cause.pretty(cause), cause);
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// The as UseQueryOptions is a workaround to set the correct error type. React Query has no way to infer the error type from the Effect.
|
|
122
|
-
return queryOptions({
|
|
123
|
-
...inputOptions,
|
|
124
|
-
queryKey: inputOptions.queryKey,
|
|
125
|
-
queryFn,
|
|
126
|
-
}) as UseQueryOptions<
|
|
127
|
-
TFnResult,
|
|
128
|
-
[TFnErrorResult] extends [never]
|
|
129
|
-
? EffectQueryDefect<unknown>
|
|
130
|
-
: EffectQueryFailure<TFnErrorResult> | EffectQueryDefect<unknown>,
|
|
131
|
-
TFnResult,
|
|
132
|
-
EffectQueryQueryKey
|
|
133
|
-
>;
|
|
134
|
-
}
|
package/src/runner.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Effect, type Exit, type Scope } from "effect";
|
|
2
|
-
import type { ManagedRuntime } from "effect/ManagedRuntime";
|
|
3
|
-
|
|
4
|
-
export class EffectQueryRunner<TRuntimeInput> {
|
|
5
|
-
readonly runtime: ManagedRuntime<TRuntimeInput, never>;
|
|
6
|
-
constructor(runtime: ManagedRuntime<TRuntimeInput, never>) {
|
|
7
|
-
this.runtime = runtime;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async run<TResult, TError, TRequirements>(
|
|
11
|
-
effect: Effect.Effect<TResult, TError, TRequirements>,
|
|
12
|
-
span: string,
|
|
13
|
-
options: { signal?: AbortSignal } = {}
|
|
14
|
-
): Promise<Exit.Exit<TResult, TError>> {
|
|
15
|
-
// This is a workaround to allow the effect to run without a scope (it will be provided by the caller)
|
|
16
|
-
const effectToRun = effect as Effect.Effect<
|
|
17
|
-
TResult,
|
|
18
|
-
TError,
|
|
19
|
-
TRuntimeInput | Scope.Scope
|
|
20
|
-
>;
|
|
21
|
-
return await this.runtime.runPromiseExit(
|
|
22
|
-
effectToRun.pipe(
|
|
23
|
-
Effect.withSpan(span),
|
|
24
|
-
Effect.scoped,
|
|
25
|
-
Effect.tapErrorCause(Effect.logError)
|
|
26
|
-
),
|
|
27
|
-
{
|
|
28
|
-
signal: options.signal,
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
}
|