{"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { deserialize, serialize } from '@zenstackhq/runtime/browser';\nimport {\n    applyMutation,\n    getMutatedModels,\n    getReadModels,\n    type ModelMeta,\n    type PrismaWriteActionType,\n} from '@zenstackhq/runtime/cross';\nimport { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers';\nimport { createContext, useContext } from 'react';\nimport type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { ScopedMutator } from 'swr/_internal';\nimport useSWRInfinite, {\n    unstable_serialize,\n    type SWRInfiniteConfiguration,\n    type SWRInfiniteFetcher,\n    type SWRInfiniteResponse,\n} from 'swr/infinite';\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation';\nexport * from './prisma-types';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Context type for configuring react hooks.\n */\nexport type RequestHandlerContext = {\n    /**\n     * The endpoint to use for the queries.\n     */\n    endpoint?: string;\n\n    /**\n     * A custom fetch function for sending the HTTP requests.\n     */\n    fetch?: FetchFn;\n\n    /**\n     * If logging is enabled.\n     */\n    logging?: boolean;\n};\n\nconst DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Context for configuring react hooks.\n */\nexport const RequestHandlerContext = createContext<RequestHandlerContext>({\n    endpoint: DEFAULT_QUERY_ENDPOINT,\n    fetch: undefined,\n});\n\n/**\n * Context provider.\n */\nexport const Provider = RequestHandlerContext.Provider;\n\n/**\n * Hooks context.\n */\nexport function useHooksContext() {\n    const { endpoint, ...rest } = useContext(RequestHandlerContext);\n    return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\n/**\n * Regular query options.\n */\nexport type QueryOptions<Result, Error = unknown> = {\n    /**\n     * Disable data fetching\n     */\n    disabled?: boolean;\n\n    /**\n     * Whether to enable automatic optimistic update. Defaults to `true`.\n     */\n    optimisticUpdate?: boolean;\n} & Omit<SWRConfiguration<Result, Error, Fetcher<Result>>, 'fetcher'>;\n\n/**\n * Infinite query options.\n */\nexport type InfiniteQueryOptions<Result, Error = unknown> = {\n    /**\n     * Disable data fetching\n     */\n    disabled?: boolean;\n} & Omit<SWRInfiniteConfiguration<Result, Error, SWRInfiniteFetcher<Result>>, 'fetcher'>;\n\nconst QUERY_KEY_PREFIX = 'zenstack:query';\nconst MUTATION_KEY_PREFIX = 'zenstack:mutation';\n\ntype QueryKey = {\n    prefix: typeof QUERY_KEY_PREFIX;\n    model: string;\n    operation: string;\n    args?: unknown;\n    infinite?: boolean;\n    optimisticUpdate?: boolean;\n};\n\n/**\n * Result of optimistic data provider.\n */\nexport type OptimisticDataProviderResult = {\n    /**\n     * Kind of the result.\n     *   - Update: use the `data` field to update the query cache.\n     *   - Skip: skip the optimistic update for this query.\n     *   - ProceedDefault: proceed with the default optimistic update.\n     */\n    kind: 'Update' | 'Skip' | 'ProceedDefault';\n\n    /**\n     * Data to update the query cache. Only applicable if `kind` is 'Update'.\n     *\n     * If the data is an object with fields updated, it should have a `$optimistic`\n     * field set to `true`. If it's an array and an element object is created or updated,\n     * the element should have a `$optimistic` field set to `true`.\n     */\n    data?: any;\n};\n\n/**\n * Optimistic data provider.\n *\n * @param args Arguments.\n * @param args.queryModel The model of the query.\n * @param args.queryOperation The operation of the query, `findMany`, `count`, etc.\n * @param args.queryArgs The arguments of the query.\n * @param args.currentData The current cache data for the query.\n * @param args.mutationArgs The arguments of the mutation.\n */\nexport type OptimisticDataProvider = (args: {\n    queryModel: string;\n    queryOperation: string;\n    queryArgs: any;\n    currentData: any;\n    mutationArgs: any;\n}) => OptimisticDataProviderResult | Promise<OptimisticDataProviderResult>;\n\n/**\n * Mutation options.\n */\nexport type MutationOptions<Result, Error, Args> = {\n    /**\n     * Whether to automatically optimistic-update queries potentially impacted. Defaults to `false`.\n     */\n    optimisticUpdate?: boolean;\n\n    /**\n     * A callback for computing optimistic update data for each query cache entry.\n     */\n    optimisticDataProvider?: OptimisticDataProvider;\n} & Omit<SWRMutationConfiguration<Result, Error, string, Args>, 'fetcher'>;\n\n/**\n * Computes query key for the given model, operation, query args, and options.\n */\nexport function getQueryKey(\n    model: string,\n    operation: string,\n    args?: unknown,\n    infinite?: boolean,\n    optimisticUpdate?: boolean\n) {\n    return JSON.stringify({\n        prefix: QUERY_KEY_PREFIX,\n        model,\n        operation,\n        args,\n        infinite: infinite === true,\n        optimisticUpdate: optimisticUpdate !== false,\n    });\n}\n\nfunction getMutationKey(model: string, operation: string) {\n    // use a random key since we don't have 1:1 mapping between mutation and query\n    // https://github.com/vercel/swr/discussions/2461#discussioncomment-5281784\n    return JSON.stringify({ prefix: MUTATION_KEY_PREFIX, model, operation, r: Date.now() });\n}\n\nfunction parseQueryKey(key: unknown): QueryKey | undefined {\n    let keyValue: any = key;\n    if (typeof key === 'string') {\n        try {\n            keyValue = JSON.parse(key);\n        } catch {\n            return undefined;\n        }\n    }\n    return keyValue?.prefix === QUERY_KEY_PREFIX ? (keyValue as QueryKey) : undefined;\n}\n\n/**\n * Makes a model query with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param args The request args object, which will be superjson-stringified and appended as \"?q=\" parameter\n * @param options Query options\n * @returns SWR response\n */\nexport function useModelQuery<Result, Error = unknown>(\n    model: string,\n    operation: string,\n    args?: unknown,\n    options?: QueryOptions<Result, Error>\n): SWRResponse<Result, Error> {\n    const { endpoint, fetch } = useHooksContext();\n    const key = options?.disabled\n        ? null\n        : getQueryKey(model, operation, args, false, options?.optimisticUpdate !== false);\n    const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n    return useSWR<Result, Error>(key, () => fetcher<Result, false>(url, undefined, fetch, false), options);\n}\n\n/**\n * Function for computing the query args for fetching a page during an infinite query.\n */\nexport type GetNextArgs<Args, Result> = (pageIndex: number, previousPageData: Result | null) => Args | null;\n\n/**\n * Makes an infinite GET request with SWR.\n *\n * @param model Model name\n * @param operation Prisma operation (e.g, `findMany`)\n * @param getNextArgs Function for computing the query args for a page\n * @param options Query options\n * @returns SWR infinite query response\n */\nexport function useInfiniteModelQuery<Args, Result, Error = unknown>(\n    model: string,\n    operation: string,\n    getNextArgs: GetNextArgs<Args, any>,\n    options?: InfiniteQueryOptions<Result, Error>\n): SWRInfiniteResponse<Result, Error> {\n    const { endpoint, fetch } = useHooksContext();\n\n    const getKey = (pageIndex: number, previousPageData: Result | null) => {\n        if (options?.disabled) {\n            return null;\n        }\n        const nextArgs = getNextArgs(pageIndex, previousPageData);\n        return nextArgs !== null // null means reached the end\n            ? getQueryKey(model, operation, nextArgs, true, false)\n            : null;\n    };\n\n    return useSWRInfinite<Result, Error>(\n        getKey,\n        (key: unknown) => {\n            const parsedKey = parseQueryKey(key);\n            if (parsedKey) {\n                const { model, operation, args } = parsedKey;\n                const url = makeUrl(`${endpoint}/${lowerCaseFirst(model)}/${operation}`, args);\n                return fetcher<Result, false>(url, undefined, fetch, false);\n            } else {\n                throw new Error('Invalid query key: ' + key);\n            }\n        },\n        options\n    );\n}\n\nexport function useModelMutation<Args, Result, CheckReadBack extends boolean = boolean>(\n    model: string,\n    method: 'POST' | 'PUT' | 'DELETE',\n    operation: string,\n    modelMeta: ModelMeta,\n    options?: MutationOptions<CheckReadBack extends true ? Result | undefined : Result, unknown, Args>,\n    checkReadBack?: CheckReadBack\n) {\n    const { endpoint, fetch, logging } = useHooksContext();\n    const invalidate = options?.revalidate !== false ? useInvalidation(model, modelMeta) : undefined;\n    const { cache, mutate } = useSWRConfig();\n\n    return useSWRMutation(\n        getMutationKey(model, operation),\n        (_key, { arg }: { arg: any }) => {\n            if (options?.optimisticUpdate) {\n                optimisticUpdate(model, operation, arg, options, modelMeta, cache, mutate, logging);\n            }\n            const url = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n            return mutationRequest(method, url, arg, invalidate, fetch, checkReadBack);\n        },\n        options\n    );\n}\n\n/**\n * Makes a mutation request.\n *\n * @param url The request URL\n * @param data The request data\n * @param invalidate Function for invalidating a query\n */\nexport async function mutationRequest<Result, C extends boolean = boolean>(\n    method: 'POST' | 'PUT' | 'DELETE',\n    url: string,\n    data: unknown,\n    invalidate?: Invalidator,\n    fetch?: FetchFn,\n    checkReadBack?: C\n): Promise<C extends true ? Result | undefined : Result> {\n    const reqUrl = method === 'DELETE' ? makeUrl(url, data) : url;\n    const r = await fetcher<Result, C>(\n        reqUrl,\n        {\n            method,\n            headers: {\n                'content-type': 'application/json',\n            },\n            body: data ? marshal(data) : undefined,\n        },\n        fetch,\n        checkReadBack\n    );\n\n    if (invalidate) {\n        await invalidate(getOperationFromUrl(url), data);\n    }\n    return r;\n}\n\n// function for invalidating queries related to mutation represented by its operation and args\ntype Invalidator = (operation: string, args?: unknown) => ReturnType<ScopedMutator>;\n\nexport function useInvalidation(model: string, modelMeta: ModelMeta): Invalidator {\n    // https://swr.vercel.app/docs/advanced/cache#mutate-multiple-keys-from-regex\n    const { logging } = useHooksContext();\n    const { cache, mutate } = useSWRConfig();\n    return async (operation: string, args: unknown) => {\n        if (!(cache instanceof Map)) {\n            throw new Error('mutate requires the cache provider to be a Map instance');\n        }\n\n        const mutatedModels = await getMutatedModels(model, operation as PrismaWriteActionType, args, modelMeta);\n\n        const keys = Array.from(cache.keys()).filter((key: unknown) => {\n            const parsedKey = parseQueryKey(key);\n            if (!parsedKey) {\n                return false;\n            }\n            const modelsRead = getReadModels(parsedKey.model, modelMeta, parsedKey.args);\n            return modelsRead.some((m) => mutatedModels.includes(m));\n        });\n\n        if (logging) {\n            keys.forEach((key) => {\n                console.log(`Invalidating query ${key} due to mutation \"${model}.${operation}\"`);\n            });\n        }\n\n        const mutations = keys.map((key) => {\n            const parsedKey = parseQueryKey(key);\n            // FIX: special handling for infinite query keys, but still not working\n            // https://github.com/vercel/swr/discussions/2843\n            return mutate(parsedKey?.infinite ? unstable_serialize(() => key) : key);\n        });\n        return Promise.all(mutations);\n    };\n}\n\n/**\n * Makes fetch request for queries and mutations.\n */\nexport async function fetcher<R, C extends boolean>(\n    url: string,\n    options?: RequestInit,\n    customFetch?: FetchFn,\n    checkReadBack?: C\n): Promise<C extends true ? R | undefined : R> {\n    // Note: 'cross-fetch' is supposed to handle fetch compatibility\n    // but it doesn't work for cloudflare workers\n    const _fetch =\n        customFetch ??\n        // check if fetch is available globally\n        (typeof fetch === 'function'\n            ? fetch\n            : // fallback to 'cross-fetch' if otherwise\n              (await import('cross-fetch')).default);\n\n    const res = await _fetch(url, options);\n    if (!res.ok) {\n        const errData = unmarshal(await res.text());\n        if (\n            checkReadBack !== false &&\n            errData.error?.prisma &&\n            errData.error?.code === 'P2004' &&\n            errData.error?.reason === 'RESULT_NOT_READABLE'\n        ) {\n            // policy doesn't allow mutation result to be read back, just return undefined\n            return undefined as any;\n        }\n        const error: Error & { info?: unknown; status?: number } = new Error(\n            'An error occurred while fetching the data.'\n        );\n        error.info = errData.error;\n        error.status = res.status;\n        throw error;\n    }\n\n    const textResult = await res.text();\n    try {\n        return unmarshal(textResult).data as R;\n    } catch (err) {\n        console.error(`Unable to deserialize data:`, textResult);\n        throw err;\n    }\n}\n\nfunction marshal(value: unknown) {\n    const { data, meta } = serialize(value);\n    if (meta) {\n        return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n    } else {\n        return JSON.stringify(data);\n    }\n}\n\nfunction unmarshal(value: string) {\n    const parsed = JSON.parse(value);\n    if (typeof parsed === 'object' && parsed?.data && parsed?.meta?.serialization) {\n        const deserializedData = deserialize(parsed.data, parsed.meta.serialization);\n        return { ...parsed, data: deserializedData };\n    } else {\n        return parsed;\n    }\n}\n\nfunction makeUrl(url: string, args: unknown) {\n    if (!args) {\n        return url;\n    }\n\n    const { data, meta } = serialize(args);\n    let result = `${url}?q=${encodeURIComponent(JSON.stringify(data))}`;\n    if (meta) {\n        result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n    }\n    return result;\n}\n\nfunction getOperationFromUrl(url: string) {\n    const parts = url.split('/');\n    const r = parts.pop();\n    if (!r) {\n        throw new Error(`Invalid URL: ${url}`);\n    } else {\n        return r;\n    }\n}\n\nasync function optimisticUpdate(\n    mutationModel: string,\n    mutationOp: string,\n    mutationArgs: any,\n    options: MutationOptions<any, any, any> | undefined,\n    modelMeta: ModelMeta,\n    cache: Cache,\n    mutator: ScopedMutator,\n    logging = false\n) {\n    const optimisticPromises: Array<Promise<void>> = [];\n    for (const key of cache.keys()) {\n        const parsedKey = parseQueryKey(key);\n        if (!parsedKey) {\n            continue;\n        }\n\n        if (!parsedKey.optimisticUpdate) {\n            if (logging) {\n                console.log(`Skipping optimistic update for ${key} due to opt-out`);\n            }\n            continue;\n        }\n\n        const cacheValue = cache.get(key);\n        if (cacheValue?.error) {\n            if (logging) {\n                console.warn(`Skipping optimistic update for ${key} due to error:`, cacheValue.error);\n            }\n            continue;\n        }\n\n        if (options?.optimisticDataProvider) {\n            const providerResult = await options.optimisticDataProvider({\n                queryModel: parsedKey.model,\n                queryOperation: parsedKey.operation,\n                queryArgs: parsedKey.args,\n                currentData: cacheValue?.data,\n                mutationArgs,\n            });\n\n            if (providerResult?.kind === 'Skip') {\n                if (logging) {\n                    console.log(`Skipping optimistic update for ${key} due to custom provider`);\n                }\n                continue;\n            } else if (providerResult?.kind === 'Update') {\n                if (logging) {\n                    console.log(`Optimistically updating query ${JSON.stringify(key)} due to provider`);\n                }\n                optimisticPromises.push(mutator(key, providerResult.data, { revalidate: false }));\n                continue;\n            }\n        }\n\n        if (!cacheValue) {\n            continue;\n        }\n\n        const mutatedData = await applyMutation(\n            parsedKey.model,\n            parsedKey.operation,\n            cacheValue.data,\n            mutationModel,\n            mutationOp as PrismaWriteActionType,\n            mutationArgs,\n            modelMeta,\n            logging\n        );\n\n        if (mutatedData !== undefined) {\n            // mutation applicable to this query, update cache\n            if (logging) {\n                console.log(\n                    `Optimistically updating query ${JSON.stringify(\n                        key\n                    )} due to mutation \"${mutationModel}.${mutationOp}\"`\n                );\n            }\n            optimisticPromises.push(\n                mutator(key, mutatedData, {\n                    // don't trigger revalidation here since we will do it\n                    // when the remote mutation succeeds\n                    revalidate: false,\n                })\n            );\n        }\n    }\n\n    return Promise.all(optimisticPromises);\n}\n"],"mappings":"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","names":["optimisticUpdate","fetch","model","operation"]}