@jahia/jahia-cli 0.1.4 → 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,192 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { Command, Flags } from '@oclif/core';
|
|
3
|
+
import { confirm, input } from '@inquirer/prompts';
|
|
4
|
+
import { getComponent, listUserSelectableComponents } from '../../lib/components/index.js';
|
|
5
|
+
import { generateEnvName } from '../../lib/config/defaults.js';
|
|
6
|
+
import { configToYaml } from '../../lib/config/config-to-yaml.js';
|
|
7
|
+
import { extractExportableConfig, mergeEnvironmentIntoConfig } from '../../lib/config/export-config.js';
|
|
8
|
+
import { loadConfigFile, resolveConfigComponents } from '../../lib/config/parser.js';
|
|
9
|
+
import { formatCreateResultHuman, formatCreateResultJson } from '../../lib/output/formatter.js';
|
|
10
|
+
import { getProvider } from '../../lib/providers/index.js';
|
|
11
|
+
import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
|
|
12
|
+
import { deleteState } from '../../lib/state/delete-state.js';
|
|
13
|
+
import { saveState } from '../../lib/state/save-state.js';
|
|
14
|
+
import { stateFilePath } from '../../lib/state/state-file-path.js';
|
|
15
|
+
import { stateFlag } from '../../lib/state/state-flag.js';
|
|
16
|
+
import { jahia as jahiaComponent } from '../../lib/components/jahia.js';
|
|
17
|
+
import { loadExistingConfig } from './export.js';
|
|
18
|
+
/**
|
|
19
|
+
* Prompts the user interactively for Jahia image and builds a minimal config.
|
|
20
|
+
*/
|
|
21
|
+
export const promptForJahiaConfig = async () => {
|
|
22
|
+
const defaultImage = `${jahiaComponent.image}:${jahiaComponent.defaultTag}`;
|
|
23
|
+
const image = await input({
|
|
24
|
+
message: `Jahia Docker image (image:tag):`,
|
|
25
|
+
default: defaultImage,
|
|
26
|
+
});
|
|
27
|
+
return { image };
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Prompts the user for optional utility components (e.g., SMTP server).
|
|
31
|
+
* Returns an array of ConfigComponent entries to add to the environment.
|
|
32
|
+
*/
|
|
33
|
+
export const promptForOptionalComponents = async () => {
|
|
34
|
+
const components = [];
|
|
35
|
+
const wantSmtp = await confirm({
|
|
36
|
+
message: 'Add an SMTP server (Mailpit) for email testing?',
|
|
37
|
+
default: false,
|
|
38
|
+
});
|
|
39
|
+
if (wantSmtp) {
|
|
40
|
+
components.push({ name: 'smtp-server' });
|
|
41
|
+
}
|
|
42
|
+
return components;
|
|
43
|
+
};
|
|
44
|
+
export default class EnvironmentCreate extends Command {
|
|
45
|
+
static description = 'Create a new Jahia environment. ' +
|
|
46
|
+
'Starts Jahia with embedded Derby database and VictoriaLogs for log aggregation. ' +
|
|
47
|
+
'Use interactive mode (no arguments) or provide a YAML config file.';
|
|
48
|
+
static examples = [
|
|
49
|
+
'<%= config.bin %> environment create',
|
|
50
|
+
'<%= config.bin %> environment create --config ./environment.yml',
|
|
51
|
+
'<%= config.bin %> environment create --force',
|
|
52
|
+
'<%= config.bin %> environment create --export-config ./env.yml',
|
|
53
|
+
'<%= config.bin %> environment create --config ./environment.yml --export-config ./env.yml',
|
|
54
|
+
'<%= config.bin %> environment create --state /ci/workspace/state.json',
|
|
55
|
+
];
|
|
56
|
+
static flags = {
|
|
57
|
+
state: stateFlag,
|
|
58
|
+
config: Flags.string({
|
|
59
|
+
char: 'c',
|
|
60
|
+
description: 'Path to a YAML environment configuration file',
|
|
61
|
+
env: 'JAHIA_CLI_CONFIG',
|
|
62
|
+
}),
|
|
63
|
+
force: Flags.boolean({
|
|
64
|
+
char: 'f',
|
|
65
|
+
description: 'Delete existing environment before creating a new one',
|
|
66
|
+
default: false,
|
|
67
|
+
}),
|
|
68
|
+
'export-config': Flags.string({
|
|
69
|
+
char: 'e',
|
|
70
|
+
description: 'Export the environment configuration to a YAML file after creation',
|
|
71
|
+
}),
|
|
72
|
+
json: Flags.boolean({
|
|
73
|
+
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
74
|
+
default: false,
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
async run() {
|
|
78
|
+
const { flags } = await this.parse(EnvironmentCreate);
|
|
79
|
+
const stateOverride = flags.state;
|
|
80
|
+
const statePath = stateFilePath(stateOverride);
|
|
81
|
+
// Single-environment guard
|
|
82
|
+
const existing = await getActiveEnvironment(stateOverride);
|
|
83
|
+
if (existing) {
|
|
84
|
+
if (flags.force) {
|
|
85
|
+
const provider = getProvider(existing.provider);
|
|
86
|
+
await provider.destroyEnvironment(existing.name);
|
|
87
|
+
await deleteState(stateOverride);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const msg = `An environment "${existing.name}" is already active.\n\n` +
|
|
91
|
+
` State file: ${statePath}\n\n` +
|
|
92
|
+
' To stop it: jahia-cli environment stop\n' +
|
|
93
|
+
' To delete it: jahia-cli environment delete\n\n' +
|
|
94
|
+
' Use --force to override this check.';
|
|
95
|
+
if (flags.json) {
|
|
96
|
+
this.log(JSON.stringify({
|
|
97
|
+
success: false,
|
|
98
|
+
error: 'environment_exists',
|
|
99
|
+
existing: existing.name,
|
|
100
|
+
message: msg,
|
|
101
|
+
stateFile: statePath,
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.error(msg);
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const config = await this.resolveConfig(flags);
|
|
111
|
+
// Validate all component names exist
|
|
112
|
+
config.components.forEach((entry) => {
|
|
113
|
+
const def = getComponent(entry.name);
|
|
114
|
+
if (!def) {
|
|
115
|
+
this.error(`Unknown component "${entry.name}". Available: ${listUserSelectableComponents()
|
|
116
|
+
.map((c) => c.name)
|
|
117
|
+
.join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Resolve components and create environment
|
|
121
|
+
const resolved = resolveConfigComponents(config);
|
|
122
|
+
const provider = getProvider(config.provider);
|
|
123
|
+
const result = await provider.createEnvironment(config.name, resolved, (msg) => {
|
|
124
|
+
this.log(msg);
|
|
125
|
+
});
|
|
126
|
+
// Persist state on success
|
|
127
|
+
if (result.success) {
|
|
128
|
+
const persistedEnv = {
|
|
129
|
+
name: config.name,
|
|
130
|
+
provider: config.provider,
|
|
131
|
+
network: result.environment.network,
|
|
132
|
+
components: result.environment.components.map((c) => ({
|
|
133
|
+
name: c.name,
|
|
134
|
+
image: resolved.find((r) => r.definition.name === c.name)?.effectiveImage ?? 'unknown',
|
|
135
|
+
tag: resolved.find((r) => r.definition.name === c.name)?.effectiveTag ?? 'latest',
|
|
136
|
+
containerId: c.containerId ?? '',
|
|
137
|
+
})),
|
|
138
|
+
config,
|
|
139
|
+
createdAt: result.environment.createdAt ?? new Date().toISOString(),
|
|
140
|
+
};
|
|
141
|
+
const stateFile = { version: 1, environment: persistedEnv };
|
|
142
|
+
await saveState(stateFile, stateOverride);
|
|
143
|
+
// Export config if requested
|
|
144
|
+
const exportPath = flags['export-config'];
|
|
145
|
+
if (exportPath) {
|
|
146
|
+
const envConfig = extractExportableConfig(persistedEnv);
|
|
147
|
+
const existingConfig = await loadExistingConfig(exportPath);
|
|
148
|
+
const mergedConfig = mergeEnvironmentIntoConfig(existingConfig, envConfig);
|
|
149
|
+
const yamlContent = configToYaml(mergedConfig);
|
|
150
|
+
await writeFile(exportPath, yamlContent, 'utf-8');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Output
|
|
154
|
+
if (flags.json) {
|
|
155
|
+
this.log(formatCreateResultJson(result, statePath));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.log(formatCreateResultHuman(result));
|
|
159
|
+
this.log(` State: ${statePath}`);
|
|
160
|
+
const exportPath = flags['export-config'];
|
|
161
|
+
if (result.success && exportPath) {
|
|
162
|
+
this.log(` Config exported: ${exportPath}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!result.success) {
|
|
166
|
+
this.exit(1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async resolveConfig(flags) {
|
|
170
|
+
if (flags.config) {
|
|
171
|
+
const loaded = await loadConfigFile(flags.config);
|
|
172
|
+
if (!loaded.environment) {
|
|
173
|
+
this.error('Configuration file must include an "environment" section with at least one component.');
|
|
174
|
+
}
|
|
175
|
+
return loaded.environment;
|
|
176
|
+
}
|
|
177
|
+
// Interactive mode — ask for Jahia image:tag, then optional components
|
|
178
|
+
const { image } = await promptForJahiaConfig();
|
|
179
|
+
const optionalComponents = await promptForOptionalComponents();
|
|
180
|
+
const defaultImage = `${jahiaComponent.image}:${jahiaComponent.defaultTag}`;
|
|
181
|
+
const overrides = image !== defaultImage ? { image } : undefined;
|
|
182
|
+
return {
|
|
183
|
+
name: generateEnvName(),
|
|
184
|
+
provider: 'docker',
|
|
185
|
+
components: [
|
|
186
|
+
{ name: 'jahia', overrides },
|
|
187
|
+
...optionalComponents,
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/environment/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class EnvironmentDelete extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
provider: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/environment/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAS7C,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,OAAgB,WAAW,SAEwD;IAEnF,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;MAWnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0ClC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { DEFAULT_PROVIDER } from '../../lib/config/defaults.js';
|
|
3
|
+
import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
|
|
4
|
+
import { deleteState } from '../../lib/state/delete-state.js';
|
|
5
|
+
import { stateFilePath } from '../../lib/state/state-file-path.js';
|
|
6
|
+
import { stateFlag } from '../../lib/state/state-flag.js';
|
|
7
|
+
import { getProvider } from '../../lib/providers/index.js';
|
|
8
|
+
export default class EnvironmentDelete extends Command {
|
|
9
|
+
static description = 'Destroy a Jahia environment completely. ' +
|
|
10
|
+
'Removes all containers, networks, and volumes associated with the environment.';
|
|
11
|
+
static examples = [
|
|
12
|
+
'<%= config.bin %> environment delete',
|
|
13
|
+
'<%= config.bin %> environment delete --json',
|
|
14
|
+
'<%= config.bin %> environment delete --state /ci/workspace/state.json',
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
state: stateFlag,
|
|
18
|
+
provider: Flags.string({
|
|
19
|
+
char: 'p',
|
|
20
|
+
description: 'Provider to use',
|
|
21
|
+
default: DEFAULT_PROVIDER,
|
|
22
|
+
}),
|
|
23
|
+
json: Flags.boolean({
|
|
24
|
+
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
25
|
+
default: false,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
async run() {
|
|
29
|
+
const { flags } = await this.parse(EnvironmentDelete);
|
|
30
|
+
const stateOverride = flags.state;
|
|
31
|
+
const statePath = stateFilePath(stateOverride);
|
|
32
|
+
const env = await getActiveEnvironment(stateOverride);
|
|
33
|
+
if (!env) {
|
|
34
|
+
const msg = 'No active environment found. Nothing to delete.';
|
|
35
|
+
if (flags.json) {
|
|
36
|
+
this.log(JSON.stringify({ success: false, error: 'no_environment', message: msg, stateFile: statePath }));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.error(msg);
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const provider = getProvider(flags.provider);
|
|
44
|
+
const result = await provider.destroyEnvironment(env.name);
|
|
45
|
+
await deleteState(stateOverride);
|
|
46
|
+
if (flags.json) {
|
|
47
|
+
this.log(JSON.stringify({ ...result, stateFile: statePath }, null, 2));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
if (result.success) {
|
|
51
|
+
this.log(`✓ Environment "${env.name}" deleted successfully`);
|
|
52
|
+
this.log(` Removed ${String(result.removedComponents.length)} container(s)`);
|
|
53
|
+
this.log(` Removed ${String(result.removedVolumes.length)} volume(s)`);
|
|
54
|
+
this.log(` Network removed: ${result.removedNetwork ? 'yes' : 'no'}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.log(`✗ Environment "${env.name}" deletion encountered errors`);
|
|
58
|
+
result.errors.forEach((err) => {
|
|
59
|
+
this.log(` • ${err}`);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
this.log(` State: ${statePath}`);
|
|
63
|
+
}
|
|
64
|
+
if (!result.success) {
|
|
65
|
+
this.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/environment/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class EnvironmentDoctor extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
provider: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/commands/environment/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAS7C,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,OAAgB,WAAW,SAGiC;IAE5D,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,KAAK;;;;;MAenB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BlC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { DEFAULT_PROVIDER } from '../../lib/config/defaults.js';
|
|
3
|
+
import { formatHealthCheckHuman, formatHealthCheckJson } from '../../lib/output/formatter.js';
|
|
4
|
+
import { getProvider, listProviderNames } from '../../lib/providers/index.js';
|
|
5
|
+
import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
|
|
6
|
+
import { stateFilePath } from '../../lib/state/state-file-path.js';
|
|
7
|
+
import { stateFlag } from '../../lib/state/state-flag.js';
|
|
8
|
+
export default class EnvironmentDoctor extends Command {
|
|
9
|
+
static description = 'Check the health status of a Jahia environment. ' +
|
|
10
|
+
'Reports whether containers are running and passing healthchecks. ' +
|
|
11
|
+
'Uses the active environment if --name is not specified.';
|
|
12
|
+
static examples = [
|
|
13
|
+
'<%= config.bin %> environment doctor',
|
|
14
|
+
'<%= config.bin %> environment doctor --name my-env',
|
|
15
|
+
'<%= config.bin %> environment doctor --json',
|
|
16
|
+
'<%= config.bin %> environment doctor --state /ci/workspace/state.json',
|
|
17
|
+
];
|
|
18
|
+
static flags = {
|
|
19
|
+
state: stateFlag,
|
|
20
|
+
name: Flags.string({
|
|
21
|
+
char: 'n',
|
|
22
|
+
description: 'Name of the environment to check (uses active environment if omitted)',
|
|
23
|
+
}),
|
|
24
|
+
provider: Flags.string({
|
|
25
|
+
char: 'p',
|
|
26
|
+
description: `Provider to use (available: ${listProviderNames().join(', ')})`,
|
|
27
|
+
default: DEFAULT_PROVIDER,
|
|
28
|
+
}),
|
|
29
|
+
json: Flags.boolean({
|
|
30
|
+
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
31
|
+
default: false,
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
async run() {
|
|
35
|
+
const { flags } = await this.parse(EnvironmentDoctor);
|
|
36
|
+
const stateOverride = flags.state;
|
|
37
|
+
const statePath = stateFilePath(stateOverride);
|
|
38
|
+
const envName = flags.name ?? (await getActiveEnvironment(stateOverride))?.name;
|
|
39
|
+
if (!envName) {
|
|
40
|
+
const msg = 'No environment specified and no active environment found. Use --name or create an environment first.';
|
|
41
|
+
if (flags.json) {
|
|
42
|
+
this.log(JSON.stringify({ success: false, error: 'no_environment', message: msg, stateFile: statePath }));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.error(msg);
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const provider = getProvider(flags.provider);
|
|
50
|
+
const result = await provider.checkHealth(envName);
|
|
51
|
+
if (flags.json) {
|
|
52
|
+
this.log(formatHealthCheckJson(result, statePath));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.log(formatHealthCheckHuman(result));
|
|
56
|
+
this.log(` State: ${statePath}`);
|
|
57
|
+
}
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
this.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/environment/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,MAAM,CAAU,WAAW,GACzB,kDAAkD;QAClD,mEAAmE;QACnE,yDAAyD,CAAC;IAE5D,MAAM,CAAU,QAAQ,GAAG;QACzB,sCAAsC;QACtC,oDAAoD;QACpD,6CAA6C;QAC7C,uEAAuE;KACxE,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,uEAAuE;SACrF,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,+BAA+B,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC7E,OAAO,EAAE,gBAAgB;SAC1B,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,gEAAgE;YAC7E,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;QAClC,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,oBAAoB,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC;QAChF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,sGAAsG,CAAC;YACnH,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5G,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import type { JahiaCliConfig } from '../../lib/config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the JSON output for the export command.
|
|
5
|
+
*/
|
|
6
|
+
export declare const buildExportJsonOutput: (params: {
|
|
7
|
+
readonly config: JahiaCliConfig;
|
|
8
|
+
readonly yaml: string;
|
|
9
|
+
readonly outputPath: string | undefined;
|
|
10
|
+
readonly statePath: string;
|
|
11
|
+
}) => string;
|
|
12
|
+
/**
|
|
13
|
+
* Builds the human-readable success message after export.
|
|
14
|
+
*/
|
|
15
|
+
export declare const buildExportSuccessMessage: (params: {
|
|
16
|
+
readonly outputPath: string;
|
|
17
|
+
readonly environmentName: string;
|
|
18
|
+
}) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Loads an existing config file if it exists, returning an empty config if not found.
|
|
21
|
+
* This allows merging the environment section into an existing config without losing other sections.
|
|
22
|
+
*/
|
|
23
|
+
export declare const loadExistingConfig: (filePath: string) => Promise<JahiaCliConfig>;
|
|
24
|
+
export default class EnvironmentExport extends Command {
|
|
25
|
+
static description: string;
|
|
26
|
+
static examples: string[];
|
|
27
|
+
static flags: {
|
|
28
|
+
state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
29
|
+
output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
30
|
+
stdout: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
31
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
32
|
+
};
|
|
33
|
+
run(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/environment/export.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAU7C,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,2BAA2B,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ;IAC5C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,KAAG,MAWD,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,KAAG,MAG4D,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,cAAc,CAQjF,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,OAAgB,WAAW,SAGsC;IAEjE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;;MAcnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyElC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { Command, Flags } from '@oclif/core';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { extractExportableConfig, mergeEnvironmentIntoConfig } from '../../lib/config/export-config.js';
|
|
5
|
+
import { configToYaml } from '../../lib/config/config-to-yaml.js';
|
|
6
|
+
import { validateConfig } from '../../lib/config/parser.js';
|
|
7
|
+
import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
|
|
8
|
+
import { stateFilePath } from '../../lib/state/state-file-path.js';
|
|
9
|
+
import { stateFlag } from '../../lib/state/state-flag.js';
|
|
10
|
+
/**
|
|
11
|
+
* Builds the JSON output for the export command.
|
|
12
|
+
*/
|
|
13
|
+
export const buildExportJsonOutput = (params) => JSON.stringify({
|
|
14
|
+
success: true,
|
|
15
|
+
outputPath: params.outputPath ?? 'stdout',
|
|
16
|
+
statePath: params.statePath,
|
|
17
|
+
config: params.config,
|
|
18
|
+
yaml: params.yaml,
|
|
19
|
+
}, undefined, 2);
|
|
20
|
+
/**
|
|
21
|
+
* Builds the human-readable success message after export.
|
|
22
|
+
*/
|
|
23
|
+
export const buildExportSuccessMessage = (params) => `✓ Environment "${params.environmentName}" configuration exported to ${params.outputPath}\n\n` +
|
|
24
|
+
' This file can be used to recreate the environment:\n' +
|
|
25
|
+
` jahia-cli environment create --config ${params.outputPath}`;
|
|
26
|
+
/**
|
|
27
|
+
* Loads an existing config file if it exists, returning an empty config if not found.
|
|
28
|
+
* This allows merging the environment section into an existing config without losing other sections.
|
|
29
|
+
*/
|
|
30
|
+
export const loadExistingConfig = async (filePath) => {
|
|
31
|
+
try {
|
|
32
|
+
const content = await readFile(filePath, 'utf-8');
|
|
33
|
+
const raw = yaml.load(content);
|
|
34
|
+
return validateConfig(raw);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export default class EnvironmentExport extends Command {
|
|
41
|
+
static description = 'Export the active environment configuration to a YAML file. ' +
|
|
42
|
+
'The exported config contains only what is needed to recreate the environment — ' +
|
|
43
|
+
'no runtime state (container IDs, timestamps, network names).';
|
|
44
|
+
static examples = [
|
|
45
|
+
'<%= config.bin %> environment export --output ./env.yml',
|
|
46
|
+
'<%= config.bin %> environment export --stdout',
|
|
47
|
+
'<%= config.bin %> environment export --output ./env.yml --json',
|
|
48
|
+
];
|
|
49
|
+
static flags = {
|
|
50
|
+
state: stateFlag,
|
|
51
|
+
output: Flags.string({
|
|
52
|
+
char: 'o',
|
|
53
|
+
description: 'Path to write the YAML configuration file',
|
|
54
|
+
}),
|
|
55
|
+
stdout: Flags.boolean({
|
|
56
|
+
description: 'Print the YAML configuration to stdout instead of writing to a file',
|
|
57
|
+
default: false,
|
|
58
|
+
}),
|
|
59
|
+
json: Flags.boolean({
|
|
60
|
+
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
61
|
+
default: false,
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
async run() {
|
|
65
|
+
const { flags } = await this.parse(EnvironmentExport);
|
|
66
|
+
const stateOverride = flags.state;
|
|
67
|
+
const statePath = stateFilePath(stateOverride);
|
|
68
|
+
// Validate flags — need either --output or --stdout
|
|
69
|
+
if (!flags.output && !flags.stdout) {
|
|
70
|
+
this.error('Specify --output <path> to write a file, or --stdout to print to terminal.\n\n' +
|
|
71
|
+
' Example: jahia-cli environment export --output ./env.yml\n' +
|
|
72
|
+
` State: ${statePath}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (flags.output && flags.stdout) {
|
|
76
|
+
this.error('Cannot use both --output and --stdout. Choose one.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Load active environment
|
|
80
|
+
const environment = await getActiveEnvironment(stateOverride);
|
|
81
|
+
if (!environment) {
|
|
82
|
+
this.error('No active environment to export.\n\n' +
|
|
83
|
+
' Create one first: jahia-cli environment create\n' +
|
|
84
|
+
` State: ${statePath}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Extract exportable environment config
|
|
88
|
+
const envConfig = extractExportableConfig(environment);
|
|
89
|
+
// Write or print
|
|
90
|
+
if (flags.stdout) {
|
|
91
|
+
const fullConfig = { environment: envConfig };
|
|
92
|
+
const yamlContent = configToYaml(fullConfig);
|
|
93
|
+
if (flags.json) {
|
|
94
|
+
this.log(buildExportJsonOutput({
|
|
95
|
+
config: fullConfig,
|
|
96
|
+
yaml: yamlContent,
|
|
97
|
+
outputPath: undefined,
|
|
98
|
+
statePath,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.log(yamlContent);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (flags.output) {
|
|
106
|
+
const outputPath = flags.output;
|
|
107
|
+
// Load existing config to preserve other sections (e.g., tests)
|
|
108
|
+
const existingConfig = await loadExistingConfig(outputPath);
|
|
109
|
+
const mergedConfig = mergeEnvironmentIntoConfig(existingConfig, envConfig);
|
|
110
|
+
const yamlContent = configToYaml(mergedConfig);
|
|
111
|
+
await writeFile(outputPath, yamlContent, 'utf-8');
|
|
112
|
+
if (flags.json) {
|
|
113
|
+
this.log(buildExportJsonOutput({
|
|
114
|
+
config: mergedConfig,
|
|
115
|
+
yaml: yamlContent,
|
|
116
|
+
outputPath,
|
|
117
|
+
statePath,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.log(buildExportSuccessMessage({ outputPath, environmentName: environment.name }));
|
|
122
|
+
this.log(`\n State: ${statePath}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/commands/environment/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class EnvironmentList extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/environment/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAQ7C,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,OAAgB,WAAW,SAEyC;IAEpE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;MAMnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAkDlC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { formatEnvironmentListHuman } from '../../lib/output/formatter.js';
|
|
3
|
+
import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
|
|
4
|
+
import { reconcileWithDocker } from '../../lib/state/reconcile-with-docker.js';
|
|
5
|
+
import { stateFilePath } from '../../lib/state/state-file-path.js';
|
|
6
|
+
import { stateFlag } from '../../lib/state/state-flag.js';
|
|
7
|
+
export default class EnvironmentList extends Command {
|
|
8
|
+
static description = 'List all components in the active Jahia environment with their live status. ' +
|
|
9
|
+
'Reconciles persisted state with actual Docker container status.';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> environment list',
|
|
12
|
+
'<%= config.bin %> environment list --json',
|
|
13
|
+
'<%= config.bin %> environment list --state /ci/workspace/state.json',
|
|
14
|
+
];
|
|
15
|
+
static flags = {
|
|
16
|
+
state: stateFlag,
|
|
17
|
+
json: Flags.boolean({
|
|
18
|
+
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
19
|
+
default: false,
|
|
20
|
+
}),
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { flags } = await this.parse(EnvironmentList);
|
|
24
|
+
const stateOverride = flags.state;
|
|
25
|
+
const statePath = stateFilePath(stateOverride);
|
|
26
|
+
const env = await getActiveEnvironment(stateOverride);
|
|
27
|
+
if (!env) {
|
|
28
|
+
const msg = 'No active environment found. Use "environment create" first.';
|
|
29
|
+
if (flags.json) {
|
|
30
|
+
this.log(JSON.stringify({ success: false, error: 'no_environment', message: msg, stateFile: statePath }));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.error(msg);
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const reconciled = await reconcileWithDocker(env);
|
|
38
|
+
if (flags.json) {
|
|
39
|
+
this.log(JSON.stringify({
|
|
40
|
+
success: true,
|
|
41
|
+
environment: reconciled.name,
|
|
42
|
+
provider: reconciled.provider,
|
|
43
|
+
network: reconciled.network,
|
|
44
|
+
createdAt: reconciled.createdAt,
|
|
45
|
+
stoppedAt: reconciled.stoppedAt,
|
|
46
|
+
stateFile: statePath,
|
|
47
|
+
components: reconciled.components.map((c) => ({
|
|
48
|
+
name: c.name,
|
|
49
|
+
image: c.image,
|
|
50
|
+
tag: c.tag,
|
|
51
|
+
containerId: c.containerId,
|
|
52
|
+
status: c.liveStatus,
|
|
53
|
+
})),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const status = reconciled.stoppedAt ? 'stopped' : 'running';
|
|
58
|
+
this.log(formatEnvironmentListHuman({
|
|
59
|
+
name: reconciled.name,
|
|
60
|
+
provider: reconciled.provider,
|
|
61
|
+
network: reconciled.network,
|
|
62
|
+
createdAt: reconciled.createdAt,
|
|
63
|
+
status,
|
|
64
|
+
components: reconciled.components,
|
|
65
|
+
}));
|
|
66
|
+
this.log(` State: ${statePath}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=list.js.map
|