@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.
Files changed (181) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +285 -0
  3. package/dist/__tests__/bundle/bundler-integration.test.d.ts +2 -0
  4. package/dist/__tests__/bundle/bundler-integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/bundle/bundler-integration.test.js +106 -0
  6. package/dist/__tests__/bundle/bundler-integration.test.js.map +1 -0
  7. package/dist/__tests__/bundle/bundler.test.d.ts +2 -0
  8. package/dist/__tests__/bundle/bundler.test.d.ts.map +1 -0
  9. package/dist/__tests__/bundle/bundler.test.js +281 -0
  10. package/dist/__tests__/bundle/bundler.test.js.map +1 -0
  11. package/dist/__tests__/bundle/programmatic.test.d.ts +2 -0
  12. package/dist/__tests__/bundle/programmatic.test.d.ts.map +1 -0
  13. package/dist/__tests__/bundle/programmatic.test.js +118 -0
  14. package/dist/__tests__/bundle/programmatic.test.js.map +1 -0
  15. package/dist/__tests__/bundle/serializer.test.d.ts +2 -0
  16. package/dist/__tests__/bundle/serializer.test.d.ts.map +1 -0
  17. package/dist/__tests__/bundle/serializer.test.js +173 -0
  18. package/dist/__tests__/bundle/serializer.test.js.map +1 -0
  19. package/dist/__tests__/bundle/template-engine.test.d.ts +2 -0
  20. package/dist/__tests__/bundle/template-engine.test.d.ts.map +1 -0
  21. package/dist/__tests__/bundle/template-engine.test.js +107 -0
  22. package/dist/__tests__/bundle/template-engine.test.js.map +1 -0
  23. package/dist/__tests__/cli-e2e.test.d.ts +8 -0
  24. package/dist/__tests__/cli-e2e.test.d.ts.map +1 -0
  25. package/dist/__tests__/cli-e2e.test.js +144 -0
  26. package/dist/__tests__/cli-e2e.test.js.map +1 -0
  27. package/dist/__tests__/cli.test.d.ts +2 -0
  28. package/dist/__tests__/cli.test.d.ts.map +1 -0
  29. package/dist/__tests__/cli.test.js +255 -0
  30. package/dist/__tests__/cli.test.js.map +1 -0
  31. package/dist/__tests__/config-loader.test.d.ts +7 -0
  32. package/dist/__tests__/config-loader.test.d.ts.map +1 -0
  33. package/dist/__tests__/config-loader.test.js +393 -0
  34. package/dist/__tests__/config-loader.test.js.map +1 -0
  35. package/dist/__tests__/core/config.test.d.ts +2 -0
  36. package/dist/__tests__/core/config.test.d.ts.map +1 -0
  37. package/dist/__tests__/core/config.test.js +72 -0
  38. package/dist/__tests__/core/config.test.js.map +1 -0
  39. package/dist/__tests__/core/logger.test.d.ts +2 -0
  40. package/dist/__tests__/core/logger.test.d.ts.map +1 -0
  41. package/dist/__tests__/core/logger.test.js +53 -0
  42. package/dist/__tests__/core/logger.test.js.map +1 -0
  43. package/dist/__tests__/simulate/programmatic.test.d.ts +2 -0
  44. package/dist/__tests__/simulate/programmatic.test.d.ts.map +1 -0
  45. package/dist/__tests__/simulate/programmatic.test.js +51 -0
  46. package/dist/__tests__/simulate/programmatic.test.js.map +1 -0
  47. package/dist/__tests__/simulate/simulator.test.d.ts +2 -0
  48. package/dist/__tests__/simulate/simulator.test.d.ts.map +1 -0
  49. package/dist/__tests__/simulate/simulator.test.js +29 -0
  50. package/dist/__tests__/simulate/simulator.test.js.map +1 -0
  51. package/dist/commands/bundle/bundler.d.ts +14 -0
  52. package/dist/commands/bundle/bundler.d.ts.map +1 -0
  53. package/dist/commands/bundle/bundler.js +372 -0
  54. package/dist/commands/bundle/bundler.js.map +1 -0
  55. package/dist/commands/bundle/index.d.ts +51 -0
  56. package/dist/commands/bundle/index.d.ts.map +1 -0
  57. package/dist/commands/bundle/index.js +200 -0
  58. package/dist/commands/bundle/index.js.map +1 -0
  59. package/dist/commands/bundle/package-manager.d.ts +7 -0
  60. package/dist/commands/bundle/package-manager.d.ts.map +1 -0
  61. package/dist/commands/bundle/package-manager.js +170 -0
  62. package/dist/commands/bundle/package-manager.js.map +1 -0
  63. package/dist/commands/bundle/serializer.d.ts +23 -0
  64. package/dist/commands/bundle/serializer.d.ts.map +1 -0
  65. package/dist/commands/bundle/serializer.js +127 -0
  66. package/dist/commands/bundle/serializer.js.map +1 -0
  67. package/dist/commands/bundle/stats.d.ts +23 -0
  68. package/dist/commands/bundle/stats.d.ts.map +1 -0
  69. package/dist/commands/bundle/stats.js +52 -0
  70. package/dist/commands/bundle/stats.js.map +1 -0
  71. package/dist/commands/bundle/template-engine.d.ts +18 -0
  72. package/dist/commands/bundle/template-engine.d.ts.map +1 -0
  73. package/dist/commands/bundle/template-engine.js +49 -0
  74. package/dist/commands/bundle/template-engine.js.map +1 -0
  75. package/dist/commands/run/__tests__/run.integration.test.d.ts +8 -0
  76. package/dist/commands/run/__tests__/run.integration.test.d.ts.map +1 -0
  77. package/dist/commands/run/__tests__/run.integration.test.js +53 -0
  78. package/dist/commands/run/__tests__/run.integration.test.js.map +1 -0
  79. package/dist/commands/run/__tests__/validators.test.d.ts +2 -0
  80. package/dist/commands/run/__tests__/validators.test.d.ts.map +1 -0
  81. package/dist/commands/run/__tests__/validators.test.js +80 -0
  82. package/dist/commands/run/__tests__/validators.test.js.map +1 -0
  83. package/dist/commands/run/index.d.ts +39 -0
  84. package/dist/commands/run/index.d.ts.map +1 -0
  85. package/dist/commands/run/index.js +251 -0
  86. package/dist/commands/run/index.js.map +1 -0
  87. package/dist/commands/run/types.d.ts +56 -0
  88. package/dist/commands/run/types.d.ts.map +1 -0
  89. package/dist/commands/run/types.js +7 -0
  90. package/dist/commands/run/types.js.map +1 -0
  91. package/dist/commands/run/validators.d.ts +29 -0
  92. package/dist/commands/run/validators.d.ts.map +1 -0
  93. package/dist/commands/run/validators.js +54 -0
  94. package/dist/commands/run/validators.js.map +1 -0
  95. package/dist/commands/simulate/index.d.ts +47 -0
  96. package/dist/commands/simulate/index.d.ts.map +1 -0
  97. package/dist/commands/simulate/index.js +121 -0
  98. package/dist/commands/simulate/index.js.map +1 -0
  99. package/dist/commands/simulate/simulator.d.ts +18 -0
  100. package/dist/commands/simulate/simulator.d.ts.map +1 -0
  101. package/dist/commands/simulate/simulator.js +236 -0
  102. package/dist/commands/simulate/simulator.js.map +1 -0
  103. package/dist/commands/simulate/tracker.d.ts +30 -0
  104. package/dist/commands/simulate/tracker.d.ts.map +1 -0
  105. package/dist/commands/simulate/tracker.js +96 -0
  106. package/dist/commands/simulate/tracker.js.map +1 -0
  107. package/dist/commands/simulate/types.d.ts +18 -0
  108. package/dist/commands/simulate/types.d.ts.map +1 -0
  109. package/dist/commands/simulate/types.js +2 -0
  110. package/dist/commands/simulate/types.js.map +1 -0
  111. package/dist/config/defaults.d.ts +33 -0
  112. package/dist/config/defaults.d.ts.map +1 -0
  113. package/dist/config/defaults.js +73 -0
  114. package/dist/config/defaults.js.map +1 -0
  115. package/dist/config/index.d.ts +14 -0
  116. package/dist/config/index.d.ts.map +1 -0
  117. package/dist/config/index.js +16 -0
  118. package/dist/config/index.js.map +1 -0
  119. package/dist/config/loader.d.ts +74 -0
  120. package/dist/config/loader.d.ts.map +1 -0
  121. package/dist/config/loader.js +136 -0
  122. package/dist/config/loader.js.map +1 -0
  123. package/dist/config/parser.d.ts +64 -0
  124. package/dist/config/parser.d.ts.map +1 -0
  125. package/dist/config/parser.js +137 -0
  126. package/dist/config/parser.js.map +1 -0
  127. package/dist/config/utils.d.ts +38 -0
  128. package/dist/config/utils.d.ts.map +1 -0
  129. package/dist/config/utils.js +66 -0
  130. package/dist/config/utils.js.map +1 -0
  131. package/dist/config/validators.d.ts +23 -0
  132. package/dist/config/validators.d.ts.map +1 -0
  133. package/dist/config/validators.js +45 -0
  134. package/dist/config/validators.js.map +1 -0
  135. package/dist/core/docker.d.ts +42 -0
  136. package/dist/core/docker.d.ts.map +1 -0
  137. package/dist/core/docker.js +114 -0
  138. package/dist/core/docker.js.map +1 -0
  139. package/dist/core/execution.d.ts +33 -0
  140. package/dist/core/execution.d.ts.map +1 -0
  141. package/dist/core/execution.js +57 -0
  142. package/dist/core/execution.js.map +1 -0
  143. package/dist/core/index.d.ts +6 -0
  144. package/dist/core/index.d.ts.map +1 -0
  145. package/dist/core/index.js +6 -0
  146. package/dist/core/index.js.map +1 -0
  147. package/dist/core/logger.d.ts +17 -0
  148. package/dist/core/logger.d.ts.map +1 -0
  149. package/dist/core/logger.js +74 -0
  150. package/dist/core/logger.js.map +1 -0
  151. package/dist/core/output.d.ts +30 -0
  152. package/dist/core/output.d.ts.map +1 -0
  153. package/dist/core/output.js +46 -0
  154. package/dist/core/output.js.map +1 -0
  155. package/dist/core/timer.d.ts +14 -0
  156. package/dist/core/timer.d.ts.map +1 -0
  157. package/dist/core/timer.js +29 -0
  158. package/dist/core/timer.js.map +1 -0
  159. package/dist/index.d.ts +614 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +1940 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/types/bundle.d.ts +251 -0
  164. package/dist/types/bundle.d.ts.map +1 -0
  165. package/dist/types/bundle.js +10 -0
  166. package/dist/types/bundle.js.map +1 -0
  167. package/dist/types/global.d.ts +51 -0
  168. package/dist/types/global.d.ts.map +1 -0
  169. package/dist/types/global.js +30 -0
  170. package/dist/types/global.js.map +1 -0
  171. package/dist/types/index.d.ts +8 -0
  172. package/dist/types/index.d.ts.map +1 -0
  173. package/dist/types/index.js +8 -0
  174. package/dist/types/index.js.map +1 -0
  175. package/dist/types/template.d.ts +108 -0
  176. package/dist/types/template.d.ts.map +1 -0
  177. package/dist/types/template.js +10 -0
  178. package/dist/types/template.js.map +1 -0
  179. package/package.json +59 -0
  180. package/templates/base.hbs +44 -0
  181. 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,6 @@
1
+ export * from './logger';
2
+ export * from './timer';
3
+ export * from './output';
4
+ export * from './execution';
5
+ export * from './docker';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ export * from './logger';
2
+ export * from './timer';
3
+ export * from './output';
4
+ export * from './execution';
5
+ export * from './docker';
6
+ //# sourceMappingURL=index.js.map
@@ -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"}