@zenstackhq/tanstack-query 3.0.0-beta.18 → 3.0.0-beta.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +20 -20
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +4 -4
- package/dist/react.d.ts +4 -4
- package/dist/react.js.map +1 -1
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.d.cts +3 -3
- package/dist/svelte.d.ts +3 -3
- package/dist/svelte.js.map +1 -1
- package/dist/{types-BRIDXxNC.d.cts → types-C8iIZD-7.d.cts} +8 -1
- package/dist/{types-BRIDXxNC.d.ts → types-C8iIZD-7.d.ts} +8 -1
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +3 -3
- package/dist/vue.d.ts +3 -3
- package/dist/vue.js.map +1 -1
- package/package.json +9 -9
- package/src/react.ts +5 -3
- package/src/svelte.ts +4 -2
- package/src/utils/types.ts +11 -0
- package/src/vue.ts +2 -2
- package/test/react-typing-test.ts +4 -0
- package/test/svelte-typing-test.ts +5 -0
- package/test/vue-typing-test.ts +4 -0
package/dist/vue.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vue.ts","../src/utils/common.ts","../src/utils/mutator.ts","../src/utils/nested-write-visitor.ts","../src/utils/types.ts","../src/utils/nested-read-visitor.ts","../src/utils/query-analysis.ts","../src/utils/serialization.ts"],"sourcesContent":["import {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type DefaultError,\n type InfiniteData,\n type QueryKey,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryReturnType,\n type UseMutationOptions,\n type UseMutationReturnType,\n type UseQueryOptions,\n type UseQueryReturnType,\n} from '@tanstack/vue-query';\nimport { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type {\n AggregateArgs,\n AggregateResult,\n BatchResult,\n CountArgs,\n CountResult,\n CreateArgs,\n CreateManyAndReturnArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindArgs,\n FindUniqueArgs,\n GroupByArgs,\n GroupByResult,\n ModelResult,\n SelectIncludeOmit,\n SelectSubset,\n Subset,\n UpdateArgs,\n UpdateManyAndReturnArgs,\n UpdateManyArgs,\n UpsertArgs,\n} from '@zenstackhq/orm';\nimport type { GetModels, SchemaDef } from '@zenstackhq/schema';\nimport { inject, provide, toValue, type MaybeRefOrGetter, type UnwrapRef } from 'vue';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n type ExtraMutationOptions,\n type ExtraQueryOptions,\n} from './utils/common';\nimport type { TrimDelegateModelOperations } from './utils/types';\n\nexport type { FetchFn } from './utils/common';\nexport const VueQueryContextKey = 'zenstack-vue-query-context';\n\n/**\n * Provide context for query settings.\n *\n * @deprecated Use {@link provideQuerySettingsContext} instead.\n */\nexport function provideHooksContext(context: APIContext) {\n provide<APIContext>(VueQueryContextKey, context);\n}\n\n/**\n * Provide context for query settings.\n */\nexport function provideQuerySettingsContext(context: APIContext) {\n provide<APIContext>(VueQueryContextKey, context);\n}\n\nfunction getQuerySettings() {\n const { endpoint, ...rest } = inject<APIContext>(VueQueryContextKey, {\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n });\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\nexport type ModelQueryOptions<T> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseQueryOptions<T, DefaultError>>, 'queryKey'> & ExtraQueryOptions\n>;\n\nexport type ModelQueryResult<T> = UseQueryReturnType<T, DefaultError> & { queryKey: QueryKey };\n\nexport type ModelInfiniteQueryOptions<T> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>>, 'queryKey' | 'initialPageParam'>\n>;\n\nexport type ModelInfiniteQueryResult<T> = UseInfiniteQueryReturnType<T, DefaultError> & { queryKey: QueryKey };\n\nexport type ModelMutationOptions<T, TArgs> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseMutationOptions<T, DefaultError, TArgs>>, 'mutationFn'> & ExtraMutationOptions\n>;\n\nexport type ModelMutationResult<T, TArgs> = UseMutationReturnType<T, DefaultError, TArgs, unknown>;\n\nexport type ModelMutationModelResult<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n TArgs extends SelectIncludeOmit<Schema, Model, boolean>,\n Array extends boolean = false,\n> = Omit<ModelMutationResult<ModelResult<Schema, Model, TArgs>, TArgs>, 'mutateAsync'> & {\n mutateAsync<T extends TArgs>(\n args: T,\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): Promise<Array extends true ? ModelResult<Schema, Model, T>[] : ModelResult<Schema, Model, T>>;\n};\n\nexport type ClientHooks<Schema extends SchemaDef> = {\n [Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model>;\n};\n\n// Note that we can potentially use TypeScript's mapped type to directly map from ORM contract, but that seems\n// to significantly slow down tsc performance ...\nexport type ModelQueryHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = TrimDelegateModelOperations<\n Schema,\n Model,\n {\n useFindUnique<T extends FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,\n ): ModelQueryResult<ModelResult<Schema, Model, T> | null>;\n\n useFindFirst<T extends FindArgs<Schema, Model, false>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, false>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,\n ): ModelQueryResult<ModelResult<Schema, Model, T> | null>;\n\n useFindMany<T extends FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T>[]>,\n ): ModelQueryResult<ModelResult<Schema, Model, T>[]>;\n\n useInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n options?: ModelInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,\n ): ModelInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;\n\n useCreate<T extends CreateArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useCreateMany<T extends CreateManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,\n ): ModelMutationModelResult<Schema, Model, T, true>;\n\n useUpdate<T extends UpdateArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,\n ): ModelMutationModelResult<Schema, Model, T, true>;\n\n useUpsert<T extends UpsertArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useDelete<T extends DeleteArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useCount<T extends CountArgs<Schema, Model>>(\n args?: Subset<T, CountArgs<Schema, Model>>,\n options?: ModelQueryOptions<CountResult<Schema, Model, T>>,\n ): ModelQueryResult<CountResult<Schema, Model, T>>;\n\n useAggregate<T extends AggregateArgs<Schema, Model>>(\n args: Subset<T, AggregateArgs<Schema, Model>>,\n options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,\n ): ModelQueryResult<AggregateResult<Schema, Model, T>>;\n\n useGroupBy<T extends GroupByArgs<Schema, Model>>(\n args: Subset<T, GroupByArgs<Schema, Model>>,\n options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,\n ): ModelQueryResult<GroupByResult<Schema, Model, T>>;\n }\n>;\n\n/**\n * Gets data query hooks for all models in the schema.\n */\nexport function useClientQueries<Schema extends SchemaDef>(schema: Schema): ClientHooks<Schema> {\n return Object.keys(schema.models).reduce((acc, model) => {\n (acc as any)[lowerCaseFirst(model)] = useModelQueries(schema, model as GetModels<Schema>);\n return acc;\n }, {} as ClientHooks<Schema>);\n}\n\n/**\n * Gets data query hooks for a specific model in the schema.\n */\nexport function useModelQueries<Schema extends SchemaDef, Model extends GetModels<Schema>>(\n schema: Schema,\n model: Model,\n): ModelQueryHooks<Schema, Model> {\n const modelDef = Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());\n if (!modelDef) {\n throw new Error(`Model \"${model}\" not found in schema`);\n }\n\n const modelName = modelDef.name;\n\n return {\n useFindUnique: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findUnique', args, options);\n },\n\n useFindFirst: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findFirst', args, options);\n },\n\n useFindMany: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findMany', args, options);\n },\n\n useInfiniteFindMany: (args: any, options?: any) => {\n return useInternalInfiniteQuery(schema, modelName, 'findMany', args, options);\n },\n\n useCreate: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'create', options);\n },\n\n useCreateMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'createMany', options);\n },\n\n useCreateManyAndReturn: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'createManyAndReturn', options);\n },\n\n useUpdate: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'update', options);\n },\n\n useUpdateMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'updateMany', options);\n },\n\n useUpdateManyAndReturn: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'updateManyAndReturn', options);\n },\n\n useUpsert: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'upsert', options);\n },\n\n useDelete: (options?: any) => {\n return useInternalMutation(schema, modelName, 'DELETE', 'delete', options);\n },\n\n useDeleteMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'DELETE', 'deleteMany', options);\n },\n\n useCount: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'count', args, options);\n },\n\n useAggregate: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'aggregate', args, options);\n },\n\n useGroupBy: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'groupBy', args, options);\n },\n } as ModelQueryHooks<Schema, Model>;\n}\n\nexport function useInternalQuery<TQueryFnData, TData>(\n _schema: SchemaDef,\n model: string,\n operation: string,\n args?: MaybeRefOrGetter<unknown>,\n options?: MaybeRefOrGetter<\n Omit<UnwrapRef<UseQueryOptions<TQueryFnData, DefaultError, TData>>, 'queryKey'> & ExtraQueryOptions\n >,\n) {\n const argsValue = toValue(args);\n const { optimisticUpdate, ...restOptions } = toValue(options) ?? {};\n const queryKey = getQueryKey(model, operation, argsValue, {\n infinite: false,\n optimisticUpdate: optimisticUpdate !== false,\n });\n const { endpoint, fetch } = getQuerySettings();\n\n const finalOptions: any = {\n queryKey,\n queryFn: ({ queryKey, signal }: any) => {\n const [_prefix, _model, _op, args] = queryKey;\n const reqUrl = makeUrl(endpoint, model, operation, args);\n return fetcher<TQueryFnData>(reqUrl, { signal }, fetch);\n },\n ...restOptions,\n };\n return { queryKey, ...useQuery<TQueryFnData, DefaultError, TData>(finalOptions) };\n}\n\nexport function useInternalInfiniteQuery<TQueryFnData, TData>(\n _schema: SchemaDef,\n model: string,\n operation: string,\n args: MaybeRefOrGetter<unknown>,\n options:\n | MaybeRefOrGetter<\n Omit<\n UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>>,\n 'queryKey' | 'initialPageParam'\n >\n >\n | undefined,\n) {\n options = options ?? { getNextPageParam: () => undefined };\n const { endpoint, fetch } = getQuerySettings();\n const argsValue = toValue(args);\n const optionsValue = toValue(options);\n const queryKey = getQueryKey(model, operation, argsValue, { infinite: true, optimisticUpdate: false });\n\n const finalOptions: any = {\n queryKey,\n queryFn: ({ queryKey, signal }: any) => {\n const [_prefix, _model, _op, args] = queryKey;\n const reqUrl = makeUrl(endpoint, model, operation, args);\n return fetcher<TQueryFnData>(reqUrl, { signal }, fetch);\n },\n initialPageParam: argsValue,\n ...optionsValue,\n };\n return {\n queryKey,\n ...useInfiniteQuery(finalOptions),\n };\n}\n\n/**\n * Creates a vue-query mutation\n *\n * @private\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param operation The mutation operation (e.g. `create`).\n * @param options The vue-query options.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n */\nexport function useInternalMutation<TArgs, R = any>(\n schema: SchemaDef,\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n options?: MaybeRefOrGetter<\n Omit<UnwrapRef<UseMutationOptions<R, DefaultError, TArgs>>, 'mutationFn'> & ExtraMutationOptions\n >,\n) {\n const { endpoint, fetch, logging } = getQuerySettings();\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl =\n method === 'DELETE' ? makeUrl(endpoint, model, operation, data) : makeUrl(endpoint, model, operation);\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>(reqUrl, fetchInit, fetch) as Promise<R>;\n };\n\n const optionsValue = toValue(options);\n const finalOptions: any = { ...optionsValue, mutationFn };\n const invalidateQueries = optionsValue?.invalidateQueries !== false;\n const optimisticUpdate = !!optionsValue?.optimisticUpdate;\n\n if (operation) {\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n schema,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging,\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n schema,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => {\n // update query cache\n queryClient.setQueryData<unknown>(queryKey, data);\n // cancel on-flight queries to avoid redundant cache updates,\n // the settlement of the current mutation will trigger a new revalidation\n queryClient.cancelQueries({ queryKey }, { revert: false, silent: true });\n },\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging,\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","import { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type { SchemaDef } from '@zenstackhq/schema';\nimport { applyMutation } from './mutator';\nimport { getMutatedModels, getReadModels } from './query-analysis';\nimport { deserialize, serialize } from './serialization';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * 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 * Extra mutation options.\n */\nexport type ExtraMutationOptions = {\n /**\n * Whether to automatically invalidate queries potentially affected by the mutation. Defaults to `true`.\n */\n invalidateQueries?: boolean;\n\n /**\n * Whether to optimistically update queries potentially affected by the mutation. 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};\n\n/**\n * Extra query options.\n */\nexport type ExtraQueryOptions = {\n /**\n * Whether to opt-in to optimistic updates for this query. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nexport async function fetcher<R>(url: string, options?: RequestInit, customFetch?: FetchFn): Promise<R> {\n const _fetch = customFetch ?? fetch;\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (errData.error?.rejectedByPolicy && errData.error?.rejectReason === 'cannot-read-back') {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: QueryError = new Error('An error occurred while fetching the data.');\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */,\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param operation Query 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 Query arguments.\n * @param options Query options, including `infinite` indicating if it's an infinite query (defaults to false), and `optimisticUpdate` indicating if optimistic updates are enabled (defaults to true).\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args: unknown,\n options: { infinite: boolean; optimisticUpdate: boolean } = { infinite: false, optimisticUpdate: true },\n): QueryKey {\n const infinite = options.infinite;\n // infinite query doesn't support optimistic updates\n const optimisticUpdate = options.infinite ? false : options.optimisticUpdate;\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function makeUrl(endpoint: string, model: string, operation: string, args?: unknown) {\n const baseUrl = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n if (!args) {\n return baseUrl;\n }\n\n const { data, meta } = serialize(args);\n let result = `${baseUrl}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n schema: SchemaDef,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false,\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as ORMWriteActionType,\n variables,\n schema,\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: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging = false,\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, schema);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, schema, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`,\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], schema: SchemaDef, args: any) {\n const modelsRead = getReadModels(visitingModel, schema, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\n/**\n * Sets up optimistic update and invalidation (after settled) for a mutation.\n */\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n schema: SchemaDef,\n options: MutationOptions & ExtraMutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false,\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as ORMWriteActionType,\n variables,\n options,\n schema,\n queryCache,\n setCache,\n logging,\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as ORMWriteActionType,\n variables,\n schema,\n logging,\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions & ExtraMutationOptions,\n schema: SchemaDef,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false,\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (!isZenStackQueryKey(queryKey)) {\n // skip non-zenstack queries\n continue;\n }\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOperation, queryArgs, queryOptions] = queryKey;\n if (!queryOptions?.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n if (options.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel,\n queryOperation,\n queryArgs,\n currentData: data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n // skip\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n // update cache\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(queryKey)} due to provider`);\n }\n setCache(queryKey, providerResult.data);\n continue;\n }\n }\n\n // proceed with default optimistic update\n const mutatedData = await applyMutation(\n queryModel,\n queryOperation,\n data,\n mutationModel,\n mutationOp as ORMWriteActionType,\n mutationArgs,\n schema,\n logging,\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n queryKey,\n )} due to mutation \"${mutationModel}.${mutationOp}\"`,\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n\nfunction isZenStackQueryKey(queryKey: readonly unknown[]): queryKey is QueryKey {\n if (queryKey.length < 5) {\n return false;\n }\n\n if (queryKey[0] !== QUERY_KEY_PREFIX) {\n return false;\n }\n\n return true;\n}\n","import { clone, enumerate, invariant, zip } from '@zenstackhq/common-helpers';\nimport type { FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * Tries to apply a mutation to a query result.\n *\n * @param queryModel the model of the query\n * @param queryOp the operation of the query\n * @param queryData the result data of the query\n * @param mutationModel the model of the mutation\n * @param mutationOp the operation of the mutation\n * @param mutationArgs the arguments of the mutation\n * @param schema the model metadata\n * @param logging whether to log the mutation application\n * @returns the updated query data if the mutation is applicable, otherwise undefined\n */\nexport async function applyMutation(\n queryModel: string,\n queryOp: string,\n queryData: any,\n mutationModel: string,\n mutationOp: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n if (!queryData || (typeof queryData !== 'object' && !Array.isArray(queryData))) {\n return undefined;\n }\n\n if (!queryOp.startsWith('find')) {\n // only findXXX results are applicable\n return undefined;\n }\n\n return await doApplyMutation(queryModel, queryData, mutationModel, mutationOp, mutationArgs, schema, logging);\n}\n\nasync function doApplyMutation(\n queryModel: string,\n queryData: any,\n mutationModel: string,\n mutationOp: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(schema, {\n create: (model, args) => {\n if (\n model === queryModel &&\n Array.isArray(resultData) // \"create\" mutation is only relevant for arrays\n ) {\n const r = createMutate(queryModel, resultData, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (\n model === queryModel &&\n args?.data &&\n Array.isArray(resultData) // \"createMany\" mutation is only relevant for arrays\n ) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, resultData, oneArg, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n if (\n model === queryModel &&\n !Array.isArray(resultData) // array elements will be handled with recursion\n ) {\n const r = updateMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n upsert: (model, args) => {\n if (model === queryModel && args?.where && args?.create && args?.update) {\n const r = upsertMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n delete: (model, args) => {\n if (model === queryModel) {\n const r = deleteMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n });\n\n await visitor.visit(mutationModel, mutationOp, mutationArgs);\n\n const modelFields = schema.models[queryModel]?.fields;\n invariant(modelFields, `Model ${queryModel} not found in schema`);\n\n if (Array.isArray(resultData)) {\n // try to apply mutation to each item in the array, replicate the entire\n // array if any item is updated\n\n let arrayCloned = false;\n for (let i = 0; i < resultData.length; i++) {\n const item = resultData[i];\n if (\n !item ||\n typeof item !== 'object' ||\n item.$optimistic // skip items already optimistically updated\n ) {\n continue;\n }\n\n const r = await doApplyMutation(queryModel, item, mutationModel, mutationOp, mutationArgs, schema, logging);\n\n if (r && typeof r === 'object') {\n if (!arrayCloned) {\n resultData = [...resultData];\n arrayCloned = true;\n }\n resultData[i] = r;\n updated = true;\n }\n }\n } else if (resultData !== null && typeof resultData === 'object') {\n // Clone resultData to prevent mutations affecting the loop\n const currentData = { ...resultData };\n\n // iterate over each field and apply mutation to nested data models\n for (const [key, value] of Object.entries(currentData)) {\n const fieldDef = modelFields[key];\n if (!fieldDef?.relation) {\n continue;\n }\n\n const r = await doApplyMutation(\n fieldDef.type,\n value,\n mutationModel,\n mutationOp,\n mutationArgs,\n schema,\n logging,\n );\n\n if (r && typeof r === 'object') {\n resultData = { ...resultData, [key]: r };\n updated = true;\n }\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(queryModel: string, currentData: any, newData: any, schema: SchemaDef, logging: boolean) {\n if (!newData) {\n return undefined;\n }\n\n const modelFields = schema.models[queryModel]?.fields;\n if (!modelFields) {\n return undefined;\n }\n\n const insert: any = {};\n const newDataFields = Object.keys(newData);\n\n Object.entries(modelFields).forEach(([name, field]) => {\n if (field.relation && newData[name]) {\n // deal with \"connect\"\n assignForeignKeyFields(field, insert, newData[name]);\n return;\n }\n\n if (newDataFields.includes(name)) {\n insert[name] = clone(newData[name]);\n } else {\n const defaultAttr = field.attributes?.find((attr) => attr.name === '@default');\n if (field.type === 'DateTime') {\n // default value for DateTime field\n if (defaultAttr || field.attributes?.some((attr) => attr.name === '@updatedAt')) {\n insert[name] = new Date();\n return;\n }\n }\n\n const defaultArg = defaultAttr?.args?.[0]?.value;\n if (defaultArg?.kind === 'literal') {\n // other default value\n insert[name] = defaultArg.value;\n }\n }\n });\n\n // add temp id value\n const idFields = getIdFields(schema, queryModel);\n idFields.forEach((f) => {\n if (insert[f.name] === undefined) {\n if (f.type === 'Int' || f.type === 'BigInt') {\n const currMax = Array.isArray(currentData)\n ? Math.max(\n ...[...currentData].map((item) => {\n const idv = parseInt(item[f.name]);\n return isNaN(idv) ? 0 : idv;\n }),\n )\n : 0;\n insert[f.name] = currMax + 1;\n } else {\n insert[f.name] = crypto.randomUUID();\n }\n }\n });\n\n insert.$optimistic = true;\n\n if (logging) {\n console.log(`Optimistic create for ${queryModel}:`, insert);\n }\n return [insert, ...(Array.isArray(currentData) ? currentData : [])];\n}\n\nfunction updateMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n if (!currentData || typeof currentData !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.where || typeof mutateArgs.where !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.data || typeof mutateArgs.data !== 'object') {\n return undefined;\n }\n\n if (!idFieldsMatch(mutateModel, currentData, mutateArgs.where, schema)) {\n return undefined;\n }\n\n const modelFields = schema.models[queryModel]?.fields;\n if (!modelFields) {\n return undefined;\n }\n\n let updated = false;\n let resultData = currentData;\n\n for (const [key, value] of Object.entries<any>(mutateArgs.data)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.relation && !value?.connect) {\n // relation field but without \"connect\"\n continue;\n }\n\n if (!updated) {\n // clone\n resultData = { ...currentData };\n }\n\n if (fieldInfo.relation) {\n // deal with \"connect\"\n assignForeignKeyFields(fieldInfo, resultData, value);\n } else {\n resultData[key] = clone(value);\n }\n resultData.$optimistic = true;\n updated = true;\n\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, resultData);\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction upsertMutate(\n queryModel: string,\n currentData: any,\n model: string,\n args: { where: object; create: any; update: any },\n schema: SchemaDef,\n logging: boolean,\n) {\n let updated = false;\n let resultData = currentData;\n\n if (Array.isArray(resultData)) {\n // check if we should create or update\n const foundIndex = resultData.findIndex((x) => idFieldsMatch(model, x, args.where, schema));\n if (foundIndex >= 0) {\n const updateResult = updateMutate(\n queryModel,\n resultData[foundIndex],\n model,\n { where: args.where, data: args.update },\n schema,\n logging,\n );\n if (updateResult) {\n // replace the found item with updated item\n resultData = [...resultData.slice(0, foundIndex), updateResult, ...resultData.slice(foundIndex + 1)];\n updated = true;\n }\n } else {\n const createResult = createMutate(queryModel, resultData, args.create, schema, logging);\n if (createResult) {\n resultData = createResult;\n updated = true;\n }\n }\n } else {\n // try update only\n const updateResult = updateMutate(\n queryModel,\n resultData,\n model,\n { where: args.where, data: args.update },\n schema,\n logging,\n );\n if (updateResult) {\n resultData = updateResult;\n updated = true;\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction deleteMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n // TODO: handle mutation of nested reads?\n\n if (!currentData || !mutateArgs) {\n return undefined;\n }\n\n if (queryModel !== mutateModel) {\n return undefined;\n }\n\n let updated = false;\n let result = currentData;\n\n if (Array.isArray(currentData)) {\n for (const item of currentData) {\n if (idFieldsMatch(mutateModel, item, mutateArgs, schema)) {\n result = (result as unknown[]).filter((x) => x !== item);\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, item);\n }\n }\n }\n } else {\n if (idFieldsMatch(mutateModel, currentData, mutateArgs, schema)) {\n result = null;\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, currentData);\n }\n }\n }\n\n return updated ? result : undefined;\n}\n\nfunction idFieldsMatch(model: string, x: any, y: any, schema: SchemaDef) {\n if (!x || !y || typeof x !== 'object' || typeof y !== 'object') {\n return false;\n }\n const idFields = getIdFields(schema, model);\n if (idFields.length === 0) {\n return false;\n }\n return idFields.every((f) => x[f.name] === y[f.name]);\n}\n\nfunction assignForeignKeyFields(field: FieldDef, resultData: any, mutationData: any) {\n // convert \"connect\" like `{ connect: { id: '...' } }` to foreign key fields\n // assignment: `{ userId: '...' }`\n if (!mutationData?.connect) {\n return;\n }\n\n if (!field.relation?.fields || !field.relation.references) {\n return;\n }\n\n for (const [idField, fkField] of zip(field.relation.references, field.relation.fields)) {\n if (idField in mutationData.connect) {\n resultData[fkField] = mutationData.connect[idField];\n }\n }\n}\n\nfunction getIdFields(schema: SchemaDef, model: string) {\n return (schema.models[model]?.idFields ?? []).map((f) => schema.models[model]!.fields[f]!);\n}\n","import { enumerate } from '@zenstackhq/common-helpers';\nimport type { FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport { ORMWriteActions, type MaybePromise, type ORMWriteActionType } from './types';\n\ntype NestingPathItem = { field?: FieldDef; model: string; where: any; unique: boolean };\n\n/**\n * Context for visiting\n */\nexport type NestedWriteVisitorContext = {\n /**\n * Parent data, can be used to replace fields\n */\n parent: any;\n\n /**\n * Current field, undefined if toplevel\n */\n field?: FieldDef;\n\n /**\n * A top-down path of all nested update conditions and corresponding field till now\n */\n nestingPath: NestingPathItem[];\n};\n\n/**\n * NestedWriteVisitor's callback actions. A call back function should return true or void to indicate\n * that the visitor should continue traversing its children, or false to stop. It can also return an object\n * to let the visitor traverse it instead of its original children.\n */\nexport type NestedWriterVisitorCallback = {\n create?: (model: string, data: any, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n createMany?: (\n model: string,\n args: { data: any; skipDuplicates?: boolean },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n connectOrCreate?: (\n model: string,\n args: { where: object; create: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n connect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n disconnect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n set?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n update?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n updateMany?: (\n model: string,\n args: { where?: object; data: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n upsert?: (\n model: string,\n args: { where: object; create: any; update: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n delete?: (\n model: string,\n args: object | boolean,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n deleteMany?: (\n model: string,\n args: any | object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n field?: (\n field: FieldDef,\n action: ORMWriteActionType,\n data: any,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<void>;\n};\n\n/**\n * Recursive visitor for nested write (create/update) payload.\n */\nexport class NestedWriteVisitor {\n constructor(\n private readonly schema: SchemaDef,\n private readonly callback: NestedWriterVisitorCallback,\n ) {}\n\n private isWriteAction(value: string): value is ORMWriteActionType {\n return ORMWriteActions.includes(value as ORMWriteActionType);\n }\n\n /**\n * Start visiting\n *\n * @see NestedWriterVisitorCallback\n */\n async visit(model: string, action: ORMWriteActionType, args: any): Promise<void> {\n if (!args) {\n return;\n }\n\n let topData = args;\n\n switch (action) {\n // create has its data wrapped in 'data' field\n case 'create':\n topData = topData.data;\n break;\n\n case 'delete':\n case 'deleteMany':\n topData = topData.where;\n break;\n }\n\n await this.doVisit(model, action, topData, undefined, undefined, []);\n }\n\n private async doVisit(\n model: string,\n action: ORMWriteActionType,\n data: any,\n parent: any,\n field: FieldDef | undefined,\n nestingPath: NestingPathItem[],\n ): Promise<void> {\n if (!data) {\n return;\n }\n\n const toplevel = field == undefined;\n\n const context = { parent, field, nestingPath: [...nestingPath] };\n const pushNewContext = (field: FieldDef | undefined, model: string, where: any, unique = false) => {\n return { ...context, nestingPath: [...context.nestingPath, { field, model, where, unique }] };\n };\n\n // visit payload\n switch (action) {\n case 'create':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.create) {\n callbackResult = await this.callback.create(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'createMany':\n case 'createManyAndReturn':\n {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.createMany) {\n callbackResult = await this.callback.createMany(model, data, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : data.data;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connectOrCreate':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.connectOrCreate) {\n callbackResult = await this.callback.connectOrCreate(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item.create;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connect':\n if (this.callback.connect) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.connect(model, item, newContext);\n }\n }\n break;\n\n case 'disconnect':\n // disconnect has two forms:\n // if relation is to-many, the payload is a unique filter object\n // if relation is to-one, the payload can only be boolean `true`\n if (this.callback.disconnect) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, typeof item === 'object');\n await this.callback.disconnect(model, item, newContext);\n }\n }\n break;\n\n case 'set':\n if (this.callback.set) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.set(model, item, newContext);\n }\n }\n break;\n\n case 'update':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.update) {\n callbackResult = await this.callback.update(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload =\n typeof callbackResult === 'object'\n ? callbackResult\n : typeof item.data === 'object'\n ? item.data\n : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'updateMany':\n case 'updateManyAndReturn':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.updateMany) {\n callbackResult = await this.callback.updateMany(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'upsert': {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.upsert) {\n callbackResult = await this.callback.upsert(model, item, newContext);\n }\n if (callbackResult !== false) {\n if (typeof callbackResult === 'object') {\n await this.visitSubPayload(model, action, callbackResult, newContext.nestingPath);\n } else {\n await this.visitSubPayload(model, action, item.create, newContext.nestingPath);\n await this.visitSubPayload(model, action, item.update, newContext.nestingPath);\n }\n }\n }\n break;\n }\n\n case 'delete': {\n if (this.callback.delete) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.delete(model, item, newContext);\n }\n }\n break;\n }\n\n case 'deleteMany':\n if (this.callback.deleteMany) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.deleteMany(model, item, newContext);\n }\n }\n break;\n\n default: {\n throw new Error(`unhandled action type ${action}`);\n }\n }\n }\n\n private async visitSubPayload(\n model: string,\n action: ORMWriteActionType,\n payload: any,\n nestingPath: NestingPathItem[],\n ) {\n for (const item of enumerate(payload)) {\n if (!item || typeof item !== 'object') {\n continue;\n }\n for (const field of Object.keys(item)) {\n const fieldDef = this.schema.models[model]?.fields[field];\n if (!fieldDef) {\n continue;\n }\n\n if (fieldDef.relation) {\n if (item[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(item[field])) {\n if (this.isWriteAction(subAction) && subData) {\n await this.doVisit(fieldDef.type, subAction, subData, item[field], fieldDef, [\n ...nestingPath,\n ]);\n }\n }\n }\n } else {\n // visit plain field\n if (this.callback.field) {\n await this.callback.field(fieldDef, action, item[field], {\n parent: item,\n nestingPath,\n field: fieldDef,\n });\n }\n }\n }\n }\n }\n\n // enumerate a (possible) array in reverse order, so that the enumeration\n // callback can safely delete the current item\n private *enumerateReverse(data: any) {\n if (Array.isArray(data)) {\n for (let i = data.length - 1; i >= 0; i--) {\n yield data[i];\n }\n } else {\n yield data;\n }\n }\n}\n","import type { OperationsIneligibleForDelegateModels } from '@zenstackhq/orm';\nimport type { GetModels, IsDelegateModel, SchemaDef } from '@zenstackhq/schema';\n\nexport type MaybePromise<T> = T | Promise<T> | PromiseLike<T>;\n\nexport const ORMWriteActions = [\n 'create',\n 'createMany',\n 'createManyAndReturn',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'updateManyAndReturn',\n 'upsert',\n 'connect',\n 'disconnect',\n 'set',\n 'delete',\n 'deleteMany',\n] as const;\n\nexport type ORMWriteActionType = (typeof ORMWriteActions)[number];\n\ntype HooksOperationsIneligibleForDelegateModels = OperationsIneligibleForDelegateModels extends any\n ? `use${Capitalize<OperationsIneligibleForDelegateModels>}`\n : never;\n\nexport type TrimDelegateModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n T extends Record<string, unknown>,\n> = IsDelegateModel<Schema, Model> extends true ? Omit<T, HooksOperationsIneligibleForDelegateModels> : T;\n","import type { FieldDef, SchemaDef } from '@zenstackhq/schema';\n\nexport type NestedReadVisitorCallback = {\n field?: (\n model: string,\n field: FieldDef | undefined,\n kind: 'include' | 'select' | undefined,\n args: unknown,\n ) => void | boolean;\n};\n\n/**\n * Visitor for nested read payload.\n */\nexport class NestedReadVisitor {\n constructor(\n private readonly schema: SchemaDef,\n private readonly callback: NestedReadVisitorCallback,\n ) {}\n\n doVisit(model: string, field: FieldDef | undefined, kind: 'include' | 'select' | undefined, args: unknown) {\n if (this.callback.field) {\n const r = this.callback.field(model, field, kind, args);\n if (r === false) {\n return;\n }\n }\n\n if (!args || typeof args !== 'object') {\n return;\n }\n\n let selectInclude: any;\n let nextKind: 'select' | 'include' | undefined;\n if ((args as any).select) {\n selectInclude = (args as any).select;\n nextKind = 'select';\n } else if ((args as any).include) {\n selectInclude = (args as any).include;\n nextKind = 'include';\n }\n\n if (selectInclude && typeof selectInclude === 'object') {\n for (const [k, v] of Object.entries(selectInclude)) {\n if (k === '_count' && typeof v === 'object' && v) {\n // recurse into { _count: { ... } }\n this.doVisit(model, field, kind, v);\n } else {\n const field = this.schema.models[model]?.fields[k];\n if (field) {\n this.doVisit(field.type, field, nextKind, v);\n }\n }\n }\n }\n }\n\n visit(model: string, args: unknown) {\n this.doVisit(model, undefined, undefined, args);\n }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { NestedReadVisitor } from './nested-read-visitor';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * Gets models read (including nested ones) given a query args.\n * @param model\n * @param targetModels\n * @param schema\n * @param args\n * @returns\n */\nexport function getReadModels(model: string, schema: SchemaDef, args: any) {\n const result = new Set<string>();\n result.add(model);\n const visitor = new NestedReadVisitor(schema, {\n field: (model) => {\n result.add(model);\n return true;\n },\n });\n visitor.visit(model, args);\n return [...result];\n}\n\n/**\n * Gets mutated models (including nested ones) given a mutation args.\n */\nexport async function getMutatedModels(\n model: string,\n operation: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n) {\n const result = new Set<string>();\n result.add(model);\n\n if (mutationArgs) {\n const addModel = (model: string) => void result.add(model);\n\n // add models that are cascaded deleted recursively\n const addCascades = (model: string) => {\n const cascades = new Set<string>();\n const visited = new Set<string>();\n collectDeleteCascades(model, schema, cascades, visited);\n cascades.forEach((m) => addModel(m));\n };\n\n const visitor = new NestedWriteVisitor(schema, {\n create: addModel,\n createMany: addModel,\n connectOrCreate: addModel,\n connect: addModel,\n disconnect: addModel,\n set: addModel,\n update: addModel,\n updateMany: addModel,\n upsert: addModel,\n delete: (model) => {\n addModel(model);\n addCascades(model);\n },\n deleteMany: (model) => {\n addModel(model);\n addCascades(model);\n },\n });\n await visitor.visit(model, operation, mutationArgs);\n }\n\n // include delegate base models recursively\n result.forEach((m) => {\n getBaseRecursively(m, schema, result);\n });\n\n return [...result];\n}\n\nfunction collectDeleteCascades(model: string, schema: SchemaDef, result: Set<string>, visited: Set<string>) {\n if (visited.has(model)) {\n // break circle\n return;\n }\n visited.add(model);\n\n const modelDef = schema.models[model];\n if (!modelDef) {\n return;\n }\n\n for (const [modelName, modelDef] of Object.entries(schema.models)) {\n if (!modelDef) {\n continue;\n }\n for (const fieldDef of Object.values(modelDef.fields)) {\n if (fieldDef.relation?.onDelete === 'Cascade' && fieldDef.type === model) {\n if (!result.has(modelName)) {\n result.add(modelName);\n }\n collectDeleteCascades(modelName, schema, result, visited);\n }\n }\n }\n}\n\nfunction getBaseRecursively(model: string, schema: SchemaDef, result: Set<string>) {\n const modelDef = schema.models[model];\n if (!modelDef) {\n return;\n }\n if (modelDef.baseModel) {\n result.add(modelDef.baseModel);\n getBaseRecursively(modelDef.baseModel, schema, result);\n }\n}\n","import { Buffer } from 'buffer';\nimport Decimal from 'decimal.js';\nimport SuperJSON from 'superjson';\n\nSuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal =>\n v instanceof Decimal ||\n // interop with decimal.js\n v?.toStringTag === '[object Decimal]',\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal'\n);\n\nSuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes'\n);\n\n/**\n * Serialize the given value with superjson\n */\nexport function serialize(value: unknown): { data: unknown; meta: unknown } {\n const { json, meta } = SuperJSON.serialize(value);\n return { data: json, meta };\n}\n\n/**\n * Deserialize the given value with superjson using the given metadata\n */\nexport function deserialize(value: unknown, meta: any): unknown {\n return SuperJSON.deserialize({ json: value as any, meta });\n}\n"],"mappings":"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","names":["import_common_helpers","import_common_helpers","import_common_helpers","ORMWriteActions","NestedWriteVisitor","schema","callback","isWriteAction","value","ORMWriteActions","includes","visit","model","action","args","topData","data","where","doVisit","undefined","parent","field","nestingPath","toplevel","context","pushNewContext","unique","item","enumerateReverse","newContext","callbackResult","create","subPayload","visitSubPayload","createMany","connectOrCreate","connect","disconnect","set","update","updateMany","upsert","delete","deleteMany","Error","payload","enumerate","Object","keys","fieldDef","models","fields","relation","subAction","subData","entries","type","Array","isArray","i","length","applyMutation","queryModel","queryOp","queryData","mutationModel","mutationOp","mutationArgs","schema","logging","Array","isArray","undefined","startsWith","doApplyMutation","resultData","updated","visitor","NestedWriteVisitor","create","model","args","r","createMutate","createMany","data","oneArg","enumerate","update","updateMutate","upsert","where","upsertMutate","delete","deleteMutate","visit","modelFields","models","fields","invariant","arrayCloned","i","length","item","$optimistic","currentData","key","value","Object","entries","fieldDef","relation","type","newData","insert","newDataFields","keys","forEach","name","field","assignForeignKeyFields","includes","clone","defaultAttr","attributes","find","attr","some","Date","defaultArg","kind","idFields","getIdFields","f","currMax","Math","max","map","idv","parseInt","isNaN","crypto","randomUUID","console","log","mutateModel","mutateArgs","idFieldsMatch","fieldInfo","connect","foundIndex","findIndex","x","updateResult","slice","createResult","result","filter","y","every","mutationData","references","idField","fkField","zip","NestedReadVisitor","schema","callback","doVisit","model","field","kind","args","r","selectInclude","nextKind","select","include","k","v","Object","entries","models","fields","type","visit","undefined","getReadModels","model","schema","args","result","Set","add","visitor","NestedReadVisitor","field","visit","getMutatedModels","operation","mutationArgs","addModel","addCascades","cascades","visited","collectDeleteCascades","forEach","m","NestedWriteVisitor","create","createMany","connectOrCreate","connect","disconnect","set","update","updateMany","upsert","delete","deleteMany","getBaseRecursively","has","modelDef","models","modelName","Object","entries","fieldDef","values","fields","relation","onDelete","type","baseModel","SuperJSON","registerCustom","isApplicable","v","Decimal","toStringTag","serialize","toJSON","deserialize","Buffer","isBuffer","toString","from","value","json","meta","data","DEFAULT_QUERY_ENDPOINT","QUERY_KEY_PREFIX","fetcher","url","options","customFetch","_fetch","fetch","res","ok","errData","unmarshal","text","error","rejectedByPolicy","rejectReason","undefined","Error","info","status","textResult","data","err","console","getQueryKey","model","operation","args","infinite","optimisticUpdate","marshal","value","meta","serialize","JSON","stringify","serialization","parsed","parse","deserializedData","deserialize","makeUrl","endpoint","baseUrl","lowerCaseFirst","result","encodeURIComponent","setupInvalidation","schema","invalidate","logging","origOnSuccess","onSuccess","_","variables","predicate","getInvalidationPredicate","mutationArgs","mutatedModels","getMutatedModels","queryKey","queryModel","includes","log","findNestedRead","visitingModel","targetModels","modelsRead","getReadModels","some","m","setupOptimisticUpdate","queryCache","setCache","origOnMutate","onMutate","origOnSettled","onSettled","mutationModel","mutationOp","cacheItem","state","isZenStackQueryKey","warn","queryOperation","queryArgs","queryOptions","optimisticDataProvider","providerResult","currentData","kind","mutatedData","applyMutation","length","VueQueryContextKey","provideHooksContext","context","provide","provideQuerySettingsContext","getQuerySettings","endpoint","rest","inject","DEFAULT_QUERY_ENDPOINT","fetch","undefined","logging","useClientQueries","schema","Object","keys","models","reduce","acc","model","lowerCaseFirst","useModelQueries","modelDef","values","find","m","name","toLowerCase","Error","modelName","useFindUnique","args","options","useInternalQuery","useFindFirst","useFindMany","useInfiniteFindMany","useInternalInfiniteQuery","useCreate","useInternalMutation","useCreateMany","useCreateManyAndReturn","useUpdate","useUpdateMany","useUpdateManyAndReturn","useUpsert","useDelete","useDeleteMany","useCount","useAggregate","useGroupBy","_schema","operation","argsValue","toValue","optimisticUpdate","restOptions","queryKey","getQueryKey","infinite","finalOptions","queryFn","signal","_prefix","_model","_op","reqUrl","makeUrl","fetcher","useQuery","getNextPageParam","optionsValue","initialPageParam","useInfiniteQuery","method","queryClient","useQueryClient","mutationFn","data","fetchInit","headers","body","marshal","invalidateQueries","setupInvalidation","predicate","setupOptimisticUpdate","getQueryCache","getAll","setQueryData","cancelQueries","revert","silent","useMutation"]}
|
|
1
|
+
{"version":3,"sources":["../src/vue.ts","../src/utils/common.ts","../src/utils/mutator.ts","../src/utils/nested-write-visitor.ts","../src/utils/types.ts","../src/utils/nested-read-visitor.ts","../src/utils/query-analysis.ts","../src/utils/serialization.ts"],"sourcesContent":["import {\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type DefaultError,\n type InfiniteData,\n type QueryKey,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryReturnType,\n type UseMutationOptions,\n type UseMutationReturnType,\n type UseQueryOptions,\n type UseQueryReturnType,\n} from '@tanstack/vue-query';\nimport { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type {\n AggregateArgs,\n AggregateResult,\n BatchResult,\n CountArgs,\n CountResult,\n CreateArgs,\n CreateManyAndReturnArgs,\n CreateManyArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindArgs,\n FindUniqueArgs,\n GroupByArgs,\n GroupByResult,\n ModelResult,\n SelectIncludeOmit,\n SelectSubset,\n Subset,\n UpdateArgs,\n UpdateManyAndReturnArgs,\n UpdateManyArgs,\n UpsertArgs,\n} from '@zenstackhq/orm';\nimport type { GetModels, SchemaDef } from '@zenstackhq/schema';\nimport { inject, provide, toValue, type MaybeRefOrGetter, type UnwrapRef } from 'vue';\nimport {\n DEFAULT_QUERY_ENDPOINT,\n fetcher,\n getQueryKey,\n makeUrl,\n marshal,\n setupInvalidation,\n setupOptimisticUpdate,\n type APIContext,\n type ExtraMutationOptions,\n type ExtraQueryOptions,\n} from './utils/common';\nimport type { TrimDelegateModelOperations, WithOptimistic } from './utils/types';\n\nexport type { FetchFn } from './utils/common';\nexport const VueQueryContextKey = 'zenstack-vue-query-context';\n\n/**\n * Provide context for query settings.\n *\n * @deprecated Use {@link provideQuerySettingsContext} instead.\n */\nexport function provideHooksContext(context: APIContext) {\n provide<APIContext>(VueQueryContextKey, context);\n}\n\n/**\n * Provide context for query settings.\n */\nexport function provideQuerySettingsContext(context: APIContext) {\n provide<APIContext>(VueQueryContextKey, context);\n}\n\nfunction getQuerySettings() {\n const { endpoint, ...rest } = inject<APIContext>(VueQueryContextKey, {\n endpoint: DEFAULT_QUERY_ENDPOINT,\n fetch: undefined,\n logging: false,\n });\n return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };\n}\n\nexport type ModelQueryOptions<T> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseQueryOptions<T, DefaultError>>, 'queryKey'> & ExtraQueryOptions\n>;\n\nexport type ModelQueryResult<T> = UseQueryReturnType<WithOptimistic<T>, DefaultError> & { queryKey: QueryKey };\n\nexport type ModelInfiniteQueryOptions<T> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>>, 'queryKey' | 'initialPageParam'>\n>;\n\nexport type ModelInfiniteQueryResult<T> = UseInfiniteQueryReturnType<T, DefaultError> & { queryKey: QueryKey };\n\nexport type ModelMutationOptions<T, TArgs> = MaybeRefOrGetter<\n Omit<UnwrapRef<UseMutationOptions<T, DefaultError, TArgs>>, 'mutationFn'> & ExtraMutationOptions\n>;\n\nexport type ModelMutationResult<T, TArgs> = UseMutationReturnType<T, DefaultError, TArgs, unknown>;\n\nexport type ModelMutationModelResult<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n TArgs extends SelectIncludeOmit<Schema, Model, boolean>,\n Array extends boolean = false,\n> = Omit<ModelMutationResult<ModelResult<Schema, Model, TArgs>, TArgs>, 'mutateAsync'> & {\n mutateAsync<T extends TArgs>(\n args: T,\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): Promise<Array extends true ? ModelResult<Schema, Model, T>[] : ModelResult<Schema, Model, T>>;\n};\n\nexport type ClientHooks<Schema extends SchemaDef> = {\n [Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model>;\n};\n\n// Note that we can potentially use TypeScript's mapped type to directly map from ORM contract, but that seems\n// to significantly slow down tsc performance ...\nexport type ModelQueryHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = TrimDelegateModelOperations<\n Schema,\n Model,\n {\n useFindUnique<T extends FindUniqueArgs<Schema, Model>>(\n args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,\n ): ModelQueryResult<ModelResult<Schema, Model, T> | null>;\n\n useFindFirst<T extends FindArgs<Schema, Model, false>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, false>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,\n ): ModelQueryResult<ModelResult<Schema, Model, T> | null>;\n\n useFindMany<T extends FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n options?: ModelQueryOptions<ModelResult<Schema, Model, T>[]>,\n ): ModelQueryResult<ModelResult<Schema, Model, T>[]>;\n\n useInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(\n args?: SelectSubset<T, FindArgs<Schema, Model, true>>,\n options?: ModelInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,\n ): ModelInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;\n\n useCreate<T extends CreateArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useCreateMany<T extends CreateManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,\n ): ModelMutationModelResult<Schema, Model, T, true>;\n\n useUpdate<T extends UpdateArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,\n ): ModelMutationModelResult<Schema, Model, T, true>;\n\n useUpsert<T extends UpsertArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useDelete<T extends DeleteArgs<Schema, Model>>(\n options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,\n ): ModelMutationModelResult<Schema, Model, T>;\n\n useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(\n options?: ModelMutationOptions<BatchResult, T>,\n ): ModelMutationResult<BatchResult, T>;\n\n useCount<T extends CountArgs<Schema, Model>>(\n args?: Subset<T, CountArgs<Schema, Model>>,\n options?: ModelQueryOptions<CountResult<Schema, Model, T>>,\n ): ModelQueryResult<CountResult<Schema, Model, T>>;\n\n useAggregate<T extends AggregateArgs<Schema, Model>>(\n args: Subset<T, AggregateArgs<Schema, Model>>,\n options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,\n ): ModelQueryResult<AggregateResult<Schema, Model, T>>;\n\n useGroupBy<T extends GroupByArgs<Schema, Model>>(\n args: Subset<T, GroupByArgs<Schema, Model>>,\n options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,\n ): ModelQueryResult<GroupByResult<Schema, Model, T>>;\n }\n>;\n\n/**\n * Gets data query hooks for all models in the schema.\n */\nexport function useClientQueries<Schema extends SchemaDef>(schema: Schema): ClientHooks<Schema> {\n return Object.keys(schema.models).reduce((acc, model) => {\n (acc as any)[lowerCaseFirst(model)] = useModelQueries(schema, model as GetModels<Schema>);\n return acc;\n }, {} as ClientHooks<Schema>);\n}\n\n/**\n * Gets data query hooks for a specific model in the schema.\n */\nexport function useModelQueries<Schema extends SchemaDef, Model extends GetModels<Schema>>(\n schema: Schema,\n model: Model,\n): ModelQueryHooks<Schema, Model> {\n const modelDef = Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());\n if (!modelDef) {\n throw new Error(`Model \"${model}\" not found in schema`);\n }\n\n const modelName = modelDef.name;\n\n return {\n useFindUnique: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findUnique', args, options);\n },\n\n useFindFirst: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findFirst', args, options);\n },\n\n useFindMany: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'findMany', args, options);\n },\n\n useInfiniteFindMany: (args: any, options?: any) => {\n return useInternalInfiniteQuery(schema, modelName, 'findMany', args, options);\n },\n\n useCreate: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'create', options);\n },\n\n useCreateMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'createMany', options);\n },\n\n useCreateManyAndReturn: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'createManyAndReturn', options);\n },\n\n useUpdate: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'update', options);\n },\n\n useUpdateMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'updateMany', options);\n },\n\n useUpdateManyAndReturn: (options?: any) => {\n return useInternalMutation(schema, modelName, 'PUT', 'updateManyAndReturn', options);\n },\n\n useUpsert: (options?: any) => {\n return useInternalMutation(schema, modelName, 'POST', 'upsert', options);\n },\n\n useDelete: (options?: any) => {\n return useInternalMutation(schema, modelName, 'DELETE', 'delete', options);\n },\n\n useDeleteMany: (options?: any) => {\n return useInternalMutation(schema, modelName, 'DELETE', 'deleteMany', options);\n },\n\n useCount: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'count', args, options);\n },\n\n useAggregate: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'aggregate', args, options);\n },\n\n useGroupBy: (args: any, options?: any) => {\n return useInternalQuery(schema, modelName, 'groupBy', args, options);\n },\n } as ModelQueryHooks<Schema, Model>;\n}\n\nexport function useInternalQuery<TQueryFnData, TData>(\n _schema: SchemaDef,\n model: string,\n operation: string,\n args?: MaybeRefOrGetter<unknown>,\n options?: MaybeRefOrGetter<\n Omit<UnwrapRef<UseQueryOptions<TQueryFnData, DefaultError, TData>>, 'queryKey'> & ExtraQueryOptions\n >,\n) {\n const argsValue = toValue(args);\n const { optimisticUpdate, ...restOptions } = toValue(options) ?? {};\n const queryKey = getQueryKey(model, operation, argsValue, {\n infinite: false,\n optimisticUpdate: optimisticUpdate !== false,\n });\n const { endpoint, fetch } = getQuerySettings();\n\n const finalOptions: any = {\n queryKey,\n queryFn: ({ queryKey, signal }: any) => {\n const [_prefix, _model, _op, args] = queryKey;\n const reqUrl = makeUrl(endpoint, model, operation, args);\n return fetcher<TQueryFnData>(reqUrl, { signal }, fetch);\n },\n ...restOptions,\n };\n return { queryKey, ...useQuery<TQueryFnData, DefaultError, TData>(finalOptions) };\n}\n\nexport function useInternalInfiniteQuery<TQueryFnData, TData>(\n _schema: SchemaDef,\n model: string,\n operation: string,\n args: MaybeRefOrGetter<unknown>,\n options:\n | MaybeRefOrGetter<\n Omit<\n UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>>,\n 'queryKey' | 'initialPageParam'\n >\n >\n | undefined,\n) {\n options = options ?? { getNextPageParam: () => undefined };\n const { endpoint, fetch } = getQuerySettings();\n const argsValue = toValue(args);\n const optionsValue = toValue(options);\n const queryKey = getQueryKey(model, operation, argsValue, { infinite: true, optimisticUpdate: false });\n\n const finalOptions: any = {\n queryKey,\n queryFn: ({ queryKey, signal }: any) => {\n const [_prefix, _model, _op, args] = queryKey;\n const reqUrl = makeUrl(endpoint, model, operation, args);\n return fetcher<TQueryFnData>(reqUrl, { signal }, fetch);\n },\n initialPageParam: argsValue,\n ...optionsValue,\n };\n return {\n queryKey,\n ...useInfiniteQuery(finalOptions),\n };\n}\n\n/**\n * Creates a vue-query mutation\n *\n * @private\n *\n * @param model The name of the model under mutation.\n * @param method The HTTP method.\n * @param operation The mutation operation (e.g. `create`).\n * @param options The vue-query options.\n * @param checkReadBack Whether to check for read back errors and return undefined if found.\n */\nexport function useInternalMutation<TArgs, R = any>(\n schema: SchemaDef,\n model: string,\n method: 'POST' | 'PUT' | 'DELETE',\n operation: string,\n options?: MaybeRefOrGetter<\n Omit<UnwrapRef<UseMutationOptions<R, DefaultError, TArgs>>, 'mutationFn'> & ExtraMutationOptions\n >,\n) {\n const { endpoint, fetch, logging } = getQuerySettings();\n const queryClient = useQueryClient();\n const mutationFn = (data: any) => {\n const reqUrl =\n method === 'DELETE' ? makeUrl(endpoint, model, operation, data) : makeUrl(endpoint, model, operation);\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>(reqUrl, fetchInit, fetch) as Promise<R>;\n };\n\n const optionsValue = toValue(options);\n const finalOptions: any = { ...optionsValue, mutationFn };\n const invalidateQueries = optionsValue?.invalidateQueries !== false;\n const optimisticUpdate = !!optionsValue?.optimisticUpdate;\n\n if (operation) {\n if (invalidateQueries) {\n setupInvalidation(\n model,\n operation,\n schema,\n finalOptions,\n (predicate) => queryClient.invalidateQueries({ predicate }),\n logging,\n );\n }\n\n if (optimisticUpdate) {\n setupOptimisticUpdate(\n model,\n operation,\n schema,\n finalOptions,\n queryClient.getQueryCache().getAll(),\n (queryKey, data) => {\n // update query cache\n queryClient.setQueryData<unknown>(queryKey, data);\n // cancel on-flight queries to avoid redundant cache updates,\n // the settlement of the current mutation will trigger a new revalidation\n queryClient.cancelQueries({ queryKey }, { revert: false, silent: true });\n },\n invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,\n logging,\n );\n }\n }\n\n return useMutation(finalOptions);\n}\n","import { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport type { SchemaDef } from '@zenstackhq/schema';\nimport { applyMutation } from './mutator';\nimport { getMutatedModels, getReadModels } from './query-analysis';\nimport { deserialize, serialize } from './serialization';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * The default query endpoint.\n */\nexport const DEFAULT_QUERY_ENDPOINT = '/api/model';\n\n/**\n * Prefix for react-query keys.\n */\nexport const QUERY_KEY_PREFIX = 'zenstack';\n\n/**\n * Function signature for `fetch`.\n */\nexport type FetchFn = (url: string, options?: RequestInit) => Promise<Response>;\n\n/**\n * Type for query and mutation errors.\n */\nexport type QueryError = Error & {\n /**\n * Additional error information.\n */\n info?: unknown;\n\n /**\n * HTTP status code.\n */\n status?: number;\n};\n\n/**\n * 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 * Extra mutation options.\n */\nexport type ExtraMutationOptions = {\n /**\n * Whether to automatically invalidate queries potentially affected by the mutation. Defaults to `true`.\n */\n invalidateQueries?: boolean;\n\n /**\n * Whether to optimistically update queries potentially affected by the mutation. 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};\n\n/**\n * Extra query options.\n */\nexport type ExtraQueryOptions = {\n /**\n * Whether to opt-in to optimistic updates for this query. Defaults to `true`.\n */\n optimisticUpdate?: boolean;\n};\n\n/**\n * Context type for configuring the hooks.\n */\nexport type APIContext = {\n /**\n * The endpoint to use for the queries.\n */\n endpoint?: string;\n\n /**\n * A custom fetch function for sending the HTTP requests.\n */\n fetch?: FetchFn;\n\n /**\n * If logging is enabled.\n */\n logging?: boolean;\n};\n\nexport async function fetcher<R>(url: string, options?: RequestInit, customFetch?: FetchFn): Promise<R> {\n const _fetch = customFetch ?? fetch;\n const res = await _fetch(url, options);\n if (!res.ok) {\n const errData = unmarshal(await res.text());\n if (errData.error?.rejectedByPolicy && errData.error?.rejectReason === 'cannot-read-back') {\n // policy doesn't allow mutation result to be read back, just return undefined\n return undefined as any;\n }\n const error: QueryError = new Error('An error occurred while fetching the data.');\n error.info = errData.error;\n error.status = res.status;\n throw error;\n }\n\n const textResult = await res.text();\n try {\n return unmarshal(textResult).data as R;\n } catch (err) {\n console.error(`Unable to deserialize data:`, textResult);\n throw err;\n }\n}\n\ntype QueryKey = [\n string /* prefix */,\n string /* model */,\n string /* operation */,\n unknown /* args */,\n {\n infinite: boolean;\n optimisticUpdate: boolean;\n } /* flags */,\n];\n\n/**\n * Computes query key for the given model, operation and query args.\n * @param model Model name.\n * @param operation Query 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 Query arguments.\n * @param options Query options, including `infinite` indicating if it's an infinite query (defaults to false), and `optimisticUpdate` indicating if optimistic updates are enabled (defaults to true).\n * @returns Query key\n */\nexport function getQueryKey(\n model: string,\n operation: string,\n args: unknown,\n options: { infinite: boolean; optimisticUpdate: boolean } = { infinite: false, optimisticUpdate: true },\n): QueryKey {\n const infinite = options.infinite;\n // infinite query doesn't support optimistic updates\n const optimisticUpdate = options.infinite ? false : options.optimisticUpdate;\n return [QUERY_KEY_PREFIX, model, operation!, args, { infinite, optimisticUpdate }];\n}\n\nexport function marshal(value: unknown) {\n const { data, meta } = serialize(value);\n if (meta) {\n return JSON.stringify({ ...(data as any), meta: { serialization: meta } });\n } else {\n return JSON.stringify(data);\n }\n}\n\nexport function unmarshal(value: string) {\n const parsed = JSON.parse(value);\n if (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\nexport function makeUrl(endpoint: string, model: string, operation: string, args?: unknown) {\n const baseUrl = `${endpoint}/${lowerCaseFirst(model)}/${operation}`;\n if (!args) {\n return baseUrl;\n }\n\n const { data, meta } = serialize(args);\n let result = `${baseUrl}?q=${encodeURIComponent(JSON.stringify(data))}`;\n if (meta) {\n result += `&meta=${encodeURIComponent(JSON.stringify({ serialization: meta }))}`;\n }\n return result;\n}\n\ntype InvalidationPredicate = ({ queryKey }: { queryKey: readonly unknown[] }) => boolean;\ntype InvalidateFunc = (predicate: InvalidationPredicate) => Promise<void>;\ntype MutationOptions = {\n onMutate?: (...args: any[]) => any;\n onSuccess?: (...args: any[]) => any;\n onSettled?: (...args: any[]) => any;\n};\n\n// sets up invalidation hook for a mutation\nexport function setupInvalidation(\n model: string,\n operation: string,\n schema: SchemaDef,\n options: MutationOptions,\n invalidate: InvalidateFunc,\n logging = false,\n) {\n const origOnSuccess = options?.onSuccess;\n options.onSuccess = async (...args: unknown[]) => {\n const [_, variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as ORMWriteActionType,\n variables,\n schema,\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: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging = false,\n) {\n const mutatedModels = await getMutatedModels(model, operation, mutationArgs, schema);\n\n return ({ queryKey }: { queryKey: readonly unknown[] }) => {\n const [_, queryModel, , args] = queryKey as QueryKey;\n\n if (mutatedModels.includes(queryModel)) {\n // direct match\n if (logging) {\n console.log(`Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`);\n }\n return true;\n }\n\n if (args) {\n // traverse query args to find nested reads that match the model under mutation\n if (findNestedRead(queryModel, mutatedModels, schema, args)) {\n if (logging) {\n console.log(\n `Invalidating query ${JSON.stringify(queryKey)} due to mutation \"${model}.${operation}\"`,\n );\n }\n return true;\n }\n }\n\n return false;\n };\n}\n\n// find nested reads that match the given models\nfunction findNestedRead(visitingModel: string, targetModels: string[], schema: SchemaDef, args: any) {\n const modelsRead = getReadModels(visitingModel, schema, args);\n return targetModels.some((m) => modelsRead.includes(m));\n}\n\ntype QueryCache = {\n queryKey: readonly unknown[];\n state: {\n data: unknown;\n error: unknown;\n };\n}[];\n\ntype SetCacheFunc = (queryKey: readonly unknown[], data: unknown) => void;\n\n/**\n * Sets up optimistic update and invalidation (after settled) for a mutation.\n */\nexport function setupOptimisticUpdate(\n model: string,\n operation: string,\n schema: SchemaDef,\n options: MutationOptions & ExtraMutationOptions,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n invalidate?: InvalidateFunc,\n logging = false,\n) {\n const origOnMutate = options?.onMutate;\n const origOnSettled = options?.onSettled;\n\n // optimistic update on mutate\n options.onMutate = async (...args: unknown[]) => {\n const [variables] = args;\n await optimisticUpdate(\n model,\n operation as ORMWriteActionType,\n variables,\n options,\n schema,\n queryCache,\n setCache,\n logging,\n );\n return origOnMutate?.(...args);\n };\n\n // invalidate on settled\n options.onSettled = async (...args: unknown[]) => {\n if (invalidate) {\n const [, , variables] = args;\n const predicate = await getInvalidationPredicate(\n model,\n operation as ORMWriteActionType,\n variables,\n schema,\n logging,\n );\n await invalidate(predicate);\n }\n return origOnSettled?.(...args);\n };\n}\n\n// optimistically updates query cache\nasync function optimisticUpdate(\n mutationModel: string,\n mutationOp: string,\n mutationArgs: any,\n options: MutationOptions & ExtraMutationOptions,\n schema: SchemaDef,\n queryCache: QueryCache,\n setCache: SetCacheFunc,\n logging = false,\n) {\n for (const cacheItem of queryCache) {\n const {\n queryKey,\n state: { data, error },\n } = cacheItem;\n\n if (!isZenStackQueryKey(queryKey)) {\n // skip non-zenstack queries\n continue;\n }\n\n if (error) {\n if (logging) {\n console.warn(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to error:`, error);\n }\n continue;\n }\n\n const [_, queryModel, queryOperation, queryArgs, queryOptions] = queryKey;\n if (!queryOptions?.optimisticUpdate) {\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to opt-out`);\n }\n continue;\n }\n\n if (options.optimisticDataProvider) {\n const providerResult = await options.optimisticDataProvider({\n queryModel,\n queryOperation,\n queryArgs,\n currentData: data,\n mutationArgs,\n });\n\n if (providerResult?.kind === 'Skip') {\n // skip\n if (logging) {\n console.log(`Skipping optimistic update for ${JSON.stringify(queryKey)} due to provider`);\n }\n continue;\n } else if (providerResult?.kind === 'Update') {\n // update cache\n if (logging) {\n console.log(`Optimistically updating query ${JSON.stringify(queryKey)} due to provider`);\n }\n setCache(queryKey, providerResult.data);\n continue;\n }\n }\n\n // proceed with default optimistic update\n const mutatedData = await applyMutation(\n queryModel,\n queryOperation,\n data,\n mutationModel,\n mutationOp as ORMWriteActionType,\n mutationArgs,\n schema,\n logging,\n );\n\n if (mutatedData !== undefined) {\n // mutation applicable to this query, update cache\n if (logging) {\n console.log(\n `Optimistically updating query ${JSON.stringify(\n queryKey,\n )} due to mutation \"${mutationModel}.${mutationOp}\"`,\n );\n }\n setCache(queryKey, mutatedData);\n }\n }\n}\n\nfunction isZenStackQueryKey(queryKey: readonly unknown[]): queryKey is QueryKey {\n if (queryKey.length < 5) {\n return false;\n }\n\n if (queryKey[0] !== QUERY_KEY_PREFIX) {\n return false;\n }\n\n return true;\n}\n","import { clone, enumerate, invariant, zip } from '@zenstackhq/common-helpers';\nimport type { FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * Tries to apply a mutation to a query result.\n *\n * @param queryModel the model of the query\n * @param queryOp the operation of the query\n * @param queryData the result data of the query\n * @param mutationModel the model of the mutation\n * @param mutationOp the operation of the mutation\n * @param mutationArgs the arguments of the mutation\n * @param schema the model metadata\n * @param logging whether to log the mutation application\n * @returns the updated query data if the mutation is applicable, otherwise undefined\n */\nexport async function applyMutation(\n queryModel: string,\n queryOp: string,\n queryData: any,\n mutationModel: string,\n mutationOp: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n if (!queryData || (typeof queryData !== 'object' && !Array.isArray(queryData))) {\n return undefined;\n }\n\n if (!queryOp.startsWith('find')) {\n // only findXXX results are applicable\n return undefined;\n }\n\n return await doApplyMutation(queryModel, queryData, mutationModel, mutationOp, mutationArgs, schema, logging);\n}\n\nasync function doApplyMutation(\n queryModel: string,\n queryData: any,\n mutationModel: string,\n mutationOp: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(schema, {\n create: (model, args) => {\n if (\n model === queryModel &&\n Array.isArray(resultData) // \"create\" mutation is only relevant for arrays\n ) {\n const r = createMutate(queryModel, resultData, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (\n model === queryModel &&\n args?.data &&\n Array.isArray(resultData) // \"createMany\" mutation is only relevant for arrays\n ) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, resultData, oneArg, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n if (\n model === queryModel &&\n !Array.isArray(resultData) // array elements will be handled with recursion\n ) {\n const r = updateMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n upsert: (model, args) => {\n if (model === queryModel && args?.where && args?.create && args?.update) {\n const r = upsertMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n delete: (model, args) => {\n if (model === queryModel) {\n const r = deleteMutate(queryModel, resultData, model, args, schema, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n });\n\n await visitor.visit(mutationModel, mutationOp, mutationArgs);\n\n const modelFields = schema.models[queryModel]?.fields;\n invariant(modelFields, `Model ${queryModel} not found in schema`);\n\n if (Array.isArray(resultData)) {\n // try to apply mutation to each item in the array, replicate the entire\n // array if any item is updated\n\n let arrayCloned = false;\n for (let i = 0; i < resultData.length; i++) {\n const item = resultData[i];\n if (\n !item ||\n typeof item !== 'object' ||\n item.$optimistic // skip items already optimistically updated\n ) {\n continue;\n }\n\n const r = await doApplyMutation(queryModel, item, mutationModel, mutationOp, mutationArgs, schema, logging);\n\n if (r && typeof r === 'object') {\n if (!arrayCloned) {\n resultData = [...resultData];\n arrayCloned = true;\n }\n resultData[i] = r;\n updated = true;\n }\n }\n } else if (resultData !== null && typeof resultData === 'object') {\n // Clone resultData to prevent mutations affecting the loop\n const currentData = { ...resultData };\n\n // iterate over each field and apply mutation to nested data models\n for (const [key, value] of Object.entries(currentData)) {\n const fieldDef = modelFields[key];\n if (!fieldDef?.relation) {\n continue;\n }\n\n const r = await doApplyMutation(\n fieldDef.type,\n value,\n mutationModel,\n mutationOp,\n mutationArgs,\n schema,\n logging,\n );\n\n if (r && typeof r === 'object') {\n resultData = { ...resultData, [key]: r };\n updated = true;\n }\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(queryModel: string, currentData: any, newData: any, schema: SchemaDef, logging: boolean) {\n if (!newData) {\n return undefined;\n }\n\n const modelFields = schema.models[queryModel]?.fields;\n if (!modelFields) {\n return undefined;\n }\n\n const insert: any = {};\n const newDataFields = Object.keys(newData);\n\n Object.entries(modelFields).forEach(([name, field]) => {\n if (field.relation && newData[name]) {\n // deal with \"connect\"\n assignForeignKeyFields(field, insert, newData[name]);\n return;\n }\n\n if (newDataFields.includes(name)) {\n insert[name] = clone(newData[name]);\n } else {\n const defaultAttr = field.attributes?.find((attr) => attr.name === '@default');\n if (field.type === 'DateTime') {\n // default value for DateTime field\n if (defaultAttr || field.attributes?.some((attr) => attr.name === '@updatedAt')) {\n insert[name] = new Date();\n return;\n }\n }\n\n const defaultArg = defaultAttr?.args?.[0]?.value;\n if (defaultArg?.kind === 'literal') {\n // other default value\n insert[name] = defaultArg.value;\n }\n }\n });\n\n // add temp id value\n const idFields = getIdFields(schema, queryModel);\n idFields.forEach((f) => {\n if (insert[f.name] === undefined) {\n if (f.type === 'Int' || f.type === 'BigInt') {\n const currMax = Array.isArray(currentData)\n ? Math.max(\n ...[...currentData].map((item) => {\n const idv = parseInt(item[f.name]);\n return isNaN(idv) ? 0 : idv;\n }),\n )\n : 0;\n insert[f.name] = currMax + 1;\n } else {\n insert[f.name] = crypto.randomUUID();\n }\n }\n });\n\n insert.$optimistic = true;\n\n if (logging) {\n console.log(`Optimistic create for ${queryModel}:`, insert);\n }\n return [insert, ...(Array.isArray(currentData) ? currentData : [])];\n}\n\nfunction updateMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n if (!currentData || typeof currentData !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.where || typeof mutateArgs.where !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.data || typeof mutateArgs.data !== 'object') {\n return undefined;\n }\n\n if (!idFieldsMatch(mutateModel, currentData, mutateArgs.where, schema)) {\n return undefined;\n }\n\n const modelFields = schema.models[queryModel]?.fields;\n if (!modelFields) {\n return undefined;\n }\n\n let updated = false;\n let resultData = currentData;\n\n for (const [key, value] of Object.entries<any>(mutateArgs.data)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.relation && !value?.connect) {\n // relation field but without \"connect\"\n continue;\n }\n\n if (!updated) {\n // clone\n resultData = { ...currentData };\n }\n\n if (fieldInfo.relation) {\n // deal with \"connect\"\n assignForeignKeyFields(fieldInfo, resultData, value);\n } else {\n resultData[key] = clone(value);\n }\n resultData.$optimistic = true;\n updated = true;\n\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, resultData);\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction upsertMutate(\n queryModel: string,\n currentData: any,\n model: string,\n args: { where: object; create: any; update: any },\n schema: SchemaDef,\n logging: boolean,\n) {\n let updated = false;\n let resultData = currentData;\n\n if (Array.isArray(resultData)) {\n // check if we should create or update\n const foundIndex = resultData.findIndex((x) => idFieldsMatch(model, x, args.where, schema));\n if (foundIndex >= 0) {\n const updateResult = updateMutate(\n queryModel,\n resultData[foundIndex],\n model,\n { where: args.where, data: args.update },\n schema,\n logging,\n );\n if (updateResult) {\n // replace the found item with updated item\n resultData = [...resultData.slice(0, foundIndex), updateResult, ...resultData.slice(foundIndex + 1)];\n updated = true;\n }\n } else {\n const createResult = createMutate(queryModel, resultData, args.create, schema, logging);\n if (createResult) {\n resultData = createResult;\n updated = true;\n }\n }\n } else {\n // try update only\n const updateResult = updateMutate(\n queryModel,\n resultData,\n model,\n { where: args.where, data: args.update },\n schema,\n logging,\n );\n if (updateResult) {\n resultData = updateResult;\n updated = true;\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction deleteMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n schema: SchemaDef,\n logging: boolean,\n) {\n // TODO: handle mutation of nested reads?\n\n if (!currentData || !mutateArgs) {\n return undefined;\n }\n\n if (queryModel !== mutateModel) {\n return undefined;\n }\n\n let updated = false;\n let result = currentData;\n\n if (Array.isArray(currentData)) {\n for (const item of currentData) {\n if (idFieldsMatch(mutateModel, item, mutateArgs, schema)) {\n result = (result as unknown[]).filter((x) => x !== item);\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, item);\n }\n }\n }\n } else {\n if (idFieldsMatch(mutateModel, currentData, mutateArgs, schema)) {\n result = null;\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, currentData);\n }\n }\n }\n\n return updated ? result : undefined;\n}\n\nfunction idFieldsMatch(model: string, x: any, y: any, schema: SchemaDef) {\n if (!x || !y || typeof x !== 'object' || typeof y !== 'object') {\n return false;\n }\n const idFields = getIdFields(schema, model);\n if (idFields.length === 0) {\n return false;\n }\n return idFields.every((f) => x[f.name] === y[f.name]);\n}\n\nfunction assignForeignKeyFields(field: FieldDef, resultData: any, mutationData: any) {\n // convert \"connect\" like `{ connect: { id: '...' } }` to foreign key fields\n // assignment: `{ userId: '...' }`\n if (!mutationData?.connect) {\n return;\n }\n\n if (!field.relation?.fields || !field.relation.references) {\n return;\n }\n\n for (const [idField, fkField] of zip(field.relation.references, field.relation.fields)) {\n if (idField in mutationData.connect) {\n resultData[fkField] = mutationData.connect[idField];\n }\n }\n}\n\nfunction getIdFields(schema: SchemaDef, model: string) {\n return (schema.models[model]?.idFields ?? []).map((f) => schema.models[model]!.fields[f]!);\n}\n","import { enumerate } from '@zenstackhq/common-helpers';\nimport type { FieldDef, SchemaDef } from '@zenstackhq/schema';\nimport { ORMWriteActions, type MaybePromise, type ORMWriteActionType } from './types';\n\ntype NestingPathItem = { field?: FieldDef; model: string; where: any; unique: boolean };\n\n/**\n * Context for visiting\n */\nexport type NestedWriteVisitorContext = {\n /**\n * Parent data, can be used to replace fields\n */\n parent: any;\n\n /**\n * Current field, undefined if toplevel\n */\n field?: FieldDef;\n\n /**\n * A top-down path of all nested update conditions and corresponding field till now\n */\n nestingPath: NestingPathItem[];\n};\n\n/**\n * NestedWriteVisitor's callback actions. A call back function should return true or void to indicate\n * that the visitor should continue traversing its children, or false to stop. It can also return an object\n * to let the visitor traverse it instead of its original children.\n */\nexport type NestedWriterVisitorCallback = {\n create?: (model: string, data: any, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n createMany?: (\n model: string,\n args: { data: any; skipDuplicates?: boolean },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n connectOrCreate?: (\n model: string,\n args: { where: object; create: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n connect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n disconnect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n set?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n update?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n updateMany?: (\n model: string,\n args: { where?: object; data: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n upsert?: (\n model: string,\n args: { where: object; create: any; update: any },\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n delete?: (\n model: string,\n args: object | boolean,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n deleteMany?: (\n model: string,\n args: any | object,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<boolean | object | void>;\n\n field?: (\n field: FieldDef,\n action: ORMWriteActionType,\n data: any,\n context: NestedWriteVisitorContext,\n ) => MaybePromise<void>;\n};\n\n/**\n * Recursive visitor for nested write (create/update) payload.\n */\nexport class NestedWriteVisitor {\n constructor(\n private readonly schema: SchemaDef,\n private readonly callback: NestedWriterVisitorCallback,\n ) {}\n\n private isWriteAction(value: string): value is ORMWriteActionType {\n return ORMWriteActions.includes(value as ORMWriteActionType);\n }\n\n /**\n * Start visiting\n *\n * @see NestedWriterVisitorCallback\n */\n async visit(model: string, action: ORMWriteActionType, args: any): Promise<void> {\n if (!args) {\n return;\n }\n\n let topData = args;\n\n switch (action) {\n // create has its data wrapped in 'data' field\n case 'create':\n topData = topData.data;\n break;\n\n case 'delete':\n case 'deleteMany':\n topData = topData.where;\n break;\n }\n\n await this.doVisit(model, action, topData, undefined, undefined, []);\n }\n\n private async doVisit(\n model: string,\n action: ORMWriteActionType,\n data: any,\n parent: any,\n field: FieldDef | undefined,\n nestingPath: NestingPathItem[],\n ): Promise<void> {\n if (!data) {\n return;\n }\n\n const toplevel = field == undefined;\n\n const context = { parent, field, nestingPath: [...nestingPath] };\n const pushNewContext = (field: FieldDef | undefined, model: string, where: any, unique = false) => {\n return { ...context, nestingPath: [...context.nestingPath, { field, model, where, unique }] };\n };\n\n // visit payload\n switch (action) {\n case 'create':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.create) {\n callbackResult = await this.callback.create(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'createMany':\n case 'createManyAndReturn':\n {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.createMany) {\n callbackResult = await this.callback.createMany(model, data, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : data.data;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connectOrCreate':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.connectOrCreate) {\n callbackResult = await this.callback.connectOrCreate(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item.create;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connect':\n if (this.callback.connect) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.connect(model, item, newContext);\n }\n }\n break;\n\n case 'disconnect':\n // disconnect has two forms:\n // if relation is to-many, the payload is a unique filter object\n // if relation is to-one, the payload can only be boolean `true`\n if (this.callback.disconnect) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, typeof item === 'object');\n await this.callback.disconnect(model, item, newContext);\n }\n }\n break;\n\n case 'set':\n if (this.callback.set) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.set(model, item, newContext);\n }\n }\n break;\n\n case 'update':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.update) {\n callbackResult = await this.callback.update(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload =\n typeof callbackResult === 'object'\n ? callbackResult\n : typeof item.data === 'object'\n ? item.data\n : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'updateMany':\n case 'updateManyAndReturn':\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.updateMany) {\n callbackResult = await this.callback.updateMany(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'upsert': {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.upsert) {\n callbackResult = await this.callback.upsert(model, item, newContext);\n }\n if (callbackResult !== false) {\n if (typeof callbackResult === 'object') {\n await this.visitSubPayload(model, action, callbackResult, newContext.nestingPath);\n } else {\n await this.visitSubPayload(model, action, item.create, newContext.nestingPath);\n await this.visitSubPayload(model, action, item.update, newContext.nestingPath);\n }\n }\n }\n break;\n }\n\n case 'delete': {\n if (this.callback.delete) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.delete(model, item, newContext);\n }\n }\n break;\n }\n\n case 'deleteMany':\n if (this.callback.deleteMany) {\n for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.deleteMany(model, item, newContext);\n }\n }\n break;\n\n default: {\n throw new Error(`unhandled action type ${action}`);\n }\n }\n }\n\n private async visitSubPayload(\n model: string,\n action: ORMWriteActionType,\n payload: any,\n nestingPath: NestingPathItem[],\n ) {\n for (const item of enumerate(payload)) {\n if (!item || typeof item !== 'object') {\n continue;\n }\n for (const field of Object.keys(item)) {\n const fieldDef = this.schema.models[model]?.fields[field];\n if (!fieldDef) {\n continue;\n }\n\n if (fieldDef.relation) {\n if (item[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(item[field])) {\n if (this.isWriteAction(subAction) && subData) {\n await this.doVisit(fieldDef.type, subAction, subData, item[field], fieldDef, [\n ...nestingPath,\n ]);\n }\n }\n }\n } else {\n // visit plain field\n if (this.callback.field) {\n await this.callback.field(fieldDef, action, item[field], {\n parent: item,\n nestingPath,\n field: fieldDef,\n });\n }\n }\n }\n }\n }\n\n // enumerate a (possible) array in reverse order, so that the enumeration\n // callback can safely delete the current item\n private *enumerateReverse(data: any) {\n if (Array.isArray(data)) {\n for (let i = data.length - 1; i >= 0; i--) {\n yield data[i];\n }\n } else {\n yield data;\n }\n }\n}\n","import type { OperationsIneligibleForDelegateModels } from '@zenstackhq/orm';\nimport type { GetModels, IsDelegateModel, SchemaDef } from '@zenstackhq/schema';\n\nexport type MaybePromise<T> = T | Promise<T> | PromiseLike<T>;\n\nexport const ORMWriteActions = [\n 'create',\n 'createMany',\n 'createManyAndReturn',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'updateManyAndReturn',\n 'upsert',\n 'connect',\n 'disconnect',\n 'set',\n 'delete',\n 'deleteMany',\n] as const;\n\nexport type ORMWriteActionType = (typeof ORMWriteActions)[number];\n\ntype HooksOperationsIneligibleForDelegateModels = OperationsIneligibleForDelegateModels extends any\n ? `use${Capitalize<OperationsIneligibleForDelegateModels>}`\n : never;\n\nexport type TrimDelegateModelOperations<\n Schema extends SchemaDef,\n Model extends GetModels<Schema>,\n T extends Record<string, unknown>,\n> = IsDelegateModel<Schema, Model> extends true ? Omit<T, HooksOperationsIneligibleForDelegateModels> : T;\n\ntype WithOptimisticFlag<T> = T extends object\n ? T & {\n /**\n * Indicates if the item is in an optimistic update state\n */\n $optimistic?: boolean;\n }\n : T;\n\nexport type WithOptimistic<T> = T extends Array<infer U> ? Array<WithOptimisticFlag<U>> : WithOptimisticFlag<T>;\n","import type { FieldDef, SchemaDef } from '@zenstackhq/schema';\n\nexport type NestedReadVisitorCallback = {\n field?: (\n model: string,\n field: FieldDef | undefined,\n kind: 'include' | 'select' | undefined,\n args: unknown,\n ) => void | boolean;\n};\n\n/**\n * Visitor for nested read payload.\n */\nexport class NestedReadVisitor {\n constructor(\n private readonly schema: SchemaDef,\n private readonly callback: NestedReadVisitorCallback,\n ) {}\n\n doVisit(model: string, field: FieldDef | undefined, kind: 'include' | 'select' | undefined, args: unknown) {\n if (this.callback.field) {\n const r = this.callback.field(model, field, kind, args);\n if (r === false) {\n return;\n }\n }\n\n if (!args || typeof args !== 'object') {\n return;\n }\n\n let selectInclude: any;\n let nextKind: 'select' | 'include' | undefined;\n if ((args as any).select) {\n selectInclude = (args as any).select;\n nextKind = 'select';\n } else if ((args as any).include) {\n selectInclude = (args as any).include;\n nextKind = 'include';\n }\n\n if (selectInclude && typeof selectInclude === 'object') {\n for (const [k, v] of Object.entries(selectInclude)) {\n if (k === '_count' && typeof v === 'object' && v) {\n // recurse into { _count: { ... } }\n this.doVisit(model, field, kind, v);\n } else {\n const field = this.schema.models[model]?.fields[k];\n if (field) {\n this.doVisit(field.type, field, nextKind, v);\n }\n }\n }\n }\n }\n\n visit(model: string, args: unknown) {\n this.doVisit(model, undefined, undefined, args);\n }\n}\n","import type { SchemaDef } from '@zenstackhq/schema';\nimport { NestedReadVisitor } from './nested-read-visitor';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { ORMWriteActionType } from './types';\n\n/**\n * Gets models read (including nested ones) given a query args.\n * @param model\n * @param targetModels\n * @param schema\n * @param args\n * @returns\n */\nexport function getReadModels(model: string, schema: SchemaDef, args: any) {\n const result = new Set<string>();\n result.add(model);\n const visitor = new NestedReadVisitor(schema, {\n field: (model) => {\n result.add(model);\n return true;\n },\n });\n visitor.visit(model, args);\n return [...result];\n}\n\n/**\n * Gets mutated models (including nested ones) given a mutation args.\n */\nexport async function getMutatedModels(\n model: string,\n operation: ORMWriteActionType,\n mutationArgs: any,\n schema: SchemaDef,\n) {\n const result = new Set<string>();\n result.add(model);\n\n if (mutationArgs) {\n const addModel = (model: string) => void result.add(model);\n\n // add models that are cascaded deleted recursively\n const addCascades = (model: string) => {\n const cascades = new Set<string>();\n const visited = new Set<string>();\n collectDeleteCascades(model, schema, cascades, visited);\n cascades.forEach((m) => addModel(m));\n };\n\n const visitor = new NestedWriteVisitor(schema, {\n create: addModel,\n createMany: addModel,\n connectOrCreate: addModel,\n connect: addModel,\n disconnect: addModel,\n set: addModel,\n update: addModel,\n updateMany: addModel,\n upsert: addModel,\n delete: (model) => {\n addModel(model);\n addCascades(model);\n },\n deleteMany: (model) => {\n addModel(model);\n addCascades(model);\n },\n });\n await visitor.visit(model, operation, mutationArgs);\n }\n\n // include delegate base models recursively\n result.forEach((m) => {\n getBaseRecursively(m, schema, result);\n });\n\n return [...result];\n}\n\nfunction collectDeleteCascades(model: string, schema: SchemaDef, result: Set<string>, visited: Set<string>) {\n if (visited.has(model)) {\n // break circle\n return;\n }\n visited.add(model);\n\n const modelDef = schema.models[model];\n if (!modelDef) {\n return;\n }\n\n for (const [modelName, modelDef] of Object.entries(schema.models)) {\n if (!modelDef) {\n continue;\n }\n for (const fieldDef of Object.values(modelDef.fields)) {\n if (fieldDef.relation?.onDelete === 'Cascade' && fieldDef.type === model) {\n if (!result.has(modelName)) {\n result.add(modelName);\n }\n collectDeleteCascades(modelName, schema, result, visited);\n }\n }\n }\n}\n\nfunction getBaseRecursively(model: string, schema: SchemaDef, result: Set<string>) {\n const modelDef = schema.models[model];\n if (!modelDef) {\n return;\n }\n if (modelDef.baseModel) {\n result.add(modelDef.baseModel);\n getBaseRecursively(modelDef.baseModel, schema, result);\n }\n}\n","import { Buffer } from 'buffer';\nimport Decimal from 'decimal.js';\nimport SuperJSON from 'superjson';\n\nSuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal =>\n v instanceof Decimal ||\n // interop with decimal.js\n v?.toStringTag === '[object Decimal]',\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal'\n);\n\nSuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes'\n);\n\n/**\n * Serialize the given value with superjson\n */\nexport function serialize(value: unknown): { data: unknown; meta: unknown } {\n const { json, meta } = SuperJSON.serialize(value);\n return { data: json, meta };\n}\n\n/**\n * Deserialize the given value with superjson using the given metadata\n */\nexport function deserialize(value: unknown, meta: any): unknown {\n return SuperJSON.deserialize({ json: value as any, meta });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;uBAcO;AACP,IAAAA,yBAA+B;AA0B/B,iBAAgF;;;ACzChF,IAAAC,yBAA+B;;;ACA/B,IAAAC,yBAAiD;;;ACAjD,4BAA0B;;;ACKnB,IAAMC,kBAAkB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;AD+EG,IAAMC,qBAAN,MAAMA;EAjGb,OAiGaA;;;;;EACT,YACqBC,QACAC,UACnB;SAFmBD,SAAAA;SACAC,WAAAA;EAClB;EAEKC,cAAcC,OAA4C;AAC9D,WAAOC,gBAAgBC,SAASF,KAAAA;EACpC;;;;;;EAOA,MAAMG,MAAMC,OAAeC,QAA4BC,MAA0B;AAC7E,QAAI,CAACA,MAAM;AACP;IACJ;AAEA,QAAIC,UAAUD;AAEd,YAAQD,QAAAA;;MAEJ,KAAK;AACDE,kBAAUA,QAAQC;AAClB;MAEJ,KAAK;MACL,KAAK;AACDD,kBAAUA,QAAQE;AAClB;IACR;AAEA,UAAM,KAAKC,QAAQN,OAAOC,QAAQE,SAASI,QAAWA,QAAW,CAAA,CAAE;EACvE;EAEA,MAAcD,QACVN,OACAC,QACAG,MACAI,QACAC,OACAC,aACa;AACb,QAAI,CAACN,MAAM;AACP;IACJ;AAEA,UAAMO,WAAWF,SAASF;AAE1B,UAAMK,UAAU;MAAEJ;MAAQC;MAAOC,aAAa;WAAIA;;IAAa;AAC/D,UAAMG,iBAAiB,wBAACJ,QAA6BT,QAAeK,OAAYS,SAAS,UAAK;AAC1F,aAAO;QAAE,GAAGF;QAASF,aAAa;aAAIE,QAAQF;UAAa;YAAED,OAAAA;YAAOT,OAAAA;YAAOK;YAAOS;UAAO;;MAAG;IAChG,GAFuB;AAKvB,YAAQb,QAAAA;MACJ,KAAK;AACD,mBAAWc,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,gBAAMa,aAAaJ,eAAeJ,OAAOT,OAAO,CAAC,CAAA;AACjD,cAAIkB;AACJ,cAAI,KAAKxB,SAASyB,QAAQ;AACtBD,6BAAiB,MAAM,KAAKxB,SAASyB,OAAOnB,OAAOe,MAAME,UAAAA;UAC7D;AACA,cAAIC,mBAAmB,OAAO;AAC1B,kBAAME,aAAa,OAAOF,mBAAmB,WAAWA,iBAAiBH;AACzE,kBAAM,KAAKM,gBAAgBrB,OAAOC,QAAQmB,YAAYH,WAAWP,WAAW;UAChF;QACJ;AACA;MAEJ,KAAK;MACL,KAAK;AACD;AACI,gBAAMO,aAAaJ,eAAeJ,OAAOT,OAAO,CAAC,CAAA;AACjD,cAAIkB;AACJ,cAAI,KAAKxB,SAAS4B,YAAY;AAC1BJ,6BAAiB,MAAM,KAAKxB,SAAS4B,WAAWtB,OAAOI,MAAMa,UAAAA;UACjE;AACA,cAAIC,mBAAmB,OAAO;AAC1B,kBAAME,aAAa,OAAOF,mBAAmB,WAAWA,iBAAiBd,KAAKA;AAC9E,kBAAM,KAAKiB,gBAAgBrB,OAAOC,QAAQmB,YAAYH,WAAWP,WAAW;UAChF;QACJ;AACA;MAEJ,KAAK;AACD,mBAAWK,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,gBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,KAAKV,KAAK;AAC1D,cAAIa;AACJ,cAAI,KAAKxB,SAAS6B,iBAAiB;AAC/BL,6BAAiB,MAAM,KAAKxB,SAAS6B,gBAAgBvB,OAAOe,MAAME,UAAAA;UACtE;AACA,cAAIC,mBAAmB,OAAO;AAC1B,kBAAME,aAAa,OAAOF,mBAAmB,WAAWA,iBAAiBH,KAAKI;AAC9E,kBAAM,KAAKE,gBAAgBrB,OAAOC,QAAQmB,YAAYH,WAAWP,WAAW;UAChF;QACJ;AACA;MAEJ,KAAK;AACD,YAAI,KAAKhB,SAAS8B,SAAS;AACvB,qBAAWT,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,kBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,MAAM,IAAA;AACtD,kBAAM,KAAKrB,SAAS8B,QAAQxB,OAAOe,MAAME,UAAAA;UAC7C;QACJ;AACA;MAEJ,KAAK;AAID,YAAI,KAAKvB,SAAS+B,YAAY;AAC1B,qBAAWV,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,kBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,MAAM,OAAOA,SAAS,QAAA;AACtE,kBAAM,KAAKrB,SAAS+B,WAAWzB,OAAOe,MAAME,UAAAA;UAChD;QACJ;AACA;MAEJ,KAAK;AACD,YAAI,KAAKvB,SAASgC,KAAK;AACnB,qBAAWX,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,kBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,MAAM,IAAA;AACtD,kBAAM,KAAKrB,SAASgC,IAAI1B,OAAOe,MAAME,UAAAA;UACzC;QACJ;AACA;MAEJ,KAAK;AACD,mBAAWF,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,gBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,KAAKV,KAAK;AAC1D,cAAIa;AACJ,cAAI,KAAKxB,SAASiC,QAAQ;AACtBT,6BAAiB,MAAM,KAAKxB,SAASiC,OAAO3B,OAAOe,MAAME,UAAAA;UAC7D;AACA,cAAIC,mBAAmB,OAAO;AAC1B,kBAAME,aACF,OAAOF,mBAAmB,WACpBA,iBACA,OAAOH,KAAKX,SAAS,WACnBW,KAAKX,OACLW;AACZ,kBAAM,KAAKM,gBAAgBrB,OAAOC,QAAQmB,YAAYH,WAAWP,WAAW;UAChF;QACJ;AACA;MAEJ,KAAK;MACL,KAAK;AACD,mBAAWK,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,gBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,KAAKV,KAAK;AAC1D,cAAIa;AACJ,cAAI,KAAKxB,SAASkC,YAAY;AAC1BV,6BAAiB,MAAM,KAAKxB,SAASkC,WAAW5B,OAAOe,MAAME,UAAAA;UACjE;AACA,cAAIC,mBAAmB,OAAO;AAC1B,kBAAME,aAAa,OAAOF,mBAAmB,WAAWA,iBAAiBH;AACzE,kBAAM,KAAKM,gBAAgBrB,OAAOC,QAAQmB,YAAYH,WAAWP,WAAW;UAChF;QACJ;AACA;MAEJ,KAAK,UAAU;AACX,mBAAWK,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,gBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOe,KAAKV,KAAK;AAC1D,cAAIa;AACJ,cAAI,KAAKxB,SAASmC,QAAQ;AACtBX,6BAAiB,MAAM,KAAKxB,SAASmC,OAAO7B,OAAOe,MAAME,UAAAA;UAC7D;AACA,cAAIC,mBAAmB,OAAO;AAC1B,gBAAI,OAAOA,mBAAmB,UAAU;AACpC,oBAAM,KAAKG,gBAAgBrB,OAAOC,QAAQiB,gBAAgBD,WAAWP,WAAW;YACpF,OAAO;AACH,oBAAM,KAAKW,gBAAgBrB,OAAOC,QAAQc,KAAKI,QAAQF,WAAWP,WAAW;AAC7E,oBAAM,KAAKW,gBAAgBrB,OAAOC,QAAQc,KAAKY,QAAQV,WAAWP,WAAW;YACjF;UACJ;QACJ;AACA;MACJ;MAEA,KAAK,UAAU;AACX,YAAI,KAAKhB,SAASoC,QAAQ;AACtB,qBAAWf,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,kBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOW,WAAWI,KAAKV,QAAQU,IAAAA;AACxE,kBAAM,KAAKrB,SAASoC,OAAO9B,OAAOe,MAAME,UAAAA;UAC5C;QACJ;AACA;MACJ;MAEA,KAAK;AACD,YAAI,KAAKvB,SAASqC,YAAY;AAC1B,qBAAWhB,QAAQ,KAAKC,iBAAiBZ,IAAAA,GAAO;AAC5C,kBAAMa,aAAaJ,eAAeJ,OAAOT,OAAOW,WAAWI,KAAKV,QAAQU,IAAAA;AACxE,kBAAM,KAAKrB,SAASqC,WAAW/B,OAAOe,MAAME,UAAAA;UAChD;QACJ;AACA;MAEJ,SAAS;AACL,cAAM,IAAIe,MAAM,yBAAyB/B,MAAAA,EAAQ;MACrD;IACJ;EACJ;EAEA,MAAcoB,gBACVrB,OACAC,QACAgC,SACAvB,aACF;AACE,eAAWK,YAAQmB,iCAAUD,OAAAA,GAAU;AACnC,UAAI,CAAClB,QAAQ,OAAOA,SAAS,UAAU;AACnC;MACJ;AACA,iBAAWN,SAAS0B,OAAOC,KAAKrB,IAAAA,GAAO;AACnC,cAAMsB,WAAW,KAAK5C,OAAO6C,OAAOtC,KAAAA,GAAQuC,OAAO9B,KAAAA;AACnD,YAAI,CAAC4B,UAAU;AACX;QACJ;AAEA,YAAIA,SAASG,UAAU;AACnB,cAAIzB,KAAKN,KAAAA,GAAQ;AAEb,uBAAW,CAACgC,WAAWC,OAAAA,KAAYP,OAAOQ,QAAa5B,KAAKN,KAAAA,CAAM,GAAG;AACjE,kBAAI,KAAKd,cAAc8C,SAAAA,KAAcC,SAAS;AAC1C,sBAAM,KAAKpC,QAAQ+B,SAASO,MAAMH,WAAWC,SAAS3B,KAAKN,KAAAA,GAAQ4B,UAAU;qBACtE3B;iBACN;cACL;YACJ;UACJ;QACJ,OAAO;AAEH,cAAI,KAAKhB,SAASe,OAAO;AACrB,kBAAM,KAAKf,SAASe,MAAM4B,UAAUpC,QAAQc,KAAKN,KAAAA,GAAQ;cACrDD,QAAQO;cACRL;cACAD,OAAO4B;YACX,CAAA;UACJ;QACJ;MACJ;IACJ;EACJ;;;EAIA,CAASrB,iBAAiBZ,MAAW;AACjC,QAAIyC,MAAMC,QAAQ1C,IAAAA,GAAO;AACrB,eAAS2C,IAAI3C,KAAK4C,SAAS,GAAGD,KAAK,GAAGA,KAAK;AACvC,cAAM3C,KAAK2C,CAAAA;MACf;IACJ,OAAO;AACH,YAAM3C;IACV;EACJ;AACJ;;;ADpVA,eAAsB6C,cAClBC,YACAC,SACAC,WACAC,eACAC,YACAC,cACAC,QACAC,SAAgB;AAEhB,MAAI,CAACL,aAAc,OAAOA,cAAc,YAAY,CAACM,MAAMC,QAAQP,SAAAA,GAAa;AAC5E,WAAOQ;EACX;AAEA,MAAI,CAACT,QAAQU,WAAW,MAAA,GAAS;AAE7B,WAAOD;EACX;AAEA,SAAO,MAAME,gBAAgBZ,YAAYE,WAAWC,eAAeC,YAAYC,cAAcC,QAAQC,OAAAA;AACzG;AApBsBR;AAsBtB,eAAea,gBACXZ,YACAE,WACAC,eACAC,YACAC,cACAC,QACAC,SAAgB;AAEhB,MAAIM,aAAaX;AACjB,MAAIY,UAAU;AAEd,QAAMC,UAAU,IAAIC,mBAAmBV,QAAQ;IAC3CW,QAAQ,wBAACC,OAAOC,SAAAA;AACZ,UACID,UAAUlB,cACVQ,MAAMC,QAAQI,UAAAA,GAChB;AACE,cAAMO,IAAIC,aAAarB,YAAYa,YAAYM,MAAMb,QAAQC,OAAAA;AAC7D,YAAIa,GAAG;AACHP,uBAAaO;AACbN,oBAAU;QACd;MACJ;IACJ,GAXQ;IAaRQ,YAAY,wBAACJ,OAAOC,SAAAA;AAChB,UACID,UAAUlB,cACVmB,MAAMI,QACNf,MAAMC,QAAQI,UAAAA,GAChB;AACE,mBAAWW,cAAUC,kCAAUN,KAAKI,IAAI,GAAG;AACvC,gBAAMH,IAAIC,aAAarB,YAAYa,YAAYW,QAAQlB,QAAQC,OAAAA;AAC/D,cAAIa,GAAG;AACHP,yBAAaO;AACbN,sBAAU;UACd;QACJ;MACJ;IACJ,GAdY;IAgBZY,QAAQ,wBAACR,OAAOC,SAAAA;AACZ,UACID,UAAUlB,cACV,CAACQ,MAAMC,QAAQI,UAAAA,GACjB;AACE,cAAMO,IAAIO,aAAa3B,YAAYa,YAAYK,OAAOC,MAAMb,QAAQC,OAAAA;AACpE,YAAIa,GAAG;AACHP,uBAAaO;AACbN,oBAAU;QACd;MACJ;IACJ,GAXQ;IAaRc,QAAQ,wBAACV,OAAOC,SAAAA;AACZ,UAAID,UAAUlB,cAAcmB,MAAMU,SAASV,MAAMF,UAAUE,MAAMO,QAAQ;AACrE,cAAMN,IAAIU,aAAa9B,YAAYa,YAAYK,OAAOC,MAAMb,QAAQC,OAAAA;AACpE,YAAIa,GAAG;AACHP,uBAAaO;AACbN,oBAAU;QACd;MACJ;IACJ,GARQ;IAURiB,QAAQ,wBAACb,OAAOC,SAAAA;AACZ,UAAID,UAAUlB,YAAY;AACtB,cAAMoB,IAAIY,aAAahC,YAAYa,YAAYK,OAAOC,MAAMb,QAAQC,OAAAA;AACpE,YAAIa,GAAG;AACHP,uBAAaO;AACbN,oBAAU;QACd;MACJ;IACJ,GARQ;EASZ,CAAA;AAEA,QAAMC,QAAQkB,MAAM9B,eAAeC,YAAYC,YAAAA;AAE/C,QAAM6B,cAAc5B,OAAO6B,OAAOnC,UAAAA,GAAaoC;AAC/CC,wCAAUH,aAAa,SAASlC,UAAAA,sBAAgC;AAEhE,MAAIQ,MAAMC,QAAQI,UAAAA,GAAa;AAI3B,QAAIyB,cAAc;AAClB,aAASC,IAAI,GAAGA,IAAI1B,WAAW2B,QAAQD,KAAK;AACxC,YAAME,OAAO5B,WAAW0B,CAAAA;AACxB,UACI,CAACE,QACD,OAAOA,SAAS,YAChBA,KAAKC,aACP;AACE;MACJ;AAEA,YAAMtB,IAAI,MAAMR,gBAAgBZ,YAAYyC,MAAMtC,eAAeC,YAAYC,cAAcC,QAAQC,OAAAA;AAEnG,UAAIa,KAAK,OAAOA,MAAM,UAAU;AAC5B,YAAI,CAACkB,aAAa;AACdzB,uBAAa;eAAIA;;AACjByB,wBAAc;QAClB;AACAzB,mBAAW0B,CAAAA,IAAKnB;AAChBN,kBAAU;MACd;IACJ;EACJ,WAAWD,eAAe,QAAQ,OAAOA,eAAe,UAAU;AAE9D,UAAM8B,cAAc;MAAE,GAAG9B;IAAW;AAGpC,eAAW,CAAC+B,KAAKC,KAAAA,KAAUC,OAAOC,QAAQJ,WAAAA,GAAc;AACpD,YAAMK,WAAWd,YAAYU,GAAAA;AAC7B,UAAI,CAACI,UAAUC,UAAU;AACrB;MACJ;AAEA,YAAM7B,IAAI,MAAMR,gBACZoC,SAASE,MACTL,OACA1C,eACAC,YACAC,cACAC,QACAC,OAAAA;AAGJ,UAAIa,KAAK,OAAOA,MAAM,UAAU;AAC5BP,qBAAa;UAAE,GAAGA;UAAY,CAAC+B,GAAAA,GAAMxB;QAAE;AACvCN,kBAAU;MACd;IACJ;EACJ;AAEA,SAAOA,UAAUD,aAAaH;AAClC;AAxIeE;AA0If,SAASS,aAAarB,YAAoB2C,aAAkBQ,SAAc7C,QAAmBC,SAAgB;AACzG,MAAI,CAAC4C,SAAS;AACV,WAAOzC;EACX;AAEA,QAAMwB,cAAc5B,OAAO6B,OAAOnC,UAAAA,GAAaoC;AAC/C,MAAI,CAACF,aAAa;AACd,WAAOxB;EACX;AAEA,QAAM0C,SAAc,CAAC;AACrB,QAAMC,gBAAgBP,OAAOQ,KAAKH,OAAAA;AAElCL,SAAOC,QAAQb,WAAAA,EAAaqB,QAAQ,CAAC,CAACC,MAAMC,KAAAA,MAAM;AAC9C,QAAIA,MAAMR,YAAYE,QAAQK,IAAAA,GAAO;AAEjCE,6BAAuBD,OAAOL,QAAQD,QAAQK,IAAAA,CAAK;AACnD;IACJ;AAEA,QAAIH,cAAcM,SAASH,IAAAA,GAAO;AAC9BJ,aAAOI,IAAAA,QAAQI,8BAAMT,QAAQK,IAAAA,CAAK;IACtC,OAAO;AACH,YAAMK,cAAcJ,MAAMK,YAAYC,KAAK,CAACC,SAASA,KAAKR,SAAS,UAAA;AACnE,UAAIC,MAAMP,SAAS,YAAY;AAE3B,YAAIW,eAAeJ,MAAMK,YAAYG,KAAK,CAACD,SAASA,KAAKR,SAAS,YAAA,GAAe;AAC7EJ,iBAAOI,IAAAA,IAAQ,oBAAIU,KAAAA;AACnB;QACJ;MACJ;AAEA,YAAMC,aAAaN,aAAa1C,OAAO,CAAA,GAAI0B;AAC3C,UAAIsB,YAAYC,SAAS,WAAW;AAEhChB,eAAOI,IAAAA,IAAQW,WAAWtB;MAC9B;IACJ;EACJ,CAAA;AAGA,QAAMwB,WAAWC,YAAYhE,QAAQN,UAAAA;AACrCqE,WAASd,QAAQ,CAACgB,MAAAA;AACd,QAAInB,OAAOmB,EAAEf,IAAI,MAAM9C,QAAW;AAC9B,UAAI6D,EAAErB,SAAS,SAASqB,EAAErB,SAAS,UAAU;AACzC,cAAMsB,UAAUhE,MAAMC,QAAQkC,WAAAA,IACxB8B,KAAKC,IAAG,GACD;aAAI/B;UAAagC,IAAI,CAAClC,SAAAA;AACrB,gBAAMmC,MAAMC,SAASpC,KAAK8B,EAAEf,IAAI,CAAC;AACjC,iBAAOsB,MAAMF,GAAAA,IAAO,IAAIA;QAC5B,CAAA,CAAA,IAEJ;AACNxB,eAAOmB,EAAEf,IAAI,IAAIgB,UAAU;MAC/B,OAAO;AACHpB,eAAOmB,EAAEf,IAAI,IAAIuB,OAAOC,WAAU;MACtC;IACJ;EACJ,CAAA;AAEA5B,SAAOV,cAAc;AAErB,MAAInC,SAAS;AACT0E,YAAQC,IAAI,yBAAyBlF,UAAAA,KAAeoD,MAAAA;EACxD;AACA,SAAO;IAACA;OAAY5C,MAAMC,QAAQkC,WAAAA,IAAeA,cAAc,CAAA;;AACnE;AAlEStB;AAoET,SAASM,aACL3B,YACA2C,aACAwC,aACAC,YACA9E,QACAC,SAAgB;AAEhB,MAAI,CAACoC,eAAe,OAAOA,gBAAgB,UAAU;AACjD,WAAOjC;EACX;AAEA,MAAI,CAAC0E,YAAYvD,SAAS,OAAOuD,WAAWvD,UAAU,UAAU;AAC5D,WAAOnB;EACX;AAEA,MAAI,CAAC0E,YAAY7D,QAAQ,OAAO6D,WAAW7D,SAAS,UAAU;AAC1D,WAAOb;EACX;AAEA,MAAI,CAAC2E,cAAcF,aAAaxC,aAAayC,WAAWvD,OAAOvB,MAAAA,GAAS;AACpE,WAAOI;EACX;AAEA,QAAMwB,cAAc5B,OAAO6B,OAAOnC,UAAAA,GAAaoC;AAC/C,MAAI,CAACF,aAAa;AACd,WAAOxB;EACX;AAEA,MAAII,UAAU;AACd,MAAID,aAAa8B;AAEjB,aAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAaqC,WAAW7D,IAAI,GAAG;AAC7D,UAAM+D,YAAYpD,YAAYU,GAAAA;AAC9B,QAAI,CAAC0C,WAAW;AACZ;IACJ;AAEA,QAAIA,UAAUrC,YAAY,CAACJ,OAAO0C,SAAS;AAEvC;IACJ;AAEA,QAAI,CAACzE,SAAS;AAEVD,mBAAa;QAAE,GAAG8B;MAAY;IAClC;AAEA,QAAI2C,UAAUrC,UAAU;AAEpBS,6BAAuB4B,WAAWzE,YAAYgC,KAAAA;IAClD,OAAO;AACHhC,iBAAW+B,GAAAA,QAAOgB,8BAAMf,KAAAA;IAC5B;AACAhC,eAAW6B,cAAc;AACzB5B,cAAU;AAEV,QAAIP,SAAS;AACT0E,cAAQC,IAAI,yBAAyBlF,UAAAA,KAAea,UAAAA;IACxD;EACJ;AAEA,SAAOC,UAAUD,aAAaH;AAClC;AA/DSiB;AAiET,SAASG,aACL9B,YACA2C,aACAzB,OACAC,MACAb,QACAC,SAAgB;AAEhB,MAAIO,UAAU;AACd,MAAID,aAAa8B;AAEjB,MAAInC,MAAMC,QAAQI,UAAAA,GAAa;AAE3B,UAAM2E,aAAa3E,WAAW4E,UAAU,CAACC,MAAML,cAAcnE,OAAOwE,GAAGvE,KAAKU,OAAOvB,MAAAA,CAAAA;AACnF,QAAIkF,cAAc,GAAG;AACjB,YAAMG,eAAehE,aACjB3B,YACAa,WAAW2E,UAAAA,GACXtE,OACA;QAAEW,OAAOV,KAAKU;QAAON,MAAMJ,KAAKO;MAAO,GACvCpB,QACAC,OAAAA;AAEJ,UAAIoF,cAAc;AAEd9E,qBAAa;aAAIA,WAAW+E,MAAM,GAAGJ,UAAAA;UAAaG;aAAiB9E,WAAW+E,MAAMJ,aAAa,CAAA;;AACjG1E,kBAAU;MACd;IACJ,OAAO;AACH,YAAM+E,eAAexE,aAAarB,YAAYa,YAAYM,KAAKF,QAAQX,QAAQC,OAAAA;AAC/E,UAAIsF,cAAc;AACdhF,qBAAagF;AACb/E,kBAAU;MACd;IACJ;EACJ,OAAO;AAEH,UAAM6E,eAAehE,aACjB3B,YACAa,YACAK,OACA;MAAEW,OAAOV,KAAKU;MAAON,MAAMJ,KAAKO;IAAO,GACvCpB,QACAC,OAAAA;AAEJ,QAAIoF,cAAc;AACd9E,mBAAa8E;AACb7E,gBAAU;IACd;EACJ;AAEA,SAAOA,UAAUD,aAAaH;AAClC;AApDSoB;AAsDT,SAASE,aACLhC,YACA2C,aACAwC,aACAC,YACA9E,QACAC,SAAgB;AAIhB,MAAI,CAACoC,eAAe,CAACyC,YAAY;AAC7B,WAAO1E;EACX;AAEA,MAAIV,eAAemF,aAAa;AAC5B,WAAOzE;EACX;AAEA,MAAII,UAAU;AACd,MAAIgF,SAASnD;AAEb,MAAInC,MAAMC,QAAQkC,WAAAA,GAAc;AAC5B,eAAWF,QAAQE,aAAa;AAC5B,UAAI0C,cAAcF,aAAa1C,MAAM2C,YAAY9E,MAAAA,GAAS;AACtDwF,iBAAUA,OAAqBC,OAAO,CAACL,MAAMA,MAAMjD,IAAAA;AACnD3B,kBAAU;AACV,YAAIP,SAAS;AACT0E,kBAAQC,IAAI,yBAAyBlF,UAAAA,KAAeyC,IAAAA;QACxD;MACJ;IACJ;EACJ,OAAO;AACH,QAAI4C,cAAcF,aAAaxC,aAAayC,YAAY9E,MAAAA,GAAS;AAC7DwF,eAAS;AACThF,gBAAU;AACV,UAAIP,SAAS;AACT0E,gBAAQC,IAAI,yBAAyBlF,UAAAA,KAAe2C,WAAAA;MACxD;IACJ;EACJ;AAEA,SAAO7B,UAAUgF,SAASpF;AAC9B;AA1CSsB;AA4CT,SAASqD,cAAcnE,OAAewE,GAAQM,GAAQ1F,QAAiB;AACnE,MAAI,CAACoF,KAAK,CAACM,KAAK,OAAON,MAAM,YAAY,OAAOM,MAAM,UAAU;AAC5D,WAAO;EACX;AACA,QAAM3B,WAAWC,YAAYhE,QAAQY,KAAAA;AACrC,MAAImD,SAAS7B,WAAW,GAAG;AACvB,WAAO;EACX;AACA,SAAO6B,SAAS4B,MAAM,CAAC1B,MAAMmB,EAAEnB,EAAEf,IAAI,MAAMwC,EAAEzB,EAAEf,IAAI,CAAC;AACxD;AATS6B;AAWT,SAAS3B,uBAAuBD,OAAiB5C,YAAiBqF,cAAiB;AAG/E,MAAI,CAACA,cAAcX,SAAS;AACxB;EACJ;AAEA,MAAI,CAAC9B,MAAMR,UAAUb,UAAU,CAACqB,MAAMR,SAASkD,YAAY;AACvD;EACJ;AAEA,aAAW,CAACC,SAASC,OAAAA,SAAYC,4BAAI7C,MAAMR,SAASkD,YAAY1C,MAAMR,SAASb,MAAM,GAAG;AACpF,QAAIgE,WAAWF,aAAaX,SAAS;AACjC1E,iBAAWwF,OAAAA,IAAWH,aAAaX,QAAQa,OAAAA;IAC/C;EACJ;AACJ;AAhBS1C;AAkBT,SAASY,YAAYhE,QAAmBY,OAAa;AACjD,UAAQZ,OAAO6B,OAAOjB,KAAAA,GAAQmD,YAAY,CAAA,GAAIM,IAAI,CAACJ,MAAMjE,OAAO6B,OAAOjB,KAAAA,EAAQkB,OAAOmC,CAAAA,CAAE;AAC5F;AAFSD;;;AGxaF,IAAMiC,oBAAN,MAAMA;EAHb,OAGaA;;;;;EACT,YACqBC,QACAC,UACnB;SAFmBD,SAAAA;SACAC,WAAAA;EAClB;EAEHC,QAAQC,OAAeC,OAA6BC,MAAwCC,MAAe;AACvG,QAAI,KAAKL,SAASG,OAAO;AACrB,YAAMG,IAAI,KAAKN,SAASG,MAAMD,OAAOC,OAAOC,MAAMC,IAAAA;AAClD,UAAIC,MAAM,OAAO;AACb;MACJ;IACJ;AAEA,QAAI,CAACD,QAAQ,OAAOA,SAAS,UAAU;AACnC;IACJ;AAEA,QAAIE;AACJ,QAAIC;AACJ,QAAKH,KAAaI,QAAQ;AACtBF,sBAAiBF,KAAaI;AAC9BD,iBAAW;IACf,WAAYH,KAAaK,SAAS;AAC9BH,sBAAiBF,KAAaK;AAC9BF,iBAAW;IACf;AAEA,QAAID,iBAAiB,OAAOA,kBAAkB,UAAU;AACpD,iBAAW,CAACI,GAAGC,CAAAA,KAAMC,OAAOC,QAAQP,aAAAA,GAAgB;AAChD,YAAII,MAAM,YAAY,OAAOC,MAAM,YAAYA,GAAG;AAE9C,eAAKX,QAAQC,OAAOC,OAAOC,MAAMQ,CAAAA;QACrC,OAAO;AACH,gBAAMT,SAAQ,KAAKJ,OAAOgB,OAAOb,KAAAA,GAAQc,OAAOL,CAAAA;AAChD,cAAIR,QAAO;AACP,iBAAKF,QAAQE,OAAMc,MAAMd,QAAOK,UAAUI,CAAAA;UAC9C;QACJ;MACJ;IACJ;EACJ;EAEAM,MAAMhB,OAAeG,MAAe;AAChC,SAAKJ,QAAQC,OAAOiB,QAAWA,QAAWd,IAAAA;EAC9C;AACJ;;;AC/CO,SAASe,cAAcC,OAAeC,QAAmBC,MAAS;AACrE,QAAMC,SAAS,oBAAIC,IAAAA;AACnBD,SAAOE,IAAIL,KAAAA;AACX,QAAMM,UAAU,IAAIC,kBAAkBN,QAAQ;IAC1CO,OAAO,wBAACR,WAAAA;AACJG,aAAOE,IAAIL,MAAAA;AACX,aAAO;IACX,GAHO;EAIX,CAAA;AACAM,UAAQG,MAAMT,OAAOE,IAAAA;AACrB,SAAO;OAAIC;;AACf;AAXgBJ;AAgBhB,eAAsBW,iBAClBV,OACAW,WACAC,cACAX,QAAiB;AAEjB,QAAME,SAAS,oBAAIC,IAAAA;AACnBD,SAAOE,IAAIL,KAAAA;AAEX,MAAIY,cAAc;AACd,UAAMC,WAAW,wBAACb,WAAkB,KAAKG,OAAOE,IAAIL,MAAAA,GAAnC;AAGjB,UAAMc,cAAc,wBAACd,WAAAA;AACjB,YAAMe,WAAW,oBAAIX,IAAAA;AACrB,YAAMY,UAAU,oBAAIZ,IAAAA;AACpBa,4BAAsBjB,QAAOC,QAAQc,UAAUC,OAAAA;AAC/CD,eAASG,QAAQ,CAACC,MAAMN,SAASM,CAAAA,CAAAA;IACrC,GALoB;AAOpB,UAAMb,UAAU,IAAIc,mBAAmBnB,QAAQ;MAC3CoB,QAAQR;MACRS,YAAYT;MACZU,iBAAiBV;MACjBW,SAASX;MACTY,YAAYZ;MACZa,KAAKb;MACLc,QAAQd;MACRe,YAAYf;MACZgB,QAAQhB;MACRiB,QAAQ,wBAAC9B,WAAAA;AACLa,iBAASb,MAAAA;AACTc,oBAAYd,MAAAA;MAChB,GAHQ;MAIR+B,YAAY,wBAAC/B,WAAAA;AACTa,iBAASb,MAAAA;AACTc,oBAAYd,MAAAA;MAChB,GAHY;IAIhB,CAAA;AACA,UAAMM,QAAQG,MAAMT,OAAOW,WAAWC,YAAAA;EAC1C;AAGAT,SAAOe,QAAQ,CAACC,MAAAA;AACZa,uBAAmBb,GAAGlB,QAAQE,MAAAA;EAClC,CAAA;AAEA,SAAO;OAAIA;;AACf;AAhDsBO;AAkDtB,SAASO,sBAAsBjB,OAAeC,QAAmBE,QAAqBa,SAAoB;AACtG,MAAIA,QAAQiB,IAAIjC,KAAAA,GAAQ;AAEpB;EACJ;AACAgB,UAAQX,IAAIL,KAAAA;AAEZ,QAAMkC,WAAWjC,OAAOkC,OAAOnC,KAAAA;AAC/B,MAAI,CAACkC,UAAU;AACX;EACJ;AAEA,aAAW,CAACE,WAAWF,SAAAA,KAAaG,OAAOC,QAAQrC,OAAOkC,MAAM,GAAG;AAC/D,QAAI,CAACD,WAAU;AACX;IACJ;AACA,eAAWK,YAAYF,OAAOG,OAAON,UAASO,MAAM,GAAG;AACnD,UAAIF,SAASG,UAAUC,aAAa,aAAaJ,SAASK,SAAS5C,OAAO;AACtE,YAAI,CAACG,OAAO8B,IAAIG,SAAAA,GAAY;AACxBjC,iBAAOE,IAAI+B,SAAAA;QACf;AACAnB,8BAAsBmB,WAAWnC,QAAQE,QAAQa,OAAAA;MACrD;IACJ;EACJ;AACJ;AAzBSC;AA2BT,SAASe,mBAAmBhC,OAAeC,QAAmBE,QAAmB;AAC7E,QAAM+B,WAAWjC,OAAOkC,OAAOnC,KAAAA;AAC/B,MAAI,CAACkC,UAAU;AACX;EACJ;AACA,MAAIA,SAASW,WAAW;AACpB1C,WAAOE,IAAI6B,SAASW,SAAS;AAC7Bb,uBAAmBE,SAASW,WAAW5C,QAAQE,MAAAA;EACnD;AACJ;AATS6B;;;AC1GT,oBAAuB;AACvB,qBAAoB;AACpB,uBAAsB;AAEtBc,iBAAAA,QAAUC,eACN;EACIC,cAAc,wBAACC,MACXA,aAAaC,eAAAA;EAEbD,GAAGE,gBAAgB,oBAHT;EAIdC,WAAW,wBAACH,MAAMA,EAAEI,OAAM,GAAf;EACXC,aAAa,wBAACL,MAAM,IAAIC,eAAAA,QAAQD,CAAAA,GAAnB;AACjB,GACA,SAAA;AAGJH,iBAAAA,QAAUC,eACN;EACIC,cAAc,wBAACC,MAAmBM,qBAAOC,SAASP,CAAAA,GAApC;EACdG,WAAW,wBAACH,MAAMA,EAAEQ,SAAS,QAAA,GAAlB;EACXH,aAAa,wBAACL,MAAMM,qBAAOG,KAAKT,GAAG,QAAA,GAAtB;AACjB,GACA,OAAA;AAMG,SAASG,UAAUO,OAAc;AACpC,QAAM,EAAEC,MAAMC,KAAI,IAAKf,iBAAAA,QAAUM,UAAUO,KAAAA;AAC3C,SAAO;IAAEG,MAAMF;IAAMC;EAAK;AAC9B;AAHgBT;AAQT,SAASE,YAAYK,OAAgBE,MAAS;AACjD,SAAOf,iBAAAA,QAAUQ,YAAY;IAAEM,MAAMD;IAAcE;EAAK,CAAA;AAC5D;AAFgBP;;;AN1BT,IAAMS,yBAAyB;AAK/B,IAAMC,mBAAmB;AAgHhC,eAAsBC,QAAWC,KAAaC,SAAuBC,aAAqB;AACtF,QAAMC,SAASD,eAAeE;AAC9B,QAAMC,MAAM,MAAMF,OAAOH,KAAKC,OAAAA;AAC9B,MAAI,CAACI,IAAIC,IAAI;AACT,UAAMC,UAAUC,UAAU,MAAMH,IAAII,KAAI,CAAA;AACxC,QAAIF,QAAQG,OAAOC,oBAAoBJ,QAAQG,OAAOE,iBAAiB,oBAAoB;AAEvF,aAAOC;IACX;AACA,UAAMH,QAAoB,IAAII,MAAM,4CAAA;AACpCJ,UAAMK,OAAOR,QAAQG;AACrBA,UAAMM,SAASX,IAAIW;AACnB,UAAMN;EACV;AAEA,QAAMO,aAAa,MAAMZ,IAAII,KAAI;AACjC,MAAI;AACA,WAAOD,UAAUS,UAAAA,EAAYC;EACjC,SAASC,KAAK;AACVC,YAAQV,MAAM,+BAA+BO,UAAAA;AAC7C,UAAME;EACV;AACJ;AAtBsBpB;AA2Cf,SAASsB,YACZC,OACAC,WACAC,MACAvB,UAA4D;EAAEwB,UAAU;EAAOC,kBAAkB;AAAK,GAAC;AAEvG,QAAMD,WAAWxB,QAAQwB;AAEzB,QAAMC,oBAAmBzB,QAAQwB,WAAW,QAAQxB,QAAQyB;AAC5D,SAAO;IAAC5B;IAAkBwB;IAAOC;IAAYC;IAAM;MAAEC;MAAUC,kBAAAA;IAAiB;;AACpF;AAVgBL;AAYT,SAASM,QAAQC,OAAc;AAClC,QAAM,EAAEV,MAAMW,KAAI,IAAKC,UAAUF,KAAAA;AACjC,MAAIC,MAAM;AACN,WAAOE,KAAKC,UAAU;MAAE,GAAId;MAAcW,MAAM;QAAEI,eAAeJ;MAAK;IAAE,CAAA;EAC5E,OAAO;AACH,WAAOE,KAAKC,UAAUd,IAAAA;EAC1B;AACJ;AAPgBS;AAST,SAASnB,UAAUoB,OAAa;AACnC,QAAMM,SAASH,KAAKI,MAAMP,KAAAA;AAC1B,MAAI,OAAOM,WAAW,YAAYA,QAAQhB,QAAQgB,QAAQL,MAAMI,eAAe;AAC3E,UAAMG,mBAAmBC,YAAYH,OAAOhB,MAAMgB,OAAOL,KAAKI,aAAa;AAC3E,WAAO;MAAE,GAAGC;MAAQhB,MAAMkB;IAAiB;EAC/C,OAAO;AACH,WAAOF;EACX;AACJ;AARgB1B;AAUT,SAAS8B,QAAQC,UAAkBjB,OAAeC,WAAmBC,MAAc;AACtF,QAAMgB,UAAU,GAAGD,QAAAA,QAAYE,uCAAenB,KAAAA,CAAAA,IAAUC,SAAAA;AACxD,MAAI,CAACC,MAAM;AACP,WAAOgB;EACX;AAEA,QAAM,EAAEtB,MAAMW,KAAI,IAAKC,UAAUN,IAAAA;AACjC,MAAIkB,SAAS,GAAGF,OAAAA,MAAaG,mBAAmBZ,KAAKC,UAAUd,IAAAA,CAAAA,CAAAA;AAC/D,MAAIW,MAAM;AACNa,cAAU,SAASC,mBAAmBZ,KAAKC,UAAU;MAAEC,eAAeJ;IAAK,CAAA,CAAA,CAAA;EAC/E;AACA,SAAOa;AACX;AAZgBJ;AAuBT,SAASM,kBACZtB,OACAC,WACAsB,QACA5C,SACA6C,YACAC,UAAU,OAAK;AAEf,QAAMC,gBAAgB/C,SAASgD;AAC/BhD,UAAQgD,YAAY,UAAUzB,SAAAA;AAC1B,UAAM,CAAC0B,GAAGC,SAAAA,IAAa3B;AACvB,UAAM4B,YAAY,MAAMC,yBACpB/B,OACAC,WACA4B,WACAN,QACAE,OAAAA;AAEJ,UAAMD,WAAWM,SAAAA;AACjB,WAAOJ,gBAAAA,GAAmBxB,IAAAA;EAC9B;AACJ;AArBgBoB;AAwBhB,eAAeS,yBACX/B,OACAC,WACA+B,cACAT,QACAE,UAAU,OAAK;AAEf,QAAMQ,gBAAgB,MAAMC,iBAAiBlC,OAAOC,WAAW+B,cAAcT,MAAAA;AAE7E,SAAO,CAAC,EAAEY,SAAQ,MAAoC;AAClD,UAAM,CAACP,GAAGQ,YAAAA,EAAclC,IAAAA,IAAQiC;AAEhC,QAAIF,cAAcI,SAASD,UAAAA,GAAa;AAEpC,UAAIX,SAAS;AACT3B,gBAAQwC,IAAI,sBAAsB7B,KAAKC,UAAUyB,QAAAA,CAAAA,qBAA8BnC,KAAAA,IAASC,SAAAA,GAAY;MACxG;AACA,aAAO;IACX;AAEA,QAAIC,MAAM;AAEN,UAAIqC,eAAeH,YAAYH,eAAeV,QAAQrB,IAAAA,GAAO;AACzD,YAAIuB,SAAS;AACT3B,kBAAQwC,IACJ,sBAAsB7B,KAAKC,UAAUyB,QAAAA,CAAAA,qBAA8BnC,KAAAA,IAASC,SAAAA,GAAY;QAEhG;AACA,eAAO;MACX;IACJ;AAEA,WAAO;EACX;AACJ;AAlCe8B;AAqCf,SAASQ,eAAeC,eAAuBC,cAAwBlB,QAAmBrB,MAAS;AAC/F,QAAMwC,aAAaC,cAAcH,eAAejB,QAAQrB,IAAAA;AACxD,SAAOuC,aAAaG,KAAK,CAACC,MAAMH,WAAWL,SAASQ,CAAAA,CAAAA;AACxD;AAHSN;AAkBF,SAASO,sBACZ9C,OACAC,WACAsB,QACA5C,SACAoE,YACAC,UACAxB,YACAC,UAAU,OAAK;AAEf,QAAMwB,eAAetE,SAASuE;AAC9B,QAAMC,gBAAgBxE,SAASyE;AAG/BzE,UAAQuE,WAAW,UAAUhD,SAAAA;AACzB,UAAM,CAAC2B,SAAAA,IAAa3B;AACpB,UAAME,iBACFJ,OACAC,WACA4B,WACAlD,SACA4C,QACAwB,YACAC,UACAvB,OAAAA;AAEJ,WAAOwB,eAAAA,GAAkB/C,IAAAA;EAC7B;AAGAvB,UAAQyE,YAAY,UAAUlD,SAAAA;AAC1B,QAAIsB,YAAY;AACZ,YAAM,CAAA,EAAA,EAAKK,SAAAA,IAAa3B;AACxB,YAAM4B,YAAY,MAAMC,yBACpB/B,OACAC,WACA4B,WACAN,QACAE,OAAAA;AAEJ,YAAMD,WAAWM,SAAAA;IACrB;AACA,WAAOqB,gBAAAA,GAAmBjD,IAAAA;EAC9B;AACJ;AA5CgB4C;AA+ChB,eAAe1C,iBACXiD,eACAC,YACAtB,cACArD,SACA4C,QACAwB,YACAC,UACAvB,UAAU,OAAK;AAEf,aAAW8B,aAAaR,YAAY;AAChC,UAAM,EACFZ,UACAqB,OAAO,EAAE5D,MAAMR,MAAK,EAAE,IACtBmE;AAEJ,QAAI,CAACE,mBAAmBtB,QAAAA,GAAW;AAE/B;IACJ;AAEA,QAAI/C,OAAO;AACP,UAAIqC,SAAS;AACT3B,gBAAQ4D,KAAK,kCAAkCjD,KAAKC,UAAUyB,QAAAA,CAAAA,kBAA2B/C,KAAAA;MAC7F;AACA;IACJ;AAEA,UAAM,CAACwC,GAAGQ,YAAYuB,gBAAgBC,WAAWC,YAAAA,IAAgB1B;AACjE,QAAI,CAAC0B,cAAczD,kBAAkB;AACjC,UAAIqB,SAAS;AACT3B,gBAAQwC,IAAI,kCAAkC7B,KAAKC,UAAUyB,QAAAA,CAAAA,iBAA0B;MAC3F;AACA;IACJ;AAEA,QAAIxD,QAAQmF,wBAAwB;AAChC,YAAMC,iBAAiB,MAAMpF,QAAQmF,uBAAuB;QACxD1B;QACAuB;QACAC;QACAI,aAAapE;QACboC;MACJ,CAAA;AAEA,UAAI+B,gBAAgBE,SAAS,QAAQ;AAEjC,YAAIxC,SAAS;AACT3B,kBAAQwC,IAAI,kCAAkC7B,KAAKC,UAAUyB,QAAAA,CAAAA,kBAA2B;QAC5F;AACA;MACJ,WAAW4B,gBAAgBE,SAAS,UAAU;AAE1C,YAAIxC,SAAS;AACT3B,kBAAQwC,IAAI,iCAAiC7B,KAAKC,UAAUyB,QAAAA,CAAAA,kBAA2B;QAC3F;AACAa,iBAASb,UAAU4B,eAAenE,IAAI;AACtC;MACJ;IACJ;AAGA,UAAMsE,cAAc,MAAMC,cACtB/B,YACAuB,gBACA/D,MACAyD,eACAC,YACAtB,cACAT,QACAE,OAAAA;AAGJ,QAAIyC,gBAAgB3E,QAAW;AAE3B,UAAIkC,SAAS;AACT3B,gBAAQwC,IACJ,iCAAiC7B,KAAKC,UAClCyB,QAAAA,CAAAA,qBACkBkB,aAAAA,IAAiBC,UAAAA,GAAa;MAE5D;AACAN,eAASb,UAAU+B,WAAAA;IACvB;EACJ;AACJ;AArFe9D;AAuFf,SAASqD,mBAAmBtB,UAA4B;AACpD,MAAIA,SAASiC,SAAS,GAAG;AACrB,WAAO;EACX;AAEA,MAAIjC,SAAS,CAAA,MAAO3D,kBAAkB;AAClC,WAAO;EACX;AAEA,SAAO;AACX;AAVSiF;;;AD5XF,IAAMY,qBAAqB;AAO3B,SAASC,oBAAoBC,SAAmB;AACnDC,0BAAoBH,oBAAoBE,OAAAA;AAC5C;AAFgBD;AAOT,SAASG,4BAA4BF,SAAmB;AAC3DC,0BAAoBH,oBAAoBE,OAAAA;AAC5C;AAFgBE;AAIhB,SAASC,mBAAAA;AACL,QAAM,EAAEC,UAAU,GAAGC,KAAAA,QAASC,mBAAmBR,oBAAoB;IACjEM,UAAUG;IACVC,OAAOC;IACPC,SAAS;EACb,CAAA;AACA,SAAO;IAAEN,UAAUA,YAAYG;IAAwB,GAAGF;EAAK;AACnE;AAPSF;AA6HF,SAASQ,iBAA2CC,QAAc;AACrE,SAAOC,OAAOC,KAAKF,OAAOG,MAAM,EAAEC,OAAO,CAACC,KAAKC,UAAAA;AAC1CD,YAAYE,uCAAeD,KAAAA,CAAAA,IAAUE,gBAAgBR,QAAQM,KAAAA;AAC9D,WAAOD;EACX,GAAG,CAAC,CAAA;AACR;AALgBN;AAUT,SAASS,gBACZR,QACAM,OAAY;AAEZ,QAAMG,WAAWR,OAAOS,OAAOV,OAAOG,MAAM,EAAEQ,KAAK,CAACC,MAAMA,EAAEC,KAAKC,YAAW,MAAOR,MAAMQ,YAAW,CAAA;AACpG,MAAI,CAACL,UAAU;AACX,UAAM,IAAIM,MAAM,UAAUT,KAAAA,uBAA4B;EAC1D;AAEA,QAAMU,YAAYP,SAASI;AAE3B,SAAO;IACHI,eAAe,wBAACC,MAAWC,YAAAA;AACvB,aAAOC,iBAAiBpB,QAAQgB,WAAW,cAAcE,MAAMC,OAAAA;IACnE,GAFe;IAIfE,cAAc,wBAACH,MAAWC,YAAAA;AACtB,aAAOC,iBAAiBpB,QAAQgB,WAAW,aAAaE,MAAMC,OAAAA;IAClE,GAFc;IAIdG,aAAa,wBAACJ,MAAWC,YAAAA;AACrB,aAAOC,iBAAiBpB,QAAQgB,WAAW,YAAYE,MAAMC,OAAAA;IACjE,GAFa;IAIbI,qBAAqB,wBAACL,MAAWC,YAAAA;AAC7B,aAAOK,yBAAyBxB,QAAQgB,WAAW,YAAYE,MAAMC,OAAAA;IACzE,GAFqB;IAIrBM,WAAW,wBAACN,YAAAA;AACR,aAAOO,oBAAoB1B,QAAQgB,WAAW,QAAQ,UAAUG,OAAAA;IACpE,GAFW;IAIXQ,eAAe,wBAACR,YAAAA;AACZ,aAAOO,oBAAoB1B,QAAQgB,WAAW,QAAQ,cAAcG,OAAAA;IACxE,GAFe;IAIfS,wBAAwB,wBAACT,YAAAA;AACrB,aAAOO,oBAAoB1B,QAAQgB,WAAW,QAAQ,uBAAuBG,OAAAA;IACjF,GAFwB;IAIxBU,WAAW,wBAACV,YAAAA;AACR,aAAOO,oBAAoB1B,QAAQgB,WAAW,OAAO,UAAUG,OAAAA;IACnE,GAFW;IAIXW,eAAe,wBAACX,YAAAA;AACZ,aAAOO,oBAAoB1B,QAAQgB,WAAW,OAAO,cAAcG,OAAAA;IACvE,GAFe;IAIfY,wBAAwB,wBAACZ,YAAAA;AACrB,aAAOO,oBAAoB1B,QAAQgB,WAAW,OAAO,uBAAuBG,OAAAA;IAChF,GAFwB;IAIxBa,WAAW,wBAACb,YAAAA;AACR,aAAOO,oBAAoB1B,QAAQgB,WAAW,QAAQ,UAAUG,OAAAA;IACpE,GAFW;IAIXc,WAAW,wBAACd,YAAAA;AACR,aAAOO,oBAAoB1B,QAAQgB,WAAW,UAAU,UAAUG,OAAAA;IACtE,GAFW;IAIXe,eAAe,wBAACf,YAAAA;AACZ,aAAOO,oBAAoB1B,QAAQgB,WAAW,UAAU,cAAcG,OAAAA;IAC1E,GAFe;IAIfgB,UAAU,wBAACjB,MAAWC,YAAAA;AAClB,aAAOC,iBAAiBpB,QAAQgB,WAAW,SAASE,MAAMC,OAAAA;IAC9D,GAFU;IAIViB,cAAc,wBAAClB,MAAWC,YAAAA;AACtB,aAAOC,iBAAiBpB,QAAQgB,WAAW,aAAaE,MAAMC,OAAAA;IAClE,GAFc;IAIdkB,YAAY,wBAACnB,MAAWC,YAAAA;AACpB,aAAOC,iBAAiBpB,QAAQgB,WAAW,WAAWE,MAAMC,OAAAA;IAChE,GAFY;EAGhB;AACJ;AA5EgBX;AA8ET,SAASY,iBACZkB,SACAhC,OACAiC,WACArB,MACAC,SAEC;AAED,QAAMqB,gBAAYC,oBAAQvB,IAAAA;AAC1B,QAAM,EAAEwB,kBAAAA,mBAAkB,GAAGC,YAAAA,QAAgBF,oBAAQtB,OAAAA,KAAY,CAAC;AAClE,QAAMyB,WAAWC,YAAYvC,OAAOiC,WAAWC,WAAW;IACtDM,UAAU;IACVJ,kBAAkBA,sBAAqB;EAC3C,CAAA;AACA,QAAM,EAAElD,UAAUI,OAAAA,OAAK,IAAKL,iBAAAA;AAE5B,QAAMwD,eAAoB;IACtBH;IACAI,SAAS,wBAAC,EAAEJ,UAAAA,WAAUK,OAAM,MAAO;AAC/B,YAAM,CAACC,SAASC,QAAQC,KAAKlC,KAAAA,IAAQ0B;AACrC,YAAMS,SAASC,QAAQ9D,UAAUc,OAAOiC,WAAWrB,KAAAA;AACnD,aAAOqC,QAAsBF,QAAQ;QAAEJ;MAAO,GAAGrD,MAAAA;IACrD,GAJS;IAKT,GAAG+C;EACP;AACA,SAAO;IAAEC;IAAU,OAAGY,2BAA4CT,YAAAA;EAAc;AACpF;AA3BgB3B;AA6BT,SAASI,yBACZc,SACAhC,OACAiC,WACArB,MACAC,SAOe;AAEfA,YAAUA,WAAW;IAAEsC,kBAAkB,6BAAM5D,QAAN;EAAgB;AACzD,QAAM,EAAEL,UAAUI,OAAAA,OAAK,IAAKL,iBAAAA;AAC5B,QAAMiD,gBAAYC,oBAAQvB,IAAAA;AAC1B,QAAMwC,mBAAejB,oBAAQtB,OAAAA;AAC7B,QAAMyB,WAAWC,YAAYvC,OAAOiC,WAAWC,WAAW;IAAEM,UAAU;IAAMJ,kBAAkB;EAAM,CAAA;AAEpG,QAAMK,eAAoB;IACtBH;IACAI,SAAS,wBAAC,EAAEJ,UAAAA,WAAUK,OAAM,MAAO;AAC/B,YAAM,CAACC,SAASC,QAAQC,KAAKlC,KAAAA,IAAQ0B;AACrC,YAAMS,SAASC,QAAQ9D,UAAUc,OAAOiC,WAAWrB,KAAAA;AACnD,aAAOqC,QAAsBF,QAAQ;QAAEJ;MAAO,GAAGrD,MAAAA;IACrD,GAJS;IAKT+D,kBAAkBnB;IAClB,GAAGkB;EACP;AACA,SAAO;IACHd;IACA,OAAGgB,mCAAiBb,YAAAA;EACxB;AACJ;AAlCgBvB;AA+CT,SAASE,oBACZ1B,QACAM,OACAuD,QACAtB,WACApB,SAEC;AAED,QAAM,EAAE3B,UAAUI,OAAAA,QAAOE,QAAO,IAAKP,iBAAAA;AACrC,QAAMuE,kBAAcC,iCAAAA;AACpB,QAAMC,aAAa,wBAACC,SAAAA;AAChB,UAAMZ,SACFQ,WAAW,WAAWP,QAAQ9D,UAAUc,OAAOiC,WAAW0B,IAAAA,IAAQX,QAAQ9D,UAAUc,OAAOiC,SAAAA;AAC/F,UAAM2B,YAAyB;MAC3BL;MACA,GAAIA,WAAW,YAAY;QACvBM,SAAS;UACL,gBAAgB;QACpB;QACAC,MAAMC,QAAQJ,IAAAA;MAClB;IACJ;AACA,WAAOV,QAAWF,QAAQa,WAAWtE,MAAAA;EACzC,GAbmB;AAenB,QAAM8D,mBAAejB,oBAAQtB,OAAAA;AAC7B,QAAM4B,eAAoB;IAAE,GAAGW;IAAcM;EAAW;AACxD,QAAMM,oBAAoBZ,cAAcY,sBAAsB;AAC9D,QAAM5B,oBAAmB,CAAC,CAACgB,cAAchB;AAEzC,MAAIH,WAAW;AACX,QAAI+B,mBAAmB;AACnBC,wBACIjE,OACAiC,WACAvC,QACA+C,cACA,CAACyB,cAAcV,YAAYQ,kBAAkB;QAAEE;MAAU,CAAA,GACzD1E,OAAAA;IAER;AAEA,QAAI4C,mBAAkB;AAClB+B,4BACInE,OACAiC,WACAvC,QACA+C,cACAe,YAAYY,cAAa,EAAGC,OAAM,GAClC,CAAC/B,UAAUqB,SAAAA;AAEPH,oBAAYc,aAAsBhC,UAAUqB,IAAAA;AAG5CH,oBAAYe,cAAc;UAAEjC;QAAS,GAAG;UAAEkC,QAAQ;UAAOC,QAAQ;QAAK,CAAA;MAC1E,GACAT,oBAAoB,CAACE,cAAcV,YAAYQ,kBAAkB;QAAEE;MAAU,CAAA,IAAK3E,QAClFC,OAAAA;IAER;EACJ;AAEA,aAAOkF,8BAAYjC,YAAAA;AACvB;AAhEgBrB;","names":["import_common_helpers","import_common_helpers","import_common_helpers","ORMWriteActions","NestedWriteVisitor","schema","callback","isWriteAction","value","ORMWriteActions","includes","visit","model","action","args","topData","data","where","doVisit","undefined","parent","field","nestingPath","toplevel","context","pushNewContext","unique","item","enumerateReverse","newContext","callbackResult","create","subPayload","visitSubPayload","createMany","connectOrCreate","connect","disconnect","set","update","updateMany","upsert","delete","deleteMany","Error","payload","enumerate","Object","keys","fieldDef","models","fields","relation","subAction","subData","entries","type","Array","isArray","i","length","applyMutation","queryModel","queryOp","queryData","mutationModel","mutationOp","mutationArgs","schema","logging","Array","isArray","undefined","startsWith","doApplyMutation","resultData","updated","visitor","NestedWriteVisitor","create","model","args","r","createMutate","createMany","data","oneArg","enumerate","update","updateMutate","upsert","where","upsertMutate","delete","deleteMutate","visit","modelFields","models","fields","invariant","arrayCloned","i","length","item","$optimistic","currentData","key","value","Object","entries","fieldDef","relation","type","newData","insert","newDataFields","keys","forEach","name","field","assignForeignKeyFields","includes","clone","defaultAttr","attributes","find","attr","some","Date","defaultArg","kind","idFields","getIdFields","f","currMax","Math","max","map","idv","parseInt","isNaN","crypto","randomUUID","console","log","mutateModel","mutateArgs","idFieldsMatch","fieldInfo","connect","foundIndex","findIndex","x","updateResult","slice","createResult","result","filter","y","every","mutationData","references","idField","fkField","zip","NestedReadVisitor","schema","callback","doVisit","model","field","kind","args","r","selectInclude","nextKind","select","include","k","v","Object","entries","models","fields","type","visit","undefined","getReadModels","model","schema","args","result","Set","add","visitor","NestedReadVisitor","field","visit","getMutatedModels","operation","mutationArgs","addModel","addCascades","cascades","visited","collectDeleteCascades","forEach","m","NestedWriteVisitor","create","createMany","connectOrCreate","connect","disconnect","set","update","updateMany","upsert","delete","deleteMany","getBaseRecursively","has","modelDef","models","modelName","Object","entries","fieldDef","values","fields","relation","onDelete","type","baseModel","SuperJSON","registerCustom","isApplicable","v","Decimal","toStringTag","serialize","toJSON","deserialize","Buffer","isBuffer","toString","from","value","json","meta","data","DEFAULT_QUERY_ENDPOINT","QUERY_KEY_PREFIX","fetcher","url","options","customFetch","_fetch","fetch","res","ok","errData","unmarshal","text","error","rejectedByPolicy","rejectReason","undefined","Error","info","status","textResult","data","err","console","getQueryKey","model","operation","args","infinite","optimisticUpdate","marshal","value","meta","serialize","JSON","stringify","serialization","parsed","parse","deserializedData","deserialize","makeUrl","endpoint","baseUrl","lowerCaseFirst","result","encodeURIComponent","setupInvalidation","schema","invalidate","logging","origOnSuccess","onSuccess","_","variables","predicate","getInvalidationPredicate","mutationArgs","mutatedModels","getMutatedModels","queryKey","queryModel","includes","log","findNestedRead","visitingModel","targetModels","modelsRead","getReadModels","some","m","setupOptimisticUpdate","queryCache","setCache","origOnMutate","onMutate","origOnSettled","onSettled","mutationModel","mutationOp","cacheItem","state","isZenStackQueryKey","warn","queryOperation","queryArgs","queryOptions","optimisticDataProvider","providerResult","currentData","kind","mutatedData","applyMutation","length","VueQueryContextKey","provideHooksContext","context","provide","provideQuerySettingsContext","getQuerySettings","endpoint","rest","inject","DEFAULT_QUERY_ENDPOINT","fetch","undefined","logging","useClientQueries","schema","Object","keys","models","reduce","acc","model","lowerCaseFirst","useModelQueries","modelDef","values","find","m","name","toLowerCase","Error","modelName","useFindUnique","args","options","useInternalQuery","useFindFirst","useFindMany","useInfiniteFindMany","useInternalInfiniteQuery","useCreate","useInternalMutation","useCreateMany","useCreateManyAndReturn","useUpdate","useUpdateMany","useUpdateManyAndReturn","useUpsert","useDelete","useDeleteMany","useCount","useAggregate","useGroupBy","_schema","operation","argsValue","toValue","optimisticUpdate","restOptions","queryKey","getQueryKey","infinite","finalOptions","queryFn","signal","_prefix","_model","_op","reqUrl","makeUrl","fetcher","useQuery","getNextPageParam","optionsValue","initialPageParam","useInfiniteQuery","method","queryClient","useQueryClient","mutationFn","data","fetchInit","headers","body","marshal","invalidateQueries","setupInvalidation","predicate","setupOptimisticUpdate","getQueryCache","getAll","setQueryData","cancelQueries","revert","silent","useMutation"]}
|
package/dist/vue.d.cts
CHANGED
|
@@ -4,8 +4,8 @@ import * as vue from 'vue';
|
|
|
4
4
|
import { MaybeRefOrGetter, UnwrapRef } from 'vue';
|
|
5
5
|
import { SelectIncludeOmit, ModelResult, FindUniqueArgs, SelectSubset, FindArgs, CreateArgs, CreateManyArgs, BatchResult, CreateManyAndReturnArgs, UpdateArgs, UpdateManyArgs, UpdateManyAndReturnArgs, UpsertArgs, DeleteArgs, DeleteManyArgs, CountArgs, Subset, CountResult, AggregateArgs, AggregateResult, GroupByArgs, GroupByResult } from '@zenstackhq/orm';
|
|
6
6
|
import { SchemaDef, GetModels } from '@zenstackhq/schema';
|
|
7
|
-
import { A as APIContext, E as ExtraQueryOptions, a as ExtraMutationOptions, T as TrimDelegateModelOperations } from './types-
|
|
8
|
-
export { F as FetchFn } from './types-
|
|
7
|
+
import { A as APIContext, E as ExtraQueryOptions, W as WithOptimistic, a as ExtraMutationOptions, T as TrimDelegateModelOperations } from './types-C8iIZD-7.cjs';
|
|
8
|
+
export { F as FetchFn } from './types-C8iIZD-7.cjs';
|
|
9
9
|
|
|
10
10
|
declare const VueQueryContextKey = "zenstack-vue-query-context";
|
|
11
11
|
/**
|
|
@@ -19,7 +19,7 @@ declare function provideHooksContext(context: APIContext): void;
|
|
|
19
19
|
*/
|
|
20
20
|
declare function provideQuerySettingsContext(context: APIContext): void;
|
|
21
21
|
type ModelQueryOptions<T> = MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<T, DefaultError>>, 'queryKey'> & ExtraQueryOptions>;
|
|
22
|
-
type ModelQueryResult<T> = UseQueryReturnType<T
|
|
22
|
+
type ModelQueryResult<T> = UseQueryReturnType<WithOptimistic<T>, DefaultError> & {
|
|
23
23
|
queryKey: QueryKey;
|
|
24
24
|
};
|
|
25
25
|
type ModelInfiniteQueryOptions<T> = MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>>, 'queryKey' | 'initialPageParam'>>;
|
package/dist/vue.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ import * as vue from 'vue';
|
|
|
4
4
|
import { MaybeRefOrGetter, UnwrapRef } from 'vue';
|
|
5
5
|
import { SelectIncludeOmit, ModelResult, FindUniqueArgs, SelectSubset, FindArgs, CreateArgs, CreateManyArgs, BatchResult, CreateManyAndReturnArgs, UpdateArgs, UpdateManyArgs, UpdateManyAndReturnArgs, UpsertArgs, DeleteArgs, DeleteManyArgs, CountArgs, Subset, CountResult, AggregateArgs, AggregateResult, GroupByArgs, GroupByResult } from '@zenstackhq/orm';
|
|
6
6
|
import { SchemaDef, GetModels } from '@zenstackhq/schema';
|
|
7
|
-
import { A as APIContext, E as ExtraQueryOptions, a as ExtraMutationOptions, T as TrimDelegateModelOperations } from './types-
|
|
8
|
-
export { F as FetchFn } from './types-
|
|
7
|
+
import { A as APIContext, E as ExtraQueryOptions, W as WithOptimistic, a as ExtraMutationOptions, T as TrimDelegateModelOperations } from './types-C8iIZD-7.js';
|
|
8
|
+
export { F as FetchFn } from './types-C8iIZD-7.js';
|
|
9
9
|
|
|
10
10
|
declare const VueQueryContextKey = "zenstack-vue-query-context";
|
|
11
11
|
/**
|
|
@@ -19,7 +19,7 @@ declare function provideHooksContext(context: APIContext): void;
|
|
|
19
19
|
*/
|
|
20
20
|
declare function provideQuerySettingsContext(context: APIContext): void;
|
|
21
21
|
type ModelQueryOptions<T> = MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<T, DefaultError>>, 'queryKey'> & ExtraQueryOptions>;
|
|
22
|
-
type ModelQueryResult<T> = UseQueryReturnType<T
|
|
22
|
+
type ModelQueryResult<T> = UseQueryReturnType<WithOptimistic<T>, DefaultError> & {
|
|
23
23
|
queryKey: QueryKey;
|
|
24
24
|
};
|
|
25
25
|
type ModelInfiniteQueryOptions<T> = MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>>, 'queryKey' | 'initialPageParam'>>;
|