@db-lyon/flowkit 0.3.0 → 0.4.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.
- package/README.md +283 -0
- package/dist/flow/runner.d.ts.map +1 -1
- package/dist/flow/runner.js +3 -1
- package/dist/flow/runner.js.map +1 -1
- package/dist/task/base-task.d.ts +13 -0
- package/dist/task/base-task.d.ts.map +1 -1
- package/dist/task/base-task.js +21 -0
- package/dist/task/base-task.js.map +1 -1
- package/dist/task/registry.d.ts +22 -0
- package/dist/task/registry.d.ts.map +1 -1
- package/dist/task/registry.js +32 -0
- package/dist/task/registry.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# @db-lyon/flowkit
|
|
2
|
+
|
|
3
|
+
YAML-configured task and flow orchestration engine for Node.js.
|
|
4
|
+
|
|
5
|
+
Define reusable **tasks** and compose them into **flows** using declarative YAML. Flowkit handles config layering, task resolution, sequential execution, nested flows, lifecycle hooks, and more.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @db-lyon/flowkit
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requires Node.js >= 20.
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
**1. Define your config** (`pipeline.yml`):
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
tasks:
|
|
21
|
+
build:
|
|
22
|
+
class_path: tasks.Build
|
|
23
|
+
description: Compile the project
|
|
24
|
+
options:
|
|
25
|
+
target: production
|
|
26
|
+
|
|
27
|
+
test:
|
|
28
|
+
class_path: tasks.Test
|
|
29
|
+
description: Run the test suite
|
|
30
|
+
|
|
31
|
+
deploy:
|
|
32
|
+
class_path: tasks.Deploy
|
|
33
|
+
description: Deploy artifacts
|
|
34
|
+
|
|
35
|
+
flows:
|
|
36
|
+
ci:
|
|
37
|
+
description: Build, test, deploy
|
|
38
|
+
steps:
|
|
39
|
+
1:
|
|
40
|
+
task: build
|
|
41
|
+
2:
|
|
42
|
+
task: test
|
|
43
|
+
3:
|
|
44
|
+
task: deploy
|
|
45
|
+
options:
|
|
46
|
+
environment: staging
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**2. Create a task** (`tasks/Build.ts`):
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { BaseTask, type TaskResult } from '@db-lyon/flowkit';
|
|
53
|
+
|
|
54
|
+
interface BuildOptions {
|
|
55
|
+
target: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default class Build extends BaseTask<BuildOptions> {
|
|
59
|
+
get taskName() { return 'build'; }
|
|
60
|
+
|
|
61
|
+
protected validate() {
|
|
62
|
+
if (!this.options.target) throw new Error('target is required');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async execute(): Promise<TaskResult> {
|
|
66
|
+
this.logger.info(`Building for ${this.options.target}`);
|
|
67
|
+
// ... do work ...
|
|
68
|
+
return { success: true, data: { target: this.options.target } };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**3. Run it**:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import {
|
|
77
|
+
loadConfig,
|
|
78
|
+
EngineConfigSchema,
|
|
79
|
+
TaskRegistry,
|
|
80
|
+
FlowRunner,
|
|
81
|
+
} from '@db-lyon/flowkit';
|
|
82
|
+
|
|
83
|
+
const { config } = loadConfig({
|
|
84
|
+
filename: 'pipeline.yml',
|
|
85
|
+
schema: EngineConfigSchema,
|
|
86
|
+
configDir: './config',
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const registry = new TaskRegistry();
|
|
90
|
+
// Tasks with class_path like "tasks.Build" are resolved dynamically
|
|
91
|
+
// from the filesystem (tasks/Build.ts), or register them explicitly:
|
|
92
|
+
// registry.register('build', Build);
|
|
93
|
+
|
|
94
|
+
const runner = new FlowRunner({
|
|
95
|
+
tasks: config.tasks,
|
|
96
|
+
flows: config.flows,
|
|
97
|
+
registry,
|
|
98
|
+
context: { logger: console },
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const result = await runner.run({ flowName: 'ci' });
|
|
102
|
+
console.log(result.success); // true
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
### YAML-driven configuration
|
|
108
|
+
|
|
109
|
+
Define tasks and flows in YAML. Each task references a `class_path` (resolved to a file on disk or a registered constructor) and can carry default `options`. Flows are ordered sequences of steps that reference tasks or other flows.
|
|
110
|
+
|
|
111
|
+
### Config layering
|
|
112
|
+
|
|
113
|
+
The config loader merges multiple YAML files in order:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
defaults (code) → pipeline.yml → pipeline.staging.yml → pipeline.local.yml
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const { config } = loadConfig({
|
|
121
|
+
filename: 'pipeline.yml',
|
|
122
|
+
schema: EngineConfigSchema,
|
|
123
|
+
env: 'staging', // loads pipeline.staging.yml overlay
|
|
124
|
+
configDir: './config',
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Environment overlays and `.local.yml` files let you customize per-environment or per-developer without touching the base config. See [docs/configuration.md](docs/configuration.md).
|
|
129
|
+
|
|
130
|
+
### Custom tasks
|
|
131
|
+
|
|
132
|
+
Extend `BaseTask` to create your own tasks. The lifecycle is: `validate()` → `execute()` → result with timing. Exceptions are caught and returned as `{ success: false }` automatically.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
class MyTask extends BaseTask<MyOptions> {
|
|
136
|
+
get taskName() { return 'my_task'; }
|
|
137
|
+
async execute(): Promise<TaskResult> {
|
|
138
|
+
return { success: true };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
See [docs/custom-tasks.md](docs/custom-tasks.md).
|
|
144
|
+
|
|
145
|
+
### Built-in ShellTask
|
|
146
|
+
|
|
147
|
+
Run shell commands without writing a custom task class:
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
tasks:
|
|
151
|
+
lint:
|
|
152
|
+
class_path: shell
|
|
153
|
+
options:
|
|
154
|
+
command: npm run lint
|
|
155
|
+
cwd: /path/to/project
|
|
156
|
+
timeout: 60000
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Register it in your registry:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { ShellTask } from '@db-lyon/flowkit';
|
|
163
|
+
registry.register('shell', ShellTask as any);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Nested flows
|
|
167
|
+
|
|
168
|
+
A step can reference another flow instead of a task:
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
flows:
|
|
172
|
+
ci:
|
|
173
|
+
description: CI pipeline
|
|
174
|
+
steps:
|
|
175
|
+
1: { task: build }
|
|
176
|
+
2: { task: test }
|
|
177
|
+
|
|
178
|
+
release:
|
|
179
|
+
description: Full release
|
|
180
|
+
steps:
|
|
181
|
+
1: { flow: ci }
|
|
182
|
+
2: { task: deploy }
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Skip steps
|
|
186
|
+
|
|
187
|
+
Skip by task name or step number:
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
await runner.run({ flowName: 'release', skip: ['deploy'] });
|
|
191
|
+
await runner.run({ flowName: 'release', skip: ['2'] });
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Or mark a step as permanently skipped in YAML:
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
steps:
|
|
198
|
+
3:
|
|
199
|
+
task: None
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Plan mode
|
|
203
|
+
|
|
204
|
+
Preview the execution plan without running anything:
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
const result = await runner.run({ flowName: 'ci', plan: true });
|
|
208
|
+
result.steps.forEach(s =>
|
|
209
|
+
console.log(`${s.stepNumber}: [${s.type}] ${s.name}${s.skipped ? ' (skip)' : ''}`)
|
|
210
|
+
);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Lifecycle hooks
|
|
214
|
+
|
|
215
|
+
Attach hooks to observe or react to flow execution:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const runner = new FlowRunner({
|
|
219
|
+
// ...
|
|
220
|
+
hooks: {
|
|
221
|
+
beforeRun: async (flowName, plan) => { /* ... */ },
|
|
222
|
+
beforeStep: async (step) => { /* ... */ },
|
|
223
|
+
afterStep: async (step, result) => { /* ... */ },
|
|
224
|
+
onStepError: async (step, error, completed) => { /* ... */ },
|
|
225
|
+
afterRun: async (result) => { /* ... */ },
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`beforeRun`/`afterRun` fire once for the top-level flow. `beforeStep`/`afterStep` fire for every step including those inside nested flows.
|
|
231
|
+
|
|
232
|
+
### DAG utilities
|
|
233
|
+
|
|
234
|
+
Topological sort with cycle and missing-dependency detection:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
import { topologicalSort } from '@db-lyon/flowkit';
|
|
238
|
+
|
|
239
|
+
const sorted = topologicalSort([
|
|
240
|
+
{ id: 'a', dependencies: [], data: null },
|
|
241
|
+
{ id: 'b', dependencies: ['a'], data: null },
|
|
242
|
+
{ id: 'c', dependencies: ['a', 'b'], data: null },
|
|
243
|
+
]);
|
|
244
|
+
// sorted: [a, b, c]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Throws `CircularDependencyError` or `MissingDependencyError` on invalid graphs.
|
|
248
|
+
|
|
249
|
+
### Logger interface
|
|
250
|
+
|
|
251
|
+
Flowkit accepts any logger that implements the `Logger` interface (compatible with pino, winston, etc.):
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
interface Logger {
|
|
255
|
+
debug(...args: unknown[]): void;
|
|
256
|
+
info(...args: unknown[]): void;
|
|
257
|
+
warn(...args: unknown[]): void;
|
|
258
|
+
error(...args: unknown[]): void;
|
|
259
|
+
child(bindings: Record<string, unknown>): Logger;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Pass it via the task context or flow runner config. A `noopLogger` is used by default.
|
|
264
|
+
|
|
265
|
+
## Sub-path exports
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { loadConfig } from '@db-lyon/flowkit/config';
|
|
269
|
+
import { BaseTask, TaskRegistry } from '@db-lyon/flowkit/task';
|
|
270
|
+
import { FlowRunner } from '@db-lyon/flowkit/flow';
|
|
271
|
+
import { topologicalSort } from '@db-lyon/flowkit/dag';
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Docs
|
|
275
|
+
|
|
276
|
+
- [Getting started](docs/getting-started.md) — step-by-step setup guide
|
|
277
|
+
- [Custom tasks](docs/custom-tasks.md) — writing and registering tasks
|
|
278
|
+
- [Configuration](docs/configuration.md) — YAML schema, layering, deep merge
|
|
279
|
+
- [API reference](docs/api-reference.md) — full type and function reference
|
|
280
|
+
|
|
281
|
+
## License
|
|
282
|
+
|
|
283
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAY,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,QAAQ,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,qEAAqE;IACrE,UAAU,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,8BAA8B;IAC9B,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,iDAAiD;IACjD,WAAW,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAK;gBAET,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/flow/runner.js
CHANGED
|
@@ -15,8 +15,10 @@ export class FlowRunner {
|
|
|
15
15
|
this.tasks = config.tasks;
|
|
16
16
|
this.flows = config.flows;
|
|
17
17
|
this.registry = config.registry;
|
|
18
|
-
this.ctx = config.context;
|
|
19
18
|
this.hooks = config.hooks ?? {};
|
|
19
|
+
// Inject registry into context so tasks can resolve/call other tasks.
|
|
20
|
+
// Spread to avoid mutating the caller's context object.
|
|
21
|
+
this.ctx = { ...config.context, registry: config.registry };
|
|
20
22
|
}
|
|
21
23
|
async run(options) {
|
|
22
24
|
this.runDepth++;
|
package/dist/flow/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA8D1C,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,OAAO,UAAU;IACb,MAAM,CAAS;IACf,KAAK,CAAiC;IACtC,KAAK,CAAiC;IACtC,QAAQ,CAAe;IACvB,GAAG,CAAc;IACjB,KAAK,CAAkB;IACvB,QAAQ,GAAG,CAAC,CAAC;IAErB,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/task/base-task.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Logger } from '../logger.js';
|
|
2
|
+
import type { TaskRegistry } from './registry.js';
|
|
2
3
|
export interface TaskContext {
|
|
3
4
|
logger?: Logger;
|
|
5
|
+
registry?: TaskRegistry;
|
|
4
6
|
[key: string]: unknown;
|
|
5
7
|
}
|
|
6
8
|
export interface TaskResult {
|
|
@@ -18,6 +20,17 @@ export declare abstract class BaseTask<TOpts = Record<string, unknown>> {
|
|
|
18
20
|
abstract execute(): Promise<TaskResult>;
|
|
19
21
|
/** Override for option validation — called before execute(). */
|
|
20
22
|
protected validate(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve another task by name from the registry.
|
|
25
|
+
* Returns an unexecuted task instance — call `.run()` on it yourself
|
|
26
|
+
* when you need to inspect or configure the task before running.
|
|
27
|
+
*/
|
|
28
|
+
protected resolve<T extends BaseTask = BaseTask>(taskName: string, options?: Record<string, unknown>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve and execute another task by name in a single call.
|
|
31
|
+
* The resolved task shares this task's context (bridge, project, etc.).
|
|
32
|
+
*/
|
|
33
|
+
protected call(taskName: string, options?: Record<string, unknown>): Promise<TaskResult>;
|
|
21
34
|
/**
|
|
22
35
|
* Lifecycle wrapper: validate → execute → return result.
|
|
23
36
|
* Catches exceptions and returns `{ success: false }` instead of throwing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-task.d.ts","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"base-task.d.ts","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8BAAsB,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1D,SAAS,CAAC,GAAG,EAAE,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,KAAK;IAJ1B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGb,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,KAAK;IAM1B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC;IAEhC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAEvC,gEAAgE;IAChE,SAAS,CAAC,QAAQ,IAAI,IAAI;IAE1B;;;;OAIG;cACa,OAAO,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EACnD,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC;IAWb;;;OAGG;cACa,IAAI,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,UAAU,CAAC;IAKtB;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;CA2BjC"}
|
package/dist/task/base-task.js
CHANGED
|
@@ -11,6 +11,27 @@ export class BaseTask {
|
|
|
11
11
|
}
|
|
12
12
|
/** Override for option validation — called before execute(). */
|
|
13
13
|
validate() { }
|
|
14
|
+
/**
|
|
15
|
+
* Resolve another task by name from the registry.
|
|
16
|
+
* Returns an unexecuted task instance — call `.run()` on it yourself
|
|
17
|
+
* when you need to inspect or configure the task before running.
|
|
18
|
+
*/
|
|
19
|
+
async resolve(taskName, options) {
|
|
20
|
+
const registry = this.ctx.registry;
|
|
21
|
+
if (!registry) {
|
|
22
|
+
throw new Error(`Cannot resolve task "${taskName}" — no registry in context. ` +
|
|
23
|
+
'Tasks can only resolve other tasks when run via FlowRunner.');
|
|
24
|
+
}
|
|
25
|
+
return registry.create(taskName, this.ctx, options ?? {});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve and execute another task by name in a single call.
|
|
29
|
+
* The resolved task shares this task's context (bridge, project, etc.).
|
|
30
|
+
*/
|
|
31
|
+
async call(taskName, options) {
|
|
32
|
+
const task = await this.resolve(taskName, options);
|
|
33
|
+
return task.run();
|
|
34
|
+
}
|
|
14
35
|
/**
|
|
15
36
|
* Lifecycle wrapper: validate → execute → return result.
|
|
16
37
|
* Catches exceptions and returns `{ success: false }` instead of throwing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-task.js","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"base-task.js","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgB1C,MAAM,OAAgB,QAAQ;IAIhB;IACA;IAJF,MAAM,CAAS;IAEzB,YACY,GAAgB,EAChB,OAAc;QADd,QAAG,GAAH,GAAG,CAAa;QAChB,YAAO,GAAP,OAAO,CAAO;QAExB,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAMD,gEAAgE;IACtD,QAAQ,KAAU,CAAC;IAE7B;;;;OAIG;IACO,KAAK,CAAC,OAAO,CACrB,QAAgB,EAChB,OAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,8BAA8B;gBAC5D,6DAA6D,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAe,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,IAAI,CAClB,QAAgB,EAChB,OAAiC;QAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG;QACP,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhF,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EACtD,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CACnC,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAExE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChE,QAAQ;aACT,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/dist/task/registry.d.ts
CHANGED
|
@@ -19,6 +19,28 @@ export declare class TaskRegistry {
|
|
|
19
19
|
resolve(classPathOrName: string): Promise<TaskConstructor>;
|
|
20
20
|
/** Resolve + instantiate in one call. */
|
|
21
21
|
create(classPathOrName: string, ctx: TaskContext, options: Record<string, unknown>): Promise<BaseTask>;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap an existing registered task with a decorator class.
|
|
24
|
+
*
|
|
25
|
+
* The `wrapper` factory receives the original constructor and must return
|
|
26
|
+
* a new constructor — typically a subclass that calls `super.execute()`.
|
|
27
|
+
* Multiple wraps compose: each layer sees the previously wrapped version
|
|
28
|
+
* as its `Original`.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* registry.wrap('asset.list', (Original) => {
|
|
32
|
+
* return class extends Original {
|
|
33
|
+
* get taskName() { return 'asset.list:filtered'; }
|
|
34
|
+
* async execute() {
|
|
35
|
+
* const result = await super.execute();
|
|
36
|
+
* // post-process result …
|
|
37
|
+
* return result;
|
|
38
|
+
* }
|
|
39
|
+
* };
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
wrap(name: string, wrapper: (Original: TaskConstructor) => TaskConstructor): this;
|
|
22
44
|
/** Return all registered names and class paths. */
|
|
23
45
|
listRegistered(): string[];
|
|
24
46
|
private loadDynamic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE,yCAAyC;IACnC,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE,yCAAyC;IACnC,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,IAAI;IAcjF,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
|
package/dist/task/registry.js
CHANGED
|
@@ -44,6 +44,38 @@ export class TaskRegistry {
|
|
|
44
44
|
const TaskClass = await this.resolve(classPathOrName);
|
|
45
45
|
return new TaskClass(ctx, options);
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Wrap an existing registered task with a decorator class.
|
|
49
|
+
*
|
|
50
|
+
* The `wrapper` factory receives the original constructor and must return
|
|
51
|
+
* a new constructor — typically a subclass that calls `super.execute()`.
|
|
52
|
+
* Multiple wraps compose: each layer sees the previously wrapped version
|
|
53
|
+
* as its `Original`.
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* registry.wrap('asset.list', (Original) => {
|
|
57
|
+
* return class extends Original {
|
|
58
|
+
* get taskName() { return 'asset.list:filtered'; }
|
|
59
|
+
* async execute() {
|
|
60
|
+
* const result = await super.execute();
|
|
61
|
+
* // post-process result …
|
|
62
|
+
* return result;
|
|
63
|
+
* }
|
|
64
|
+
* };
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
wrap(name, wrapper) {
|
|
69
|
+
const original = this.nameMap.get(name) ?? this.classPathMap.get(name);
|
|
70
|
+
if (!original) {
|
|
71
|
+
throw new Error(`Cannot wrap task "${name}" — not found in registry. ` +
|
|
72
|
+
`Registered: ${this.listRegistered().join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
const wrapped = wrapper(original);
|
|
75
|
+
// Always write to nameMap so subsequent resolve() finds it
|
|
76
|
+
this.nameMap.set(name, wrapped);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
47
79
|
/** Return all registered names and class paths. */
|
|
48
80
|
listRegistered() {
|
|
49
81
|
return [...new Set([...this.nameMap.keys(), ...this.classPathMap.keys()])];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AAO5D,MAAM,OAAO,YAAY;IACf,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7C,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAY,EAAE,IAAqB;QAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,iBAAiB,CAAC,SAAiB,EAAE,IAAqB;QACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,WAAW,CAAC,OAAwC;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,kBAAkB,CAAC,OAAwC;QACzD,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,eAAuB;QACnC,MAAM,OAAO,GACX,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9E,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAE5B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,MAAM,CACV,eAAuB,EACvB,GAAgB,EAChB,OAAgC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtD,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAY,EAAE,OAAuD;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,6BAA6B;gBACpD,eAAe,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpD,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,2DAA2D;QAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,8EAA8E;IAC9E,6DAA6D;IAC7D,8EAA8E;IAEtE,KAAK,CAAC,WAAW,CAAC,SAAiB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,YAAY,GAAkB,IAAI,CAAC;QAEvC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,YAAY,GAAG,SAAS,CAAC;gBACzB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,wBAAwB,SAAS,gBAAgB;gBAC/C,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/C,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,WAAW,YAAY,sDAAsD;gBAC3E,aAAa,QAAQ,GAAG,CAC3B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,YAAY,QAAQ,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,oBAAoB,YAAY,4BAA4B,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,SAA4B,CAAC,CAAC;QAC/D,OAAO,SAA4B,CAAC;IACtC,CAAC;IAEO,qBAAqB,CAAC,SAAiB;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,OAAO;YACL,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,KAAK,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,KAAK,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,WAAW,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,WAAW,CAAC;SAC1C,CAAC;IACJ,CAAC;CACF"}
|