@jahia/jahia-cli 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +271 -56
- package/bin/dev.js +5 -1
- package/dist/commands/config/init.d.ts +12 -0
- package/dist/commands/config/init.d.ts.map +1 -0
- package/dist/commands/config/init.js +76 -0
- package/dist/commands/config/init.js.map +1 -0
- package/dist/commands/environment/create.d.ts +27 -0
- package/dist/commands/environment/create.d.ts.map +1 -0
- package/dist/commands/environment/create.js +192 -0
- package/dist/commands/environment/create.js.map +1 -0
- package/dist/commands/environment/delete.d.ts +12 -0
- package/dist/commands/environment/delete.d.ts.map +1 -0
- package/dist/commands/environment/delete.js +69 -0
- package/dist/commands/environment/delete.js.map +1 -0
- package/dist/commands/environment/doctor.d.ts +13 -0
- package/dist/commands/environment/doctor.d.ts.map +1 -0
- package/dist/commands/environment/doctor.js +63 -0
- package/dist/commands/environment/doctor.js.map +1 -0
- package/dist/commands/environment/export.d.ts +35 -0
- package/dist/commands/environment/export.d.ts.map +1 -0
- package/dist/commands/environment/export.js +127 -0
- package/dist/commands/environment/export.js.map +1 -0
- package/dist/commands/environment/list.d.ts +11 -0
- package/dist/commands/environment/list.d.ts.map +1 -0
- package/dist/commands/environment/list.js +70 -0
- package/dist/commands/environment/list.js.map +1 -0
- package/dist/commands/environment/logs.d.ts +13 -0
- package/dist/commands/environment/logs.d.ts.map +1 -0
- package/dist/commands/environment/logs.js +77 -0
- package/dist/commands/environment/logs.js.map +1 -0
- package/dist/commands/environment/start.d.ts +12 -0
- package/dist/commands/environment/start.d.ts.map +1 -0
- package/dist/commands/environment/start.js +71 -0
- package/dist/commands/environment/start.js.map +1 -0
- package/dist/commands/environment/stop.d.ts +12 -0
- package/dist/commands/environment/stop.d.ts.map +1 -0
- package/dist/commands/environment/stop.js +71 -0
- package/dist/commands/environment/stop.js.map +1 -0
- package/dist/commands/init.d.ts +39 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +178 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/jahia/alive.d.ts +18 -0
- package/dist/commands/jahia/alive.d.ts.map +1 -0
- package/dist/commands/jahia/alive.js +118 -0
- package/dist/commands/jahia/alive.js.map +1 -0
- package/dist/commands/jahia/provision.d.ts +33 -0
- package/dist/commands/jahia/provision.d.ts.map +1 -0
- package/dist/commands/jahia/provision.js +164 -0
- package/dist/commands/jahia/provision.js.map +1 -0
- package/dist/commands/tests/init.d.ts +56 -0
- package/dist/commands/tests/init.d.ts.map +1 -0
- package/dist/commands/tests/init.js +195 -0
- package/dist/commands/tests/init.js.map +1 -0
- package/dist/commands/workflow/init.d.ts +21 -0
- package/dist/commands/workflow/init.d.ts.map +1 -0
- package/dist/commands/workflow/init.js +83 -0
- package/dist/commands/workflow/init.js.map +1 -0
- package/dist/commands/workflow/run.d.ts +21 -0
- package/dist/commands/workflow/run.d.ts.map +1 -0
- package/dist/commands/workflow/run.js +97 -0
- package/dist/commands/workflow/run.js.map +1 -0
- package/dist/lib/components/index.d.ts +59 -0
- package/dist/lib/components/index.d.ts.map +1 -0
- package/dist/lib/components/index.js +111 -0
- package/dist/lib/components/index.js.map +1 -0
- package/dist/lib/components/jahia.d.ts +3 -0
- package/dist/lib/components/jahia.d.ts.map +1 -0
- package/dist/lib/components/jahia.js +37 -0
- package/dist/lib/components/jahia.js.map +1 -0
- package/dist/lib/components/smtp-server.d.ts +3 -0
- package/dist/lib/components/smtp-server.d.ts.map +1 -0
- package/dist/lib/components/smtp-server.js +29 -0
- package/dist/lib/components/smtp-server.js.map +1 -0
- package/dist/lib/components/types.d.ts +89 -0
- package/dist/lib/components/types.d.ts.map +1 -0
- package/dist/lib/components/types.js +2 -0
- package/dist/lib/components/types.js.map +1 -0
- package/dist/lib/components/victorialogs.d.ts +3 -0
- package/dist/lib/components/victorialogs.d.ts.map +1 -0
- package/dist/lib/components/victorialogs.js +29 -0
- package/dist/lib/components/victorialogs.js.map +1 -0
- package/dist/lib/config/build-blank-config.d.ts +6 -0
- package/dist/lib/config/build-blank-config.d.ts.map +1 -0
- package/dist/lib/config/build-blank-config.js +19 -0
- package/dist/lib/config/build-blank-config.js.map +1 -0
- package/dist/lib/config/config-to-yaml-with-comments.d.ts +11 -0
- package/dist/lib/config/config-to-yaml-with-comments.d.ts.map +1 -0
- package/dist/lib/config/config-to-yaml-with-comments.js +75 -0
- package/dist/lib/config/config-to-yaml-with-comments.js.map +1 -0
- package/dist/lib/config/config-to-yaml.d.ts +7 -0
- package/dist/lib/config/config-to-yaml.d.ts.map +1 -0
- package/dist/lib/config/config-to-yaml.js +26 -0
- package/dist/lib/config/config-to-yaml.js.map +1 -0
- package/dist/lib/config/defaults.d.ts +15 -0
- package/dist/lib/config/defaults.d.ts.map +1 -0
- package/dist/lib/config/defaults.js +19 -0
- package/dist/lib/config/defaults.js.map +1 -0
- package/dist/lib/config/export-config.d.ts +15 -0
- package/dist/lib/config/export-config.d.ts.map +1 -0
- package/dist/lib/config/export-config.js +27 -0
- package/dist/lib/config/export-config.js.map +1 -0
- package/dist/lib/config/initialize-config-file.d.ts +12 -0
- package/dist/lib/config/initialize-config-file.d.ts.map +1 -0
- package/dist/lib/config/initialize-config-file.js +16 -0
- package/dist/lib/config/initialize-config-file.js.map +1 -0
- package/dist/lib/config/parser.d.ts +46 -0
- package/dist/lib/config/parser.d.ts.map +1 -0
- package/dist/lib/config/parser.js +196 -0
- package/dist/lib/config/parser.js.map +1 -0
- package/dist/lib/config/resolve-env-vars.d.ts +29 -0
- package/dist/lib/config/resolve-env-vars.d.ts.map +1 -0
- package/dist/lib/config/resolve-env-vars.js +47 -0
- package/dist/lib/config/resolve-env-vars.js.map +1 -0
- package/dist/lib/config/types.d.ts +74 -0
- package/dist/lib/config/types.d.ts.map +1 -0
- package/dist/lib/config/types.js +2 -0
- package/dist/lib/config/types.js.map +1 -0
- package/dist/lib/config/with-tests-version.d.ts +6 -0
- package/dist/lib/config/with-tests-version.d.ts.map +1 -0
- package/dist/lib/config/with-tests-version.js +11 -0
- package/dist/lib/config/with-tests-version.js.map +1 -0
- package/dist/lib/output/formatter.d.ts +38 -0
- package/dist/lib/output/formatter.d.ts.map +1 -0
- package/dist/lib/output/formatter.js +172 -0
- package/dist/lib/output/formatter.js.map +1 -0
- package/dist/lib/providers/docker/container.d.ts +61 -0
- package/dist/lib/providers/docker/container.d.ts.map +1 -0
- package/dist/lib/providers/docker/container.js +101 -0
- package/dist/lib/providers/docker/container.js.map +1 -0
- package/dist/lib/providers/docker/get-container-logs.d.ts +5 -0
- package/dist/lib/providers/docker/get-container-logs.d.ts.map +1 -0
- package/dist/lib/providers/docker/get-container-logs.js +17 -0
- package/dist/lib/providers/docker/get-container-logs.js.map +1 -0
- package/dist/lib/providers/docker/index.d.ts +8 -0
- package/dist/lib/providers/docker/index.d.ts.map +1 -0
- package/dist/lib/providers/docker/index.js +424 -0
- package/dist/lib/providers/docker/index.js.map +1 -0
- package/dist/lib/providers/docker/network.d.ts +17 -0
- package/dist/lib/providers/docker/network.d.ts.map +1 -0
- package/dist/lib/providers/docker/network.js +36 -0
- package/dist/lib/providers/docker/network.js.map +1 -0
- package/dist/lib/providers/docker/start-container.d.ts +5 -0
- package/dist/lib/providers/docker/start-container.d.ts.map +1 -0
- package/dist/lib/providers/docker/start-container.js +10 -0
- package/dist/lib/providers/docker/start-container.js.map +1 -0
- package/dist/lib/providers/docker/stop-container.d.ts +5 -0
- package/dist/lib/providers/docker/stop-container.d.ts.map +1 -0
- package/dist/lib/providers/docker/stop-container.js +10 -0
- package/dist/lib/providers/docker/stop-container.js.map +1 -0
- package/dist/lib/providers/docker/volume.d.ts +13 -0
- package/dist/lib/providers/docker/volume.d.ts.map +1 -0
- package/dist/lib/providers/docker/volume.js +23 -0
- package/dist/lib/providers/docker/volume.js.map +1 -0
- package/dist/lib/providers/index.d.ts +13 -0
- package/dist/lib/providers/index.d.ts.map +1 -0
- package/dist/lib/providers/index.js +22 -0
- package/dist/lib/providers/index.js.map +1 -0
- package/dist/lib/providers/jahiacloudv1/index.d.ts +7 -0
- package/dist/lib/providers/jahiacloudv1/index.d.ts.map +1 -0
- package/dist/lib/providers/jahiacloudv1/index.js +16 -0
- package/dist/lib/providers/jahiacloudv1/index.js.map +1 -0
- package/dist/lib/providers/types.d.ts +84 -0
- package/dist/lib/providers/types.d.ts.map +1 -0
- package/dist/lib/providers/types.js +2 -0
- package/dist/lib/providers/types.js.map +1 -0
- package/dist/lib/provisioning/detect-manifest-source.d.ts +7 -0
- package/dist/lib/provisioning/detect-manifest-source.d.ts.map +1 -0
- package/dist/lib/provisioning/detect-manifest-source.js +6 -0
- package/dist/lib/provisioning/detect-manifest-source.js.map +1 -0
- package/dist/lib/provisioning/fetch-manifest.d.ts +9 -0
- package/dist/lib/provisioning/fetch-manifest.d.ts.map +1 -0
- package/dist/lib/provisioning/fetch-manifest.js +17 -0
- package/dist/lib/provisioning/fetch-manifest.js.map +1 -0
- package/dist/lib/provisioning/read-manifest.d.ts +9 -0
- package/dist/lib/provisioning/read-manifest.d.ts.map +1 -0
- package/dist/lib/provisioning/read-manifest.js +12 -0
- package/dist/lib/provisioning/read-manifest.js.map +1 -0
- package/dist/lib/provisioning/resolve-asset-paths.d.ts +7 -0
- package/dist/lib/provisioning/resolve-asset-paths.d.ts.map +1 -0
- package/dist/lib/provisioning/resolve-asset-paths.js +22 -0
- package/dist/lib/provisioning/resolve-asset-paths.js.map +1 -0
- package/dist/lib/provisioning/submit-provisioning.d.ts +12 -0
- package/dist/lib/provisioning/submit-provisioning.d.ts.map +1 -0
- package/dist/lib/provisioning/submit-provisioning.js +70 -0
- package/dist/lib/provisioning/submit-provisioning.js.map +1 -0
- package/dist/lib/provisioning/types.d.ts +34 -0
- package/dist/lib/provisioning/types.d.ts.map +1 -0
- package/dist/lib/provisioning/types.js +2 -0
- package/dist/lib/provisioning/types.js.map +1 -0
- package/dist/lib/sam/index.d.ts +4 -0
- package/dist/lib/sam/index.d.ts.map +1 -0
- package/dist/lib/sam/index.js +3 -0
- package/dist/lib/sam/index.js.map +1 -0
- package/dist/lib/sam/query-sam-status.d.ts +6 -0
- package/dist/lib/sam/query-sam-status.d.ts.map +1 -0
- package/dist/lib/sam/query-sam-status.js +54 -0
- package/dist/lib/sam/query-sam-status.js.map +1 -0
- package/dist/lib/sam/types.d.ts +41 -0
- package/dist/lib/sam/types.d.ts.map +1 -0
- package/dist/lib/sam/types.js +2 -0
- package/dist/lib/sam/types.js.map +1 -0
- package/dist/lib/sam/wait-for-sam.d.ts +7 -0
- package/dist/lib/sam/wait-for-sam.d.ts.map +1 -0
- package/dist/lib/sam/wait-for-sam.js +31 -0
- package/dist/lib/sam/wait-for-sam.js.map +1 -0
- package/dist/lib/state/delete-state.d.ts +6 -0
- package/dist/lib/state/delete-state.d.ts.map +1 -0
- package/dist/lib/state/delete-state.js +16 -0
- package/dist/lib/state/delete-state.js.map +1 -0
- package/dist/lib/state/get-active-environment.d.ts +6 -0
- package/dist/lib/state/get-active-environment.d.ts.map +1 -0
- package/dist/lib/state/get-active-environment.js +9 -0
- package/dist/lib/state/get-active-environment.js.map +1 -0
- package/dist/lib/state/get-jahia-connection-defaults.d.ts +16 -0
- package/dist/lib/state/get-jahia-connection-defaults.d.ts.map +1 -0
- package/dist/lib/state/get-jahia-connection-defaults.js +28 -0
- package/dist/lib/state/get-jahia-connection-defaults.js.map +1 -0
- package/dist/lib/state/has-active-environment.d.ts +5 -0
- package/dist/lib/state/has-active-environment.d.ts.map +1 -0
- package/dist/lib/state/has-active-environment.js +9 -0
- package/dist/lib/state/has-active-environment.js.map +1 -0
- package/dist/lib/state/index.d.ts +11 -0
- package/dist/lib/state/index.d.ts.map +1 -0
- package/dist/lib/state/index.js +9 -0
- package/dist/lib/state/index.js.map +1 -0
- package/dist/lib/state/load-state.d.ts +7 -0
- package/dist/lib/state/load-state.d.ts.map +1 -0
- package/dist/lib/state/load-state.js +17 -0
- package/dist/lib/state/load-state.js.map +1 -0
- package/dist/lib/state/reconcile-with-docker.d.ts +19 -0
- package/dist/lib/state/reconcile-with-docker.d.ts.map +1 -0
- package/dist/lib/state/reconcile-with-docker.js +36 -0
- package/dist/lib/state/reconcile-with-docker.js.map +1 -0
- package/dist/lib/state/save-state.d.ts +7 -0
- package/dist/lib/state/save-state.d.ts.map +1 -0
- package/dist/lib/state/save-state.js +13 -0
- package/dist/lib/state/save-state.js.map +1 -0
- package/dist/lib/state/state-file-path.d.ts +8 -0
- package/dist/lib/state/state-file-path.d.ts.map +1 -0
- package/dist/lib/state/state-file-path.js +14 -0
- package/dist/lib/state/state-file-path.js.map +1 -0
- package/dist/lib/state/state-flag.d.ts +6 -0
- package/dist/lib/state/state-flag.d.ts.map +1 -0
- package/dist/lib/state/state-flag.js +12 -0
- package/dist/lib/state/state-flag.js.map +1 -0
- package/dist/lib/state/types.d.ts +30 -0
- package/dist/lib/state/types.d.ts.map +1 -0
- package/dist/lib/state/types.js +2 -0
- package/dist/lib/state/types.js.map +1 -0
- package/dist/lib/tests/clone-scaffolding.d.ts +16 -0
- package/dist/lib/tests/clone-scaffolding.d.ts.map +1 -0
- package/dist/lib/tests/clone-scaffolding.js +64 -0
- package/dist/lib/tests/clone-scaffolding.js.map +1 -0
- package/dist/lib/tests/exclusion-list.d.ts +11 -0
- package/dist/lib/tests/exclusion-list.d.ts.map +1 -0
- package/dist/lib/tests/exclusion-list.js +19 -0
- package/dist/lib/tests/exclusion-list.js.map +1 -0
- package/dist/lib/tests/gitignore-manager.d.ts +21 -0
- package/dist/lib/tests/gitignore-manager.d.ts.map +1 -0
- package/dist/lib/tests/gitignore-manager.js +47 -0
- package/dist/lib/tests/gitignore-manager.js.map +1 -0
- package/dist/lib/tests/index.d.ts +6 -0
- package/dist/lib/tests/index.d.ts.map +1 -0
- package/dist/lib/tests/index.js +5 -0
- package/dist/lib/tests/index.js.map +1 -0
- package/dist/lib/tests/sync-missing-files.d.ts +3 -0
- package/dist/lib/tests/sync-missing-files.d.ts.map +1 -0
- package/dist/lib/tests/sync-missing-files.js +65 -0
- package/dist/lib/tests/sync-missing-files.js.map +1 -0
- package/dist/lib/tests/types.d.ts +26 -0
- package/dist/lib/tests/types.d.ts.map +1 -0
- package/dist/lib/tests/types.js +2 -0
- package/dist/lib/tests/types.js.map +1 -0
- package/dist/lib/workflow/build-sample-workflow.d.ts +7 -0
- package/dist/lib/workflow/build-sample-workflow.d.ts.map +1 -0
- package/dist/lib/workflow/build-sample-workflow.js +35 -0
- package/dist/lib/workflow/build-sample-workflow.js.map +1 -0
- package/dist/lib/workflow/executor.d.ts +21 -0
- package/dist/lib/workflow/executor.d.ts.map +1 -0
- package/dist/lib/workflow/executor.js +100 -0
- package/dist/lib/workflow/executor.js.map +1 -0
- package/dist/lib/workflow/merge-workflow-into-config.d.ts +7 -0
- package/dist/lib/workflow/merge-workflow-into-config.d.ts.map +1 -0
- package/dist/lib/workflow/merge-workflow-into-config.js +9 -0
- package/dist/lib/workflow/merge-workflow-into-config.js.map +1 -0
- package/dist/lib/workflow/types.d.ts +30 -0
- package/dist/lib/workflow/types.d.ts.map +1 -0
- package/dist/lib/workflow/types.js +25 -0
- package/dist/lib/workflow/types.js.map +1 -0
- package/oclif.manifest.json +856 -1
- package/package.json +9 -4
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { connect } from 'node:net';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import { applyEnvInjections, getComponent, listTransparentComponents, resolveComponent } from '../../components/index.js';
|
|
5
|
+
import { containerName, inspectContainer, removeContainer, runContainer } from './container.js';
|
|
6
|
+
import { startContainer } from './start-container.js';
|
|
7
|
+
import { stopContainer } from './stop-container.js';
|
|
8
|
+
import { createNetwork, networkExists, networkName, removeNetwork } from './network.js';
|
|
9
|
+
import { createVolume } from './volume.js';
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
/**
|
|
12
|
+
* Pulls a Docker image. Runs `docker pull` so the image is cached locally
|
|
13
|
+
* before `docker run`. This avoids a silent wait during container creation
|
|
14
|
+
* when the image isn't in the local cache.
|
|
15
|
+
*/
|
|
16
|
+
const pullImage = async (image, tag) => {
|
|
17
|
+
await execFileAsync('docker', ['pull', `${image}:${tag}`]);
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Waits for a TCP port on localhost to accept connections.
|
|
21
|
+
* Used to ensure VictoriaLogs syslog listener is ready before starting
|
|
22
|
+
* containers that use the syslog log driver.
|
|
23
|
+
*/
|
|
24
|
+
const waitForPort = (port, timeoutMs) => new Promise((resolve, reject) => {
|
|
25
|
+
const deadline = Date.now() + timeoutMs;
|
|
26
|
+
const attempt = () => {
|
|
27
|
+
const socket = connect({ host: '127.0.0.1', port });
|
|
28
|
+
socket.once('connect', () => {
|
|
29
|
+
socket.destroy();
|
|
30
|
+
resolve();
|
|
31
|
+
});
|
|
32
|
+
socket.once('error', () => {
|
|
33
|
+
socket.destroy();
|
|
34
|
+
if (Date.now() >= deadline) {
|
|
35
|
+
reject(new Error(`Timed out waiting for port ${String(port)} to accept connections`));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
setTimeout(attempt, 200);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
attempt();
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Log driver configuration for forwarding logs to VictoriaLogs via syslog.
|
|
45
|
+
*/
|
|
46
|
+
const buildLogConfig = (envName, syslogPort) => ({
|
|
47
|
+
driver: 'syslog',
|
|
48
|
+
options: {
|
|
49
|
+
'syslog-address': `tcp://127.0.0.1:${String(syslogPort)}`,
|
|
50
|
+
'syslog-format': 'rfc5424',
|
|
51
|
+
'tag': `jahia-cli-${envName}-{{.Name}}`,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Resolves transparent infrastructure components that must be auto-deployed.
|
|
56
|
+
*/
|
|
57
|
+
const resolveTransparentComponents = () => listTransparentComponents().map((def) => resolveComponent(def));
|
|
58
|
+
/**
|
|
59
|
+
* Sorts components by dependency order (topological sort).
|
|
60
|
+
* Components with no dependencies come first.
|
|
61
|
+
*/
|
|
62
|
+
const sortByDependencies = (components) => {
|
|
63
|
+
const sorted = [];
|
|
64
|
+
const visited = new Set();
|
|
65
|
+
const componentMap = new Map(components.map((c) => [c.definition.name, c]));
|
|
66
|
+
const visit = (component) => {
|
|
67
|
+
if (visited.has(component.definition.name))
|
|
68
|
+
return;
|
|
69
|
+
visited.add(component.definition.name);
|
|
70
|
+
component.definition.dependsOn.forEach((depName) => {
|
|
71
|
+
const dep = componentMap.get(depName);
|
|
72
|
+
if (dep)
|
|
73
|
+
visit(dep);
|
|
74
|
+
});
|
|
75
|
+
sorted.push(component);
|
|
76
|
+
};
|
|
77
|
+
components.forEach((c) => {
|
|
78
|
+
visit(c);
|
|
79
|
+
});
|
|
80
|
+
return sorted;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Creates all volumes needed by a component.
|
|
84
|
+
*/
|
|
85
|
+
const createComponentVolumes = async (envName, component) => {
|
|
86
|
+
await component.definition.volumes.reduce((chain, vol) => chain.then(() => createVolume(envName, vol.name)).then(() => undefined), Promise.resolve());
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Gets the status of a single component container.
|
|
90
|
+
*/
|
|
91
|
+
const getComponentStatus = async (envName, componentName) => {
|
|
92
|
+
const name = containerName(envName, componentName);
|
|
93
|
+
const info = await inspectContainer(name);
|
|
94
|
+
const def = getComponent(componentName);
|
|
95
|
+
if (!info) {
|
|
96
|
+
return {
|
|
97
|
+
name: componentName,
|
|
98
|
+
status: 'not_found',
|
|
99
|
+
image: def?.image,
|
|
100
|
+
tag: def?.defaultTag,
|
|
101
|
+
category: def?.category,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const health = info.health === 'none' ||
|
|
105
|
+
info.health === 'healthy' ||
|
|
106
|
+
info.health === 'unhealthy' ||
|
|
107
|
+
info.health === 'starting'
|
|
108
|
+
? info.health
|
|
109
|
+
: undefined;
|
|
110
|
+
return {
|
|
111
|
+
name: componentName,
|
|
112
|
+
status: info.running ? 'running' : 'stopped',
|
|
113
|
+
containerId: info.id.slice(0, 12),
|
|
114
|
+
health,
|
|
115
|
+
image: def?.image,
|
|
116
|
+
tag: def?.defaultTag,
|
|
117
|
+
category: def?.category,
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Starts a single component via docker run, returning its status.
|
|
122
|
+
*/
|
|
123
|
+
const runSingleComponent = async (envName, netName, component, logConfig, onProgress) => {
|
|
124
|
+
try {
|
|
125
|
+
const imageRef = `${component.effectiveImage}:${component.effectiveTag}`;
|
|
126
|
+
onProgress?.(`Pulling ${component.definition.name} (${imageRef})...`);
|
|
127
|
+
await pullImage(component.effectiveImage, component.effectiveTag);
|
|
128
|
+
onProgress?.(`Starting ${component.definition.name}...`);
|
|
129
|
+
await createComponentVolumes(envName, component);
|
|
130
|
+
const containerId = await runContainer({
|
|
131
|
+
envName,
|
|
132
|
+
componentName: component.definition.name,
|
|
133
|
+
image: component.effectiveImage,
|
|
134
|
+
tag: component.effectiveTag,
|
|
135
|
+
networkName: netName,
|
|
136
|
+
ports: component.effectivePorts,
|
|
137
|
+
env: component.effectiveEnv,
|
|
138
|
+
volumes: component.definition.volumes,
|
|
139
|
+
networkAliases: component.definition.networkAliases,
|
|
140
|
+
healthcheck: component.definition.healthcheck,
|
|
141
|
+
logConfig,
|
|
142
|
+
containerArgs: component.definition.args,
|
|
143
|
+
});
|
|
144
|
+
const portMap = Object.fromEntries(component.effectivePorts.map((p) => [String(p.container), p.host]));
|
|
145
|
+
return {
|
|
146
|
+
status: {
|
|
147
|
+
name: component.definition.name,
|
|
148
|
+
status: 'running',
|
|
149
|
+
containerId: containerId.slice(0, 12),
|
|
150
|
+
health: component.definition.healthcheck ? 'starting' : 'none',
|
|
151
|
+
ports: Object.keys(portMap).length > 0 ? portMap : undefined,
|
|
152
|
+
image: component.effectiveImage,
|
|
153
|
+
tag: component.effectiveTag,
|
|
154
|
+
category: component.definition.category,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
160
|
+
return {
|
|
161
|
+
status: {
|
|
162
|
+
name: component.definition.name,
|
|
163
|
+
status: 'stopped',
|
|
164
|
+
image: component.effectiveImage,
|
|
165
|
+
tag: component.effectiveTag,
|
|
166
|
+
category: component.definition.category,
|
|
167
|
+
},
|
|
168
|
+
error: `Failed to start ${component.definition.name}: ${msg}`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Lists container names matching the environment prefix.
|
|
174
|
+
*/
|
|
175
|
+
const listEnvironmentContainers = async (envName) => {
|
|
176
|
+
const prefix = `jahia-cli-${envName}-`;
|
|
177
|
+
try {
|
|
178
|
+
const { stdout } = await execFileAsync('docker', [
|
|
179
|
+
'ps',
|
|
180
|
+
'-a',
|
|
181
|
+
'--filter',
|
|
182
|
+
`name=${prefix}`,
|
|
183
|
+
'--format',
|
|
184
|
+
'{{.Names}}',
|
|
185
|
+
]);
|
|
186
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Lists volume names matching the environment prefix.
|
|
194
|
+
*/
|
|
195
|
+
const listEnvironmentVolumes = async (envName) => {
|
|
196
|
+
const prefix = `jahia-cli-${envName}-`;
|
|
197
|
+
try {
|
|
198
|
+
const { stdout } = await execFileAsync('docker', [
|
|
199
|
+
'volume',
|
|
200
|
+
'ls',
|
|
201
|
+
'--filter',
|
|
202
|
+
`name=${prefix}`,
|
|
203
|
+
'--format',
|
|
204
|
+
'{{.Name}}',
|
|
205
|
+
]);
|
|
206
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Docker provider implementation.
|
|
214
|
+
* Manages environments using native Docker CLI commands.
|
|
215
|
+
* Automatically injects transparent infrastructure (VictoriaLogs) into every environment.
|
|
216
|
+
*/
|
|
217
|
+
export const dockerProvider = {
|
|
218
|
+
name: 'docker',
|
|
219
|
+
createEnvironment: async (envName, components, onProgress) => {
|
|
220
|
+
const netName = networkName(envName);
|
|
221
|
+
try {
|
|
222
|
+
await createNetwork(envName);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
226
|
+
return {
|
|
227
|
+
success: false,
|
|
228
|
+
environment: { name: envName, provider: 'docker', network: netName, components: [] },
|
|
229
|
+
errors: [`Failed to create network: ${msg}`],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// Start transparent infrastructure first (VictoriaLogs) — no log forwarding for itself
|
|
233
|
+
const infraComponents = resolveTransparentComponents();
|
|
234
|
+
const infraResults = await infraComponents.reduce(async (chainPromise, component) => {
|
|
235
|
+
const chain = await chainPromise;
|
|
236
|
+
const result = await runSingleComponent(envName, netName, component, undefined, onProgress);
|
|
237
|
+
return {
|
|
238
|
+
statuses: [...chain.statuses, result.status],
|
|
239
|
+
errors: result.error ? [...chain.errors, result.error] : chain.errors,
|
|
240
|
+
};
|
|
241
|
+
}, Promise.resolve({ statuses: [], errors: [] }));
|
|
242
|
+
// If infrastructure failed, abort early
|
|
243
|
+
if (infraResults.errors.length > 0) {
|
|
244
|
+
return {
|
|
245
|
+
success: false,
|
|
246
|
+
environment: {
|
|
247
|
+
name: envName,
|
|
248
|
+
provider: 'docker',
|
|
249
|
+
network: netName,
|
|
250
|
+
components: infraResults.statuses,
|
|
251
|
+
createdAt: new Date().toISOString(),
|
|
252
|
+
},
|
|
253
|
+
errors: infraResults.errors,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// Start user components with log forwarding to VictoriaLogs
|
|
257
|
+
// Find the syslog port from the VictoriaLogs infrastructure component
|
|
258
|
+
const vlComponent = infraComponents.find((c) => c.definition.name === 'victorialogs');
|
|
259
|
+
const syslogPort = vlComponent?.effectivePorts.find((p) => p.container === 5140)?.host ?? 5140;
|
|
260
|
+
// Wait for VictoriaLogs syslog port to accept connections before starting user containers.
|
|
261
|
+
// Docker's syslog log driver connects at container creation time — if the port isn't ready,
|
|
262
|
+
// docker run will fail with "failed to initialize logging driver".
|
|
263
|
+
await waitForPort(syslogPort, 15000);
|
|
264
|
+
const logConfig = buildLogConfig(envName, syslogPort);
|
|
265
|
+
const injectedComponents = applyEnvInjections(components);
|
|
266
|
+
const ordered = sortByDependencies(injectedComponents);
|
|
267
|
+
const userResults = await ordered.reduce(async (chainPromise, component) => {
|
|
268
|
+
const chain = await chainPromise;
|
|
269
|
+
const result = await runSingleComponent(envName, netName, component, logConfig, onProgress);
|
|
270
|
+
return {
|
|
271
|
+
statuses: [...chain.statuses, result.status],
|
|
272
|
+
errors: result.error ? [...chain.errors, result.error] : chain.errors,
|
|
273
|
+
};
|
|
274
|
+
}, Promise.resolve({ statuses: [], errors: [] }));
|
|
275
|
+
const allStatuses = [...infraResults.statuses, ...userResults.statuses];
|
|
276
|
+
const allErrors = [...infraResults.errors, ...userResults.errors];
|
|
277
|
+
return {
|
|
278
|
+
success: allErrors.length === 0,
|
|
279
|
+
environment: {
|
|
280
|
+
name: envName,
|
|
281
|
+
provider: 'docker',
|
|
282
|
+
network: netName,
|
|
283
|
+
components: allStatuses,
|
|
284
|
+
createdAt: new Date().toISOString(),
|
|
285
|
+
},
|
|
286
|
+
errors: allErrors,
|
|
287
|
+
};
|
|
288
|
+
},
|
|
289
|
+
stopEnvironment: async (envName) => {
|
|
290
|
+
const containers = await listEnvironmentContainers(envName);
|
|
291
|
+
const errors = [];
|
|
292
|
+
const stopped = [];
|
|
293
|
+
// Stop in reverse order (dependents first)
|
|
294
|
+
const reversed = [...containers].reverse();
|
|
295
|
+
await reversed.reduce(async (chain, name) => {
|
|
296
|
+
await chain;
|
|
297
|
+
try {
|
|
298
|
+
await stopContainer(name);
|
|
299
|
+
stopped.push(name);
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
303
|
+
errors.push(`Failed to stop ${name}: ${msg}`);
|
|
304
|
+
}
|
|
305
|
+
}, Promise.resolve());
|
|
306
|
+
return {
|
|
307
|
+
success: errors.length === 0,
|
|
308
|
+
stoppedComponents: stopped,
|
|
309
|
+
errors,
|
|
310
|
+
};
|
|
311
|
+
},
|
|
312
|
+
startEnvironment: async (envName) => {
|
|
313
|
+
const containers = await listEnvironmentContainers(envName);
|
|
314
|
+
const errors = [];
|
|
315
|
+
const started = [];
|
|
316
|
+
// Start in order (dependencies first)
|
|
317
|
+
await containers.reduce(async (chain, name) => {
|
|
318
|
+
await chain;
|
|
319
|
+
try {
|
|
320
|
+
await startContainer(name);
|
|
321
|
+
started.push(name);
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
325
|
+
errors.push(`Failed to start ${name}: ${msg}`);
|
|
326
|
+
}
|
|
327
|
+
}, Promise.resolve());
|
|
328
|
+
return {
|
|
329
|
+
success: errors.length === 0,
|
|
330
|
+
startedComponents: started,
|
|
331
|
+
errors,
|
|
332
|
+
};
|
|
333
|
+
},
|
|
334
|
+
destroyEnvironment: async (envName) => {
|
|
335
|
+
const containers = await listEnvironmentContainers(envName);
|
|
336
|
+
const errors = [];
|
|
337
|
+
const removedComponents = [];
|
|
338
|
+
// Remove containers
|
|
339
|
+
await containers.reduce(async (chain, name) => {
|
|
340
|
+
await chain;
|
|
341
|
+
try {
|
|
342
|
+
await removeContainer(name);
|
|
343
|
+
removedComponents.push(name);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
347
|
+
errors.push(`Failed to remove container ${name}: ${msg}`);
|
|
348
|
+
}
|
|
349
|
+
}, Promise.resolve());
|
|
350
|
+
// Remove network
|
|
351
|
+
const removedNetwork = await removeNetwork(envName)
|
|
352
|
+
.then(() => true)
|
|
353
|
+
.catch((err) => {
|
|
354
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
355
|
+
errors.push('Failed to remove network: ' + msg);
|
|
356
|
+
return false;
|
|
357
|
+
});
|
|
358
|
+
// Remove volumes
|
|
359
|
+
const volumes = await listEnvironmentVolumes(envName);
|
|
360
|
+
const removedVolumes = [];
|
|
361
|
+
await volumes.reduce(async (chain, volName) => {
|
|
362
|
+
await chain;
|
|
363
|
+
try {
|
|
364
|
+
await execFileAsync('docker', ['volume', 'rm', '-f', volName]);
|
|
365
|
+
removedVolumes.push(volName);
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
369
|
+
errors.push(`Failed to remove volume ${volName}: ${msg}`);
|
|
370
|
+
}
|
|
371
|
+
}, Promise.resolve());
|
|
372
|
+
return {
|
|
373
|
+
success: errors.length === 0,
|
|
374
|
+
removedComponents,
|
|
375
|
+
removedNetwork,
|
|
376
|
+
removedVolumes,
|
|
377
|
+
errors,
|
|
378
|
+
};
|
|
379
|
+
},
|
|
380
|
+
getEnvironmentStatus: async (envName) => {
|
|
381
|
+
const hasNetwork = await networkExists(envName);
|
|
382
|
+
if (!hasNetwork) {
|
|
383
|
+
return {
|
|
384
|
+
name: envName,
|
|
385
|
+
provider: 'docker',
|
|
386
|
+
network: networkName(envName),
|
|
387
|
+
components: [],
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
const containerNames = await listEnvironmentContainers(envName);
|
|
391
|
+
const prefix = `jahia-cli-${envName}-`;
|
|
392
|
+
const componentNames = containerNames.map((n) => n.replace(prefix, ''));
|
|
393
|
+
const statuses = await Promise.all(componentNames.map((name) => getComponentStatus(envName, name)));
|
|
394
|
+
return {
|
|
395
|
+
name: envName,
|
|
396
|
+
provider: 'docker',
|
|
397
|
+
network: networkName(envName),
|
|
398
|
+
components: statuses,
|
|
399
|
+
};
|
|
400
|
+
},
|
|
401
|
+
checkHealth: async (envName) => {
|
|
402
|
+
const state = await dockerProvider.getEnvironmentStatus(envName);
|
|
403
|
+
const passingHealthStatuses = new Set(['healthy', 'none', 'starting']);
|
|
404
|
+
const checks = state.components.map((comp) => ({
|
|
405
|
+
name: comp.name,
|
|
406
|
+
passed: comp.status === 'running' && passingHealthStatuses.has(comp.health ?? 'none'),
|
|
407
|
+
message: comp.status === 'not_found'
|
|
408
|
+
? 'Container not found'
|
|
409
|
+
: comp.status === 'stopped'
|
|
410
|
+
? 'Container is stopped'
|
|
411
|
+
: comp.health === 'healthy' || comp.health === 'none'
|
|
412
|
+
? 'Healthy'
|
|
413
|
+
: comp.health === 'starting'
|
|
414
|
+
? 'Starting (healthcheck pending)'
|
|
415
|
+
: `Health status: ${comp.health ?? 'unknown'}`,
|
|
416
|
+
}));
|
|
417
|
+
return {
|
|
418
|
+
success: checks.every((c) => c.passed),
|
|
419
|
+
environment: state,
|
|
420
|
+
checks,
|
|
421
|
+
};
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/providers/docker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAY1H,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,SAAS,GAAG,KAAK,EAAE,KAAa,EAAE,GAAW,EAAiB,EAAE;IACpE,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAiB,EAAE,CACrE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACtF,OAAO;YACT,CAAC;YACD,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,UAAkB,EAAmB,EAAE,CAAC,CAAC;IAChF,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE;QACP,gBAAgB,EAAE,mBAAmB,MAAM,CAAC,UAAU,CAAC,EAAE;QACzD,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE,aAAa,OAAO,YAAY;KACxC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,4BAA4B,GAAG,GAAiC,EAAE,CACtE,yBAAyB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CACzB,UAAwC,EACV,EAAE;IAChC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,CAAC,SAA4B,EAAQ,EAAE;QACnD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEvC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,GAAG;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG,KAAK,EAClC,OAAe,EACf,SAA4B,EACb,EAAE;IACjB,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CACvC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EACvF,OAAO,CAAC,OAAO,EAAE,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAAe,EACf,aAAqB,EACK,EAAE;IAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAExC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,GAAG,EAAE,KAAK;YACjB,GAAG,EAAE,GAAG,EAAE,UAAU;YACpB,QAAQ,EAAE,GAAG,EAAE,QAAQ;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,MAAM;QACtB,IAAI,CAAC,MAAM,KAAK,SAAS;QACzB,IAAI,CAAC,MAAM,KAAK,WAAW;QAC3B,IAAI,CAAC,MAAM,KAAK,UAAU;QACxB,CAAC,CAAC,IAAI,CAAC,MAAM;QACb,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5C,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,KAAK;QACjB,GAAG,EAAE,GAAG,EAAE,UAAU;QACpB,QAAQ,EAAE,GAAG,EAAE,QAAQ;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAAe,EACf,OAAe,EACf,SAA4B,EAC5B,SAA2B,EAC3B,UAAsC,EAC4B,EAAE;IACpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QACzE,UAAU,EAAE,CAAC,WAAW,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,MAAM,CAAC,CAAC;QACtE,MAAM,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QAClE,UAAU,EAAE,CAAC,YAAY,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;QACzD,MAAM,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC;YACrC,OAAO;YACP,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;YACxC,KAAK,EAAE,SAAS,CAAC,cAAc;YAC/B,GAAG,EAAE,SAAS,CAAC,YAAY;YAC3B,WAAW,EAAE,OAAO;YACpB,KAAK,EAAE,SAAS,CAAC,cAAc;YAC/B,GAAG,EAAE,SAAS,CAAC,YAAY;YAC3B,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,OAAO;YACrC,cAAc,EAAE,SAAS,CAAC,UAAU,CAAC,cAAc;YACnD,WAAW,EAAE,SAAS,CAAC,UAAU,CAAC,WAAW;YAC7C,SAAS;YACT,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;SACzC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAChC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CACnE,CAAC;QACF,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;gBAC/B,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAC9D,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBAC5D,KAAK,EAAE,SAAS,CAAC,cAAc;gBAC/B,GAAG,EAAE,SAAS,CAAC,YAAY;gBAC3B,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ;aACxC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;gBAC/B,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,SAAS,CAAC,cAAc;gBAC/B,GAAG,EAAE,SAAS,CAAC,YAAY;gBAC3B,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ;aACxC;YACD,KAAK,EAAE,mBAAmB,SAAS,CAAC,UAAU,CAAC,IAAI,KAAK,GAAG,EAAE;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,yBAAyB,GAAG,KAAK,EAAE,OAAe,EAA8B,EAAE;IACtF,MAAM,MAAM,GAAG,aAAa,OAAO,GAAG,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE;YAC/C,IAAI;YACJ,IAAI;YACJ,UAAU;YACV,QAAQ,MAAM,EAAE;YAChB,UAAU;YACV,YAAY;SACb,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAe,EAA8B,EAAE;IACnF,MAAM,MAAM,GAAG,aAAa,OAAO,GAAG,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE;YAC/C,QAAQ;YACR,IAAI;YACJ,UAAU;YACV,QAAQ,MAAM,EAAE;YAChB,UAAU;YACV,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,IAAI,EAAE,QAAQ;IAEd,iBAAiB,EAAE,KAAK,EACtB,OAAe,EACf,UAAwC,EACxC,UAAsC,EACf,EAAE;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;gBACpF,MAAM,EAAE,CAAC,6BAA6B,GAAG,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC;QAED,uFAAuF;QACvF,MAAM,eAAe,GAAG,4BAA4B,EAAE,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAC/C,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC5F,OAAO;gBACL,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;aACtE,CAAC;QACJ,CAAC,EACD,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAuB,EAAE,MAAM,EAAE,EAAc,EAAE,CAAC,CAC/E,CAAC;QAEF,wCAAwC;QACxC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE;oBACX,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,OAAO;oBAChB,UAAU,EAAE,YAAY,CAAC,QAAQ;oBACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,MAAM,EAAE,YAAY,CAAC,MAAM;aAC5B,CAAC;QACJ,CAAC;QAED,4DAA4D;QAC5D,sEAAsE;QACtE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QAE/F,2FAA2F;QAC3F,4FAA4F;QAC5F,mEAAmE;QACnE,MAAM,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,MAAM,CACtC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC5F,OAAO;gBACL,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;aACtE,CAAC;QACJ,CAAC,EACD,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAuB,EAAE,MAAM,EAAE,EAAc,EAAE,CAAC,CAC/E,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAElE,OAAO;YACL,OAAO,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC;YAC/B,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,OAAO;gBAChB,UAAU,EAAE,WAAW;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,eAAe,EAAE,KAAK,EAAE,OAAe,EAAuB,EAAE;QAC9D,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1C,MAAM,KAAK,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,iBAAiB,EAAE,OAAO;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAED,gBAAgB,EAAE,KAAK,EAAE,OAAe,EAAwB,EAAE;QAChE,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,sCAAsC;QACtC,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,MAAM,KAAK,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,iBAAiB,EAAE,OAAO;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAED,kBAAkB,EAAE,KAAK,EAAE,OAAe,EAA0B,EAAE;QACpE,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,iBAAiB,GAAa,EAAE,CAAC;QAEvC,oBAAoB;QACpB,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5C,MAAM,KAAK,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC5B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC,8BAA8B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEtB,iBAAiB;QACjB,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;aAChD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAChB,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,GAAG,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEL,iBAAiB;QACjB,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC5C,MAAM,KAAK,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC5B,iBAAiB;YACjB,cAAc;YACd,cAAc;YACd,MAAM;SACP,CAAC;IACJ,CAAC;IAED,oBAAoB,EAAE,KAAK,EAAE,OAAe,EAA6B,EAAE;QACzE,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;gBAC7B,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,aAAa,OAAO,GAAG,CAAC;QACvC,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAChE,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;YAC7B,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;IAED,WAAW,EAAE,KAAK,EAAE,OAAe,EAA8B,EAAE;QACjE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEjE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;YACrF,OAAO,EACL,IAAI,CAAC,MAAM,KAAK,WAAW;gBACzB,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;oBACzB,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;wBACnD,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU;4BAC1B,CAAC,CAAC,gCAAgC;4BAClC,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE;SACzD,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtC,WAAW,EAAE,KAAK;YAClB,MAAM;SACP,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates the network name for an environment.
|
|
3
|
+
*/
|
|
4
|
+
export declare const networkName: (envName: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* Creates a Docker bridge network for the environment.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createNetwork: (envName: string) => Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Removes a Docker network by environment name.
|
|
11
|
+
*/
|
|
12
|
+
export declare const removeNetwork: (envName: string) => Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a Docker network exists for the environment.
|
|
15
|
+
*/
|
|
16
|
+
export declare const networkExists: (envName: string) => Promise<boolean>;
|
|
17
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/docker/network.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,MAAgC,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAInE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,IAAI,CAGjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAQpE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Generates the network name for an environment.
|
|
6
|
+
*/
|
|
7
|
+
export const networkName = (envName) => `jahia-cli-${envName}`;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a Docker bridge network for the environment.
|
|
10
|
+
*/
|
|
11
|
+
export const createNetwork = async (envName) => {
|
|
12
|
+
const name = networkName(envName);
|
|
13
|
+
await execFileAsync('docker', ['network', 'create', '--driver', 'bridge', name]);
|
|
14
|
+
return name;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Removes a Docker network by environment name.
|
|
18
|
+
*/
|
|
19
|
+
export const removeNetwork = async (envName) => {
|
|
20
|
+
const name = networkName(envName);
|
|
21
|
+
await execFileAsync('docker', ['network', 'rm', name]);
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Checks if a Docker network exists for the environment.
|
|
25
|
+
*/
|
|
26
|
+
export const networkExists = async (envName) => {
|
|
27
|
+
const name = networkName(envName);
|
|
28
|
+
try {
|
|
29
|
+
await execFileAsync('docker', ['network', 'inspect', name]);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../src/lib/providers/docker/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,aAAa,OAAO,EAAE,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;IACtE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;IACpE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAoB,EAAE;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-container.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/docker/start-container.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,cAAc,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAE/D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Starts a stopped Docker container by name or ID.
|
|
6
|
+
*/
|
|
7
|
+
export const startContainer = async (name) => {
|
|
8
|
+
await execFileAsync('docker', ['start', name]);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=start-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-container.js","sourceRoot":"","sources":["../../../../src/lib/providers/docker/start-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IAClE,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-container.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/docker/stop-container.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAE9D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Stops a running Docker container by name or ID.
|
|
6
|
+
*/
|
|
7
|
+
export const stopContainer = async (name) => {
|
|
8
|
+
await execFileAsync('docker', ['stop', name]);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=stop-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-container.js","sourceRoot":"","sources":["../../../../src/lib/providers/docker/stop-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAiB,EAAE;IACjE,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a volume name scoped to an environment.
|
|
3
|
+
*/
|
|
4
|
+
export declare const volumeName: (envName: string, volumeBaseName: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* Creates a named Docker volume for a component within an environment.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createVolume: (envName: string, volumeBaseName: string) => Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Removes a named Docker volume.
|
|
11
|
+
*/
|
|
12
|
+
export declare const removeVolume: (envName: string, volumeBaseName: string) => Promise<void>;
|
|
13
|
+
//# sourceMappingURL=volume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/docker/volume.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,EAAE,gBAAgB,MAAM,KAAG,MAC3B,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,SAAS,MAAM,EAAE,gBAAgB,MAAM,KAAG,OAAO,CAAC,MAAM,CAI1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,SAAS,MAAM,EAAE,gBAAgB,MAAM,KAAG,OAAO,CAAC,IAAI,CAGxF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Generates a volume name scoped to an environment.
|
|
6
|
+
*/
|
|
7
|
+
export const volumeName = (envName, volumeBaseName) => `jahia-cli-${envName}-${volumeBaseName}`;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a named Docker volume for a component within an environment.
|
|
10
|
+
*/
|
|
11
|
+
export const createVolume = async (envName, volumeBaseName) => {
|
|
12
|
+
const name = volumeName(envName, volumeBaseName);
|
|
13
|
+
await execFileAsync('docker', ['volume', 'create', name]);
|
|
14
|
+
return name;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Removes a named Docker volume.
|
|
18
|
+
*/
|
|
19
|
+
export const removeVolume = async (envName, volumeBaseName) => {
|
|
20
|
+
const name = volumeName(envName, volumeBaseName);
|
|
21
|
+
await execFileAsync('docker', ['volume', 'rm', '-f', name]);
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=volume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume.js","sourceRoot":"","sources":["../../../../src/lib/providers/docker/volume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,cAAsB,EAAU,EAAE,CAC5E,aAAa,OAAO,IAAI,cAAc,EAAE,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,cAAsB,EAAmB,EAAE;IAC7F,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,cAAsB,EAAiB,EAAE;IAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Provider } from './types.js';
|
|
2
|
+
export type ProviderName = 'docker' | 'jahiacloudv1';
|
|
3
|
+
/**
|
|
4
|
+
* Returns a provider by name.
|
|
5
|
+
* Throws if the provider name is not recognized.
|
|
6
|
+
*/
|
|
7
|
+
export declare const getProvider: (name: string) => Provider;
|
|
8
|
+
/**
|
|
9
|
+
* Returns all available provider names.
|
|
10
|
+
*/
|
|
11
|
+
export declare const listProviderNames: () => readonly string[];
|
|
12
|
+
export type { Provider, CreateResult, EnvironmentState, HealthCheckResult, ComponentStatus } from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,cAAc,CAAC;AAOrD;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,QAQ1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,SAAS,MAAM,EAAoC,CAAC;AAEzF,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { dockerProvider } from './docker/index.js';
|
|
2
|
+
import { jahiaCloudV1Provider } from './jahiacloudv1/index.js';
|
|
3
|
+
const PROVIDER_REGISTRY = {
|
|
4
|
+
docker: dockerProvider,
|
|
5
|
+
jahiacloudv1: jahiaCloudV1Provider,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Returns a provider by name.
|
|
9
|
+
* Throws if the provider name is not recognized.
|
|
10
|
+
*/
|
|
11
|
+
export const getProvider = (name) => {
|
|
12
|
+
const provider = PROVIDER_REGISTRY[name];
|
|
13
|
+
if (!provider) {
|
|
14
|
+
throw new Error(`Unknown provider "${name}". Available providers: ${Object.keys(PROVIDER_REGISTRY).join(', ')}`);
|
|
15
|
+
}
|
|
16
|
+
return provider;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Returns all available provider names.
|
|
20
|
+
*/
|
|
21
|
+
export const listProviderNames = () => Object.keys(PROVIDER_REGISTRY);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|