@kadi.build/deploy-ability 0.0.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/README.md +523 -0
- package/dist/constants.d.ts +82 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +82 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/certificate-error.d.ts +95 -0
- package/dist/errors/certificate-error.d.ts.map +1 -0
- package/dist/errors/certificate-error.js +111 -0
- package/dist/errors/certificate-error.js.map +1 -0
- package/dist/errors/deployment-error.d.ts +122 -0
- package/dist/errors/deployment-error.d.ts.map +1 -0
- package/dist/errors/deployment-error.js +185 -0
- package/dist/errors/deployment-error.js.map +1 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/profile-error.d.ts +106 -0
- package/dist/errors/profile-error.d.ts.map +1 -0
- package/dist/errors/profile-error.js +127 -0
- package/dist/errors/profile-error.js.map +1 -0
- package/dist/errors/provider-error.d.ts +104 -0
- package/dist/errors/provider-error.d.ts.map +1 -0
- package/dist/errors/provider-error.js +120 -0
- package/dist/errors/provider-error.js.map +1 -0
- package/dist/errors/wallet-error.d.ts +131 -0
- package/dist/errors/wallet-error.d.ts.map +1 -0
- package/dist/errors/wallet-error.js +154 -0
- package/dist/errors/wallet-error.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/targets/akash/bid-selectors.d.ts +251 -0
- package/dist/targets/akash/bid-selectors.d.ts.map +1 -0
- package/dist/targets/akash/bid-selectors.js +322 -0
- package/dist/targets/akash/bid-selectors.js.map +1 -0
- package/dist/targets/akash/bid-types.d.ts +297 -0
- package/dist/targets/akash/bid-types.d.ts.map +1 -0
- package/dist/targets/akash/bid-types.js +89 -0
- package/dist/targets/akash/bid-types.js.map +1 -0
- package/dist/targets/akash/blockchain-client.d.ts +577 -0
- package/dist/targets/akash/blockchain-client.d.ts.map +1 -0
- package/dist/targets/akash/blockchain-client.js +803 -0
- package/dist/targets/akash/blockchain-client.js.map +1 -0
- package/dist/targets/akash/certificate-manager.d.ts +228 -0
- package/dist/targets/akash/certificate-manager.d.ts.map +1 -0
- package/dist/targets/akash/certificate-manager.js +395 -0
- package/dist/targets/akash/certificate-manager.js.map +1 -0
- package/dist/targets/akash/constants.d.ts +231 -0
- package/dist/targets/akash/constants.d.ts.map +1 -0
- package/dist/targets/akash/constants.js +225 -0
- package/dist/targets/akash/constants.js.map +1 -0
- package/dist/targets/akash/deployer.d.ts +136 -0
- package/dist/targets/akash/deployer.d.ts.map +1 -0
- package/dist/targets/akash/deployer.js +599 -0
- package/dist/targets/akash/deployer.js.map +1 -0
- package/dist/targets/akash/environment.d.ts +241 -0
- package/dist/targets/akash/environment.d.ts.map +1 -0
- package/dist/targets/akash/environment.js +245 -0
- package/dist/targets/akash/environment.js.map +1 -0
- package/dist/targets/akash/index.d.ts +1113 -0
- package/dist/targets/akash/index.d.ts.map +1 -0
- package/dist/targets/akash/index.js +909 -0
- package/dist/targets/akash/index.js.map +1 -0
- package/dist/targets/akash/lease-monitor.d.ts +51 -0
- package/dist/targets/akash/lease-monitor.d.ts.map +1 -0
- package/dist/targets/akash/lease-monitor.js +110 -0
- package/dist/targets/akash/lease-monitor.js.map +1 -0
- package/dist/targets/akash/logs.d.ts +71 -0
- package/dist/targets/akash/logs.d.ts.map +1 -0
- package/dist/targets/akash/logs.js +311 -0
- package/dist/targets/akash/logs.js.map +1 -0
- package/dist/targets/akash/logs.types.d.ts +102 -0
- package/dist/targets/akash/logs.types.d.ts.map +1 -0
- package/dist/targets/akash/logs.types.js +9 -0
- package/dist/targets/akash/logs.types.js.map +1 -0
- package/dist/targets/akash/pricing.d.ts +247 -0
- package/dist/targets/akash/pricing.d.ts.map +1 -0
- package/dist/targets/akash/pricing.js +246 -0
- package/dist/targets/akash/pricing.js.map +1 -0
- package/dist/targets/akash/provider-client.d.ts +114 -0
- package/dist/targets/akash/provider-client.d.ts.map +1 -0
- package/dist/targets/akash/provider-client.js +318 -0
- package/dist/targets/akash/provider-client.js.map +1 -0
- package/dist/targets/akash/provider-metadata.d.ts +228 -0
- package/dist/targets/akash/provider-metadata.d.ts.map +1 -0
- package/dist/targets/akash/provider-metadata.js +14 -0
- package/dist/targets/akash/provider-metadata.js.map +1 -0
- package/dist/targets/akash/provider-service.d.ts +133 -0
- package/dist/targets/akash/provider-service.d.ts.map +1 -0
- package/dist/targets/akash/provider-service.js +391 -0
- package/dist/targets/akash/provider-service.js.map +1 -0
- package/dist/targets/akash/query-client.d.ts +125 -0
- package/dist/targets/akash/query-client.d.ts.map +1 -0
- package/dist/targets/akash/query-client.js +332 -0
- package/dist/targets/akash/query-client.js.map +1 -0
- package/dist/targets/akash/sdl-generator.d.ts +31 -0
- package/dist/targets/akash/sdl-generator.d.ts.map +1 -0
- package/dist/targets/akash/sdl-generator.js +279 -0
- package/dist/targets/akash/sdl-generator.js.map +1 -0
- package/dist/targets/akash/types.d.ts +285 -0
- package/dist/targets/akash/types.d.ts.map +1 -0
- package/dist/targets/akash/types.js +54 -0
- package/dist/targets/akash/types.js.map +1 -0
- package/dist/targets/akash/wallet-manager.d.ts +526 -0
- package/dist/targets/akash/wallet-manager.d.ts.map +1 -0
- package/dist/targets/akash/wallet-manager.js +953 -0
- package/dist/targets/akash/wallet-manager.js.map +1 -0
- package/dist/targets/local/compose-generator.d.ts +244 -0
- package/dist/targets/local/compose-generator.d.ts.map +1 -0
- package/dist/targets/local/compose-generator.js +324 -0
- package/dist/targets/local/compose-generator.js.map +1 -0
- package/dist/targets/local/deployer.d.ts +82 -0
- package/dist/targets/local/deployer.d.ts.map +1 -0
- package/dist/targets/local/deployer.js +367 -0
- package/dist/targets/local/deployer.js.map +1 -0
- package/dist/targets/local/engine-manager.d.ts +155 -0
- package/dist/targets/local/engine-manager.d.ts.map +1 -0
- package/dist/targets/local/engine-manager.js +250 -0
- package/dist/targets/local/engine-manager.js.map +1 -0
- package/dist/targets/local/index.d.ts +40 -0
- package/dist/targets/local/index.d.ts.map +1 -0
- package/dist/targets/local/index.js +43 -0
- package/dist/targets/local/index.js.map +1 -0
- package/dist/targets/local/network-manager.d.ts +160 -0
- package/dist/targets/local/network-manager.d.ts.map +1 -0
- package/dist/targets/local/network-manager.js +337 -0
- package/dist/targets/local/network-manager.js.map +1 -0
- package/dist/targets/local/types.d.ts +327 -0
- package/dist/targets/local/types.d.ts.map +1 -0
- package/dist/targets/local/types.js +9 -0
- package/dist/targets/local/types.js.map +1 -0
- package/dist/types/common.d.ts +585 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +13 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +329 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +10 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/profiles.d.ts +329 -0
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/profiles.js +27 -0
- package/dist/types/profiles.js.map +1 -0
- package/dist/types/results.d.ts +443 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +64 -0
- package/dist/types/results.js.map +1 -0
- package/dist/types/validators.d.ts +118 -0
- package/dist/types/validators.d.ts.map +1 -0
- package/dist/types/validators.js +198 -0
- package/dist/types/validators.js.map +1 -0
- package/dist/utils/command-runner.d.ts +128 -0
- package/dist/utils/command-runner.d.ts.map +1 -0
- package/dist/utils/command-runner.js +210 -0
- package/dist/utils/command-runner.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/profile-loader.d.ts +76 -0
- package/dist/utils/profile-loader.d.ts.map +1 -0
- package/dist/utils/profile-loader.js +194 -0
- package/dist/utils/profile-loader.js.map +1 -0
- package/dist/utils/registry/index.d.ts +27 -0
- package/dist/utils/registry/index.d.ts.map +1 -0
- package/dist/utils/registry/index.js +29 -0
- package/dist/utils/registry/index.js.map +1 -0
- package/dist/utils/registry/manager.d.ts +319 -0
- package/dist/utils/registry/manager.d.ts.map +1 -0
- package/dist/utils/registry/manager.js +671 -0
- package/dist/utils/registry/manager.js.map +1 -0
- package/dist/utils/registry/setup.d.ts +135 -0
- package/dist/utils/registry/setup.d.ts.map +1 -0
- package/dist/utils/registry/setup.js +207 -0
- package/dist/utils/registry/setup.js.map +1 -0
- package/dist/utils/registry/transformer.d.ts +92 -0
- package/dist/utils/registry/transformer.d.ts.map +1 -0
- package/dist/utils/registry/transformer.js +131 -0
- package/dist/utils/registry/transformer.js.map +1 -0
- package/dist/utils/registry/types.d.ts +241 -0
- package/dist/utils/registry/types.d.ts.map +1 -0
- package/dist/utils/registry/types.js +10 -0
- package/dist/utils/registry/types.js.map +1 -0
- package/docs/EXAMPLES.md +293 -0
- package/docs/PLACEMENT.md +433 -0
- package/docs/STORAGE.md +318 -0
- package/docs/building-provider-reliability-tracker.md +2581 -0
- package/package.json +109 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Network Management Module
|
|
3
|
+
*
|
|
4
|
+
* Manages Docker/Podman networks for KADI deployments, ensuring
|
|
5
|
+
* required networks exist and are properly configured for inter-service
|
|
6
|
+
* communication.
|
|
7
|
+
*
|
|
8
|
+
* Key Features:
|
|
9
|
+
* - Network creation with idempotency (safe to call multiple times)
|
|
10
|
+
* - Network inspection and validation
|
|
11
|
+
* - Automatic conflict resolution
|
|
12
|
+
* - Type-safe Result returns
|
|
13
|
+
*
|
|
14
|
+
* @module targets/local/network-manager
|
|
15
|
+
*/
|
|
16
|
+
import debug from 'debug';
|
|
17
|
+
import { success, failure, } from '../../types/index.js';
|
|
18
|
+
import { DeploymentError } from '../../errors/index.js';
|
|
19
|
+
import { runCommand } from '../../utils/command-runner.js';
|
|
20
|
+
/**
|
|
21
|
+
* Debug logger for network operations
|
|
22
|
+
*/
|
|
23
|
+
const log = debug('deploy-ability:local:network');
|
|
24
|
+
/**
|
|
25
|
+
* Checks if a Docker network exists
|
|
26
|
+
*
|
|
27
|
+
* Queries the container engine to verify if a network with the given
|
|
28
|
+
* name exists. Returns true if it exists, false otherwise.
|
|
29
|
+
*
|
|
30
|
+
* @param engine - Container engine to use
|
|
31
|
+
* @param networkName - Name of the network to check
|
|
32
|
+
* @param options - Network operation options
|
|
33
|
+
* @returns Result with boolean indicating existence
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const result = await networkExists('docker', 'kadi-net');
|
|
38
|
+
*
|
|
39
|
+
* if (result.success && result.data) {
|
|
40
|
+
* console.log('Network exists');
|
|
41
|
+
* } else if (result.success && !result.data) {
|
|
42
|
+
* console.log('Network does not exist');
|
|
43
|
+
* } else {
|
|
44
|
+
* console.error('Error checking network:', result.error.message);
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export async function networkExists(engine, networkName, options = {}) {
|
|
49
|
+
const { timeout = 30_000, commandOptions } = options;
|
|
50
|
+
log('Checking if network %s exists', networkName);
|
|
51
|
+
const inspectCommand = `${engine} network inspect ${networkName}`;
|
|
52
|
+
const result = await runCommand(inspectCommand, {
|
|
53
|
+
...commandOptions,
|
|
54
|
+
timeout,
|
|
55
|
+
silent: true,
|
|
56
|
+
});
|
|
57
|
+
if (result.success) {
|
|
58
|
+
log('Network %s exists', networkName);
|
|
59
|
+
return success(true);
|
|
60
|
+
}
|
|
61
|
+
// Check if this is a "not found" error vs other errors
|
|
62
|
+
const errorMessage = result.error.context.stderr || '';
|
|
63
|
+
const isNotFound = /no such network|not found|Error: network .* not found/i.test(errorMessage);
|
|
64
|
+
if (isNotFound) {
|
|
65
|
+
log('Network %s does not exist', networkName);
|
|
66
|
+
return success(false);
|
|
67
|
+
}
|
|
68
|
+
// Other error - return it
|
|
69
|
+
log('Error checking network %s: %s', networkName, result.error.message);
|
|
70
|
+
return failure(new DeploymentError(`Failed to check if network "${networkName}" exists`, 'NETWORK_CHECK_FAILED', {
|
|
71
|
+
engine,
|
|
72
|
+
networkName,
|
|
73
|
+
error: result.error.message,
|
|
74
|
+
}, true, 'Ensure the container engine is running and accessible', 'error', result.error));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Gets detailed information about a Docker network
|
|
78
|
+
*
|
|
79
|
+
* Retrieves and parses network information including driver, scope,
|
|
80
|
+
* and whether the network was created externally.
|
|
81
|
+
*
|
|
82
|
+
* @param engine - Container engine to use
|
|
83
|
+
* @param networkName - Name of the network to inspect
|
|
84
|
+
* @param options - Network operation options
|
|
85
|
+
* @returns Result with network information
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const result = await getNetworkInfo('docker', 'kadi-net');
|
|
90
|
+
*
|
|
91
|
+
* if (result.success) {
|
|
92
|
+
* console.log('Network ID:', result.data.id);
|
|
93
|
+
* console.log('Driver:', result.data.driver);
|
|
94
|
+
* console.log('Pre-existing:', result.data.preexisting);
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export async function getNetworkInfo(engine, networkName, options = {}) {
|
|
99
|
+
const { timeout = 30_000, commandOptions } = options;
|
|
100
|
+
log('Getting info for network %s', networkName);
|
|
101
|
+
const inspectCommand = `${engine} network inspect ${networkName}`;
|
|
102
|
+
const result = await runCommand(inspectCommand, {
|
|
103
|
+
...commandOptions,
|
|
104
|
+
timeout,
|
|
105
|
+
silent: true,
|
|
106
|
+
});
|
|
107
|
+
if (!result.success) {
|
|
108
|
+
log('Failed to get network info for %s: %s', networkName, result.error.message);
|
|
109
|
+
return failure(new DeploymentError(`Network "${networkName}" not found`, 'NETWORK_NOT_FOUND', {
|
|
110
|
+
engine,
|
|
111
|
+
networkName,
|
|
112
|
+
error: result.error.message,
|
|
113
|
+
}, true, `Create the network with: ${engine} network create ${networkName}`, 'error', result.error));
|
|
114
|
+
}
|
|
115
|
+
// Parse network info from JSON output
|
|
116
|
+
try {
|
|
117
|
+
const networks = JSON.parse(result.data.stdout);
|
|
118
|
+
if (!Array.isArray(networks) || networks.length === 0) {
|
|
119
|
+
log('Network inspect returned empty array for %s', networkName);
|
|
120
|
+
return failure(new DeploymentError(`Network "${networkName}" inspect returned no data`, 'NETWORK_INSPECT_EMPTY', {
|
|
121
|
+
engine,
|
|
122
|
+
networkName,
|
|
123
|
+
}, false, undefined, 'warning'));
|
|
124
|
+
}
|
|
125
|
+
const network = networks[0];
|
|
126
|
+
log('Network %s found: id=%s driver=%s', networkName, network.Id, network.Driver);
|
|
127
|
+
return success({
|
|
128
|
+
id: network.Id,
|
|
129
|
+
name: network.Name || networkName,
|
|
130
|
+
driver: network.Driver || 'bridge',
|
|
131
|
+
preexisting: true, // If we're inspecting it, it existed before this call
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
log('Failed to parse network inspect JSON: %s', error.message);
|
|
136
|
+
return failure(new DeploymentError('Failed to parse network information', 'NETWORK_PARSE_ERROR', {
|
|
137
|
+
engine,
|
|
138
|
+
networkName,
|
|
139
|
+
stdout: result.data.stdout.substring(0, 200),
|
|
140
|
+
error: error.message,
|
|
141
|
+
}, false, undefined, 'error', error));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Creates a Docker network if it doesn't already exist
|
|
146
|
+
*
|
|
147
|
+
* This function is idempotent - safe to call multiple times. If the
|
|
148
|
+
* network already exists, it will return success with `preexisting: true`.
|
|
149
|
+
*
|
|
150
|
+
* Handles the common "already exists" error gracefully and returns
|
|
151
|
+
* structured network information.
|
|
152
|
+
*
|
|
153
|
+
* @param engine - Container engine to use
|
|
154
|
+
* @param networkName - Name of the network to create
|
|
155
|
+
* @param options - Network creation options
|
|
156
|
+
* @returns Result with network information
|
|
157
|
+
*
|
|
158
|
+
* @example Basic Usage
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const result = await ensureNetwork('docker', 'kadi-net');
|
|
161
|
+
*
|
|
162
|
+
* if (result.success) {
|
|
163
|
+
* if (result.data.preexisting) {
|
|
164
|
+
* console.log('Network already existed');
|
|
165
|
+
* } else {
|
|
166
|
+
* console.log('Network created:', result.data.id);
|
|
167
|
+
* }
|
|
168
|
+
* }
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @example With Custom Driver
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const result = await ensureNetwork('docker', 'my-overlay-net', {
|
|
174
|
+
* driver: 'overlay',
|
|
175
|
+
* ipv6: true
|
|
176
|
+
* });
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export async function ensureNetwork(engine, networkName, options = {}) {
|
|
180
|
+
const { timeout = 30_000, driver = 'bridge', ipv6 = false, driverOpts, commandOptions, } = options;
|
|
181
|
+
log('Ensuring network %s exists (driver: %s)', networkName, driver);
|
|
182
|
+
// First, check if network already exists
|
|
183
|
+
const existsResult = await networkExists(engine, networkName, {
|
|
184
|
+
timeout,
|
|
185
|
+
commandOptions,
|
|
186
|
+
});
|
|
187
|
+
if (!existsResult.success) {
|
|
188
|
+
return failure(existsResult.error);
|
|
189
|
+
}
|
|
190
|
+
if (existsResult.data) {
|
|
191
|
+
log('Network %s already exists, getting info', networkName);
|
|
192
|
+
// Network exists - get its info
|
|
193
|
+
const infoResult = await getNetworkInfo(engine, networkName, {
|
|
194
|
+
timeout,
|
|
195
|
+
commandOptions,
|
|
196
|
+
});
|
|
197
|
+
if (infoResult.success) {
|
|
198
|
+
return success({
|
|
199
|
+
...infoResult.data,
|
|
200
|
+
preexisting: true,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Failed to get info but we know it exists - return minimal info
|
|
204
|
+
log('Failed to get network info, returning minimal data');
|
|
205
|
+
return success({
|
|
206
|
+
id: '',
|
|
207
|
+
name: networkName,
|
|
208
|
+
driver,
|
|
209
|
+
preexisting: true,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Network doesn't exist - create it
|
|
213
|
+
log('Network %s does not exist, creating', networkName);
|
|
214
|
+
// Build create command with options
|
|
215
|
+
const createArgs = ['network', 'create'];
|
|
216
|
+
if (driver) {
|
|
217
|
+
createArgs.push('--driver', driver);
|
|
218
|
+
}
|
|
219
|
+
if (ipv6) {
|
|
220
|
+
createArgs.push('--ipv6');
|
|
221
|
+
}
|
|
222
|
+
if (driverOpts) {
|
|
223
|
+
for (const [key, value] of Object.entries(driverOpts)) {
|
|
224
|
+
createArgs.push('--opt', `${key}=${value}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
createArgs.push(networkName);
|
|
228
|
+
const createCommand = `${engine} ${createArgs.join(' ')}`;
|
|
229
|
+
log('Creating network with command: %s', createCommand);
|
|
230
|
+
const createResult = await runCommand(createCommand, {
|
|
231
|
+
...commandOptions,
|
|
232
|
+
timeout,
|
|
233
|
+
silent: true,
|
|
234
|
+
});
|
|
235
|
+
if (!createResult.success) {
|
|
236
|
+
// Check if this is an "already exists" error (race condition)
|
|
237
|
+
const errorMessage = createResult.error.context.stderr ||
|
|
238
|
+
createResult.error.message;
|
|
239
|
+
if (/already exists/i.test(errorMessage)) {
|
|
240
|
+
log('Network %s was created by another process (race condition)', networkName);
|
|
241
|
+
// Another process created it - get its info
|
|
242
|
+
const infoResult = await getNetworkInfo(engine, networkName, {
|
|
243
|
+
timeout,
|
|
244
|
+
commandOptions,
|
|
245
|
+
});
|
|
246
|
+
if (infoResult.success) {
|
|
247
|
+
return success({
|
|
248
|
+
...infoResult.data,
|
|
249
|
+
preexisting: true,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
// Couldn't get info but we know it exists
|
|
253
|
+
return success({
|
|
254
|
+
id: '',
|
|
255
|
+
name: networkName,
|
|
256
|
+
driver,
|
|
257
|
+
preexisting: true,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// Other error - return it
|
|
261
|
+
log('Failed to create network %s: %s', networkName, createResult.error.message);
|
|
262
|
+
return failure(new DeploymentError(`Failed to create network "${networkName}"`, 'NETWORK_CREATE_FAILED', {
|
|
263
|
+
engine,
|
|
264
|
+
networkName,
|
|
265
|
+
driver,
|
|
266
|
+
error: createResult.error.message,
|
|
267
|
+
}, true, 'Check container engine logs and ensure you have network creation permissions', 'error', createResult.error));
|
|
268
|
+
}
|
|
269
|
+
// Network created successfully
|
|
270
|
+
const networkId = createResult.data.stdout.trim();
|
|
271
|
+
log('Network %s created successfully: id=%s', networkName, networkId);
|
|
272
|
+
return success({
|
|
273
|
+
id: networkId,
|
|
274
|
+
name: networkName,
|
|
275
|
+
driver,
|
|
276
|
+
preexisting: false,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Removes a Docker network
|
|
281
|
+
*
|
|
282
|
+
* Deletes the specified network. Will fail if containers are still
|
|
283
|
+
* attached to the network.
|
|
284
|
+
*
|
|
285
|
+
* @param engine - Container engine to use
|
|
286
|
+
* @param networkName - Name of the network to remove
|
|
287
|
+
* @param options - Network operation options
|
|
288
|
+
* @returns Result indicating success or failure
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```typescript
|
|
292
|
+
* const result = await removeNetwork('docker', 'kadi-net');
|
|
293
|
+
*
|
|
294
|
+
* if (result.success) {
|
|
295
|
+
* console.log('Network removed');
|
|
296
|
+
* } else if (result.error.code === 'NETWORK_IN_USE') {
|
|
297
|
+
* console.log('Network still has containers attached');
|
|
298
|
+
* }
|
|
299
|
+
* ```
|
|
300
|
+
*/
|
|
301
|
+
export async function removeNetwork(engine, networkName, options = {}) {
|
|
302
|
+
const { timeout = 30_000, commandOptions } = options;
|
|
303
|
+
log('Removing network %s', networkName);
|
|
304
|
+
const removeCommand = `${engine} network rm ${networkName}`;
|
|
305
|
+
const result = await runCommand(removeCommand, {
|
|
306
|
+
...commandOptions,
|
|
307
|
+
timeout,
|
|
308
|
+
silent: true,
|
|
309
|
+
});
|
|
310
|
+
if (!result.success) {
|
|
311
|
+
const errorMessage = result.error.context.stderr || result.error.message;
|
|
312
|
+
// Check for common error cases
|
|
313
|
+
if (/has active endpoints|network .* has active endpoints/i.test(errorMessage)) {
|
|
314
|
+
log('Network %s has active endpoints', networkName);
|
|
315
|
+
return failure(new DeploymentError(`Network "${networkName}" has active containers attached`, 'NETWORK_IN_USE', {
|
|
316
|
+
engine,
|
|
317
|
+
networkName,
|
|
318
|
+
error: result.error.message,
|
|
319
|
+
}, true, `Stop all containers using this network first, then retry`, 'error', result.error));
|
|
320
|
+
}
|
|
321
|
+
if (/no such network|not found/i.test(errorMessage)) {
|
|
322
|
+
log('Network %s does not exist', networkName);
|
|
323
|
+
// Not found is actually success for removal
|
|
324
|
+
return success(undefined);
|
|
325
|
+
}
|
|
326
|
+
// Other error
|
|
327
|
+
log('Failed to remove network %s: %s', networkName, result.error.message);
|
|
328
|
+
return failure(new DeploymentError(`Failed to remove network "${networkName}"`, 'NETWORK_REMOVE_FAILED', {
|
|
329
|
+
engine,
|
|
330
|
+
networkName,
|
|
331
|
+
error: result.error.message,
|
|
332
|
+
}, true, 'Check container engine logs for details', 'error', result.error));
|
|
333
|
+
}
|
|
334
|
+
log('Network %s removed successfully', networkName);
|
|
335
|
+
return success(undefined);
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=network-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../../src/targets/local/network-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local deployment target type definitions
|
|
3
|
+
*
|
|
4
|
+
* Types specific to local Docker/Podman deployment
|
|
5
|
+
*
|
|
6
|
+
* @module targets/local/types
|
|
7
|
+
*/
|
|
8
|
+
import type { ImageReference } from '../../types/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Port mapping in Docker Compose format
|
|
11
|
+
*
|
|
12
|
+
* Format: "external:internal" (e.g., "8080:8080")
|
|
13
|
+
*/
|
|
14
|
+
export type PortMapping = `${number}:${number}`;
|
|
15
|
+
/**
|
|
16
|
+
* Container restart policy
|
|
17
|
+
*/
|
|
18
|
+
export type RestartPolicy = 'no' | 'always' | 'on-failure' | 'unless-stopped';
|
|
19
|
+
/**
|
|
20
|
+
* Volume mount specification
|
|
21
|
+
*/
|
|
22
|
+
export interface VolumeMount {
|
|
23
|
+
/**
|
|
24
|
+
* Source path or volume name
|
|
25
|
+
*/
|
|
26
|
+
readonly source: string;
|
|
27
|
+
/**
|
|
28
|
+
* Target path inside container
|
|
29
|
+
*/
|
|
30
|
+
readonly target: string;
|
|
31
|
+
/**
|
|
32
|
+
* Mount type
|
|
33
|
+
*/
|
|
34
|
+
readonly type?: 'bind' | 'volume' | 'tmpfs';
|
|
35
|
+
/**
|
|
36
|
+
* Read-only mount
|
|
37
|
+
*/
|
|
38
|
+
readonly readOnly?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Network mode for container
|
|
42
|
+
*/
|
|
43
|
+
export type NetworkMode = 'bridge' | 'host' | 'none' | string;
|
|
44
|
+
/**
|
|
45
|
+
* Healthcheck configuration
|
|
46
|
+
*/
|
|
47
|
+
export interface Healthcheck {
|
|
48
|
+
/**
|
|
49
|
+
* Test command
|
|
50
|
+
*/
|
|
51
|
+
readonly test: readonly string[];
|
|
52
|
+
/**
|
|
53
|
+
* Interval between checks
|
|
54
|
+
*/
|
|
55
|
+
readonly interval?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Timeout for each check
|
|
58
|
+
*/
|
|
59
|
+
readonly timeout?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Number of retries before unhealthy
|
|
62
|
+
*/
|
|
63
|
+
readonly retries?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Start period before first check
|
|
66
|
+
*/
|
|
67
|
+
readonly startPeriod?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Service dependency
|
|
71
|
+
*/
|
|
72
|
+
export interface ServiceDependency {
|
|
73
|
+
/**
|
|
74
|
+
* Service name
|
|
75
|
+
*/
|
|
76
|
+
readonly service: string;
|
|
77
|
+
/**
|
|
78
|
+
* Condition to wait for
|
|
79
|
+
*/
|
|
80
|
+
readonly condition: 'service_started' | 'service_healthy' | 'service_completed_successfully';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Docker Compose service definition
|
|
84
|
+
*
|
|
85
|
+
* Strongly typed version with no `any` types
|
|
86
|
+
*/
|
|
87
|
+
export interface ComposeService {
|
|
88
|
+
/**
|
|
89
|
+
* Container image
|
|
90
|
+
*/
|
|
91
|
+
readonly image: ImageReference;
|
|
92
|
+
/**
|
|
93
|
+
* Container name
|
|
94
|
+
*/
|
|
95
|
+
readonly container_name?: string;
|
|
96
|
+
/**
|
|
97
|
+
* Build configuration (if building from Dockerfile)
|
|
98
|
+
*/
|
|
99
|
+
readonly build?: {
|
|
100
|
+
readonly context: string;
|
|
101
|
+
readonly dockerfile?: string;
|
|
102
|
+
readonly args?: Record<string, string>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Command override
|
|
106
|
+
*/
|
|
107
|
+
readonly command?: readonly string[];
|
|
108
|
+
/**
|
|
109
|
+
* Entrypoint override
|
|
110
|
+
*/
|
|
111
|
+
readonly entrypoint?: readonly string[];
|
|
112
|
+
/**
|
|
113
|
+
* Environment variables
|
|
114
|
+
*/
|
|
115
|
+
readonly environment?: Record<string, string>;
|
|
116
|
+
/**
|
|
117
|
+
* Port mappings
|
|
118
|
+
*/
|
|
119
|
+
readonly ports?: readonly string[];
|
|
120
|
+
/**
|
|
121
|
+
* Volume mounts
|
|
122
|
+
*/
|
|
123
|
+
readonly volumes?: readonly string[];
|
|
124
|
+
/**
|
|
125
|
+
* Networks this service connects to
|
|
126
|
+
*/
|
|
127
|
+
readonly networks?: readonly string[];
|
|
128
|
+
/**
|
|
129
|
+
* Service dependencies
|
|
130
|
+
*/
|
|
131
|
+
readonly depends_on?: readonly string[] | Record<string, ServiceDependency>;
|
|
132
|
+
/**
|
|
133
|
+
* Restart policy
|
|
134
|
+
*/
|
|
135
|
+
readonly restart?: RestartPolicy;
|
|
136
|
+
/**
|
|
137
|
+
* Healthcheck configuration
|
|
138
|
+
*/
|
|
139
|
+
readonly healthcheck?: Healthcheck;
|
|
140
|
+
/**
|
|
141
|
+
* Working directory
|
|
142
|
+
*/
|
|
143
|
+
readonly working_dir?: string;
|
|
144
|
+
/**
|
|
145
|
+
* User to run as
|
|
146
|
+
*/
|
|
147
|
+
readonly user?: string;
|
|
148
|
+
/**
|
|
149
|
+
* Enable TTY
|
|
150
|
+
*/
|
|
151
|
+
readonly tty?: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Keep stdin open
|
|
154
|
+
*/
|
|
155
|
+
readonly stdin_open?: boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Privileged mode
|
|
158
|
+
*/
|
|
159
|
+
readonly privileged?: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Extra hosts
|
|
162
|
+
*/
|
|
163
|
+
readonly extra_hosts?: readonly string[];
|
|
164
|
+
/**
|
|
165
|
+
* DNS servers
|
|
166
|
+
*/
|
|
167
|
+
readonly dns?: readonly string[];
|
|
168
|
+
/**
|
|
169
|
+
* Resource limits (Compose v3)
|
|
170
|
+
*/
|
|
171
|
+
readonly deploy?: {
|
|
172
|
+
readonly resources?: {
|
|
173
|
+
readonly limits?: {
|
|
174
|
+
readonly cpus?: string;
|
|
175
|
+
readonly memory?: string;
|
|
176
|
+
};
|
|
177
|
+
readonly reservations?: {
|
|
178
|
+
readonly cpus?: string;
|
|
179
|
+
readonly memory?: string;
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Docker network configuration
|
|
186
|
+
*/
|
|
187
|
+
export interface ComposeNetwork {
|
|
188
|
+
/**
|
|
189
|
+
* Network driver
|
|
190
|
+
*/
|
|
191
|
+
readonly driver?: 'bridge' | 'host' | 'overlay' | 'macvlan' | 'none' | string;
|
|
192
|
+
/**
|
|
193
|
+
* External network (already exists)
|
|
194
|
+
*/
|
|
195
|
+
readonly external?: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Network name (for external networks)
|
|
198
|
+
*/
|
|
199
|
+
readonly name?: string;
|
|
200
|
+
/**
|
|
201
|
+
* Driver options
|
|
202
|
+
*/
|
|
203
|
+
readonly driver_opts?: Record<string, string>;
|
|
204
|
+
/**
|
|
205
|
+
* Enable IPv6
|
|
206
|
+
*/
|
|
207
|
+
readonly enable_ipv6?: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* IPAM configuration
|
|
210
|
+
*/
|
|
211
|
+
readonly ipam?: {
|
|
212
|
+
readonly driver?: string;
|
|
213
|
+
readonly config?: ReadonlyArray<{
|
|
214
|
+
readonly subnet?: string;
|
|
215
|
+
readonly ip_range?: string;
|
|
216
|
+
readonly gateway?: string;
|
|
217
|
+
}>;
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Docker Compose file structure
|
|
222
|
+
*
|
|
223
|
+
* Complete type-safe representation of docker-compose.yml
|
|
224
|
+
*/
|
|
225
|
+
export interface ComposeFile {
|
|
226
|
+
/**
|
|
227
|
+
* Compose file version
|
|
228
|
+
*/
|
|
229
|
+
readonly version: string;
|
|
230
|
+
/**
|
|
231
|
+
* Services to deploy
|
|
232
|
+
*/
|
|
233
|
+
readonly services: Readonly<Record<string, ComposeService>>;
|
|
234
|
+
/**
|
|
235
|
+
* Networks configuration
|
|
236
|
+
*/
|
|
237
|
+
readonly networks?: Readonly<Record<string, ComposeNetwork>>;
|
|
238
|
+
/**
|
|
239
|
+
* Volumes configuration
|
|
240
|
+
*/
|
|
241
|
+
readonly volumes?: Readonly<Record<string, {
|
|
242
|
+
readonly driver?: string;
|
|
243
|
+
readonly driver_opts?: Record<string, string>;
|
|
244
|
+
readonly external?: boolean;
|
|
245
|
+
readonly name?: string;
|
|
246
|
+
}>>;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Container status from Docker/Podman
|
|
250
|
+
*/
|
|
251
|
+
export type ContainerStatus = 'created' | 'running' | 'paused' | 'restarting' | 'removing' | 'exited' | 'dead';
|
|
252
|
+
/**
|
|
253
|
+
* Container information
|
|
254
|
+
*/
|
|
255
|
+
export interface ContainerInfo {
|
|
256
|
+
/**
|
|
257
|
+
* Container ID
|
|
258
|
+
*/
|
|
259
|
+
readonly id: string;
|
|
260
|
+
/**
|
|
261
|
+
* Container name
|
|
262
|
+
*/
|
|
263
|
+
readonly name: string;
|
|
264
|
+
/**
|
|
265
|
+
* Container status
|
|
266
|
+
*/
|
|
267
|
+
readonly status: ContainerStatus;
|
|
268
|
+
/**
|
|
269
|
+
* Image used
|
|
270
|
+
*/
|
|
271
|
+
readonly image: ImageReference;
|
|
272
|
+
/**
|
|
273
|
+
* Ports exposed
|
|
274
|
+
*/
|
|
275
|
+
readonly ports: ReadonlyArray<{
|
|
276
|
+
readonly internal: number;
|
|
277
|
+
readonly external?: number;
|
|
278
|
+
readonly protocol: 'tcp' | 'udp';
|
|
279
|
+
}>;
|
|
280
|
+
/**
|
|
281
|
+
* When container was created
|
|
282
|
+
*/
|
|
283
|
+
readonly createdAt: Date;
|
|
284
|
+
/**
|
|
285
|
+
* When container started (if running)
|
|
286
|
+
*/
|
|
287
|
+
readonly startedAt?: Date;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Network information
|
|
291
|
+
*/
|
|
292
|
+
export interface NetworkInfo {
|
|
293
|
+
/**
|
|
294
|
+
* Network ID
|
|
295
|
+
*/
|
|
296
|
+
readonly id: string;
|
|
297
|
+
/**
|
|
298
|
+
* Network name
|
|
299
|
+
*/
|
|
300
|
+
readonly name: string;
|
|
301
|
+
/**
|
|
302
|
+
* Network driver
|
|
303
|
+
*/
|
|
304
|
+
readonly driver: string;
|
|
305
|
+
/**
|
|
306
|
+
* Whether network already existed
|
|
307
|
+
*/
|
|
308
|
+
readonly preexisting: boolean;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Validation error for service configuration
|
|
312
|
+
*/
|
|
313
|
+
export interface ServiceValidationError {
|
|
314
|
+
/**
|
|
315
|
+
* Service name
|
|
316
|
+
*/
|
|
317
|
+
readonly service: string;
|
|
318
|
+
/**
|
|
319
|
+
* Field that failed validation
|
|
320
|
+
*/
|
|
321
|
+
readonly field: string;
|
|
322
|
+
/**
|
|
323
|
+
* Error message
|
|
324
|
+
*/
|
|
325
|
+
readonly message: string;
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/targets/local/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,gCAAgC,CAAC;CAC9F;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;IAEF;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAE5E;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,SAAS,CAAC,EAAE;YACnB,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;aAC1B,CAAC;YACF,QAAQ,CAAC,YAAY,CAAC,EAAE;gBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;aAC1B,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAE9E;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAC;KACJ,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5D;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAE7D;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC,CAAC;CACL;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,CAAC;KAClC,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
|