@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.
- package/build/devtools/browser/index.js +1799 -964
- package/build/devtools/server/index.js +11 -8
- package/build/index.js +42 -12
- package/build/types/ActionDefinition/Action/Payload/ActionPayload_Request.d.ts +1 -0
- package/build/types/ActionDefinition/Action/RunningAction.d.ts +2 -0
- package/build/types/ActionDefinition/Action/RunningAction.types.d.ts +2 -0
- package/build/types/ActionRuntime/HandlerCallStack.d.ts +3 -0
- package/build/types/devtools/browser/components/ActionDetailPanel.d.ts +7 -0
- package/build/types/devtools/browser/components/ActionEntryRow.d.ts +11 -0
- package/build/types/devtools/browser/components/CallStackSection.d.ts +8 -0
- package/build/types/devtools/browser/components/ChildDispatchChips.d.ts +4 -0
- package/build/types/devtools/browser/components/Chip.d.ts +11 -0
- package/build/types/devtools/browser/components/DetailSection.d.ts +5 -0
- package/build/types/devtools/browser/components/DomainChip.d.ts +15 -0
- package/build/types/devtools/browser/components/HandlerChips.d.ts +8 -0
- package/build/types/devtools/browser/components/MetaSection.d.ts +4 -0
- package/build/types/devtools/browser/components/PanelChrome.d.ts +14 -0
- package/build/types/devtools/browser/components/RoutingSection.d.ts +5 -0
- package/build/types/devtools/browser/components/RunningTimer.d.ts +7 -0
- package/build/types/devtools/browser/components/SectionLabel.d.ts +4 -0
- package/build/types/devtools/browser/components/StackTraceSection.d.ts +5 -0
- package/build/types/devtools/browser/components/utils.d.ts +7 -0
- package/build/types/devtools/core/ActionDevtools.types.d.ts +3 -0
- package/build/types/devtools/core/ActionDevtoolsCore.d.ts +1 -3
- package/build/types/devtools/core/devtools_colors.d.ts +4 -0
- 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
|
-
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
result
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
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,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,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,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,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,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,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
|
-
|
|
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.
|
|
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.
|
|
48
|
-
"@nice-code/error": "0.2.
|
|
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",
|