@meru454545/nexus-modscript-composer 2.0.12
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 +179 -0
- package/dist/composer.d.ts +83 -0
- package/dist/composer.d.ts.map +1 -0
- package/dist/composer.js +367 -0
- package/dist/composer.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/l0-parser.d.ts +22 -0
- package/dist/l0-parser.d.ts.map +1 -0
- package/dist/l0-parser.js +209 -0
- package/dist/l0-parser.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +54 -0
- package/dist/logger.js.map +1 -0
- package/dist/orchestrator.d.ts +41 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +198 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/script-validator.d.ts +22 -0
- package/dist/script-validator.d.ts.map +1 -0
- package/dist/script-validator.js +1029 -0
- package/dist/script-validator.js.map +1 -0
- package/dist/shellcheck-bin.d.ts +2 -0
- package/dist/shellcheck-bin.d.ts.map +1 -0
- package/dist/shellcheck-bin.js +42 -0
- package/dist/shellcheck-bin.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { generateFinalScript } from "./orchestrator.js";
|
|
2
|
+
export type { GenerateOptions } from "./orchestrator.js";
|
|
3
|
+
export type { OsFamily, ModScriptLifecycle, L0Category, L0Metadata, L0Script, ScriptRunRequest, DeploymentResult, ScriptRunResponse, } from "./types.js";
|
|
4
|
+
export { parseL0Script, parseL0Metadata, stripL0Header } from "./l0-parser.js";
|
|
5
|
+
export { composeL1, composeL2, parseInterval } from "./composer.js";
|
|
6
|
+
export type { ComposeL1Params, ComposeL2Params } from "./composer.js";
|
|
7
|
+
export { validateComposedScripts } from "./script-validator.js";
|
|
8
|
+
export type { ValidationResult, ValidateComposedParams } from "./script-validator.js";
|
|
9
|
+
export { normalizeWindowsLineEndings, validateHereStringTerminators } from "./composer.js";
|
|
10
|
+
export { createLogger } from "./logger.js";
|
|
11
|
+
export type { LogLevel } from "./logger.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,YAAY,EACV,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGtF,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Primary API
|
|
2
|
+
export { generateFinalScript } from "./orchestrator.js";
|
|
3
|
+
// Lower-level APIs for advanced use
|
|
4
|
+
export { parseL0Script, parseL0Metadata, stripL0Header } from "./l0-parser.js";
|
|
5
|
+
export { composeL1, composeL2, parseInterval } from "./composer.js";
|
|
6
|
+
export { validateComposedScripts } from "./script-validator.js";
|
|
7
|
+
// Utilities
|
|
8
|
+
export { normalizeWindowsLineEndings, validateHereStringTerminators } from "./composer.js";
|
|
9
|
+
export { createLogger } from "./logger.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAexD,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,YAAY;AACZ,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { L0Metadata, L0Script } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse the metadata header from an L0 script body.
|
|
4
|
+
* Throws if the header is missing or malformed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseL0Metadata(scriptBody: string): L0Metadata;
|
|
7
|
+
/**
|
|
8
|
+
* Strip the metadata header, shebang, and trailing standalone-execution guard
|
|
9
|
+
* from an L0 script, returning only the function definition body.
|
|
10
|
+
*
|
|
11
|
+
* L0 scripts end with a standalone guard like:
|
|
12
|
+
* if [ "${BASH_SOURCE[0]}" = "${0}" ]; then ... fi (Linux)
|
|
13
|
+
* if ($MyInvocation.InvocationName -ne '.') { ... } (Windows)
|
|
14
|
+
* This guard must NOT be included in the L1 composition — it would invoke
|
|
15
|
+
* the L0 collector at parse time rather than inside the orchestration loop.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripL0Header(scriptBody: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Build a complete L0Script object from a NexusEPM script response.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseL0Script(scriptId: number, scriptBody: string): L0Script;
|
|
22
|
+
//# sourceMappingURL=l0-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l0-parser.d.ts","sourceRoot":"","sources":["../src/l0-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAwB,MAAM,YAAY,CAAC;AAQ7E;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAkH9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA4ExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,CA4C5E"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { createLogger } from "./logger.js";
|
|
2
|
+
const log = createLogger("l0-parser");
|
|
3
|
+
const METADATA_START = "# ==== NEXUS MODSCRIPT L0 ====";
|
|
4
|
+
const METADATA_END = "# ==== END METADATA ====";
|
|
5
|
+
/**
|
|
6
|
+
* Parse the metadata header from an L0 script body.
|
|
7
|
+
* Throws if the header is missing or malformed.
|
|
8
|
+
*/
|
|
9
|
+
export function parseL0Metadata(scriptBody) {
|
|
10
|
+
const startIdx = scriptBody.indexOf(METADATA_START);
|
|
11
|
+
const endIdx = scriptBody.indexOf(METADATA_END);
|
|
12
|
+
log.trace("Locating metadata markers", { startIdx, endIdx });
|
|
13
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
14
|
+
log.error("Metadata markers not found in script body", {
|
|
15
|
+
hasStart: startIdx !== -1,
|
|
16
|
+
hasEnd: endIdx !== -1,
|
|
17
|
+
bodyLength: scriptBody.length,
|
|
18
|
+
});
|
|
19
|
+
throw new Error("L0 script missing metadata header (expected NEXUS MODSCRIPT L0 markers)");
|
|
20
|
+
}
|
|
21
|
+
const headerBlock = scriptBody.substring(startIdx + METADATA_START.length, endIdx);
|
|
22
|
+
log.trace("Extracted raw header block", {
|
|
23
|
+
headerLength: headerBlock.length,
|
|
24
|
+
});
|
|
25
|
+
const fields = {};
|
|
26
|
+
for (const line of headerBlock.split("\n")) {
|
|
27
|
+
const trimmed = line.replace(/^#\s*/, "").trim();
|
|
28
|
+
const colonIdx = trimmed.indexOf(":");
|
|
29
|
+
if (colonIdx === -1)
|
|
30
|
+
continue;
|
|
31
|
+
const key = trimmed.substring(0, colonIdx).trim();
|
|
32
|
+
const value = trimmed.substring(colonIdx + 1).trim();
|
|
33
|
+
if (key && value) {
|
|
34
|
+
fields[key] = value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
log.debug("Parsed metadata fields", {
|
|
38
|
+
fieldCount: Object.keys(fields).length,
|
|
39
|
+
fields: Object.keys(fields),
|
|
40
|
+
});
|
|
41
|
+
// Validate required fields
|
|
42
|
+
const required = [
|
|
43
|
+
"NAME",
|
|
44
|
+
"CATEGORY",
|
|
45
|
+
"VERSION",
|
|
46
|
+
"OS_FAMILY",
|
|
47
|
+
"DESCRIPTION",
|
|
48
|
+
"AUTHOR",
|
|
49
|
+
"DEPENDENCIES",
|
|
50
|
+
"OUTPUT_SCHEMA_VERSION",
|
|
51
|
+
];
|
|
52
|
+
for (const field of required) {
|
|
53
|
+
if (!fields[field]) {
|
|
54
|
+
log.error("Missing required metadata field", {
|
|
55
|
+
field,
|
|
56
|
+
presentFields: Object.keys(fields),
|
|
57
|
+
});
|
|
58
|
+
throw new Error(`L0 metadata missing required field: ${field}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Validate OS_FAMILY
|
|
62
|
+
const osFamily = fields["OS_FAMILY"];
|
|
63
|
+
if (osFamily !== "linux" && osFamily !== "windows" && osFamily !== "aix") {
|
|
64
|
+
log.error("Invalid OS_FAMILY value", { osFamily });
|
|
65
|
+
throw new Error(`Invalid OS_FAMILY: ${osFamily}. Must be "linux", "windows", or "aix".`);
|
|
66
|
+
}
|
|
67
|
+
// Validate CATEGORY fetch categories from api
|
|
68
|
+
const validCategories = [
|
|
69
|
+
"app_monitoring",
|
|
70
|
+
"system_health",
|
|
71
|
+
"security_audit",
|
|
72
|
+
"compliance",
|
|
73
|
+
"inventory",
|
|
74
|
+
];
|
|
75
|
+
const category = fields["CATEGORY"];
|
|
76
|
+
if (!validCategories.includes(category)) {
|
|
77
|
+
log.error("Invalid CATEGORY value", { category, validCategories });
|
|
78
|
+
throw new Error(`Invalid CATEGORY: ${category}. Must be one of: ${validCategories.join(", ")}`);
|
|
79
|
+
}
|
|
80
|
+
const metadata = {
|
|
81
|
+
name: fields["NAME"],
|
|
82
|
+
category,
|
|
83
|
+
version: fields["VERSION"],
|
|
84
|
+
osFamily,
|
|
85
|
+
description: fields["DESCRIPTION"],
|
|
86
|
+
author: fields["AUTHOR"],
|
|
87
|
+
dependencies: fields["DEPENDENCIES"],
|
|
88
|
+
outputSchemaVersion: parseInt(fields["OUTPUT_SCHEMA_VERSION"], 10),
|
|
89
|
+
};
|
|
90
|
+
log.info("Metadata parsed successfully", {
|
|
91
|
+
name: metadata.name,
|
|
92
|
+
version: metadata.version,
|
|
93
|
+
osFamily: metadata.osFamily,
|
|
94
|
+
category: metadata.category,
|
|
95
|
+
});
|
|
96
|
+
return metadata;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Strip the metadata header, shebang, and trailing standalone-execution guard
|
|
100
|
+
* from an L0 script, returning only the function definition body.
|
|
101
|
+
*
|
|
102
|
+
* L0 scripts end with a standalone guard like:
|
|
103
|
+
* if [ "${BASH_SOURCE[0]}" = "${0}" ]; then ... fi (Linux)
|
|
104
|
+
* if ($MyInvocation.InvocationName -ne '.') { ... } (Windows)
|
|
105
|
+
* This guard must NOT be included in the L1 composition — it would invoke
|
|
106
|
+
* the L0 collector at parse time rather than inside the orchestration loop.
|
|
107
|
+
*/
|
|
108
|
+
export function stripL0Header(scriptBody) {
|
|
109
|
+
const endIdx = scriptBody.indexOf(METADATA_END);
|
|
110
|
+
if (endIdx === -1) {
|
|
111
|
+
log.debug("No metadata end marker found, returning full body");
|
|
112
|
+
return scriptBody;
|
|
113
|
+
}
|
|
114
|
+
const afterHeader = scriptBody.substring(endIdx + METADATA_END.length);
|
|
115
|
+
log.trace("Stripped metadata header", {
|
|
116
|
+
originalLength: scriptBody.length,
|
|
117
|
+
remainingLength: afterHeader.length,
|
|
118
|
+
});
|
|
119
|
+
// Strip leading blank lines and any comment block that follows metadata
|
|
120
|
+
const lines = afterHeader.split("\n");
|
|
121
|
+
let startLine = 0;
|
|
122
|
+
for (let i = 0; i < lines.length; i++) {
|
|
123
|
+
const trimmed = lines[i]?.trim();
|
|
124
|
+
if (trimmed && (trimmed === "" || trimmed.startsWith("#"))) {
|
|
125
|
+
startLine = i + 1;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
let body = lines.slice(startLine).join("\n").trim();
|
|
132
|
+
// Strip trailing standalone-execution guard.
|
|
133
|
+
// Linux: if [ "${BASH_SOURCE[0]}" = "${0}" ]; then ... fi
|
|
134
|
+
// Windows: if ($MyInvocation.InvocationName -ne '.') { ... }
|
|
135
|
+
// AIX/ksh: ksh88 has no ${BASH_SOURCE}; the convention is a basename check:
|
|
136
|
+
// if [ "${0##*/}" = "<name>.ksh" ]; then ... fi
|
|
137
|
+
// These blocks appear after the function's closing brace and are only meant
|
|
138
|
+
// for running the L0 script directly — they must not be injected into L1.
|
|
139
|
+
const linuxGuardPattern = /\n# [^\n]*standalone[^\n]*\n\s*if\s+\[\s+"\$\{BASH_SOURCE\[0\]\}"\s*=\s*"\$\{?0\}?"\s*\];\s*then\b[\s\S]*?\bfi\s*$/i;
|
|
140
|
+
const linuxGuardSimple = /\nif\s+\[\s+"\$\{BASH_SOURCE\[0\]\}"\s*=\s*"\$\{?0\}?"\s*\];\s*then\b[\s\S]*?\bfi\s*$/i;
|
|
141
|
+
const windowsGuardPattern = /\nif\s+\(\s*\$MyInvocation[\s\S]*?\}\s*$/i;
|
|
142
|
+
const aixGuardPattern = /\n# [^\n]*standalone[^\n]*\n\s*if\s+\[\s+"\$\{0##\*\/\}"\s*=[\s\S]*?\bfi\s*$/i;
|
|
143
|
+
const aixGuardSimple = /\nif\s+\[\s+"\$\{0##\*\/\}"\s*=[\s\S]*?\bfi\s*$/i;
|
|
144
|
+
const beforeLen = body.length;
|
|
145
|
+
body = body.replace(linuxGuardPattern, "");
|
|
146
|
+
if (body.length === beforeLen) {
|
|
147
|
+
body = body.replace(linuxGuardSimple, "");
|
|
148
|
+
}
|
|
149
|
+
if (body.length === beforeLen) {
|
|
150
|
+
body = body.replace(windowsGuardPattern, "");
|
|
151
|
+
}
|
|
152
|
+
if (body.length === beforeLen) {
|
|
153
|
+
body = body.replace(aixGuardPattern, "");
|
|
154
|
+
}
|
|
155
|
+
if (body.length === beforeLen) {
|
|
156
|
+
body = body.replace(aixGuardSimple, "");
|
|
157
|
+
}
|
|
158
|
+
body = body.trim();
|
|
159
|
+
if (body.length < beforeLen) {
|
|
160
|
+
log.debug("Stripped trailing standalone-execution guard", {
|
|
161
|
+
bytesRemoved: beforeLen - body.length,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
log.debug("Function body extracted", {
|
|
165
|
+
linesStripped: startLine,
|
|
166
|
+
bodyLength: body.length,
|
|
167
|
+
});
|
|
168
|
+
return body;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build a complete L0Script object from a NexusEPM script response.
|
|
172
|
+
*/
|
|
173
|
+
export function parseL0Script(scriptId, scriptBody) {
|
|
174
|
+
log.info("Parsing L0 script", { scriptId, bodyLength: scriptBody.length });
|
|
175
|
+
const meta = parseL0Metadata(scriptBody);
|
|
176
|
+
let functionBody = stripL0Header(scriptBody);
|
|
177
|
+
// Strip \r from Linux/AIX scripts — carriage returns are invalid in bash/ksh
|
|
178
|
+
// and cause syntax errors when L0 bodies are embedded into the L1 composition.
|
|
179
|
+
// Windows (PowerShell) scripts keep \r\n as it's their native line ending.
|
|
180
|
+
if (meta.osFamily === "linux" || meta.osFamily === "aix") {
|
|
181
|
+
functionBody = functionBody.replace(/\r/g, "");
|
|
182
|
+
}
|
|
183
|
+
// Validate that the expected function exists in the body.
|
|
184
|
+
// AIX/ksh uses the same nexus_collect_<name> convention as Linux.
|
|
185
|
+
const expectedFn = meta.osFamily === "windows"
|
|
186
|
+
? `Invoke-NexusCollect_`
|
|
187
|
+
: `nexus_collect_${meta.name}`;
|
|
188
|
+
if (!functionBody.includes(expectedFn)) {
|
|
189
|
+
log.error("Expected function not found in script body", {
|
|
190
|
+
scriptName: meta.name,
|
|
191
|
+
expectedFn,
|
|
192
|
+
bodyPreview: functionBody.substring(0, 200),
|
|
193
|
+
});
|
|
194
|
+
throw new Error(`L0 script "${meta.name}" does not contain expected function "${expectedFn}". ` +
|
|
195
|
+
`Check naming convention.`);
|
|
196
|
+
}
|
|
197
|
+
log.debug("L0 script parsed and validated", {
|
|
198
|
+
scriptId,
|
|
199
|
+
name: meta.name,
|
|
200
|
+
expectedFn,
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
scriptId,
|
|
204
|
+
meta,
|
|
205
|
+
fullBody: scriptBody,
|
|
206
|
+
functionBody,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=l0-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l0-parser.js","sourceRoot":"","sources":["../src/l0-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type LogLevel = "trace" | "debug" | "info" | "error";
|
|
2
|
+
export interface Logger {
|
|
3
|
+
trace(msg: string, data?: Record<string, unknown>): void;
|
|
4
|
+
debug(msg: string, data?: Record<string, unknown>): void;
|
|
5
|
+
info(msg: string, data?: Record<string, unknown>): void;
|
|
6
|
+
error(msg: string, data?: Record<string, unknown>): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createLogger(module: string): Logger;
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AA6C5D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBnD"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const LEVEL_PRIORITY = {
|
|
2
|
+
trace: 0,
|
|
3
|
+
debug: 1,
|
|
4
|
+
info: 2,
|
|
5
|
+
error: 3,
|
|
6
|
+
};
|
|
7
|
+
const LEVEL_LABEL = {
|
|
8
|
+
trace: "TRC",
|
|
9
|
+
debug: "DBG",
|
|
10
|
+
info: "INF",
|
|
11
|
+
error: "ERR",
|
|
12
|
+
};
|
|
13
|
+
function currentLevel() {
|
|
14
|
+
const env = process.env["LOG_LEVEL"]?.toLowerCase();
|
|
15
|
+
if (env && env in LEVEL_PRIORITY)
|
|
16
|
+
return env;
|
|
17
|
+
return "info";
|
|
18
|
+
}
|
|
19
|
+
function shouldLog(level) {
|
|
20
|
+
return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[currentLevel()];
|
|
21
|
+
}
|
|
22
|
+
function formatTimestamp() {
|
|
23
|
+
return new Date().toISOString();
|
|
24
|
+
}
|
|
25
|
+
function formatMessage(level, module, msg, data) {
|
|
26
|
+
const ts = formatTimestamp();
|
|
27
|
+
const label = LEVEL_LABEL[level];
|
|
28
|
+
const base = `${ts} [${label}] [${module}] ${msg}`;
|
|
29
|
+
if (data && Object.keys(data).length > 0) {
|
|
30
|
+
return `${base} ${JSON.stringify(data)}`;
|
|
31
|
+
}
|
|
32
|
+
return base;
|
|
33
|
+
}
|
|
34
|
+
export function createLogger(module) {
|
|
35
|
+
return {
|
|
36
|
+
trace(msg, data) {
|
|
37
|
+
if (shouldLog("trace"))
|
|
38
|
+
process.stderr.write(formatMessage("trace", module, msg, data) + "\n");
|
|
39
|
+
},
|
|
40
|
+
debug(msg, data) {
|
|
41
|
+
if (shouldLog("debug"))
|
|
42
|
+
process.stderr.write(formatMessage("debug", module, msg, data) + "\n");
|
|
43
|
+
},
|
|
44
|
+
info(msg, data) {
|
|
45
|
+
if (shouldLog("info"))
|
|
46
|
+
process.stderr.write(formatMessage("info", module, msg, data) + "\n");
|
|
47
|
+
},
|
|
48
|
+
error(msg, data) {
|
|
49
|
+
if (shouldLog("error"))
|
|
50
|
+
process.stderr.write(formatMessage("error", module, msg, data) + "\n");
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IACpD,IAAI,GAAG,IAAI,GAAG,IAAI,cAAc;QAAE,OAAO,GAAe,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CACpB,KAAe,EACf,MAAc,EACd,GAAW,EACX,IAA8B;IAE9B,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,KAAK,MAAM,MAAM,KAAK,GAAG,EAAE,CAAC;IACnD,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO;QACL,KAAK,CAAC,GAAG,EAAE,IAAI;YACb,IAAI,SAAS,CAAC,OAAO,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,IAAI;YACb,IAAI,SAAS,CAAC,OAAO,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,IAAI;YACZ,IAAI,SAAS,CAAC,MAAM,CAAC;gBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,IAAI;YACb,IAAI,SAAS,CAAC,OAAO,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ModScriptLifecycle, OsFamily } from "./types.js";
|
|
2
|
+
export interface GenerateOptions {
|
|
3
|
+
platform: OsFamily;
|
|
4
|
+
templateUrls: {
|
|
5
|
+
l1: string;
|
|
6
|
+
l2: string;
|
|
7
|
+
};
|
|
8
|
+
orgId: string;
|
|
9
|
+
bufferTime?: string;
|
|
10
|
+
timeout?: string;
|
|
11
|
+
icebergEndpoint?: string;
|
|
12
|
+
agentId?: string;
|
|
13
|
+
authToken?: string;
|
|
14
|
+
maxParallel?: number;
|
|
15
|
+
writeToDisk?: boolean;
|
|
16
|
+
outputDir?: string;
|
|
17
|
+
previousServiceId?: string;
|
|
18
|
+
/** Continuous collection by default; deletion verification is Windows-only. */
|
|
19
|
+
lifecycle?: ModScriptLifecycle;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate composed L1 + L2 scripts from L0 script bodies.
|
|
23
|
+
*
|
|
24
|
+
* Accepts L0 scripts as raw strings (e.g. from an API, database, or file read),
|
|
25
|
+
* fetches L1/L2 templates from the provided URLs, composes, validates,
|
|
26
|
+
* and returns both scripts as strings.
|
|
27
|
+
*
|
|
28
|
+
* @param l0ScriptBodies - raw L0 script contents (must include metadata headers)
|
|
29
|
+
* @param options - platform, template URLs, and optional overrides
|
|
30
|
+
*/
|
|
31
|
+
export declare function generateFinalScript(l0ScriptBodies: string[], options: GenerateOptions): Promise<{
|
|
32
|
+
l1Script: string;
|
|
33
|
+
l2Script: string;
|
|
34
|
+
platform: OsFamily;
|
|
35
|
+
modules: string[];
|
|
36
|
+
serviceName: string;
|
|
37
|
+
requiredRuntimeArgs: string[];
|
|
38
|
+
l1Path?: string;
|
|
39
|
+
l2Path?: string;
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAY,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAuMD"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { parseL0Script } from "./l0-parser.js";
|
|
4
|
+
import { composeL1, composeL2, parseInterval } from "./composer.js";
|
|
5
|
+
import { validateComposedScripts } from "./script-validator.js";
|
|
6
|
+
import { createLogger } from "./logger.js";
|
|
7
|
+
const log = createLogger("orchestrator");
|
|
8
|
+
// ── Template fetching ───────────────────────────────────────────────────────
|
|
9
|
+
async function fetchTemplate(url, label) {
|
|
10
|
+
log.debug("Fetching template", { label, url });
|
|
11
|
+
const response = await fetch(url);
|
|
12
|
+
if (!response.ok) {
|
|
13
|
+
log.error("Template fetch failed", { label, url, status: response.status });
|
|
14
|
+
throw new Error(`Failed to fetch ${label} template from ${url}: ${response.status} ${response.statusText}`);
|
|
15
|
+
}
|
|
16
|
+
const body = await response.text();
|
|
17
|
+
log.debug("Template fetched", { label, length: body.length });
|
|
18
|
+
return body;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate composed L1 + L2 scripts from L0 script bodies.
|
|
22
|
+
*
|
|
23
|
+
* Accepts L0 scripts as raw strings (e.g. from an API, database, or file read),
|
|
24
|
+
* fetches L1/L2 templates from the provided URLs, composes, validates,
|
|
25
|
+
* and returns both scripts as strings.
|
|
26
|
+
*
|
|
27
|
+
* @param l0ScriptBodies - raw L0 script contents (must include metadata headers)
|
|
28
|
+
* @param options - platform, template URLs, and optional overrides
|
|
29
|
+
*/
|
|
30
|
+
export async function generateFinalScript(l0ScriptBodies, options) {
|
|
31
|
+
const platform = options.platform;
|
|
32
|
+
const lifecycle = options.lifecycle ?? { kind: "continuous" };
|
|
33
|
+
if (lifecycle.kind === "deletion-verifier") {
|
|
34
|
+
if (platform !== "windows") {
|
|
35
|
+
throw new Error("deletion-verifier lifecycle is currently supported on windows only");
|
|
36
|
+
}
|
|
37
|
+
if (!lifecycle.jobId || !/^[A-Za-z0-9._-]+$/.test(lifecycle.jobId)) {
|
|
38
|
+
throw new Error("deletion-verifier jobId must contain only letters, numbers, '.', '_' or '-'");
|
|
39
|
+
}
|
|
40
|
+
if (!lifecycle.callbackToken) {
|
|
41
|
+
throw new Error("deletion-verifier callbackToken is required");
|
|
42
|
+
}
|
|
43
|
+
if (lifecycle.expectedWindowsUpdateAuOptions !== null &&
|
|
44
|
+
(!Number.isInteger(lifecycle.expectedWindowsUpdateAuOptions) || lifecycle.expectedWindowsUpdateAuOptions < 0)) {
|
|
45
|
+
throw new Error("deletion-verifier expectedWindowsUpdateAuOptions must be a non-negative integer or null");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
log.info("Starting script generation", {
|
|
49
|
+
scriptCount: l0ScriptBodies.length,
|
|
50
|
+
platform,
|
|
51
|
+
orgId: options.orgId,
|
|
52
|
+
bufferTime: options.bufferTime ?? "(not set)",
|
|
53
|
+
timeout: options.timeout ?? "(not set)",
|
|
54
|
+
});
|
|
55
|
+
// ── Fetch templates from URLs ──────────────────────────────────────────
|
|
56
|
+
log.info("Fetching templates", { l1Url: options.templateUrls.l1, l2Url: options.templateUrls.l2 });
|
|
57
|
+
const [l1Template, l2Template] = await Promise.all([
|
|
58
|
+
fetchTemplate(options.templateUrls.l1, "L1"),
|
|
59
|
+
fetchTemplate(options.templateUrls.l2, "L2"),
|
|
60
|
+
]);
|
|
61
|
+
// ── Parse L0 scripts from provided bodies ──────────────────────────────
|
|
62
|
+
const l0Scripts = [];
|
|
63
|
+
for (let i = 0; i < l0ScriptBodies.length; i++) {
|
|
64
|
+
const scriptBody = l0ScriptBodies[i];
|
|
65
|
+
const l0 = parseL0Script(i, scriptBody);
|
|
66
|
+
l0Scripts.push(l0);
|
|
67
|
+
log.info("L0 script parsed", {
|
|
68
|
+
name: l0.meta.name,
|
|
69
|
+
version: l0.meta.version,
|
|
70
|
+
category: l0.meta.category,
|
|
71
|
+
osFamily: l0.meta.osFamily,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (l0Scripts.length === 0 || !l0Scripts[0]) {
|
|
75
|
+
log.error("No L0 scripts provided");
|
|
76
|
+
throw new Error("No L0 script bodies provided");
|
|
77
|
+
}
|
|
78
|
+
if (lifecycle.kind === "deletion-verifier" && l0Scripts.length !== 1) {
|
|
79
|
+
throw new Error("deletion-verifier lifecycle requires exactly one L0 collector");
|
|
80
|
+
}
|
|
81
|
+
if (lifecycle.kind === "deletion-verifier" && l0Scripts[0]?.meta.name !== "nexus_endpoint_deletion") {
|
|
82
|
+
throw new Error("deletion-verifier lifecycle requires the nexus_endpoint_deletion collector");
|
|
83
|
+
}
|
|
84
|
+
// ── Validate L0 scripts match the target platform ─────────────────────
|
|
85
|
+
const mismatch = l0Scripts.find((l0) => l0.meta.osFamily !== platform);
|
|
86
|
+
if (mismatch) {
|
|
87
|
+
log.error("Platform mismatch in L0 script", {
|
|
88
|
+
targetPlatform: platform,
|
|
89
|
+
mismatchScript: mismatch.meta.name,
|
|
90
|
+
mismatchOs: mismatch.meta.osFamily,
|
|
91
|
+
});
|
|
92
|
+
throw new Error(`Platform mismatch: "${mismatch.meta.name}" is ${mismatch.meta.osFamily}, target platform is ${platform}`);
|
|
93
|
+
}
|
|
94
|
+
// ── Compose L1 ─────────────────────────────────────────────────────────
|
|
95
|
+
log.info("Composing L1 combined collection script", { platform });
|
|
96
|
+
const l1Script = composeL1({
|
|
97
|
+
orgId: options.orgId,
|
|
98
|
+
l0Scripts,
|
|
99
|
+
osFamily: platform,
|
|
100
|
+
template: l1Template,
|
|
101
|
+
});
|
|
102
|
+
// ── Compose L2 ─────────────────────────────────────────────────────────
|
|
103
|
+
log.info("Composing L2 deployment wrapper", { platform });
|
|
104
|
+
// Parse intervals only if provided — otherwise they stay undefined (runtime-required)
|
|
105
|
+
const bufferTimeParsed = options.bufferTime ? parseInterval(options.bufferTime) : undefined;
|
|
106
|
+
const timeoutParsed = options.timeout ? parseInterval(options.timeout) : undefined;
|
|
107
|
+
const serviceName = lifecycle.kind === "deletion-verifier"
|
|
108
|
+
? `nxd-${lifecycle.jobId}`
|
|
109
|
+
: `nxm-${options.orgId}-${Date.now()}`;
|
|
110
|
+
log.debug("L2 parameters resolved", {
|
|
111
|
+
serviceName,
|
|
112
|
+
bufferTime: bufferTimeParsed?.systemd ?? "(not set)",
|
|
113
|
+
timeout: timeoutParsed?.systemd ?? "(not set)",
|
|
114
|
+
maxParallel: options.maxParallel ?? 5,
|
|
115
|
+
previousServiceId: options.previousServiceId ?? "(none)",
|
|
116
|
+
});
|
|
117
|
+
const { script: l2Script, requiredRuntimeArgs } = composeL2({
|
|
118
|
+
l1Script,
|
|
119
|
+
serviceName,
|
|
120
|
+
bufferTime: bufferTimeParsed?.systemd,
|
|
121
|
+
bufferTimeSeconds: bufferTimeParsed?.seconds,
|
|
122
|
+
timeout: timeoutParsed?.systemd,
|
|
123
|
+
timeoutSeconds: timeoutParsed?.seconds,
|
|
124
|
+
icebergEndpoint: options.icebergEndpoint,
|
|
125
|
+
agentId: options.agentId,
|
|
126
|
+
authToken: options.authToken,
|
|
127
|
+
orgId: options.orgId,
|
|
128
|
+
maxParallel: options.maxParallel,
|
|
129
|
+
osFamily: platform,
|
|
130
|
+
template: l2Template,
|
|
131
|
+
previousServiceId: options.previousServiceId,
|
|
132
|
+
lifecycle,
|
|
133
|
+
});
|
|
134
|
+
// ── Validate composed scripts ───────────────────────────────────────
|
|
135
|
+
const moduleNames = l0Scripts.map((l0) => l0.meta.name);
|
|
136
|
+
log.info("Validating composed scripts");
|
|
137
|
+
const validation = await validateComposedScripts({
|
|
138
|
+
l1Script,
|
|
139
|
+
l2Script,
|
|
140
|
+
osFamily: platform,
|
|
141
|
+
moduleNames,
|
|
142
|
+
orgId: options.orgId,
|
|
143
|
+
});
|
|
144
|
+
for (const w of validation.warnings) {
|
|
145
|
+
log.info("Validation warning", { warning: w });
|
|
146
|
+
}
|
|
147
|
+
if (!validation.valid) {
|
|
148
|
+
log.error("Script validation failed", {
|
|
149
|
+
errors: validation.errors,
|
|
150
|
+
warnings: validation.warnings,
|
|
151
|
+
});
|
|
152
|
+
throw new Error(`Composed script validation failed with ${validation.errors.length} error(s):\n` +
|
|
153
|
+
validation.errors.map((e) => ` - ${e}`).join("\n"));
|
|
154
|
+
}
|
|
155
|
+
log.info("Validation passed", {
|
|
156
|
+
warnings: validation.warnings.length,
|
|
157
|
+
});
|
|
158
|
+
// ── Optionally write to final-scripts/ ──────────────────────────────
|
|
159
|
+
let l1Path;
|
|
160
|
+
let l2Path;
|
|
161
|
+
if (options.writeToDisk) {
|
|
162
|
+
const outDir = resolve(options.outputDir ?? "./final-scripts");
|
|
163
|
+
if (!existsSync(outDir)) {
|
|
164
|
+
mkdirSync(outDir, { recursive: true });
|
|
165
|
+
}
|
|
166
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
167
|
+
const ext = platform === "windows" ? "ps1" : platform === "aix" ? "ksh" : "sh";
|
|
168
|
+
const l1File = `l1-${moduleNames.join("-")}-${ts}.${ext}`;
|
|
169
|
+
const l2File = `l2-deploy-${moduleNames.join("-")}-${ts}.${ext}`;
|
|
170
|
+
l1Path = join(outDir, l1File);
|
|
171
|
+
l2Path = join(outDir, l2File);
|
|
172
|
+
// Windows PowerShell 5.1 reads files without a BOM using the system's
|
|
173
|
+
// ANSI code page (usually Windows-1252). Prepend UTF-8 BOM to .ps1 files
|
|
174
|
+
// so 5.1 correctly interprets them as UTF-8.
|
|
175
|
+
const UTF8_BOM = "\uFEFF";
|
|
176
|
+
if (platform === "windows") {
|
|
177
|
+
writeFileSync(l1Path, UTF8_BOM + l1Script, "utf-8");
|
|
178
|
+
writeFileSync(l2Path, UTF8_BOM + l2Script, "utf-8");
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
writeFileSync(l1Path, l1Script, "utf-8");
|
|
182
|
+
writeFileSync(l2Path, l2Script, "utf-8");
|
|
183
|
+
}
|
|
184
|
+
log.info("Scripts written to disk", { l1Path, l2Path });
|
|
185
|
+
}
|
|
186
|
+
log.info("Script generation complete", {
|
|
187
|
+
l1Length: l1Script.length,
|
|
188
|
+
l2Length: l2Script.length,
|
|
189
|
+
serviceName,
|
|
190
|
+
modules: moduleNames,
|
|
191
|
+
bufferTime: options.bufferTime ?? "(not set)",
|
|
192
|
+
timeout: options.timeout ?? "(not set)",
|
|
193
|
+
platform,
|
|
194
|
+
requiredRuntimeArgs,
|
|
195
|
+
});
|
|
196
|
+
return { l1Script, l2Script, platform, modules: moduleNames, serviceName, requiredRuntimeArgs, l1Path, l2Path };
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { OsFamily } from "./types.js";
|
|
2
|
+
export interface ValidationResult {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateL1(script: string, osFamily: OsFamily, moduleNames: string[]): ValidationResult;
|
|
8
|
+
export declare function validateL2(script: string, osFamily: OsFamily): ValidationResult;
|
|
9
|
+
export declare function validateParameterFlow(l1Script: string, l2Script: string, osFamily: OsFamily, orgId: string): ValidationResult;
|
|
10
|
+
export declare function syntaxCheckBash(script: string, label: string): Promise<ValidationResult>;
|
|
11
|
+
export declare function syntaxCheckKsh(script: string, label: string): Promise<ValidationResult>;
|
|
12
|
+
export declare function syntaxCheckPowerShell(script: string, label: string): Promise<ValidationResult>;
|
|
13
|
+
export declare function validateL2StructuralDryRun(l1Script: string, l2Script: string, osFamily: OsFamily, moduleNames: string[]): Promise<ValidationResult>;
|
|
14
|
+
export interface ValidateComposedParams {
|
|
15
|
+
l1Script: string;
|
|
16
|
+
l2Script: string;
|
|
17
|
+
osFamily: OsFamily;
|
|
18
|
+
moduleNames: string[];
|
|
19
|
+
orgId: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function validateComposedScripts(params: ValidateComposedParams): Promise<ValidationResult>;
|
|
22
|
+
//# sourceMappingURL=script-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-validator.d.ts","sourceRoot":"","sources":["../src/script-validator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAoWD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,gBAAgB,CA0BlB;AA2bD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GACjB,gBAAgB,CA0BlB;AAID,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,GACZ,gBAAgB,CAiIlB;AA4BD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE9F;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAM7F;AAiGD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyCpG;AAwDD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAgJ3B;AAID,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAkD3B"}
|