@oalacea/daemon 0.5.0 → 0.6.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/LICENSE +23 -23
- package/README.md +147 -141
- package/bin/Dockerfile +75 -74
- package/dist/cli/cli.d.ts +42 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +89 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/detect.command.d.ts +39 -0
- package/dist/cli/commands/detect.command.d.ts.map +1 -0
- package/dist/cli/commands/detect.command.js +111 -0
- package/dist/cli/commands/detect.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +11 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +41 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +111 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/test.command.d.ts +58 -0
- package/dist/cli/commands/test.command.d.ts.map +1 -0
- package/dist/cli/commands/test.command.js +180 -0
- package/dist/cli/commands/test.command.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config/daemon.config.d.ts +32 -0
- package/dist/core/config/daemon.config.d.ts.map +1 -0
- package/dist/core/config/daemon.config.js +83 -0
- package/dist/core/config/daemon.config.js.map +1 -0
- package/dist/core/config/index.d.ts +5 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +5 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/constants.d.ts +36 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +56 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/types/common.types.d.ts +250 -0
- package/dist/core/types/common.types.d.ts.map +1 -0
- package/dist/core/types/common.types.js +7 -0
- package/dist/core/types/common.types.js.map +1 -0
- package/dist/core/types/detection.types.d.ts +232 -0
- package/dist/core/types/detection.types.d.ts.map +1 -0
- package/dist/core/types/detection.types.js +22 -0
- package/dist/core/types/detection.types.js.map +1 -0
- package/dist/core/types/docker.types.d.ts +322 -0
- package/dist/core/types/docker.types.d.ts.map +1 -0
- package/dist/core/types/docker.types.js +7 -0
- package/dist/core/types/docker.types.js.map +1 -0
- package/dist/core/types/index.d.ts +11 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +7 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/project.types.d.ts +74 -0
- package/dist/core/types/project.types.d.ts.map +1 -0
- package/dist/core/types/project.types.js +7 -0
- package/dist/core/types/project.types.js.map +1 -0
- package/dist/core/types/shared.types.d.ts +118 -0
- package/dist/core/types/shared.types.d.ts.map +1 -0
- package/dist/core/types/shared.types.js +7 -0
- package/dist/core/types/shared.types.js.map +1 -0
- package/dist/core/types/test.types.d.ts +230 -0
- package/dist/core/types/test.types.d.ts.map +1 -0
- package/dist/core/types/test.types.js +7 -0
- package/dist/core/types/test.types.js.map +1 -0
- package/dist/services/detection/__tests__/framework-detector.test.d.ts +5 -0
- package/dist/services/detection/__tests__/framework-detector.test.d.ts.map +1 -0
- package/dist/services/detection/__tests__/framework-detector.test.js +52 -0
- package/dist/services/detection/__tests__/framework-detector.test.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts +179 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -0
- package/dist/services/detection/framework-detector.js +636 -0
- package/dist/services/detection/framework-detector.js.map +1 -0
- package/dist/services/detection/index.d.ts +10 -0
- package/dist/services/detection/index.d.ts.map +1 -0
- package/dist/services/detection/index.js +7 -0
- package/dist/services/detection/index.js.map +1 -0
- package/dist/services/docker/__tests__/docker-manager.test.d.ts +5 -0
- package/dist/services/docker/__tests__/docker-manager.test.d.ts.map +1 -0
- package/dist/services/docker/__tests__/docker-manager.test.js +67 -0
- package/dist/services/docker/__tests__/docker-manager.test.js.map +1 -0
- package/dist/services/docker/docker-manager.d.ts +157 -0
- package/dist/services/docker/docker-manager.d.ts.map +1 -0
- package/dist/services/docker/docker-manager.js +516 -0
- package/dist/services/docker/docker-manager.js.map +1 -0
- package/dist/services/docker/index.d.ts +9 -0
- package/dist/services/docker/index.d.ts.map +1 -0
- package/dist/services/docker/index.js +9 -0
- package/dist/services/docker/index.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/shared/errors/__tests__/base.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/base.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/base.error.test.js +61 -0
- package/dist/shared/errors/__tests__/base.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/command.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/command.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/command.error.test.js +62 -0
- package/dist/shared/errors/__tests__/command.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/file.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/file.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/file.error.test.js +75 -0
- package/dist/shared/errors/__tests__/file.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/index.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/index.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/index.test.js +62 -0
- package/dist/shared/errors/__tests__/index.test.js.map +1 -0
- package/dist/shared/errors/__tests__/validation.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/validation.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/validation.error.test.js +79 -0
- package/dist/shared/errors/__tests__/validation.error.test.js.map +1 -0
- package/dist/shared/errors/base.error.d.ts +54 -0
- package/dist/shared/errors/base.error.d.ts.map +1 -0
- package/dist/shared/errors/base.error.js +85 -0
- package/dist/shared/errors/base.error.js.map +1 -0
- package/dist/shared/errors/command.error.d.ts +58 -0
- package/dist/shared/errors/command.error.d.ts.map +1 -0
- package/dist/shared/errors/command.error.js +102 -0
- package/dist/shared/errors/command.error.js.map +1 -0
- package/dist/shared/errors/detection.error.d.ts +42 -0
- package/dist/shared/errors/detection.error.d.ts.map +1 -0
- package/dist/shared/errors/detection.error.js +82 -0
- package/dist/shared/errors/detection.error.js.map +1 -0
- package/dist/shared/errors/docker.error.d.ts +142 -0
- package/dist/shared/errors/docker.error.d.ts.map +1 -0
- package/dist/shared/errors/docker.error.js +172 -0
- package/dist/shared/errors/docker.error.js.map +1 -0
- package/dist/shared/errors/file.error.d.ts +66 -0
- package/dist/shared/errors/file.error.d.ts.map +1 -0
- package/dist/shared/errors/file.error.js +93 -0
- package/dist/shared/errors/file.error.js.map +1 -0
- package/dist/shared/errors/index.d.ts +56 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/errors/index.js +86 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/errors/validation.error.d.ts +67 -0
- package/dist/shared/errors/validation.error.d.ts.map +1 -0
- package/dist/shared/errors/validation.error.js +97 -0
- package/dist/shared/errors/validation.error.js.map +1 -0
- package/dist/shared/templates/index.d.ts +2 -0
- package/dist/shared/templates/index.d.ts.map +1 -0
- package/dist/shared/templates/index.js +2 -0
- package/dist/shared/templates/index.js.map +1 -0
- package/dist/shared/templates/prompt-builder.d.ts +2 -0
- package/dist/shared/templates/prompt-builder.d.ts.map +1 -0
- package/dist/shared/templates/prompt-builder.js +2 -0
- package/dist/shared/templates/prompt-builder.js.map +1 -0
- package/dist/shared/templates/template-engine.d.ts +2 -0
- package/dist/shared/templates/template-engine.d.ts.map +1 -0
- package/dist/shared/templates/template-engine.js +2 -0
- package/dist/shared/templates/template-engine.js.map +1 -0
- package/dist/shared/utils/__tests__/command-executor.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/command-executor.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/command-executor.test.js +45 -0
- package/dist/shared/utils/__tests__/command-executor.test.js.map +1 -0
- package/dist/shared/utils/__tests__/file-helper.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/file-helper.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/file-helper.test.js +71 -0
- package/dist/shared/utils/__tests__/file-helper.test.js.map +1 -0
- package/dist/shared/utils/__tests__/logger.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/logger.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/logger.test.js +83 -0
- package/dist/shared/utils/__tests__/logger.test.js.map +1 -0
- package/dist/shared/utils/command-executer.d.ts +2 -0
- package/dist/shared/utils/command-executer.d.ts.map +1 -0
- package/dist/shared/utils/command-executer.js +2 -0
- package/dist/shared/utils/command-executer.js.map +1 -0
- package/dist/shared/utils/command-executor.d.ts +255 -0
- package/dist/shared/utils/command-executor.d.ts.map +1 -0
- package/dist/shared/utils/command-executor.js +287 -0
- package/dist/shared/utils/command-executor.js.map +1 -0
- package/dist/shared/utils/file-helper.d.ts +86 -0
- package/dist/shared/utils/file-helper.d.ts.map +1 -0
- package/dist/shared/utils/file-helper.js +323 -0
- package/dist/shared/utils/file-helper.js.map +1 -0
- package/dist/shared/utils/index.d.ts +9 -0
- package/dist/shared/utils/index.d.ts.map +1 -0
- package/dist/shared/utils/index.js +9 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/logger.d.ts +163 -0
- package/dist/shared/utils/logger.d.ts.map +1 -0
- package/dist/shared/utils/logger.js +389 -0
- package/dist/shared/utils/logger.js.map +1 -0
- package/package.json +53 -34
- package/prompts/DEPS_EFFICIENCY.md +558 -558
- package/prompts/E2E.md +491 -491
- package/prompts/EXECUTE.md +1060 -1060
- package/prompts/INTEGRATION_API.md +484 -484
- package/prompts/INTEGRATION_DB.md +425 -425
- package/prompts/PERF_API.md +433 -433
- package/prompts/PERF_DB.md +430 -430
- package/prompts/PERF_FRONT.md +357 -357
- package/prompts/REMEDIATION.md +482 -482
- package/prompts/UNIT.md +260 -260
- package/templates/README.md +38 -38
- package/templates/k6/load-test.js +54 -54
- package/templates/playwright/e2e.spec.ts +61 -61
- package/templates/vitest/angular-component.test.ts +38 -38
- package/templates/vitest/api.test.ts +51 -51
- package/templates/vitest/component.test.ts +27 -27
- package/templates/vitest/hook.test.ts +36 -36
- package/templates/vitest/solid-component.test.ts +34 -34
- package/templates/vitest/svelte-component.test.ts +33 -33
- package/templates/vitest/vue-component.test.ts +39 -39
- package/CHANGELOG.md +0 -38
- package/agents/deps-analyzer.js +0 -366
- package/agents/detector.js +0 -570
- package/agents/fix-engine.js +0 -305
- package/agents/lighthouse-scanner.js +0 -405
- package/agents/perf-analyzer.js +0 -294
- package/agents/perf-front-analyzer.js +0 -229
- package/agents/test-generator.js +0 -387
- package/agents/test-runner.js +0 -318
- package/bin/cli.js +0 -449
- package/lib/config.js +0 -250
- package/lib/docker.js +0 -207
- package/lib/reporter.js +0 -297
- package/scripts/dev.js +0 -106
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Logger utility
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { Logger, createLogger, LogLevel } from '../logger.js';
|
|
6
|
+
describe('Logger', () => {
|
|
7
|
+
describe('constructor', () => {
|
|
8
|
+
it('should create logger with context', () => {
|
|
9
|
+
const logger = createLogger('TestLogger');
|
|
10
|
+
expect(logger).toBeInstanceOf(Logger);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
describe('debug', () => {
|
|
14
|
+
it('should have debug method', () => {
|
|
15
|
+
const logger = createLogger('TestLogger');
|
|
16
|
+
expect(typeof logger.debug).toBe('function');
|
|
17
|
+
// Should not throw
|
|
18
|
+
logger.debug('Debug message');
|
|
19
|
+
logger.debug('Debug with context', { key: 'value' });
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('info', () => {
|
|
23
|
+
it('should have info method', () => {
|
|
24
|
+
const logger = createLogger('TestLogger');
|
|
25
|
+
expect(typeof logger.info).toBe('function');
|
|
26
|
+
logger.info('Info message');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('warn', () => {
|
|
30
|
+
it('should have warn method', () => {
|
|
31
|
+
const logger = createLogger('TestLogger');
|
|
32
|
+
expect(typeof logger.warn).toBe('function');
|
|
33
|
+
logger.warn('Warning message');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('error', () => {
|
|
37
|
+
it('should have error method', () => {
|
|
38
|
+
const logger = createLogger('TestLogger');
|
|
39
|
+
expect(typeof logger.error).toBe('function');
|
|
40
|
+
logger.error('Error message');
|
|
41
|
+
const error = new Error('Test error');
|
|
42
|
+
logger.error('Error occurred', error);
|
|
43
|
+
logger.error('Error with context', { userId: '123' });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('success', () => {
|
|
47
|
+
it('should have success method', () => {
|
|
48
|
+
const logger = createLogger('TestLogger');
|
|
49
|
+
expect(typeof logger.success).toBe('function');
|
|
50
|
+
logger.success('Success message');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('createLogger', () => {
|
|
54
|
+
it('should create logger with context', () => {
|
|
55
|
+
const customLogger = createLogger('CustomContext');
|
|
56
|
+
expect(customLogger).toBeInstanceOf(Logger);
|
|
57
|
+
customLogger.info('Test');
|
|
58
|
+
});
|
|
59
|
+
it('should create logger with silent option', () => {
|
|
60
|
+
const silentLogger = createLogger('SilentLogger');
|
|
61
|
+
expect(silentLogger).toBeInstanceOf(Logger);
|
|
62
|
+
silentLogger.setLevel(LogLevel.SILENT);
|
|
63
|
+
silentLogger.info('This should not appear');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('setLevel', () => {
|
|
67
|
+
it('should have setLevel method', () => {
|
|
68
|
+
const logger = createLogger('TestLogger');
|
|
69
|
+
expect(typeof logger.setLevel).toBe('function');
|
|
70
|
+
logger.setLevel(LogLevel.SILENT);
|
|
71
|
+
logger.info('Silent info');
|
|
72
|
+
logger.setLevel(LogLevel.INFO);
|
|
73
|
+
logger.info('Visible info');
|
|
74
|
+
});
|
|
75
|
+
it('should have getLevel method', () => {
|
|
76
|
+
const logger = createLogger('TestLogger');
|
|
77
|
+
expect(typeof logger.getLevel).toBe('function');
|
|
78
|
+
const level = logger.getLevel();
|
|
79
|
+
expect(typeof level).toBe('number');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../../../src/shared/utils/__tests__/logger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executer.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/command-executer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executer.js","sourceRoot":"","sources":["../../../src/shared/utils/command-executer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Executor
|
|
3
|
+
*
|
|
4
|
+
* Utility for executing shell commands with:
|
|
5
|
+
* - Async execution using promisified exec
|
|
6
|
+
* - Timeout handling
|
|
7
|
+
* - Retry logic with exponential backoff
|
|
8
|
+
* - Environment and working directory control
|
|
9
|
+
* - Structured error handling
|
|
10
|
+
* - Execution metrics
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { CommandExecutor } from '@pamacea/daemon/utils';
|
|
15
|
+
*
|
|
16
|
+
* const executor = new CommandExecutor();
|
|
17
|
+
* const result = await executor.execute('npm test', {
|
|
18
|
+
* timeout: 30000,
|
|
19
|
+
* retries: 2
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* if (result.success) {
|
|
23
|
+
* console.log(result.data.stdout);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { CommandExecutionError } from '../errors/command.error.js';
|
|
28
|
+
import type { Result } from '../../core/types/common.types.js';
|
|
29
|
+
/**
|
|
30
|
+
* Options for command execution
|
|
31
|
+
*/
|
|
32
|
+
export interface CommandOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Maximum time to wait for command completion (milliseconds)
|
|
35
|
+
* @default 30000 (30 seconds)
|
|
36
|
+
*/
|
|
37
|
+
timeout?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Suppress output logging
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
silent?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Number of retry attempts on failure
|
|
45
|
+
* @default 0
|
|
46
|
+
*/
|
|
47
|
+
retries?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Working directory for command execution
|
|
50
|
+
* @default current working directory
|
|
51
|
+
*/
|
|
52
|
+
cwd?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Environment variables for command execution
|
|
55
|
+
* Merges with process.env
|
|
56
|
+
*/
|
|
57
|
+
env?: Record<string, string> | NodeJS.ProcessEnv;
|
|
58
|
+
/**
|
|
59
|
+
* Input to pass to stdin
|
|
60
|
+
*/
|
|
61
|
+
input?: string | Buffer | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Maximum buffer size for stdout/stderr
|
|
64
|
+
* @default 1024 * 1024 (1MB)
|
|
65
|
+
*/
|
|
66
|
+
maxBuffer?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Initial delay before first retry (milliseconds)
|
|
69
|
+
* @default 1000
|
|
70
|
+
*/
|
|
71
|
+
retryDelay?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Multiplier for exponential backoff
|
|
74
|
+
* @default 2
|
|
75
|
+
*/
|
|
76
|
+
retryBackoffMultiplier?: number;
|
|
77
|
+
/**
|
|
78
|
+
* Whether to reject on non-zero exit code
|
|
79
|
+
* @default true
|
|
80
|
+
*/
|
|
81
|
+
rejectOnError?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Result of command execution
|
|
85
|
+
*/
|
|
86
|
+
export interface CommandResult {
|
|
87
|
+
/**
|
|
88
|
+
* Whether the command succeeded (exit code 0)
|
|
89
|
+
*/
|
|
90
|
+
success: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Standard output from the command
|
|
93
|
+
*/
|
|
94
|
+
stdout: string;
|
|
95
|
+
/**
|
|
96
|
+
* Standard error output from the command
|
|
97
|
+
*/
|
|
98
|
+
stderr: string;
|
|
99
|
+
/**
|
|
100
|
+
* Process exit code
|
|
101
|
+
*/
|
|
102
|
+
exitCode: number | null;
|
|
103
|
+
/**
|
|
104
|
+
* Execution duration in milliseconds
|
|
105
|
+
*/
|
|
106
|
+
duration: number;
|
|
107
|
+
/**
|
|
108
|
+
* The command that was executed
|
|
109
|
+
*/
|
|
110
|
+
command: string;
|
|
111
|
+
/**
|
|
112
|
+
* Number of retry attempts used
|
|
113
|
+
*/
|
|
114
|
+
attempts: number;
|
|
115
|
+
/**
|
|
116
|
+
* Error if command failed (only present when success is false)
|
|
117
|
+
*/
|
|
118
|
+
error?: Error;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Options for parallel command execution
|
|
122
|
+
*/
|
|
123
|
+
export interface ParallelCommandOptions {
|
|
124
|
+
/**
|
|
125
|
+
* Maximum number of concurrent commands
|
|
126
|
+
* @default Infinity (no limit)
|
|
127
|
+
*/
|
|
128
|
+
concurrency?: number;
|
|
129
|
+
/**
|
|
130
|
+
* Whether to stop all commands on first failure
|
|
131
|
+
* @default false
|
|
132
|
+
*/
|
|
133
|
+
stopOnError?: boolean;
|
|
134
|
+
/**
|
|
135
|
+
* Global timeout for all commands (milliseconds)
|
|
136
|
+
*/
|
|
137
|
+
timeout?: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Single command definition for parallel execution
|
|
141
|
+
*/
|
|
142
|
+
export interface CommandDefinition {
|
|
143
|
+
/**
|
|
144
|
+
* Unique identifier for this command
|
|
145
|
+
*/
|
|
146
|
+
id: string;
|
|
147
|
+
/**
|
|
148
|
+
* Command string to execute
|
|
149
|
+
*/
|
|
150
|
+
command: string;
|
|
151
|
+
/**
|
|
152
|
+
* Options specific to this command
|
|
153
|
+
*/
|
|
154
|
+
options?: CommandOptions;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Result of parallel command execution
|
|
158
|
+
*/
|
|
159
|
+
export interface ParallelExecutionResult {
|
|
160
|
+
/**
|
|
161
|
+
* Map of command results by ID
|
|
162
|
+
*/
|
|
163
|
+
results: Map<string, CommandResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Overall success status (true if all commands succeeded)
|
|
166
|
+
*/
|
|
167
|
+
success: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Total execution duration in milliseconds
|
|
170
|
+
*/
|
|
171
|
+
duration: number;
|
|
172
|
+
/**
|
|
173
|
+
* Number of successful commands
|
|
174
|
+
*/
|
|
175
|
+
successful: number;
|
|
176
|
+
/**
|
|
177
|
+
* Number of failed commands
|
|
178
|
+
*/
|
|
179
|
+
failed: number;
|
|
180
|
+
/**
|
|
181
|
+
* Total number of commands
|
|
182
|
+
*/
|
|
183
|
+
total: number;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Command executor with async execution, retries, and parallel support
|
|
187
|
+
*/
|
|
188
|
+
export declare class CommandExecutor {
|
|
189
|
+
private readonly defaultOptions;
|
|
190
|
+
constructor(defaultOptions?: Partial<CommandOptions>);
|
|
191
|
+
/**
|
|
192
|
+
* Execute a single command
|
|
193
|
+
*
|
|
194
|
+
* @param command - Command string to execute
|
|
195
|
+
* @param options - Execution options
|
|
196
|
+
* @returns Result with stdout, stderr, exit code, and duration
|
|
197
|
+
*/
|
|
198
|
+
execute(command: string, options?: CommandOptions): Promise<Result<CommandResult, CommandExecutionError>>;
|
|
199
|
+
/**
|
|
200
|
+
* Execute multiple commands in parallel
|
|
201
|
+
*
|
|
202
|
+
* @param commands - Array of command definitions
|
|
203
|
+
* @param parallelOptions - Parallel execution options
|
|
204
|
+
* @returns Aggregate result of all commands
|
|
205
|
+
*/
|
|
206
|
+
executeParallel(commands: CommandDefinition[], parallelOptions?: ParallelCommandOptions): Promise<ParallelExecutionResult>;
|
|
207
|
+
/**
|
|
208
|
+
* Execute command and return Result type
|
|
209
|
+
*/
|
|
210
|
+
private executeSingle;
|
|
211
|
+
/**
|
|
212
|
+
* Create a promise that rejects after timeout
|
|
213
|
+
*/
|
|
214
|
+
private createTimeoutReject;
|
|
215
|
+
/**
|
|
216
|
+
* Sleep utility for retry delays
|
|
217
|
+
*/
|
|
218
|
+
private sleep;
|
|
219
|
+
/**
|
|
220
|
+
* Execute command synchronously (for compatibility only - not recommended)
|
|
221
|
+
*
|
|
222
|
+
* @deprecated Use execute() instead for async execution
|
|
223
|
+
*/
|
|
224
|
+
executeSync(_command: string, _options?: CommandOptions): Result<CommandResult, CommandExecutionError>;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Default singleton instance
|
|
228
|
+
*/
|
|
229
|
+
export declare const commandExecutor: CommandExecutor;
|
|
230
|
+
/**
|
|
231
|
+
* Convenience function to execute a command
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```ts
|
|
235
|
+
* import { executeCommand } from '@pamacea/daemon/utils';
|
|
236
|
+
*
|
|
237
|
+
* const result = await executeCommand('npm test', { timeout: 60000 });
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
export declare function executeCommand(command: string, options?: CommandOptions): Promise<Result<CommandResult, CommandExecutionError>>;
|
|
241
|
+
/**
|
|
242
|
+
* Convenience function to execute commands in parallel
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```ts
|
|
246
|
+
* import { executeCommandsParallel } from '@pamacea/daemon/utils';
|
|
247
|
+
*
|
|
248
|
+
* const result = await executeCommandsParallel([
|
|
249
|
+
* { id: 'test', command: 'npm test' },
|
|
250
|
+
* { id: 'lint', command: 'npm run lint' },
|
|
251
|
+
* ], { concurrency: 2 });
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
export declare function executeCommandsParallel(commands: CommandDefinition[], options?: ParallelCommandOptions): Promise<ParallelExecutionResult>;
|
|
255
|
+
//# sourceMappingURL=command-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/command-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Executor
|
|
3
|
+
*
|
|
4
|
+
* Utility for executing shell commands with:
|
|
5
|
+
* - Async execution using promisified exec
|
|
6
|
+
* - Timeout handling
|
|
7
|
+
* - Retry logic with exponential backoff
|
|
8
|
+
* - Environment and working directory control
|
|
9
|
+
* - Structured error handling
|
|
10
|
+
* - Execution metrics
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { CommandExecutor } from '@pamacea/daemon/utils';
|
|
15
|
+
*
|
|
16
|
+
* const executor = new CommandExecutor();
|
|
17
|
+
* const result = await executor.execute('npm test', {
|
|
18
|
+
* timeout: 30000,
|
|
19
|
+
* retries: 2
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* if (result.success) {
|
|
23
|
+
* console.log(result.data.stdout);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { exec } from 'node:child_process';
|
|
28
|
+
import { promisify } from 'node:util';
|
|
29
|
+
import { CommandExecutionError, CommandFailedError, CommandTimeoutError, CommandNotFoundError, } from '../errors/command.error.js';
|
|
30
|
+
const execAsync = promisify(exec);
|
|
31
|
+
/**
|
|
32
|
+
* Default configuration values
|
|
33
|
+
*/
|
|
34
|
+
const DEFAULTS = {
|
|
35
|
+
timeout: 30000, // 30 seconds
|
|
36
|
+
retries: 0,
|
|
37
|
+
silent: false,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Resolve error code to specific error type
|
|
41
|
+
*/
|
|
42
|
+
function resolveCommandError(command, exitCode, stdout, stderr, duration, options) {
|
|
43
|
+
// Check for ENOENT (command not found)
|
|
44
|
+
if (stderr.includes('not found') || stderr.includes('command not found') || stderr.includes('no such file')) {
|
|
45
|
+
return new CommandNotFoundError(command);
|
|
46
|
+
}
|
|
47
|
+
// Check timeout
|
|
48
|
+
if (options.timeout && duration >= options.timeout) {
|
|
49
|
+
return new CommandTimeoutError(command, options.timeout);
|
|
50
|
+
}
|
|
51
|
+
// Default to failed error
|
|
52
|
+
return new CommandFailedError(command, exitCode ?? -1, stdout, stderr);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Calculate delay with exponential backoff
|
|
56
|
+
*/
|
|
57
|
+
function calculateRetryDelay(attempt, baseDelay, multiplier) {
|
|
58
|
+
return Math.min(baseDelay * Math.pow(multiplier, attempt), 30000);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Command executor with async execution, retries, and parallel support
|
|
62
|
+
*/
|
|
63
|
+
export class CommandExecutor {
|
|
64
|
+
defaultOptions;
|
|
65
|
+
constructor(defaultOptions = {}) {
|
|
66
|
+
this.defaultOptions = {
|
|
67
|
+
timeout: defaultOptions.timeout ?? DEFAULTS.timeout,
|
|
68
|
+
silent: defaultOptions.silent ?? DEFAULTS.silent,
|
|
69
|
+
retries: defaultOptions.retries ?? DEFAULTS.retries,
|
|
70
|
+
cwd: defaultOptions.cwd,
|
|
71
|
+
env: defaultOptions.env,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute a single command
|
|
76
|
+
*
|
|
77
|
+
* @param command - Command string to execute
|
|
78
|
+
* @param options - Execution options
|
|
79
|
+
* @returns Result with stdout, stderr, exit code, and duration
|
|
80
|
+
*/
|
|
81
|
+
async execute(command, options = {}) {
|
|
82
|
+
const mergedOptions = {
|
|
83
|
+
timeout: options.timeout ?? this.defaultOptions.timeout ?? DEFAULTS.timeout,
|
|
84
|
+
silent: options.silent ?? this.defaultOptions.silent ?? DEFAULTS.silent,
|
|
85
|
+
retries: options.retries ?? this.defaultOptions.retries ?? DEFAULTS.retries,
|
|
86
|
+
cwd: options.cwd ?? this.defaultOptions.cwd ?? process.cwd(),
|
|
87
|
+
env: options.env ?? this.defaultOptions.env ?? process.env,
|
|
88
|
+
input: options.input ?? undefined,
|
|
89
|
+
maxBuffer: options.maxBuffer ?? 1024 * 1024,
|
|
90
|
+
retryDelay: options.retryDelay ?? 1000,
|
|
91
|
+
retryBackoffMultiplier: options.retryBackoffMultiplier ?? 2,
|
|
92
|
+
rejectOnError: options.rejectOnError ?? true,
|
|
93
|
+
};
|
|
94
|
+
let lastError = null;
|
|
95
|
+
let attempts = 0;
|
|
96
|
+
const maxAttempts = mergedOptions.retries + 1;
|
|
97
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
98
|
+
attempts = attempt + 1;
|
|
99
|
+
if (attempt > 0 && mergedOptions.retries > 0) {
|
|
100
|
+
const delay = calculateRetryDelay(attempt, mergedOptions.retryDelay, mergedOptions.retryBackoffMultiplier);
|
|
101
|
+
await this.sleep(delay);
|
|
102
|
+
}
|
|
103
|
+
const result = await this.executeSingle(command, mergedOptions);
|
|
104
|
+
if (result.success) {
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
lastError = result.error ?? null;
|
|
108
|
+
}
|
|
109
|
+
// All retries exhausted
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
error: lastError ?? new CommandExecutionError(command, command, null, '', ''),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Execute multiple commands in parallel
|
|
117
|
+
*
|
|
118
|
+
* @param commands - Array of command definitions
|
|
119
|
+
* @param parallelOptions - Parallel execution options
|
|
120
|
+
* @returns Aggregate result of all commands
|
|
121
|
+
*/
|
|
122
|
+
async executeParallel(commands, parallelOptions = {}) {
|
|
123
|
+
const startTime = performance.now();
|
|
124
|
+
const results = new Map();
|
|
125
|
+
const { concurrency = Infinity, stopOnError = false } = parallelOptions;
|
|
126
|
+
let successful = 0;
|
|
127
|
+
let failed = 0;
|
|
128
|
+
let shouldStop = false;
|
|
129
|
+
// Process commands in batches based on concurrency
|
|
130
|
+
for (let i = 0; i < commands.length; i += concurrency) {
|
|
131
|
+
if (shouldStop)
|
|
132
|
+
break;
|
|
133
|
+
const batch = commands.slice(i, i + concurrency);
|
|
134
|
+
const batchPromises = batch.map(async (cmd) => {
|
|
135
|
+
if (shouldStop)
|
|
136
|
+
return null;
|
|
137
|
+
const result = await this.execute(cmd.command, cmd.options);
|
|
138
|
+
const cmdResult = result.success
|
|
139
|
+
? result.data
|
|
140
|
+
: {
|
|
141
|
+
success: false,
|
|
142
|
+
stdout: '',
|
|
143
|
+
stderr: result.error?.stderr ?? '',
|
|
144
|
+
exitCode: result.error?.exitCode ?? null,
|
|
145
|
+
duration: 0,
|
|
146
|
+
command: cmd.command,
|
|
147
|
+
attempts: 1,
|
|
148
|
+
error: result.error,
|
|
149
|
+
};
|
|
150
|
+
results.set(cmd.id, cmdResult);
|
|
151
|
+
if (cmdResult.success) {
|
|
152
|
+
successful++;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
failed++;
|
|
156
|
+
if (stopOnError) {
|
|
157
|
+
shouldStop = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return cmdResult;
|
|
161
|
+
});
|
|
162
|
+
await Promise.all(batchPromises);
|
|
163
|
+
}
|
|
164
|
+
const duration = Math.round(performance.now() - startTime);
|
|
165
|
+
return {
|
|
166
|
+
results,
|
|
167
|
+
success: failed === 0,
|
|
168
|
+
duration,
|
|
169
|
+
successful,
|
|
170
|
+
failed,
|
|
171
|
+
total: commands.length,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Execute command and return Result type
|
|
176
|
+
*/
|
|
177
|
+
async executeSingle(command, options) {
|
|
178
|
+
const startTime = performance.now();
|
|
179
|
+
try {
|
|
180
|
+
// Build exec options
|
|
181
|
+
const execOptions = {
|
|
182
|
+
cwd: options.cwd,
|
|
183
|
+
env: { ...process.env, ...options.env },
|
|
184
|
+
timeout: options.timeout,
|
|
185
|
+
maxBuffer: options.maxBuffer,
|
|
186
|
+
encoding: 'utf8',
|
|
187
|
+
};
|
|
188
|
+
// Execute command with timeout wrapper
|
|
189
|
+
const result = await Promise.race([
|
|
190
|
+
execAsync(command, execOptions),
|
|
191
|
+
this.createTimeoutReject(options.timeout, command),
|
|
192
|
+
]);
|
|
193
|
+
const duration = Math.round(performance.now() - startTime);
|
|
194
|
+
return {
|
|
195
|
+
success: true,
|
|
196
|
+
data: {
|
|
197
|
+
success: true,
|
|
198
|
+
stdout: result.stdout,
|
|
199
|
+
stderr: result.stderr,
|
|
200
|
+
exitCode: 0,
|
|
201
|
+
duration,
|
|
202
|
+
command,
|
|
203
|
+
attempts: 1,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
const duration = Math.round(performance.now() - startTime);
|
|
209
|
+
const err = error;
|
|
210
|
+
// Extract stdout/stderr from error
|
|
211
|
+
const stdout = err.stdout ?? '';
|
|
212
|
+
const stderr = err.stderr ?? '';
|
|
213
|
+
// Determine exit code
|
|
214
|
+
let exitCode = null;
|
|
215
|
+
if (err.killed) {
|
|
216
|
+
exitCode = null; // Killed by timeout
|
|
217
|
+
}
|
|
218
|
+
else if (err.code === 'ENOENT') {
|
|
219
|
+
exitCode = null; // Command not found
|
|
220
|
+
}
|
|
221
|
+
// Create appropriate error
|
|
222
|
+
const commandError = resolveCommandError(command, exitCode, stdout, stderr, duration, options);
|
|
223
|
+
return {
|
|
224
|
+
success: false,
|
|
225
|
+
error: commandError,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Create a promise that rejects after timeout
|
|
231
|
+
*/
|
|
232
|
+
createTimeoutReject(timeout, command) {
|
|
233
|
+
return new Promise((_, reject) => {
|
|
234
|
+
setTimeout(() => {
|
|
235
|
+
reject(new CommandTimeoutError(command, timeout));
|
|
236
|
+
}, timeout + 100); // Add small buffer
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Sleep utility for retry delays
|
|
241
|
+
*/
|
|
242
|
+
sleep(ms) {
|
|
243
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Execute command synchronously (for compatibility only - not recommended)
|
|
247
|
+
*
|
|
248
|
+
* @deprecated Use execute() instead for async execution
|
|
249
|
+
*/
|
|
250
|
+
executeSync(_command, _options) {
|
|
251
|
+
throw new Error('Synchronous execution is not supported. Use the async execute() method instead.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Default singleton instance
|
|
256
|
+
*/
|
|
257
|
+
export const commandExecutor = new CommandExecutor();
|
|
258
|
+
/**
|
|
259
|
+
* Convenience function to execute a command
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```ts
|
|
263
|
+
* import { executeCommand } from '@pamacea/daemon/utils';
|
|
264
|
+
*
|
|
265
|
+
* const result = await executeCommand('npm test', { timeout: 60000 });
|
|
266
|
+
* ```
|
|
267
|
+
*/
|
|
268
|
+
export async function executeCommand(command, options) {
|
|
269
|
+
return commandExecutor.execute(command, options);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Convenience function to execute commands in parallel
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```ts
|
|
276
|
+
* import { executeCommandsParallel } from '@pamacea/daemon/utils';
|
|
277
|
+
*
|
|
278
|
+
* const result = await executeCommandsParallel([
|
|
279
|
+
* { id: 'test', command: 'npm test' },
|
|
280
|
+
* { id: 'lint', command: 'npm run lint' },
|
|
281
|
+
* ], { concurrency: 2 });
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
export async function executeCommandsParallel(commands, options) {
|
|
285
|
+
return commandExecutor.executeParallel(commands, options);
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=command-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executor.js","sourceRoot":"","sources":["../../../src/shared/utils/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,QAAQ,GAAG;IACf,OAAO,EAAE,KAAK,EAAE,aAAa;IAC7B,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,KAAK;CACL,CAAC;AA4LX;;GAEG;AACH,SAAS,mBAAmB,CAC1B,OAAe,EACf,QAAuB,EACvB,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,OAAuB;IAEvB,uCAAuC;IACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5G,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,OAAO,IAAI,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,0BAA0B;IAC1B,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,OAAe,EACf,SAAiB,EACjB,UAAkB;IAElB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,cAAc,CAA0B;IAEzD,YAAY,iBAA0C,EAAE;QACtD,IAAI,CAAC,cAAc,GAAG;YACpB,OAAO,EAAE,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YACnD,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;YAChD,OAAO,EAAE,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YACnD,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,GAAG,EAAE,cAAc,CAAC,GAAG;SACxB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CACX,OAAe,EACf,UAA0B,EAAE;QAE5B,MAAM,aAAa,GAWf;YACF,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC3E,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;YACvE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC3E,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC5D,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;YAC1D,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;YACjC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,GAAG,IAAI;YAC3C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,IAAI,CAAC;YAC3D,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;SAC7C,CAAC;QAEF,IAAI,SAAS,GAAiC,IAAI,CAAC;QACnD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC;QAE9C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC;YAEvB,IAAI,OAAO,GAAG,CAAC,IAAI,aAAa,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,mBAAmB,CAC/B,OAAO,EACP,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,sBAAsB,CACrC,CAAC;gBACF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAEhE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC;QACnC,CAAC;QAED,wBAAwB;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS,IAAI,IAAI,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CACnB,QAA6B,EAC7B,kBAA0C,EAAE;QAE5C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;QACjD,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,eAAe,CAAC;QAExE,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,mDAAmD;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;YACtD,IAAI,UAAU;gBAAE,MAAM;YAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;YACjD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5C,IAAI,UAAU;oBAAE,OAAO,IAAI,CAAC;gBAE5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO;oBAC9B,CAAC,CAAC,MAAM,CAAC,IAAI;oBACb,CAAC,CAAC;wBACE,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE;wBAClC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,IAAI;wBACxC,QAAQ,EAAE,CAAC;wBACX,OAAO,EAAE,GAAG,CAAC,OAAO;wBACpB,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,MAAM,CAAC,KAAK;qBACpB,CAAC;gBAEN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAE/B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;oBACtB,UAAU,EAAE,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,CAAC;oBACT,IAAI,WAAW,EAAE,CAAC;wBAChB,UAAU,GAAG,IAAI,CAAC;oBACpB,CAAC;gBACH,CAAC;gBAED,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO;YACP,OAAO,EAAE,MAAM,KAAK,CAAC;YACrB,QAAQ;YACR,UAAU;YACV,MAAM;YACN,KAAK,EAAE,QAAQ,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,OAAe,EACf,OAWC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,WAAW,GAAG;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;gBACvC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,MAAe;aAC1B,CAAC;YAEF,uCAAuC;YACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;gBAC/B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;aACnD,CAAuC,CAAC;YAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAE3D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,QAAQ,EAAE,CAAC;oBACX,QAAQ;oBACR,OAAO;oBACP,QAAQ,EAAE,CAAC;iBACZ;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,KAA8E,CAAC;YAE3F,mCAAmC;YACnC,MAAM,MAAM,GAAI,GAAG,CAAC,MAAiB,IAAI,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAI,GAAG,CAAC,MAAiB,IAAI,EAAE,CAAC;YAE5C,sBAAsB;YACtB,IAAI,QAAQ,GAAkB,IAAI,CAAC;YACnC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC,CAAC,oBAAoB;YACvC,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,QAAQ,GAAG,IAAI,CAAC,CAAC,oBAAoB;YACvC,CAAC;YAED,2BAA2B;YAC3B,MAAM,YAAY,GAAG,mBAAmB,CACtC,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAI,OAAe,EAAE,OAAe;QAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACpD,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,mBAAmB;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,WAAW,CACT,QAAgB,EAChB,QAAyB;QAEzB,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,OAAwB;IAExB,OAAO,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAA6B,EAC7B,OAAgC;IAEhC,OAAO,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC"}
|