@zenstackhq/tanstack-query 1.1.1 → 1.2.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 (54) hide show
  1. package/generator.js +70 -37
  2. package/generator.js.map +1 -1
  3. package/package.json +40 -9
  4. package/runtime/common-5e18c135.d.ts +32 -0
  5. package/runtime/index.d.mts +1 -1
  6. package/runtime/index.d.ts +1 -1
  7. package/runtime/index.js +34 -0
  8. package/runtime/index.js.map +1 -1
  9. package/runtime/index.mjs +15 -0
  10. package/runtime/index.mjs.map +1 -1
  11. package/runtime/react.d.mts +17 -26
  12. package/runtime/react.d.ts +17 -26
  13. package/runtime/react.js +105 -72
  14. package/runtime/react.js.map +1 -1
  15. package/runtime/react.mjs +102 -68
  16. package/runtime/react.mjs.map +1 -1
  17. package/runtime/svelte.d.mts +16 -25
  18. package/runtime/svelte.d.ts +16 -25
  19. package/runtime/svelte.js +97 -71
  20. package/runtime/svelte.js.map +1 -1
  21. package/runtime/svelte.mjs +93 -66
  22. package/runtime/svelte.mjs.map +1 -1
  23. package/runtime/vue.d.mts +17 -27
  24. package/runtime/vue.d.ts +17 -27
  25. package/runtime/vue.js +105 -77
  26. package/runtime/vue.js.map +1 -1
  27. package/runtime/vue.mjs +101 -71
  28. package/runtime/vue.mjs.map +1 -1
  29. package/runtime-v5/common-5e18c135.d.ts +32 -0
  30. package/runtime-v5/index.d.mts +20 -0
  31. package/runtime-v5/index.d.ts +20 -0
  32. package/runtime-v5/index.js +53 -0
  33. package/runtime-v5/index.js.map +1 -0
  34. package/runtime-v5/index.mjs +16 -0
  35. package/runtime-v5/index.mjs.map +1 -0
  36. package/runtime-v5/react.d.mts +45 -0
  37. package/runtime-v5/react.d.ts +45 -0
  38. package/runtime-v5/react.js +269 -0
  39. package/runtime-v5/react.js.map +1 -0
  40. package/runtime-v5/react.mjs +237 -0
  41. package/runtime-v5/react.mjs.map +1 -0
  42. package/runtime-v5/svelte.d.mts +56 -0
  43. package/runtime-v5/svelte.d.ts +56 -0
  44. package/runtime-v5/svelte.js +296 -0
  45. package/runtime-v5/svelte.js.map +1 -0
  46. package/runtime-v5/svelte.mjs +264 -0
  47. package/runtime-v5/svelte.mjs.map +1 -0
  48. package/runtime-v5/vue.d.mts +52 -0
  49. package/runtime-v5/vue.d.ts +52 -0
  50. package/runtime-v5/vue.js +274 -0
  51. package/runtime-v5/vue.js.map +1 -0
  52. package/runtime-v5/vue.mjs +240 -0
  53. package/runtime-v5/vue.mjs.map +1 -0
  54. package/runtime/common-83308e88.d.ts +0 -19
@@ -0,0 +1,20 @@
1
+ export { F as FetchFn, g as getQueryKey } from './common-5e18c135.js';
2
+
3
+ type Enumerable<T> = T | Array<T>;
4
+ type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
5
+ type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>;
6
+ type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T;
7
+ type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Pick<T, MaybeTupleToUnion<K>>;
8
+ type SelectAndInclude = {
9
+ select: any;
10
+ include: any;
11
+ };
12
+ type HasSelect = {
13
+ select: any;
14
+ };
15
+ type HasInclude = {
16
+ include: any;
17
+ };
18
+ type CheckSelect<T, S, U> = T extends SelectAndInclude ? 'Please either choose `select` or `include`' : T extends HasSelect ? U : T extends HasInclude ? U : S;
19
+
20
+ export { CheckSelect, Enumerable, MaybeTupleToUnion, PickEnumerable, TupleToUnion };
@@ -0,0 +1,20 @@
1
+ export { F as FetchFn, g as getQueryKey } from './common-5e18c135.js';
2
+
3
+ type Enumerable<T> = T | Array<T>;
4
+ type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
5
+ type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>;
6
+ type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T;
7
+ type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Pick<T, MaybeTupleToUnion<K>>;
8
+ type SelectAndInclude = {
9
+ select: any;
10
+ include: any;
11
+ };
12
+ type HasSelect = {
13
+ select: any;
14
+ };
15
+ type HasInclude = {
16
+ include: any;
17
+ };
18
+ type CheckSelect<T, S, U> = T extends SelectAndInclude ? 'Please either choose `select` or `include`' : T extends HasSelect ? U : T extends HasInclude ? U : S;
19
+
20
+ export { CheckSelect, Enumerable, MaybeTupleToUnion, PickEnumerable, TupleToUnion };
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/runtime-v5/index.ts
31
+ var runtime_v5_exports = {};
32
+ __export(runtime_v5_exports, {
33
+ getQueryKey: () => getQueryKey
34
+ });
35
+ module.exports = __toCommonJS(runtime_v5_exports);
36
+
37
+ // src/runtime/common.ts
38
+ var import_browser = require("@zenstackhq/runtime/browser");
39
+ var import_cross = require("@zenstackhq/runtime/cross");
40
+ var crossFetch = __toESM(require("cross-fetch"));
41
+ var QUERY_KEY_PREFIX = "zenstack";
42
+ function getQueryKey(model, urlOrOperation, args) {
43
+ if (!urlOrOperation) {
44
+ throw new Error("Invalid urlOrOperation");
45
+ }
46
+ const operation = urlOrOperation.split("/").pop();
47
+ return [QUERY_KEY_PREFIX, model, operation, args];
48
+ }
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ getQueryKey
52
+ });
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime-v5/index.ts","../../src/runtime/common.ts"],"sourcesContent":["export * from '../runtime/prisma-types';\nexport { type FetchFn, getQueryKey } from '../runtime/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 { getMutatedModels, getReadModels, type ModelMeta, type PrismaWriteActionType } 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 = [string /* prefix */, string /* model */, string /* operation */, unknown /* args */];\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 * @returns Query key\n */\nexport function getQueryKey(model: string, urlOrOperation: string, args: unknown): 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];\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;\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: { onSuccess?: (...args: any[]) => any },\n invalidate: (predicate: InvalidationPredicate) => Promise<void>,\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 [_model, queryModel, queryOp, args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query [${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(`Invalidating query [${queryKey}] due to mutation \"${model}.${operation}\"`);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,qBAAuC;AACvC,mBAA4F;AAC5F,iBAA4B;AAUrB,IAAM,mBAAmB;AAwEzB,SAAS,YAAY,OAAe,gBAAwB,MAAyB;AACxF,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,IAAI;AACrD;","names":[]}
@@ -0,0 +1,16 @@
1
+ // src/runtime/common.ts
2
+ import { deserialize, serialize } from "@zenstackhq/runtime/browser";
3
+ import { getMutatedModels, getReadModels } from "@zenstackhq/runtime/cross";
4
+ import * as crossFetch from "cross-fetch";
5
+ var QUERY_KEY_PREFIX = "zenstack";
6
+ function getQueryKey(model, urlOrOperation, args) {
7
+ if (!urlOrOperation) {
8
+ throw new Error("Invalid urlOrOperation");
9
+ }
10
+ const operation = urlOrOperation.split("/").pop();
11
+ return [QUERY_KEY_PREFIX, model, operation, args];
12
+ }
13
+ export {
14
+ getQueryKey
15
+ };
16
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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 { getMutatedModels, getReadModels, type ModelMeta, type PrismaWriteActionType } 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 = [string /* prefix */, string /* model */, string /* operation */, unknown /* args */];\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 * @returns Query key\n */\nexport function getQueryKey(model: string, urlOrOperation: string, args: unknown): 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];\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;\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: { onSuccess?: (...args: any[]) => any },\n invalidate: (predicate: InvalidationPredicate) => Promise<void>,\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 [_model, queryModel, queryOp, args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query [${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(`Invalidating query [${queryKey}] due to mutation \"${model}.${operation}\"`);\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"],"mappings":";AAEA,SAAS,aAAa,iBAAiB;AACvC,SAAS,kBAAkB,qBAAiE;AAC5F,YAAY,gBAAgB;AAUrB,IAAM,mBAAmB;AAwEzB,SAAS,YAAY,OAAe,gBAAwB,MAAyB;AACxF,MAAI,CAAC,gBAAgB;AACjB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,QAAM,YAAY,eAAe,MAAM,GAAG,EAAE,IAAI;AAEhD,SAAO,CAAC,kBAAkB,OAAO,WAAY,IAAI;AACrD;","names":[]}
@@ -0,0 +1,45 @@
1
+ import * as _tanstack_react_query_v5_build_legacy_types from '@tanstack/react-query/build/legacy/types';
2
+ import * as react from 'react';
3
+ import { UseQueryOptions, UseInfiniteQueryOptions, InfiniteData, UseMutationOptions } from '@tanstack/react-query';
4
+ import { ModelMeta } from '@zenstackhq/runtime/cross';
5
+ import { A as APIContext, F as FetchFn } from './common-5e18c135.js';
6
+
7
+ /**
8
+ * Context for configuring react hooks.
9
+ */
10
+ declare const RequestHandlerContext: react.Context<APIContext>;
11
+ /**
12
+ * Hooks context.
13
+ */
14
+ declare function getHooksContext(): {
15
+ fetch?: FetchFn | undefined;
16
+ logging?: boolean | undefined;
17
+ endpoint: string;
18
+ };
19
+ /**
20
+ * Context provider.
21
+ */
22
+ declare const Provider: react.Provider<APIContext>;
23
+ /**
24
+ * Creates a react-query query.
25
+ *
26
+ * @param model The name of the model under query.
27
+ * @param url The request URL.
28
+ * @param args The request args object, URL-encoded and appended as "?q=" parameter
29
+ * @param options The react-query options object
30
+ * @returns useQuery hook
31
+ */
32
+ declare function useModelQuery<R>(model: string, url: string, args?: unknown, options?: Omit<UseQueryOptions<R>, 'queryKey'>, fetch?: FetchFn): _tanstack_react_query_v5_build_legacy_types.UseQueryResult<R, Error>;
33
+ /**
34
+ * Creates a react-query infinite query.
35
+ *
36
+ * @param model The name of the model under query.
37
+ * @param url The request URL.
38
+ * @param args The initial request args object, URL-encoded and appended as "?q=" parameter
39
+ * @param options The react-query infinite query options object
40
+ * @returns useInfiniteQuery hook
41
+ */
42
+ declare function useInfiniteModelQuery<R>(model: string, url: string, args: unknown, options: Omit<UseInfiniteQueryOptions<R, unknown, InfiniteData<R>>, 'queryKey'>, fetch?: FetchFn): _tanstack_react_query_v5_build_legacy_types.UseInfiniteQueryResult<InfiniteData<R, unknown>, unknown>;
43
+ 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): _tanstack_react_query_v5_build_legacy_types.UseMutationResult<Result, unknown, T, unknown>;
44
+
45
+ export { Provider, RequestHandlerContext, getHooksContext, useInfiniteModelQuery, useModelMutation, useModelQuery };
@@ -0,0 +1,45 @@
1
+ import * as _tanstack_react_query_v5_build_legacy_types from '@tanstack/react-query/build/legacy/types';
2
+ import * as react from 'react';
3
+ import { UseQueryOptions, UseInfiniteQueryOptions, InfiniteData, UseMutationOptions } from '@tanstack/react-query';
4
+ import { ModelMeta } from '@zenstackhq/runtime/cross';
5
+ import { A as APIContext, F as FetchFn } from './common-5e18c135.js';
6
+
7
+ /**
8
+ * Context for configuring react hooks.
9
+ */
10
+ declare const RequestHandlerContext: react.Context<APIContext>;
11
+ /**
12
+ * Hooks context.
13
+ */
14
+ declare function getHooksContext(): {
15
+ fetch?: FetchFn | undefined;
16
+ logging?: boolean | undefined;
17
+ endpoint: string;
18
+ };
19
+ /**
20
+ * Context provider.
21
+ */
22
+ declare const Provider: react.Provider<APIContext>;
23
+ /**
24
+ * Creates a react-query query.
25
+ *
26
+ * @param model The name of the model under query.
27
+ * @param url The request URL.
28
+ * @param args The request args object, URL-encoded and appended as "?q=" parameter
29
+ * @param options The react-query options object
30
+ * @returns useQuery hook
31
+ */
32
+ declare function useModelQuery<R>(model: string, url: string, args?: unknown, options?: Omit<UseQueryOptions<R>, 'queryKey'>, fetch?: FetchFn): _tanstack_react_query_v5_build_legacy_types.UseQueryResult<R, Error>;
33
+ /**
34
+ * Creates a react-query infinite query.
35
+ *
36
+ * @param model The name of the model under query.
37
+ * @param url The request URL.
38
+ * @param args The initial request args object, URL-encoded and appended as "?q=" parameter
39
+ * @param options The react-query infinite query options object
40
+ * @returns useInfiniteQuery hook
41
+ */
42
+ declare function useInfiniteModelQuery<R>(model: string, url: string, args: unknown, options: Omit<UseInfiniteQueryOptions<R, unknown, InfiniteData<R>>, 'queryKey'>, fetch?: FetchFn): _tanstack_react_query_v5_build_legacy_types.UseInfiniteQueryResult<InfiniteData<R, unknown>, unknown>;
43
+ 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): _tanstack_react_query_v5_build_legacy_types.UseMutationResult<Result, unknown, T, unknown>;
44
+
45
+ export { Provider, RequestHandlerContext, getHooksContext, useInfiniteModelQuery, useModelMutation, useModelQuery };
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
37
+ var __export = (target, all) => {
38
+ for (var name in all)
39
+ __defProp(target, name, { get: all[name], enumerable: true });
40
+ };
41
+ var __copyProps = (to, from, except, desc) => {
42
+ if (from && typeof from === "object" || typeof from === "function") {
43
+ for (let key of __getOwnPropNames(from))
44
+ if (!__hasOwnProp.call(to, key) && key !== except)
45
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
46
+ }
47
+ return to;
48
+ };
49
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
50
+ // If the importer is in node compatibility mode or this is not an ESM
51
+ // file that has been converted to a CommonJS file using a Babel-
52
+ // compatible transform (i.e. "__esModule" has not been set), then set
53
+ // "default" to the CommonJS "module.exports" for node compatibility.
54
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
55
+ mod
56
+ ));
57
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
58
+ var __async = (__this, __arguments, generator) => {
59
+ return new Promise((resolve, reject) => {
60
+ var fulfilled = (value) => {
61
+ try {
62
+ step(generator.next(value));
63
+ } catch (e) {
64
+ reject(e);
65
+ }
66
+ };
67
+ var rejected = (value) => {
68
+ try {
69
+ step(generator.throw(value));
70
+ } catch (e) {
71
+ reject(e);
72
+ }
73
+ };
74
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
75
+ step((generator = generator.apply(__this, __arguments)).next());
76
+ });
77
+ };
78
+
79
+ // src/runtime-v5/react.ts
80
+ var react_exports = {};
81
+ __export(react_exports, {
82
+ Provider: () => Provider,
83
+ RequestHandlerContext: () => RequestHandlerContext,
84
+ getHooksContext: () => getHooksContext,
85
+ useInfiniteModelQuery: () => useInfiniteModelQuery,
86
+ useModelMutation: () => useModelMutation,
87
+ useModelQuery: () => useModelQuery
88
+ });
89
+ module.exports = __toCommonJS(react_exports);
90
+ var import_react_query_v5 = require("@tanstack/react-query");
91
+ var import_react = require("react");
92
+
93
+ // src/runtime/common.ts
94
+ var import_browser = require("@zenstackhq/runtime/browser");
95
+ var import_cross = require("@zenstackhq/runtime/cross");
96
+ var crossFetch = __toESM(require("cross-fetch"));
97
+ var DEFAULT_QUERY_ENDPOINT = "/api/model";
98
+ var QUERY_KEY_PREFIX = "zenstack";
99
+ function fetcher(url, options, fetch2, checkReadBack) {
100
+ return __async(this, null, function* () {
101
+ var _a, _b, _c;
102
+ const _fetch = fetch2 != null ? fetch2 : crossFetch.fetch;
103
+ const res = yield _fetch(url, options);
104
+ if (!res.ok) {
105
+ const errData = unmarshal(yield res.text());
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
+ return void 0;
108
+ }
109
+ const error = new Error(
110
+ "An error occurred while fetching the data."
111
+ );
112
+ error.info = errData.error;
113
+ error.status = res.status;
114
+ throw error;
115
+ }
116
+ const textResult = yield res.text();
117
+ try {
118
+ return unmarshal(textResult).data;
119
+ } catch (err) {
120
+ console.error(`Unable to deserialize data:`, textResult);
121
+ throw err;
122
+ }
123
+ });
124
+ }
125
+ function getQueryKey(model, urlOrOperation, args) {
126
+ if (!urlOrOperation) {
127
+ throw new Error("Invalid urlOrOperation");
128
+ }
129
+ const operation = urlOrOperation.split("/").pop();
130
+ return [QUERY_KEY_PREFIX, model, operation, args];
131
+ }
132
+ function marshal(value) {
133
+ const { data, meta } = (0, import_browser.serialize)(value);
134
+ if (meta) {
135
+ return JSON.stringify(__spreadProps(__spreadValues({}, data), { meta: { serialization: meta } }));
136
+ } else {
137
+ return JSON.stringify(data);
138
+ }
139
+ }
140
+ function unmarshal(value) {
141
+ var _a;
142
+ const parsed = JSON.parse(value);
143
+ if (parsed.data && ((_a = parsed.meta) == null ? void 0 : _a.serialization)) {
144
+ const deserializedData = (0, import_browser.deserialize)(parsed.data, parsed.meta.serialization);
145
+ return __spreadProps(__spreadValues({}, parsed), { data: deserializedData });
146
+ } else {
147
+ return parsed;
148
+ }
149
+ }
150
+ function makeUrl(url, args) {
151
+ if (!args) {
152
+ return url;
153
+ }
154
+ const { data, meta } = (0, import_browser.serialize)(args);
155
+ let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;
156
+ if (meta) {
157
+ result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;
158
+ }
159
+ return result;
160
+ }
161
+ function setupInvalidation(model, operation, modelMeta, options, invalidate, logging = false) {
162
+ const origOnSuccess = options == null ? void 0 : options.onSuccess;
163
+ options.onSuccess = (...args) => __async(this, null, function* () {
164
+ const [_, variables] = args;
165
+ const predicate = yield getInvalidationPredicate(
166
+ model,
167
+ operation,
168
+ variables,
169
+ modelMeta,
170
+ logging
171
+ );
172
+ yield invalidate(predicate);
173
+ return origOnSuccess == null ? void 0 : origOnSuccess(...args);
174
+ });
175
+ }
176
+ function getInvalidationPredicate(model, operation, mutationArgs, modelMeta, logging = false) {
177
+ return __async(this, null, function* () {
178
+ const mutatedModels = yield (0, import_cross.getMutatedModels)(model, operation, mutationArgs, modelMeta);
179
+ return ({ queryKey }) => {
180
+ const [_model, queryModel, queryOp, args] = queryKey;
181
+ if (mutatedModels.includes(queryModel)) {
182
+ if (logging) {
183
+ console.log(`Invalidating query [${queryKey}] due to mutation "${model}.${operation}"`);
184
+ }
185
+ return true;
186
+ }
187
+ if (args) {
188
+ if (findNestedRead(queryModel, mutatedModels, modelMeta, args)) {
189
+ if (logging) {
190
+ console.log(`Invalidating query [${queryKey}] due to mutation "${model}.${operation}"`);
191
+ }
192
+ return true;
193
+ }
194
+ }
195
+ return false;
196
+ };
197
+ });
198
+ }
199
+ function findNestedRead(visitingModel, targetModels, modelMeta, args) {
200
+ const modelsRead = (0, import_cross.getReadModels)(visitingModel, modelMeta, args);
201
+ return targetModels.some((m) => modelsRead.includes(m));
202
+ }
203
+
204
+ // src/runtime-v5/react.ts
205
+ var RequestHandlerContext = (0, import_react.createContext)({
206
+ endpoint: DEFAULT_QUERY_ENDPOINT,
207
+ fetch: void 0
208
+ });
209
+ function getHooksContext() {
210
+ const _a = (0, import_react.useContext)(RequestHandlerContext), { endpoint } = _a, rest = __objRest(_a, ["endpoint"]);
211
+ return __spreadValues({ endpoint: endpoint != null ? endpoint : DEFAULT_QUERY_ENDPOINT }, rest);
212
+ }
213
+ var Provider = RequestHandlerContext.Provider;
214
+ function useModelQuery(model, url, args, options, fetch2) {
215
+ const reqUrl = makeUrl(url, args);
216
+ return (0, import_react_query_v5.useQuery)(__spreadValues({
217
+ queryKey: getQueryKey(model, url, args),
218
+ queryFn: () => fetcher(reqUrl, void 0, fetch2, false)
219
+ }, options));
220
+ }
221
+ function useInfiniteModelQuery(model, url, args, options, fetch2) {
222
+ return (0, import_react_query_v5.useInfiniteQuery)(__spreadValues({
223
+ queryKey: getQueryKey(model, url, args),
224
+ queryFn: ({ pageParam }) => {
225
+ return fetcher(makeUrl(url, pageParam != null ? pageParam : args), void 0, fetch2, false);
226
+ }
227
+ }, options));
228
+ }
229
+ function useModelMutation(model, method, url, modelMeta, options, fetch2, invalidateQueries = true, checkReadBack) {
230
+ const queryClient = (0, import_react_query_v5.useQueryClient)();
231
+ const mutationFn = (data) => {
232
+ const reqUrl = method === "DELETE" ? makeUrl(url, data) : url;
233
+ const fetchInit = __spreadValues({
234
+ method
235
+ }, method !== "DELETE" && {
236
+ headers: {
237
+ "content-type": "application/json"
238
+ },
239
+ body: marshal(data)
240
+ });
241
+ return fetcher(reqUrl, fetchInit, fetch2, checkReadBack);
242
+ };
243
+ const finalOptions = __spreadProps(__spreadValues({}, options), { mutationFn });
244
+ if (invalidateQueries) {
245
+ const { logging } = (0, import_react.useContext)(RequestHandlerContext);
246
+ const operation = url.split("/").pop();
247
+ if (operation) {
248
+ setupInvalidation(
249
+ model,
250
+ operation,
251
+ modelMeta,
252
+ finalOptions,
253
+ (predicate) => queryClient.invalidateQueries({ predicate }),
254
+ logging
255
+ );
256
+ }
257
+ }
258
+ return (0, import_react_query_v5.useMutation)(finalOptions);
259
+ }
260
+ // Annotate the CommonJS export names for ESM import in node:
261
+ 0 && (module.exports = {
262
+ Provider,
263
+ RequestHandlerContext,
264
+ getHooksContext,
265
+ useInfiniteModelQuery,
266
+ useModelMutation,
267
+ useModelQuery
268
+ });
269
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime-v5/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 InfiniteData,\n type UseInfiniteQueryOptions,\n type UseMutationOptions,\n type UseQueryOptions,\n} from '@tanstack/react-query-v5';\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 type APIContext,\n} from '../runtime/common';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<APIContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\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 * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\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 * @returns useQuery hook\n */\nexport function useModelQuery<R>(\n model: string,\n url: string,\n args?: unknown,\n options?: Omit<UseQueryOptions<R>, 'queryKey'>,\n fetch?: FetchFn\n) {\n const reqUrl = makeUrl(url, args);\n return useQuery({\n queryKey: getQueryKey(model, url, args),\n queryFn: () => fetcher<R, 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 * @returns useInfiniteQuery hook\n */\nexport function useInfiniteModelQuery<R>(\n model: string,\n url: string,\n args: unknown,\n options: Omit<UseInfiniteQueryOptions<R, unknown, InfiniteData<R>>, 'queryKey'>,\n fetch?: FetchFn\n) {\n return useInfiniteQuery({\n queryKey: getQueryKey(model, url, args),\n queryFn: ({ pageParam }) => {\n return fetcher<R, false>(makeUrl(url, pageParam ?? args), undefined, fetch, false);\n },\n ...options,\n });\n}\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) {\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 if (invalidateQueries) {\n const { logging } = useContext(RequestHandlerContext);\n const operation = url.split('/').pop();\n if (operation) {\n setupInvalidation(\n model,\n operation,\n modelMeta,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\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 { getMutatedModels, getReadModels, type ModelMeta, type PrismaWriteActionType } 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 = [string /* prefix */, string /* model */, string /* operation */, unknown /* args */];\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 * @returns Query key\n */\nexport function getQueryKey(model: string, urlOrOperation: string, args: unknown): 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];\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;\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n modelMeta: ModelMeta,\n options: { onSuccess?: (...args: any[]) => any },\n invalidate: (predicate: InvalidationPredicate) => Promise<void>,\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 [_model, queryModel, queryOp, args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query [${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(`Invalidating query [${queryKey}] due to mutation \"${model}.${operation}\"`);\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"],"mappings":"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","names":["fetch","fetch"]}