@o/cli 0.0.0-bootstrap.0 → 0.16.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.
@@ -0,0 +1,193 @@
1
+ // matches `o run-all ...` with an optional `bun` prefix
2
+ const O_RUN_ALL_RE = /^(?:bun\s+)?o\s+run-all\s+(.+)$/;
3
+ /**
4
+ * parse an o run-all command string, extracting script names and flags
5
+ * returns null if the command is not an o run-all pattern
6
+ */
7
+ function parseRunAll(command) {
8
+ const match = command.match(O_RUN_ALL_RE);
9
+ if (!match)
10
+ return null;
11
+ const argsPart = match[2];
12
+ const args = argsPart.split(/\s+/);
13
+ const scriptNames = [];
14
+ let noRoot = false;
15
+ for (const arg of args) {
16
+ if (arg === '--no-root') {
17
+ noRoot = true;
18
+ continue;
19
+ }
20
+ if (arg.startsWith('--'))
21
+ continue;
22
+ scriptNames.push(arg);
23
+ }
24
+ return { scriptNames, noRoot };
25
+ }
26
+ /**
27
+ * split a shell command on &&, ||, ; while respecting quotes.
28
+ * returns null if no operators found (command is not a compound).
29
+ */
30
+ export function splitCompound(command) {
31
+ const segments = [];
32
+ const operators = [];
33
+ let current = '';
34
+ let inSingle = false;
35
+ let inDouble = false;
36
+ let i = 0;
37
+ while (i < command.length) {
38
+ const ch = command[i];
39
+ if (ch === "'" && !inDouble) {
40
+ inSingle = !inSingle;
41
+ current += ch;
42
+ i++;
43
+ }
44
+ else if (ch === '"' && !inSingle) {
45
+ inDouble = !inDouble;
46
+ current += ch;
47
+ i++;
48
+ }
49
+ else if (ch === '\\' && !inSingle) {
50
+ current += ch + (command[i + 1] || '');
51
+ i += 2;
52
+ }
53
+ else if (!inSingle && !inDouble) {
54
+ if (command[i] === '&' && command[i + 1] === '&') {
55
+ segments.push(current.trim());
56
+ operators.push('&&');
57
+ current = '';
58
+ i += 2;
59
+ }
60
+ else if (command[i] === '|' && command[i + 1] === '|') {
61
+ segments.push(current.trim());
62
+ operators.push('||');
63
+ current = '';
64
+ i += 2;
65
+ }
66
+ else if (command[i] === ';') {
67
+ segments.push(current.trim());
68
+ operators.push(';');
69
+ current = '';
70
+ i++;
71
+ }
72
+ else {
73
+ current += ch;
74
+ i++;
75
+ }
76
+ }
77
+ else {
78
+ current += ch;
79
+ i++;
80
+ }
81
+ }
82
+ if (current.trim())
83
+ segments.push(current.trim());
84
+ if (operators.length === 0)
85
+ return null;
86
+ return { segments, operators };
87
+ }
88
+ /**
89
+ * match "bun <name> [args...]" where <name> is a package.json script.
90
+ * returns the script name and any trailing args, or null if no match.
91
+ */
92
+ function matchBunRun(segment, scripts) {
93
+ const parts = segment.trim().split(/\s+/);
94
+ if (parts[0] !== 'bun' || parts.length < 2)
95
+ return null;
96
+ const name = parts[1];
97
+ if (name.startsWith('-'))
98
+ return null;
99
+ if (scripts[name] === undefined)
100
+ return null;
101
+ return { name, args: parts.slice(2) };
102
+ }
103
+ /**
104
+ * recursively flatten script references into leaf commands.
105
+ * resolves o run-all chains AND shell compounds (&&, ;, ||).
106
+ */
107
+ export function flattenScripts(commands, packageJsonScripts, options) {
108
+ const runningScripts = new Set(options?.runningScripts ?? []);
109
+ const results = [];
110
+ function resolve(name, visited) {
111
+ if (runningScripts.has(name))
112
+ return;
113
+ const scriptCommand = packageJsonScripts[name];
114
+ // script doesn't exist in package.json - treat as raw command
115
+ if (scriptCommand === undefined) {
116
+ results.push({ name, command: name, isRaw: true });
117
+ return;
118
+ }
119
+ // cycle detected - emit as leaf to avoid infinite recursion
120
+ if (visited.has(name)) {
121
+ results.push({ name, command: scriptCommand, isRaw: false });
122
+ return;
123
+ }
124
+ // try to parse as o run-all
125
+ const parsed = parseRunAll(scriptCommand);
126
+ if (parsed) {
127
+ // --no-root means this will be handled by a separate o process
128
+ // scoped to workspace packages — don't resolve against root scripts
129
+ if (parsed.noRoot) {
130
+ results.push({ name, command: scriptCommand, isRaw: false });
131
+ return;
132
+ }
133
+ visited.add(name);
134
+ for (const childName of parsed.scriptNames) {
135
+ resolve(childName, visited);
136
+ }
137
+ return;
138
+ }
139
+ // try to parse as shell compound (&&, ;, ||)
140
+ const compound = splitCompound(scriptCommand);
141
+ if (compound) {
142
+ const resolvedSegments = [];
143
+ let deferredScripts;
144
+ for (let idx = 0; idx < compound.segments.length; idx++) {
145
+ const segment = compound.segments[idx];
146
+ const isLast = idx === compound.segments.length - 1;
147
+ const bunMatch = matchBunRun(segment, packageJsonScripts);
148
+ if (bunMatch) {
149
+ const innerCommand = packageJsonScripts[bunMatch.name];
150
+ const innerParsed = parseRunAll(innerCommand);
151
+ if (innerParsed && innerParsed.noRoot) {
152
+ // --no-root: keep as-is, will be handled by separate o process
153
+ resolvedSegments.push(segment);
154
+ }
155
+ else if (innerParsed && isLast) {
156
+ // last segment is an o run-all → defer its children for parallel spawn
157
+ deferredScripts = flattenScripts(innerParsed.scriptNames, packageJsonScripts, options);
158
+ }
159
+ else if (innerParsed && !isLast) {
160
+ // non-last segment is an o run-all — can't inline parallel, keep as bun run
161
+ resolvedSegments.push(segment);
162
+ }
163
+ else {
164
+ // simple script → inline its command with any extra args
165
+ const inlined = bunMatch.args.length
166
+ ? `${innerCommand} ${bunMatch.args.join(' ')}`
167
+ : innerCommand;
168
+ resolvedSegments.push(inlined);
169
+ }
170
+ }
171
+ else {
172
+ resolvedSegments.push(segment);
173
+ }
174
+ }
175
+ // reconstruct the compound from resolved segments
176
+ let reconstructed = resolvedSegments[0] || '';
177
+ for (let idx = 0; idx < compound.operators.length; idx++) {
178
+ if (idx < resolvedSegments.length - 1) {
179
+ reconstructed += ` ${compound.operators[idx]} ${resolvedSegments[idx + 1]}`;
180
+ }
181
+ }
182
+ results.push({ name, command: reconstructed, isRaw: false, deferredScripts });
183
+ return;
184
+ }
185
+ // leaf command - not a o run-all or compound
186
+ results.push({ name, command: scriptCommand, isRaw: false });
187
+ }
188
+ for (const cmd of commands) {
189
+ resolve(cmd, new Set());
190
+ }
191
+ return results;
192
+ }
193
+ //# sourceMappingURL=resolve-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-script.js","sourceRoot":"","sources":["../src/resolve-script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * @description Run multiple scripts in parallel
4
+ */
5
+ export interface RunParallelScriptsOptions {
6
+ commands: string[];
7
+ noRoot?: boolean;
8
+ flagsLast?: boolean;
9
+ runBun?: boolean;
10
+ watch?: boolean;
11
+ forwardArgs?: string[];
12
+ }
13
+ export declare function runParallelScripts(options: RunParallelScriptsOptions): Promise<void>;
14
+ export declare function parseRunArgs(args: string[]): RunParallelScriptsOptions;
15
+ //# sourceMappingURL=run-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-all.d.ts","sourceRoot":"","sources":["../src/run-all.ts"],"names":[],"mappings":";AAEA;;GAEG;AAmNH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAgRf;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,yBAAyB,CA4BtE"}
@@ -0,0 +1,405 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * @description Run multiple scripts in parallel
4
+ */
5
+ import { spawn } from 'node:child_process';
6
+ import fs from 'node:fs';
7
+ import { join, relative, resolve } from 'node:path';
8
+ import { handleProcessExit } from './handle-process-exit.js';
9
+ import { getIsExiting } from './process-state.js';
10
+ import { flattenScripts } from './resolve-script.js';
11
+ const colors = [
12
+ '\x1b[38;5;245m',
13
+ '\x1b[38;5;240m',
14
+ '\x1b[38;5;250m',
15
+ '\x1b[38;5;243m',
16
+ '\x1b[38;5;248m',
17
+ '\x1b[38;5;238m',
18
+ '\x1b[38;5;252m',
19
+ ];
20
+ const reset = '\x1b[0m';
21
+ // eslint-disable-next-line no-control-regex
22
+ const ansiPattern = /\x1b\[[0-9;]*m/g;
23
+ async function readPackageJson(directoryPath) {
24
+ try {
25
+ const packageJsonPath = join(directoryPath, 'package.json');
26
+ const content = await fs.promises.readFile(packageJsonPath, 'utf8');
27
+ return JSON.parse(content);
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ async function getWorkspacePatterns() {
34
+ try {
35
+ const packageJson = await readPackageJson('.');
36
+ if (!packageJson || !packageJson.workspaces)
37
+ return [];
38
+ return Array.isArray(packageJson.workspaces)
39
+ ? packageJson.workspaces
40
+ : packageJson.workspaces.packages || [];
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ async function hasPackageJson(path) {
47
+ try {
48
+ await fs.promises.access(join(path, 'package.json'));
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ async function findPackageJsonDirs(basePath, maxDepth = 3) {
56
+ if (maxDepth <= 0)
57
+ return [];
58
+ try {
59
+ const entries = await fs.promises.readdir(basePath, { withFileTypes: true });
60
+ const results = [];
61
+ if (await hasPackageJson(basePath)) {
62
+ results.push(basePath);
63
+ }
64
+ const subDirPromises = entries
65
+ .filter((entry) => entry.isDirectory() &&
66
+ !entry.name.startsWith('.') &&
67
+ entry.name !== 'node_modules')
68
+ .map(async (dir) => {
69
+ const path = join(basePath, dir.name);
70
+ return findPackageJsonDirs(path, maxDepth - 1);
71
+ });
72
+ const subdirResults = await Promise.all(subDirPromises);
73
+ return [...results, ...subdirResults.flat()];
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ async function findWorkspaceDirectories() {
80
+ const patterns = await getWorkspacePatterns();
81
+ if (!patterns.length)
82
+ return [];
83
+ const allPackageDirs = await findPackageJsonDirs('.');
84
+ const normalizePath = (path) => {
85
+ const normalized = path.replace(/\\/g, '/');
86
+ return normalized.startsWith('./') ? normalized.substring(2) : normalized;
87
+ };
88
+ return allPackageDirs.filter((dir) => {
89
+ if (dir === '.')
90
+ return false;
91
+ const relativePath = relative('.', dir);
92
+ return patterns.some((pattern) => {
93
+ const normalizedPattern = normalizePath(pattern);
94
+ const normalizedPath = normalizePath(relativePath);
95
+ if (normalizedPattern.endsWith('/*')) {
96
+ const prefix = normalizedPattern.slice(0, -1);
97
+ return normalizedPath.startsWith(prefix);
98
+ }
99
+ return (normalizedPath === normalizedPattern ||
100
+ normalizedPath.startsWith(normalizedPattern + '/'));
101
+ });
102
+ });
103
+ }
104
+ async function findAvailableScripts(directoryPath, scriptNames) {
105
+ const packageJson = await readPackageJson(directoryPath);
106
+ if (!packageJson || !packageJson.scripts) {
107
+ return [];
108
+ }
109
+ return scriptNames.filter((scriptName) => typeof packageJson.scripts?.[scriptName] === 'string');
110
+ }
111
+ async function mapWorkspacesToScripts(scriptNames) {
112
+ const workspaceDirs = await findWorkspaceDirectories();
113
+ const workspaceScriptMap = new Map();
114
+ for (const dir of workspaceDirs) {
115
+ const availableScripts = await findAvailableScripts(dir, scriptNames);
116
+ if (availableScripts.length > 0) {
117
+ const packageJson = await readPackageJson(dir);
118
+ const packageName = packageJson?.name || dir;
119
+ workspaceScriptMap.set(dir, {
120
+ scripts: availableScripts,
121
+ packageName,
122
+ });
123
+ }
124
+ }
125
+ return workspaceScriptMap;
126
+ }
127
+ function computeShortcuts(managedProcesses) {
128
+ const initials = managedProcesses.map((p) => {
129
+ const words = p.prefixLabel
130
+ .toLowerCase()
131
+ .split(/[^a-z]+/)
132
+ .filter(Boolean);
133
+ return words.map((w) => w[0]).join('');
134
+ });
135
+ const lengths = new Array(managedProcesses.length).fill(1);
136
+ for (let round = 0; round < 5; round++) {
137
+ const shortcuts = initials.map((init, i) => init.slice(0, lengths[i]) || init);
138
+ let hasCollision = false;
139
+ const groups = new Map();
140
+ for (let i = 0; i < shortcuts.length; i++) {
141
+ const key = shortcuts[i];
142
+ if (!groups.has(key))
143
+ groups.set(key, []);
144
+ groups.get(key).push(i);
145
+ }
146
+ for (const [, indices] of groups) {
147
+ if (indices.length <= 1)
148
+ continue;
149
+ hasCollision = true;
150
+ for (const idx of indices) {
151
+ lengths[idx]++;
152
+ }
153
+ }
154
+ if (!hasCollision) {
155
+ for (let i = 0; i < managedProcesses.length; i++) {
156
+ managedProcesses[i].shortcut = shortcuts[i];
157
+ }
158
+ return;
159
+ }
160
+ }
161
+ for (let i = 0; i < managedProcesses.length; i++) {
162
+ const sc = initials[i].slice(0, lengths[i]) || initials[i];
163
+ managedProcesses[i].shortcut = sc || String(i + 1);
164
+ }
165
+ }
166
+ export async function runParallelScripts(options) {
167
+ const { commands: runCommands, noRoot = false, flagsLast = false, runBun = false, watch = false, forwardArgs = [], } = options;
168
+ const MAX_RESTARTS = 3;
169
+ const parentRunningScripts = process.env.BUN_RUN_SCRIPTS
170
+ ? process.env.BUN_RUN_SCRIPTS.split(',')
171
+ : [];
172
+ const managedProcesses = [];
173
+ const { addChildProcess, exit } = handleProcessExit();
174
+ function getPrefix(index) {
175
+ const managed = managedProcesses[index];
176
+ if (!managed)
177
+ return '';
178
+ const color = colors[index % colors.length];
179
+ const sc = managed.shortcut || String(index + 1);
180
+ return `${color}${sc} ${managed.prefixLabel}${reset}`;
181
+ }
182
+ if (runCommands.length === 0) {
183
+ console.error('Please provide at least one script name to run');
184
+ exit(1);
185
+ return;
186
+ }
187
+ // spawns a single script process, optionally running a command directly via bash
188
+ const runScript = async (name, cwd = '.', prefixLabel = name, restarts = 0, extraArgs = [], managedIndex, directCommand, deferredChildren) => {
189
+ const index = managedIndex ?? managedProcesses.length;
190
+ const allRunningScripts = [...parentRunningScripts, ...runCommands].join(',');
191
+ let proc;
192
+ if (directCommand) {
193
+ // run the resolved command directly via bash, skipping the bun run layer
194
+ const command = extraArgs.length
195
+ ? `${directCommand} ${extraArgs.join(' ')}`
196
+ : directCommand;
197
+ proc = spawn('bash', ['-c', command], {
198
+ stdio: ['ignore', 'pipe', 'pipe'],
199
+ shell: false,
200
+ detached: true,
201
+ env: {
202
+ ...process.env,
203
+ FORCE_COLOR: '3',
204
+ BUN_RUN_PARENT_SCRIPT: name,
205
+ BUN_RUN_SCRIPTS: allRunningScripts,
206
+ O_CLI_SILENT: '1',
207
+ },
208
+ cwd: resolve(cwd),
209
+ });
210
+ }
211
+ else {
212
+ const runArgs = [
213
+ 'run',
214
+ '--silent',
215
+ runBun ? '--bun' : '',
216
+ name,
217
+ ...extraArgs,
218
+ ].filter(Boolean);
219
+ proc = spawn('bun', runArgs, {
220
+ stdio: ['ignore', 'pipe', 'pipe'],
221
+ shell: false,
222
+ detached: true,
223
+ env: {
224
+ ...process.env,
225
+ FORCE_COLOR: '3',
226
+ BUN_RUN_PARENT_SCRIPT: name,
227
+ BUN_RUN_SCRIPTS: allRunningScripts,
228
+ O_CLI_SILENT: '1',
229
+ },
230
+ cwd: resolve(cwd),
231
+ });
232
+ }
233
+ // when this process spawned — used to tell a crash-loop (rapid re-crashes)
234
+ // from an occasional crash after a long stable run.
235
+ const startedAt = Date.now();
236
+ const managed = {
237
+ proc,
238
+ name,
239
+ cwd,
240
+ prefixLabel,
241
+ extraArgs,
242
+ index,
243
+ shortcut: '',
244
+ };
245
+ if (managedIndex !== undefined) {
246
+ managedProcesses[managedIndex] = managed;
247
+ }
248
+ else {
249
+ managedProcesses.push(managed);
250
+ }
251
+ addChildProcess(proc);
252
+ proc.stdout.on('data', (data) => {
253
+ if (getIsExiting())
254
+ return;
255
+ const lines = data.toString().split('\n');
256
+ for (const line of lines) {
257
+ const stripped = line.replace(ansiPattern, '');
258
+ if (stripped.startsWith('$ '))
259
+ continue;
260
+ if (line)
261
+ console.info(`${getPrefix(index)} ${line}`);
262
+ }
263
+ });
264
+ proc.stderr.on('data', (data) => {
265
+ if (getIsExiting())
266
+ return;
267
+ const lines = data.toString().split('\n');
268
+ for (const line of lines) {
269
+ const stripped = line.replace(ansiPattern, '');
270
+ if (stripped.startsWith('$ '))
271
+ continue;
272
+ if (line)
273
+ console.error(`${getPrefix(index)} ${line}`);
274
+ }
275
+ });
276
+ proc.on('error', (error) => {
277
+ console.error(`${getPrefix(index)} Failed to start: ${error.message}`);
278
+ });
279
+ proc.on('close', (code, signal) => {
280
+ if (getIsExiting())
281
+ return;
282
+ if (code !== 0 || signal !== null) {
283
+ const result = signal ? `signal ${signal}` : `code ${code}`;
284
+ console.error(`${getPrefix(index)} Process exited with ${result}`);
285
+ if (watch) {
286
+ // a process that ran stably for a while before crashing isn't a
287
+ // crash-loop — reset the counter so an occasional crash over a long
288
+ // dev session recovers, instead of permanently giving up after
289
+ // MAX_RESTARTS lifetime hits. the cap then only catches RAPID re-crashes.
290
+ const ranMs = Date.now() - startedAt;
291
+ const STABLE_MS = 20_000;
292
+ const effectiveRestarts = ranMs >= STABLE_MS ? 0 : restarts;
293
+ if (effectiveRestarts < MAX_RESTARTS) {
294
+ const newRestarts = effectiveRestarts + 1;
295
+ // exponential backoff so a process crash-looping under CPU/memory
296
+ // pressure doesn't instantly re-boot and spin the box at 100% —
297
+ // wait 1s, 2s, 4s … capped at 30s before the next attempt.
298
+ const delayMs = Math.min(1_000 * 2 ** effectiveRestarts, 30_000);
299
+ console.info(`Restarting process ${name} (${newRestarts}/${MAX_RESTARTS}) in ${Math.round(delayMs / 1000)}s`);
300
+ setTimeout(() => {
301
+ if (getIsExiting())
302
+ return;
303
+ runScript(name, cwd, prefixLabel, newRestarts, extraArgs, index, directCommand, deferredChildren);
304
+ }, delayMs);
305
+ }
306
+ else {
307
+ console.error(`${getPrefix(index)} gave up after ${MAX_RESTARTS} rapid restarts`);
308
+ exit(1);
309
+ }
310
+ }
311
+ else {
312
+ exit(1);
313
+ }
314
+ }
315
+ else if (deferredChildren && deferredChildren.length > 0) {
316
+ // command succeeded — spawn deferred parallel scripts
317
+ for (const deferred of deferredChildren) {
318
+ runScript(deferred.name, '.', deferred.name, 0, [], undefined, !deferred.isRaw ? deferred.command : undefined);
319
+ }
320
+ }
321
+ });
322
+ return proc;
323
+ };
324
+ try {
325
+ if (runCommands.length > 0) {
326
+ const lastScript = runCommands[runCommands.length - 1];
327
+ if (!noRoot) {
328
+ // read package.json scripts for flattening
329
+ const packageJson = await readPackageJson('.');
330
+ const pkgScripts = packageJson?.scripts ?? {};
331
+ const filteredCommands = runCommands.filter((name) => !parentRunningScripts.includes(name));
332
+ // flatten o run-all chains into leaf commands
333
+ const flattened = flattenScripts(filteredCommands, pkgScripts, {
334
+ runningScripts: parentRunningScripts,
335
+ });
336
+ const lastLeaf = flattened[flattened.length - 1];
337
+ const scriptPromises = flattened.map((leaf) => {
338
+ const scriptArgs = !flagsLast || leaf === lastLeaf ? forwardArgs : [];
339
+ // known scripts: run command directly via bash (skip bun run layer)
340
+ // unknown scripts: fall through to bun run --silent
341
+ const directCommand = !leaf.isRaw ? leaf.command : undefined;
342
+ return runScript(leaf.name, '.', leaf.name, 0, scriptArgs, undefined, directCommand, leaf.deferredScripts);
343
+ });
344
+ await Promise.all(scriptPromises);
345
+ }
346
+ // workspace scripts still use bun run (they need workspace cwd)
347
+ const workspaceScriptMap = await mapWorkspacesToScripts(runCommands);
348
+ for (const [workspace, { scripts, packageName }] of workspaceScriptMap.entries()) {
349
+ const filteredScripts = scripts.filter((scriptName) => !parentRunningScripts.includes(scriptName));
350
+ const workspaceScriptPromises = filteredScripts.map((scriptName) => {
351
+ const scriptArgs = !flagsLast || scriptName === lastScript ? forwardArgs : [];
352
+ return runScript(scriptName, workspace, `${packageName} ${scriptName}`, 0, scriptArgs);
353
+ });
354
+ await Promise.all(workspaceScriptPromises);
355
+ }
356
+ }
357
+ if (managedProcesses.length === 0) {
358
+ exit(0);
359
+ }
360
+ else {
361
+ computeShortcuts(managedProcesses);
362
+ }
363
+ }
364
+ catch (error) {
365
+ console.error(`Error running scripts: ${error}`);
366
+ exit(1);
367
+ }
368
+ }
369
+ // --- CLI entry point (only runs when executed directly, not when imported) ---
370
+ const ownFlags = ['--no-root', '--bun', '--watch', '--flags=last'];
371
+ export function parseRunArgs(args) {
372
+ const commands = [];
373
+ const forwardArgs = [];
374
+ for (let i = 0; i < args.length; i++) {
375
+ const arg = args[i];
376
+ if (arg.startsWith('--')) {
377
+ if (ownFlags.includes(arg))
378
+ continue;
379
+ forwardArgs.push(arg);
380
+ const nextArg = args[i + 1];
381
+ if (nextArg && !nextArg.startsWith('--')) {
382
+ forwardArgs.push(nextArg);
383
+ i++;
384
+ }
385
+ }
386
+ else {
387
+ commands.push(arg);
388
+ }
389
+ }
390
+ return {
391
+ commands,
392
+ noRoot: args.includes('--no-root'),
393
+ runBun: args.includes('--bun'),
394
+ watch: args.includes('--watch'),
395
+ flagsLast: args.includes('--flags=last'),
396
+ forwardArgs,
397
+ };
398
+ }
399
+ if (typeof Bun !== 'undefined' && Bun.main === import.meta.path) {
400
+ runParallelScripts(parseRunArgs(process.argv.slice(2))).catch((error) => {
401
+ console.error(`Error running scripts: ${error}`);
402
+ process.exit(1);
403
+ });
404
+ }
405
+ //# sourceMappingURL=run-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-all.js","sourceRoot":"","sources":["../src/run-all.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,MAAM,GAAG;IACb,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;CACjB,CAAA;AAED,MAAM,KAAK,GAAG,SAAS,CAAA;AAEvB,4CAA4C;AAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAYrC,KAAK,UAAU,eAAe,CAAC,aAAqB;IAClD,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU;YAAE,OAAO,EAAE,CAAA;QAEtD,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;YAC1C,CAAC,CAAC,WAAW,CAAC,UAAU;YACxB,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAA;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,QAAQ,GAAG,CAAC;IAC/D,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAE5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,IAAI,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxB,CAAC;QAED,MAAM,cAAc,GAAG,OAAO;aAC3B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,WAAW,EAAE;YACnB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAC3B,KAAK,CAAC,IAAI,KAAK,cAAc,CAChC;aACA,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;YACrC,OAAO,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;QAEJ,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB;IACrC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAA;IAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAE/B,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAErD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC3C,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAC3E,CAAC,CAAA;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,KAAK,CAAA;QAE7B,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;YAChD,MAAM,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA;YAElD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC7C,OAAO,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC1C,CAAC;YACD,OAAO,CACL,cAAc,KAAK,iBAAiB;gBACpC,cAAc,CAAC,UAAU,CAAC,iBAAiB,GAAG,GAAG,CAAC,CACnD,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,aAAqB,EACrB,WAAqB;IAErB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAA;IAExD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,CACvB,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,QAAQ,CACtE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,WAAqB;IAErB,MAAM,aAAa,GAAG,MAAM,wBAAwB,EAAE,CAAA;IACtD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAsD,CAAA;IAExF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,gBAAgB,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;QAErE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,WAAW,GAAG,WAAW,EAAE,IAAI,IAAI,GAAG,CAAA;YAC5C,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC1B,OAAO,EAAE,gBAAgB;gBACzB,WAAW;aACZ,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,gBAAkC;IAC1D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW;aACxB,WAAW,EAAE;aACb,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CAAC,OAAO,CAAC,CAAA;QAClB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa,CAAA;IAEtE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;QAE9E,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,CAAA;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;gBAAE,SAAQ;YACjC,YAAY,GAAG,IAAI,CAAA;YACnB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAE,EAAE,CAAA;YACjB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,gBAAgB,CAAC,CAAC,CAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAA;YAC/C,CAAC;YACD,OAAM;QACR,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAA;QAC5D,gBAAgB,CAAC,CAAC,CAAE,CAAC,QAAQ,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,EACJ,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAG,KAAK,EACd,SAAS,GAAG,KAAK,EACjB,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,KAAK,EACb,WAAW,GAAG,EAAE,GACjB,GAAG,OAAO,CAAA;IAEX,MAAM,YAAY,GAAG,CAAC,CAAA;IAEtB,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;QACtD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;QACxC,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,gBAAgB,GAAqB,EAAE,CAAA;IAC7C,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAErD,SAAS,SAAS,CAAC,KAAa;QAC9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAA;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAChD,OAAO,GAAG,KAAK,GAAG,EAAE,IAAI,OAAO,CAAC,WAAW,GAAG,KAAK,EAAE,CAAA;IACvD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;QAC/D,IAAI,CAAC,CAAC,CAAC,CAAA;QACP,OAAM;IACR,CAAC;IAED,iFAAiF;IACjF,MAAM,SAAS,GAAG,KAAK,EACrB,IAAY,EACZ,GAAG,GAAG,GAAG,EACT,cAAsB,IAAI,EAC1B,QAAQ,GAAG,CAAC,EACZ,YAAsB,EAAE,EACxB,YAAqB,EACrB,aAAsB,EACtB,gBAAkE,EAClE,EAAE;QACF,MAAM,KAAK,GAAG,YAAY,IAAI,gBAAgB,CAAC,MAAM,CAAA;QAErD,MAAM,iBAAiB,GAAG,CAAC,GAAG,oBAAoB,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAE7E,IAAI,IAA8B,CAAA;QAElC,IAAI,aAAa,EAAE,CAAC;YAClB,yEAAyE;YACzE,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM;gBAC9B,CAAC,CAAC,GAAG,aAAa,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC3C,CAAC,CAAC,aAAa,CAAA;YACjB,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;gBACpC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,WAAW,EAAE,GAAG;oBAChB,qBAAqB,EAAE,IAAI;oBAC3B,eAAe,EAAE,iBAAiB;oBAClC,YAAY,EAAE,GAAG;iBACX;gBACR,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;aAClB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG;gBACd,KAAK;gBACL,UAAU;gBACV,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrB,IAAI;gBACJ,GAAG,SAAS;aACb,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACjB,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;gBAC3B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,IAAI;gBACd,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,WAAW,EAAE,GAAG;oBAChB,qBAAqB,EAAE,IAAI;oBAC3B,eAAe,EAAE,iBAAiB;oBAClC,YAAY,EAAE,GAAG;iBACX;gBACR,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;aAClB,CAAC,CAAA;QACJ,CAAC;QAED,2EAA2E;QAC3E,oDAAoD;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,MAAM,OAAO,GAAmB;YAC9B,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,WAAW;YACX,SAAS;YACT,KAAK;YACL,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,gBAAgB,CAAC,YAAY,CAAC,GAAG,OAAO,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,CAAA;QAErB,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,YAAY,EAAE;gBAAE,OAAM;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;gBAC9C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBACvC,IAAI,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;YACvD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,YAAY,EAAE;gBAAE,OAAM;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;gBAC9C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,SAAQ;gBACvC,IAAI,IAAI;oBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;YACxD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,YAAY,EAAE;gBAAE,OAAM;YAE1B,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAA;gBAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAA;gBAElE,IAAI,KAAK,EAAE,CAAC;oBACV,gEAAgE;oBAChE,oEAAoE;oBACpE,+DAA+D;oBAC/D,0EAA0E;oBAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;oBACpC,MAAM,SAAS,GAAG,MAAM,CAAA;oBACxB,MAAM,iBAAiB,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;oBAC3D,IAAI,iBAAiB,GAAG,YAAY,EAAE,CAAC;wBACrC,MAAM,WAAW,GAAG,iBAAiB,GAAG,CAAC,CAAA;wBACzC,kEAAkE;wBAClE,gEAAgE;wBAChE,2DAA2D;wBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,iBAAiB,EAAE,MAAM,CAAC,CAAA;wBAChE,OAAO,CAAC,IAAI,CACV,sBAAsB,IAAI,KAAK,WAAW,IAAI,YAAY,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAChG,CAAA;wBACD,UAAU,CAAC,GAAG,EAAE;4BACd,IAAI,YAAY,EAAE;gCAAE,OAAM;4BAC1B,SAAS,CACP,IAAI,EACJ,GAAG,EACH,WAAW,EACX,WAAW,EACX,SAAS,EACT,KAAK,EACL,aAAa,EACb,gBAAgB,CACjB,CAAA;wBACH,CAAC,EAAE,OAAO,CAAC,CAAA;oBACb,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CACX,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,YAAY,iBAAiB,CACnE,CAAA;wBACD,IAAI,CAAC,CAAC,CAAC,CAAA;oBACT,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,CAAC,CAAC,CAAA;gBACT,CAAC;YACH,CAAC;iBAAM,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,sDAAsD;gBACtD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;oBACxC,SAAS,CACP,QAAQ,CAAC,IAAI,EACb,GAAG,EACH,QAAQ,CAAC,IAAI,EACb,CAAC,EACD,EAAE,EACF,SAAS,EACT,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAC/C,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,IAAI,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,2CAA2C;gBAC3C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAA;gBAC9C,MAAM,UAAU,GAAG,WAAW,EAAE,OAAO,IAAI,EAAE,CAAA;gBAE7C,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CACzC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC/C,CAAA;gBAED,8CAA8C;gBAC9C,MAAM,SAAS,GAAG,cAAc,CAAC,gBAAgB,EAAE,UAAU,EAAE;oBAC7D,cAAc,EAAE,oBAAoB;iBACrC,CAAC,CAAA;gBAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChD,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC5C,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;oBACrE,oEAAoE;oBACpE,oDAAoD;oBACpD,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;oBAC5D,OAAO,SAAS,CACd,IAAI,CAAC,IAAI,EACT,GAAG,EACH,IAAI,CAAC,IAAI,EACT,CAAC,EACD,UAAU,EACV,SAAS,EACT,aAAa,EACb,IAAI,CAAC,eAAe,CACrB,CAAA;gBACH,CAAC,CAAC,CAAA;gBAEF,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;YACnC,CAAC;YAED,gEAAgE;YAChE,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAA;YAEpE,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjF,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CACpC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC3D,CAAA;gBACD,MAAM,uBAAuB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;oBACjE,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;oBAC7E,OAAO,SAAS,CACd,UAAU,EACV,SAAS,EACT,GAAG,WAAW,IAAI,UAAU,EAAE,EAC9B,CAAC,EACD,UAAU,CACX,CAAA;gBACH,CAAC,CAAC,CAAA;gBAEF,MAAM,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,CAAC,CAAA;QACT,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,CAAC,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;AAElE,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QAEpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAQ;YACpC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YAC3B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QACxC,WAAW;KACZ,CAAA;AACH,CAAC;AAED,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC/E,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACJ,CAAC"}