@zenstackhq/swr 1.4.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport * as crossFetch from 'cross-fetch';\nimport { lowerCaseFirst } from 'lower-case-first';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * @deprecated Use `fallbackData` instead\n *\n * Equivalent to @see SWRConfiguration.fallbackData\n */\n initialData?: Result;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * @deprecated Use `fallbackData` instead\n *\n * Equivalent to @see SWRInfiniteConfiguration.fallbackData\n */\n initialData?: Result[];\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), {\n ...options,\n fallbackData: options?.initialData ?? options?.fallbackData,\n });\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n {\n ...options,\n fallbackData: options?.initialData ?? options?.fallbackData,\n }\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n 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\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (parsed.data && parsed.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (!cacheValue) {\n continue;\n }\n\n if (cacheValue.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","useSWR","useSWRInfinite","model","operation","useSWRMutation"]}
@@ -0,0 +1,335 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+ var __async = (__this, __arguments, generator) => {
33
+ return new Promise((resolve, reject) => {
34
+ var fulfilled = (value) => {
35
+ try {
36
+ step(generator.next(value));
37
+ } catch (e) {
38
+ reject(e);
39
+ }
40
+ };
41
+ var rejected = (value) => {
42
+ try {
43
+ step(generator.throw(value));
44
+ } catch (e) {
45
+ reject(e);
46
+ }
47
+ };
48
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
49
+ step((generator = generator.apply(__this, __arguments)).next());
50
+ });
51
+ };
52
+
53
+ // src/runtime/index.ts
54
+ import { deserialize, serialize } from "@zenstackhq/runtime/browser";
55
+ import {
56
+ applyMutation,
57
+ getMutatedModels,
58
+ getReadModels
59
+ } from "@zenstackhq/runtime/cross";
60
+ import * as crossFetch from "cross-fetch";
61
+ import { lowerCaseFirst } from "lower-case-first";
62
+ import { createContext, useContext } from "react";
63
+ import useSWR, { useSWRConfig } from "swr";
64
+ import useSWRInfinite, {
65
+ unstable_serialize
66
+ } from "swr/infinite";
67
+ import useSWRMutation from "swr/mutation";
68
+ var DEFAULT_QUERY_ENDPOINT = "/api/model";
69
+ var RequestHandlerContext = createContext({
70
+ endpoint: DEFAULT_QUERY_ENDPOINT,
71
+ fetch: void 0
72
+ });
73
+ var Provider = RequestHandlerContext.Provider;
74
+ function useHooksContext() {
75
+ const _a = useContext(RequestHandlerContext), { endpoint } = _a, rest = __objRest(_a, ["endpoint"]);
76
+ return __spreadValues({ endpoint: endpoint != null ? endpoint : DEFAULT_QUERY_ENDPOINT }, rest);
77
+ }
78
+ var QUERY_KEY_PREFIX = "zenstack:query";
79
+ var MUTATION_KEY_PREFIX = "zenstack:mutation";
80
+ function getQueryKey(model, operation, args, infinite, optimisticUpdate2) {
81
+ return JSON.stringify({
82
+ prefix: QUERY_KEY_PREFIX,
83
+ model,
84
+ operation,
85
+ args,
86
+ infinite: infinite === true,
87
+ optimisticUpdate: optimisticUpdate2 !== false
88
+ });
89
+ }
90
+ function getMutationKey(model, operation) {
91
+ return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });
92
+ }
93
+ function parseQueryKey(key) {
94
+ let keyValue = key;
95
+ if (typeof key === "string") {
96
+ try {
97
+ keyValue = JSON.parse(key);
98
+ } catch (e) {
99
+ return void 0;
100
+ }
101
+ }
102
+ return (keyValue == null ? void 0 : keyValue.prefix) === QUERY_KEY_PREFIX ? keyValue : void 0;
103
+ }
104
+ function useModelQuery(model, operation, args, options) {
105
+ var _a;
106
+ const { endpoint, fetch: fetch2 } = useHooksContext();
107
+ const key = (options == null ? void 0 : options.disabled) ? null : getQueryKey(model, operation, args, false, (options == null ? void 0 : options.optimisticUpdate) !== false);
108
+ const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);
109
+ return useSWR(key, () => fetcher(url, void 0, fetch2, false), __spreadProps(__spreadValues({}, options), {
110
+ fallbackData: (_a = options == null ? void 0 : options.initialData) != null ? _a : options == null ? void 0 : options.fallbackData
111
+ }));
112
+ }
113
+ function useInfiniteModelQuery(model, operation, getNextArgs, options) {
114
+ var _a;
115
+ const { endpoint, fetch: fetch2 } = useHooksContext();
116
+ const getKey = (pageIndex, previousPageData) => {
117
+ if (options == null ? void 0 : options.disabled) {
118
+ return null;
119
+ }
120
+ const nextArgs = getNextArgs(pageIndex, previousPageData);
121
+ return nextArgs !== null ? getQueryKey(model, operation, nextArgs, true, false) : null;
122
+ };
123
+ return useSWRInfinite(
124
+ getKey,
125
+ (key) => {
126
+ const parsedKey = parseQueryKey(key);
127
+ if (parsedKey) {
128
+ const { model: model2, operation: operation2, args } = parsedKey;
129
+ const url = makeUrl(`${endpoint}/${lowerCaseFirst(model2)}/${operation2}`, args);
130
+ return fetcher(url, void 0, fetch2, false);
131
+ } else {
132
+ throw new Error("Invalid query key: " + key);
133
+ }
134
+ },
135
+ __spreadProps(__spreadValues({}, options), {
136
+ fallbackData: (_a = options == null ? void 0 : options.initialData) != null ? _a : options == null ? void 0 : options.fallbackData
137
+ })
138
+ );
139
+ }
140
+ function useModelMutation(model, method, operation, modelMeta, options, checkReadBack) {
141
+ const { endpoint, fetch: fetch2, logging } = useHooksContext();
142
+ const invalidate = (options == null ? void 0 : options.revalidate) !== false ? useInvalidation(model, modelMeta) : void 0;
143
+ const { cache, mutate } = useSWRConfig();
144
+ return useSWRMutation(
145
+ getMutationKey(model, operation),
146
+ (_key, { arg }) => {
147
+ if (options == null ? void 0 : options.optimisticUpdate) {
148
+ optimisticUpdate(model, operation, arg, modelMeta, cache, mutate, logging);
149
+ }
150
+ const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;
151
+ return mutationRequest(method, url, arg, invalidate, fetch2, checkReadBack);
152
+ },
153
+ options
154
+ );
155
+ }
156
+ function mutationRequest(method, url, data, invalidate, fetch2, checkReadBack) {
157
+ return __async(this, null, function* () {
158
+ const reqUrl = method === "DELETE" ? makeUrl(url, data) : url;
159
+ const r = yield fetcher(
160
+ reqUrl,
161
+ {
162
+ method,
163
+ headers: {
164
+ "content-type": "application/json"
165
+ },
166
+ body: data ? marshal(data) : void 0
167
+ },
168
+ fetch2,
169
+ checkReadBack
170
+ );
171
+ if (invalidate) {
172
+ yield invalidate(getOperationFromUrl(url), data);
173
+ }
174
+ return r;
175
+ });
176
+ }
177
+ function useInvalidation(model, modelMeta) {
178
+ const { logging } = useHooksContext();
179
+ const { cache, mutate } = useSWRConfig();
180
+ return (operation, args) => __async(this, null, function* () {
181
+ if (!(cache instanceof Map)) {
182
+ throw new Error("mutate requires the cache provider to be a Map instance");
183
+ }
184
+ const mutatedModels = yield getMutatedModels(model, operation, args, modelMeta);
185
+ const keys = Array.from(cache.keys()).filter((key) => {
186
+ const parsedKey = parseQueryKey(key);
187
+ if (!parsedKey) {
188
+ return false;
189
+ }
190
+ const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);
191
+ return modelsRead.some((m) => mutatedModels.includes(m));
192
+ });
193
+ if (logging) {
194
+ keys.forEach((key) => {
195
+ console.log(`Invalidating query ${key} due to mutation "${model}.${operation}"`);
196
+ });
197
+ }
198
+ const mutations = keys.map((key) => {
199
+ const parsedKey = parseQueryKey(key);
200
+ return mutate((parsedKey == null ? void 0 : parsedKey.infinite) ? unstable_serialize(() => key) : key);
201
+ });
202
+ return Promise.all(mutations);
203
+ });
204
+ }
205
+ function fetcher(url, options, fetch2, checkReadBack) {
206
+ return __async(this, null, function* () {
207
+ var _a, _b, _c;
208
+ const _fetch = fetch2 != null ? fetch2 : crossFetch.fetch;
209
+ const res = yield _fetch(url, options);
210
+ if (!res.ok) {
211
+ const errData = unmarshal(yield res.text());
212
+ 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") {
213
+ return void 0;
214
+ }
215
+ const error = new Error(
216
+ "An error occurred while fetching the data."
217
+ );
218
+ error.info = errData.error;
219
+ error.status = res.status;
220
+ throw error;
221
+ }
222
+ const textResult = yield res.text();
223
+ try {
224
+ return unmarshal(textResult).data;
225
+ } catch (err) {
226
+ console.error(`Unable to deserialize data:`, textResult);
227
+ throw err;
228
+ }
229
+ });
230
+ }
231
+ function marshal(value) {
232
+ const { data, meta } = serialize(value);
233
+ if (meta) {
234
+ return JSON.stringify(__spreadProps(__spreadValues({}, data), { meta: { serialization: meta } }));
235
+ } else {
236
+ return JSON.stringify(data);
237
+ }
238
+ }
239
+ function unmarshal(value) {
240
+ var _a;
241
+ const parsed = JSON.parse(value);
242
+ if (parsed.data && ((_a = parsed.meta) == null ? void 0 : _a.serialization)) {
243
+ const deserializedData = deserialize(parsed.data, parsed.meta.serialization);
244
+ return __spreadProps(__spreadValues({}, parsed), { data: deserializedData });
245
+ } else {
246
+ return parsed;
247
+ }
248
+ }
249
+ function makeUrl(url, args) {
250
+ if (!args) {
251
+ return url;
252
+ }
253
+ const { data, meta } = serialize(args);
254
+ let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;
255
+ if (meta) {
256
+ result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;
257
+ }
258
+ return result;
259
+ }
260
+ function getOperationFromUrl(url) {
261
+ const parts = url.split("/");
262
+ const r = parts.pop();
263
+ if (!r) {
264
+ throw new Error(`Invalid URL: ${url}`);
265
+ } else {
266
+ return r;
267
+ }
268
+ }
269
+ function optimisticUpdate(mutationModel, mutationOp, mutationArgs, modelMeta, cache, mutator, logging = false) {
270
+ return __async(this, null, function* () {
271
+ const optimisticPromises = [];
272
+ for (const key of cache.keys()) {
273
+ const parsedKey = parseQueryKey(key);
274
+ if (!parsedKey) {
275
+ continue;
276
+ }
277
+ if (!parsedKey.optimisticUpdate) {
278
+ if (logging) {
279
+ console.log(`Skipping optimistic update for ${key} due to opt-out`);
280
+ }
281
+ continue;
282
+ }
283
+ const cacheValue = cache.get(key);
284
+ if (!cacheValue) {
285
+ continue;
286
+ }
287
+ if (cacheValue.error) {
288
+ if (logging) {
289
+ console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);
290
+ }
291
+ continue;
292
+ }
293
+ const mutatedData = yield applyMutation(
294
+ parsedKey.model,
295
+ parsedKey.operation,
296
+ cacheValue.data,
297
+ mutationModel,
298
+ mutationOp,
299
+ mutationArgs,
300
+ modelMeta,
301
+ logging
302
+ );
303
+ if (mutatedData !== void 0) {
304
+ if (logging) {
305
+ console.log(
306
+ `Optimistically updating query ${JSON.stringify(
307
+ key
308
+ )} due to mutation "${mutationModel}.${mutationOp}"`
309
+ );
310
+ }
311
+ optimisticPromises.push(
312
+ mutator(key, mutatedData, {
313
+ // don't trigger revalidation here since we will do it
314
+ // when the remote mutation succeeds
315
+ revalidate: false
316
+ })
317
+ );
318
+ }
319
+ }
320
+ return Promise.all(optimisticPromises);
321
+ });
322
+ }
323
+ export {
324
+ Provider,
325
+ RequestHandlerContext,
326
+ fetcher,
327
+ getQueryKey,
328
+ mutationRequest,
329
+ useHooksContext,
330
+ useInfiniteModelQuery,
331
+ useInvalidation,
332
+ useModelMutation,
333
+ useModelQuery
334
+ };
335
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n applyMutation,\n getMutatedModels,\n getReadModels,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport * as crossFetch from 'cross-fetch';\nimport { lowerCaseFirst } from 'lower-case-first';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n unstable_serialize,\n type SWRInfiniteConfiguration,\n type SWRInfiniteFetcher,\n type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n const { endpoint, ...rest } = useContext(RequestHandlerContext);\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * @deprecated Use `fallbackData` instead\n *\n * Equivalent to @see SWRConfiguration.fallbackData\n */\n initialData?: Result;\n\n /**\n * Whether to enable automatic optimistic update. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n /**\n * Disable data fetching\n */\n disabled?: boolean;\n\n /**\n * @deprecated Use `fallbackData` instead\n *\n * Equivalent to @see SWRInfiniteConfiguration.fallbackData\n */\n initialData?: Result[];\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n prefix: typeof QUERY_KEY_PREFIX;\n model: string;\n operation: string;\n args?: unknown;\n infinite?: boolean;\n optimisticUpdate?: boolean;\n};\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n /**\n * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n */\n optimisticUpdate?: boolean;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args?: unknown,\n infinite?: boolean,\n optimisticUpdate?: boolean\n) {\n return JSON.stringify({\n prefix: QUERY_KEY_PREFIX,\n model,\n operation,\n args,\n infinite: infinite === true,\n optimisticUpdate: optimisticUpdate !== false,\n });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n // use a random key since we don't have 1:1 mapping between mutation and query\n // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n let keyValue: any = key;\n if (typeof key === 'string') {\n try {\n keyValue = JSON.parse(key);\n } catch {\n return undefined;\n }\n }\n return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n model: string,\n operation: string,\n args?: unknown,\n options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n const key = options?.disabled\n ? null\n : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), {\n ...options,\n fallbackData: options?.initialData ?? options?.fallbackData,\n });\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n model: string,\n operation: string,\n getNextArgs: GetNextArgs<Args, any>,\n options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n const { endpoint, fetch } = useHooksContext();\n\n const getKey = (pageIndex: number, previousPageData: Result | null) => {\n if (options?.disabled) {\n return null;\n }\n const nextArgs = getNextArgs(pageIndex, previousPageData);\n return nextArgs !== null // null means reached the end\n ? getQueryKey(model, operation, nextArgs, true, false)\n : null;\n };\n\n return useSWRInfinite<Result, Error>(\n getKey,\n (key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (parsedKey) {\n const { model, operation, args } = parsedKey;\n const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n return fetcher<Result, false>(url, undefined, fetch, false);\n } else {\n throw new Error('Invalid query key: ' + key);\n }\n },\n {\n ...options,\n fallbackData: options?.initialData ?? options?.fallbackData,\n }\n );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n modelMeta: ModelMeta,\n options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n checkReadBack?: CheckReadBack\n) {\n const { endpoint, fetch, logging } = useHooksContext();\n const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n const { cache, mutate } = useSWRConfig();\n\n return useSWRMutation(\n getMutationKey(model, operation),\n (_key, { arg }: { arg: any }) => {\n if (options?.optimisticUpdate) {\n optimisticUpdate(model, operation, arg, modelMeta, cache, mutate, logging);\n }\n const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n },\n options\n );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n method: 'POST' | 'PUT' | 'DELETE',\n url: string,\n data: unknown,\n invalidate?: Invalidator,\n fetch?: FetchFn,\n checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n const r = await fetcher<Result, C>(\n reqUrl,\n {\n method,\n headers: {\n 'content-type': 'application/json',\n },\n body: data ? marshal(data) : undefined,\n },\n fetch,\n checkReadBack\n );\n\n if (invalidate) {\n await invalidate(getOperationFromUrl(url), data);\n }\n return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n const { logging } = useHooksContext();\n const { cache, mutate } = useSWRConfig();\n return async (operation: string, args: unknown) => {\n if (!(cache instanceof Map)) {\n throw new Error('mutate requires the cache provider to be a Map instance');\n }\n\n const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n const keys = Array.from(cache.keys()).filter((key: unknown) => {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n return false;\n }\n const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n return modelsRead.some((m) => mutatedModels.includes(m));\n });\n\n if (logging) {\n keys.forEach((key) => {\n console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n });\n }\n\n const mutations = keys.map((key) => {\n const parsedKey = parseQueryKey(key);\n // FIX: special handling for infinite query keys, but still not working\n // https://github.com/vercel/swr/discussions/2843\n return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n });\n return Promise.all(mutations);\n };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n url: string,\n options?: RequestInit,\n 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\nfunction marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nfunction unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (parsed.data && parsed.meta?.serialization) {\n const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n return { ...parsed, data: deserializedData };\n } else {\n return parsed;\n }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n if (!args) {\n return url;\n }\n\n const { data, meta } = serialize(args);\n let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n const parts = url.split('/');\n const r = parts.pop();\n if (!r) {\n throw new Error(`Invalid URL: ${url}`);\n } else {\n return r;\n }\n}\n\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n modelMeta: ModelMeta,\n cache: Cache,\n mutator: ScopedMutator,\n logging = false\n) {\n const optimisticPromises: Array<Promise<void>> = [];\n for (const key of cache.keys()) {\n const parsedKey = parseQueryKey(key);\n if (!parsedKey) {\n continue;\n }\n\n if (!parsedKey.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${key} due to opt-out`);\n }\n continue;\n }\n\n const cacheValue = cache.get(key);\n if (!cacheValue) {\n continue;\n }\n\n if (cacheValue.error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n }\n continue;\n }\n\n const mutatedData = await applyMutation(\n parsedKey.model,\n parsedKey.operation,\n cacheValue.data,\n mutationModel,\n mutationOp as PrismaWriteActionType,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n key\n )} due to mutation \"${mutationModel}.${mutationOp}\"`\n );\n }\n optimisticPromises.push(\n mutator(key, mutatedData, {\n // don't trigger revalidation here since we will do it\n // when the remote mutation succeeds\n revalidate: false,\n })\n );\n }\n }\n\n return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","model","operation"]}
@@ -1,17 +0,0 @@
1
- export type Enumerable<T> = T | Array<T>;
2
- type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
3
- export type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>;
4
- export type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T;
5
- export type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Pick<T, MaybeTupleToUnion<K>>;
6
- type SelectAndInclude = {
7
- select: any;
8
- include: any;
9
- };
10
- type HasSelect = {
11
- select: any;
12
- };
13
- type HasInclude = {
14
- include: any;
15
- };
16
- export type CheckSelect<T, S, U> = T extends SelectAndInclude ? 'Please either choose `select` or `include`' : T extends HasSelect ? U : T extends HasInclude ? U : S;
17
- export {};
@@ -1,5 +0,0 @@
1
- "use strict";
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- /// Types copied over from Prisma's generated code to avoid being broken due to Prisma upgrades
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- //# sourceMappingURL=prisma-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prisma-types.js","sourceRoot":"","sources":["../../src/runtime/prisma-types.ts"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,+FAA+F"}