@walkeros/cli 0.3.1
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/CHANGELOG.md +45 -0
- package/README.md +285 -0
- package/dist/__tests__/bundle/bundler-integration.test.d.ts +2 -0
- package/dist/__tests__/bundle/bundler-integration.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/bundler-integration.test.js +106 -0
- package/dist/__tests__/bundle/bundler-integration.test.js.map +1 -0
- package/dist/__tests__/bundle/bundler.test.d.ts +2 -0
- package/dist/__tests__/bundle/bundler.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/bundler.test.js +281 -0
- package/dist/__tests__/bundle/bundler.test.js.map +1 -0
- package/dist/__tests__/bundle/programmatic.test.d.ts +2 -0
- package/dist/__tests__/bundle/programmatic.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/programmatic.test.js +118 -0
- package/dist/__tests__/bundle/programmatic.test.js.map +1 -0
- package/dist/__tests__/bundle/serializer.test.d.ts +2 -0
- package/dist/__tests__/bundle/serializer.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/serializer.test.js +173 -0
- package/dist/__tests__/bundle/serializer.test.js.map +1 -0
- package/dist/__tests__/bundle/template-engine.test.d.ts +2 -0
- package/dist/__tests__/bundle/template-engine.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/template-engine.test.js +107 -0
- package/dist/__tests__/bundle/template-engine.test.js.map +1 -0
- package/dist/__tests__/cli-e2e.test.d.ts +8 -0
- package/dist/__tests__/cli-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/cli-e2e.test.js +144 -0
- package/dist/__tests__/cli-e2e.test.js.map +1 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +255 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/config-loader.test.d.ts +7 -0
- package/dist/__tests__/config-loader.test.d.ts.map +1 -0
- package/dist/__tests__/config-loader.test.js +393 -0
- package/dist/__tests__/config-loader.test.js.map +1 -0
- package/dist/__tests__/core/config.test.d.ts +2 -0
- package/dist/__tests__/core/config.test.d.ts.map +1 -0
- package/dist/__tests__/core/config.test.js +72 -0
- package/dist/__tests__/core/config.test.js.map +1 -0
- package/dist/__tests__/core/logger.test.d.ts +2 -0
- package/dist/__tests__/core/logger.test.d.ts.map +1 -0
- package/dist/__tests__/core/logger.test.js +53 -0
- package/dist/__tests__/core/logger.test.js.map +1 -0
- package/dist/__tests__/simulate/programmatic.test.d.ts +2 -0
- package/dist/__tests__/simulate/programmatic.test.d.ts.map +1 -0
- package/dist/__tests__/simulate/programmatic.test.js +51 -0
- package/dist/__tests__/simulate/programmatic.test.js.map +1 -0
- package/dist/__tests__/simulate/simulator.test.d.ts +2 -0
- package/dist/__tests__/simulate/simulator.test.d.ts.map +1 -0
- package/dist/__tests__/simulate/simulator.test.js +29 -0
- package/dist/__tests__/simulate/simulator.test.js.map +1 -0
- package/dist/commands/bundle/bundler.d.ts +14 -0
- package/dist/commands/bundle/bundler.d.ts.map +1 -0
- package/dist/commands/bundle/bundler.js +372 -0
- package/dist/commands/bundle/bundler.js.map +1 -0
- package/dist/commands/bundle/index.d.ts +51 -0
- package/dist/commands/bundle/index.d.ts.map +1 -0
- package/dist/commands/bundle/index.js +200 -0
- package/dist/commands/bundle/index.js.map +1 -0
- package/dist/commands/bundle/package-manager.d.ts +7 -0
- package/dist/commands/bundle/package-manager.d.ts.map +1 -0
- package/dist/commands/bundle/package-manager.js +170 -0
- package/dist/commands/bundle/package-manager.js.map +1 -0
- package/dist/commands/bundle/serializer.d.ts +23 -0
- package/dist/commands/bundle/serializer.d.ts.map +1 -0
- package/dist/commands/bundle/serializer.js +127 -0
- package/dist/commands/bundle/serializer.js.map +1 -0
- package/dist/commands/bundle/stats.d.ts +23 -0
- package/dist/commands/bundle/stats.d.ts.map +1 -0
- package/dist/commands/bundle/stats.js +52 -0
- package/dist/commands/bundle/stats.js.map +1 -0
- package/dist/commands/bundle/template-engine.d.ts +18 -0
- package/dist/commands/bundle/template-engine.d.ts.map +1 -0
- package/dist/commands/bundle/template-engine.js +49 -0
- package/dist/commands/bundle/template-engine.js.map +1 -0
- package/dist/commands/run/__tests__/run.integration.test.d.ts +8 -0
- package/dist/commands/run/__tests__/run.integration.test.d.ts.map +1 -0
- package/dist/commands/run/__tests__/run.integration.test.js +53 -0
- package/dist/commands/run/__tests__/run.integration.test.js.map +1 -0
- package/dist/commands/run/__tests__/validators.test.d.ts +2 -0
- package/dist/commands/run/__tests__/validators.test.d.ts.map +1 -0
- package/dist/commands/run/__tests__/validators.test.js +80 -0
- package/dist/commands/run/__tests__/validators.test.js.map +1 -0
- package/dist/commands/run/index.d.ts +39 -0
- package/dist/commands/run/index.d.ts.map +1 -0
- package/dist/commands/run/index.js +251 -0
- package/dist/commands/run/index.js.map +1 -0
- package/dist/commands/run/types.d.ts +56 -0
- package/dist/commands/run/types.d.ts.map +1 -0
- package/dist/commands/run/types.js +7 -0
- package/dist/commands/run/types.js.map +1 -0
- package/dist/commands/run/validators.d.ts +29 -0
- package/dist/commands/run/validators.d.ts.map +1 -0
- package/dist/commands/run/validators.js +54 -0
- package/dist/commands/run/validators.js.map +1 -0
- package/dist/commands/simulate/index.d.ts +47 -0
- package/dist/commands/simulate/index.d.ts.map +1 -0
- package/dist/commands/simulate/index.js +121 -0
- package/dist/commands/simulate/index.js.map +1 -0
- package/dist/commands/simulate/simulator.d.ts +18 -0
- package/dist/commands/simulate/simulator.d.ts.map +1 -0
- package/dist/commands/simulate/simulator.js +236 -0
- package/dist/commands/simulate/simulator.js.map +1 -0
- package/dist/commands/simulate/tracker.d.ts +30 -0
- package/dist/commands/simulate/tracker.d.ts.map +1 -0
- package/dist/commands/simulate/tracker.js +96 -0
- package/dist/commands/simulate/tracker.js.map +1 -0
- package/dist/commands/simulate/types.d.ts +18 -0
- package/dist/commands/simulate/types.d.ts.map +1 -0
- package/dist/commands/simulate/types.js +2 -0
- package/dist/commands/simulate/types.js.map +1 -0
- package/dist/config/defaults.d.ts +33 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +73 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +16 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +74 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +136 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/parser.d.ts +64 -0
- package/dist/config/parser.d.ts.map +1 -0
- package/dist/config/parser.js +137 -0
- package/dist/config/parser.js.map +1 -0
- package/dist/config/utils.d.ts +38 -0
- package/dist/config/utils.d.ts.map +1 -0
- package/dist/config/utils.js +66 -0
- package/dist/config/utils.js.map +1 -0
- package/dist/config/validators.d.ts +23 -0
- package/dist/config/validators.d.ts.map +1 -0
- package/dist/config/validators.js +45 -0
- package/dist/config/validators.js.map +1 -0
- package/dist/core/docker.d.ts +42 -0
- package/dist/core/docker.d.ts.map +1 -0
- package/dist/core/docker.js +114 -0
- package/dist/core/docker.js.map +1 -0
- package/dist/core/execution.d.ts +33 -0
- package/dist/core/execution.d.ts.map +1 -0
- package/dist/core/execution.js +57 -0
- package/dist/core/execution.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +17 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +74 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output.d.ts +30 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +46 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/timer.d.ts +14 -0
- package/dist/core/timer.d.ts.map +1 -0
- package/dist/core/timer.js +29 -0
- package/dist/core/timer.js.map +1 -0
- package/dist/index.d.ts +614 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1940 -0
- package/dist/index.js.map +1 -0
- package/dist/types/bundle.d.ts +251 -0
- package/dist/types/bundle.d.ts.map +1 -0
- package/dist/types/bundle.js +10 -0
- package/dist/types/bundle.js.map +1 -0
- package/dist/types/global.d.ts +51 -0
- package/dist/types/global.d.ts.map +1 -0
- package/dist/types/global.js +30 -0
- package/dist/types/global.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/template.d.ts +108 -0
- package/dist/types/template.d.ts.map +1 -0
- package/dist/types/template.js +10 -0
- package/dist/types/template.js.map +1 -0
- package/package.json +59 -0
- package/templates/base.hbs +44 -0
- package/templates/server.hbs +29 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Parser
|
|
3
|
+
*
|
|
4
|
+
* Parsing and normalization logic for configurations.
|
|
5
|
+
*/
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { isObject } from './validators';
|
|
8
|
+
import { ensureBuildOptions } from './defaults';
|
|
9
|
+
import { validatePlatform } from './validators';
|
|
10
|
+
/**
|
|
11
|
+
* Parse and normalize bundle configuration.
|
|
12
|
+
*
|
|
13
|
+
* @param data - Raw configuration data (EnvironmentConfig format: { flow, build })
|
|
14
|
+
* @returns Normalized flowConfig and buildOptions with platform-specific defaults
|
|
15
|
+
* @throws Error if validation fails
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const { flowConfig, buildOptions } = parseBundleConfig({
|
|
20
|
+
* flow: {
|
|
21
|
+
* platform: 'web',
|
|
22
|
+
* sources: { browser: {...} },
|
|
23
|
+
* destinations: { gtag: {...} }
|
|
24
|
+
* },
|
|
25
|
+
* build: {
|
|
26
|
+
* packages: { '@walkeros/core': {...} },
|
|
27
|
+
* code: '...',
|
|
28
|
+
* output: './dist/bundle.js'
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function parseBundleConfig(data) {
|
|
34
|
+
// Basic type checking
|
|
35
|
+
if (!isObject(data)) {
|
|
36
|
+
throw new Error(`Invalid config: expected object, got ${typeof data}`);
|
|
37
|
+
}
|
|
38
|
+
// Check for new format { flow, build }
|
|
39
|
+
if (!('flow' in data) || !isObject(data.flow)) {
|
|
40
|
+
throw new Error(`Invalid config: missing "flow" field. ` +
|
|
41
|
+
`Expected format: { flow: { platform: "web" | "server", ... }, build: { ... } }`);
|
|
42
|
+
}
|
|
43
|
+
if (!('build' in data) || !isObject(data.build)) {
|
|
44
|
+
throw new Error(`Invalid config: missing "build" field. ` +
|
|
45
|
+
`Expected format: { flow: { platform: "web" | "server", ... }, build: { ... } }`);
|
|
46
|
+
}
|
|
47
|
+
const flowData = data.flow;
|
|
48
|
+
if (!('platform' in flowData) ||
|
|
49
|
+
(flowData.platform !== 'web' && flowData.platform !== 'server')) {
|
|
50
|
+
throw new Error(`Invalid config: flow.platform must be "web" or "server", got "${flowData.platform}"`);
|
|
51
|
+
}
|
|
52
|
+
// Validate build.packages field
|
|
53
|
+
const buildData = data.build;
|
|
54
|
+
if ('packages' in buildData && !isObject(buildData.packages)) {
|
|
55
|
+
throw new Error(`Invalid config: build.packages must be an object, got ${typeof buildData.packages}`);
|
|
56
|
+
}
|
|
57
|
+
const config = data;
|
|
58
|
+
return normalizeConfigs(config, '/unknown/path');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Safely parse bundle configuration without throwing.
|
|
62
|
+
*
|
|
63
|
+
* @param data - Raw configuration data
|
|
64
|
+
* @returns Success result with normalized configs or error result
|
|
65
|
+
*/
|
|
66
|
+
export function safeParseBundleConfig(data) {
|
|
67
|
+
try {
|
|
68
|
+
const normalized = parseBundleConfig(data);
|
|
69
|
+
return {
|
|
70
|
+
success: true,
|
|
71
|
+
data: normalized,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Normalize flow and build configurations with platform-specific defaults.
|
|
83
|
+
*
|
|
84
|
+
* @param config - Environment configuration or flow+build object
|
|
85
|
+
* @param configPath - Path to config file (for relative template resolution)
|
|
86
|
+
* @returns Normalized flow and build configurations
|
|
87
|
+
*/
|
|
88
|
+
export function normalizeConfigs(config, configPath) {
|
|
89
|
+
const flowConfig = config.flow;
|
|
90
|
+
const platform = flowConfig
|
|
91
|
+
.platform;
|
|
92
|
+
if (!validatePlatform(platform)) {
|
|
93
|
+
throw new Error(`Invalid platform "${platform}". Must be "web" or "server".`);
|
|
94
|
+
}
|
|
95
|
+
// Apply platform-specific build defaults
|
|
96
|
+
const buildDefaults = platform === 'web'
|
|
97
|
+
? {
|
|
98
|
+
platform: 'browser',
|
|
99
|
+
format: 'iife',
|
|
100
|
+
target: 'es2020',
|
|
101
|
+
minify: false,
|
|
102
|
+
sourcemap: false,
|
|
103
|
+
tempDir: '.tmp',
|
|
104
|
+
cache: true,
|
|
105
|
+
}
|
|
106
|
+
: {
|
|
107
|
+
platform: 'node',
|
|
108
|
+
format: 'esm',
|
|
109
|
+
target: 'node20',
|
|
110
|
+
minify: false,
|
|
111
|
+
sourcemap: false,
|
|
112
|
+
tempDir: '.tmp',
|
|
113
|
+
cache: true,
|
|
114
|
+
};
|
|
115
|
+
// Merge build config
|
|
116
|
+
const buildConfig = {
|
|
117
|
+
...buildDefaults,
|
|
118
|
+
...config.build,
|
|
119
|
+
};
|
|
120
|
+
// Resolve template path relative to config file directory if it starts with ./ or ../
|
|
121
|
+
if (configPath &&
|
|
122
|
+
buildConfig.template &&
|
|
123
|
+
!path.isAbsolute(buildConfig.template)) {
|
|
124
|
+
if (buildConfig.template.startsWith('./') ||
|
|
125
|
+
buildConfig.template.startsWith('../')) {
|
|
126
|
+
const configDir = path.dirname(configPath);
|
|
127
|
+
buildConfig.template = path.resolve(configDir, buildConfig.template);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Ensure all required build fields are present
|
|
131
|
+
const buildOptions = ensureBuildOptions(buildConfig, platform);
|
|
132
|
+
return {
|
|
133
|
+
flowConfig,
|
|
134
|
+
buildOptions,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/config/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Utility Functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Substitute environment variables in a string.
|
|
6
|
+
*
|
|
7
|
+
* @param value - String with ${VAR} placeholders
|
|
8
|
+
* @returns String with environment variables substituted
|
|
9
|
+
* @throws Error if environment variable is not found
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* substituteEnvVariables('${HOME}/config') // "/Users/name/config"
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function substituteEnvVariables(value: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Load and parse JSON configuration file.
|
|
19
|
+
*
|
|
20
|
+
* @param configPath - Path to JSON file
|
|
21
|
+
* @returns Parsed configuration object
|
|
22
|
+
* @throws Error if file not found or invalid JSON
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadJsonConfig<T>(configPath: string): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a unique temporary directory path.
|
|
27
|
+
*
|
|
28
|
+
* @param tempDir - Base temporary directory (default: ".tmp")
|
|
29
|
+
* @returns Absolute path to unique temp directory
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* getTempDir() // "/workspaces/project/.tmp/cli-1647261462000-abc123"
|
|
34
|
+
* getTempDir('/tmp') // "/tmp/cli-1647261462000-abc123"
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function getTempDir(tempDir?: string): string;
|
|
38
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/config/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAetE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,SAAS,GAAG,MAAM,CAMnD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Utility Functions
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* Substitute environment variables in a string.
|
|
8
|
+
*
|
|
9
|
+
* @param value - String with ${VAR} placeholders
|
|
10
|
+
* @returns String with environment variables substituted
|
|
11
|
+
* @throws Error if environment variable is not found
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* substituteEnvVariables('${HOME}/config') // "/Users/name/config"
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function substituteEnvVariables(value) {
|
|
19
|
+
return value.replace(/\${([^}]+)}/g, (_, envVar) => {
|
|
20
|
+
const envValue = process.env[envVar];
|
|
21
|
+
if (!envValue) {
|
|
22
|
+
throw new Error(`Environment variable ${envVar} not found`);
|
|
23
|
+
}
|
|
24
|
+
return envValue;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load and parse JSON configuration file.
|
|
29
|
+
*
|
|
30
|
+
* @param configPath - Path to JSON file
|
|
31
|
+
* @returns Parsed configuration object
|
|
32
|
+
* @throws Error if file not found or invalid JSON
|
|
33
|
+
*/
|
|
34
|
+
export async function loadJsonConfig(configPath) {
|
|
35
|
+
const absolutePath = path.resolve(configPath);
|
|
36
|
+
if (!(await fs.pathExists(absolutePath))) {
|
|
37
|
+
throw new Error(`Configuration file not found: ${absolutePath}`);
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const rawConfig = await fs.readJson(absolutePath);
|
|
41
|
+
return rawConfig;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw new Error(`Invalid JSON in config file: ${configPath}. ${error instanceof Error ? error.message : error}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate a unique temporary directory path.
|
|
49
|
+
*
|
|
50
|
+
* @param tempDir - Base temporary directory (default: ".tmp")
|
|
51
|
+
* @returns Absolute path to unique temp directory
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* getTempDir() // "/workspaces/project/.tmp/cli-1647261462000-abc123"
|
|
56
|
+
* getTempDir('/tmp') // "/tmp/cli-1647261462000-abc123"
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export function getTempDir(tempDir = '.tmp') {
|
|
60
|
+
const randomId = Math.random().toString(36).substring(2, 11);
|
|
61
|
+
const basePath = path.isAbsolute(tempDir)
|
|
62
|
+
? tempDir
|
|
63
|
+
: path.join(process.cwd(), tempDir);
|
|
64
|
+
return path.join(basePath, `cli-${Date.now()}-${randomId}`);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/config/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,YAAY,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,UAAkB;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,SAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,gCAAgC,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,OAAO,GAAG,MAAM;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACvC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Type Guards and Validators
|
|
3
|
+
*
|
|
4
|
+
* Type checking utilities for configuration validation.
|
|
5
|
+
*/
|
|
6
|
+
import type { Setup, EnvironmentConfig } from '../types/bundle';
|
|
7
|
+
/**
|
|
8
|
+
* Type guard: Check if value is a plain object.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
11
|
+
/**
|
|
12
|
+
* Type guard: Validate platform value.
|
|
13
|
+
*/
|
|
14
|
+
export declare function validatePlatform(platform: unknown): platform is 'web' | 'server';
|
|
15
|
+
/**
|
|
16
|
+
* Type guard: Check if config is multi-environment format.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isMultiEnvConfig(data: unknown): data is Setup;
|
|
19
|
+
/**
|
|
20
|
+
* Type guard: Check if config is single-environment format.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isSingleEnvConfig(data: unknown): data is EnvironmentConfig;
|
|
23
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/config/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,GAChB,QAAQ,IAAI,KAAK,GAAG,QAAQ,CAE9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,KAAK,CAQ7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,iBAAiB,CAU1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Type Guards and Validators
|
|
3
|
+
*
|
|
4
|
+
* Type checking utilities for configuration validation.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Type guard: Check if value is a plain object.
|
|
8
|
+
*/
|
|
9
|
+
export function isObject(value) {
|
|
10
|
+
return (typeof value === 'object' &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
!Array.isArray(value) &&
|
|
13
|
+
Object.prototype.toString.call(value) === '[object Object]');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Type guard: Validate platform value.
|
|
17
|
+
*/
|
|
18
|
+
export function validatePlatform(platform) {
|
|
19
|
+
return platform === 'web' || platform === 'server';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Type guard: Check if config is multi-environment format.
|
|
23
|
+
*/
|
|
24
|
+
export function isMultiEnvConfig(data) {
|
|
25
|
+
return (isObject(data) &&
|
|
26
|
+
'version' in data &&
|
|
27
|
+
data.version === 1 &&
|
|
28
|
+
'environments' in data &&
|
|
29
|
+
isObject(data.environments));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Type guard: Check if config is single-environment format.
|
|
33
|
+
*/
|
|
34
|
+
export function isSingleEnvConfig(data) {
|
|
35
|
+
return (isObject(data) &&
|
|
36
|
+
'flow' in data &&
|
|
37
|
+
'build' in data &&
|
|
38
|
+
isObject(data.flow) &&
|
|
39
|
+
isObject(data.build) &&
|
|
40
|
+
'platform' in data.flow &&
|
|
41
|
+
validatePlatform(data.flow.platform));
|
|
42
|
+
}
|
|
43
|
+
// Legacy format support removed in v0.3.0
|
|
44
|
+
// See docs/MIGRATION.md for migration guide
|
|
45
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/config/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAC5D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAiB;IAEjB,OAAO,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC;QACd,SAAS,IAAI,IAAI;QACjB,IAAI,CAAC,OAAO,KAAK,CAAC;QAClB,cAAc,IAAI,IAAI;QACtB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC;QACd,MAAM,IAAI,IAAI;QACd,OAAO,IAAI,IAAI;QACf,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACpB,UAAU,IAAI,IAAI,CAAC,IAAI;QACvB,gBAAgB,CAAE,IAAI,CAAC,IAA8B,CAAC,QAAQ,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,4CAA4C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Execution Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles Docker container execution for CLI commands.
|
|
5
|
+
*/
|
|
6
|
+
import type { GlobalOptions } from '../types/global';
|
|
7
|
+
/**
|
|
8
|
+
* Docker image to use for CLI execution
|
|
9
|
+
*/
|
|
10
|
+
export declare const DOCKER_IMAGE: string;
|
|
11
|
+
/**
|
|
12
|
+
* Build Docker command for executing CLI commands
|
|
13
|
+
*
|
|
14
|
+
* @param command - CLI command (bundle, simulate, run)
|
|
15
|
+
* @param args - Command arguments
|
|
16
|
+
* @param options - Global options
|
|
17
|
+
* @returns Docker command array
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildDockerCommand(command: string, args: string[], options?: GlobalOptions): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Execute command in Docker container
|
|
22
|
+
*
|
|
23
|
+
* @param command - CLI command
|
|
24
|
+
* @param args - Command arguments
|
|
25
|
+
* @param options - Global options
|
|
26
|
+
* @returns Promise that resolves when command completes
|
|
27
|
+
*/
|
|
28
|
+
export declare function executeInDocker(command: string, args: string[], options?: GlobalOptions): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if Docker is available
|
|
31
|
+
*
|
|
32
|
+
* @returns Promise resolving to true if Docker is available
|
|
33
|
+
*/
|
|
34
|
+
export declare function isDockerAvailable(): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if Docker image exists locally
|
|
37
|
+
*
|
|
38
|
+
* @param image - Docker image name
|
|
39
|
+
* @returns Promise resolving to true if image exists
|
|
40
|
+
*/
|
|
41
|
+
export declare function imageExists(image?: string): Promise<boolean>;
|
|
42
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/core/docker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,YAAY,QACmC,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,aAAkB,GAC1B,MAAM,EAAE,CA0CV;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS1D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,GAAE,MAAqB,GAC3B,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Execution Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles Docker container execution for CLI commands.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Docker image to use for CLI execution
|
|
9
|
+
*/
|
|
10
|
+
export const DOCKER_IMAGE = process.env.WALKEROS_DOCKER_IMAGE || 'walkeros/cli:latest';
|
|
11
|
+
/**
|
|
12
|
+
* Build Docker command for executing CLI commands
|
|
13
|
+
*
|
|
14
|
+
* @param command - CLI command (bundle, simulate, run)
|
|
15
|
+
* @param args - Command arguments
|
|
16
|
+
* @param options - Global options
|
|
17
|
+
* @returns Docker command array
|
|
18
|
+
*/
|
|
19
|
+
export function buildDockerCommand(command, args, options = {}) {
|
|
20
|
+
const cwd = process.cwd();
|
|
21
|
+
const cmd = [
|
|
22
|
+
'docker',
|
|
23
|
+
'run',
|
|
24
|
+
'--rm',
|
|
25
|
+
// Mount current directory
|
|
26
|
+
'-v',
|
|
27
|
+
`${cwd}:/workspace`,
|
|
28
|
+
'-w',
|
|
29
|
+
'/workspace',
|
|
30
|
+
];
|
|
31
|
+
// Add user mapping on Linux/Mac to prevent permission issues
|
|
32
|
+
if (process.platform !== 'win32') {
|
|
33
|
+
try {
|
|
34
|
+
const uid = process.getuid?.();
|
|
35
|
+
const gid = process.getgid?.();
|
|
36
|
+
if (uid !== undefined && gid !== undefined) {
|
|
37
|
+
cmd.push('--user', `${uid}:${gid}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore if not available
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Pass through environment variables
|
|
45
|
+
if (options.verbose) {
|
|
46
|
+
cmd.push('-e', 'VERBOSE=true');
|
|
47
|
+
}
|
|
48
|
+
if (options.silent) {
|
|
49
|
+
cmd.push('-e', 'SILENT=true');
|
|
50
|
+
}
|
|
51
|
+
// Add the Docker image
|
|
52
|
+
cmd.push(DOCKER_IMAGE);
|
|
53
|
+
// Add the command and arguments
|
|
54
|
+
cmd.push(command, ...args);
|
|
55
|
+
return cmd;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Execute command in Docker container
|
|
59
|
+
*
|
|
60
|
+
* @param command - CLI command
|
|
61
|
+
* @param args - Command arguments
|
|
62
|
+
* @param options - Global options
|
|
63
|
+
* @returns Promise that resolves when command completes
|
|
64
|
+
*/
|
|
65
|
+
export async function executeInDocker(command, args, options = {}) {
|
|
66
|
+
const dockerCmd = buildDockerCommand(command, args, options);
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const proc = spawn(dockerCmd[0], dockerCmd.slice(1), {
|
|
69
|
+
stdio: options.silent ? 'ignore' : 'inherit',
|
|
70
|
+
shell: false,
|
|
71
|
+
});
|
|
72
|
+
proc.on('error', (error) => {
|
|
73
|
+
reject(new Error(`Docker execution failed: ${error.message}`));
|
|
74
|
+
});
|
|
75
|
+
proc.on('exit', (code) => {
|
|
76
|
+
if (code === 0) {
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
reject(new Error(`Docker command exited with code ${code}`));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if Docker is available
|
|
87
|
+
*
|
|
88
|
+
* @returns Promise resolving to true if Docker is available
|
|
89
|
+
*/
|
|
90
|
+
export async function isDockerAvailable() {
|
|
91
|
+
return new Promise((resolve) => {
|
|
92
|
+
const proc = spawn('docker', ['--version'], {
|
|
93
|
+
stdio: 'ignore',
|
|
94
|
+
});
|
|
95
|
+
proc.on('error', () => resolve(false));
|
|
96
|
+
proc.on('exit', (code) => resolve(code === 0));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if Docker image exists locally
|
|
101
|
+
*
|
|
102
|
+
* @param image - Docker image name
|
|
103
|
+
* @returns Promise resolving to true if image exists
|
|
104
|
+
*/
|
|
105
|
+
export async function imageExists(image = DOCKER_IMAGE) {
|
|
106
|
+
return new Promise((resolve) => {
|
|
107
|
+
const proc = spawn('docker', ['image', 'inspect', image], {
|
|
108
|
+
stdio: 'ignore',
|
|
109
|
+
});
|
|
110
|
+
proc.on('error', () => resolve(false));
|
|
111
|
+
proc.on('exit', (code) => resolve(code === 0));
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/core/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Determines whether to execute commands locally or in Docker.
|
|
5
|
+
*/
|
|
6
|
+
import type { GlobalOptions } from '../types/global';
|
|
7
|
+
import type { Logger } from './logger';
|
|
8
|
+
/**
|
|
9
|
+
* Execution mode
|
|
10
|
+
*/
|
|
11
|
+
export type ExecutionMode = 'local' | 'docker';
|
|
12
|
+
/**
|
|
13
|
+
* Get execution mode from options
|
|
14
|
+
*
|
|
15
|
+
* @param options - Global options
|
|
16
|
+
* @returns Execution mode
|
|
17
|
+
*/
|
|
18
|
+
export declare function getExecutionMode(options: GlobalOptions): ExecutionMode;
|
|
19
|
+
/**
|
|
20
|
+
* Execute command handler type
|
|
21
|
+
*/
|
|
22
|
+
export type ExecuteHandler = () => Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Execute command based on mode
|
|
25
|
+
*
|
|
26
|
+
* @param localHandler - Function to execute locally
|
|
27
|
+
* @param dockerCommand - Docker command name
|
|
28
|
+
* @param dockerArgs - Docker command arguments
|
|
29
|
+
* @param options - Global options
|
|
30
|
+
* @param logger - Logger instance
|
|
31
|
+
*/
|
|
32
|
+
export declare function executeCommand(localHandler: ExecuteHandler, dockerCommand: string, dockerArgs: string[], options: GlobalOptions, logger?: Logger): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAEtE;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,cAAc,EAC5B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Determines whether to execute commands locally or in Docker.
|
|
5
|
+
*/
|
|
6
|
+
import { executeInDocker, isDockerAvailable } from './docker';
|
|
7
|
+
/**
|
|
8
|
+
* Get execution mode from options
|
|
9
|
+
*
|
|
10
|
+
* @param options - Global options
|
|
11
|
+
* @returns Execution mode
|
|
12
|
+
*/
|
|
13
|
+
export function getExecutionMode(options) {
|
|
14
|
+
return options.local ? 'local' : 'docker';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Execute command based on mode
|
|
18
|
+
*
|
|
19
|
+
* @param localHandler - Function to execute locally
|
|
20
|
+
* @param dockerCommand - Docker command name
|
|
21
|
+
* @param dockerArgs - Docker command arguments
|
|
22
|
+
* @param options - Global options
|
|
23
|
+
* @param logger - Logger instance
|
|
24
|
+
*/
|
|
25
|
+
export async function executeCommand(localHandler, dockerCommand, dockerArgs, options, logger) {
|
|
26
|
+
const mode = getExecutionMode(options);
|
|
27
|
+
// Handle dry-run
|
|
28
|
+
if (options.dryRun) {
|
|
29
|
+
if (mode === 'docker') {
|
|
30
|
+
const cmd = `docker run walkeros/cli:latest ${dockerCommand} ${dockerArgs.join(' ')}`;
|
|
31
|
+
logger?.info(`[DRY-RUN] Would execute: ${cmd}`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
logger?.info(`[DRY-RUN] Would execute locally: ${dockerCommand} ${dockerArgs.join(' ')}`);
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Execute based on mode
|
|
39
|
+
if (mode === 'local') {
|
|
40
|
+
if (logger && !options.silent) {
|
|
41
|
+
logger.info('🖥️ Executing locally...');
|
|
42
|
+
}
|
|
43
|
+
await localHandler();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Docker mode
|
|
47
|
+
const dockerAvailable = await isDockerAvailable();
|
|
48
|
+
if (!dockerAvailable) {
|
|
49
|
+
throw new Error('Docker is not available. Please install Docker or use --local flag to execute locally.');
|
|
50
|
+
}
|
|
51
|
+
if (logger && !options.silent) {
|
|
52
|
+
logger.info('🐳 Executing in Docker container...');
|
|
53
|
+
}
|
|
54
|
+
await executeInDocker(dockerCommand, dockerArgs, options);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/core/execution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAQ9D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACrD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5C,CAAC;AAOD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAA4B,EAC5B,aAAqB,EACrB,UAAoB,EACpB,OAAsB,EACtB,MAAe;IAEf,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEvC,iBAAiB;IACjB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,kCAAkC,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,EAAE,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,IAAI,CACV,oCAAoC,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,cAAc;QACd,MAAM,eAAe,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAClD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,eAAe,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface LoggerOptions {
|
|
2
|
+
verbose?: boolean;
|
|
3
|
+
silent?: boolean;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface Logger {
|
|
7
|
+
log: (color: string, ...args: unknown[]) => void;
|
|
8
|
+
info: (...args: unknown[]) => void;
|
|
9
|
+
success: (...args: unknown[]) => void;
|
|
10
|
+
warning: (...args: unknown[]) => void;
|
|
11
|
+
warn: (...args: unknown[]) => void;
|
|
12
|
+
error: (...args: unknown[]) => void;
|
|
13
|
+
debug: (...args: unknown[]) => void;
|
|
14
|
+
gray: (...args: unknown[]) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function createLogger(options?: LoggerOptions): Logger;
|
|
17
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA+EhE"}
|