@nice-code/action 0.10.0 → 0.11.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 (45) hide show
  1. package/build/{ActionDevtoolsCore-yfJ9tkvl.js → ActionDevtoolsCore-9PsnscvK.mjs} +2 -2
  2. package/build/ActionDevtoolsCore-9PsnscvK.mjs.map +1 -0
  3. package/build/{ActionDevtoolsCore-B4s6aGvI.d.ts → ActionDevtoolsCore-CCRLYASa.d.cts} +2 -2
  4. package/build/{ActionDevtoolsCore-Pg7ERO3L.d.ts → ActionDevtoolsCore-CYGD2o6C.d.mts} +2 -2
  5. package/build/{ActionDevtoolsCore-BLeY_N-3.js → ActionDevtoolsCore-DtgXwPBZ.cjs} +2 -2
  6. package/build/ActionDevtoolsCore-DtgXwPBZ.cjs.map +1 -0
  7. package/build/{ActionPayload.types-BN-rXFBK.d.ts → ActionPayload.types-BN-rXFBK.d.cts} +1 -1
  8. package/build/{ActionPayload.types-D28ELKXC.d.ts → ActionPayload.types-D28ELKXC.d.mts} +1 -1
  9. package/build/{RunningAction.types-C176rqHG.js → RunningAction.types-C176rqHG.mjs} +1 -1
  10. package/build/RunningAction.types-C176rqHG.mjs.map +1 -0
  11. package/build/{RunningAction.types-DjCX1xp5.js → RunningAction.types-DjCX1xp5.cjs} +1 -1
  12. package/build/RunningAction.types-DjCX1xp5.cjs.map +1 -0
  13. package/build/devtools/browser/index.cjs +3886 -0
  14. package/build/devtools/browser/index.cjs.map +1 -0
  15. package/build/devtools/browser/{index.d.ts → index.d.cts} +2 -2
  16. package/build/devtools/browser/index.d.mts +17 -0
  17. package/build/devtools/browser/{index.js → index.mjs} +2 -2
  18. package/build/devtools/browser/index.mjs.map +1 -0
  19. package/build/devtools/server/index.cjs +108 -0
  20. package/build/devtools/server/index.cjs.map +1 -0
  21. package/build/devtools/server/{index.d.ts → index.d.cts} +2 -2
  22. package/build/devtools/server/index.d.mts +35 -0
  23. package/build/devtools/server/{index.js → index.mjs} +3 -3
  24. package/build/devtools/server/index.mjs.map +1 -0
  25. package/build/index.cjs +4045 -0
  26. package/build/index.cjs.map +1 -0
  27. package/build/{index.d.ts → index.d.cts} +1 -1
  28. package/build/index.d.mts +2 -0
  29. package/build/{index.js → index.mjs} +2 -2
  30. package/build/index.mjs.map +1 -0
  31. package/build/react-query/index.cjs +70 -0
  32. package/build/react-query/index.cjs.map +1 -0
  33. package/build/react-query/{index.d.ts → index.d.cts} +2 -2
  34. package/build/react-query/index.d.mts +17 -0
  35. package/build/react-query/{index.js → index.mjs} +1 -1
  36. package/build/react-query/index.mjs.map +1 -0
  37. package/package.json +39 -15
  38. package/build/ActionDevtoolsCore-BLeY_N-3.js.map +0 -1
  39. package/build/ActionDevtoolsCore-yfJ9tkvl.js.map +0 -1
  40. package/build/RunningAction.types-C176rqHG.js.map +0 -1
  41. package/build/RunningAction.types-DjCX1xp5.js.map +0 -1
  42. package/build/devtools/browser/index.js.map +0 -1
  43. package/build/devtools/server/index.js.map +0 -1
  44. package/build/index.js.map +0 -1
  45. package/build/react-query/index.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _tanstack_react_query = require("@tanstack/react-query");
3
+ let react = require("react");
4
+ //#region src/react-query/hooks/useActionMutation.ts
5
+ function useActionMutation(action, options) {
6
+ const mutationOptions = options ?? {};
7
+ const callSiteRef = (0, react.useRef)(void 0);
8
+ const result = (0, _tanstack_react_query.useMutation)({
9
+ mutationFn: (input) => {
10
+ const req = action.request(input);
11
+ req._callSite = callSiteRef.current;
12
+ callSiteRef.current = void 0;
13
+ return req.runToOutput();
14
+ },
15
+ ...mutationOptions
16
+ });
17
+ return {
18
+ ...result,
19
+ mutate: (...args) => {
20
+ callSiteRef.current = (/* @__PURE__ */ new Error()).stack;
21
+ return result.mutate(...args);
22
+ },
23
+ mutateAsync: (...args) => {
24
+ callSiteRef.current = (/* @__PURE__ */ new Error()).stack;
25
+ return result.mutateAsync(...args);
26
+ }
27
+ };
28
+ }
29
+ //#endregion
30
+ //#region src/react-query/hooks/useActionQuery.ts
31
+ function actionQueryKey(action, input) {
32
+ if (input === void 0) return [
33
+ "nice-action",
34
+ action.domain,
35
+ action.allDomains,
36
+ action.id
37
+ ];
38
+ return [
39
+ "nice-action",
40
+ action.domain,
41
+ action.allDomains,
42
+ action.id,
43
+ input
44
+ ];
45
+ }
46
+ function useActionQuery(action, ...args) {
47
+ const hasInputSchema = action.schema.inputSchema != null;
48
+ let input;
49
+ let options;
50
+ if (hasInputSchema) [input, options] = args;
51
+ else [options] = args;
52
+ const { enabled, ...queryOptions } = options ?? {};
53
+ const callSiteRef = (0, react.useRef)((/* @__PURE__ */ new Error()).stack);
54
+ return (0, _tanstack_react_query.useQuery)({
55
+ queryKey: input != null ? actionQueryKey(action, input) : actionQueryKey(action),
56
+ queryFn: () => {
57
+ const req = action.request(input);
58
+ req._callSite = callSiteRef.current;
59
+ return req.runToOutput();
60
+ },
61
+ enabled: hasInputSchema ? input != null && (enabled ?? true) : enabled ?? true,
62
+ ...queryOptions
63
+ });
64
+ }
65
+ //#endregion
66
+ exports.actionQueryKey = actionQueryKey;
67
+ exports.useActionMutation = useActionMutation;
68
+ exports.useActionQuery = useActionQuery;
69
+
70
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/react-query/hooks/useActionMutation.ts","../../src/react-query/hooks/useActionQuery.ts"],"sourcesContent":["import {\r\n type UseMutationOptions,\r\n type UseMutationResult,\r\n useMutation,\r\n} from \"@tanstack/react-query\";\r\nimport { useRef } from \"react\";\r\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\r\nimport type {\r\n IActionDomain,\r\n TInferInputFromSchema,\r\n TInferOutputFromSchema,\r\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\r\nimport type { ActionSchema, TInferActionError } from \"../../ActionDefinition/Schema/ActionSchema\";\r\n\r\n/** When an action has no input schema (Input = never), use void so mutate() needs no arguments. */\r\nexport type TActionMutationVars<SCH extends ActionSchema<any, any, any>> = [\r\n TInferInputFromSchema<SCH>[\"Input\"],\r\n] extends [never]\r\n ? void\r\n : TInferInputFromSchema<SCH>[\"Input\"];\r\n\r\nexport type TUseNiceMutationOptions<\r\n DOM extends IActionDomain,\r\n ID extends keyof DOM[\"actionSchema\"] & string,\r\n SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\r\n TContext = unknown,\r\n> = Omit<\r\n UseMutationOptions<\r\n TInferOutputFromSchema<SCH>[\"Output\"],\r\n TInferActionError<SCH>,\r\n TActionMutationVars<SCH>,\r\n TContext\r\n >,\r\n \"mutationFn\"\r\n>;\r\n\r\nexport function useActionMutation<\r\n DOM extends IActionDomain,\r\n ID extends keyof DOM[\"actionSchema\"] & string,\r\n SCH extends DOM[\"actionSchema\"][ID],\r\n TContext = unknown,\r\n>(\r\n action: ActionCore<DOM, ID>,\r\n options?: TUseNiceMutationOptions<DOM, ID, SCH, TContext>,\r\n): UseMutationResult<\r\n TInferOutputFromSchema<SCH>[\"Output\"],\r\n TInferActionError<SCH>,\r\n TActionMutationVars<SCH>,\r\n TContext\r\n> {\r\n const mutationOptions = options ?? {};\r\n\r\n // Side-channel for the call site: mutate() writes it synchronously, mutationFn reads it.\r\n // React Query calls mutationFn synchronously within mutate(), so the ref is always fresh.\r\n const callSiteRef = useRef<string | undefined>(undefined);\r\n\r\n const result = useMutation({\r\n mutationFn: (input: TActionMutationVars<SCH>) => {\r\n const req = action.request(input as unknown as TInferInputFromSchema<SCH>[\"Input\"]);\r\n req._callSite = callSiteRef.current;\r\n callSiteRef.current = undefined;\r\n return req.runToOutput();\r\n },\r\n ...mutationOptions,\r\n });\r\n\r\n // Wrap mutate/mutateAsync so the call site is captured at the user's invocation point.\r\n // By the time mutationFn runs inside React Query's scheduler the user's frames are gone.\r\n return {\r\n ...result,\r\n mutate: (...args: Parameters<typeof result.mutate>) => {\r\n callSiteRef.current = new Error().stack;\r\n return result.mutate(...args);\r\n },\r\n mutateAsync: (...args: Parameters<typeof result.mutateAsync>) => {\r\n callSiteRef.current = new Error().stack;\r\n return result.mutateAsync(...args);\r\n },\r\n };\r\n}\r\n","import {\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n} from \"@tanstack/react-query\";\nimport { useRef } from \"react\";\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\nimport type {\n IActionDomain,\n TInferInputFromSchema,\n TInferOutputFromSchema,\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\nimport type { TInferActionError } from \"../../ActionDefinition/Schema/ActionSchema\";\n\nexport function actionQueryKey<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n>(action: ActionCore<DOM, ID>): readonly [\"nice-action\", DOM[\"domain\"], DOM[\"allDomains\"], ID];\n\nexport function actionQueryKey<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n>(\n action: ActionCore<DOM, ID>,\n input: TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n): readonly [\n \"nice-action\",\n DOM[\"domain\"],\n DOM[\"allDomains\"],\n ID,\n TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n];\n\nexport function actionQueryKey(action: ActionCore<any, any>, input?: unknown): QueryKey {\n if (input === undefined) {\n return [\"nice-action\", action.domain, action.allDomains, action.id] as const;\n }\n\n return [\"nice-action\", action.domain, action.allDomains, action.id, input] as const;\n}\n\nexport type TUseActionQueryOptions<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\n TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n> = Omit<\n UseQueryOptions<TInferOutputFromSchema<SCH>[\"Output\"], TInferActionError<SCH>, TSelect, QueryKey>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport function useActionQuery<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n SCH extends DOM[\"actionSchema\"][ID],\n TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n>(\n action: ActionCore<DOM, ID>,\n ...args: [TInferInputFromSchema<SCH>[\"Input\"]] extends [never]\n ? [options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>]\n : [\n input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>,\n ]\n): UseQueryResult<TSelect, TInferActionError<SCH>> {\n const hasInputSchema = action.schema.inputSchema != null;\n\n let input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined;\n let options: TUseActionQueryOptions<DOM, ID, SCH, TSelect> | undefined;\n\n if (hasInputSchema) {\n [input, options] = args as [\n TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n TUseActionQueryOptions<DOM, ID, SCH, TSelect>?,\n ];\n } else {\n [options] = args as [TUseActionQueryOptions<DOM, ID, SCH, TSelect>?];\n }\n\n const { enabled, ...queryOptions } = options ?? {};\n\n // Capture the call site synchronously here — the user's component frame is on the\n // stack now. By the time queryFn runs inside React Query's scheduler it's gone.\n const callSiteRef = useRef(new Error().stack);\n\n return useQuery({\n queryKey: input != null ? actionQueryKey(action, input) : actionQueryKey(action),\n queryFn: () => {\n const req = (action.request as (input: any) => any)(input);\n req._callSite = callSiteRef.current;\n return req.runToOutput();\n },\n enabled: hasInputSchema ? input != null && (enabled ?? true) : (enabled ?? true),\n ...queryOptions,\n } as UseQueryOptions<TInferOutputFromSchema<SCH>[\"Output\"], TInferActionError<SCH>, TSelect>);\n}\n"],"mappings":";;;;AAoCA,SAAgB,kBAMd,QACA,SAMA;CACA,MAAM,kBAAkB,WAAW,CAAC;CAIpC,MAAM,eAAA,GAAA,MAAA,OAAA,CAAyC,KAAA,CAAS;CAExD,MAAM,UAAA,GAAA,sBAAA,YAAA,CAAqB;EACzB,aAAa,UAAoC;GAC/C,MAAM,MAAM,OAAO,QAAQ,KAAuD;GAClF,IAAI,YAAY,YAAY;GAC5B,YAAY,UAAU,KAAA;GACtB,OAAO,IAAI,YAAY;EACzB;EACA,GAAG;CACL,CAAC;CAID,OAAO;EACL,GAAG;EACH,SAAS,GAAG,SAA2C;GACrD,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,OAAO,GAAG,IAAI;EAC9B;EACA,cAAc,GAAG,SAAgD;GAC/D,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,YAAY,GAAG,IAAI;EACnC;CACF;AACF;;;AC7CA,SAAgB,eAAe,QAA8B,OAA2B;CACtF,IAAI,UAAU,KAAA,GACZ,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;CAAE;CAGpE,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;EAAI;CAAK;AAC3E;AAYA,SAAgB,eAMd,QACA,GAAG,MAM8C;CACjD,MAAM,iBAAiB,OAAO,OAAO,eAAe;CAEpD,IAAI;CACJ,IAAI;CAEJ,IAAI,gBACF,CAAC,OAAO,WAAW;MAKnB,CAAC,WAAW;CAGd,MAAM,EAAE,SAAS,GAAG,iBAAiB,WAAW,CAAC;CAIjD,MAAM,eAAA,GAAA,MAAA,OAAA,kBAAqB,IAAI,MAAM,EAAA,CAAE,KAAK;CAE5C,QAAA,GAAA,sBAAA,SAAA,CAAgB;EACd,UAAU,SAAS,OAAO,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM;EAC/E,eAAe;GACb,MAAM,MAAO,OAAO,QAAgC,KAAK;GACzD,IAAI,YAAY,YAAY;GAC5B,OAAO,IAAI,YAAY;EACzB;EACA,SAAS,iBAAiB,SAAS,SAAS,WAAW,QAAS,WAAW;EAC3E,GAAG;CACL,CAA4F;AAC9F"}
@@ -1,4 +1,4 @@
1
- import { $n as TInferOutputFromSchema, Kn as IActionDomain, Pt as ActionCore, Qn as TInferInputFromSchema, nr as ActionSchema, rr as TInferActionError } from "../ActionPayload.types-BN-rXFBK.js";
1
+ import { $n as TInferOutputFromSchema, Kn as IActionDomain, Pt as ActionCore, Qn as TInferInputFromSchema, nr as ActionSchema, rr as TInferActionError } from "../ActionPayload.types-BN-rXFBK.cjs";
2
2
  import { QueryKey, UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
3
 
4
4
  //#region src/react-query/hooks/useActionMutation.d.ts
@@ -14,4 +14,4 @@ type TUseActionQueryOptions<DOM extends IActionDomain, ID extends keyof DOM["act
14
14
  declare function useActionQuery<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string, SCH extends DOM["actionSchema"][ID], TSelect = TInferOutputFromSchema<SCH>["Output"]>(action: ActionCore<DOM, ID>, ...args: [TInferInputFromSchema<SCH>["Input"]] extends [never] ? [options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>] : [input: TInferInputFromSchema<SCH>["Input"] | null | undefined, options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>]): UseQueryResult<TSelect, TInferActionError<SCH>>;
15
15
  //#endregion
16
16
  export { TActionMutationVars, TUseActionQueryOptions, TUseNiceMutationOptions, actionQueryKey, useActionMutation, useActionQuery };
17
- //# sourceMappingURL=index.d.ts.map
17
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,17 @@
1
+ import { $n as TInferOutputFromSchema, Kn as IActionDomain, Pt as ActionCore, Qn as TInferInputFromSchema, nr as ActionSchema, rr as TInferActionError } from "../ActionPayload.types-D28ELKXC.mjs";
2
+ import { QueryKey, UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
+
4
+ //#region src/react-query/hooks/useActionMutation.d.ts
5
+ /** When an action has no input schema (Input = never), use void so mutate() needs no arguments. */
6
+ type TActionMutationVars<SCH extends ActionSchema<any, any, any>> = [TInferInputFromSchema<SCH>["Input"]] extends [never] ? void : TInferInputFromSchema<SCH>["Input"];
7
+ type TUseNiceMutationOptions<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string, SCH extends DOM["actionSchema"][ID] = DOM["actionSchema"][ID], TContext = unknown> = Omit<UseMutationOptions<TInferOutputFromSchema<SCH>["Output"], TInferActionError<SCH>, TActionMutationVars<SCH>, TContext>, "mutationFn">;
8
+ declare function useActionMutation<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string, SCH extends DOM["actionSchema"][ID], TContext = unknown>(action: ActionCore<DOM, ID>, options?: TUseNiceMutationOptions<DOM, ID, SCH, TContext>): UseMutationResult<TInferOutputFromSchema<SCH>["Output"], TInferActionError<SCH>, TActionMutationVars<SCH>, TContext>;
9
+ //#endregion
10
+ //#region src/react-query/hooks/useActionQuery.d.ts
11
+ declare function actionQueryKey<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string>(action: ActionCore<DOM, ID>): readonly ["nice-action", DOM["domain"], DOM["allDomains"], ID];
12
+ declare function actionQueryKey<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string>(action: ActionCore<DOM, ID>, input: TInferInputFromSchema<DOM["actionSchema"][ID]>["Input"]): readonly ["nice-action", DOM["domain"], DOM["allDomains"], ID, TInferInputFromSchema<DOM["actionSchema"][ID]>["Input"]];
13
+ type TUseActionQueryOptions<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string, SCH extends DOM["actionSchema"][ID] = DOM["actionSchema"][ID], TSelect = TInferOutputFromSchema<SCH>["Output"]> = Omit<UseQueryOptions<TInferOutputFromSchema<SCH>["Output"], TInferActionError<SCH>, TSelect, QueryKey>, "queryKey" | "queryFn">;
14
+ declare function useActionQuery<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string, SCH extends DOM["actionSchema"][ID], TSelect = TInferOutputFromSchema<SCH>["Output"]>(action: ActionCore<DOM, ID>, ...args: [TInferInputFromSchema<SCH>["Input"]] extends [never] ? [options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>] : [input: TInferInputFromSchema<SCH>["Input"] | null | undefined, options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>]): UseQueryResult<TSelect, TInferActionError<SCH>>;
15
+ //#endregion
16
+ export { TActionMutationVars, TUseActionQueryOptions, TUseNiceMutationOptions, actionQueryKey, useActionMutation, useActionQuery };
17
+ //# sourceMappingURL=index.d.mts.map
@@ -64,4 +64,4 @@ function useActionQuery(action, ...args) {
64
64
  //#endregion
65
65
  export { actionQueryKey, useActionMutation, useActionQuery };
66
66
 
67
- //# sourceMappingURL=index.js.map
67
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/react-query/hooks/useActionMutation.ts","../../src/react-query/hooks/useActionQuery.ts"],"sourcesContent":["import {\r\n type UseMutationOptions,\r\n type UseMutationResult,\r\n useMutation,\r\n} from \"@tanstack/react-query\";\r\nimport { useRef } from \"react\";\r\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\r\nimport type {\r\n IActionDomain,\r\n TInferInputFromSchema,\r\n TInferOutputFromSchema,\r\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\r\nimport type { ActionSchema, TInferActionError } from \"../../ActionDefinition/Schema/ActionSchema\";\r\n\r\n/** When an action has no input schema (Input = never), use void so mutate() needs no arguments. */\r\nexport type TActionMutationVars<SCH extends ActionSchema<any, any, any>> = [\r\n TInferInputFromSchema<SCH>[\"Input\"],\r\n] extends [never]\r\n ? void\r\n : TInferInputFromSchema<SCH>[\"Input\"];\r\n\r\nexport type TUseNiceMutationOptions<\r\n DOM extends IActionDomain,\r\n ID extends keyof DOM[\"actionSchema\"] & string,\r\n SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\r\n TContext = unknown,\r\n> = Omit<\r\n UseMutationOptions<\r\n TInferOutputFromSchema<SCH>[\"Output\"],\r\n TInferActionError<SCH>,\r\n TActionMutationVars<SCH>,\r\n TContext\r\n >,\r\n \"mutationFn\"\r\n>;\r\n\r\nexport function useActionMutation<\r\n DOM extends IActionDomain,\r\n ID extends keyof DOM[\"actionSchema\"] & string,\r\n SCH extends DOM[\"actionSchema\"][ID],\r\n TContext = unknown,\r\n>(\r\n action: ActionCore<DOM, ID>,\r\n options?: TUseNiceMutationOptions<DOM, ID, SCH, TContext>,\r\n): UseMutationResult<\r\n TInferOutputFromSchema<SCH>[\"Output\"],\r\n TInferActionError<SCH>,\r\n TActionMutationVars<SCH>,\r\n TContext\r\n> {\r\n const mutationOptions = options ?? {};\r\n\r\n // Side-channel for the call site: mutate() writes it synchronously, mutationFn reads it.\r\n // React Query calls mutationFn synchronously within mutate(), so the ref is always fresh.\r\n const callSiteRef = useRef<string | undefined>(undefined);\r\n\r\n const result = useMutation({\r\n mutationFn: (input: TActionMutationVars<SCH>) => {\r\n const req = action.request(input as unknown as TInferInputFromSchema<SCH>[\"Input\"]);\r\n req._callSite = callSiteRef.current;\r\n callSiteRef.current = undefined;\r\n return req.runToOutput();\r\n },\r\n ...mutationOptions,\r\n });\r\n\r\n // Wrap mutate/mutateAsync so the call site is captured at the user's invocation point.\r\n // By the time mutationFn runs inside React Query's scheduler the user's frames are gone.\r\n return {\r\n ...result,\r\n mutate: (...args: Parameters<typeof result.mutate>) => {\r\n callSiteRef.current = new Error().stack;\r\n return result.mutate(...args);\r\n },\r\n mutateAsync: (...args: Parameters<typeof result.mutateAsync>) => {\r\n callSiteRef.current = new Error().stack;\r\n return result.mutateAsync(...args);\r\n },\r\n };\r\n}\r\n","import {\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n useQuery,\n} from \"@tanstack/react-query\";\nimport { useRef } from \"react\";\nimport type { ActionCore } from \"../../ActionDefinition/Action/Core/ActionCore\";\nimport type {\n IActionDomain,\n TInferInputFromSchema,\n TInferOutputFromSchema,\n} from \"../../ActionDefinition/Domain/ActionDomain.types\";\nimport type { TInferActionError } from \"../../ActionDefinition/Schema/ActionSchema\";\n\nexport function actionQueryKey<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n>(action: ActionCore<DOM, ID>): readonly [\"nice-action\", DOM[\"domain\"], DOM[\"allDomains\"], ID];\n\nexport function actionQueryKey<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n>(\n action: ActionCore<DOM, ID>,\n input: TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n): readonly [\n \"nice-action\",\n DOM[\"domain\"],\n DOM[\"allDomains\"],\n ID,\n TInferInputFromSchema<DOM[\"actionSchema\"][ID]>[\"Input\"],\n];\n\nexport function actionQueryKey(action: ActionCore<any, any>, input?: unknown): QueryKey {\n if (input === undefined) {\n return [\"nice-action\", action.domain, action.allDomains, action.id] as const;\n }\n\n return [\"nice-action\", action.domain, action.allDomains, action.id, input] as const;\n}\n\nexport type TUseActionQueryOptions<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n SCH extends DOM[\"actionSchema\"][ID] = DOM[\"actionSchema\"][ID],\n TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n> = Omit<\n UseQueryOptions<TInferOutputFromSchema<SCH>[\"Output\"], TInferActionError<SCH>, TSelect, QueryKey>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport function useActionQuery<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n SCH extends DOM[\"actionSchema\"][ID],\n TSelect = TInferOutputFromSchema<SCH>[\"Output\"],\n>(\n action: ActionCore<DOM, ID>,\n ...args: [TInferInputFromSchema<SCH>[\"Input\"]] extends [never]\n ? [options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>]\n : [\n input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n options?: TUseActionQueryOptions<DOM, ID, SCH, TSelect>,\n ]\n): UseQueryResult<TSelect, TInferActionError<SCH>> {\n const hasInputSchema = action.schema.inputSchema != null;\n\n let input: TInferInputFromSchema<SCH>[\"Input\"] | null | undefined;\n let options: TUseActionQueryOptions<DOM, ID, SCH, TSelect> | undefined;\n\n if (hasInputSchema) {\n [input, options] = args as [\n TInferInputFromSchema<SCH>[\"Input\"] | null | undefined,\n TUseActionQueryOptions<DOM, ID, SCH, TSelect>?,\n ];\n } else {\n [options] = args as [TUseActionQueryOptions<DOM, ID, SCH, TSelect>?];\n }\n\n const { enabled, ...queryOptions } = options ?? {};\n\n // Capture the call site synchronously here — the user's component frame is on the\n // stack now. By the time queryFn runs inside React Query's scheduler it's gone.\n const callSiteRef = useRef(new Error().stack);\n\n return useQuery({\n queryKey: input != null ? actionQueryKey(action, input) : actionQueryKey(action),\n queryFn: () => {\n const req = (action.request as (input: any) => any)(input);\n req._callSite = callSiteRef.current;\n return req.runToOutput();\n },\n enabled: hasInputSchema ? input != null && (enabled ?? true) : (enabled ?? true),\n ...queryOptions,\n } as UseQueryOptions<TInferOutputFromSchema<SCH>[\"Output\"], TInferActionError<SCH>, TSelect>);\n}\n"],"mappings":";;;AAoCA,SAAgB,kBAMd,QACA,SAMA;CACA,MAAM,kBAAkB,WAAW,CAAC;CAIpC,MAAM,cAAc,OAA2B,KAAA,CAAS;CAExD,MAAM,SAAS,YAAY;EACzB,aAAa,UAAoC;GAC/C,MAAM,MAAM,OAAO,QAAQ,KAAuD;GAClF,IAAI,YAAY,YAAY;GAC5B,YAAY,UAAU,KAAA;GACtB,OAAO,IAAI,YAAY;EACzB;EACA,GAAG;CACL,CAAC;CAID,OAAO;EACL,GAAG;EACH,SAAS,GAAG,SAA2C;GACrD,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,OAAO,GAAG,IAAI;EAC9B;EACA,cAAc,GAAG,SAAgD;GAC/D,YAAY,2BAAU,IAAI,MAAM,EAAA,CAAE;GAClC,OAAO,OAAO,YAAY,GAAG,IAAI;EACnC;CACF;AACF;;;AC7CA,SAAgB,eAAe,QAA8B,OAA2B;CACtF,IAAI,UAAU,KAAA,GACZ,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;CAAE;CAGpE,OAAO;EAAC;EAAe,OAAO;EAAQ,OAAO;EAAY,OAAO;EAAI;CAAK;AAC3E;AAYA,SAAgB,eAMd,QACA,GAAG,MAM8C;CACjD,MAAM,iBAAiB,OAAO,OAAO,eAAe;CAEpD,IAAI;CACJ,IAAI;CAEJ,IAAI,gBACF,CAAC,OAAO,WAAW;MAKnB,CAAC,WAAW;CAGd,MAAM,EAAE,SAAS,GAAG,iBAAiB,WAAW,CAAC;CAIjD,MAAM,cAAc,wBAAO,IAAI,MAAM,EAAA,CAAE,KAAK;CAE5C,OAAO,SAAS;EACd,UAAU,SAAS,OAAO,eAAe,QAAQ,KAAK,IAAI,eAAe,MAAM;EAC/E,eAAe;GACb,MAAM,MAAO,OAAO,QAAgC,KAAK;GACzD,IAAI,YAAY,YAAY;GAC5B,OAAO,IAAI,YAAY;EACzB;EACA,SAAS,iBAAiB,SAAS,SAAS,WAAW,QAAS,WAAW;EAC3E,GAAG;CACL,CAA4F;AAC9F"}
package/package.json CHANGED
@@ -1,26 +1,53 @@
1
1
  {
2
2
  "name": "@nice-code/action",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
+ "main": "./build/index.cjs",
5
+ "module": "./build/index.mjs",
6
+ "types": "./build/index.d.cts",
4
7
  "exports": {
5
8
  ".": {
6
9
  "source": "./src/index.ts",
7
- "import": "./build/index.js",
8
- "types": "./build/index.d.ts"
10
+ "import": {
11
+ "types": "./build/index.d.mts",
12
+ "default": "./build/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./build/index.d.cts",
16
+ "default": "./build/index.cjs"
17
+ }
9
18
  },
10
19
  "./devtools/browser": {
11
20
  "source": "./src/devtools/browser/index.ts",
12
- "import": "./build/devtools/browser/index.js",
13
- "types": "./build/devtools/browser/index.d.ts"
21
+ "import": {
22
+ "types": "./build/devtools/browser/index.d.mts",
23
+ "default": "./build/devtools/browser/index.mjs"
24
+ },
25
+ "require": {
26
+ "types": "./build/devtools/browser/index.d.cts",
27
+ "default": "./build/devtools/browser/index.cjs"
28
+ }
14
29
  },
15
30
  "./devtools/server": {
16
31
  "source": "./src/devtools/server/index.ts",
17
- "import": "./build/devtools/server/index.js",
18
- "types": "./build/devtools/server/index.d.ts"
32
+ "import": {
33
+ "types": "./build/devtools/server/index.d.mts",
34
+ "default": "./build/devtools/server/index.mjs"
35
+ },
36
+ "require": {
37
+ "types": "./build/devtools/server/index.d.cts",
38
+ "default": "./build/devtools/server/index.cjs"
39
+ }
19
40
  },
20
41
  "./react-query": {
21
42
  "source": "./src/react-query/index.ts",
22
- "import": "./build/react-query/index.js",
23
- "types": "./build/react-query/index.d.ts"
43
+ "import": {
44
+ "types": "./build/react-query/index.d.mts",
45
+ "default": "./build/react-query/index.mjs"
46
+ },
47
+ "require": {
48
+ "types": "./build/react-query/index.d.cts",
49
+ "default": "./build/react-query/index.cjs"
50
+ }
24
51
  }
25
52
  },
26
53
  "files": [
@@ -39,10 +66,7 @@
39
66
  "access": "public"
40
67
  },
41
68
  "scripts": {
42
- "build-bun": "bun run clean-build && bun run build.ts && bun run build-types",
43
69
  "build": "bun run clean-build && tsdown",
44
- "build-types": "tsc --project tsconfig.build.json",
45
- "build-watch": "bun run clean-build && bun run build.ts --watch && bun run build-types --watch",
46
70
  "clean-build": "bunx rimraf build",
47
71
  "type-check": "bunx tsc --noEmit",
48
72
  "type-check-watch": "bunx tsc --noEmit --watch",
@@ -51,9 +75,9 @@
51
75
  },
52
76
  "type": "module",
53
77
  "dependencies": {
54
- "@nice-code/common-errors": "0.10.0",
55
- "@nice-code/error": "0.10.0",
56
- "@nice-code/util": "0.10.0",
78
+ "@nice-code/common-errors": "0.11.0",
79
+ "@nice-code/error": "0.11.0",
80
+ "@nice-code/util": "0.11.0",
57
81
  "@standard-schema/spec": "^1.1.0",
58
82
  "@tanstack/react-virtual": "^3.13.26",
59
83
  "http-status-codes": "^2.3.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"ActionDevtoolsCore-BLeY_N-3.js","names":[],"sources":["../src/devtools/core/ActionDevtoolsCore.ts"],"sourcesContent":["import {\r\n ERunningActionFinishedType,\r\n ERunningActionUpdateType,\r\n} from \"../../ActionDefinition/Action/RunningAction.types\";\r\nimport type {\r\n IDevtoolsActionEntry,\r\n IDevtoolsActionMeta,\r\n IDevtoolsObservableDomain,\r\n IDevtoolsRouteItem,\r\n TDevtoolsListener,\r\n} from \"./ActionDevtools.types\";\r\n\r\nexport interface IActionDevtoolsCoreOptions {\r\n /** Max root entries to retain. Older entries (and their children) are evicted. */\r\n maxEntries?: number;\r\n}\r\n\r\nfunction serializeErrorForDisplay(error: unknown): unknown {\r\n if (\r\n error != null &&\r\n typeof error === \"object\" &&\r\n (error as any).name === \"NiceError\" &&\r\n typeof (error as any).toJsonObject === \"function\"\r\n ) {\r\n return (error as any).toJsonObject();\r\n }\r\n return error;\r\n}\r\n\r\nfunction extractRouting(context: any): IDevtoolsRouteItem[] {\r\n return (context?.routing ?? []).map((item: any): IDevtoolsRouteItem => {\r\n const handler = item.handler;\r\n const isExternal = handler?.type === \"external\";\r\n return {\r\n runtime: {\r\n envId: item.runtime?.envId ?? \"unknown\",\r\n perId: item.runtime?.perId,\r\n insId: item.runtime?.insId,\r\n },\r\n handlerType: isExternal ? \"external\" : \"local\",\r\n handlerClient:\r\n isExternal && handler.client != null\r\n ? {\r\n envId: handler.client.envId ?? \"unknown\",\r\n perId: handler.client.perId,\r\n insId: handler.client.insId,\r\n }\r\n : undefined,\r\n transport: isExternal ? handler.transType : undefined,\r\n transportSummary: isExternal ? handler.transInfo?.summary : undefined,\r\n transportUrl: isExternal ? handler.transInfo?.url : undefined,\r\n time: item.time,\r\n };\r\n });\r\n}\r\n\r\nfunction extractMeta(context: any): IDevtoolsActionMeta {\r\n return {\r\n timeCreated: context?.timeCreated ?? Date.now(),\r\n originClient: {\r\n envId: context?.originClient?.envId ?? \"unknown\",\r\n perId: context?.originClient?.perId,\r\n insId: context?.originClient?.insId,\r\n },\r\n routing: extractRouting(context),\r\n };\r\n}\r\n\r\nexport class ActionDevtoolsCore {\r\n private _entries: IDevtoolsActionEntry[] = [];\r\n private _listeners: Set<TDevtoolsListener> = new Set();\r\n private readonly _maxEntries: number;\r\n\r\n constructor(options: IActionDevtoolsCoreOptions = {}) {\r\n this._maxEntries = options.maxEntries ?? 500;\r\n }\r\n\r\n attachToDomain(domain: IDevtoolsObservableDomain): () => void {\r\n return domain.addActionListener((update) => {\r\n const { runningAction, type, time } = update;\r\n\r\n if (type === ERunningActionUpdateType.started) {\r\n const entry: IDevtoolsActionEntry = {\r\n cuid: runningAction.cuid,\r\n actionId: runningAction.id,\r\n domain: runningAction.domain,\r\n allDomains: [...runningAction.allDomains],\r\n status: \"running\",\r\n startTime: time,\r\n input: runningAction.state?.request?.input,\r\n inputHash: runningAction.state?.request?.inputHash,\r\n progressUpdates: [],\r\n meta: extractMeta(runningAction.context),\r\n parentCuid: runningAction.parentCuid,\r\n callSite: runningAction.callSite,\r\n };\r\n this._entries = [entry, ...this._entries];\r\n // Bound retention: entries are newest-first, so the oldest fall off the tail.\r\n // Grouping already renders any child whose parent is gone as its own root, so\r\n // dropping an old parent never breaks the surviving children's display.\r\n if (this._entries.length > this._maxEntries) {\r\n this._entries.length = this._maxEntries;\r\n }\r\n this._notify();\r\n } else if (type === ERunningActionUpdateType.progress) {\r\n this._updateEntry(runningAction.cuid, (e) => ({\r\n ...e,\r\n progressUpdates: [...e.progressUpdates, update.progress],\r\n }));\r\n } else if (type === ERunningActionUpdateType.finished) {\r\n this._updateEntry(runningAction.cuid, (e) => {\r\n // On success the result payload's context may carry the full routing from the handling\r\n // runtime (including backend hops) — richer than the local context, which only has this\r\n // side's outgoing hops. Prefer it *only when it's actually richer*: the optimized binary\r\n // WS session strips routing from the wire and reconstructs an empty array, so an empty\r\n // response routing must never clobber the real local hops (otherwise the entry renders as\r\n // \"call\"/\"local\" instead of \"→ ws → backend\").\r\n const responseRouting = extractRouting((update as any).response?.context);\r\n const localRouting = extractRouting(runningAction.context);\r\n const routing =\r\n responseRouting.length >= localRouting.length ? responseRouting : localRouting;\r\n const base: IDevtoolsActionEntry = {\r\n ...e,\r\n endTime: time,\r\n meta: { ...e.meta, routing },\r\n };\r\n const finishType: string = update.finishType;\r\n\r\n if (finishType === ERunningActionFinishedType.success) {\r\n const result = update.response?.result;\r\n const outputHash: string | undefined = update.response?.outputHash;\r\n if (result != null && !result.ok) {\r\n const rawError = result.error;\r\n const errorStack = rawError instanceof Error ? rawError.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"action-error\",\r\n outputHash,\r\n error: serializeErrorForDisplay(rawError),\r\n errorStack,\r\n };\r\n }\r\n return { ...base, status: \"success\", output: result?.output, outputHash };\r\n }\r\n if (finishType === ERunningActionFinishedType.failed) {\r\n const rawError = (update as any).error;\r\n const errorStack = rawError instanceof Error ? rawError.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"failed\",\r\n error: serializeErrorForDisplay(rawError),\r\n errorStack,\r\n };\r\n }\r\n const abortReason = update.reason;\r\n const errorStack = abortReason instanceof Error ? abortReason.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"aborted\",\r\n abortReason: serializeErrorForDisplay(abortReason),\r\n errorStack,\r\n };\r\n });\r\n }\r\n });\r\n }\r\n\r\n getEntries(): readonly IDevtoolsActionEntry[] {\r\n return this._entries;\r\n }\r\n\r\n subscribe(listener: TDevtoolsListener): () => void {\r\n this._listeners.add(listener);\r\n listener(this._entries);\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n clear(): void {\r\n this._entries = [];\r\n this._notify();\r\n }\r\n\r\n private _updateEntry(\r\n cuid: string,\r\n updater: (entry: IDevtoolsActionEntry) => IDevtoolsActionEntry,\r\n ): void {\r\n this._entries = this._entries.map((e) => (e.cuid === cuid ? updater(e) : e));\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n const snapshot = this._entries;\r\n for (const listener of this._listeners) listener(snapshot);\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ActionDevtoolsCore-yfJ9tkvl.js","names":[],"sources":["../src/devtools/core/ActionDevtoolsCore.ts"],"sourcesContent":["import {\r\n ERunningActionFinishedType,\r\n ERunningActionUpdateType,\r\n} from \"../../ActionDefinition/Action/RunningAction.types\";\r\nimport type {\r\n IDevtoolsActionEntry,\r\n IDevtoolsActionMeta,\r\n IDevtoolsObservableDomain,\r\n IDevtoolsRouteItem,\r\n TDevtoolsListener,\r\n} from \"./ActionDevtools.types\";\r\n\r\nexport interface IActionDevtoolsCoreOptions {\r\n /** Max root entries to retain. Older entries (and their children) are evicted. */\r\n maxEntries?: number;\r\n}\r\n\r\nfunction serializeErrorForDisplay(error: unknown): unknown {\r\n if (\r\n error != null &&\r\n typeof error === \"object\" &&\r\n (error as any).name === \"NiceError\" &&\r\n typeof (error as any).toJsonObject === \"function\"\r\n ) {\r\n return (error as any).toJsonObject();\r\n }\r\n return error;\r\n}\r\n\r\nfunction extractRouting(context: any): IDevtoolsRouteItem[] {\r\n return (context?.routing ?? []).map((item: any): IDevtoolsRouteItem => {\r\n const handler = item.handler;\r\n const isExternal = handler?.type === \"external\";\r\n return {\r\n runtime: {\r\n envId: item.runtime?.envId ?? \"unknown\",\r\n perId: item.runtime?.perId,\r\n insId: item.runtime?.insId,\r\n },\r\n handlerType: isExternal ? \"external\" : \"local\",\r\n handlerClient:\r\n isExternal && handler.client != null\r\n ? {\r\n envId: handler.client.envId ?? \"unknown\",\r\n perId: handler.client.perId,\r\n insId: handler.client.insId,\r\n }\r\n : undefined,\r\n transport: isExternal ? handler.transType : undefined,\r\n transportSummary: isExternal ? handler.transInfo?.summary : undefined,\r\n transportUrl: isExternal ? handler.transInfo?.url : undefined,\r\n time: item.time,\r\n };\r\n });\r\n}\r\n\r\nfunction extractMeta(context: any): IDevtoolsActionMeta {\r\n return {\r\n timeCreated: context?.timeCreated ?? Date.now(),\r\n originClient: {\r\n envId: context?.originClient?.envId ?? \"unknown\",\r\n perId: context?.originClient?.perId,\r\n insId: context?.originClient?.insId,\r\n },\r\n routing: extractRouting(context),\r\n };\r\n}\r\n\r\nexport class ActionDevtoolsCore {\r\n private _entries: IDevtoolsActionEntry[] = [];\r\n private _listeners: Set<TDevtoolsListener> = new Set();\r\n private readonly _maxEntries: number;\r\n\r\n constructor(options: IActionDevtoolsCoreOptions = {}) {\r\n this._maxEntries = options.maxEntries ?? 500;\r\n }\r\n\r\n attachToDomain(domain: IDevtoolsObservableDomain): () => void {\r\n return domain.addActionListener((update) => {\r\n const { runningAction, type, time } = update;\r\n\r\n if (type === ERunningActionUpdateType.started) {\r\n const entry: IDevtoolsActionEntry = {\r\n cuid: runningAction.cuid,\r\n actionId: runningAction.id,\r\n domain: runningAction.domain,\r\n allDomains: [...runningAction.allDomains],\r\n status: \"running\",\r\n startTime: time,\r\n input: runningAction.state?.request?.input,\r\n inputHash: runningAction.state?.request?.inputHash,\r\n progressUpdates: [],\r\n meta: extractMeta(runningAction.context),\r\n parentCuid: runningAction.parentCuid,\r\n callSite: runningAction.callSite,\r\n };\r\n this._entries = [entry, ...this._entries];\r\n // Bound retention: entries are newest-first, so the oldest fall off the tail.\r\n // Grouping already renders any child whose parent is gone as its own root, so\r\n // dropping an old parent never breaks the surviving children's display.\r\n if (this._entries.length > this._maxEntries) {\r\n this._entries.length = this._maxEntries;\r\n }\r\n this._notify();\r\n } else if (type === ERunningActionUpdateType.progress) {\r\n this._updateEntry(runningAction.cuid, (e) => ({\r\n ...e,\r\n progressUpdates: [...e.progressUpdates, update.progress],\r\n }));\r\n } else if (type === ERunningActionUpdateType.finished) {\r\n this._updateEntry(runningAction.cuid, (e) => {\r\n // On success the result payload's context may carry the full routing from the handling\r\n // runtime (including backend hops) — richer than the local context, which only has this\r\n // side's outgoing hops. Prefer it *only when it's actually richer*: the optimized binary\r\n // WS session strips routing from the wire and reconstructs an empty array, so an empty\r\n // response routing must never clobber the real local hops (otherwise the entry renders as\r\n // \"call\"/\"local\" instead of \"→ ws → backend\").\r\n const responseRouting = extractRouting((update as any).response?.context);\r\n const localRouting = extractRouting(runningAction.context);\r\n const routing =\r\n responseRouting.length >= localRouting.length ? responseRouting : localRouting;\r\n const base: IDevtoolsActionEntry = {\r\n ...e,\r\n endTime: time,\r\n meta: { ...e.meta, routing },\r\n };\r\n const finishType: string = update.finishType;\r\n\r\n if (finishType === ERunningActionFinishedType.success) {\r\n const result = update.response?.result;\r\n const outputHash: string | undefined = update.response?.outputHash;\r\n if (result != null && !result.ok) {\r\n const rawError = result.error;\r\n const errorStack = rawError instanceof Error ? rawError.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"action-error\",\r\n outputHash,\r\n error: serializeErrorForDisplay(rawError),\r\n errorStack,\r\n };\r\n }\r\n return { ...base, status: \"success\", output: result?.output, outputHash };\r\n }\r\n if (finishType === ERunningActionFinishedType.failed) {\r\n const rawError = (update as any).error;\r\n const errorStack = rawError instanceof Error ? rawError.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"failed\",\r\n error: serializeErrorForDisplay(rawError),\r\n errorStack,\r\n };\r\n }\r\n const abortReason = update.reason;\r\n const errorStack = abortReason instanceof Error ? abortReason.stack : undefined;\r\n return {\r\n ...base,\r\n status: \"aborted\",\r\n abortReason: serializeErrorForDisplay(abortReason),\r\n errorStack,\r\n };\r\n });\r\n }\r\n });\r\n }\r\n\r\n getEntries(): readonly IDevtoolsActionEntry[] {\r\n return this._entries;\r\n }\r\n\r\n subscribe(listener: TDevtoolsListener): () => void {\r\n this._listeners.add(listener);\r\n listener(this._entries);\r\n return () => {\r\n this._listeners.delete(listener);\r\n };\r\n }\r\n\r\n clear(): void {\r\n this._entries = [];\r\n this._notify();\r\n }\r\n\r\n private _updateEntry(\r\n cuid: string,\r\n updater: (entry: IDevtoolsActionEntry) => IDevtoolsActionEntry,\r\n ): void {\r\n this._entries = this._entries.map((e) => (e.cuid === cuid ? updater(e) : e));\r\n this._notify();\r\n }\r\n\r\n private _notify(): void {\r\n const snapshot = this._entries;\r\n for (const listener of this._listeners) listener(snapshot);\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RunningAction.types-C176rqHG.js","names":[],"sources":["../src/ActionDefinition/Action/RunningAction.types.ts"],"sourcesContent":["import type { IActionDomain } from \"../Domain/ActionDomain.types\";\nimport type { TInferActionError } from \"../Schema/ActionSchema\";\nimport type { ActionContext } from \"./Context/ActionContext\";\nimport type { TActionProgress } from \"./Payload/ActionPayload.types\";\nimport type { ActionPayload_Progress } from \"./Payload/ActionPayload_Progress\";\nimport type { ActionPayload_Request } from \"./Payload/ActionPayload_Request\";\nimport type { ActionPayload_Result } from \"./Payload/ActionPayload_Result\";\nimport type { RunningAction } from \"./RunningAction\";\n\nexport enum ERunningActionState {\n running = \"running\",\n completed = \"completed\",\n}\n\nexport interface IRunningActionState<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n request: ActionPayload_Request<DOM, ID>;\n progress: ActionPayload_Progress<DOM, ID>[];\n result?: ActionPayload_Result<DOM, ID>;\n}\n\nexport interface IRunningActionState_ConstructorParams<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n context: ActionContext<DOM, ID>;\n request: ActionPayload_Request<DOM, ID>;\n progress?: ActionPayload_Progress<DOM, ID>[];\n result?: ActionPayload_Result<DOM, ID>;\n parentCuid?: string;\n callSite?: string;\n}\n\n// export interface IActionRunningState_Running<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > {\n// state: ERunningActionState.running;\n// request: ActionPayload_Request<DOM, ID>;\n// lastProgress: ActionPayload_Progress;\n// }\n\n// export interface IActionRunningState_Completed<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > {\n// state: ERunningActionState.completed;\n// request: ActionPayload_Request<DOM, ID>;\n// response: ActionPayload_Result<DOM, ID>;\n// }\n\n// export type TRunningActionState<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > = IActionRunningState_Running<DOM, ID> | IActionRunningState_Completed<DOM, ID>;\n\nexport enum ERunningActionUpdateType {\n started = \"started\",\n progress = \"progress\",\n finished = \"finished\",\n}\n\nexport interface IRunningActionEvent_Base<\n T extends ERunningActionUpdateType,\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> {\n type: T;\n runningAction: RunningAction<DOM, ID>;\n time: number;\n}\n\nexport interface IRunningActionUpdate_Started<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.started, DOM, ID> {}\n\nexport interface IRunningActionUpdate_Progress<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.progress, DOM, ID> {\n progress: TActionProgress;\n}\n\nexport enum ERunningActionFinishedType {\n aborted = \"aborted\",\n failed = \"failed\",\n success = \"success\",\n}\n\nexport interface IRunningActionUpdate_Finished<\n FT extends ERunningActionFinishedType,\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.finished, DOM, ID> {\n finishType: FT;\n reason?: unknown;\n}\n\nexport interface IRunningActionUpdate_Abort<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.aborted, DOM, ID> {\n reason?: unknown;\n}\n\nexport interface IRunningActionUpdate_Failed<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.failed, DOM, ID> {\n error: TInferActionError<DOM[\"actionSchema\"][ID]>;\n}\n\nexport interface IRunningActionUpdate_Success<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.success, DOM, ID> {\n response: ActionPayload_Result<DOM, ID>;\n}\n\nexport type TRunningActionUpdateFinished<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> =\n | IRunningActionUpdate_Abort<DOM, ID>\n | IRunningActionUpdate_Failed<DOM, ID>\n | IRunningActionUpdate_Success<DOM, ID>;\n\nexport type TRunningActionUpdate<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> =\n | IRunningActionUpdate_Started<DOM, ID>\n | IRunningActionUpdate_Progress<DOM, ID>\n | TRunningActionUpdateFinished<DOM, ID>;\n\nexport type TRunningActionUpdateListener<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = (update: TRunningActionUpdate<DOM, ID>) => void;\n\n/**\n * Distributes a union ID into a proper discriminated union of RunningAction update events,\n * so that narrowing on `update.runningAction.id` also narrows `update.runningAction`'s input/output types.\n */\nexport type TDistributeRunningActionUpdate<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = ID extends keyof DOM[\"actionSchema\"] & string ? TRunningActionUpdate<DOM, ID> : never;\n\nexport type TDistributeRunningActionUpdateListener<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = (update: TDistributeRunningActionUpdate<DOM, ID>) => void;\n\nexport interface IRunningActionUserMethods<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n waitForResultPayload(): Promise<ActionPayload_Result<DOM, ID>>;\n addUpdateListeners(listeners: TRunningActionUpdateListener<DOM, ID>[]): () => void;\n iterateUpdates(): AsyncIterable<TRunningActionUpdate<DOM, ID>>;\n abort(reason?: unknown): void;\n}\n"],"mappings":";AASA,IAAY,sBAAL,yBAAA,qBAAA;CACL,oBAAA,aAAA;CACA,oBAAA,eAAA;;AACF,EAAA,CAAA,CAAA;AA8CA,IAAY,2BAAL,yBAAA,0BAAA;CACL,yBAAA,aAAA;CACA,yBAAA,cAAA;CACA,yBAAA,cAAA;;AACF,EAAA,CAAA,CAAA;AAwBA,IAAY,6BAAL,yBAAA,4BAAA;CACL,2BAAA,aAAA;CACA,2BAAA,YAAA;CACA,2BAAA,aAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RunningAction.types-DjCX1xp5.js","names":[],"sources":["../src/ActionDefinition/Action/RunningAction.types.ts"],"sourcesContent":["import type { IActionDomain } from \"../Domain/ActionDomain.types\";\nimport type { TInferActionError } from \"../Schema/ActionSchema\";\nimport type { ActionContext } from \"./Context/ActionContext\";\nimport type { TActionProgress } from \"./Payload/ActionPayload.types\";\nimport type { ActionPayload_Progress } from \"./Payload/ActionPayload_Progress\";\nimport type { ActionPayload_Request } from \"./Payload/ActionPayload_Request\";\nimport type { ActionPayload_Result } from \"./Payload/ActionPayload_Result\";\nimport type { RunningAction } from \"./RunningAction\";\n\nexport enum ERunningActionState {\n running = \"running\",\n completed = \"completed\",\n}\n\nexport interface IRunningActionState<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n request: ActionPayload_Request<DOM, ID>;\n progress: ActionPayload_Progress<DOM, ID>[];\n result?: ActionPayload_Result<DOM, ID>;\n}\n\nexport interface IRunningActionState_ConstructorParams<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n context: ActionContext<DOM, ID>;\n request: ActionPayload_Request<DOM, ID>;\n progress?: ActionPayload_Progress<DOM, ID>[];\n result?: ActionPayload_Result<DOM, ID>;\n parentCuid?: string;\n callSite?: string;\n}\n\n// export interface IActionRunningState_Running<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > {\n// state: ERunningActionState.running;\n// request: ActionPayload_Request<DOM, ID>;\n// lastProgress: ActionPayload_Progress;\n// }\n\n// export interface IActionRunningState_Completed<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > {\n// state: ERunningActionState.completed;\n// request: ActionPayload_Request<DOM, ID>;\n// response: ActionPayload_Result<DOM, ID>;\n// }\n\n// export type TRunningActionState<\n// DOM extends IActionDomain,\n// ID extends keyof DOM[\"actions\"] & string = keyof DOM[\"actions\"] & string,\n// > = IActionRunningState_Running<DOM, ID> | IActionRunningState_Completed<DOM, ID>;\n\nexport enum ERunningActionUpdateType {\n started = \"started\",\n progress = \"progress\",\n finished = \"finished\",\n}\n\nexport interface IRunningActionEvent_Base<\n T extends ERunningActionUpdateType,\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> {\n type: T;\n runningAction: RunningAction<DOM, ID>;\n time: number;\n}\n\nexport interface IRunningActionUpdate_Started<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.started, DOM, ID> {}\n\nexport interface IRunningActionUpdate_Progress<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.progress, DOM, ID> {\n progress: TActionProgress;\n}\n\nexport enum ERunningActionFinishedType {\n aborted = \"aborted\",\n failed = \"failed\",\n success = \"success\",\n}\n\nexport interface IRunningActionUpdate_Finished<\n FT extends ERunningActionFinishedType,\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionEvent_Base<ERunningActionUpdateType.finished, DOM, ID> {\n finishType: FT;\n reason?: unknown;\n}\n\nexport interface IRunningActionUpdate_Abort<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.aborted, DOM, ID> {\n reason?: unknown;\n}\n\nexport interface IRunningActionUpdate_Failed<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.failed, DOM, ID> {\n error: TInferActionError<DOM[\"actionSchema\"][ID]>;\n}\n\nexport interface IRunningActionUpdate_Success<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> extends IRunningActionUpdate_Finished<ERunningActionFinishedType.success, DOM, ID> {\n response: ActionPayload_Result<DOM, ID>;\n}\n\nexport type TRunningActionUpdateFinished<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> =\n | IRunningActionUpdate_Abort<DOM, ID>\n | IRunningActionUpdate_Failed<DOM, ID>\n | IRunningActionUpdate_Success<DOM, ID>;\n\nexport type TRunningActionUpdate<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> =\n | IRunningActionUpdate_Started<DOM, ID>\n | IRunningActionUpdate_Progress<DOM, ID>\n | TRunningActionUpdateFinished<DOM, ID>;\n\nexport type TRunningActionUpdateListener<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = (update: TRunningActionUpdate<DOM, ID>) => void;\n\n/**\n * Distributes a union ID into a proper discriminated union of RunningAction update events,\n * so that narrowing on `update.runningAction.id` also narrows `update.runningAction`'s input/output types.\n */\nexport type TDistributeRunningActionUpdate<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = ID extends keyof DOM[\"actionSchema\"] & string ? TRunningActionUpdate<DOM, ID> : never;\n\nexport type TDistributeRunningActionUpdateListener<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string = keyof DOM[\"actionSchema\"] & string,\n> = (update: TDistributeRunningActionUpdate<DOM, ID>) => void;\n\nexport interface IRunningActionUserMethods<\n DOM extends IActionDomain,\n ID extends keyof DOM[\"actionSchema\"] & string,\n> {\n waitForResultPayload(): Promise<ActionPayload_Result<DOM, ID>>;\n addUpdateListeners(listeners: TRunningActionUpdateListener<DOM, ID>[]): () => void;\n iterateUpdates(): AsyncIterable<TRunningActionUpdate<DOM, ID>>;\n abort(reason?: unknown): void;\n}\n"],"mappings":";AASA,IAAY,sBAAL,yBAAA,qBAAA;CACL,oBAAA,aAAA;CACA,oBAAA,eAAA;;AACF,EAAA,CAAA,CAAA;AA8CA,IAAY,2BAAL,yBAAA,0BAAA;CACL,yBAAA,aAAA;CACA,yBAAA,cAAA;CACA,yBAAA,cAAA;;AACF,EAAA,CAAA,CAAA;AAwBA,IAAY,6BAAL,yBAAA,4BAAA;CACL,2BAAA,aAAA;CACA,2BAAA,YAAA;CACA,2BAAA,aAAA;;AACF,EAAA,CAAA,CAAA"}