@lotiai/composer 0.2.0 → 0.2.2
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/dist/build-config/index.d.ts +52 -0
- package/dist/build-config/index.d.ts.map +1 -0
- package/dist/build-config/index.js +66 -0
- package/dist/build-config/index.js.map +1 -0
- package/dist/build-config/loader.d.ts +80 -0
- package/dist/build-config/loader.d.ts.map +1 -0
- package/dist/build-config/loader.js +238 -0
- package/dist/build-config/loader.js.map +1 -0
- package/dist/build-config/schema.d.ts +101 -0
- package/dist/build-config/schema.d.ts.map +1 -0
- package/dist/build-config/schema.js +94 -0
- package/dist/build-config/schema.js.map +1 -0
- package/dist/cli/commands/dev-temporal.d.ts +15 -0
- package/dist/cli/commands/dev-temporal.d.ts.map +1 -0
- package/dist/cli/commands/dev-temporal.js +68 -0
- package/dist/cli/commands/dev-temporal.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +21 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +421 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/profiles.d.ts +15 -0
- package/dist/cli/commands/profiles.d.ts.map +1 -0
- package/dist/cli/commands/profiles.js +69 -0
- package/dist/cli/commands/profiles.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +44 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/async/build/workflow-factory.d.ts +212 -0
- package/dist/internal/async/build/workflow-factory.d.ts.map +1 -0
- package/dist/internal/async/build/workflow-factory.js +533 -0
- package/dist/internal/async/build/workflow-factory.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/common.d.ts +28 -0
- package/dist/internal/async/build-scripts/utils/common.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/common.js +50 -0
- package/dist/internal/async/build-scripts/utils/common.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/import-module.d.ts +19 -0
- package/dist/internal/async/build-scripts/utils/import-module.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/import-module.js +80 -0
- package/dist/internal/async/build-scripts/utils/import-module.js.map +1 -0
- package/dist/internal/async/build-scripts/utils/type-guards.d.ts +123 -0
- package/dist/internal/async/build-scripts/utils/type-guards.d.ts.map +1 -0
- package/dist/internal/async/build-scripts/utils/type-guards.js +145 -0
- package/dist/internal/async/build-scripts/utils/type-guards.js.map +1 -0
- package/dist/internal/async/config/cleanup-policy.d.ts +50 -0
- package/dist/internal/async/config/cleanup-policy.d.ts.map +1 -0
- package/dist/internal/async/config/cleanup-policy.js +20 -0
- package/dist/internal/async/config/cleanup-policy.js.map +1 -0
- package/dist/internal/async/config/worker-profiles.d.ts +172 -0
- package/dist/internal/async/config/worker-profiles.d.ts.map +1 -0
- package/dist/internal/async/config/worker-profiles.js +275 -0
- package/dist/internal/async/config/worker-profiles.js.map +1 -0
- package/dist/internal/async/execute/temporal-client.d.ts +182 -0
- package/dist/internal/async/execute/temporal-client.d.ts.map +1 -0
- package/dist/internal/async/execute/temporal-client.js +190 -0
- package/dist/internal/async/execute/temporal-client.js.map +1 -0
- package/dist/internal/async/execute/workflow-execution.d.ts +98 -0
- package/dist/internal/async/execute/workflow-execution.d.ts.map +1 -0
- package/dist/internal/async/execute/workflow-execution.js +191 -0
- package/dist/internal/async/execute/workflow-execution.js.map +1 -0
- package/dist/internal/async/metrics/task-queue-metrics.d.ts +74 -0
- package/dist/internal/async/metrics/task-queue-metrics.d.ts.map +1 -0
- package/dist/internal/async/metrics/task-queue-metrics.js +155 -0
- package/dist/internal/async/metrics/task-queue-metrics.js.map +1 -0
- package/dist/internal/async/register/activity-worker.d.ts +123 -0
- package/dist/internal/async/register/activity-worker.d.ts.map +1 -0
- package/dist/internal/async/register/activity-worker.js +355 -0
- package/dist/internal/async/register/activity-worker.js.map +1 -0
- package/dist/internal/async/register/generate-workflow-source.d.ts +43 -0
- package/dist/internal/async/register/generate-workflow-source.d.ts.map +1 -0
- package/dist/internal/async/register/generate-workflow-source.js +193 -0
- package/dist/internal/async/register/generate-workflow-source.js.map +1 -0
- package/dist/internal/async/register/workflow-worker.d.ts +125 -0
- package/dist/internal/async/register/workflow-worker.d.ts.map +1 -0
- package/dist/internal/async/register/workflow-worker.js +215 -0
- package/dist/internal/async/register/workflow-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/start-activity-worker.d.ts +70 -0
- package/dist/internal/async/register-scripts/start-activity-worker.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-activity-worker.js +75 -0
- package/dist/internal/async/register-scripts/start-activity-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/start-all-workers.d.ts +81 -0
- package/dist/internal/async/register-scripts/start-all-workers.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-all-workers.js +84 -0
- package/dist/internal/async/register-scripts/start-all-workers.js.map +1 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.d.ts +69 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.js +74 -0
- package/dist/internal/async/register-scripts/start-workflow-worker.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.d.ts +28 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.js +124 -0
- package/dist/internal/async/register-scripts/sync-schedules-cli.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.d.ts +55 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.js +146 -0
- package/dist/internal/async/register-scripts/sync-schedules-via-lambda.js.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules.d.ts +68 -0
- package/dist/internal/async/register-scripts/sync-schedules.d.ts.map +1 -0
- package/dist/internal/async/register-scripts/sync-schedules.js +83 -0
- package/dist/internal/async/register-scripts/sync-schedules.js.map +1 -0
- package/dist/internal/async/schedule/constants.d.ts +10 -0
- package/dist/internal/async/schedule/constants.d.ts.map +1 -0
- package/dist/internal/async/schedule/constants.js +13 -0
- package/dist/internal/async/schedule/constants.js.map +1 -0
- package/dist/internal/async/schedule/define-schedule.d.ts +192 -0
- package/dist/internal/async/schedule/define-schedule.d.ts.map +1 -0
- package/dist/internal/async/schedule/define-schedule.js +79 -0
- package/dist/internal/async/schedule/define-schedule.js.map +1 -0
- package/dist/internal/async/schedule/index.d.ts +3 -0
- package/dist/internal/async/schedule/index.d.ts.map +1 -0
- package/dist/internal/async/schedule/index.js +9 -0
- package/dist/internal/async/schedule/index.js.map +1 -0
- package/dist/internal/async/schedule/schedule-definition-schema.d.ts +64 -0
- package/dist/internal/async/schedule/schedule-definition-schema.d.ts.map +1 -0
- package/dist/internal/async/schedule/schedule-definition-schema.js +77 -0
- package/dist/internal/async/schedule/schedule-definition-schema.js.map +1 -0
- package/dist/internal/async/schedule/sync-schedules.d.ts +71 -0
- package/dist/internal/async/schedule/sync-schedules.d.ts.map +1 -0
- package/dist/internal/async/schedule/sync-schedules.js +231 -0
- package/dist/internal/async/schedule/sync-schedules.js.map +1 -0
- package/dist/internal/async/utils/ensure-namespace.d.ts +16 -0
- package/dist/internal/async/utils/ensure-namespace.d.ts.map +1 -0
- package/dist/internal/async/utils/ensure-namespace.js +64 -0
- package/dist/internal/async/utils/ensure-namespace.js.map +1 -0
- package/dist/internal/async/utils/find-package-root.d.ts +9 -0
- package/dist/internal/async/utils/find-package-root.d.ts.map +1 -0
- package/dist/internal/async/utils/find-package-root.js +28 -0
- package/dist/internal/async/utils/find-package-root.js.map +1 -0
- package/dist/internal/async/utils/is-composer-error.d.ts +14 -0
- package/dist/internal/async/utils/is-composer-error.d.ts.map +1 -0
- package/dist/internal/async/utils/is-composer-error.js +17 -0
- package/dist/internal/async/utils/is-composer-error.js.map +1 -0
- package/dist/internal/context-provider.d.ts +316 -0
- package/dist/internal/context-provider.d.ts.map +1 -0
- package/dist/internal/context-provider.js +12 -0
- package/dist/internal/context-provider.js.map +1 -0
- package/dist/internal/create-composer.d.ts +57 -0
- package/dist/internal/create-composer.d.ts.map +1 -0
- package/dist/internal/create-composer.js +125 -0
- package/dist/internal/create-composer.js.map +1 -0
- package/dist/internal/dag-sync-fanout.d.ts +79 -0
- package/dist/internal/dag-sync-fanout.d.ts.map +1 -0
- package/dist/internal/dag-sync-fanout.js +59 -0
- package/dist/internal/dag-sync-fanout.js.map +1 -0
- package/dist/internal/dag-sync-step.d.ts +230 -0
- package/dist/internal/dag-sync-step.d.ts.map +1 -0
- package/dist/internal/dag-sync-step.js +159 -0
- package/dist/internal/dag-sync-step.js.map +1 -0
- package/dist/internal/dag-sync-workflow.d.ts +535 -0
- package/dist/internal/dag-sync-workflow.d.ts.map +1 -0
- package/dist/internal/dag-sync-workflow.js +843 -0
- package/dist/internal/dag-sync-workflow.js.map +1 -0
- package/dist/internal/defaults.d.ts +24 -0
- package/dist/internal/defaults.d.ts.map +1 -0
- package/dist/internal/defaults.js +102 -0
- package/dist/internal/defaults.js.map +1 -0
- package/dist/internal/errors.d.ts +109 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/index.d.ts +9 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +22 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/internal/observability.d.ts +63 -0
- package/dist/internal/observability.d.ts.map +1 -0
- package/dist/internal/observability.js +323 -0
- package/dist/internal/observability.js.map +1 -0
- package/dist/internal/types.d.ts +80 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +9 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/internal/workflow-planning.d.ts +107 -0
- package/dist/internal/workflow-planning.d.ts.map +1 -0
- package/dist/internal/workflow-planning.js +216 -0
- package/dist/internal/workflow-planning.js.map +1 -0
- package/dist/schedule-sync.d.ts +17 -0
- package/dist/schedule-sync.d.ts.map +1 -0
- package/dist/schedule-sync.js +22 -0
- package/dist/schedule-sync.js.map +1 -0
- package/dist/temporal-naming.d.ts +27 -0
- package/dist/temporal-naming.d.ts.map +1 -0
- package/dist/temporal-naming.js +33 -0
- package/dist/temporal-naming.js.map +1 -0
- package/package.json +29 -17
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async Workflow Factory - Creates Temporal workflow functions from pre-computed plans.
|
|
4
|
+
*
|
|
5
|
+
* This factory ONLY uses @temporalio/workflow APIs to ensure deterministic execution.
|
|
6
|
+
* It is bundled by Temporal's workflow bundler and runs in an isolated sandbox.
|
|
7
|
+
* It CANNOT import Node.js APIs or external dependencies (no fs, no network,
|
|
8
|
+
* no logging libraries) -- only @temporalio/workflow primitives.
|
|
9
|
+
*
|
|
10
|
+
* ## Factory Pattern:
|
|
11
|
+
* - Input: WorkflowPlan (build-time generated, contains batches + activity mappings)
|
|
12
|
+
* - Output: Temporal workflow function (deterministic orchestration logic)
|
|
13
|
+
* - Result: Worker registers these functions, Temporal invokes them at runtime
|
|
14
|
+
*
|
|
15
|
+
* All business logic runs in activities, not in the workflow itself.
|
|
16
|
+
* The workflow only orchestrates: batch sequencing, parallel step execution, data flow.
|
|
17
|
+
*
|
|
18
|
+
* @module workflow-factory
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.awaitCheckpointUpdate = void 0;
|
|
55
|
+
exports.createWorkflowFunction = createWorkflowFunction;
|
|
56
|
+
const wf = __importStar(require("@temporalio/workflow"));
|
|
57
|
+
/**
|
|
58
|
+
* LotiError formats messages as "CODE: message" - extract code from message if not available elsewhere.
|
|
59
|
+
*/
|
|
60
|
+
function extractCodeFromMessage(message) {
|
|
61
|
+
if (!message)
|
|
62
|
+
return undefined;
|
|
63
|
+
const colonIndex = message.indexOf(": ");
|
|
64
|
+
if (colonIndex > 0 && colonIndex < 50) {
|
|
65
|
+
return message.substring(0, colonIndex);
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract LotiError metadata from ApplicationFailure.details[0].
|
|
71
|
+
* We store { code, parentCodes, data } there when converting LotiErrors.
|
|
72
|
+
*/
|
|
73
|
+
function extractLotiDetails(err) {
|
|
74
|
+
if (!err?.details || !Array.isArray(err.details) || err.details.length === 0) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const detail = err.details[0];
|
|
78
|
+
if (detail && typeof detail === "object" && "code" in detail) {
|
|
79
|
+
return detail;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Recursively build the cause chain from a Temporal error.
|
|
85
|
+
* ApplicationFailure stores error code in `type` field.
|
|
86
|
+
*/
|
|
87
|
+
function buildCauseChain(err, depth) {
|
|
88
|
+
if (!err?.cause || depth >= 5)
|
|
89
|
+
return undefined;
|
|
90
|
+
const cause = err.cause;
|
|
91
|
+
const message = cause.message ?? String(cause);
|
|
92
|
+
const lotiDetails = extractLotiDetails(cause);
|
|
93
|
+
const code = cause.code ?? cause.type ?? lotiDetails?.code ?? extractCodeFromMessage(message);
|
|
94
|
+
return {
|
|
95
|
+
message,
|
|
96
|
+
code,
|
|
97
|
+
parentCodes: lotiDetails?.parentCodes,
|
|
98
|
+
type: cause.name,
|
|
99
|
+
cause: buildCauseChain(cause, depth + 1),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Build StepFailureInfo from a Temporal activity error.
|
|
104
|
+
* Extracts LotiError code/parentCodes from the ApplicationFailure wrapper.
|
|
105
|
+
*/
|
|
106
|
+
function buildStepFailureInfo(stepName, rawError) {
|
|
107
|
+
const error = rawError;
|
|
108
|
+
// ActivityFailure wraps our ApplicationFailure in cause
|
|
109
|
+
const causeError = error?.cause;
|
|
110
|
+
const lotiDetails = extractLotiDetails(causeError) ?? extractLotiDetails(error);
|
|
111
|
+
const code = error?.code ??
|
|
112
|
+
causeError?.type ??
|
|
113
|
+
lotiDetails?.code ??
|
|
114
|
+
extractCodeFromMessage(causeError?.message ?? error?.message);
|
|
115
|
+
return {
|
|
116
|
+
stepName,
|
|
117
|
+
message: causeError?.message ?? error?.message ?? String(rawError),
|
|
118
|
+
code,
|
|
119
|
+
parentCodes: lotiDetails?.parentCodes,
|
|
120
|
+
type: error?.name ?? "Error",
|
|
121
|
+
cause: buildCauseChain(error, 0),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Temporal Update definition for awaiting checkpoints.
|
|
126
|
+
* Clients call this to wait for a checkpoint and receive the partial bag state.
|
|
127
|
+
*
|
|
128
|
+
* The update handler blocks until the requested checkpoint is reached,
|
|
129
|
+
* then returns a snapshot of the bag at that point.
|
|
130
|
+
*
|
|
131
|
+
* Import this for type-safe executeUpdate calls from client code.
|
|
132
|
+
*/
|
|
133
|
+
exports.awaitCheckpointUpdate = wf.defineUpdate("awaitCheckpoint");
|
|
134
|
+
/**
|
|
135
|
+
* Factory function that creates a Temporal workflow function from a pre-computed plan.
|
|
136
|
+
*
|
|
137
|
+
* This factory creates deterministic orchestration logic using only Temporal workflow APIs.
|
|
138
|
+
* All actual business logic runs in activities - the workflow only coordinates execution.
|
|
139
|
+
*
|
|
140
|
+
* The workflow returns { bag, error? } instead of throwing, matching the sync runtime.
|
|
141
|
+
*
|
|
142
|
+
* @param plan - The workflow execution plan (generated at build time)
|
|
143
|
+
* @returns A Temporal workflow function ready for worker registration
|
|
144
|
+
*/
|
|
145
|
+
function createWorkflowFunction(plan) {
|
|
146
|
+
return async function temporalWorkflow(input) {
|
|
147
|
+
const workflowId = wf.workflowInfo().workflowId;
|
|
148
|
+
wf.log.info("Starting workflow execution", {
|
|
149
|
+
workflowId: wf.workflowInfo().workflowId,
|
|
150
|
+
workflowName: plan.name,
|
|
151
|
+
initialDataKeys: Object.keys(input.initialData),
|
|
152
|
+
});
|
|
153
|
+
// Initialize bag with initial data
|
|
154
|
+
const bag = { ...input.initialData };
|
|
155
|
+
// Track which checkpoints have been reached
|
|
156
|
+
const reachedCheckpoints = new Set();
|
|
157
|
+
// Set up checkpoint update handler if workflow has checkpoints defined
|
|
158
|
+
// The handler blocks until the requested checkpoint is reached, then returns the bag state
|
|
159
|
+
if (plan.checkpoints && plan.checkpoints.length > 0) {
|
|
160
|
+
wf.setHandler(exports.awaitCheckpointUpdate, async ({ checkpointName }) => {
|
|
161
|
+
// Validate the checkpoint exists in this workflow's plan
|
|
162
|
+
const checkpoint = plan.checkpoints?.find((c) => c.name === checkpointName);
|
|
163
|
+
if (!checkpoint) {
|
|
164
|
+
const validNames = plan.checkpoints?.map((c) => c.name).join(", ") ?? "none";
|
|
165
|
+
throw new Error(`Unknown checkpoint "${checkpointName}" for workflow "${plan.name}". ` +
|
|
166
|
+
`Valid checkpoints: [${validNames}]`);
|
|
167
|
+
}
|
|
168
|
+
wf.log.debug("Awaiting checkpoint", {
|
|
169
|
+
workflowId,
|
|
170
|
+
checkpointName,
|
|
171
|
+
alreadyReached: reachedCheckpoints.has(checkpointName),
|
|
172
|
+
});
|
|
173
|
+
// Wait until this checkpoint is reached (or already has been)
|
|
174
|
+
await wf.condition(() => reachedCheckpoints.has(checkpointName));
|
|
175
|
+
wf.log.debug("Checkpoint reached, returning bag snapshot", {
|
|
176
|
+
workflowId,
|
|
177
|
+
checkpointName,
|
|
178
|
+
bagKeys: Object.keys(bag),
|
|
179
|
+
});
|
|
180
|
+
// Return a snapshot of the bag at this checkpoint
|
|
181
|
+
return { ...bag };
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// Execute batches sequentially
|
|
185
|
+
for (let batchIndex = 0; batchIndex < plan.batches.length; batchIndex++) {
|
|
186
|
+
const batch = plan.batches[batchIndex];
|
|
187
|
+
const batchNumber = batchIndex + 1;
|
|
188
|
+
wf.log.debug(`Executing batch ${batchNumber}/${plan.batches.length}`, {
|
|
189
|
+
batchSteps: batch.steps.map((s) => s.name),
|
|
190
|
+
});
|
|
191
|
+
// Create activity proxies once per unique (taskQueue + activityConfig) combination.
|
|
192
|
+
// proxyActivities applies timeout/retry config to all activities on a proxy,
|
|
193
|
+
// so steps with different configs need separate proxies.
|
|
194
|
+
const activityProxiesByKey = new Map();
|
|
195
|
+
const getProxyKey = (taskQueue, config) => {
|
|
196
|
+
if (!config)
|
|
197
|
+
return taskQueue;
|
|
198
|
+
return `${taskQueue}|${JSON.stringify(config)}`;
|
|
199
|
+
};
|
|
200
|
+
const ensureActivityProxy = (taskQueue, config) => {
|
|
201
|
+
const key = getProxyKey(taskQueue, config);
|
|
202
|
+
if (!activityProxiesByKey.has(key)) {
|
|
203
|
+
const activities = wf.proxyActivities({
|
|
204
|
+
taskQueue,
|
|
205
|
+
startToCloseTimeout: config?.startToCloseTimeout ?? "5 minutes",
|
|
206
|
+
heartbeatTimeout: config?.heartbeatTimeout,
|
|
207
|
+
retry: {
|
|
208
|
+
maximumAttempts: config?.retry?.maximumAttempts ?? 3,
|
|
209
|
+
backoffCoefficient: config?.retry?.backoffCoefficient ?? 2,
|
|
210
|
+
initialInterval: config?.retry?.initialInterval ?? "1s",
|
|
211
|
+
maximumInterval: config?.retry?.maximumInterval ?? "60s",
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
activityProxiesByKey.set(key, activities);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
for (const step of batch.steps) {
|
|
218
|
+
ensureActivityProxy(step.taskQueue, step.activityConfig);
|
|
219
|
+
}
|
|
220
|
+
for (const fanOut of batch.fanOuts ?? []) {
|
|
221
|
+
ensureActivityProxy(fanOut.taskQueue, fanOut.activityConfig);
|
|
222
|
+
}
|
|
223
|
+
const allPromises = [];
|
|
224
|
+
const allNames = [];
|
|
225
|
+
// Step promises
|
|
226
|
+
for (const step of batch.steps) {
|
|
227
|
+
allNames.push(step.name);
|
|
228
|
+
allPromises.push((async () => {
|
|
229
|
+
const stepInput = {};
|
|
230
|
+
for (const neededField of step.needs) {
|
|
231
|
+
stepInput[neededField] = bag[neededField];
|
|
232
|
+
}
|
|
233
|
+
wf.log.debug(`Executing step activity`, {
|
|
234
|
+
stepName: step.name,
|
|
235
|
+
activityName: step.activityName,
|
|
236
|
+
taskQueue: step.taskQueue,
|
|
237
|
+
needs: step.needs,
|
|
238
|
+
provides: step.provides,
|
|
239
|
+
});
|
|
240
|
+
const proxyKey = getProxyKey(step.taskQueue, step.activityConfig);
|
|
241
|
+
const activities = activityProxiesByKey.get(proxyKey);
|
|
242
|
+
const activityFn = activities[step.activityName];
|
|
243
|
+
if (!activityFn) {
|
|
244
|
+
throw new Error(`Activity not found: ${step.activityName}`);
|
|
245
|
+
}
|
|
246
|
+
const stepOutput = await activityFn(input, stepInput);
|
|
247
|
+
wf.log.debug(`Step completed`, {
|
|
248
|
+
stepName: step.name,
|
|
249
|
+
outputKeys: Object.keys(stepOutput),
|
|
250
|
+
});
|
|
251
|
+
return { stepName: step.name, output: stepOutput };
|
|
252
|
+
})());
|
|
253
|
+
}
|
|
254
|
+
// FanOut promises
|
|
255
|
+
for (const fanOut of batch.fanOuts ?? []) {
|
|
256
|
+
allNames.push(fanOut.name);
|
|
257
|
+
allPromises.push((async () => {
|
|
258
|
+
const output = await executeFanOutInWorkflow(fanOut, bag, input, workflowId, activityProxiesByKey, getProxyKey);
|
|
259
|
+
return { stepName: fanOut.name, output };
|
|
260
|
+
})());
|
|
261
|
+
}
|
|
262
|
+
// Execute all in parallel using allSettled
|
|
263
|
+
const settledResults = await Promise.allSettled(allPromises);
|
|
264
|
+
// Separate fulfilled and rejected results
|
|
265
|
+
const fulfilled = [];
|
|
266
|
+
const rejected = [];
|
|
267
|
+
for (let i = 0; i < settledResults.length; i++) {
|
|
268
|
+
const result = settledResults[i];
|
|
269
|
+
if (result.status === "fulfilled") {
|
|
270
|
+
fulfilled.push(result.value);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
rejected.push({ stepName: allNames[i], error: result.reason });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// First, merge successful step outputs into the bag
|
|
277
|
+
// This ensures the bag has all available data even if some steps failed
|
|
278
|
+
for (const { output } of fulfilled) {
|
|
279
|
+
Object.assign(bag, output);
|
|
280
|
+
}
|
|
281
|
+
// Mark any checkpoints that trigger after this batch completes
|
|
282
|
+
// This happens regardless of whether some steps in the batch failed,
|
|
283
|
+
// allowing clients to receive partial results if they requested a checkpoint
|
|
284
|
+
for (const checkpoint of plan.checkpoints ?? []) {
|
|
285
|
+
if (checkpoint.afterBatch === batchIndex) {
|
|
286
|
+
wf.log.debug("Marking checkpoint as reached", {
|
|
287
|
+
workflowId,
|
|
288
|
+
checkpointName: checkpoint.name,
|
|
289
|
+
batchIndex,
|
|
290
|
+
batchNumber,
|
|
291
|
+
});
|
|
292
|
+
reachedCheckpoints.add(checkpoint.name);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// If any steps failed, handle the batch error
|
|
296
|
+
if (rejected.length > 0) {
|
|
297
|
+
const failedStepNames = rejected.map((r) => r.stepName).join(", ");
|
|
298
|
+
wf.log.error("Batch execution failed", {
|
|
299
|
+
workflowId,
|
|
300
|
+
batchNumber,
|
|
301
|
+
failedSteps: failedStepNames,
|
|
302
|
+
successfulSteps: fulfilled.map((f) => f.stepName),
|
|
303
|
+
errorCount: rejected.length,
|
|
304
|
+
});
|
|
305
|
+
// Build error info for the error handler
|
|
306
|
+
const batchErrorInfo = {
|
|
307
|
+
batchNumber,
|
|
308
|
+
workflowId,
|
|
309
|
+
errors: rejected.map((r) => buildStepFailureInfo(r.stepName, r.error)),
|
|
310
|
+
};
|
|
311
|
+
// Log the batch error for observability
|
|
312
|
+
// Structured logging backends (OTEL, etc.) will serialize this correctly
|
|
313
|
+
// Terminal may show [Object] for nested objects - that's a display limitation
|
|
314
|
+
wf.log.warn("Workflow batch failed", {
|
|
315
|
+
workflowId: wf.workflowInfo().workflowId,
|
|
316
|
+
batchNumber,
|
|
317
|
+
failedSteps: failedStepNames,
|
|
318
|
+
errors: batchErrorInfo.errors,
|
|
319
|
+
});
|
|
320
|
+
// Call error handler activity if configured
|
|
321
|
+
// The error handler activity returns Error | undefined:
|
|
322
|
+
// - undefined = error was handled, no error to propagate
|
|
323
|
+
// - Error = error to propagate (possibly transformed)
|
|
324
|
+
let resultError = {
|
|
325
|
+
message: `Batch ${batchNumber} failed: ${rejected.length} step(s) failed [${failedStepNames}]`,
|
|
326
|
+
code: "WORKFLOW_BATCH_ERROR",
|
|
327
|
+
type: "WorkflowBatchError",
|
|
328
|
+
batchNumber,
|
|
329
|
+
errors: batchErrorInfo.errors,
|
|
330
|
+
};
|
|
331
|
+
if (plan.errorHandlerActivityName) {
|
|
332
|
+
// Default to standard-tasks (same queue as other activities)
|
|
333
|
+
const errorHandlerQueue = plan.errorHandlerTaskQueue ?? "standard-tasks";
|
|
334
|
+
const errorHandlerActivities = wf.proxyActivities({
|
|
335
|
+
taskQueue: errorHandlerQueue,
|
|
336
|
+
startToCloseTimeout: "1 minute",
|
|
337
|
+
retry: {
|
|
338
|
+
maximumAttempts: 1, // Don't retry error handler
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
const errorHandlerFn = errorHandlerActivities[plan.errorHandlerActivityName];
|
|
342
|
+
if (errorHandlerFn) {
|
|
343
|
+
try {
|
|
344
|
+
wf.log.info("Invoking error handler activity", {
|
|
345
|
+
workflowId,
|
|
346
|
+
activityName: plan.errorHandlerActivityName,
|
|
347
|
+
batchNumber,
|
|
348
|
+
});
|
|
349
|
+
const handlerResult = await errorHandlerFn(input, bag, batchErrorInfo);
|
|
350
|
+
if (handlerResult.bag) {
|
|
351
|
+
Object.assign(bag, handlerResult.bag);
|
|
352
|
+
}
|
|
353
|
+
wf.log.info("Error handler activity completed", {
|
|
354
|
+
workflowId,
|
|
355
|
+
activityName: plan.errorHandlerActivityName,
|
|
356
|
+
handled: handlerResult.handled,
|
|
357
|
+
});
|
|
358
|
+
if (handlerResult.handled) {
|
|
359
|
+
// Error was fully handled - no error to propagate
|
|
360
|
+
resultError = undefined;
|
|
361
|
+
}
|
|
362
|
+
else if (handlerResult.error) {
|
|
363
|
+
// Error was transformed
|
|
364
|
+
resultError = {
|
|
365
|
+
message: handlerResult.error.message,
|
|
366
|
+
code: handlerResult.error.code,
|
|
367
|
+
type: "TransformedError",
|
|
368
|
+
batchNumber,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
// If neither, keep the original batch error
|
|
372
|
+
}
|
|
373
|
+
catch (handlerError) {
|
|
374
|
+
wf.log.error("Error handler activity failed", {
|
|
375
|
+
workflowId,
|
|
376
|
+
activityName: plan.errorHandlerActivityName,
|
|
377
|
+
error: handlerError instanceof Error ? handlerError.message : String(handlerError),
|
|
378
|
+
});
|
|
379
|
+
// Handler crashed - wrap both errors
|
|
380
|
+
resultError = {
|
|
381
|
+
message: `Error handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)} (original: ${failedStepNames})`,
|
|
382
|
+
code: "WORKFLOW_ERROR_HANDLER_FAILURE",
|
|
383
|
+
type: "WorkflowErrorHandlerFailure",
|
|
384
|
+
batchNumber,
|
|
385
|
+
errors: batchErrorInfo.errors,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (resultError) {
|
|
391
|
+
// Unhandled error: throw ApplicationFailure to mark workflow as Failed.
|
|
392
|
+
// Include bag in details so callers can extract partial workflow state.
|
|
393
|
+
throw wf.ApplicationFailure.create({
|
|
394
|
+
message: resultError.message,
|
|
395
|
+
type: resultError.type ?? "WorkflowError",
|
|
396
|
+
nonRetryable: true,
|
|
397
|
+
details: [{ bag, error: resultError }],
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
// Error was handled - continue processing remaining batches
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
wf.log.info("Workflow execution completed successfully", {
|
|
404
|
+
workflowId,
|
|
405
|
+
outputKeys: Object.keys(bag),
|
|
406
|
+
});
|
|
407
|
+
return { bag, error: undefined };
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Executes a FanOut entry within a Temporal workflow using child workflows.
|
|
412
|
+
*
|
|
413
|
+
* 1. Calls mapInput activity to produce child workflow inputs from the bag
|
|
414
|
+
* 2. Spawns min(concurrency, N) async lanes that start child workflows
|
|
415
|
+
* via wf.executeChild with deterministic IDs ({parentId}/{fanOutName}/{index})
|
|
416
|
+
* 3. Collects all results (allSettled semantics via try/catch per child)
|
|
417
|
+
* 4. If all succeed, calls aggregateResults activity to merge results
|
|
418
|
+
* 5. If any fail, throws an error describing which children failed
|
|
419
|
+
*/
|
|
420
|
+
async function executeFanOutInWorkflow(fanOut, bag, input, parentWorkflowId, activityProxiesByKey, getProxyKeyFn) {
|
|
421
|
+
const proxyKey = getProxyKeyFn(fanOut.taskQueue, fanOut.activityConfig);
|
|
422
|
+
const activities = activityProxiesByKey.get(proxyKey);
|
|
423
|
+
// Build bag slice with only the fields mapInput needs
|
|
424
|
+
const bagSlice = {};
|
|
425
|
+
for (const field of fanOut.needs) {
|
|
426
|
+
bagSlice[field] = bag[field];
|
|
427
|
+
}
|
|
428
|
+
wf.log.info("FanOut: calling mapInput", {
|
|
429
|
+
fanOutName: fanOut.name,
|
|
430
|
+
childWorkflow: fanOut.childWorkflowName,
|
|
431
|
+
needs: fanOut.needs,
|
|
432
|
+
});
|
|
433
|
+
// Call mapInput activity to produce child workflow inputs
|
|
434
|
+
const mapInputFn = activities[fanOut.mapInputActivityName];
|
|
435
|
+
if (!mapInputFn) {
|
|
436
|
+
throw new Error(`Activity not found: ${fanOut.mapInputActivityName}`);
|
|
437
|
+
}
|
|
438
|
+
const childInputs = await mapInputFn(input, bagSlice);
|
|
439
|
+
// Handle empty input array
|
|
440
|
+
if (childInputs.length === 0) {
|
|
441
|
+
wf.log.info("FanOut: empty input array, calling aggregateResults with []", {
|
|
442
|
+
fanOutName: fanOut.name,
|
|
443
|
+
});
|
|
444
|
+
const aggFn = activities[fanOut.aggregateResultsActivityName];
|
|
445
|
+
if (!aggFn) {
|
|
446
|
+
throw new Error(`Activity not found: ${fanOut.aggregateResultsActivityName}`);
|
|
447
|
+
}
|
|
448
|
+
return await aggFn(input, []);
|
|
449
|
+
}
|
|
450
|
+
wf.log.info("FanOut: starting child workflows", {
|
|
451
|
+
fanOutName: fanOut.name,
|
|
452
|
+
childCount: childInputs.length,
|
|
453
|
+
concurrency: fanOut.concurrency,
|
|
454
|
+
childWorkflow: fanOut.childWorkflowName,
|
|
455
|
+
});
|
|
456
|
+
// Lane-based child workflow execution
|
|
457
|
+
// concurrency may be null after JSON round-trip (Infinity -> null via JSON.stringify)
|
|
458
|
+
const effectiveConcurrency = fanOut.concurrency ?? childInputs.length;
|
|
459
|
+
const laneCount = Math.min(effectiveConcurrency, childInputs.length);
|
|
460
|
+
const childResults = new Array(childInputs.length);
|
|
461
|
+
let nextIndex = 0;
|
|
462
|
+
const lane = async () => {
|
|
463
|
+
while (true) {
|
|
464
|
+
const index = nextIndex++;
|
|
465
|
+
if (index >= childInputs.length)
|
|
466
|
+
break;
|
|
467
|
+
const childWorkflowId = `${parentWorkflowId}/${fanOut.name}/${index}`;
|
|
468
|
+
try {
|
|
469
|
+
const childResult = (await wf.executeChild(fanOut.childWorkflowName, {
|
|
470
|
+
workflowId: childWorkflowId,
|
|
471
|
+
args: [{ initialData: childInputs[index] }],
|
|
472
|
+
}));
|
|
473
|
+
childResults[index] = { bag: childResult.bag };
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
// Child workflows throw ApplicationFailure for unhandled errors.
|
|
477
|
+
// Extract the structured error from ChildWorkflowFailure -> ApplicationFailure.
|
|
478
|
+
let errorDetail = err;
|
|
479
|
+
if (err instanceof wf.ChildWorkflowFailure && err.cause instanceof wf.ApplicationFailure) {
|
|
480
|
+
const detail = err.cause.details?.[0];
|
|
481
|
+
if (detail?.error) {
|
|
482
|
+
errorDetail = detail.error;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
childResults[index] = { error: errorDetail };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
await Promise.all(Array.from({ length: laneCount }, () => lane()));
|
|
490
|
+
// Separate successes from failures
|
|
491
|
+
const successBags = [];
|
|
492
|
+
const failures = [];
|
|
493
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
494
|
+
const result = childResults[i];
|
|
495
|
+
if ("error" in result) {
|
|
496
|
+
failures.push({ index: i, error: result.error });
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
successBags.push(result.bag);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (failures.length > 0) {
|
|
503
|
+
const failureDetails = failures
|
|
504
|
+
.map((f) => {
|
|
505
|
+
const err = f.error;
|
|
506
|
+
const msg = err instanceof Error
|
|
507
|
+
? err.message
|
|
508
|
+
: typeof err === "object" && err !== null && typeof err.message === "string"
|
|
509
|
+
? err.message
|
|
510
|
+
: String(err);
|
|
511
|
+
return `child ${f.index}: ${msg}`;
|
|
512
|
+
})
|
|
513
|
+
.join("; ");
|
|
514
|
+
wf.log.error("FanOut: child workflow failures", {
|
|
515
|
+
fanOutName: fanOut.name,
|
|
516
|
+
failedCount: failures.length,
|
|
517
|
+
totalCount: childInputs.length,
|
|
518
|
+
failures: failureDetails,
|
|
519
|
+
});
|
|
520
|
+
throw new Error(`FanOut "${fanOut.name}": ${failures.length} of ${childInputs.length} child workflow(s) failed [${failureDetails}]`);
|
|
521
|
+
}
|
|
522
|
+
wf.log.info("FanOut: all children completed, calling aggregateResults", {
|
|
523
|
+
fanOutName: fanOut.name,
|
|
524
|
+
successCount: successBags.length,
|
|
525
|
+
});
|
|
526
|
+
// Call aggregateResults activity
|
|
527
|
+
const aggFn = activities[fanOut.aggregateResultsActivityName];
|
|
528
|
+
if (!aggFn) {
|
|
529
|
+
throw new Error(`Activity not found: ${fanOut.aggregateResultsActivityName}`);
|
|
530
|
+
}
|
|
531
|
+
return await aggFn(input, successBags);
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=workflow-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-factory.js","sourceRoot":"","sources":["../../../../src/internal/async/build/workflow-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Utilities for Build Scripts
|
|
3
|
+
*
|
|
4
|
+
* Shared utility functions used across the async build system.
|
|
5
|
+
*/
|
|
6
|
+
import type { Step } from "../../../dag-sync-step";
|
|
7
|
+
/**
|
|
8
|
+
* Restores real step names from synthetic namespaced names.
|
|
9
|
+
*
|
|
10
|
+
* The sync runtime's workflow() function flattens composed workflows and creates
|
|
11
|
+
* synthetic steps with:
|
|
12
|
+
* - Namespaced names like "childWorkflow.stepName" or "parent.child.stepName"
|
|
13
|
+
* - A 'workflowPath' property indicating they came from a composed workflow
|
|
14
|
+
*
|
|
15
|
+
* For async/Temporal, we need to map these back to their real step names
|
|
16
|
+
* so we can look them up in the step manifest.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Input (from sync runtime, already flattened):
|
|
21
|
+
* [stepA, { name: "child.step1", workflowPath: ["child"], ... }]
|
|
22
|
+
*
|
|
23
|
+
* // Output (real step names restored):
|
|
24
|
+
* [stepA, { name: "step1", _syntheticName: "child.step1", ... }]
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function denamespaceSyntheticSteps(steps: readonly Step<any, any, any>[]): Step<any, any, any>[];
|
|
28
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../../src/internal/async/build-scripts/utils/common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GACpC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAsBvB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Common Utilities for Build Scripts
|
|
4
|
+
*
|
|
5
|
+
* Shared utility functions used across the async build system.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.denamespaceSyntheticSteps = denamespaceSyntheticSteps;
|
|
9
|
+
/**
|
|
10
|
+
* Restores real step names from synthetic namespaced names.
|
|
11
|
+
*
|
|
12
|
+
* The sync runtime's workflow() function flattens composed workflows and creates
|
|
13
|
+
* synthetic steps with:
|
|
14
|
+
* - Namespaced names like "childWorkflow.stepName" or "parent.child.stepName"
|
|
15
|
+
* - A 'workflowPath' property indicating they came from a composed workflow
|
|
16
|
+
*
|
|
17
|
+
* For async/Temporal, we need to map these back to their real step names
|
|
18
|
+
* so we can look them up in the step manifest.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Input (from sync runtime, already flattened):
|
|
23
|
+
* [stepA, { name: "child.step1", workflowPath: ["child"], ... }]
|
|
24
|
+
*
|
|
25
|
+
* // Output (real step names restored):
|
|
26
|
+
* [stepA, { name: "step1", _syntheticName: "child.step1", ... }]
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function denamespaceSyntheticSteps(steps) {
|
|
30
|
+
return steps.map((step) => {
|
|
31
|
+
// If this step has a workflowPath, it's a synthetic step from a composed workflow
|
|
32
|
+
if (step.workflowPath && step.workflowPath.length > 0) {
|
|
33
|
+
// Extract the real step name from the namespaced name
|
|
34
|
+
// e.g., "subjectIdentification.subjectIdentificationMerge" -> "subjectIdentificationMerge"
|
|
35
|
+
// e.g., "parent.child.stepName" -> "stepName"
|
|
36
|
+
const parts = step.name.split(".");
|
|
37
|
+
const realName = parts[parts.length - 1];
|
|
38
|
+
// Return a new step object with the real name, preserving needs/provides
|
|
39
|
+
return {
|
|
40
|
+
...step,
|
|
41
|
+
name: realName,
|
|
42
|
+
// Keep the synthetic name for debugging
|
|
43
|
+
_syntheticName: step.name,
|
|
44
|
+
_workflowPath: step.workflowPath,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return step;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/internal/async/build-scripts/utils/common.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAwBH,8DAwBC;AA5CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,yBAAyB,CACvC,KAAqC;IAErC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QAC7B,kFAAkF;QAClF,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,sDAAsD;YACtD,2FAA2F;YAC3F,8CAA8C;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEzC,yEAAyE;YACzE,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,QAAQ;gBACd,wCAAwC;gBACxC,cAAc,EAAE,IAAI,CAAC,IAAI;gBACzB,aAAa,EAAE,IAAI,CAAC,YAAY;aACjC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|