@zenstackhq/tanstack-query 1.9.0 → 1.10.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.
Files changed (51) hide show
  1. package/generator.js +6 -6
  2. package/generator.js.map +1 -1
  3. package/package.json +5 -5
  4. package/runtime/{common-mqucVdqq.d.mts → common-ZSgIGN1q.d.mts} +14 -1
  5. package/runtime/{common-mqucVdqq.d.ts → common-ZSgIGN1q.d.ts} +14 -1
  6. package/runtime/index.d.mts +1 -1
  7. package/runtime/index.d.ts +1 -1
  8. package/runtime/index.js.map +1 -1
  9. package/runtime/index.mjs.map +1 -1
  10. package/runtime/react.d.mts +2 -2
  11. package/runtime/react.d.ts +2 -2
  12. package/runtime/react.js +1 -3
  13. package/runtime/react.js.map +1 -1
  14. package/runtime/react.mjs +1 -3
  15. package/runtime/react.mjs.map +1 -1
  16. package/runtime/svelte.d.mts +2 -2
  17. package/runtime/svelte.d.ts +2 -2
  18. package/runtime/svelte.js +1 -3
  19. package/runtime/svelte.js.map +1 -1
  20. package/runtime/svelte.mjs +1 -3
  21. package/runtime/svelte.mjs.map +1 -1
  22. package/runtime/vue.d.mts +4 -4
  23. package/runtime/vue.d.ts +4 -4
  24. package/runtime/vue.js +1 -3
  25. package/runtime/vue.js.map +1 -1
  26. package/runtime/vue.mjs +1 -3
  27. package/runtime/vue.mjs.map +1 -1
  28. package/runtime-v5/{common-mqucVdqq.d.mts → common-ZSgIGN1q.d.mts} +14 -1
  29. package/runtime-v5/{common-mqucVdqq.d.ts → common-ZSgIGN1q.d.ts} +14 -1
  30. package/runtime-v5/index.d.mts +1 -1
  31. package/runtime-v5/index.d.ts +1 -1
  32. package/runtime-v5/index.js.map +1 -1
  33. package/runtime-v5/index.mjs.map +1 -1
  34. package/runtime-v5/react.d.mts +2 -2
  35. package/runtime-v5/react.d.ts +2 -2
  36. package/runtime-v5/react.js +1 -3
  37. package/runtime-v5/react.js.map +1 -1
  38. package/runtime-v5/react.mjs +1 -3
  39. package/runtime-v5/react.mjs.map +1 -1
  40. package/runtime-v5/svelte.d.mts +2 -2
  41. package/runtime-v5/svelte.d.ts +2 -2
  42. package/runtime-v5/svelte.js +1 -3
  43. package/runtime-v5/svelte.js.map +1 -1
  44. package/runtime-v5/svelte.mjs +1 -3
  45. package/runtime-v5/svelte.mjs.map +1 -1
  46. package/runtime-v5/vue.d.mts +4 -4
  47. package/runtime-v5/vue.d.ts +4 -4
  48. package/runtime-v5/vue.js +1 -3
  49. package/runtime-v5/vue.js.map +1 -1
  50. package/runtime-v5/vue.mjs +1 -3
  51. package/runtime-v5/vue.mjs.map +1 -1
package/generator.js CHANGED
@@ -164,7 +164,7 @@ function generateMutationHook(target, sf, model, operation, httpVerb, checkReadB
164
164
  {
165
165
  name: `_mutation`,
166
166
  initializer: `
167
- useModelMutation<${argsType}, ${overrideReturnType !== null && overrideReturnType !== void 0 ? overrideReturnType : model}, ${checkReadBack}>('${model}', '${httpVerb.toUpperCase()}', \`\${endpoint}/${(0, lower_case_first_1.lowerCaseFirst)(model)}/${operation}\`, metadata, options, fetch, invalidateQueries, ${checkReadBack}, optimisticUpdate)
167
+ useModelMutation<${argsType}, DefaultError, ${overrideReturnType !== null && overrideReturnType !== void 0 ? overrideReturnType : model}, ${checkReadBack}>('${model}', '${httpVerb.toUpperCase()}', \`\${endpoint}/${(0, lower_case_first_1.lowerCaseFirst)(model)}/${operation}\`, metadata, options, fetch, invalidateQueries, ${checkReadBack}, optimisticUpdate)
168
168
  `,
169
169
  },
170
170
  ],
@@ -402,9 +402,9 @@ function makeBaseImports(target, version) {
402
402
  const runtimeImportBase = makeRuntimeImportBase(version);
403
403
  const shared = [
404
404
  `import { useModelQuery, useInfiniteModelQuery, useModelMutation } from '${runtimeImportBase}/${target}';`,
405
- `import type { PickEnumerable, CheckSelect } from '${runtimeImportBase}';`,
405
+ `import type { PickEnumerable, CheckSelect, QueryError } from '${runtimeImportBase}';`,
406
406
  `import metadata from './__model_meta';`,
407
- `type DefaultError = Error;`,
407
+ `type DefaultError = QueryError;`,
408
408
  ];
409
409
  switch (target) {
410
410
  case 'react': {
@@ -468,11 +468,11 @@ function makeQueryOptions(target, returnType, dataType, infinite, suspense, vers
468
468
  function makeMutationOptions(target, returnType, argsType) {
469
469
  switch (target) {
470
470
  case 'react':
471
- return `UseMutationOptions<${returnType}, unknown, ${argsType}>`;
471
+ return `UseMutationOptions<${returnType}, DefaultError, ${argsType}>`;
472
472
  case 'vue':
473
- return `UseMutationOptions<${returnType}, unknown, ${argsType}, unknown>`;
473
+ return `UseMutationOptions<${returnType}, DefaultError, ${argsType}, unknown>`;
474
474
  case 'svelte':
475
- return `MutationOptions<${returnType}, unknown, ${argsType}>`;
475
+ return `MutationOptions<${returnType}, DefaultError, ${argsType}>`;
476
476
  default:
477
477
  throw new sdk_1.PluginError(_1.name, `Unsupported target: ${target}`);
478
478
  }
package/generator.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
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/tanstack-query",
3
3
  "displayName": "ZenStack plugin for generating tanstack-query hooks",
4
- "version": "1.9.0",
4
+ "version": "1.10.1",
5
5
  "description": "ZenStack plugin for generating tanstack-query hooks",
6
6
  "main": "index.js",
7
7
  "exports": {
@@ -81,8 +81,8 @@
81
81
  "superjson": "^1.11.0",
82
82
  "ts-morph": "^16.0.0",
83
83
  "upper-case-first": "^2.0.2",
84
- "@zenstackhq/sdk": "1.9.0",
85
- "@zenstackhq/runtime": "1.9.0"
84
+ "@zenstackhq/runtime": "1.10.1",
85
+ "@zenstackhq/sdk": "1.10.1"
86
86
  },
87
87
  "devDependencies": {
88
88
  "@tanstack/react-query": "^4.29.7",
@@ -103,13 +103,13 @@
103
103
  "svelte": "^4.2.1",
104
104
  "swr": "^2.0.3",
105
105
  "vue": "^3.3.4",
106
- "@zenstackhq/testtools": "1.9.0"
106
+ "@zenstackhq/testtools": "1.10.1"
107
107
  },
108
108
  "scripts": {
109
109
  "clean": "rimraf dist",
110
110
  "build": "pnpm lint --max-warnings=0 && pnpm clean && tsc && tsup-node --config ./tsup.config.ts && tsup-node --config ./tsup-v5.config.ts && node scripts/postbuild && copyfiles ./package.json ./README.md ./LICENSE dist && pnpm pack dist --pack-destination '../../../../.build'",
111
111
  "watch": "concurrently \"tsc --watch\" \"tsup-node --config ./tsup.config.ts --watch\" \"tsup-node --config ./tsup-v5.config.ts --watch\"",
112
112
  "lint": "eslint src --ext ts",
113
- "test": "ZENSTACK_TEST=1 jest"
113
+ "test": "jest"
114
114
  }
115
115
  }
@@ -2,6 +2,19 @@
2
2
  * Function signature for `fetch`.
3
3
  */
4
4
  type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;
5
+ /**
6
+ * Type for query and mutation errors.
7
+ */
8
+ type QueryError = Error & {
9
+ /**
10
+ * Additional error information.
11
+ */
12
+ info?: unknown;
13
+ /**
14
+ * HTTP status code.
15
+ */
16
+ status?: number;
17
+ };
5
18
  /**
6
19
  * Context type for configuring the hooks.
7
20
  */
@@ -40,4 +53,4 @@ type QueryKey = [
40
53
  */
41
54
  declare function getQueryKey(model: string, urlOrOperation: string, args: unknown, infinite?: boolean, optimisticUpdate?: boolean): QueryKey;
42
55
 
43
- export { type APIContext as A, type FetchFn as F, getQueryKey as g };
56
+ export { type APIContext as A, type FetchFn as F, type QueryError as Q, getQueryKey as g };
@@ -2,6 +2,19 @@
2
2
  * Function signature for `fetch`.
3
3
  */
4
4
  type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;
5
+ /**
6
+ * Type for query and mutation errors.
7
+ */
8
+ type QueryError = Error & {
9
+ /**
10
+ * Additional error information.
11
+ */
12
+ info?: unknown;
13
+ /**
14
+ * HTTP status code.
15
+ */
16
+ status?: number;
17
+ };
5
18
  /**
6
19
  * Context type for configuring the hooks.
7
20
  */
@@ -40,4 +53,4 @@ type QueryKey = [
40
53
  */
41
54
  declare function getQueryKey(model: string, urlOrOperation: string, args: unknown, infinite?: boolean, optimisticUpdate?: boolean): QueryKey;
42
55
 
43
- export { type APIContext as A, type FetchFn as F, getQueryKey as g };
56
+ export { type APIContext as A, type FetchFn as F, type QueryError as Q, getQueryKey as g };
@@ -1,4 +1,4 @@
1
- export { F as FetchFn, g as getQueryKey } from './common-mqucVdqq.mjs';
1
+ export { F as FetchFn, Q as QueryError, g as getQueryKey } from './common-ZSgIGN1q.mjs';
2
2
 
3
3
  type Enumerable<T> = T | Array<T>;
4
4
  type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
@@ -1,4 +1,4 @@
1
- export { F as FetchFn, g as getQueryKey } from './common-mqucVdqq.js';
1
+ export { F as FetchFn, Q as QueryError, g as getQueryKey } from './common-ZSgIGN1q.js';
2
2
 
3
3
  type Enumerable<T> = T | Array<T>;
4
4
  type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/common.ts"],"sourcesContent":["export * from './prisma-types';\nexport { type FetchFn, getQueryKey } from './common';\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,qBAAuC;AACvC,mBAMO;AACP,iBAA4B;AAUrB,IAAM,mBAAmB;AAmFzB,SAAS,YACZ,OACA,gBACA,MACA,WAAW,OACX,mBAAmB,OACX;AACR,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,MAAM,EAAE,UAAU,iBAAiB,CAAC;AACrF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/common.ts"],"sourcesContent":["export * from './prisma-types';\nexport { type FetchFn, type QueryError, getQueryKey } from './common';\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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: QueryError = new Error('An error occurred while fetching the data.');\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,qBAAuC;AACvC,mBAMO;AACP,iBAA4B;AAUrB,IAAM,mBAAmB;AAgGzB,SAAS,YACZ,OACA,gBACA,MACA,WAAW,OACX,mBAAmB,OACX;AACR,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,MAAM,EAAE,UAAU,iBAAiB,CAAC;AACrF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":";AAEA,SAAS,aAAa,iBAAiB;AACvC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAGG;AACP,YAAY,gBAAgB;AAUrB,IAAM,mBAAmB;AAmFzB,SAAS,YACZ,OACA,gBACA,MACA,WAAW,OACX,mBAAmB,OACX;AACR,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,MAAM,EAAE,UAAU,iBAAiB,CAAC;AACrF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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: QueryError = new Error('An error occurred while fetching the data.');\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":";AAEA,SAAS,aAAa,iBAAiB;AACvC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAGG;AACP,YAAY,gBAAgB;AAUrB,IAAM,mBAAmB;AAgGzB,SAAS,YACZ,OACA,gBACA,MACA,WAAW,OACX,mBAAmB,OACX;AACR,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,MAAM,EAAE,UAAU,iBAAiB,CAAC;AACrF;","names":[]}
@@ -2,7 +2,7 @@ import * as _tanstack_react_query from '@tanstack/react-query';
2
2
  import { UseQueryOptions, UseInfiniteQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
3
  import * as react from 'react';
4
4
  import { ModelMeta } from '@zenstackhq/runtime/cross';
5
- import { A as APIContext, F as FetchFn } from './common-mqucVdqq.mjs';
5
+ import { A as APIContext, F as FetchFn } from './common-ZSgIGN1q.mjs';
6
6
 
7
7
  /**
8
8
  * Context for configuring react hooks.
@@ -56,6 +56,6 @@ declare function useInfiniteModelQuery<TQueryFnData, TData, TError>(model: strin
56
56
  * @param optimisticUpdate Whether to enable automatic optimistic update
57
57
  * @returns useMutation hooks
58
58
  */
59
- declare function useModelMutation<T, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(model: string, method: 'POST' | 'PUT' | 'DELETE', url: string, modelMeta: ModelMeta, options?: Omit<UseMutationOptions<Result, unknown, T>, 'mutationFn'>, fetch?: FetchFn, invalidateQueries?: boolean, checkReadBack?: C, optimisticUpdate?: boolean): _tanstack_react_query.UseMutationResult<Result, unknown, T, unknown>;
59
+ declare function useModelMutation<TArgs, TError, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(model: string, method: 'POST' | 'PUT' | 'DELETE', url: string, modelMeta: ModelMeta, options?: Omit<UseMutationOptions<Result, TError, TArgs>, 'mutationFn'>, fetch?: FetchFn, invalidateQueries?: boolean, checkReadBack?: C, optimisticUpdate?: boolean): _tanstack_react_query.UseMutationResult<Result, TError, TArgs, unknown>;
60
60
 
61
61
  export { Provider, RequestHandlerContext, getHooksContext, useInfiniteModelQuery, useModelMutation, useModelQuery };
@@ -2,7 +2,7 @@ import * as _tanstack_react_query from '@tanstack/react-query';
2
2
  import { UseQueryOptions, UseInfiniteQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
3
  import * as react from 'react';
4
4
  import { ModelMeta } from '@zenstackhq/runtime/cross';
5
- import { A as APIContext, F as FetchFn } from './common-mqucVdqq.js';
5
+ import { A as APIContext, F as FetchFn } from './common-ZSgIGN1q.js';
6
6
 
7
7
  /**
8
8
  * Context for configuring react hooks.
@@ -56,6 +56,6 @@ declare function useInfiniteModelQuery<TQueryFnData, TData, TError>(model: strin
56
56
  * @param optimisticUpdate Whether to enable automatic optimistic update
57
57
  * @returns useMutation hooks
58
58
  */
59
- declare function useModelMutation<T, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(model: string, method: 'POST' | 'PUT' | 'DELETE', url: string, modelMeta: ModelMeta, options?: Omit<UseMutationOptions<Result, unknown, T>, 'mutationFn'>, fetch?: FetchFn, invalidateQueries?: boolean, checkReadBack?: C, optimisticUpdate?: boolean): _tanstack_react_query.UseMutationResult<Result, unknown, T, unknown>;
59
+ declare function useModelMutation<TArgs, TError, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(model: string, method: 'POST' | 'PUT' | 'DELETE', url: string, modelMeta: ModelMeta, options?: Omit<UseMutationOptions<Result, TError, TArgs>, 'mutationFn'>, fetch?: FetchFn, invalidateQueries?: boolean, checkReadBack?: C, optimisticUpdate?: boolean): _tanstack_react_query.UseMutationResult<Result, TError, TArgs, unknown>;
60
60
 
61
61
  export { Provider, RequestHandlerContext, getHooksContext, useInfiniteModelQuery, useModelMutation, useModelQuery };
package/runtime/react.js CHANGED
@@ -106,9 +106,7 @@ function fetcher(url, options, fetch2, checkReadBack) {
106
106
  if (checkReadBack !== false && ((_a = errData.error) == null ? void 0 : _a.prisma) && ((_b = errData.error) == null ? void 0 : _b.code) === "P2004" && ((_c = errData.error) == null ? void 0 : _c.reason) === "RESULT_NOT_READABLE") {
107
107
  return void 0;
108
108
  }
109
- const error = new Error(
110
- "An error occurred while fetching the data."
111
- );
109
+ const error = new Error("An error occurred while fetching the data.");
112
110
  error.info = errData.error;
113
111
  error.status = res.status;
114
112
  throw error;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/react.ts","../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type UseInfiniteQueryOptions,\n type UseMutationOptions,\n type UseQueryOptions,\n} from '@tanstack/react-query';\nimport type { ModelMeta } from '@zenstackhq/runtime/cross';\nimport { createContext, useContext } from 'react';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n FetchFn,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n} from './common';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<APIContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function getHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Creates a react-query query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useQuery hook\n */\nexport function useModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn,\n optimisticUpdate = false\n) {\n const reqUrl = makeUrl(url, args);\n return useQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, false, optimisticUpdate),\n queryFn: () => fetcher<TQueryFnData, false>(reqUrl, undefined, fetch, false),\n ...options,\n });\n}\n\n/**\n * Creates a react-query infinite query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The initial request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query infinite query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @returns useInfiniteQuery hook\n */\nexport function useInfiniteModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn\n) {\n return useInfiniteQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, true),\n queryFn: ({ pageParam }) => {\n return fetcher<TQueryFnData, false>(makeUrl(url, pageParam ?? args), undefined, fetch, false);\n },\n ...options,\n });\n}\n\n/**\n * Creates a mutation with react-query.\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param modelMeta The model metadata.\n * @param url The request URL.\n * @param options The react-query options.\n * @param invalidateQueries Whether to invalidate queries after mutation.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useMutation hooks\n */\nexport function useModelMutation<T, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n modelMeta: ModelMeta,\n options?: Omit<UseMutationOptions<Result, unknown, T>, 'mutationFn'>,\n fetch?: FetchFn,\n invalidateQueries = true,\n checkReadBack?: C,\n optimisticUpdate = false\n) {\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const fetchInit: RequestInit = {\n method,\n ...(method !== 'DELETE' && {\n headers: {\n 'content-type': 'application/json',\n },\n body: marshal(data),\n }),\n };\n return fetcher<R, C>(reqUrl, fetchInit, fetch, checkReadBack) as Promise<Result>;\n };\n\n const finalOptions = { ...options, mutationFn };\n const operation = url.split('/').pop();\n if (operation) {\n const { logging } = useContext(RequestHandlerContext);\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n modelMeta,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n modelMeta,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => queryClient.setQueryData<unknown>(queryKey, data),\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":"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","names":["fetch","optimisticUpdate","fetch","optimisticUpdate"]}
1
+ {"version":3,"sources":["../../src/runtime/react.ts","../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type UseInfiniteQueryOptions,\n type UseMutationOptions,\n type UseQueryOptions,\n} from '@tanstack/react-query';\nimport type { ModelMeta } from '@zenstackhq/runtime/cross';\nimport { createContext, useContext } from 'react';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n type FetchFn,\n} from './common';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<APIContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function getHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Creates a react-query query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useQuery hook\n */\nexport function useModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn,\n optimisticUpdate = false\n) {\n const reqUrl = makeUrl(url, args);\n return useQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, false, optimisticUpdate),\n queryFn: () => fetcher<TQueryFnData, false>(reqUrl, undefined, fetch, false),\n ...options,\n });\n}\n\n/**\n * Creates a react-query infinite query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The initial request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query infinite query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @returns useInfiniteQuery hook\n */\nexport function useInfiniteModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn\n) {\n return useInfiniteQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, true),\n queryFn: ({ pageParam }) => {\n return fetcher<TQueryFnData, false>(makeUrl(url, pageParam ?? args), undefined, fetch, false);\n },\n ...options,\n });\n}\n\n/**\n * Creates a mutation with react-query.\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param modelMeta The model metadata.\n * @param url The request URL.\n * @param options The react-query options.\n * @param invalidateQueries Whether to invalidate queries after mutation.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useMutation hooks\n */\nexport function useModelMutation<\n TArgs,\n TError,\n R = any,\n C extends boolean = boolean,\n Result = C extends true ? R | undefined : R\n>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n modelMeta: ModelMeta,\n options?: Omit<UseMutationOptions<Result, TError, TArgs>, 'mutationFn'>,\n fetch?: FetchFn,\n invalidateQueries = true,\n checkReadBack?: C,\n optimisticUpdate = false\n) {\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const fetchInit: RequestInit = {\n method,\n ...(method !== 'DELETE' && {\n headers: {\n 'content-type': 'application/json',\n },\n body: marshal(data),\n }),\n };\n return fetcher<R, C>(reqUrl, fetchInit, fetch, checkReadBack) as Promise<Result>;\n };\n\n const finalOptions = { ...options, mutationFn };\n const operation = url.split('/').pop();\n if (operation) {\n const { logging } = useContext(RequestHandlerContext);\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n modelMeta,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n modelMeta,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => queryClient.setQueryData<unknown>(queryKey, data),\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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: QueryError = new Error('An error occurred while fetching the data.');\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":"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","names":["fetch","optimisticUpdate","fetch","optimisticUpdate"]}
package/runtime/react.mjs CHANGED
@@ -79,9 +79,7 @@ function fetcher(url, options, fetch2, checkReadBack) {
79
79
  if (checkReadBack !== false && ((_a = errData.error) == null ? void 0 : _a.prisma) && ((_b = errData.error) == null ? void 0 : _b.code) === "P2004" && ((_c = errData.error) == null ? void 0 : _c.reason) === "RESULT_NOT_READABLE") {
80
80
  return void 0;
81
81
  }
82
- const error = new Error(
83
- "An error occurred while fetching the data."
84
- );
82
+ const error = new Error("An error occurred while fetching the data.");
85
83
  error.info = errData.error;
86
84
  error.status = res.status;
87
85
  throw error;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/react.ts","../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type UseInfiniteQueryOptions,\n type UseMutationOptions,\n type UseQueryOptions,\n} from '@tanstack/react-query';\nimport type { ModelMeta } from '@zenstackhq/runtime/cross';\nimport { createContext, useContext } from 'react';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n FetchFn,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n} from './common';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<APIContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function getHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Creates a react-query query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useQuery hook\n */\nexport function useModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn,\n optimisticUpdate = false\n) {\n const reqUrl = makeUrl(url, args);\n return useQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, false, optimisticUpdate),\n queryFn: () => fetcher<TQueryFnData, false>(reqUrl, undefined, fetch, false),\n ...options,\n });\n}\n\n/**\n * Creates a react-query infinite query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The initial request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query infinite query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @returns useInfiniteQuery hook\n */\nexport function useInfiniteModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn\n) {\n return useInfiniteQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, true),\n queryFn: ({ pageParam }) => {\n return fetcher<TQueryFnData, false>(makeUrl(url, pageParam ?? args), undefined, fetch, false);\n },\n ...options,\n });\n}\n\n/**\n * Creates a mutation with react-query.\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param modelMeta The model metadata.\n * @param url The request URL.\n * @param options The react-query options.\n * @param invalidateQueries Whether to invalidate queries after mutation.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useMutation hooks\n */\nexport function useModelMutation<T, R = any, C extends boolean = boolean, Result = C extends true ? R | undefined : R>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n modelMeta: ModelMeta,\n options?: Omit<UseMutationOptions<Result, unknown, T>, 'mutationFn'>,\n fetch?: FetchFn,\n invalidateQueries = true,\n checkReadBack?: C,\n optimisticUpdate = false\n) {\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const fetchInit: RequestInit = {\n method,\n ...(method !== 'DELETE' && {\n headers: {\n 'content-type': 'application/json',\n },\n body: marshal(data),\n }),\n };\n return fetcher<R, C>(reqUrl, fetchInit, fetch, checkReadBack) as Promise<Result>;\n };\n\n const finalOptions = { ...options, mutationFn };\n const operation = url.split('/').pop();\n if (operation) {\n const { logging } = useContext(RequestHandlerContext);\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n modelMeta,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n modelMeta,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => queryClient.setQueryData<unknown>(queryKey, data),\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIG;AAEP,SAAS,eAAe,kBAAkB;;;ACT1C,SAAS,aAAa,iBAAiB;AACvC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OAGG;AACP,YAAY,gBAAgB;AAKrB,IAAM,yBAAyB;AAK/B,IAAM,mBAAmB;AA2BhC,SAAsB,QAClB,KACA,SACAA,QACA,eAC2C;AAAA;AApD/C;AAqDI,UAAM,SAASA,UAAA,OAAAA,SAAoB;AACnC,UAAM,MAAM,MAAM,OAAO,KAAK,OAAO;AACrC,QAAI,CAAC,IAAI,IAAI;AACT,YAAM,UAAU,UAAU,MAAM,IAAI,KAAK,CAAC;AAC1C,UACI,kBAAkB,WAClB,aAAQ,UAAR,mBAAe,aACf,aAAQ,UAAR,mBAAe,UAAS,aACxB,aAAQ,UAAR,mBAAe,YAAW,uBAC5B;AAEE,eAAO;AAAA,MACX;AACA,YAAM,QAAqD,IAAI;AAAA,QAC3D;AAAA,MACJ;AACA,YAAM,OAAO,QAAQ;AACrB,YAAM,SAAS,IAAI;AACnB,YAAM;AAAA,IACV;AAEA,UAAM,aAAa,MAAM,IAAI,KAAK;AAClC,QAAI;AACA,aAAO,UAAU,UAAU,EAAE;AAAA,IACjC,SAAS,KAAK;AACV,cAAQ,MAAM,+BAA+B,UAAU;AACvD,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAsBO,SAAS,YACZ,OACA,gBACA,MACA,WAAW,OACXC,oBAAmB,OACX;AACR,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,MAAM,EAAE,UAAU,kBAAAA,kBAAiB,CAAC;AACrF;AAEO,SAAS,QAAQ,OAAgB;AACpC,QAAM,EAAE,MAAM,KAAK,IAAI,UAAU,KAAK;AACtC,MAAI,MAAM;AACN,WAAO,KAAK,UAAU,iCAAM,OAAN,EAAoB,MAAM,EAAE,eAAe,KAAK,EAAE,EAAC;AAAA,EAC7E,OAAO;AACH,WAAO,KAAK,UAAU,IAAI;AAAA,EAC9B;AACJ;AAEO,SAAS,UAAU,OAAe;AA/HzC;AAgII,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,OAAO,UAAQ,YAAO,SAAP,mBAAa,gBAAe;AAC3C,UAAM,mBAAmB,YAAY,OAAO,MAAM,OAAO,KAAK,aAAa;AAC3E,WAAO,iCAAK,SAAL,EAAa,MAAM,iBAAiB;AAAA,EAC/C,OAAO;AACH,WAAO;AAAA,EACX;AACJ;AAEO,SAAS,QAAQ,KAAa,MAAe;AAChD,MAAI,CAAC,MAAM;AACP,WAAO;AAAA,EACX;AAEA,QAAM,EAAE,MAAM,KAAK,IAAI,UAAU,IAAI;AACrC,MAAI,SAAS,GAAG,GAAG,MAAM,mBAAmB,KAAK,UAAU,IAAI,CAAC,CAAC;AACjE,MAAI,MAAM;AACN,cAAU,SAAS,mBAAmB,KAAK,UAAU,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC;AAAA,EAClF;AACA,SAAO;AACX;AAWO,SAAS,kBACZ,OACA,WACA,WACA,SACA,YACA,UAAU,OACZ;AACE,QAAM,gBAAgB,mCAAS;AAC/B,UAAQ,YAAY,IAAU,SAAoB;AAC9C,UAAM,CAAC,GAAG,SAAS,IAAI;AACvB,UAAM,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,UAAM,WAAW,SAAS;AAC1B,WAAO,+CAAgB,GAAG;AAAA,EAC9B;AACJ;AAGA,SAAe,yBACX,OACA,WACA,cACA,WACA,UAAU,OACZ;AAAA;AACE,UAAM,gBAAgB,MAAM,iBAAiB,OAAO,WAAW,cAAc,SAAS;AAEtF,WAAO,CAAC,EAAE,SAAS,MAAwC;AACvD,YAAM,CAAC,GAAG,YAAY,EAAE,IAAI,IAAI;AAEhC,UAAI,cAAc,SAAS,UAAU,GAAG;AAEpC,YAAI,SAAS;AACT,kBAAQ,IAAI,sBAAsB,KAAK,UAAU,QAAQ,CAAC,qBAAqB,KAAK,IAAI,SAAS,GAAG;AAAA,QACxG;AACA,eAAO;AAAA,MACX;AAEA,UAAI,MAAM;AAEN,YAAI,eAAe,YAAY,eAAe,WAAW,IAAI,GAAG;AAC5D,cAAI,SAAS;AACT,oBAAQ;AAAA,cACJ,sBAAsB,KAAK,UAAU,QAAQ,CAAC,qBAAqB,KAAK,IAAI,SAAS;AAAA,YACzF;AAAA,UACJ;AACA,iBAAO;AAAA,QACX;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAGA,SAAS,eAAe,eAAuB,cAAwB,WAAsB,MAAW;AACpG,QAAM,aAAa,cAAc,eAAe,WAAW,IAAI;AAC/D,SAAO,aAAa,KAAK,CAAC,MAAM,WAAW,SAAS,CAAC,CAAC;AAC1D;AAYO,SAAS,sBACZ,OACA,WACA,WACA,SACA,YACA,UACA,YACA,UAAU,OACZ;AACE,QAAM,eAAe,mCAAS;AAC9B,QAAM,gBAAgB,mCAAS;AAG/B,UAAQ,WAAW,IAAU,SAAoB;AAC7C,UAAM,CAAC,SAAS,IAAI;AACpB,UAAM;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,WAAO,6CAAe,GAAG;AAAA,EAC7B;AAGA,UAAQ,YAAY,IAAU,SAAoB;AAC9C,QAAI,YAAY;AACZ,YAAM,CAAC,EAAE,EAAE,SAAS,IAAI;AACxB,YAAM,YAAY,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA,YAAM,WAAW,SAAS;AAAA,IAC9B;AACA,WAAO,+CAAgB,GAAG;AAAA,EAC9B;AACJ;AAGA,SAAe,iBACX,eACA,YACA,cACA,WACA,YACA,UACA,UAAU,OACZ;AAAA;AACE,eAAW,aAAa,YAAY;AAChC,YAAM;AAAA,QACF;AAAA,QACA,OAAO,EAAE,MAAM,MAAM;AAAA,MACzB,IAAI;AAEJ,UAAI,OAAO;AACP,YAAI,SAAS;AACT,kBAAQ,KAAK,kCAAkC,KAAK,UAAU,QAAQ,CAAC,kBAAkB,KAAK;AAAA,QAClG;AACA;AAAA,MACJ;AAEA,YAAM,CAAC,GAAG,YAAY,SAAS,YAAY,EAAE,kBAAAA,kBAAiB,CAAC,IAAI;AACnE,UAAI,CAACA,mBAAkB;AACnB,YAAI,SAAS;AACT,kBAAQ,IAAI,kCAAkC,KAAK,UAAU,QAAQ,CAAC,iBAAiB;AAAA,QAC3F;AACA;AAAA,MACJ;AAEA,YAAM,cAAc,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,UAAI,gBAAgB,QAAW;AAE3B,YAAI,SAAS;AACT,kBAAQ;AAAA,YACJ,iCAAiC,KAAK;AAAA,cAClC;AAAA,YACJ,CAAC,qBAAqB,aAAa,IAAI,UAAU;AAAA,UACrD;AAAA,QACJ;AACA,iBAAS,UAAU,WAAW;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA;;;ADnTO,IAAM,wBAAwB,cAA0B;AAAA,EAC3D,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AACb,CAAC;AAKM,IAAM,WAAW,sBAAsB;AAKvC,SAAS,kBAAkB;AAC9B,QAA8B,gBAAW,qBAAqB,GAAtD,WA1CZ,IA0CkC,IAAT,iBAAS,IAAT,CAAb;AACR,SAAO,iBAAE,UAAU,8BAAY,0BAA2B;AAC9D;AAaO,SAAS,cACZ,OACA,KACA,MACA,SACAC,QACAC,oBAAmB,OACrB;AACE,QAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,SAAO,SAAsC;AAAA,IACzC,UAAU,YAAY,OAAO,KAAK,MAAM,OAAOA,iBAAgB;AAAA,IAC/D,SAAS,MAAM,QAA6B,QAAQ,QAAWD,QAAO,KAAK;AAAA,KACxE,QACN;AACL;AAYO,SAAS,sBACZ,OACA,KACA,MACA,SACAA,QACF;AACE,SAAO,iBAA8C;AAAA,IACjD,UAAU,YAAY,OAAO,KAAK,MAAM,IAAI;AAAA,IAC5C,SAAS,CAAC,EAAE,UAAU,MAAM;AACxB,aAAO,QAA6B,QAAQ,KAAK,gCAAa,IAAI,GAAG,QAAWA,QAAO,KAAK;AAAA,IAChG;AAAA,KACG,QACN;AACL;AAeO,SAAS,iBACZ,OACA,QACA,KACA,WACA,SACAA,QACA,oBAAoB,MACpB,eACAC,oBAAmB,OACrB;AACE,QAAM,cAAc,eAAe;AACnC,QAAM,aAAa,CAAC,SAAc;AAC9B,UAAM,SAAS,WAAW,WAAW,QAAQ,KAAK,IAAI,IAAI;AAC1D,UAAM,YAAyB;AAAA,MAC3B;AAAA,OACI,WAAW,YAAY;AAAA,MACvB,SAAS;AAAA,QACL,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,QAAQ,IAAI;AAAA,IACtB;AAEJ,WAAO,QAAc,QAAQ,WAAWD,QAAO,aAAa;AAAA,EAChE;AAEA,QAAM,eAAe,iCAAK,UAAL,EAAc,WAAW;AAC9C,QAAM,YAAY,IAAI,MAAM,GAAG,EAAE,IAAI;AACrC,MAAI,WAAW;AACX,UAAM,EAAE,QAAQ,IAAI,WAAW,qBAAqB;AACpD,QAAI,mBAAmB;AACnB;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,cAAc,YAAY,kBAAkB,EAAE,UAAU,CAAC;AAAA,QAC1D;AAAA,MACJ;AAAA,IACJ;AAEA,QAAIC,mBAAkB;AAClB;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,cAAc,EAAE,OAAO;AAAA,QACnC,CAAC,UAAU,SAAS,YAAY,aAAsB,UAAU,IAAI;AAAA,QACpE,oBAAoB,CAAC,cAAc,YAAY,kBAAkB,EAAE,UAAU,CAAC,IAAI;AAAA,QAClF;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,YAAY,YAAY;AACnC;","names":["fetch","optimisticUpdate","fetch","optimisticUpdate"]}
1
+ {"version":3,"sources":["../../src/runtime/react.ts","../../src/runtime/common.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type UseInfiniteQueryOptions,\n type UseMutationOptions,\n type UseQueryOptions,\n} from '@tanstack/react-query';\nimport type { ModelMeta } from '@zenstackhq/runtime/cross';\nimport { createContext, useContext } from 'react';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n type FetchFn,\n} from './common';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<APIContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function getHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Creates a react-query query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useQuery hook\n */\nexport function useModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn,\n optimisticUpdate = false\n) {\n const reqUrl = makeUrl(url, args);\n return useQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, false, optimisticUpdate),\n queryFn: () => fetcher<TQueryFnData, false>(reqUrl, undefined, fetch, false),\n ...options,\n });\n}\n\n/**\n * Creates a react-query infinite query.\n *\n * @param model The name of the model under query.\n * @param url The request URL.\n * @param args The initial request args object, URL-encoded and appended as \"?q=\" parameter\n * @param options The react-query infinite query options object\n * @param fetch The fetch function to use for sending the HTTP request\n * @returns useInfiniteQuery hook\n */\nexport function useInfiniteModelQuery<TQueryFnData, TData, TError>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey'>,\n fetch?: FetchFn\n) {\n return useInfiniteQuery<TQueryFnData, TError, TData>({\n queryKey: getQueryKey(model, url, args, true),\n queryFn: ({ pageParam }) => {\n return fetcher<TQueryFnData, false>(makeUrl(url, pageParam ?? args), undefined, fetch, false);\n },\n ...options,\n });\n}\n\n/**\n * Creates a mutation with react-query.\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param modelMeta The model metadata.\n * @param url The request URL.\n * @param options The react-query options.\n * @param invalidateQueries Whether to invalidate queries after mutation.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n * @param optimisticUpdate Whether to enable automatic optimistic update\n * @returns useMutation hooks\n */\nexport function useModelMutation<\n TArgs,\n TError,\n R = any,\n C extends boolean = boolean,\n Result = C extends true ? R | undefined : R\n>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n modelMeta: ModelMeta,\n options?: Omit<UseMutationOptions<Result, TError, TArgs>, 'mutationFn'>,\n fetch?: FetchFn,\n invalidateQueries = true,\n checkReadBack?: C,\n optimisticUpdate = false\n) {\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const fetchInit: RequestInit = {\n method,\n ...(method !== 'DELETE' && {\n headers: {\n 'content-type': 'application/json',\n },\n body: marshal(data),\n }),\n };\n return fetcher<R, C>(reqUrl, fetchInit, fetch, checkReadBack) as Promise<Result>;\n };\n\n const finalOptions = { ...options, mutationFn };\n const operation = url.split('/').pop();\n if (operation) {\n const { logging } = useContext(RequestHandlerContext);\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n modelMeta,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n modelMeta,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => queryClient.setQueryData<unknown>(queryKey, data),\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* 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 * as crossFetch from 'cross-fetch';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\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\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n const _fetch = fetch ?? crossFetch.fetch;\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: QueryError = new Error('An error occurred while fetching the data.');\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\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param urlOrOperation Prisma operation (e.g, `findMany`) or request URL. If it's a URL, the last path segment will be used as the operation name.\n * @param args Prisma query arguments.\n * @param infinite Whether the query is infinite.\n * @param optimisticUpdate Whether the query is optimistically updated.\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n urlOrOperation: string,\n args: unknown,\n infinite = false,\n optimisticUpdate = false\n): QueryKey {\n if (!urlOrOperation) {\n throw new Error('Invalid urlOrOperation');\n }\n const operation = urlOrOperation.split('/').pop();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function 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\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function 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\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n return origOnSuccess?.(...args);\n };\n}\n\n// gets a predicate for evaluating whether a query should be invalidated\nasync function getInvalidationPredicate(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging = false\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, modelMeta);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], modelMeta: ModelMeta, args: any) {\n const modelsRead = getReadModels(visitingModel, modelMeta, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: MutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n queryCache,\n setCache,\n logging\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as PrismaWriteActionType,\n variables,\n modelMeta,\n logging\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOp, _queryArgs, { optimisticUpdate }] = queryKey as QueryKey;\n if (!optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n queryModel,\n queryOp,\n 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 queryKey\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n"],"mappings":"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","names":["fetch","optimisticUpdate","fetch","optimisticUpdate"]}