@modernedi/configuration-runner 0.2.0-rc.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.
@@ -0,0 +1,221 @@
1
+ import { lstat, readFile, realpath, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { TextDecoder } from "node:util";
4
+ import { ConfigurationDesiredFileFormatEnum, ConfigurationDesiredFileMediaTypeEnum, ConfigurationDesiredFileRoleEnum, } from "@modernedi/sdk";
5
+ import { canonicalJson, isJsonObject, sha256, } from "./canonical-json.js";
6
+ import { runnerError } from "./errors.js";
7
+ const UTF8 = new TextDecoder("utf-8", { fatal: true });
8
+ const UTF8_EXACT_TEXT = new TextDecoder("utf-8", {
9
+ fatal: true,
10
+ ignoreBOM: true,
11
+ });
12
+ export async function loadConfigurationBundleDirectory(bundleDirectory) {
13
+ const root = await resolveBundleRoot(bundleDirectory);
14
+ const manifestBytes = await readContainedFile(root, "modernedi.json");
15
+ const manifestDocument = parseJsonObject(manifestBytes, "modernedi.json");
16
+ const manifest = parseManifest(manifestDocument);
17
+ const files = [];
18
+ const resourcePaths = new Map();
19
+ for (const resource of manifest.resources) {
20
+ const folded = resource.path.toLowerCase();
21
+ if (resourcePaths.has(folded)) {
22
+ throw runnerError("BUNDLE_DUPLICATE_RESOURCE_PATH", `Manifest resources contain duplicate path ${resource.path}.`, 2);
23
+ }
24
+ resourcePaths.set(folded, resource);
25
+ }
26
+ const exactPaths = new Set(["modernedi.json"]);
27
+ const foldedPaths = new Set(["modernedi.json"]);
28
+ for (const entry of [...manifest.files].sort((left, right) => compareOrdinal(left.path, right.path))) {
29
+ assertSafeLogicalPath(entry.path);
30
+ const folded = entry.path.toLowerCase();
31
+ if (exactPaths.has(entry.path) || foldedPaths.has(folded)) {
32
+ throw runnerError("BUNDLE_DUPLICATE_PATH", `Manifest files contain duplicate path ${entry.path}.`, 2);
33
+ }
34
+ exactPaths.add(entry.path);
35
+ foldedPaths.add(folded);
36
+ const bytes = await readContainedFile(root, entry.path);
37
+ const resource = resourcePaths.get(folded);
38
+ if (resource) {
39
+ if (resource.path !== entry.path) {
40
+ throw runnerError("BUNDLE_PATH_CASE_MISMATCH", `Manifest resource path ${resource.path} does not exactly match file path ${entry.path}.`, 2);
41
+ }
42
+ const document = parseJsonObject(bytes, entry.path);
43
+ const actualSha256 = sha256(canonicalJson(document));
44
+ files.push(desiredJsonFile(entry.path, ConfigurationDesiredFileRoleEnum.Resource, document, actualSha256));
45
+ continue;
46
+ }
47
+ const content = decodeUtf8(bytes, entry.path, true);
48
+ const actualSha256 = sha256(bytes);
49
+ files.push({
50
+ path: entry.path,
51
+ role: ConfigurationDesiredFileRoleEnum.Source,
52
+ format: ConfigurationDesiredFileFormatEnum.Text,
53
+ mediaType: ConfigurationDesiredFileMediaTypeEnum.TextPlainCharsetutf8,
54
+ contentSha256: actualSha256,
55
+ content,
56
+ });
57
+ }
58
+ for (const resource of manifest.resources) {
59
+ if (!exactPaths.has(resource.path) || resource.path === "modernedi.json") {
60
+ throw runnerError("BUNDLE_RESOURCE_NOT_INVENTORIED", `Manifest resource ${resource.path} is missing from files.`, 2);
61
+ }
62
+ }
63
+ // A directory is editable source, not an immutable reviewed wire bundle.
64
+ // Hash exact source bytes first, then mapping documents, then the manifest.
65
+ const byPath = new Map(files.map((file) => [file.path, file]));
66
+ for (const file of files) {
67
+ if (file.role !== ConfigurationDesiredFileRoleEnum.Resource
68
+ || !isJsonObject(file.content) || file.content.kind !== "Mapping") {
69
+ continue;
70
+ }
71
+ const spec = file.content.spec;
72
+ const transform = isJsonObject(spec) ? spec.transform : undefined;
73
+ if (isJsonObject(transform) && typeof transform.sourcePath === "string") {
74
+ const source = byPath.get(transform.sourcePath);
75
+ if (source?.role === ConfigurationDesiredFileRoleEnum.Source) {
76
+ transform.sourceSha256 = source.contentSha256;
77
+ file.contentSha256 = sha256(canonicalJson(file.content));
78
+ }
79
+ }
80
+ }
81
+ for (const entries of [manifest.files, manifest.resources]) {
82
+ entries.sort((left, right) => compareOrdinal(left.path, right.path));
83
+ for (const entry of entries) {
84
+ entry.document.contentSha256 = byPath.get(entry.path).contentSha256;
85
+ }
86
+ }
87
+ manifestDocument.files = manifest.files.map((entry) => entry.document);
88
+ manifestDocument.resources = manifest.resources.map((entry) => entry.document);
89
+ const bundleSha256 = sha256(canonicalJson(manifestDocument));
90
+ files.push(desiredJsonFile("modernedi.json", ConfigurationDesiredFileRoleEnum.Manifest, manifestDocument, bundleSha256));
91
+ files.sort((left, right) => compareOrdinal(left.path, right.path));
92
+ return { request: { files }, bundleSha256 };
93
+ }
94
+ async function resolveBundleRoot(directory) {
95
+ let root;
96
+ try {
97
+ root = await realpath(path.resolve(directory));
98
+ }
99
+ catch {
100
+ throw runnerError("BUNDLE_DIRECTORY_NOT_FOUND", `Configuration bundle directory was not found: ${directory}.`, 2);
101
+ }
102
+ if (!(await stat(root)).isDirectory()) {
103
+ throw runnerError("BUNDLE_DIRECTORY_REQUIRED", `Configuration bundle path is not a directory: ${directory}.`, 2);
104
+ }
105
+ return root;
106
+ }
107
+ async function readContainedFile(root, logicalPath) {
108
+ assertSafeLogicalPath(logicalPath);
109
+ const components = logicalPath.split("/");
110
+ let candidate = root;
111
+ for (const component of components) {
112
+ candidate = path.join(candidate, component);
113
+ let metadata;
114
+ try {
115
+ metadata = await lstat(candidate);
116
+ }
117
+ catch {
118
+ throw runnerError("BUNDLE_FILE_NOT_FOUND", `Configuration bundle file was not found: ${logicalPath}.`, 2);
119
+ }
120
+ if (metadata.isSymbolicLink()) {
121
+ throw runnerError("BUNDLE_SYMLINK_FORBIDDEN", `Configuration bundle paths may not traverse symbolic links: ${logicalPath}.`, 2);
122
+ }
123
+ }
124
+ const resolved = await realpath(candidate);
125
+ const relative = path.relative(root, resolved);
126
+ if (relative === ".."
127
+ || relative.startsWith(`..${path.sep}`)
128
+ || path.isAbsolute(relative)) {
129
+ throw runnerError("BUNDLE_PATH_ESCAPE", `Configuration bundle path escapes its root: ${logicalPath}.`, 2);
130
+ }
131
+ if (!(await stat(resolved)).isFile()) {
132
+ throw runnerError("BUNDLE_FILE_REQUIRED", `Configuration bundle path is not a file: ${logicalPath}.`, 2);
133
+ }
134
+ return readFile(resolved);
135
+ }
136
+ function parseJsonObject(bytes, logicalPath) {
137
+ let value;
138
+ try {
139
+ value = JSON.parse(decodeUtf8(bytes, logicalPath));
140
+ }
141
+ catch (error) {
142
+ if (error instanceof SyntaxError) {
143
+ throw runnerError("BUNDLE_JSON_INVALID", `Configuration bundle file is not valid JSON: ${logicalPath}.`, 2);
144
+ }
145
+ throw error;
146
+ }
147
+ if (!isJsonObject(value)) {
148
+ throw runnerError("BUNDLE_JSON_OBJECT_REQUIRED", `Configuration JSON file must contain an object: ${logicalPath}.`, 2);
149
+ }
150
+ return value;
151
+ }
152
+ function decodeUtf8(bytes, logicalPath, preserveBom = false) {
153
+ try {
154
+ return (preserveBom ? UTF8_EXACT_TEXT : UTF8).decode(bytes);
155
+ }
156
+ catch {
157
+ throw runnerError("BUNDLE_UTF8_REQUIRED", `Configuration bundle file is not valid UTF-8: ${logicalPath}.`, 2);
158
+ }
159
+ }
160
+ function parseManifest(document) {
161
+ if (document.apiVersion !== "modernedi.com/v1"
162
+ || document.kind !== "IntegrationConfiguration") {
163
+ throw runnerError("BUNDLE_MANIFEST_IDENTITY_INVALID", "modernedi.json must identify modernedi.com/v1 IntegrationConfiguration.", 2);
164
+ }
165
+ const files = parseManifestEntries(document.files, "files", false);
166
+ const resources = parseManifestEntries(document.resources, "resources", true);
167
+ return { document, files, resources };
168
+ }
169
+ function parseManifestEntries(value, field, resource) {
170
+ if (!Array.isArray(value)) {
171
+ throw runnerError("BUNDLE_MANIFEST_INVENTORY_INVALID", `modernedi.json ${field} must be an array.`, 2);
172
+ }
173
+ return value.map((item, index) => {
174
+ if (!isJsonObject(item)) {
175
+ throw runnerError("BUNDLE_MANIFEST_INVENTORY_INVALID", `modernedi.json ${field}[${index}] must be an object.`, 2);
176
+ }
177
+ const logicalPath = requiredString(item.path, `${field}[${index}].path`);
178
+ assertSafeLogicalPath(logicalPath);
179
+ if (!resource) {
180
+ return { path: logicalPath, document: item };
181
+ }
182
+ return {
183
+ path: logicalPath,
184
+ document: item,
185
+ kind: requiredString(item.kind, `${field}[${index}].kind`),
186
+ key: requiredString(item.key, `${field}[${index}].key`),
187
+ };
188
+ });
189
+ }
190
+ function desiredJsonFile(logicalPath, role, content, contentSha256) {
191
+ return {
192
+ path: logicalPath,
193
+ role,
194
+ format: ConfigurationDesiredFileFormatEnum.Json,
195
+ mediaType: ConfigurationDesiredFileMediaTypeEnum.ApplicationJson,
196
+ contentSha256,
197
+ content: content,
198
+ };
199
+ }
200
+ function assertSafeLogicalPath(logicalPath) {
201
+ const components = logicalPath.split("/");
202
+ if (!logicalPath
203
+ || logicalPath.startsWith("/")
204
+ || logicalPath.includes("\\")
205
+ || logicalPath.includes(":")
206
+ || components.some((component) => !component || component === "." || component === "..")
207
+ || logicalPath === "_state"
208
+ || logicalPath.startsWith("_state/")) {
209
+ throw runnerError("BUNDLE_PATH_UNSAFE", `Configuration path is not a safe portable desired path: ${logicalPath || "<empty>"}.`, 2);
210
+ }
211
+ }
212
+ function requiredString(value, label) {
213
+ if (typeof value !== "string" || !value) {
214
+ throw runnerError("BUNDLE_MANIFEST_FIELD_INVALID", `modernedi.json ${label} must be a non-empty string.`, 2);
215
+ }
216
+ return value;
217
+ }
218
+ function compareOrdinal(left, right) {
219
+ return left < right ? -1 : left > right ? 1 : 0;
220
+ }
221
+ //# sourceMappingURL=bundle-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-directory.js","sourceRoot":"","sources":["../src/bundle-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export declare function isJsonObject(value: unknown): value is Record<string, JsonValue>;
5
+ export declare function canonicalJsonValue(value: JsonValue): JsonValue;
6
+ export declare function canonicalJson(value: JsonValue): string;
7
+ export declare function deterministicJson(value: JsonValue): string;
8
+ export declare function sha256(value: string | Uint8Array): string;
9
+ //# sourceMappingURL=canonical-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAY9D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,25 @@
1
+ import { createHash } from "node:crypto";
2
+ export function isJsonObject(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ export function canonicalJsonValue(value) {
6
+ if (Array.isArray(value)) {
7
+ return value.map(canonicalJsonValue);
8
+ }
9
+ if (isJsonObject(value)) {
10
+ return Object.fromEntries(Object.keys(value)
11
+ .sort()
12
+ .map((key) => [key, canonicalJsonValue(value[key])]));
13
+ }
14
+ return value;
15
+ }
16
+ export function canonicalJson(value) {
17
+ return JSON.stringify(canonicalJsonValue(value));
18
+ }
19
+ export function deterministicJson(value) {
20
+ return `${JSON.stringify(canonicalJsonValue(value), null, 2)}\n`;
21
+ }
22
+ export function sha256(value) {
23
+ return createHash("sha256").update(value).digest("hex");
24
+ }
25
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACf,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAgB;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAA0B;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { type ConfigurationRunnerClient } from "./runner.js";
2
+ type RunnerCommand = PlanCommand | ApplyReviewedCommand | WaitCommand | HelpCommand;
3
+ interface HelpCommand {
4
+ mode: "help";
5
+ }
6
+ interface PlanCommand {
7
+ mode: "plan";
8
+ bundleDirectory: string;
9
+ artifactPath: string;
10
+ }
11
+ interface ApplyReviewedCommand {
12
+ mode: "apply-reviewed";
13
+ bundleDirectory: string;
14
+ reviewedPlanPath: string;
15
+ artifactPath: string;
16
+ timeoutMs: number;
17
+ }
18
+ interface WaitCommand {
19
+ mode: "wait";
20
+ resultPath: string;
21
+ artifactPath: string;
22
+ timeoutMs: number;
23
+ }
24
+ interface RunnerEnvironment {
25
+ MODERNEDI_API_KEY?: string;
26
+ MODERNEDI_API_URL?: string;
27
+ MODERNEDI_APP_URL?: string;
28
+ MODERNEDI_IDEMPOTENCY_KEY?: string;
29
+ }
30
+ interface CliDependencies {
31
+ createClient?: (environment: RunnerEnvironment) => ConfigurationRunnerClient;
32
+ stdout?: (message: string) => void;
33
+ }
34
+ export declare function runCli(argv: readonly string[], environment?: RunnerEnvironment, dependencies?: CliDependencies): Promise<number>;
35
+ export declare function parseCommand(argv: readonly string[]): RunnerCommand;
36
+ export declare function formatCliError(error: unknown): string;
37
+ export declare function exitCodeForError(error: unknown): number;
38
+ export {};
39
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAYA,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,aAAa,CAAC;AAKrB,KAAK,aAAa,GAAG,WAAW,GAAG,oBAAoB,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpF,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,UAAU,eAAe;IACvB,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,yBAAyB,CAAC;IAC7E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,GAAE,iBAA+B,EAC5C,YAAY,GAAE,eAAoB,GACjC,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAyCnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvD"}
package/dist/cli.js ADDED
@@ -0,0 +1,222 @@
1
+ import { ModernEdiApiError, ModernEdiClient, } from "@modernedi/sdk";
2
+ import { readConfigurationApplyResultArtifact, readConfigurationPlanArtifact, writeArtifact, } from "./artifacts.js";
3
+ import { loadConfigurationBundleDirectory } from "./bundle-directory.js";
4
+ import { ConfigurationRunnerError, runnerError } from "./errors.js";
5
+ import { applyReviewedConfiguration, planConfiguration, waitForConfigurationApply, } from "./runner.js";
6
+ const DEFAULT_PLAN_PATH = "plan.json";
7
+ const DEFAULT_RESULT_PATH = "result.json";
8
+ export async function runCli(argv, environment = process.env, dependencies = {}) {
9
+ const command = parseCommand(argv);
10
+ const stdout = dependencies.stdout ?? ((message) => process.stdout.write(message));
11
+ if (command.mode === "help") {
12
+ stdout(`${usageText()}\n`);
13
+ return 0;
14
+ }
15
+ const client = (dependencies.createClient ?? createClient)(environment);
16
+ if (command.mode === "plan") {
17
+ const bundle = await loadConfigurationBundleDirectory(command.bundleDirectory);
18
+ const artifact = await planConfiguration(client, bundle.request);
19
+ if (artifact.desiredBundleSha256 !== bundle.bundleSha256) {
20
+ throw runnerError("BUNDLE_HASH_DISAGREEMENT", `Local manifest hash ${bundle.bundleSha256} does not match ModernEDI desired bundle ${artifact.desiredBundleSha256}.`, 2);
21
+ }
22
+ await writeArtifact(command.artifactPath, artifact);
23
+ stdout(renderPlanSummary(artifact, command.artifactPath));
24
+ return artifact.planSha256 === null ? 2 : 0;
25
+ }
26
+ if (command.mode === "wait") {
27
+ const stored = await readConfigurationApplyResultArtifact(command.resultPath);
28
+ const result = await waitForConfigurationApply({
29
+ client,
30
+ result: stored,
31
+ timeoutMs: command.timeoutMs,
32
+ appUrl: environment.MODERNEDI_APP_URL,
33
+ onResult: (artifact) => writeArtifact(command.artifactPath, artifact),
34
+ });
35
+ await writeArtifact(command.artifactPath, result);
36
+ stdout(renderApplySummary(result, command.artifactPath));
37
+ return 0;
38
+ }
39
+ const reviewed = await readConfigurationPlanArtifact(command.reviewedPlanPath);
40
+ const bundle = await loadConfigurationBundleDirectory(command.bundleDirectory);
41
+ if (bundle.bundleSha256 !== reviewed.desiredBundleSha256) {
42
+ throw runnerError("REVIEWED_BUNDLE_MISMATCH", `Protected apply bundle ${bundle.bundleSha256} does not match reviewed bundle ${reviewed.desiredBundleSha256}. No apply was submitted.`, 3);
43
+ }
44
+ const idempotencyKey = environment.MODERNEDI_IDEMPOTENCY_KEY;
45
+ if (idempotencyKey === undefined) {
46
+ throw runnerError("IDEMPOTENCY_KEY_REQUIRED", "Set MODERNEDI_IDEMPOTENCY_KEY to the persisted deployment identity before apply-reviewed.", 64);
47
+ }
48
+ const result = await applyReviewedConfiguration({
49
+ client,
50
+ request: bundle.request,
51
+ reviewedPlan: reviewed,
52
+ idempotencyKey,
53
+ timeoutMs: command.timeoutMs,
54
+ appUrl: environment.MODERNEDI_APP_URL,
55
+ onResult: (artifact) => writeArtifact(command.artifactPath, artifact),
56
+ });
57
+ await writeArtifact(command.artifactPath, result);
58
+ stdout(renderApplySummary(result, command.artifactPath));
59
+ return 0;
60
+ }
61
+ export function parseCommand(argv) {
62
+ const [mode, ...tokens] = argv;
63
+ if ((mode === "--help" || mode === "-h" || mode === "help")
64
+ && tokens.length === 0) {
65
+ return { mode: "help" };
66
+ }
67
+ if (mode !== "plan" && mode !== "apply-reviewed" && mode !== "wait") {
68
+ throw usageError();
69
+ }
70
+ const flags = parseFlags(tokens);
71
+ if (mode === "plan") {
72
+ assertAllowedFlags(flags, ["--bundle", "--plan-out"]);
73
+ return {
74
+ mode,
75
+ bundleDirectory: requiredFlag(flags, "--bundle"),
76
+ artifactPath: flags.get("--plan-out") ?? DEFAULT_PLAN_PATH,
77
+ };
78
+ }
79
+ if (mode === "wait") {
80
+ assertAllowedFlags(flags, ["--result", "--result-out", "--timeout-seconds"]);
81
+ const resultPath = requiredFlag(flags, "--result");
82
+ return {
83
+ mode,
84
+ resultPath,
85
+ artifactPath: flags.get("--result-out") ?? resultPath,
86
+ timeoutMs: parseTimeout(flags.get("--timeout-seconds")),
87
+ };
88
+ }
89
+ assertAllowedFlags(flags, [
90
+ "--bundle",
91
+ "--reviewed-plan",
92
+ "--result-out",
93
+ "--timeout-seconds",
94
+ ]);
95
+ return {
96
+ mode,
97
+ bundleDirectory: requiredFlag(flags, "--bundle"),
98
+ reviewedPlanPath: requiredFlag(flags, "--reviewed-plan"),
99
+ artifactPath: flags.get("--result-out") ?? DEFAULT_RESULT_PATH,
100
+ timeoutMs: parseTimeout(flags.get("--timeout-seconds")),
101
+ };
102
+ }
103
+ export function formatCliError(error) {
104
+ if (error instanceof ModernEdiApiError) {
105
+ const request = error.requestId ? ` requestId=${error.requestId}` : "";
106
+ const details = error.details === undefined
107
+ ? ""
108
+ : `\nDetails: ${JSON.stringify(error.details)}`;
109
+ return `[${error.code}] ModernEDI returned HTTP ${error.status}: ${error.message}.${request}${details}\n`;
110
+ }
111
+ if (error instanceof ConfigurationRunnerError) {
112
+ return `[${error.code}] ${error.message}\n`;
113
+ }
114
+ return `[UNEXPECTED_ERROR] ${error instanceof Error ? error.message : String(error)}\n`;
115
+ }
116
+ export function exitCodeForError(error) {
117
+ return error instanceof ConfigurationRunnerError ? error.exitCode : 1;
118
+ }
119
+ function createClient(environment) {
120
+ const apiKey = environment.MODERNEDI_API_KEY;
121
+ if (!apiKey) {
122
+ throw runnerError("API_KEY_REQUIRED", "Set MODERNEDI_API_KEY before running configuration automation.", 64);
123
+ }
124
+ return new ModernEdiClient({
125
+ apiKey,
126
+ ...(environment.MODERNEDI_API_URL
127
+ ? { baseUrl: environment.MODERNEDI_API_URL }
128
+ : {}),
129
+ retry: { maxAttempts: 3 },
130
+ });
131
+ }
132
+ function parseFlags(tokens) {
133
+ const flags = new Map();
134
+ for (let index = 0; index < tokens.length; index += 2) {
135
+ const flag = tokens[index];
136
+ const value = tokens[index + 1];
137
+ if (!flag?.startsWith("--") || value === undefined || value.startsWith("--")) {
138
+ throw usageError();
139
+ }
140
+ if (flags.has(flag)) {
141
+ throw runnerError("ARGUMENT_DUPLICATE", `Argument ${flag} may be supplied only once.`, 64);
142
+ }
143
+ flags.set(flag, value);
144
+ }
145
+ return flags;
146
+ }
147
+ function assertAllowedFlags(flags, allowed) {
148
+ for (const flag of flags.keys()) {
149
+ if (!allowed.includes(flag)) {
150
+ throw runnerError("ARGUMENT_UNKNOWN", `Unknown argument ${flag}.`, 64);
151
+ }
152
+ }
153
+ }
154
+ function requiredFlag(flags, flag) {
155
+ const value = flags.get(flag);
156
+ if (!value) {
157
+ throw runnerError("ARGUMENT_REQUIRED", `${flag} is required.`, 64);
158
+ }
159
+ return value;
160
+ }
161
+ function parseTimeout(value) {
162
+ if (value === undefined) {
163
+ return 15 * 60_000;
164
+ }
165
+ const seconds = Number(value);
166
+ if (!Number.isSafeInteger(seconds) || seconds < 1 || seconds > 86_400) {
167
+ throw runnerError("ARGUMENT_TIMEOUT_INVALID", "--timeout-seconds must be a whole number from 1 through 86400.", 64);
168
+ }
169
+ return seconds * 1_000;
170
+ }
171
+ function usageError() {
172
+ return runnerError("USAGE", usageText(), 64);
173
+ }
174
+ function usageText() {
175
+ return [
176
+ "Usage:",
177
+ ` modernedi-configuration plan --bundle <directory> [--plan-out ${DEFAULT_PLAN_PATH}]`,
178
+ ` modernedi-configuration apply-reviewed --bundle <directory> --reviewed-plan <plan.json> [--result-out ${DEFAULT_RESULT_PATH}] [--timeout-seconds 900]`,
179
+ " modernedi-configuration wait --result <result.json> [--result-out <result.json>] [--timeout-seconds 900]",
180
+ ].join("\n");
181
+ }
182
+ function renderPlanSummary(artifact, artifactPath) {
183
+ const plan = artifact.plan;
184
+ const summary = plan.summary;
185
+ const lines = [
186
+ `Plan: ${plan.applicable === true ? "APPLICABLE" : "NOT APPLICABLE"}`,
187
+ `Desired bundle: ${artifact.desiredBundleSha256}`,
188
+ `Plan identity: ${artifact.planSha256 ?? "none"}`,
189
+ ];
190
+ if (summary !== null && typeof summary === "object" && !Array.isArray(summary)) {
191
+ lines.push(`Changes: create=${String(summary.create)} update=${String(summary.update)} delete=${String(summary.delete)} unchanged=${String(summary.unchanged)}`);
192
+ }
193
+ const operations = Array.isArray(plan.operations) ? plan.operations : [];
194
+ for (const operation of operations) {
195
+ if (operation !== null && typeof operation === "object" && !Array.isArray(operation)) {
196
+ lines.push(` ${String(operation.action)} ${String(operation.kind)} ${String(operation.key)} ${String(operation.path)}`);
197
+ }
198
+ }
199
+ const diagnostics = Array.isArray(plan.diagnostics) ? plan.diagnostics : [];
200
+ for (const diagnostic of diagnostics) {
201
+ if (diagnostic !== null && typeof diagnostic === "object" && !Array.isArray(diagnostic)) {
202
+ lines.push(` ${String(diagnostic.severity)} ${String(diagnostic.code)} ${String(diagnostic.pointer)} ${String(diagnostic.message)}`);
203
+ }
204
+ }
205
+ lines.push(`Artifact: ${artifactPath}`, "");
206
+ return lines.join("\n");
207
+ }
208
+ function renderApplySummary(result, artifactPath) {
209
+ return [
210
+ "Reviewed plan: VERIFIED",
211
+ `Desired bundle: ${result.reviewed.desiredBundleSha256}`,
212
+ `Plan identity: ${result.reviewed.planSha256}`,
213
+ `Operation: ${String(result.operation.operationId)}`,
214
+ `Status: ${String(result.operation.status)}`,
215
+ `Runtime revision: ${String(result.operation.runtimeConfigurationRevision)}`,
216
+ `Idempotency replayed: ${String(result.idempotencyReplayed)}`,
217
+ `Workspace: ${result.workspaceUrl}`,
218
+ `Artifact: ${artifactPath}`,
219
+ "",
220
+ ].join("\n");
221
+ }
222
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class ConfigurationRunnerError extends Error {
2
+ readonly code: string;
3
+ readonly exitCode: number;
4
+ constructor(code: string, message: string, exitCode?: number);
5
+ }
6
+ export declare function runnerError(code: string, message: string, exitCode?: number): ConfigurationRunnerError;
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI,EAKtD;CACF;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,SAAI,GACX,wBAAwB,CAE1B"}
package/dist/errors.js ADDED
@@ -0,0 +1,14 @@
1
+ export class ConfigurationRunnerError extends Error {
2
+ code;
3
+ exitCode;
4
+ constructor(code, message, exitCode = 1) {
5
+ super(message);
6
+ this.name = "ConfigurationRunnerError";
7
+ this.code = code;
8
+ this.exitCode = exitCode;
9
+ }
10
+ }
11
+ export function runnerError(code, message, exitCode = 1) {
12
+ return new ConfigurationRunnerError(code, message, exitCode);
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,IAAI,CAAS;IACb,QAAQ,CAAS;IAE1B,YAAY,IAAY,EAAE,OAAe,EAAE,QAAQ,GAAG,CAAC;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,OAAe,EACf,QAAQ,GAAG,CAAC;IAEZ,OAAO,IAAI,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { RUNNER_ARTIFACT_API_VERSION, readConfigurationApplyResultArtifact, readConfigurationPlanArtifact, writeArtifact, type ConfigurationApplyResultArtifact, type ConfigurationPlanArtifact, } from "./artifacts.js";
2
+ export { loadConfigurationBundleDirectory, type LoadedConfigurationBundle, } from "./bundle-directory.js";
3
+ export { ConfigurationRunnerError } from "./errors.js";
4
+ export { DEFAULT_APPLY_TIMEOUT_MS, applyReviewedConfiguration, planConfiguration, waitForConfigurationApply, type ApplyReviewedOptions, type ConfigurationRunnerClient, type WaitForConfigurationApplyOptions, } from "./runner.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,oCAAoC,EACpC,6BAA6B,EAC7B,aAAa,EACb,KAAK,gCAAgC,EACrC,KAAK,yBAAyB,GAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,KAAK,yBAAyB,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,GACtC,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { RUNNER_ARTIFACT_API_VERSION, readConfigurationApplyResultArtifact, readConfigurationPlanArtifact, writeArtifact, } from "./artifacts.js";
2
+ export { loadConfigurationBundleDirectory, } from "./bundle-directory.js";
3
+ export { ConfigurationRunnerError } from "./errors.js";
4
+ export { DEFAULT_APPLY_TIMEOUT_MS, applyReviewedConfiguration, planConfiguration, waitForConfigurationApply, } from "./runner.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,oCAAoC,EACpC,6BAA6B,EAC7B,aAAa,GAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,GAEjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,GAI1B,MAAM,aAAa,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
package/dist/main.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { exitCodeForError, formatCliError, runCli, } from "./cli.js";
3
+ try {
4
+ process.exitCode = await runCli(process.argv.slice(2));
5
+ }
6
+ catch (error) {
7
+ process.stderr.write(formatCliError(error));
8
+ process.exitCode = exitCodeForError(error);
9
+ }
10
+ //# sourceMappingURL=main.js.map