@nice-code/action 0.2.12 → 0.2.14

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 (26) hide show
  1. package/build/devtools/browser/index.js +1799 -964
  2. package/build/devtools/server/index.js +11 -8
  3. package/build/index.js +42 -12
  4. package/build/types/ActionDefinition/Action/Payload/ActionPayload_Request.d.ts +1 -0
  5. package/build/types/ActionDefinition/Action/RunningAction.d.ts +2 -0
  6. package/build/types/ActionDefinition/Action/RunningAction.types.d.ts +2 -0
  7. package/build/types/ActionRuntime/HandlerCallStack.d.ts +3 -0
  8. package/build/types/devtools/browser/components/ActionDetailPanel.d.ts +7 -0
  9. package/build/types/devtools/browser/components/ActionEntryRow.d.ts +11 -0
  10. package/build/types/devtools/browser/components/CallStackSection.d.ts +8 -0
  11. package/build/types/devtools/browser/components/ChildDispatchChips.d.ts +4 -0
  12. package/build/types/devtools/browser/components/Chip.d.ts +11 -0
  13. package/build/types/devtools/browser/components/DetailSection.d.ts +5 -0
  14. package/build/types/devtools/browser/components/DomainChip.d.ts +15 -0
  15. package/build/types/devtools/browser/components/HandlerChips.d.ts +8 -0
  16. package/build/types/devtools/browser/components/MetaSection.d.ts +4 -0
  17. package/build/types/devtools/browser/components/PanelChrome.d.ts +14 -0
  18. package/build/types/devtools/browser/components/RoutingSection.d.ts +5 -0
  19. package/build/types/devtools/browser/components/RunningTimer.d.ts +7 -0
  20. package/build/types/devtools/browser/components/SectionLabel.d.ts +4 -0
  21. package/build/types/devtools/browser/components/StackTraceSection.d.ts +5 -0
  22. package/build/types/devtools/browser/components/utils.d.ts +7 -0
  23. package/build/types/devtools/core/ActionDevtools.types.d.ts +3 -0
  24. package/build/types/devtools/core/ActionDevtoolsCore.d.ts +1 -3
  25. package/build/types/devtools/core/devtools_colors.d.ts +4 -0
  26. package/package.json +3 -3
@@ -156,10 +156,7 @@ function extractMeta(context) {
156
156
  class ActionDevtoolsCore {
157
157
  _entries = [];
158
158
  _listeners = new Set;
159
- _maxEntries;
160
- constructor(options = {}) {
161
- this._maxEntries = options.maxEntries ?? 100;
162
- }
159
+ constructor(_options = {}) {}
163
160
  attachToDomain(domain) {
164
161
  return domain.addActionListener((update) => {
165
162
  const { runningAction, type, time } = update;
@@ -173,9 +170,11 @@ class ActionDevtoolsCore {
173
170
  startTime: time,
174
171
  input: runningAction.state?.request?.input,
175
172
  progressUpdates: [],
176
- meta: extractMeta(runningAction.context)
173
+ meta: extractMeta(runningAction.context),
174
+ parentCuid: runningAction.parentCuid,
175
+ callSite: runningAction.callSite
177
176
  };
178
- this._entries = [entry, ...this._entries].slice(0, this._maxEntries);
177
+ this._entries = [entry, ...this._entries];
179
178
  this._notify();
180
179
  } else if (type === "progress" /* progress */) {
181
180
  this._updateEntry(runningAction.cuid, (e) => ({
@@ -195,9 +194,13 @@ class ActionDevtoolsCore {
195
194
  return { ...base, status: "success", output: update.response?.result?.output };
196
195
  }
197
196
  if (finishType === "failed" /* failed */) {
198
- return { ...base, status: "failed", error: update.error };
197
+ const rawError = update.error;
198
+ const errorStack2 = rawError instanceof Error ? rawError.stack : undefined;
199
+ return { ...base, status: "failed", error: rawError, errorStack: errorStack2 };
199
200
  }
200
- return { ...base, status: "aborted", abortReason: update.reason };
201
+ const abortReason = update.reason;
202
+ const errorStack = abortReason instanceof Error ? abortReason.stack : undefined;
203
+ return { ...base, status: "aborted", abortReason, errorStack };
201
204
  });
202
205
  }
203
206
  });
package/build/index.js CHANGED
@@ -271,6 +271,7 @@ class ActionPayload_Result extends ActionPayload {
271
271
  // src/ActionDefinition/Action/Payload/ActionPayload_Request.ts
272
272
  class ActionPayload_Request extends ActionPayload {
273
273
  input;
274
+ _callSite;
274
275
  constructor(params, input, data) {
275
276
  super(params.context, "request" /* request */, data);
276
277
  this.input = input;
@@ -310,6 +311,7 @@ class ActionPayload_Request extends ActionPayload {
310
311
  return value.waitForResultPayload();
311
312
  }
312
313
  async run(options) {
314
+ this._callSite = new Error().stack;
313
315
  return this._domain.runAction(this, options);
314
316
  }
315
317
  }
@@ -396,6 +398,8 @@ class RunningAction {
396
398
  _domain;
397
399
  domain;
398
400
  allDomains;
401
+ parentCuid;
402
+ callSite;
399
403
  _resultPayloadPromise;
400
404
  _resolveResult;
401
405
  _rejectResult;
@@ -409,6 +413,8 @@ class RunningAction {
409
413
  this.domain = initialState.context.domain;
410
414
  this.allDomains = initialState.context.allDomains;
411
415
  this._domain = initialState.context._domain;
416
+ this.parentCuid = initialState.parentCuid;
417
+ this.callSite = initialState.callSite;
412
418
  this._resultPayloadPromise = new Promise((resolve, reject) => {
413
419
  this._resolveResult = resolve;
414
420
  this._rejectResult = reject;
@@ -1044,6 +1050,18 @@ function getDefaultActionRuntime() {
1044
1050
  return runtimeState.defaultLocalRuntime;
1045
1051
  }
1046
1052
 
1053
+ // src/ActionRuntime/HandlerCallStack.ts
1054
+ var _stack = [];
1055
+ function pushHandlerCuid(cuid) {
1056
+ _stack.push(cuid);
1057
+ }
1058
+ function popHandlerCuid() {
1059
+ _stack.pop();
1060
+ }
1061
+ function peekHandlerCuid() {
1062
+ return _stack[_stack.length - 1];
1063
+ }
1064
+
1047
1065
  // src/ActionRuntime/Handler/ActionHandler.ts
1048
1066
  import { nanoid as nanoid3 } from "nanoid";
1049
1067
 
@@ -1093,7 +1111,12 @@ class ActionLocalHandler extends ActionHandler {
1093
1111
  handler: this.toHandlerRouteItem(),
1094
1112
  time: Date.now()
1095
1113
  });
1096
- const runningAction = new RunningAction({ context: action.context, request: action });
1114
+ const runningAction = new RunningAction({
1115
+ context: action.context,
1116
+ request: action,
1117
+ parentCuid: peekHandlerCuid(),
1118
+ callSite: action._callSite ?? new Error().stack
1119
+ });
1097
1120
  this._handleRunningAction(handler, runningAction).catch((err2) => runningAction._abort(err2));
1098
1121
  return runningAction;
1099
1122
  }
@@ -1102,17 +1125,22 @@ class ActionLocalHandler extends ActionHandler {
1102
1125
  if (state.result != null) {
1103
1126
  return;
1104
1127
  }
1105
- const rawResult = await handler(state.request);
1106
- let result;
1107
- if (rawResult instanceof ActionPayload_Result) {
1108
- result = rawResult;
1109
- } else if (rawResult != null && isActionPayload_Result_JsonObject(rawResult)) {
1110
- const domain = this.actionRouter.domainManager.getActionDomainOrThrow(state.request);
1111
- result = domain.hydrateResultPayload(rawResult);
1112
- } else {
1113
- result = state.request.successResult(rawResult);
1128
+ pushHandlerCuid(runningAction.cuid);
1129
+ try {
1130
+ const rawResult = await handler(state.request);
1131
+ let result;
1132
+ if (rawResult instanceof ActionPayload_Result) {
1133
+ result = rawResult;
1134
+ } else if (rawResult != null && isActionPayload_Result_JsonObject(rawResult)) {
1135
+ const domain = this.actionRouter.domainManager.getActionDomainOrThrow(state.request);
1136
+ result = domain.hydrateResultPayload(rawResult);
1137
+ } else {
1138
+ result = state.request.successResult(rawResult);
1139
+ }
1140
+ runningAction._completeWithResult(result);
1141
+ } finally {
1142
+ popHandlerCuid();
1114
1143
  }
1115
- runningAction._completeWithResult(result);
1116
1144
  }
1117
1145
  async handlePayloadWireOrThrow(wire, config) {
1118
1146
  const hydratedAction = this.actionRouter.domainManager.hydrateActionPayload(wire);
@@ -2179,6 +2207,8 @@ class ActionExternalClientHandler extends ActionHandler {
2179
2207
  const localRuntime = config?.targetLocalRuntime ?? ActionRuntime.getDefault();
2180
2208
  const localClient = localRuntime.coordinate;
2181
2209
  const incomingTimeout = config?.timeout ?? this._defaultTimeout;
2210
+ const parentCuid = peekHandlerCuid();
2211
+ const callSite = action._callSite ?? new Error().stack;
2182
2212
  const { methods, transport } = await this.transportManager.getReadyTransport({
2183
2213
  action,
2184
2214
  localClient,
@@ -2189,7 +2219,7 @@ class ActionExternalClientHandler extends ActionHandler {
2189
2219
  handler: this.toHandlerRouteItem(transport),
2190
2220
  time: Date.now()
2191
2221
  });
2192
- const runningAction = new RunningAction({ context: action.context, request: action });
2222
+ const runningAction = new RunningAction({ context: action.context, request: action, parentCuid, callSite });
2193
2223
  localRuntime.registerRunningAction(runningAction);
2194
2224
  const routeActionParams = {
2195
2225
  action,
@@ -10,6 +10,7 @@ import { ActionPayload_Progress } from "./ActionPayload_Progress";
10
10
  import { ActionPayload_Result } from "./ActionPayload_Result";
11
11
  export declare class ActionPayload_Request<DOM extends IActionDomain, ID extends keyof DOM["actionSchema"] & string = keyof DOM["actionSchema"] & string> extends ActionPayload<EActionPayloadType.request, DOM, ID> {
12
12
  readonly input: TInferInputFromSchema<DOM["actionSchema"][ID]>["Input"];
13
+ _callSite?: string;
13
14
  constructor(params: {
14
15
  context: ActionContext<DOM, ID>;
15
16
  }, input: TInferInputFromSchema<DOM["actionSchema"][ID]>["Input"], data: IActionPayload_Data_Base);
@@ -13,6 +13,8 @@ export declare class RunningAction<DOM extends IActionDomain, ID extends keyof D
13
13
  readonly _domain: ActionDomain<DOM>;
14
14
  readonly domain: DOM["domain"];
15
15
  readonly allDomains: DOM["allDomains"];
16
+ readonly parentCuid?: string;
17
+ readonly callSite?: string;
16
18
  private readonly _resultPayloadPromise;
17
19
  private _resolveResult;
18
20
  private _rejectResult;
@@ -20,6 +20,8 @@ export interface IRunningActionState_ConstructorParams<DOM extends IActionDomain
20
20
  request: ActionPayload_Request<DOM, ID>;
21
21
  progress?: ActionPayload_Progress<DOM, ID>[];
22
22
  result?: ActionPayload_Result<DOM, ID>;
23
+ parentCuid?: string;
24
+ callSite?: string;
23
25
  }
24
26
  export declare enum ERunningActionUpdateType {
25
27
  started = "started",
@@ -0,0 +1,3 @@
1
+ export declare function pushHandlerCuid(cuid: string): void;
2
+ export declare function popHandlerCuid(): void;
3
+ export declare function peekHandlerCuid(): string | undefined;
@@ -0,0 +1,7 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function ActionDetailPanel({ entry, parent, childEntries, onSelectEntry, }: {
3
+ entry: IDevtoolsActionEntry;
4
+ parent: IDevtoolsActionEntry | null;
5
+ childEntries: IDevtoolsActionEntry[];
6
+ onSelectEntry: (cuid: string) => void;
7
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function ActionEntryRow({ entry, isSelected, onClick, groupCount, isSubEntry, isLatest, latestTime, childExternalLabels, }: {
3
+ entry: IDevtoolsActionEntry;
4
+ isSelected: boolean;
5
+ onClick: () => void;
6
+ groupCount?: number;
7
+ isSubEntry?: boolean;
8
+ isLatest?: boolean;
9
+ latestTime?: number;
10
+ childExternalLabels?: string[];
11
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function CallStackSection({ parent, childEntries, focusedChildCuid, onFocusChild, onSelectParent, }: {
3
+ parent: IDevtoolsActionEntry | null;
4
+ childEntries: IDevtoolsActionEntry[];
5
+ focusedChildCuid: string | null;
6
+ onFocusChild: (cuid: string) => void;
7
+ onSelectParent: (cuid: string) => void;
8
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,4 @@
1
+ export declare function ChildDispatchChips({ labels, size, }: {
2
+ labels?: string[];
3
+ size?: "sm" | "md";
4
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,11 @@
1
+ import type { CSSProperties, ReactNode } from "react";
2
+ interface IChipProps {
3
+ color: string;
4
+ borderColor: string;
5
+ fontSize?: string;
6
+ padding?: string;
7
+ children: ReactNode;
8
+ style?: CSSProperties;
9
+ }
10
+ export declare function Chip({ color, borderColor, fontSize, padding, children, style, }: IChipProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,5 @@
1
+ export declare function DetailSection({ label, value, color, }: {
2
+ label: string;
3
+ value: unknown;
4
+ color?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ export interface IDomainTooltipCtx {
2
+ show: (rect: DOMRect, allDomains: string[]) => void;
3
+ hide: () => void;
4
+ }
5
+ export declare const DomainTooltipCtx: import("react").Context<IDomainTooltipCtx | null>;
6
+ export declare function DomainHierarchyTooltip({ allDomains, anchor, }: {
7
+ allDomains: string[];
8
+ anchor: DOMRect;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export declare function DomainChip({ subtle, domain, allDomains, size, }: {
11
+ subtle?: boolean;
12
+ domain: string;
13
+ allDomains?: string[];
14
+ size: "sm" | "md";
15
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { IDevtoolsActionEntry, IDevtoolsRouteItem } from "../../core/ActionDevtools.types";
2
+ export declare function getExternalLabel(hop: IDevtoolsRouteItem): string | null;
3
+ interface IHandlerChipsProps {
4
+ entry: IDevtoolsActionEntry;
5
+ size: "sm" | "md";
6
+ }
7
+ export declare function HandlerChips({ entry, size }: IHandlerChipsProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function MetaSection({ entry }: {
3
+ entry: IDevtoolsActionEntry;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { TDevtoolsPosition } from "../../core/ActionDevtools.types";
2
+ export type TDockSide = "top" | "bottom" | "left" | "right";
3
+ export declare function getDockSide(pos: TDevtoolsPosition): TDockSide | null;
4
+ export declare function PanelHeader({ position, onPositionChange, onClose, onClear, }: {
5
+ position: TDevtoolsPosition;
6
+ onPositionChange: (p: TDevtoolsPosition) => void;
7
+ onClose: () => void;
8
+ onClear?: () => void;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export declare function ResizeHandle({ dockSide, dockedSize, onChange, }: {
11
+ dockSide: TDockSide;
12
+ dockedSize: number;
13
+ onChange: (size: number) => void;
14
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function RoutingSection({ entry, minHopCount, }: {
3
+ entry: IDevtoolsActionEntry;
4
+ minHopCount?: number;
5
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ import type { IDevtoolsActionEntry } from "../../core/ActionDevtools.types";
2
+ export declare function RunningTimer({ startTime }: {
3
+ startTime: number;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ export declare function DurationDisplay({ entry }: {
6
+ entry: IDevtoolsActionEntry;
7
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export declare function SectionLabel({ label, color }: {
2
+ label: string;
3
+ color?: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ export declare function StackTraceSection({ label, stack, color, }: {
2
+ label: string;
3
+ stack: string | undefined;
4
+ color?: string;
5
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ import type { IDevtoolsActionEntry, TDevtoolsActionStatus } from "../../core/ActionDevtools.types";
2
+ export declare const STATUS_COLOR: Record<TDevtoolsActionStatus, string>;
3
+ export declare const STATUS_SYMBOL: Record<TDevtoolsActionStatus, string>;
4
+ export declare function safeStringify(value: unknown, indent?: number): string;
5
+ export declare function formatRelativeAge(ms: number): string;
6
+ export declare function formatDuration(entry: IDevtoolsActionEntry): string | null;
7
+ export declare function formatTimestamp(startTime: number): string;
@@ -39,6 +39,9 @@ export interface IDevtoolsActionEntry {
39
39
  abortReason?: unknown;
40
40
  progressUpdates: TActionProgress[];
41
41
  meta: IDevtoolsActionMeta;
42
+ parentCuid?: string;
43
+ callSite?: string;
44
+ errorStack?: string;
42
45
  }
43
46
  export type TDevtoolsListener = (entries: readonly IDevtoolsActionEntry[]) => void;
44
47
  export interface IDevtoolsObservableDomain {
@@ -1,12 +1,10 @@
1
1
  import type { IDevtoolsActionEntry, IDevtoolsObservableDomain, TDevtoolsListener } from "./ActionDevtools.types";
2
2
  export interface IActionDevtoolsCoreOptions {
3
- maxEntries?: number;
4
3
  }
5
4
  export declare class ActionDevtoolsCore {
6
5
  private _entries;
7
6
  private _listeners;
8
- private readonly _maxEntries;
9
- constructor(options?: IActionDevtoolsCoreOptions);
7
+ constructor(_options?: IActionDevtoolsCoreOptions);
10
8
  attachToDomain(domain: IDevtoolsObservableDomain): () => void;
11
9
  getEntries(): readonly IDevtoolsActionEntry[];
12
10
  subscribe(listener: TDevtoolsListener): () => void;
@@ -0,0 +1,4 @@
1
+ export declare const DEVTOOL_COLOR_HANDLER_LOCAL_TEXT = "#34bb89";
2
+ export declare const DEVTOOL_COLOR_HANDLER_LOCAL_BORDER = "#144427";
3
+ export declare const DEVTOOL_COLOR_HANDLER_EXTERNAL_TEXT = "#cfa12a";
4
+ export declare const DEVTOOL_COLOR_HANDLER_EXTERNAL_BORDER = "#723917";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nice-code/action",
3
- "version": "0.2.12",
3
+ "version": "0.2.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -44,8 +44,8 @@
44
44
  "build-types": "tsc --project tsconfig.build.json"
45
45
  },
46
46
  "dependencies": {
47
- "@nice-code/common-errors": "0.2.12",
48
- "@nice-code/error": "0.2.12",
47
+ "@nice-code/common-errors": "0.2.14",
48
+ "@nice-code/error": "0.2.14",
49
49
  "@standard-schema/spec": "^1.1.0",
50
50
  "@tanstack/react-virtual": "^3.13.26",
51
51
  "http-status-codes": "^2.3.0",