@zenstackhq/swr 2.15.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/generator.js CHANGED
@@ -16,10 +16,9 @@ exports.generate = generate;
16
16
  const sdk_1 = require("@zenstackhq/sdk");
17
17
  const ast_1 = require("@zenstackhq/sdk/ast");
18
18
  const prisma_1 = require("@zenstackhq/sdk/prisma");
19
- const change_case_1 = require("change-case");
19
+ const local_helpers_1 = require("@zenstackhq/runtime/local-helpers");
20
20
  const path_1 = __importDefault(require("path"));
21
21
  const ts_pattern_1 = require("ts-pattern");
22
- const upper_case_first_1 = require("upper-case-first");
23
22
  const _1 = require(".");
24
23
  function generate(model, options, dmmf) {
25
24
  return __awaiter(this, void 0, void 0, function* () {
@@ -48,7 +47,7 @@ function generate(model, options, dmmf) {
48
47
  });
49
48
  }
50
49
  function generateModelHooks(project, outDir, model, mapping, options) {
51
- const fileName = (0, change_case_1.paramCase)(model.name);
50
+ const fileName = (0, local_helpers_1.paramCase)(model.name);
52
51
  const sf = project.createSourceFile(path_1.default.join(outDir, `${fileName}.ts`), undefined, { overwrite: true });
53
52
  const prismaImport = (0, prisma_1.getPrismaClientImportSpec)(outDir, options);
54
53
  sf.addImportDeclaration({
@@ -62,7 +61,7 @@ function generateModelHooks(project, outDir, model, mapping, options) {
62
61
  `import metadata from './__model_meta';`,
63
62
  `import * as request from '@zenstackhq/swr/runtime';`,
64
63
  ]);
65
- const modelNameCap = (0, upper_case_first_1.upperCaseFirst)(model.name);
64
+ const modelNameCap = (0, local_helpers_1.upperCaseFirst)(model.name);
66
65
  const mutationFuncs = [];
67
66
  // Note: delegate models don't support create and upsert operations
68
67
  // create is somehow named "createOne" in the DMMF
@@ -226,7 +225,7 @@ function makeOptimistic(returnType) {
226
225
  }
227
226
  function generateIndex(project, outDir, models) {
228
227
  const sf = project.createSourceFile(path_1.default.join(outDir, 'index.ts'), undefined, { overwrite: true });
229
- sf.addStatements(models.map((d) => `export * from './${(0, change_case_1.paramCase)(d.name)}';`));
228
+ sf.addStatements(models.map((d) => `export * from './${(0, local_helpers_1.paramCase)(d.name)}';`));
230
229
  sf.addStatements(`export { Provider } from '@zenstackhq/swr/runtime';`);
231
230
  sf.addStatements(`export { default as metadata } from './__model_meta';`);
232
231
  }
@@ -253,7 +252,7 @@ function generateQueryHook(sf, model, operation, argsType, inputType, returnType
253
252
  type: infinite ? `InfiniteQueryOptions<${returnType}>` : `QueryOptions<${returnType}>`,
254
253
  });
255
254
  sf.addFunction({
256
- name: `use${infinite ? 'Infinite' : ''}${(0, upper_case_first_1.upperCaseFirst)(operation)}${model.name}`,
255
+ name: `use${infinite ? 'Infinite' : ''}${(0, local_helpers_1.upperCaseFirst)(operation)}${model.name}`,
257
256
  typeParameters: typeParams,
258
257
  isExported: true,
259
258
  parameters,
@@ -274,7 +273,7 @@ function generateMutation(sf, model, method, operation, argsType, batchResult) {
274
273
  const funcName = `${operation}${model.name}`;
275
274
  // generate mutation hook
276
275
  sf.addFunction({
277
- name: `use${(0, upper_case_first_1.upperCaseFirst)(operation)}${model.name}`,
276
+ name: `use${(0, local_helpers_1.upperCaseFirst)(operation)}${model.name}`,
278
277
  isExported: true,
279
278
  parameters: [
280
279
  {
package/generator.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAqBA,4BA6BC;AAlDD,yCAWyB;AACzB,6CAA8F;AAC9F,mDAAiG;AACjG,6CAAwC;AACxC,gDAAwB;AAExB,2CAAsC;AACtC,uDAAkD;AAClD,wBAAyB;AAEzB,SAAsB,QAAQ,CAAC,KAAY,EAAE,OAAsB,EAAE,IAAmB;;QACpF,IAAI,MAAM,GAAG,IAAA,mBAAa,EAAS,OAAO,EAAE,QAAQ,EAAE,OAAI,CAAC,CAAC;QAC5D,MAAM,GAAG,IAAA,iBAAW,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,IAAA,oBAAc,EAAC,MAAM,CAAC,CAAC;QAEvB,MAAM,OAAO,GAAG,IAAA,mBAAa,GAAE,CAAC;QAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAA,mBAAa,EAAC,KAAK,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,eAAS,CAAC,CAAC;QAEtD,MAAM,IAAA,uBAAiB,EAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;YAC/C,MAAM,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC;YAC5C,kBAAkB,EAAE,KAAK;SAC5B,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEvC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;YACxF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,oCAAoC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpE,OAAO;YACX,CAAC;YACD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,MAAM,IAAA,iBAAW,EAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACxB,CAAC;CAAA;AAED,SAAS,kBAAkB,CACvB,OAAgB,EAChB,MAAc,EACd,KAAgB,EAChB,OAA0B,EAC1B,OAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAA,uBAAS,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzG,MAAM,YAAY,GAAG,IAAA,kCAAyB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,EAAE,CAAC,oBAAoB,CAAC;QACpB,YAAY,EAAE,CAAC,QAAQ,CAAC;QACxB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,YAAY;KAChC,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC;QACb,sJAAsJ;QACtJ,wCAAwC,qBAAe,GAAG;QAC1D,wCAAwC;QACxC,qDAAqD;KACxD,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,IAAA,iCAAc,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,mEAAmE;IAEnE,kDAAkD;IAClD,8DAA8D;IAC9D,IAAI,CAAC,IAAA,qBAAe,EAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAK,OAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,YAAY,CAAC;QAClD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,aAAa;IACb,IAAI,CAAC,IAAA,qBAAe,EAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,IAAA,0BAAiB,EAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,gBAAgB,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,WAAW;IACX,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,cAAc,CAAC;QACpD,MAAM,SAAS,GAAG,0BAA0B,QAAQ,GAAG,CAAC;QACxD,MAAM,aAAa,GAAG,UAAU,KAAK,CAAC,IAAI,eAAe,CAAC;QAC1D,MAAM,UAAU,GAAG,SAAS,aAAa,GAAG,CAAC;QAC7C,MAAM,gBAAgB,GAAG,SAAS,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC;QAEnE,mBAAmB;QACnB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAElG,oBAAoB;QACpB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/F,CAAC;IAED,aAAa;IACb,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,gBAAgB,CAAC;QACtD,MAAM,SAAS,GAAG,0BAA0B,QAAQ,GAAG,CAAC;QACxD,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC;QACvE,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClG,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,eAAe,CAAC;QACrD,MAAM,SAAS,GAAG,0BAA0B,QAAQ,GAAG,CAAC;QACxD,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC;QACvE,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IAED,SAAS;IACT,kDAAkD;IAClD,8DAA8D;IAC9D,IAAI,OAAO,CAAC,MAAM,IAAK,OAAe,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,YAAY,CAAC;QAClD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,aAAa;IACb,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,gBAAgB,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,SAAS;IACT,kDAAkD;IAClD,8DAA8D;IAC9D,IAAI,CAAC,IAAA,qBAAe,EAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAK,OAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,YAAY,CAAC;QAClD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,MAAM;IACN,kDAAkD;IAClD,8DAA8D;IAC9D,IAAI,OAAO,CAAC,MAAM,IAAK,OAAe,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,YAAY,CAAC;QAClD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,aAAa;IACb,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,gBAAgB,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,UAAU,YAAY,eAAe,CAAC;QACvD,MAAM,SAAS,GAAG,oBAAoB,QAAQ,GAAG,CAAC;QAClD,MAAM,UAAU,GAAG,aAAa,YAAY,kBAAkB,CAAC;QAC/D,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,UAAU;IACV,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,MAAM,cAAc,GAAG;YACnB,oBAAoB,OAAO,aAAa;YACxC,mHAAmH;YACnH,8EAA8E,OAAO,gDAAgD,OAAO,2BAA2B;YACvK,uGAAuG;YACvG,oDAAoD;YACpD,mDAAmD;YACnD,0DAA0D;YAC1D,wDAAwD;YACxD,sEAAsE;YACtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAyCmB;SACtB,CAAC;QACF,MAAM,SAAS,GAAG,uCAAuC,OAAO,wCAAwC,CAAC;QACzG,MAAM,UAAU,GAAG;sCACW,YAAY;;+CAEH,YAAY;;;sDAGL,YAAY;oDACd,YAAY;;wBAExC,CAAC;QACjB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IACvF,CAAC;IAED,oFAAoF;IACpF,CAAC;QACG,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,IAAI,WAAW,CAAC;QACjD,MAAM,SAAS,GAAG,oBAAoB,QAAQ,GAAG,CAAC;QAClD,MAAM,UAAU,GAAG,6GAA6G,YAAY,oCAAoC,CAAC;QACjL,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED,2DAA2D;IAC3D,CAAC;QACG,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACtC,OAAO,GAAG,UAAU,8BAA8B,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,MAAc,EAAE,MAAmB;IACxE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,IAAA,uBAAS,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,EAAE,CAAC,aAAa,CAAC,qDAAqD,CAAC,CAAC;IACxE,EAAE,CAAC,aAAa,CAAC,uDAAuD,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CACtB,EAAc,EACd,KAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,SAAiB,EACjB,UAAkB,EAClB,cAAyB,EACzB,QAAQ,GAAG,KAAK;IAEhB,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACpF,IAAI,QAAQ,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAkD,EAAE,CAAC;IACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;SAClB,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,eAAe,SAAS,kBAAkB;SACnD,CAAC,CAAC;IACP,CAAC;IACD,UAAU,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB,UAAU,GAAG,CAAC,CAAC,CAAC,gBAAgB,UAAU,GAAG;KACzF,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,CAAC;QACX,IAAI,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAA,iCAAc,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;QACjF,cAAc,EAAE,UAAU;QAC1B,UAAU,EAAE,IAAI;QAChB,UAAU;KACb,CAAC;SACG,OAAO,EAAE;SACT,aAAa,CAAC;QACX,CAAC,QAAQ;YACL,CAAC,CAAC,iCAAiC,KAAK,CAAC,IAAI,OAAO,SAAS,oBAAoB;YACjF,CAAC,CAAC,yCAAyC,KAAK,CAAC,IAAI,OAAO,SAAS,2BAA2B;KACvG,CAAC,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CACrB,EAAc,EACd,KAAgB,EAChB,MAA2C,EAC3C,SAAiB,EACjB,QAAgB,EAChB,WAAoB;IAEpB,qDAAqD;IACrD,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC;IACnC,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,2BAA2B,CAAC;IAChH,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,cAAc,QAAQ,eAAe,CAAC;IACnH,MAAM,gBAAgB,GAAG,0BAA0B,QAAQ,GAAG,CAAC;IAE/D,MAAM,QAAQ,GAAG,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7C,yBAAyB;IACzB,EAAE,CAAC,WAAW,CAAC;QACX,IAAI,EAAE,MAAM,IAAA,iCAAc,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;QACpD,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR;gBACI,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,mBAAmB,UAAU,cAAc,QAAQ,GAAG;aAC/D;SACJ;KACJ,CAAC;SACG,OAAO,EAAE;SACT,aAAa,CAAC;QACX,8CAA8C,KAAK,CAAC,IAAI,OAAO,MAAM,OAAO,SAAS,yBAAyB,aAAa,IAAI;QAC/H;;sCAE0B,QAAQ,WAAW,gBAAgB;+EACM,iBAAiB;;eAEjF;KACN,CAAC,CAAC;IAEP,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAc,EAAE,KAAgB,EAAE,YAAoB;IAC7E,MAAM,aAAa,GAAG,CAAC,IAAwB,EAAE,EAAE;QAC/C,OAAO,IAAA,kBAAK,EAAC,IAAI,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,cAAC,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;aAC9C,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;aAC9B,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;aAChC,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,YAAY,GAA0C,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,gDAAgD;IAChD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;;QACvB,IAAI,IAAA,YAAM,EAAC,MAAA,CAAC,CAAC,IAAI,CAAC,SAAS,0CAAE,GAAG,CAAC,EAAE,CAAC;YAChC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACb,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACzB,eAAe;QACf,EAAE,CAAC,aAAa,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhG,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC;QACxB,IAAI,EAAE,WAAW,KAAK,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wCAAwC,SAAS,KAAK,EAAE;YAC9E,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE;SACtD;KACJ,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,CAAC,iCAAiC,KAAK,CAAC,IAAI,6BAA6B,CAAC,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zenstackhq/swr",
3
3
  "displayName": "ZenStack plugin for generating SWR hooks",
4
- "version": "2.15.0",
4
+ "version": "2.16.0",
5
5
  "description": "ZenStack plugin for generating SWR hooks",
6
6
  "main": "index.js",
7
7
  "repository": {
@@ -30,15 +30,12 @@
30
30
  }
31
31
  },
32
32
  "dependencies": {
33
- "change-case": "^4.1.2",
34
33
  "cross-fetch": "^4.0.0",
35
- "lower-case-first": "^2.0.2",
36
34
  "semver": "^7.5.2",
37
35
  "ts-morph": "^16.0.0",
38
36
  "ts-pattern": "^4.3.0",
39
- "upper-case-first": "^2.0.2",
40
- "@zenstackhq/runtime": "2.15.0",
41
- "@zenstackhq/sdk": "2.15.0"
37
+ "@zenstackhq/sdk": "2.16.0",
38
+ "@zenstackhq/runtime": "2.16.0"
42
39
  },
43
40
  "peerDependencies": {
44
41
  "swr": "2.2.5 - 2"
@@ -51,7 +48,7 @@
51
48
  "@types/tmp": "^0.2.3",
52
49
  "nock": "^13.3.6",
53
50
  "react": "18.2.0",
54
- "@zenstackhq/testtools": "2.15.0"
51
+ "@zenstackhq/testtools": "2.16.0"
55
52
  },
56
53
  "scripts": {
57
54
  "clean": "rimraf dist",
package/runtime/index.js CHANGED
@@ -93,7 +93,7 @@ __export(runtime_exports, {
93
93
  module.exports = __toCommonJS(runtime_exports);
94
94
  var import_browser = require("@zenstackhq/runtime/browser");
95
95
  var import_cross = require("@zenstackhq/runtime/cross");
96
- var import_lower_case_first = require("lower-case-first");
96
+ var import_local_helpers = require("@zenstackhq/runtime/local-helpers");
97
97
  var import_react = require("react");
98
98
  var import_swr = __toESM(require("swr"));
99
99
  var import_infinite = __toESM(require("swr/infinite"));
@@ -137,7 +137,7 @@ function parseQueryKey(key) {
137
137
  function useModelQuery(model, operation, args, options) {
138
138
  const { endpoint, fetch: fetch2 } = useHooksContext();
139
139
  const key = (options == null ? void 0 : options.disabled) ? null : getQueryKey(model, operation, args, false, (options == null ? void 0 : options.optimisticUpdate) !== false);
140
- const url = makeUrl(`${endpoint}/${(0, import_lower_case_first.lowerCaseFirst)(model)}/${operation}`, args);
140
+ const url = makeUrl(`${endpoint}/${(0, import_local_helpers.lowerCaseFirst)(model)}/${operation}`, args);
141
141
  return (0, import_swr.default)(key, () => fetcher(url, void 0, fetch2, false), options);
142
142
  }
143
143
  function useInfiniteModelQuery(model, operation, getNextArgs, options) {
@@ -155,7 +155,7 @@ function useInfiniteModelQuery(model, operation, getNextArgs, options) {
155
155
  const parsedKey = parseQueryKey(key);
156
156
  if (parsedKey) {
157
157
  const { model: model2, operation: operation2, args } = parsedKey;
158
- const url = makeUrl(`${endpoint}/${(0, import_lower_case_first.lowerCaseFirst)(model2)}/${operation2}`, args);
158
+ const url = makeUrl(`${endpoint}/${(0, import_local_helpers.lowerCaseFirst)(model2)}/${operation2}`, args);
159
159
  return fetcher(url, void 0, fetch2, false);
160
160
  } else {
161
161
  throw new Error("Invalid query key: " + key);
@@ -174,7 +174,7 @@ function useModelMutation(model, method, operation, modelMeta, options, checkRea
174
174
  if (options == null ? void 0 : options.optimisticUpdate) {
175
175
  optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);
176
176
  }
177
- const url = `${endpoint}/${(0, import_lower_case_first.lowerCaseFirst)(model)}/${operation}`;
177
+ const url = `${endpoint}/${(0, import_local_helpers.lowerCaseFirst)(model)}/${operation}`;
178
178
  return mutationRequest(method, url, arg, invalidate, fetch2, checkReadBack);
179
179
  },
180
180
  options
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport { lowerCaseFirst } from 'lower-case-first';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Result of optimistic data provider.\n */\nexport type OptimisticDataProviderResult = {\n /**\n * Kind of the result.\n * - Update: use the `data` field to update the query cache.\n * - Skip: skip the optimistic update for this query.\n * - ProceedDefault: proceed with the default optimistic update.\n */\n kind: 'Update' | 'Skip' | 'ProceedDefault';\n\n /**\n * Data to update the query cache. Only applicable if `kind` is 'Update'.\n *\n * If the data is an object with fields updated, it should have a `$optimistic`\n * field set to `true`. If it's an array and an element object is created or updated,\n * the element should have a `$optimistic` field set to `true`.\n */\n data?: any;\n};\n\n/**\n * Optimistic data provider.\n *\n * @param args Arguments.\n * @param args.queryModel The model of the query.\n * @param args.queryOperation The operation of the query, `findMany`, `count`, etc.\n * @param args.queryArgs The arguments of the query.\n * @param args.currentData The current cache data for the query.\n * @param args.mutationArgs The arguments of the mutation.\n */\nexport type OptimisticDataProvider = (args: {\n queryModel: string;\n queryOperation: string;\n queryArgs: any;\n currentData: any;\n mutationArgs: any;\n}) => OptimisticDataProviderResult | Promise<OptimisticDataProviderResult>;\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n\n /**\n * A callback for computing optimistic update data for each query cache entry.\n */\n optimisticDataProvider?: OptimisticDataProvider;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), options);\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n options\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n customFetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n // Note: 'cross-fetch' is supposed to handle fetch compatibility\n // but it doesn't work for cloudflare workers\n const _fetch =\n customFetch ??\n // check if fetch is available globally\n (typeof fetch === 'function'\n ? fetch\n : // fallback to 'cross-fetch' if otherwise\n (await import('cross-fetch')).default);\n\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (\n checkReadBack !== false &&\n errData.error?.prisma &&\n errData.error?.code === 'P2004' &&\n errData.error?.reason === 'RESULT_NOT_READABLE'\n ) {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: Error & { info?: unknown; status?: number } = new Error(\n 'An error occurred while fetching the data.'\n );\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed?.data && parsed?.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions<any, any, any> | undefined,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (cacheValue?.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n if (options?.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel: parsedKey.model,\n queryOperation: parsedKey.operation,\n queryArgs: parsedKey.args,\n currentData: cacheValue?.data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to custom provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(key)} due to provider`);\n }\n optimisticPromises.push(mutator(key, providerResult.data, { revalidate: false }));\n continue;\n }\n }\n\n if (!cacheValue) {\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","useSWR","useSWRInfinite","model","operation","useSWRMutation"]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Result of optimistic data provider.\n */\nexport type OptimisticDataProviderResult = {\n /**\n * Kind of the result.\n * - Update: use the `data` field to update the query cache.\n * - Skip: skip the optimistic update for this query.\n * - ProceedDefault: proceed with the default optimistic update.\n */\n kind: 'Update' | 'Skip' | 'ProceedDefault';\n\n /**\n * Data to update the query cache. Only applicable if `kind` is 'Update'.\n *\n * If the data is an object with fields updated, it should have a `$optimistic`\n * field set to `true`. If it's an array and an element object is created or updated,\n * the element should have a `$optimistic` field set to `true`.\n */\n data?: any;\n};\n\n/**\n * Optimistic data provider.\n *\n * @param args Arguments.\n * @param args.queryModel The model of the query.\n * @param args.queryOperation The operation of the query, `findMany`, `count`, etc.\n * @param args.queryArgs The arguments of the query.\n * @param args.currentData The current cache data for the query.\n * @param args.mutationArgs The arguments of the mutation.\n */\nexport type OptimisticDataProvider = (args: {\n queryModel: string;\n queryOperation: string;\n queryArgs: any;\n currentData: any;\n mutationArgs: any;\n}) => OptimisticDataProviderResult | Promise<OptimisticDataProviderResult>;\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n\n /**\n * A callback for computing optimistic update data for each query cache entry.\n */\n optimisticDataProvider?: OptimisticDataProvider;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), options);\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n options\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n customFetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n // Note: 'cross-fetch' is supposed to handle fetch compatibility\n // but it doesn't work for cloudflare workers\n const _fetch =\n customFetch ??\n // check if fetch is available globally\n (typeof fetch === 'function'\n ? fetch\n : // fallback to 'cross-fetch' if otherwise\n (await import('cross-fetch')).default);\n\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (\n checkReadBack !== false &&\n errData.error?.prisma &&\n errData.error?.code === 'P2004' &&\n errData.error?.reason === 'RESULT_NOT_READABLE'\n ) {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: Error & { info?: unknown; status?: number } = new Error(\n 'An error occurred while fetching the data.'\n );\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed?.data && parsed?.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions<any, any, any> | undefined,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (cacheValue?.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n if (options?.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel: parsedKey.model,\n queryOperation: parsedKey.operation,\n queryArgs: parsedKey.args,\n currentData: cacheValue?.data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to custom provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(key)} due to provider`);\n }\n optimisticPromises.push(mutator(key, providerResult.data, { revalidate: false }));\n continue;\n }\n }\n\n if (!cacheValue) {\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","useSWR","useSWRInfinite","model","operation","useSWRMutation"]}
package/runtime/index.mjs CHANGED
@@ -57,7 +57,7 @@ import {
57
57
  getMutatedModels,
58
58
  getReadModels
59
59
  } from "@zenstackhq/runtime/cross";
60
- import { lowerCaseFirst } from "lower-case-first";
60
+ import { lowerCaseFirst } from "@zenstackhq/runtime/local-helpers";
61
61
  import { createContext, useContext } from "react";
62
62
  import useSWR, { useSWRConfig } from "swr";
63
63
  import useSWRInfinite, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport { lowerCaseFirst } from 'lower-case-first';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Result of optimistic data provider.\n */\nexport type OptimisticDataProviderResult = {\n /**\n * Kind of the result.\n * - Update: use the `data` field to update the query cache.\n * - Skip: skip the optimistic update for this query.\n * - ProceedDefault: proceed with the default optimistic update.\n */\n kind: 'Update' | 'Skip' | 'ProceedDefault';\n\n /**\n * Data to update the query cache. Only applicable if `kind` is 'Update'.\n *\n * If the data is an object with fields updated, it should have a `$optimistic`\n * field set to `true`. If it's an array and an element object is created or updated,\n * the element should have a `$optimistic` field set to `true`.\n */\n data?: any;\n};\n\n/**\n * Optimistic data provider.\n *\n * @param args Arguments.\n * @param args.queryModel The model of the query.\n * @param args.queryOperation The operation of the query, `findMany`, `count`, etc.\n * @param args.queryArgs The arguments of the query.\n * @param args.currentData The current cache data for the query.\n * @param args.mutationArgs The arguments of the mutation.\n */\nexport type OptimisticDataProvider = (args: {\n queryModel: string;\n queryOperation: string;\n queryArgs: any;\n currentData: any;\n mutationArgs: any;\n}) => OptimisticDataProviderResult | Promise<OptimisticDataProviderResult>;\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n\n /**\n * A callback for computing optimistic update data for each query cache entry.\n */\n optimisticDataProvider?: OptimisticDataProvider;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), options);\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n options\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n customFetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n // Note: 'cross-fetch' is supposed to handle fetch compatibility\n // but it doesn't work for cloudflare workers\n const _fetch =\n customFetch ??\n // check if fetch is available globally\n (typeof fetch === 'function'\n ? fetch\n : // fallback to 'cross-fetch' if otherwise\n (await import('cross-fetch')).default);\n\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (\n checkReadBack !== false &&\n errData.error?.prisma &&\n errData.error?.code === 'P2004' &&\n errData.error?.reason === 'RESULT_NOT_READABLE'\n ) {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: Error & { info?: unknown; status?: number } = new Error(\n 'An error occurred while fetching the data.'\n );\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed?.data && parsed?.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions<any, any, any> | undefined,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (cacheValue?.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n if (options?.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel: parsedKey.model,\n queryOperation: parsedKey.operation,\n queryArgs: parsedKey.args,\n currentData: cacheValue?.data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to custom provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(key)} due to provider`);\n }\n optimisticPromises.push(mutator(key, providerResult.data, { revalidate: false }));\n continue;\n }\n }\n\n if (!cacheValue) {\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","model","operation"]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Result of optimistic data provider.\n */\nexport type OptimisticDataProviderResult = {\n /**\n * Kind of the result.\n * - Update: use the `data` field to update the query cache.\n * - Skip: skip the optimistic update for this query.\n * - ProceedDefault: proceed with the default optimistic update.\n */\n kind: 'Update' | 'Skip' | 'ProceedDefault';\n\n /**\n * Data to update the query cache. Only applicable if `kind` is 'Update'.\n *\n * If the data is an object with fields updated, it should have a `$optimistic`\n * field set to `true`. If it's an array and an element object is created or updated,\n * the element should have a `$optimistic` field set to `true`.\n */\n data?: any;\n};\n\n/**\n * Optimistic data provider.\n *\n * @param args Arguments.\n * @param args.queryModel The model of the query.\n * @param args.queryOperation The operation of the query, `findMany`, `count`, etc.\n * @param args.queryArgs The arguments of the query.\n * @param args.currentData The current cache data for the query.\n * @param args.mutationArgs The arguments of the mutation.\n */\nexport type OptimisticDataProvider = (args: {\n queryModel: string;\n queryOperation: string;\n queryArgs: any;\n currentData: any;\n mutationArgs: any;\n}) => OptimisticDataProviderResult | Promise<OptimisticDataProviderResult>;\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n\n /**\n * A callback for computing optimistic update data for each query cache entry.\n */\n optimisticDataProvider?: OptimisticDataProvider;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), options);\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n options\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n customFetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n // Note: 'cross-fetch' is supposed to handle fetch compatibility\n // but it doesn't work for cloudflare workers\n const _fetch =\n customFetch ??\n // check if fetch is available globally\n (typeof fetch === 'function'\n ? fetch\n : // fallback to 'cross-fetch' if otherwise\n (await import('cross-fetch')).default);\n\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (\n checkReadBack !== false &&\n errData.error?.prisma &&\n errData.error?.code === 'P2004' &&\n errData.error?.reason === 'RESULT_NOT_READABLE'\n ) {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: Error & { info?: unknown; status?: number } = new Error(\n 'An error occurred while fetching the data.'\n );\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed?.data && parsed?.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions<any, any, any> | undefined,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (cacheValue?.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n if (options?.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel: parsedKey.model,\n queryOperation: parsedKey.operation,\n queryArgs: parsedKey.args,\n currentData: cacheValue?.data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to custom provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(key)} due to provider`);\n }\n optimisticPromises.push(mutator(key, providerResult.data, { revalidate: false }));\n continue;\n }\n }\n\n if (!cacheValue) {\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","model","operation"]}