@ontahi/react 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/README.md +12 -0
  4. package/dist/actions/fetch-operation-bridge-adapter.d.ts +10 -0
  5. package/dist/actions/fetch-operation-bridge-adapter.d.ts.map +1 -0
  6. package/dist/actions/fetch-operation-bridge-adapter.js +111 -0
  7. package/dist/actions/fetch-operation-bridge-adapter.js.map +1 -0
  8. package/dist/actions/index.d.ts +6 -0
  9. package/dist/actions/index.d.ts.map +1 -0
  10. package/dist/actions/index.js +6 -0
  11. package/dist/actions/index.js.map +1 -0
  12. package/dist/actions/operation-bridge-adapter.d.ts +7 -0
  13. package/dist/actions/operation-bridge-adapter.d.ts.map +1 -0
  14. package/dist/actions/operation-bridge-adapter.js +44 -0
  15. package/dist/actions/operation-bridge-adapter.js.map +1 -0
  16. package/dist/actions/operation-bridge.d.ts +69 -0
  17. package/dist/actions/operation-bridge.d.ts.map +1 -0
  18. package/dist/actions/operation-bridge.js +72 -0
  19. package/dist/actions/operation-bridge.js.map +1 -0
  20. package/dist/actions/react-query.d.ts +25 -0
  21. package/dist/actions/react-query.d.ts.map +1 -0
  22. package/dist/actions/react-query.js +71 -0
  23. package/dist/actions/react-query.js.map +1 -0
  24. package/dist/actions/use-action.d.ts +46 -0
  25. package/dist/actions/use-action.d.ts.map +1 -0
  26. package/dist/actions/use-action.js +112 -0
  27. package/dist/actions/use-action.js.map +1 -0
  28. package/dist/graph/context.d.ts +45 -0
  29. package/dist/graph/context.d.ts.map +1 -0
  30. package/dist/graph/context.js +103 -0
  31. package/dist/graph/context.js.map +1 -0
  32. package/dist/graph/executor.d.ts +41 -0
  33. package/dist/graph/executor.d.ts.map +1 -0
  34. package/dist/graph/executor.js +2 -0
  35. package/dist/graph/executor.js.map +1 -0
  36. package/dist/graph/graph-hooks.d.ts +6 -0
  37. package/dist/graph/graph-hooks.d.ts.map +1 -0
  38. package/dist/graph/graph-hooks.js +61 -0
  39. package/dist/graph/graph-hooks.js.map +1 -0
  40. package/dist/graph/index.d.ts +9 -0
  41. package/dist/graph/index.d.ts.map +1 -0
  42. package/dist/graph/index.js +10 -0
  43. package/dist/graph/index.js.map +1 -0
  44. package/dist/graph/operation-cache.d.ts +5 -0
  45. package/dist/graph/operation-cache.d.ts.map +1 -0
  46. package/dist/graph/operation-cache.js +17 -0
  47. package/dist/graph/operation-cache.js.map +1 -0
  48. package/dist/graph/operation-hooks.d.ts +20 -0
  49. package/dist/graph/operation-hooks.d.ts.map +1 -0
  50. package/dist/graph/operation-hooks.js +360 -0
  51. package/dist/graph/operation-hooks.js.map +1 -0
  52. package/dist/graph/operation-types.d.ts +113 -0
  53. package/dist/graph/operation-types.d.ts.map +1 -0
  54. package/dist/graph/operation-types.js +2 -0
  55. package/dist/graph/operation-types.js.map +1 -0
  56. package/dist/graph/reflected-entity-data-hooks.d.ts +8 -0
  57. package/dist/graph/reflected-entity-data-hooks.d.ts.map +1 -0
  58. package/dist/graph/reflected-entity-data-hooks.js +17 -0
  59. package/dist/graph/reflected-entity-data-hooks.js.map +1 -0
  60. package/dist/graph/reflected-operation-invoker.d.ts +12 -0
  61. package/dist/graph/reflected-operation-invoker.d.ts.map +1 -0
  62. package/dist/graph/reflected-operation-invoker.js +42 -0
  63. package/dist/graph/reflected-operation-invoker.js.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -0
  68. package/package.json +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-bridge.js","sourceRoot":"","sources":["../../src/actions/operation-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type { ClientDomainOperationDeclaration, QueryKeySegment } from '@ontahi/core/data-graph';\nimport { normalizeEntityRefQueryInput } from '@ontahi/core/data-graph';\nimport {\n attachActionRuntime,\n getActionErrorMessage,\n hasActionError,\n type ActionQueryKey,\n} from '@ontahi/core/runtime/actions';\nimport type {\n OperationInvocationResult,\n TaskRunIdentity,\n TaskSnapshot,\n} from '@ontahi/core/runtime/contracts';\nimport type { QueryKey, UseQueryResult } from '@tanstack/react-query';\n\nimport type { ActionResultLike, UseActionOptions, UseActionResult } from './use-action.js';\n\nexport type { OperationInvocationResult };\n\nexport type OperationBridgeActionResult<TData> = Omit<ActionResultLike, 'data'> & {\n data?: TData;\n};\n\nexport type OperationBridgeAction<TInput, TData> = (\n input: TInput,\n) => Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport type OperationInvocationFailure<TFailure = unknown> = Exclude<\n OperationInvocationResult<unknown, TFailure>,\n { ok: true }\n>;\n\nexport class OperationInvocationResultError<TFailure = unknown> extends Error {\n readonly name = 'OperationInvocationResultError';\n\n constructor(readonly result: OperationInvocationFailure<TFailure>) {\n super(result.message);\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const isOperationInvocationResult = <TData = unknown, TFailure = unknown>(\n value: unknown,\n): value is OperationInvocationResult<TData, TFailure> =>\n isRecord(value) && typeof value.ok === 'boolean' && typeof value.kind === 'string';\n\nexport const operationBridgeErrored = (message: string): OperationInvocationResult => ({\n ok: false,\n kind: 'errored',\n executed: 'unknown',\n message,\n});\n\nexport const toOperationInvocationResult = <TData>(\n result: OperationBridgeActionResult<OperationInvocationResult<TData>>,\n): OperationInvocationResult<TData> => {\n if (hasActionError(result)) {\n return operationBridgeErrored(\n getActionErrorMessage(result),\n ) as OperationInvocationResult<TData>;\n }\n\n if (isOperationInvocationResult<TData>(result.data)) {\n return result.data;\n }\n\n if ('data' in result) {\n return {\n ok: true,\n kind: 'success',\n value: result.data as TData,\n };\n }\n\n return operationBridgeErrored(\n 'Graph operation bridge returned an invalid response.',\n ) as OperationInvocationResult<TData>;\n};\n\nexport const unwrapOperationInvocationValue = <TData>(\n result: OperationInvocationResult<TData>,\n): TData => {\n if (result.ok) {\n return result.value;\n }\n\n throw new OperationInvocationResultError(result);\n};\n\nexport type BridgedOperationLike<TInput, TData> = ClientDomainOperationDeclaration<\n TInput,\n TData\n> & {\n id: string;\n entityName: string;\n name: string;\n};\n\nexport type RunDomainOperationBridgeAction = (input: {\n operationId: string;\n input: unknown;\n}) => Promise<ActionResultLike>;\n\nexport type GraphPermission =\n | {\n allowed: true;\n }\n | {\n allowed: false;\n reason: string;\n message: string;\n };\n\nexport type CheckDomainOperationPermissionBridgeAction = (input: {\n operationId: string;\n input: unknown;\n}) => Promise<OperationBridgeActionResult<GraphPermission>>;\n\nexport type OperationBridgeAdapter<TAdapterName extends string = string> = {\n name: TAdapterName;\n getTaskSnapshot?: <TResult = unknown>(ref: TaskRunIdentity) => Promise<TaskSnapshot<TResult>>;\n useBridgeAction: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n ) => OperationBridgeAction<TInput, TData>;\n useBridgeMutation: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n options?: UseActionOptions<OperationBridgeAction<TInput, TData>> & {\n invalidateOnSuccess?: boolean;\n },\n ) => UseActionResult<OperationBridgeAction<TInput, TData>>;\n useBridgeQuery: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n args: {\n input: TInput;\n key: QueryKey;\n },\n ) => UseQueryResult<TData, Error>;\n usePermission: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n options?: {\n enabled?: boolean;\n queryKey?: QueryKey;\n },\n ) => UseQueryResult<GraphPermission, Error>;\n};\n\nexport type AnyOperationBridgeAdapter = OperationBridgeAdapter<string>;\n\nexport const resolveOperationBridgeQuerySpec = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n) => [operation.entityName, operation.name, ...(operation.bridge?.query ?? [])] as const;\n\nconst resolveOperationBridgeQueryKeySegment = <TInput, TData>(\n segment: QueryKeySegment<TInput>,\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n) =>\n typeof segment === 'function'\n ? segment(input, {\n input,\n operation,\n })\n : segment;\n\nexport const resolveOperationBridgeQueryKey = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey => {\n const queryInput = normalizeEntityRefQueryInput(input, operation.inputRefs);\n\n return [\n operation.entityName,\n operation.name,\n ...(operation.bridge?.query?.map(segment =>\n resolveOperationBridgeQueryKeySegment(segment, operation, queryInput),\n ) ?? []),\n ];\n};\n\nexport const resolveOperationBridgeInvalidationQueryKeys = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey[] => {\n const queryInput = normalizeEntityRefQueryInput(input, operation.inputRefs);\n\n return (\n operation.bridge?.invalidate?.map(querySpec =>\n querySpec.map(segment =>\n resolveOperationBridgeQueryKeySegment(segment, operation, queryInput),\n ),\n ) ?? []\n );\n};\n\nexport const createDomainOperationBridgeAction =\n <TInput, TData>(\n bridgeAction: RunDomainOperationBridgeAction,\n operationId: string,\n ): OperationBridgeAction<TInput, TData> =>\n (input: TInput) =>\n bridgeAction({\n operationId,\n input,\n }) as Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport const attachOperationBridgeActionRuntime = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n action: OperationBridgeAction<TInput, TData>,\n options: {\n requiresAuth: boolean;\n },\n) =>\n attachActionRuntime(action, {\n feature: operation.entityName,\n actionName: operation.name,\n requiresAuth: options.requiresAuth,\n queryKeyPrefix: [operation.entityName, operation.name] as const,\n getQueryKey: input => resolveOperationBridgeQueryKey(operation, input as TInput),\n getAffectedQueryKeys: ({ input }) =>\n resolveOperationBridgeInvalidationQueryKeys(operation, input as TInput),\n });\n"]}
@@ -0,0 +1,25 @@
1
+ import { ActionResultError, type ActionQueryKey } from '@ontahi/core/runtime/actions';
2
+ import { type InfiniteData, type UseInfiniteQueryResult, type UseInfiniteQueryOptions, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
3
+ import { type ActionFnLike, type InferData, type InferInput, type NoInfer, type UseActionOptions } from './use-action.js';
4
+ type UseServerQueryOptions<TAction extends ActionFnLike, TSelected = InferData<TAction>> = Omit<UseQueryOptions<InferData<TAction>, ActionResultError, TSelected, ActionQueryKey>, 'queryFn' | 'queryKey'> & {
5
+ action: TAction;
6
+ input: NoInfer<InferInput<TAction>>;
7
+ key?: ActionQueryKey;
8
+ };
9
+ type UseServerInfiniteQueryOptions<TAction extends ActionFnLike, TPageParam, TSelected = InfiniteData<InferData<TAction>, TPageParam>> = Omit<UseInfiniteQueryOptions<InferData<TAction>, ActionResultError, TSelected, ActionQueryKey, TPageParam>, 'queryFn' | 'queryKey'> & {
10
+ action: TAction;
11
+ getPageInput: (args: {
12
+ input: NoInfer<InferInput<TAction>>;
13
+ pageParam: TPageParam;
14
+ }) => NoInfer<InferInput<TAction>>;
15
+ input: NoInfer<InferInput<TAction>>;
16
+ key?: ActionQueryKey;
17
+ };
18
+ export declare const useServerQuery: <TAction extends ActionFnLike, TSelected = InferData<TAction>>(options: UseServerQueryOptions<TAction, TSelected>) => UseQueryResult<TSelected, ActionResultError>;
19
+ export declare const useServerInfiniteQuery: <TAction extends ActionFnLike, TPageParam, TSelected = InfiniteData<InferData<TAction>, TPageParam>>(options: UseServerInfiniteQueryOptions<TAction, TPageParam, TSelected>) => UseInfiniteQueryResult<TSelected, ActionResultError>;
20
+ type UseServerMutationOptions<TAction extends ActionFnLike> = UseActionOptions<TAction> & {
21
+ invalidateOnSuccess?: boolean;
22
+ };
23
+ export declare function useServerMutation<TAction extends ActionFnLike>(action: TAction, options?: UseServerMutationOptions<TAction>): import("./use-action.js").UseActionResult<TAction>;
24
+ export {};
25
+ //# sourceMappingURL=react-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-query.d.ts","sourceRoot":"","sources":["../../src/actions/react-query.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EAIjB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,qBAAqB,CAAC,OAAO,SAAS,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,CAC7F,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,CAAC,EACjF,SAAS,GAAG,UAAU,CACvB,GAAG;IACF,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB,CAAC;AAEF,KAAK,6BAA6B,CAChC,OAAO,SAAS,YAAY,EAC5B,UAAU,EACV,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,IACtD,IAAI,CACN,uBAAuB,CACrB,SAAS,CAAC,OAAO,CAAC,EAClB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,UAAU,CACX,EACD,SAAS,GAAG,UAAU,CACvB,GAAG;IACF,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,SAAS,EAAE,UAAU,CAAC;KACvB,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB,CAAC;AAuCF,eAAO,MAAM,cAAc,GAAI,OAAO,SAAS,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,EACzF,SAAS,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,KACjD,cAAc,CAAC,SAAS,EAAE,iBAAiB,CAgB7C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,SAAS,YAAY,EAC5B,UAAU,EACV,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,EAExD,SAAS,6BAA6B,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,KACrE,sBAAsB,CAAC,SAAS,EAAE,iBAAiB,CAsBrD,CAAC;AAEF,KAAK,wBAAwB,CAAC,OAAO,SAAS,YAAY,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG;IACxF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,YAAY,EAC5D,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,wBAAwB,CAAC,OAAO,CAAC,sDAsB5C"}
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+ import { ActionResultError, getActionInvalidationQueryKeys, getActionQueryKey, hasActionError, } from '@ontahi/core/runtime/actions';
3
+ import { useInfiniteQuery, useQuery, useQueryClient, } from '@tanstack/react-query';
4
+ import { useCallback, useMemo } from 'react';
5
+ import { useAction, } from './use-action.js';
6
+ const resolveActionQueryKey = (action, input, key) => {
7
+ const resolvedQueryKey = key ?? getActionQueryKey(action, input);
8
+ if (resolvedQueryKey) {
9
+ return resolvedQueryKey;
10
+ }
11
+ throw new Error('Server queries require either a client-provided key or an action-owned key declaration.');
12
+ };
13
+ const invalidateActionQueries = async (queryClient, action, args) => {
14
+ const queryKeys = getActionInvalidationQueryKeys(action, {
15
+ input: args.input,
16
+ data: args.data,
17
+ });
18
+ await Promise.all(queryKeys.map(queryKey => queryClient.invalidateQueries({
19
+ queryKey,
20
+ })));
21
+ };
22
+ export const useServerQuery = (options) => {
23
+ const { action, input, key, ...queryOptions } = options;
24
+ const queryKey = useMemo(() => resolveActionQueryKey(action, input, key), [action, input, key]);
25
+ return useQuery({
26
+ ...queryOptions,
27
+ queryKey,
28
+ queryFn: async () => {
29
+ const result = await action(input);
30
+ if (hasActionError(result)) {
31
+ throw new ActionResultError(result);
32
+ }
33
+ return result.data;
34
+ },
35
+ });
36
+ };
37
+ export const useServerInfiniteQuery = (options) => {
38
+ const { action, getPageInput, input, key, ...queryOptions } = options;
39
+ const queryKey = useMemo(() => resolveActionQueryKey(action, input, key), [action, input, key]);
40
+ return useInfiniteQuery({
41
+ ...queryOptions,
42
+ queryKey,
43
+ queryFn: async ({ pageParam }) => {
44
+ const result = await action(getPageInput({
45
+ input,
46
+ pageParam: pageParam,
47
+ }));
48
+ if (hasActionError(result)) {
49
+ throw new ActionResultError(result);
50
+ }
51
+ return result.data;
52
+ },
53
+ });
54
+ };
55
+ export function useServerMutation(action, options) {
56
+ const queryClient = useQueryClient();
57
+ const invalidateOnSuccess = options?.invalidateOnSuccess ?? true;
58
+ const onSuccess = useCallback(async (args) => {
59
+ if (invalidateOnSuccess) {
60
+ await invalidateActionQueries(queryClient, action, args);
61
+ }
62
+ await options?.onSuccess?.(args);
63
+ }, [action, invalidateOnSuccess, options, queryClient]);
64
+ return useAction(action, {
65
+ onExecute: options?.onExecute,
66
+ onError: options?.onError,
67
+ onSettled: options?.onSettled,
68
+ onSuccess,
69
+ });
70
+ }
71
+ //# sourceMappingURL=react-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-query.js","sourceRoot":"","sources":["../../src/actions/react-query.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n ActionResultError,\n getActionInvalidationQueryKeys,\n getActionQueryKey,\n hasActionError,\n type ActionQueryKey,\n} from '@ontahi/core/runtime/actions';\nimport {\n useInfiniteQuery,\n useQuery,\n useQueryClient,\n type QueryClient,\n type InfiniteData,\n type UseInfiniteQueryResult,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query';\nimport { useCallback, useMemo } from 'react';\n\nimport {\n useAction,\n type ActionFnLike,\n type InferData,\n type InferInput,\n type NoInfer,\n type UseActionOptions,\n} from './use-action.js';\n\ntype UseServerQueryOptions<TAction extends ActionFnLike, TSelected = InferData<TAction>> = Omit<\n UseQueryOptions<InferData<TAction>, ActionResultError, TSelected, ActionQueryKey>,\n 'queryFn' | 'queryKey'\n> & {\n action: TAction;\n input: NoInfer<InferInput<TAction>>;\n key?: ActionQueryKey;\n};\n\ntype UseServerInfiniteQueryOptions<\n TAction extends ActionFnLike,\n TPageParam,\n TSelected = InfiniteData<InferData<TAction>, TPageParam>,\n> = Omit<\n UseInfiniteQueryOptions<\n InferData<TAction>,\n ActionResultError,\n TSelected,\n ActionQueryKey,\n TPageParam\n >,\n 'queryFn' | 'queryKey'\n> & {\n action: TAction;\n getPageInput: (args: {\n input: NoInfer<InferInput<TAction>>;\n pageParam: TPageParam;\n }) => NoInfer<InferInput<TAction>>;\n input: NoInfer<InferInput<TAction>>;\n key?: ActionQueryKey;\n};\n\nconst resolveActionQueryKey = <TAction extends ActionFnLike>(\n action: TAction,\n input: InferInput<TAction>,\n key: ActionQueryKey | undefined,\n) => {\n const resolvedQueryKey = key ?? getActionQueryKey(action, input);\n if (resolvedQueryKey) {\n return resolvedQueryKey;\n }\n\n throw new Error(\n 'Server queries require either a client-provided key or an action-owned key declaration.',\n );\n};\n\nconst invalidateActionQueries = async <TAction extends ActionFnLike>(\n queryClient: QueryClient,\n action: TAction,\n args: {\n input: InferInput<TAction>;\n data: InferData<TAction>;\n },\n) => {\n const queryKeys = getActionInvalidationQueryKeys(action, {\n input: args.input,\n data: args.data,\n });\n\n await Promise.all(\n queryKeys.map(queryKey =>\n queryClient.invalidateQueries({\n queryKey,\n }),\n ),\n );\n};\n\nexport const useServerQuery = <TAction extends ActionFnLike, TSelected = InferData<TAction>>(\n options: UseServerQueryOptions<TAction, TSelected>,\n): UseQueryResult<TSelected, ActionResultError> => {\n const { action, input, key, ...queryOptions } = options;\n const queryKey = useMemo(() => resolveActionQueryKey(action, input, key), [action, input, key]);\n\n return useQuery({\n ...queryOptions,\n queryKey,\n queryFn: async () => {\n const result = await action(input);\n if (hasActionError(result)) {\n throw new ActionResultError(result);\n }\n\n return result.data as InferData<TAction>;\n },\n });\n};\n\nexport const useServerInfiniteQuery = <\n TAction extends ActionFnLike,\n TPageParam,\n TSelected = InfiniteData<InferData<TAction>, TPageParam>,\n>(\n options: UseServerInfiniteQueryOptions<TAction, TPageParam, TSelected>,\n): UseInfiniteQueryResult<TSelected, ActionResultError> => {\n const { action, getPageInput, input, key, ...queryOptions } = options;\n const queryKey = useMemo(() => resolveActionQueryKey(action, input, key), [action, input, key]);\n\n return useInfiniteQuery({\n ...queryOptions,\n queryKey,\n queryFn: async ({ pageParam }) => {\n const result = await action(\n getPageInput({\n input,\n pageParam: pageParam as TPageParam,\n }),\n );\n\n if (hasActionError(result)) {\n throw new ActionResultError(result);\n }\n\n return result.data as InferData<TAction>;\n },\n });\n};\n\ntype UseServerMutationOptions<TAction extends ActionFnLike> = UseActionOptions<TAction> & {\n invalidateOnSuccess?: boolean;\n};\n\nexport function useServerMutation<TAction extends ActionFnLike>(\n action: TAction,\n options?: UseServerMutationOptions<TAction>,\n) {\n const queryClient = useQueryClient();\n const invalidateOnSuccess = options?.invalidateOnSuccess ?? true;\n\n const onSuccess = useCallback(\n async (args: { data: InferData<TAction>; input: InferInput<TAction> }) => {\n if (invalidateOnSuccess) {\n await invalidateActionQueries(queryClient, action, args);\n }\n\n await options?.onSuccess?.(args);\n },\n [action, invalidateOnSuccess, options, queryClient],\n );\n\n return useAction(action, {\n onExecute: options?.onExecute,\n onError: options?.onError,\n onSettled: options?.onSettled,\n onSuccess,\n });\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import { type ActionResultLike } from '@ontahi/core/runtime/actions';
2
+ export type MaybePromise<T> = T | Promise<T>;
3
+ export type { ActionResultLike };
4
+ export type ActionFnLike<TResult extends ActionResultLike = ActionResultLike> = (input: any) => Promise<TResult>;
5
+ export type NoInfer<T> = [T][T extends any ? 0 : never];
6
+ export type InferInput<TAction extends ActionFnLike> = Parameters<TAction>[0];
7
+ export type InferResult<TAction extends ActionFnLike> = Awaited<ReturnType<TAction>>;
8
+ export type InferData<TAction extends ActionFnLike> = InferResult<TAction> extends {
9
+ data?: infer TData;
10
+ } ? TData : never;
11
+ type ActionStatus = 'idle' | 'executing' | 'hasSucceeded' | 'hasErrored';
12
+ export type UseActionOptions<TAction extends ActionFnLike> = {
13
+ onExecute?: (args: {
14
+ input: InferInput<TAction>;
15
+ }) => MaybePromise<unknown>;
16
+ onSuccess?: (args: {
17
+ data: InferData<TAction>;
18
+ input: InferInput<TAction>;
19
+ }) => MaybePromise<unknown>;
20
+ onError?: (args: {
21
+ error: Omit<InferResult<TAction>, 'data'> & {
22
+ thrownError?: Error;
23
+ };
24
+ input: InferInput<TAction>;
25
+ }) => MaybePromise<unknown>;
26
+ onSettled?: (args: {
27
+ result: InferResult<TAction>;
28
+ input: InferInput<TAction>;
29
+ }) => MaybePromise<unknown>;
30
+ };
31
+ export type UseActionResult<TAction extends ActionFnLike> = {
32
+ execute: (input: InferInput<TAction>) => void;
33
+ executeAsync: (input: InferInput<TAction>) => Promise<InferResult<TAction>>;
34
+ input: InferInput<TAction> | undefined;
35
+ result: InferResult<TAction>;
36
+ reset: () => void;
37
+ status: ActionStatus;
38
+ isIdle: boolean;
39
+ isExecuting: boolean;
40
+ isTransitioning: boolean;
41
+ isPending: boolean;
42
+ hasSucceeded: boolean;
43
+ hasErrored: boolean;
44
+ };
45
+ export declare function useAction<TAction extends ActionFnLike>(action: TAction, options?: UseActionOptions<TAction>): UseActionResult<TAction>;
46
+ //# sourceMappingURL=use-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-action.d.ts","sourceRoot":"","sources":["../../src/actions/use-action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+ import { hasActionError } from '@ontahi/core/runtime/actions';
3
+ import { toError } from '@ontahi/core/value/error';
4
+ import { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react';
5
+ const EMPTY_RESULT = {};
6
+ function useCallbackRef(callback) {
7
+ const callbackRef = useRef(callback);
8
+ useEffect(() => {
9
+ callbackRef.current = callback;
10
+ }, [callback]);
11
+ return useMemo(() => ((...args) => callbackRef.current?.(...args)), []);
12
+ }
13
+ export function useAction(action, options) {
14
+ const [isTransitioning, startTransition] = useTransition();
15
+ const [result, setResult] = useState(EMPTY_RESULT);
16
+ const [input, setInput] = useState();
17
+ const [isExecuting, setIsExecuting] = useState(false);
18
+ const [thrownError, setThrownError] = useState(null);
19
+ const [isIdle, setIsIdle] = useState(true);
20
+ const requestIdRef = useRef(0);
21
+ const onExecute = useCallbackRef(options?.onExecute);
22
+ const onSuccess = useCallbackRef(options?.onSuccess);
23
+ const onError = useCallbackRef(options?.onError);
24
+ const onSettled = useCallbackRef(options?.onSettled);
25
+ const executeAsync = useCallback(async (nextInput) => {
26
+ const requestId = ++requestIdRef.current;
27
+ setIsIdle(false);
28
+ setInput(nextInput);
29
+ setIsExecuting(true);
30
+ setThrownError(null);
31
+ await onExecute?.({ input: nextInput });
32
+ try {
33
+ const nextResult = await action(nextInput);
34
+ if (requestId === requestIdRef.current) {
35
+ setResult(nextResult);
36
+ }
37
+ if (hasActionError(nextResult)) {
38
+ await onError?.({
39
+ error: nextResult,
40
+ input: nextInput,
41
+ });
42
+ }
43
+ else {
44
+ await onSuccess?.({
45
+ data: nextResult.data,
46
+ input: nextInput,
47
+ });
48
+ }
49
+ await onSettled?.({
50
+ result: nextResult,
51
+ input: nextInput,
52
+ });
53
+ return nextResult;
54
+ }
55
+ catch (error) {
56
+ const thrown = toError(error);
57
+ const errorResult = { thrownError: thrown };
58
+ if (requestId === requestIdRef.current) {
59
+ setResult(EMPTY_RESULT);
60
+ setThrownError(thrown);
61
+ }
62
+ await onError?.({ error: errorResult, input: nextInput });
63
+ await onSettled?.({
64
+ result: EMPTY_RESULT,
65
+ input: nextInput,
66
+ });
67
+ throw thrown;
68
+ }
69
+ finally {
70
+ if (requestId === requestIdRef.current) {
71
+ setIsExecuting(false);
72
+ }
73
+ }
74
+ }, [action, onError, onExecute, onSettled, onSuccess]);
75
+ const execute = useCallback((nextInput) => {
76
+ startTransition(() => {
77
+ void executeAsync(nextInput).catch(() => {
78
+ return;
79
+ });
80
+ });
81
+ }, [executeAsync, startTransition]);
82
+ const reset = useCallback(() => {
83
+ setIsIdle(true);
84
+ setInput(undefined);
85
+ setResult(EMPTY_RESULT);
86
+ setThrownError(null);
87
+ }, []);
88
+ const hasErrored = Boolean(thrownError) || hasActionError(result);
89
+ const hasSucceeded = !isIdle && !isExecuting && !hasErrored;
90
+ const status = isIdle
91
+ ? 'idle'
92
+ : isExecuting
93
+ ? 'executing'
94
+ : hasErrored
95
+ ? 'hasErrored'
96
+ : 'hasSucceeded';
97
+ return {
98
+ execute,
99
+ executeAsync,
100
+ input,
101
+ result,
102
+ reset,
103
+ status,
104
+ isIdle,
105
+ isExecuting,
106
+ isTransitioning,
107
+ isPending: isExecuting || isTransitioning,
108
+ hasSucceeded,
109
+ hasErrored,
110
+ };
111
+ }
112
+ //# sourceMappingURL=use-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-action.js","sourceRoot":"","sources":["../../src/actions/use-action.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { hasActionError, type ActionResultLike } from '@ontahi/core/runtime/actions';\nimport { toError } from '@ontahi/core/value/error';\nimport { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type { ActionResultLike };\n\nexport type ActionFnLike<TResult extends ActionResultLike = ActionResultLike> = (\n input: any,\n) => Promise<TResult>;\n\nexport type NoInfer<T> = [T][T extends any ? 0 : never];\n\nexport type InferInput<TAction extends ActionFnLike> = Parameters<TAction>[0];\nexport type InferResult<TAction extends ActionFnLike> = Awaited<ReturnType<TAction>>;\nexport type InferData<TAction extends ActionFnLike> =\n InferResult<TAction> extends { data?: infer TData } ? TData : never;\n\ntype ActionStatus = 'idle' | 'executing' | 'hasSucceeded' | 'hasErrored';\n\nexport type UseActionOptions<TAction extends ActionFnLike> = {\n onExecute?: (args: { input: InferInput<TAction> }) => MaybePromise<unknown>;\n onSuccess?: (args: {\n data: InferData<TAction>;\n input: InferInput<TAction>;\n }) => MaybePromise<unknown>;\n onError?: (args: {\n error: Omit<InferResult<TAction>, 'data'> & { thrownError?: Error };\n input: InferInput<TAction>;\n }) => MaybePromise<unknown>;\n onSettled?: (args: {\n result: InferResult<TAction>;\n input: InferInput<TAction>;\n }) => MaybePromise<unknown>;\n};\n\nexport type UseActionResult<TAction extends ActionFnLike> = {\n execute: (input: InferInput<TAction>) => void;\n executeAsync: (input: InferInput<TAction>) => Promise<InferResult<TAction>>;\n input: InferInput<TAction> | undefined;\n result: InferResult<TAction>;\n reset: () => void;\n status: ActionStatus;\n isIdle: boolean;\n isExecuting: boolean;\n isTransitioning: boolean;\n isPending: boolean;\n hasSucceeded: boolean;\n hasErrored: boolean;\n};\n\nconst EMPTY_RESULT = {} as ActionResultLike;\n\nfunction useCallbackRef<TCallback extends (...args: any[]) => any>(\n callback: TCallback | undefined,\n) {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n return useMemo(\n () =>\n ((...args: Parameters<TCallback>) => callbackRef.current?.(...args)) as TCallback | undefined,\n [],\n );\n}\n\nexport function useAction<TAction extends ActionFnLike>(\n action: TAction,\n options?: UseActionOptions<TAction>,\n): UseActionResult<TAction> {\n const [isTransitioning, startTransition] = useTransition();\n const [result, setResult] = useState<InferResult<TAction>>(EMPTY_RESULT as InferResult<TAction>);\n const [input, setInput] = useState<InferInput<TAction>>();\n const [isExecuting, setIsExecuting] = useState(false);\n const [thrownError, setThrownError] = useState<Error | null>(null);\n const [isIdle, setIsIdle] = useState(true);\n const requestIdRef = useRef(0);\n\n const onExecute = useCallbackRef(options?.onExecute);\n const onSuccess = useCallbackRef(options?.onSuccess);\n const onError = useCallbackRef(options?.onError);\n const onSettled = useCallbackRef(options?.onSettled);\n\n const executeAsync: UseActionResult<TAction>['executeAsync'] = useCallback(\n async (nextInput: InferInput<TAction>): Promise<InferResult<TAction>> => {\n const requestId = ++requestIdRef.current;\n\n setIsIdle(false);\n setInput(nextInput);\n setIsExecuting(true);\n setThrownError(null);\n\n await onExecute?.({ input: nextInput });\n\n try {\n const nextResult = await action(nextInput);\n if (requestId === requestIdRef.current) {\n setResult(nextResult as InferResult<TAction>);\n }\n\n if (hasActionError(nextResult)) {\n await onError?.({\n error: nextResult as Omit<InferResult<TAction>, 'data'> & { thrownError?: Error },\n input: nextInput,\n });\n } else {\n await onSuccess?.({\n data: nextResult.data as InferData<TAction>,\n input: nextInput,\n });\n }\n\n await onSettled?.({\n result: nextResult as InferResult<TAction>,\n input: nextInput,\n });\n\n return nextResult as InferResult<TAction>;\n } catch (error) {\n const thrown = toError(error);\n const errorResult = { thrownError: thrown } as Omit<InferResult<TAction>, 'data'> & {\n thrownError?: Error;\n };\n\n if (requestId === requestIdRef.current) {\n setResult(EMPTY_RESULT as InferResult<TAction>);\n setThrownError(thrown);\n }\n\n await onError?.({ error: errorResult, input: nextInput });\n await onSettled?.({\n result: EMPTY_RESULT as InferResult<TAction>,\n input: nextInput,\n });\n\n throw thrown;\n } finally {\n if (requestId === requestIdRef.current) {\n setIsExecuting(false);\n }\n }\n },\n [action, onError, onExecute, onSettled, onSuccess],\n );\n\n const execute = useCallback(\n (nextInput: InferInput<TAction>) => {\n startTransition(() => {\n void executeAsync(nextInput).catch(() => {\n return;\n });\n });\n },\n [executeAsync, startTransition],\n );\n\n const reset = useCallback(() => {\n setIsIdle(true);\n setInput(undefined);\n setResult(EMPTY_RESULT as InferResult<TAction>);\n setThrownError(null);\n }, []);\n\n const hasErrored = Boolean(thrownError) || hasActionError(result);\n const hasSucceeded = !isIdle && !isExecuting && !hasErrored;\n const status: ActionStatus = isIdle\n ? 'idle'\n : isExecuting\n ? 'executing'\n : hasErrored\n ? 'hasErrored'\n : 'hasSucceeded';\n\n return {\n execute,\n executeAsync,\n input,\n result,\n reset,\n status,\n isIdle,\n isExecuting,\n isTransitioning,\n isPending: isExecuting || isTransitioning,\n hasSucceeded,\n hasErrored,\n };\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { type GraphClientCache, type ReflectedEntityDataReader, type ReflectedOperationDescriptor, type ReflectedOperationInvoker } from '@ontahi/core/data-graph';
2
+ import { type ReactNode } from 'react';
3
+ import type { AnyOperationBridgeAdapter } from '../actions/index.js';
4
+ import type { ReactGraphExecutor } from './executor.js';
5
+ import { type ReflectedGraphOperationLike } from './reflected-operation-invoker.js';
6
+ export type OntahiGraphProviderProps<TGraphRuntime = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions> = {
7
+ children: ReactNode;
8
+ runtime: TGraphRuntime;
9
+ graphExecutor?: ReactGraphExecutor<TReadOptions, TCommandOptions>;
10
+ operationBridgeAdapters?: AnyOperationBridgeAdapter[];
11
+ reflectedEntityDataReader?: ReflectedEntityDataReader;
12
+ reflectedOperationInvoker?: ReflectedOperationInvoker;
13
+ reflectedGraphOperations?: readonly ReflectedGraphOperationLike[];
14
+ clientCache?: GraphClientCache;
15
+ };
16
+ export declare function OntahiGraphProvider<TGraphRuntime = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions>({ children, runtime, graphExecutor, operationBridgeAdapters, reflectedEntityDataReader, reflectedOperationInvoker, reflectedGraphOperations, clientCache, }: OntahiGraphProviderProps<TGraphRuntime, TReadOptions, TCommandOptions>): import("react/jsx-runtime").JSX.Element;
17
+ export declare function useGraphRuntime<TGraphRuntime = unknown>(): TGraphRuntime;
18
+ export declare function useGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions>(): ReactGraphExecutor<TReadOptions, TCommandOptions>;
19
+ export declare function useGraphClientCache(): {
20
+ clear: () => void;
21
+ denormalizeOutput: <TValue>(descriptor: import("@ontahi/core/data-graph").GraphOutputDescriptor | undefined, value: TValue) => TValue;
22
+ hasEntity: (ref: import("@ontahi/core/data-graph").AnyEntityRef) => boolean;
23
+ invalidateEntity: <TValue = unknown>(ref: import("@ontahi/core/data-graph").AnyEntityRef) => import("@ontahi/core/data-graph").GraphClientCacheInvalidationResult<TValue> | undefined;
24
+ inspect: () => import("@ontahi/core/data-graph").GraphClientCacheSnapshot;
25
+ normalizeOutput: (descriptor: import("@ontahi/core/data-graph").GraphOutputDescriptor | undefined, value: unknown) => import("@ontahi/core/data-graph").GraphClientCacheOutputNormalizationResult;
26
+ readOutput: <TValue = unknown>(key: readonly unknown[], descriptor: import("@ontahi/core/data-graph").GraphOutputDescriptor | undefined) => import("@ontahi/core/data-graph").GraphClientCacheOutputReadResult<TValue> | undefined;
27
+ readEntity: <TValue = unknown>(ref: import("@ontahi/core/data-graph").AnyEntityRef) => TValue | undefined;
28
+ readEntityRecord: <TValue = unknown>(ref: import("@ontahi/core/data-graph").AnyEntityRef) => import("@ontahi/core/data-graph").GraphClientCacheEntityRecord<TValue> | undefined;
29
+ resolveEntityRef: <TRef extends import("@ontahi/core/data-graph").AnyEntityRef>(ref: TRef) => import("@ontahi/core/data-graph").AnyEntityRef | TRef;
30
+ subscribe: (listener: import("@ontahi/core/data-graph").GraphClientCacheListener) => (() => void);
31
+ writeEntity: <TEntity extends import("@ontahi/core/data-graph").AnyEntityDefinition, TSnapshot extends Record<string, unknown>>(entityDefinition: TEntity, snapshot: TSnapshot) => import("@ontahi/core/data-graph").GraphClientCacheWriteResult<TSnapshot> | undefined;
32
+ writeOutput: (key: readonly unknown[], descriptor: import("@ontahi/core/data-graph").GraphOutputDescriptor | undefined, value: unknown) => import("@ontahi/core/data-graph").GraphClientCacheOutputNormalizationResult;
33
+ };
34
+ export declare function useGraphClientCacheSnapshot(): import("@ontahi/core/data-graph").GraphClientCacheSnapshot;
35
+ export declare const useGraphClientCacheVersion: (clientCache: GraphClientCache) => number;
36
+ export declare function useOperationBridgeAdapter(adapterName: string): AnyOperationBridgeAdapter;
37
+ export declare function useDefaultOperationBridgeAdapter(): AnyOperationBridgeAdapter;
38
+ export declare function useHasOperationBridgeRuntime(): boolean;
39
+ export declare function useReflectedEntityDataReader(): ReflectedEntityDataReader;
40
+ export declare function useHasReflectedEntityDataReader(): boolean;
41
+ export declare function useReflectedOperationInvoker(): ReflectedOperationInvoker;
42
+ export declare function useHasReflectedOperationInvoker(): boolean;
43
+ export declare function useReflectedOperationSupport(): (operation: ReflectedOperationDescriptor) => boolean;
44
+ export type { GraphClientCache };
45
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/graph/context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,kCAAkC,CAAC;AAa1C,MAAM,MAAM,wBAAwB,CAClC,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,eAAe,GAAG,YAAY,IAC5B;IACF,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClE,uBAAuB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtD,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,wBAAwB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAClE,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,eAAe,GAAG,YAAY,EAC9B,EACA,QAAQ,EACR,OAAO,EACP,aAAa,EACb,uBAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAqD,EACrD,WAAW,GACZ,EAAE,wBAAwB,CAAC,aAAa,EAAE,YAAY,EAAE,eAAe,CAAC,2CAkCxE;AAED,wBAAgB,eAAe,CAAC,aAAa,GAAG,OAAO,KAOnC,aAAa,CAChC;AAED,wBAAgB,gBAAgB,CAAC,YAAY,GAAG,OAAO,EAAE,eAAe,GAAG,YAAY,KAS7D,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAC1E;AAED,wBAAgB,mBAAmB;;;;;;;;;;;;;;EAQlC;AAED,wBAAgB,2BAA2B,+DAM1C;AAED,eAAO,MAAM,0BAA0B,GAAI,aAAa,gBAAgB,WAKrE,CAAC;AAEJ,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,6BAc5D;AAED,wBAAgB,gCAAgC,8BAc/C;AAED,wBAAgB,4BAA4B,YAG3C;AAED,wBAAgB,4BAA4B,8BAU3C;AAED,wBAAgB,+BAA+B,YAE9C;AAED,wBAAgB,4BAA4B,8BAU3C;AAED,wBAAgB,+BAA+B,YAE9C;AAED,wBAAgB,4BAA4B,gBAI5B,4BAA4B,aAI3C;AAED,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,103 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createGraphClientCache, } from '@ontahi/core/data-graph';
4
+ import { createContext, useCallback, useContext, useMemo, useState, useSyncExternalStore, } from 'react';
5
+ import { createReflectedOperationInvoker, } from './reflected-operation-invoker.js';
6
+ const noReflectedGraphOperations = [];
7
+ const GraphRuntimeContext = createContext(null);
8
+ const GraphExecutorContext = createContext(null);
9
+ const GraphClientCacheContext = createContext(null);
10
+ const OperationBridgeAdaptersContext = createContext(null);
11
+ const ReflectedEntityDataReaderContext = createContext(null);
12
+ const ReflectedOperationInvokerContext = createContext(null);
13
+ export function OntahiGraphProvider({ children, runtime, graphExecutor, operationBridgeAdapters = [], reflectedEntityDataReader, reflectedOperationInvoker, reflectedGraphOperations = noReflectedGraphOperations, clientCache, }) {
14
+ const [defaultClientCache] = useState(() => createGraphClientCache());
15
+ const graphClientCache = clientCache ?? defaultClientCache;
16
+ const bridgeAdapterMap = useMemo(() => new Map(operationBridgeAdapters.map(adapter => [adapter.name, adapter])), [operationBridgeAdapters]);
17
+ const resolvedReflectedOperationInvoker = useMemo(() => reflectedGraphOperations.length > 0
18
+ ? createReflectedOperationInvoker({
19
+ fallback: reflectedOperationInvoker,
20
+ graphExecutor,
21
+ graphOperations: reflectedGraphOperations,
22
+ })
23
+ : (reflectedOperationInvoker ?? null), [graphExecutor, reflectedGraphOperations, reflectedOperationInvoker]);
24
+ return (_jsx(ReflectedOperationInvokerContext.Provider, { value: resolvedReflectedOperationInvoker, children: _jsx(ReflectedEntityDataReaderContext.Provider, { value: reflectedEntityDataReader ?? null, children: _jsx(OperationBridgeAdaptersContext.Provider, { value: bridgeAdapterMap, children: _jsx(GraphClientCacheContext.Provider, { value: graphClientCache, children: _jsx(GraphExecutorContext.Provider, { value: graphExecutor ?? null, children: _jsx(GraphRuntimeContext.Provider, { value: runtime, children: children }) }) }) }) }) }));
25
+ }
26
+ export function useGraphRuntime() {
27
+ const runtime = useContext(GraphRuntimeContext);
28
+ if (runtime === null) {
29
+ throw new Error('useGraphRuntime must be used within an OntahiGraphProvider');
30
+ }
31
+ return runtime;
32
+ }
33
+ export function useGraphExecutor() {
34
+ const graphExecutor = useContext(GraphExecutorContext);
35
+ if (graphExecutor === null) {
36
+ throw new Error('useGraphExecutor must be used within an OntahiGraphProvider with graphExecutor');
37
+ }
38
+ return graphExecutor;
39
+ }
40
+ export function useGraphClientCache() {
41
+ const clientCache = useContext(GraphClientCacheContext);
42
+ if (clientCache === null) {
43
+ throw new Error('useGraphClientCache must be used within an OntahiGraphProvider');
44
+ }
45
+ return clientCache;
46
+ }
47
+ export function useGraphClientCacheSnapshot() {
48
+ const clientCache = useGraphClientCache();
49
+ useGraphClientCacheVersion(clientCache);
50
+ return clientCache.inspect();
51
+ }
52
+ export const useGraphClientCacheVersion = (clientCache) => useSyncExternalStore(clientCache.subscribe, () => clientCache.inspect().version, () => clientCache.inspect().version);
53
+ export function useOperationBridgeAdapter(adapterName) {
54
+ const adapters = useContext(OperationBridgeAdaptersContext);
55
+ if (adapters === null) {
56
+ throw new Error('useOperationBridgeAdapter must be used within an OntahiGraphProvider');
57
+ }
58
+ const adapter = adapters.get(adapterName);
59
+ if (!adapter) {
60
+ throw new Error(`No operation bridge adapter registered for "${adapterName}"`);
61
+ }
62
+ return adapter;
63
+ }
64
+ export function useDefaultOperationBridgeAdapter() {
65
+ const adapters = useContext(OperationBridgeAdaptersContext);
66
+ if (adapters === null) {
67
+ throw new Error('useDefaultOperationBridgeAdapter must be used within an OntahiGraphProvider');
68
+ }
69
+ const [adapter] = adapters.values();
70
+ if (!adapter) {
71
+ throw new Error('No operation bridge adapter registered.');
72
+ }
73
+ return adapter;
74
+ }
75
+ export function useHasOperationBridgeRuntime() {
76
+ const adapters = useContext(OperationBridgeAdaptersContext);
77
+ return adapters !== null && adapters.size > 0;
78
+ }
79
+ export function useReflectedEntityDataReader() {
80
+ const reader = useContext(ReflectedEntityDataReaderContext);
81
+ if (reader === null) {
82
+ throw new Error('useReflectedEntityDataReader must be used within an OntahiGraphProvider with reflectedEntityDataReader');
83
+ }
84
+ return reader;
85
+ }
86
+ export function useHasReflectedEntityDataReader() {
87
+ return useContext(ReflectedEntityDataReaderContext) !== null;
88
+ }
89
+ export function useReflectedOperationInvoker() {
90
+ const invoker = useContext(ReflectedOperationInvokerContext);
91
+ if (invoker === null) {
92
+ throw new Error('useReflectedOperationInvoker must be used within an OntahiGraphProvider with reflectedOperationInvoker');
93
+ }
94
+ return invoker;
95
+ }
96
+ export function useHasReflectedOperationInvoker() {
97
+ return useContext(ReflectedOperationInvokerContext) !== null;
98
+ }
99
+ export function useReflectedOperationSupport() {
100
+ const invoker = useContext(ReflectedOperationInvokerContext);
101
+ return useCallback((operation) => Boolean(invoker && (invoker.canInvokeOperation?.(operation) ?? true)), [invoker]);
102
+ }
103
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/graph/context.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n createGraphClientCache,\n type GraphClientCache,\n type ReflectedEntityDataReader,\n type ReflectedOperationDescriptor,\n type ReflectedOperationInvoker,\n} from '@ontahi/core/data-graph';\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\n\nimport type { AnyOperationBridgeAdapter } from '../actions/index.js';\n\nimport type { ReactGraphExecutor } from './executor.js';\nimport {\n createReflectedOperationInvoker,\n type ReflectedGraphOperationLike,\n} from './reflected-operation-invoker.js';\n\nconst noReflectedGraphOperations: readonly ReflectedGraphOperationLike[] = [];\n\nconst GraphRuntimeContext = createContext<unknown | null>(null);\nconst GraphExecutorContext = createContext<ReactGraphExecutor<any, any> | null>(null);\nconst GraphClientCacheContext = createContext<GraphClientCache | null>(null);\nconst OperationBridgeAdaptersContext = createContext<Map<string, AnyOperationBridgeAdapter> | null>(\n null,\n);\nconst ReflectedEntityDataReaderContext = createContext<ReflectedEntityDataReader | null>(null);\nconst ReflectedOperationInvokerContext = createContext<ReflectedOperationInvoker | null>(null);\n\nexport type OntahiGraphProviderProps<\n TGraphRuntime = unknown,\n TReadOptions = unknown,\n TCommandOptions = TReadOptions,\n> = {\n children: ReactNode;\n runtime: TGraphRuntime;\n graphExecutor?: ReactGraphExecutor<TReadOptions, TCommandOptions>;\n operationBridgeAdapters?: AnyOperationBridgeAdapter[];\n reflectedEntityDataReader?: ReflectedEntityDataReader;\n reflectedOperationInvoker?: ReflectedOperationInvoker;\n reflectedGraphOperations?: readonly ReflectedGraphOperationLike[];\n clientCache?: GraphClientCache;\n};\n\nexport function OntahiGraphProvider<\n TGraphRuntime = unknown,\n TReadOptions = unknown,\n TCommandOptions = TReadOptions,\n>({\n children,\n runtime,\n graphExecutor,\n operationBridgeAdapters = [],\n reflectedEntityDataReader,\n reflectedOperationInvoker,\n reflectedGraphOperations = noReflectedGraphOperations,\n clientCache,\n}: OntahiGraphProviderProps<TGraphRuntime, TReadOptions, TCommandOptions>) {\n const [defaultClientCache] = useState(() => createGraphClientCache());\n const graphClientCache = clientCache ?? defaultClientCache;\n const bridgeAdapterMap = useMemo(\n () => new Map(operationBridgeAdapters.map(adapter => [adapter.name, adapter])),\n [operationBridgeAdapters],\n );\n const resolvedReflectedOperationInvoker = useMemo(\n () =>\n reflectedGraphOperations.length > 0\n ? createReflectedOperationInvoker({\n fallback: reflectedOperationInvoker,\n graphExecutor,\n graphOperations: reflectedGraphOperations,\n })\n : (reflectedOperationInvoker ?? null),\n [graphExecutor, reflectedGraphOperations, reflectedOperationInvoker],\n );\n\n return (\n <ReflectedOperationInvokerContext.Provider value={resolvedReflectedOperationInvoker}>\n <ReflectedEntityDataReaderContext.Provider value={reflectedEntityDataReader ?? null}>\n <OperationBridgeAdaptersContext.Provider value={bridgeAdapterMap}>\n <GraphClientCacheContext.Provider value={graphClientCache}>\n <GraphExecutorContext.Provider value={graphExecutor ?? null}>\n <GraphRuntimeContext.Provider value={runtime}>\n {children}\n </GraphRuntimeContext.Provider>\n </GraphExecutorContext.Provider>\n </GraphClientCacheContext.Provider>\n </OperationBridgeAdaptersContext.Provider>\n </ReflectedEntityDataReaderContext.Provider>\n </ReflectedOperationInvokerContext.Provider>\n );\n}\n\nexport function useGraphRuntime<TGraphRuntime = unknown>() {\n const runtime = useContext(GraphRuntimeContext);\n\n if (runtime === null) {\n throw new Error('useGraphRuntime must be used within an OntahiGraphProvider');\n }\n\n return runtime as TGraphRuntime;\n}\n\nexport function useGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions>() {\n const graphExecutor = useContext(GraphExecutorContext);\n\n if (graphExecutor === null) {\n throw new Error(\n 'useGraphExecutor must be used within an OntahiGraphProvider with graphExecutor',\n );\n }\n\n return graphExecutor as ReactGraphExecutor<TReadOptions, TCommandOptions>;\n}\n\nexport function useGraphClientCache() {\n const clientCache = useContext(GraphClientCacheContext);\n\n if (clientCache === null) {\n throw new Error('useGraphClientCache must be used within an OntahiGraphProvider');\n }\n\n return clientCache;\n}\n\nexport function useGraphClientCacheSnapshot() {\n const clientCache = useGraphClientCache();\n\n useGraphClientCacheVersion(clientCache);\n\n return clientCache.inspect();\n}\n\nexport const useGraphClientCacheVersion = (clientCache: GraphClientCache) =>\n useSyncExternalStore(\n clientCache.subscribe,\n () => clientCache.inspect().version,\n () => clientCache.inspect().version,\n );\n\nexport function useOperationBridgeAdapter(adapterName: string) {\n const adapters = useContext(OperationBridgeAdaptersContext);\n\n if (adapters === null) {\n throw new Error('useOperationBridgeAdapter must be used within an OntahiGraphProvider');\n }\n\n const adapter = adapters.get(adapterName);\n\n if (!adapter) {\n throw new Error(`No operation bridge adapter registered for \"${adapterName}\"`);\n }\n\n return adapter;\n}\n\nexport function useDefaultOperationBridgeAdapter() {\n const adapters = useContext(OperationBridgeAdaptersContext);\n\n if (adapters === null) {\n throw new Error('useDefaultOperationBridgeAdapter must be used within an OntahiGraphProvider');\n }\n\n const [adapter] = adapters.values();\n\n if (!adapter) {\n throw new Error('No operation bridge adapter registered.');\n }\n\n return adapter;\n}\n\nexport function useHasOperationBridgeRuntime() {\n const adapters = useContext(OperationBridgeAdaptersContext);\n return adapters !== null && adapters.size > 0;\n}\n\nexport function useReflectedEntityDataReader() {\n const reader = useContext(ReflectedEntityDataReaderContext);\n\n if (reader === null) {\n throw new Error(\n 'useReflectedEntityDataReader must be used within an OntahiGraphProvider with reflectedEntityDataReader',\n );\n }\n\n return reader;\n}\n\nexport function useHasReflectedEntityDataReader() {\n return useContext(ReflectedEntityDataReaderContext) !== null;\n}\n\nexport function useReflectedOperationInvoker() {\n const invoker = useContext(ReflectedOperationInvokerContext);\n\n if (invoker === null) {\n throw new Error(\n 'useReflectedOperationInvoker must be used within an OntahiGraphProvider with reflectedOperationInvoker',\n );\n }\n\n return invoker;\n}\n\nexport function useHasReflectedOperationInvoker() {\n return useContext(ReflectedOperationInvokerContext) !== null;\n}\n\nexport function useReflectedOperationSupport() {\n const invoker = useContext(ReflectedOperationInvokerContext);\n\n return useCallback(\n (operation: ReflectedOperationDescriptor) =>\n Boolean(invoker && (invoker.canInvokeOperation?.(operation) ?? true)),\n [invoker],\n );\n}\n\nexport type { GraphClientCache };\n"]}
@@ -0,0 +1,41 @@
1
+ import type { GraphCommandSpec, GraphOperationDeclaration, GraphSchemaLike, InferGraphSchemaClientInput, QueryOrView, QuerySpec } from '@ontahi/core/data-graph';
2
+ import type { QueryKey, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
3
+ export interface ReactGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions> {
4
+ get<TParams, TResult>(read: QueryOrView<TParams, TResult>, params: TParams, options?: TReadOptions): Promise<TResult | null>;
5
+ run<TParams, TResult>(read: QueryOrView<TParams, TResult>, params: TParams, options?: TReadOptions): Promise<TResult[]>;
6
+ count<TParams, TResult>(read: QueryOrView<TParams, TResult>, params: TParams, options?: TReadOptions): Promise<number>;
7
+ runCommand<TResult = void>(command: GraphCommandSpec<any, any, TResult>, options?: TCommandOptions): Promise<TResult>;
8
+ }
9
+ export type BuildableRead<TResult> = {
10
+ build: () => QuerySpec<any, TResult>;
11
+ };
12
+ export type GraphReadSource<TResult = unknown> = QueryOrView<any, TResult> | BuildableRead<TResult>;
13
+ export type ReadParams<TRead> = TRead extends QueryOrView<infer TParams, any> ? TParams : undefined;
14
+ export type ReadResult<TRead> = TRead extends QueryOrView<any, infer TResult> ? TResult : TRead extends BuildableRead<infer TResult> ? TResult : never;
15
+ export type GraphQueryMode = 'get' | 'run' | 'count' | 'exists';
16
+ export type GraphQueryData<TRead, TMode extends GraphQueryMode> = TMode extends 'get' ? ReadResult<TRead> | null : TMode extends 'run' ? ReadResult<TRead>[] : TMode extends 'count' ? number : boolean;
17
+ export type GraphQueryOptions<TRead, TMode extends GraphQueryMode, TReadOptions = unknown> = Omit<UseQueryOptions<GraphQueryData<TRead, TMode>, Error, GraphQueryData<TRead, TMode>, QueryKey>, 'queryKey' | 'queryFn'> & {
18
+ mode: TMode;
19
+ params?: ReadParams<TRead>;
20
+ queryKey?: QueryKey;
21
+ runtimeOptions?: TReadOptions;
22
+ };
23
+ export type CommandLike<TResult> = GraphCommandSpec<any, any, TResult> | {
24
+ build: () => GraphCommandSpec<any, any, TResult>;
25
+ };
26
+ export type GraphCommandBuilder<TVariables, TResult> = (variables: TVariables) => CommandLike<TResult>;
27
+ export type GraphOperationLike<TVariables, TResult> = GraphOperationDeclaration<TVariables, CommandLike<TResult>> & {
28
+ id: string;
29
+ };
30
+ export type GraphOperationClientInput<TOperation> = TOperation extends {
31
+ input: infer TSchema extends GraphSchemaLike;
32
+ } ? InferGraphSchemaClientInput<TSchema> : TOperation extends GraphOperationDeclaration<infer TInput, any> ? TInput : never;
33
+ export type GraphOperationResult<TOperation> = TOperation extends {
34
+ run: (...args: any[]) => CommandLike<infer TResult>;
35
+ } ? TResult : never;
36
+ export type GraphCommandHookOptions<TResult, TVariables, TContext, TCommandOptions = unknown> = Omit<UseMutationOptions<TResult, Error, TVariables, TContext>, 'mutationFn'> & {
37
+ mutationKey?: QueryKey;
38
+ runtimeOptions?: TCommandOptions;
39
+ invalidateQueryKeys?: QueryKey[];
40
+ };
41
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/graph/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/graph/executor.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n GraphCommandSpec,\n GraphOperationDeclaration,\n GraphSchemaLike,\n InferGraphSchemaClientInput,\n QueryOrView,\n QuerySpec,\n} from '@ontahi/core/data-graph';\nimport type { QueryKey, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';\n\nexport interface ReactGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions> {\n get<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult | null>;\n run<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult[]>;\n count<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<number>;\n runCommand<TResult = void>(\n command: GraphCommandSpec<any, any, TResult>,\n options?: TCommandOptions,\n ): Promise<TResult>;\n}\n\nexport type BuildableRead<TResult> = {\n build: () => QuerySpec<any, TResult>;\n};\n\nexport type GraphReadSource<TResult = unknown> = QueryOrView<any, TResult> | BuildableRead<TResult>;\n\nexport type ReadParams<TRead> = TRead extends QueryOrView<infer TParams, any> ? TParams : undefined;\n\nexport type ReadResult<TRead> =\n TRead extends QueryOrView<any, infer TResult>\n ? TResult\n : TRead extends BuildableRead<infer TResult>\n ? TResult\n : never;\n\nexport type GraphQueryMode = 'get' | 'run' | 'count' | 'exists';\n\nexport type GraphQueryData<TRead, TMode extends GraphQueryMode> = TMode extends 'get'\n ? ReadResult<TRead> | null\n : TMode extends 'run'\n ? ReadResult<TRead>[]\n : TMode extends 'count'\n ? number\n : boolean;\n\nexport type GraphQueryOptions<TRead, TMode extends GraphQueryMode, TReadOptions = unknown> = Omit<\n UseQueryOptions<GraphQueryData<TRead, TMode>, Error, GraphQueryData<TRead, TMode>, QueryKey>,\n 'queryKey' | 'queryFn'\n> & {\n mode: TMode;\n params?: ReadParams<TRead>;\n queryKey?: QueryKey;\n runtimeOptions?: TReadOptions;\n};\n\nexport type CommandLike<TResult> =\n | GraphCommandSpec<any, any, TResult>\n | {\n build: () => GraphCommandSpec<any, any, TResult>;\n };\n\nexport type GraphCommandBuilder<TVariables, TResult> = (\n variables: TVariables,\n) => CommandLike<TResult>;\n\nexport type GraphOperationLike<TVariables, TResult> = GraphOperationDeclaration<\n TVariables,\n CommandLike<TResult>\n> & {\n id: string;\n};\n\nexport type GraphOperationClientInput<TOperation> = TOperation extends {\n input: infer TSchema extends GraphSchemaLike;\n}\n ? InferGraphSchemaClientInput<TSchema>\n : TOperation extends GraphOperationDeclaration<infer TInput, any>\n ? TInput\n : never;\n\nexport type GraphOperationResult<TOperation> = TOperation extends {\n run: (...args: any[]) => CommandLike<infer TResult>;\n}\n ? TResult\n : never;\n\nexport type GraphCommandHookOptions<\n TResult,\n TVariables,\n TContext,\n TCommandOptions = unknown,\n> = Omit<UseMutationOptions<TResult, Error, TVariables, TContext>, 'mutationFn'> & {\n mutationKey?: QueryKey;\n runtimeOptions?: TCommandOptions;\n invalidateQueryKeys?: QueryKey[];\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { type UseMutationResult, type UseQueryResult } from '@tanstack/react-query';
2
+ import type { GraphCommandBuilder, GraphCommandHookOptions, GraphOperationLike, GraphOperationClientInput, GraphOperationResult, GraphQueryData, GraphQueryMode, GraphQueryOptions, GraphReadSource, ReadResult } from './executor.js';
3
+ export declare function useGraphQuery<TRead, TMode extends GraphQueryMode, TReadOptions = unknown, TCommandOptions = TReadOptions>(read: GraphReadSource<ReadResult<TRead>>, options: GraphQueryOptions<TRead, TMode, TReadOptions>): UseQueryResult<GraphQueryData<TRead, TMode>, Error>;
4
+ export declare function useGraphCommand<TVariables, TResult = void, TContext = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions>(buildCommand: GraphCommandBuilder<TVariables, TResult>, options?: GraphCommandHookOptions<TResult, TVariables, TContext, TCommandOptions>): UseMutationResult<TResult, Error, TVariables, TContext>;
5
+ export declare function useGraphOperation<TOperation extends GraphOperationLike<any, any>, TContext = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions>(operation: TOperation, options?: GraphCommandHookOptions<GraphOperationResult<TOperation>, GraphOperationClientInput<TOperation>, TContext, TCommandOptions>): UseMutationResult<GraphOperationResult<TOperation>, Error, GraphOperationClientInput<TOperation>, TContext>;
6
+ //# sourceMappingURL=graph-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-hooks.d.ts","sourceRoot":"","sources":["../../src/graph/graph-hooks.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAGV,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EAEf,UAAU,EACX,MAAM,eAAe,CAAC;AAqCvB,wBAAgB,aAAa,CAC3B,KAAK,EACL,KAAK,SAAS,cAAc,EAC5B,YAAY,GAAG,OAAO,EACtB,eAAe,GAAG,YAAY,EAE9B,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EACxC,OAAO,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,GACrD,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAwBrD;AAED,wBAAgB,eAAe,CAC7B,UAAU,EACV,OAAO,GAAG,IAAI,EACd,QAAQ,GAAG,OAAO,EAClB,YAAY,GAAG,OAAO,EACtB,eAAe,GAAG,YAAY,EAE9B,YAAY,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,EACtD,OAAO,CAAC,EAAE,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,GAChF,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAoBzD;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,SAAS,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/C,QAAQ,GAAG,OAAO,EAClB,YAAY,GAAG,OAAO,EACtB,eAAe,GAAG,YAAY,EAE9B,SAAS,EAAE,UAAU,EACrB,OAAO,CAAC,EAAE,uBAAuB,CAC/B,oBAAoB,CAAC,UAAU,CAAC,EAChC,yBAAyB,CAAC,UAAU,CAAC,EACrC,QAAQ,EACR,eAAe,CAChB,GACA,iBAAiB,CAClB,oBAAoB,CAAC,UAAU,CAAC,EAChC,KAAK,EACL,yBAAyB,CAAC,UAAU,CAAC,EACrC,QAAQ,CACT,CAiBA"}