@restormel/testing-config 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Allotment Technology Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @restormel/testing-config — load and validate `restormel-testing` workspace config.
3
+ */
4
+ export declare const testingConfigPackage: "@restormel/testing-config";
5
+ export type { ConfigDefaults, ConfigError, LoadConfigFailure, LoadConfigResult, LoadConfigSuccess, RestormelTestingConfig, SupportedSchemaVersion, } from "./schema.js";
6
+ export { SUPPORTED_SCHEMA_VERSIONS } from "./schema.js";
7
+ export { loadConfigFromFile, loadConfigFromString } from "./load.js";
8
+ export type { ConfigStringFormat } from "./load.js";
9
+ export { isOpaqueKeyRef, isSafeHttpUrl, looksLikeInlineSecret, } from "./refs.js";
10
+ export { formatConfigErrors, resolvedKeysForEnvironment, resolveEnvironmentProfile, resolveSuite, validateConfigDocument, validateMvpRunnerRestrictions, } from "./validate.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAG,2BAAoC,CAAC;AAEzE,YAAY,EACV,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,cAAc,EACd,aAAa,EACb,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @restormel/testing-config — load and validate `restormel-testing` workspace config.
3
+ */
4
+ export const testingConfigPackage = "@restormel/testing-config";
5
+ export { SUPPORTED_SCHEMA_VERSIONS } from "./schema.js";
6
+ export { loadConfigFromFile, loadConfigFromString } from "./load.js";
7
+ export { isOpaqueKeyRef, isSafeHttpUrl, looksLikeInlineSecret, } from "./refs.js";
8
+ export { formatConfigErrors, resolvedKeysForEnvironment, resolveEnvironmentProfile, resolveSuite, validateConfigDocument, validateMvpRunnerRestrictions, } from "./validate.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAAoC,CAAC;AAWzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EACL,cAAc,EACd,aAAa,EACb,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,YAAY,EACZ,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
package/dist/load.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { LoadConfigResult } from "./schema.js";
2
+ export type ConfigStringFormat = "yaml" | "json";
3
+ /**
4
+ * Parse and validate config from a string. YAML is preferred on disk; JSON supported for tooling.
5
+ */
6
+ export declare function loadConfigFromString(content: string, format: ConfigStringFormat): LoadConfigResult;
7
+ /** Infer `yaml` vs `json` from file extension (.json → json, else yaml). */
8
+ export declare function loadConfigFromFile(filePath: string): Promise<LoadConfigResult>;
9
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC;AASjD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,gBAAgB,CAQlG;AAED,4EAA4E;AAC5E,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAWpF"}
package/dist/load.js ADDED
@@ -0,0 +1,37 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import YAML from "yaml";
3
+ import { validateConfigDocument } from "./validate.js";
4
+ function parseToUnknown(content, format) {
5
+ if (format === "json") {
6
+ return JSON.parse(content);
7
+ }
8
+ return YAML.parse(content);
9
+ }
10
+ /**
11
+ * Parse and validate config from a string. YAML is preferred on disk; JSON supported for tooling.
12
+ */
13
+ export function loadConfigFromString(content, format) {
14
+ try {
15
+ const raw = parseToUnknown(content, format);
16
+ return validateConfigDocument(raw);
17
+ }
18
+ catch (e) {
19
+ const message = e instanceof Error ? e.message : String(e);
20
+ return { ok: false, errors: [{ path: "", code: "parse", message }] };
21
+ }
22
+ }
23
+ /** Infer `yaml` vs `json` from file extension (.json → json, else yaml). */
24
+ export async function loadConfigFromFile(filePath) {
25
+ const lower = filePath.toLowerCase();
26
+ const format = lower.endsWith(".json") ? "json" : "yaml";
27
+ let content;
28
+ try {
29
+ content = await readFile(filePath, "utf8");
30
+ }
31
+ catch (e) {
32
+ const message = e instanceof Error ? e.message : String(e);
33
+ return { ok: false, errors: [{ path: filePath, code: "io", message }] };
34
+ }
35
+ return loadConfigFromString(content, format);
36
+ }
37
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAIvD,SAAS,cAAc,CAAC,OAAe,EAAE,MAA0B;IACjE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,MAA0B;IAC9E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACvE,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAuB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7E,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
package/dist/pick.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /** Read YAML-style snake or JSON-style camel from a plain object. */
2
+ export declare function pickKey(obj: Record<string, unknown>, snake: string, camel: string): unknown;
3
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
4
+ //# sourceMappingURL=pick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../src/pick.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAQT;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E"}
package/dist/pick.js ADDED
@@ -0,0 +1,14 @@
1
+ /** Read YAML-style snake or JSON-style camel from a plain object. */
2
+ export function pickKey(obj, snake, camel) {
3
+ if (Object.prototype.hasOwnProperty.call(obj, snake)) {
4
+ return obj[snake];
5
+ }
6
+ if (Object.prototype.hasOwnProperty.call(obj, camel)) {
7
+ return obj[camel];
8
+ }
9
+ return undefined;
10
+ }
11
+ export function isPlainObject(value) {
12
+ return value !== null && typeof value === "object" && !Array.isArray(value);
13
+ }
14
+ //# sourceMappingURL=pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.js","sourceRoot":"","sources":["../src/pick.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,UAAU,OAAO,CACrB,GAA4B,EAC5B,KAAa,EACb,KAAa;IAEb,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
package/dist/refs.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare function looksLikeInlineSecret(value: string): boolean;
2
+ export declare function isOpaqueKeyRef(value: string): boolean;
3
+ export declare function isSafeHttpUrl(value: string): {
4
+ ok: true;
5
+ url: URL;
6
+ } | {
7
+ ok: false;
8
+ reason: string;
9
+ };
10
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAarD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcnG"}
package/dist/refs.js ADDED
@@ -0,0 +1,47 @@
1
+ /** Patterns for credential *references* only (never inline secrets). */
2
+ const KEYS_REF_PREFIX = "ref:restormel-keys:";
3
+ const ENV_REF_PREFIX = "env:";
4
+ export function looksLikeInlineSecret(value) {
5
+ if (value.length > 4096)
6
+ return true;
7
+ if (/\bsk-[a-zA-Z0-9]{16,}\b/.test(value))
8
+ return true;
9
+ if (/\bBearer\s+[a-zA-Z0-9._-]{20,}\b/i.test(value))
10
+ return true;
11
+ if (/\bAIza[0-9A-Za-z_-]{20,}\b/.test(value))
12
+ return true;
13
+ return false;
14
+ }
15
+ export function isOpaqueKeyRef(value) {
16
+ if (typeof value !== "string" || value.length === 0 || value.length > 512)
17
+ return false;
18
+ if (value.includes("\n") || value.includes("\r"))
19
+ return false;
20
+ if (looksLikeInlineSecret(value))
21
+ return false;
22
+ if (value.startsWith(KEYS_REF_PREFIX) && value.length > KEYS_REF_PREFIX.length) {
23
+ return true;
24
+ }
25
+ if (value.startsWith(ENV_REF_PREFIX)) {
26
+ const rest = value.slice(ENV_REF_PREFIX.length);
27
+ return /^[A-Z][A-Z0-9_]*$/.test(rest);
28
+ }
29
+ return false;
30
+ }
31
+ export function isSafeHttpUrl(value) {
32
+ let url;
33
+ try {
34
+ url = new URL(value);
35
+ }
36
+ catch {
37
+ return { ok: false, reason: "Invalid URL" };
38
+ }
39
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
40
+ return { ok: false, reason: "Only http(s) URLs are allowed" };
41
+ }
42
+ if (url.username !== "" || url.password !== "") {
43
+ return { ok: false, reason: "URL must not embed credentials (use auth_ref + Keys)" };
44
+ }
45
+ return { ok: true, url };
46
+ }
47
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IACxF,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,qBAAqB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ArtifactPolicy, EnvironmentProfile, RetryPolicy, TestSuite } from "@restormel/testing-core";
2
+ /** Supported config document versions. */
3
+ export declare const SUPPORTED_SCHEMA_VERSIONS: readonly ["1"];
4
+ export type SupportedSchemaVersion = (typeof SUPPORTED_SCHEMA_VERSIONS)[number];
5
+ /** Defaults applied to suites that omit the corresponding fields. */
6
+ export interface ConfigDefaults {
7
+ retryPolicy?: RetryPolicy;
8
+ defaultTimeoutMs?: number;
9
+ artifactPolicy?: ArtifactPolicy;
10
+ }
11
+ /**
12
+ * Normalised, validated workspace config (no file paths — portable object graph).
13
+ */
14
+ export interface RestormelTestingConfig {
15
+ schemaVersion: SupportedSchemaVersion;
16
+ /** Global Keys logical refs; merged with per-environment keys at runtime. */
17
+ keys: Record<string, string>;
18
+ defaults?: ConfigDefaults;
19
+ environments: Record<string, EnvironmentProfile>;
20
+ suites: TestSuite[];
21
+ /** Opaque hook ids → commands or module paths (runner-defined). */
22
+ adapterHooks: Record<string, string>;
23
+ /** Override `baseUrl` for an environment id (e.g. CI preview URL). */
24
+ targetUrlOverrides: Record<string, string>;
25
+ }
26
+ export interface ConfigError {
27
+ path: string;
28
+ message: string;
29
+ code: string;
30
+ }
31
+ export type LoadConfigSuccess = {
32
+ ok: true;
33
+ config: RestormelTestingConfig;
34
+ };
35
+ export type LoadConfigFailure = {
36
+ ok: false;
37
+ errors: ConfigError[];
38
+ };
39
+ export type LoadConfigResult = LoadConfigSuccess | LoadConfigFailure;
40
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE1G,0CAA0C;AAC1C,eAAO,MAAM,yBAAyB,gBAAiB,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,sBAAsB,CAAC;IACtC,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sEAAsE;IACtE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,3 @@
1
+ /** Supported config document versions. */
2
+ export const SUPPORTED_SCHEMA_VERSIONS = ["1"];
3
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,CAAU,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { EnvironmentProfile, TestSuite } from "@restormel/testing-core";
2
+ import type { ConfigError, RestormelTestingConfig } from "./schema.js";
3
+ /**
4
+ * Parse and validate a config document (already decoded from YAML/JSON).
5
+ */
6
+ export declare function validateConfigDocument(raw: unknown): {
7
+ ok: true;
8
+ config: RestormelTestingConfig;
9
+ } | {
10
+ ok: false;
11
+ errors: ConfigError[];
12
+ };
13
+ /**
14
+ * Preconditions, cleanup, and adapter_hooks are not executed by the current runner.
15
+ * Reject non-empty values so repos do not rely on silent no-ops.
16
+ */
17
+ export declare function validateMvpRunnerRestrictions(config: RestormelTestingConfig, errors: ConfigError[]): void;
18
+ export declare function resolveSuite(config: RestormelTestingConfig, suiteId: string): {
19
+ ok: true;
20
+ suite: TestSuite;
21
+ } | {
22
+ ok: false;
23
+ errors: ConfigError[];
24
+ };
25
+ export declare function resolveEnvironmentProfile(config: RestormelTestingConfig, environmentId: string): {
26
+ ok: true;
27
+ profile: EnvironmentProfile;
28
+ } | {
29
+ ok: false;
30
+ errors: ConfigError[];
31
+ };
32
+ /** Merge global keys with environment-specific keys (env wins on collision). */
33
+ export declare function resolvedKeysForEnvironment(config: RestormelTestingConfig, environmentId: string): Record<string, string>;
34
+ /** Human-readable multi-line summary for CLI or CI logs. */
35
+ export declare function formatConfigErrors(errors: ConfigError[]): string;
36
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAOlB,SAAS,EACV,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAkB,WAAW,EAAE,sBAAsB,EAA0B,MAAM,aAAa,CAAC;AA8f/G;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAwGxI;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAmCzG;AAkDD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,GACd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAevE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,aAAa,EAAE,MAAM,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAmBlF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,sBAAsB,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAOhE"}
@@ -0,0 +1,630 @@
1
+ import { isOpaqueKeyRef, isSafeHttpUrl, looksLikeInlineSecret } from "./refs.js";
2
+ import { isPlainObject, pickKey } from "./pick.js";
3
+ import { SUPPORTED_SCHEMA_VERSIONS } from "./schema.js";
4
+ const ROOT_KEYS = new Set([
5
+ "schema_version",
6
+ "schemaVersion",
7
+ "keys",
8
+ "defaults",
9
+ "environments",
10
+ "suites",
11
+ "adapter_hooks",
12
+ "adapterHooks",
13
+ "target_url_overrides",
14
+ "targetUrlOverrides",
15
+ ]);
16
+ function err(path, code, message) {
17
+ return { path, code, message };
18
+ }
19
+ function asString(value, path, label, errors) {
20
+ if (value === undefined || value === null)
21
+ return undefined;
22
+ if (typeof value !== "string") {
23
+ errors.push(err(path, "type", `${label} must be a string`));
24
+ return undefined;
25
+ }
26
+ if (value.trim() === "") {
27
+ errors.push(err(path, "empty", `${label} must be non-empty`));
28
+ return undefined;
29
+ }
30
+ return value;
31
+ }
32
+ function asNonNegInt(value, path, label, errors) {
33
+ if (value === undefined || value === null)
34
+ return undefined;
35
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
36
+ errors.push(err(path, "range", `${label} must be a non-negative integer`));
37
+ return undefined;
38
+ }
39
+ return value;
40
+ }
41
+ function asPosInt(value, path, label, errors) {
42
+ if (value === undefined || value === null)
43
+ return undefined;
44
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1) {
45
+ errors.push(err(path, "range", `${label} must be a positive integer`));
46
+ return undefined;
47
+ }
48
+ return value;
49
+ }
50
+ function parseKeysMap(raw, path, errors) {
51
+ if (raw === undefined || raw === null)
52
+ return {};
53
+ if (!isPlainObject(raw)) {
54
+ errors.push(err(path, "type", "keys must be an object of string → ref"));
55
+ return {};
56
+ }
57
+ const out = {};
58
+ for (const [k, v] of Object.entries(raw)) {
59
+ const p = `${path}.${k}`;
60
+ const s = asString(v, p, `keys.${k}`, errors);
61
+ if (s === undefined)
62
+ continue;
63
+ if (looksLikeInlineSecret(s)) {
64
+ errors.push(err(p, "unsafe", "Value looks like an inline secret; use ref:restormel-keys:… or env:VAR"));
65
+ continue;
66
+ }
67
+ if (!isOpaqueKeyRef(s)) {
68
+ errors.push(err(p, "ref_format", `Keys slot must be ref:restormel-keys:… or env:UPPER_SNAKE (got non-matching format)`));
69
+ continue;
70
+ }
71
+ out[k] = s;
72
+ }
73
+ return out;
74
+ }
75
+ function parseRetryPolicy(raw, path, errors) {
76
+ if (raw === undefined || raw === null)
77
+ return undefined;
78
+ if (!isPlainObject(raw)) {
79
+ errors.push(err(path, "type", "retry_policy must be an object"));
80
+ return undefined;
81
+ }
82
+ const maxRaw = pickKey(raw, "max_retries", "maxRetries");
83
+ const max = asNonNegInt(maxRaw, `${path}.max_retries`, "max_retries", errors);
84
+ if (max === undefined) {
85
+ errors.push(err(`${path}.max_retries`, "required", "retry_policy.max_retries is required"));
86
+ return undefined;
87
+ }
88
+ const backoffRaw = pickKey(raw, "backoff_ms", "backoffMs");
89
+ const backoffMs = asNonNegInt(backoffRaw, `${path}.backoff_ms`, "backoff_ms", errors);
90
+ const policy = { maxRetries: max };
91
+ if (backoffMs !== undefined)
92
+ policy.backoffMs = backoffMs;
93
+ return policy;
94
+ }
95
+ const ARTIFACT_KINDS = ["never", "on_failure", "always"];
96
+ function parseArtifactPolicy(raw, path, errors) {
97
+ if (raw === undefined || raw === null)
98
+ return undefined;
99
+ if (!isPlainObject(raw)) {
100
+ errors.push(err(path, "type", "artifact_policy must be an object"));
101
+ return undefined;
102
+ }
103
+ const shots = asString(pickKey(raw, "screenshots", "screenshots"), `${path}.screenshots`, "screenshots", errors);
104
+ const trace = asString(pickKey(raw, "browser_trace", "browserTrace"), `${path}.browser_trace`, "browser_trace", errors);
105
+ const consoleRaw = pickKey(raw, "console", "console");
106
+ if (typeof consoleRaw !== "boolean") {
107
+ errors.push(err(`${path}.console`, "type", "artifact_policy.console must be a boolean"));
108
+ return undefined;
109
+ }
110
+ if (!shots || !trace)
111
+ return undefined;
112
+ if (!ARTIFACT_KINDS.includes(shots)) {
113
+ errors.push(err(`${path}.screenshots`, "enum", `screenshots must be one of: never, on_failure, always (got ${JSON.stringify(shots)})`));
114
+ return undefined;
115
+ }
116
+ if (!ARTIFACT_KINDS.includes(trace)) {
117
+ errors.push(err(`${path}.browser_trace`, "enum", `browser_trace must be one of: never, on_failure, always (got ${JSON.stringify(trace)})`));
118
+ return undefined;
119
+ }
120
+ return {
121
+ screenshots: shots,
122
+ browserTrace: trace,
123
+ console: consoleRaw,
124
+ };
125
+ }
126
+ function parseDefaults(raw, path, errors) {
127
+ if (raw === undefined || raw === null)
128
+ return undefined;
129
+ if (!isPlainObject(raw)) {
130
+ errors.push(err(path, "type", "defaults must be an object"));
131
+ return undefined;
132
+ }
133
+ const retryPolicy = parseRetryPolicy(pickKey(raw, "retry_policy", "retryPolicy"), `${path}.retry_policy`, errors);
134
+ const defaultTimeoutMs = asPosInt(pickKey(raw, "default_timeout_ms", "defaultTimeoutMs"), `${path}.default_timeout_ms`, "default_timeout_ms", errors);
135
+ const artifactPolicy = parseArtifactPolicy(pickKey(raw, "artifact_policy", "artifactPolicy"), `${path}.artifact_policy`, errors);
136
+ const d = {};
137
+ if (retryPolicy)
138
+ d.retryPolicy = retryPolicy;
139
+ if (defaultTimeoutMs !== undefined)
140
+ d.defaultTimeoutMs = defaultTimeoutMs;
141
+ if (artifactPolicy)
142
+ d.artifactPolicy = artifactPolicy;
143
+ return Object.keys(d).length > 0 ? d : undefined;
144
+ }
145
+ function parseEnvironment(id, raw, path, errors) {
146
+ if (!isPlainObject(raw)) {
147
+ errors.push(err(path, "type", `Environment "${id}" must be an object`));
148
+ return undefined;
149
+ }
150
+ const baseUrlRaw = pickKey(raw, "base_url", "baseUrl");
151
+ const baseUrl = asString(baseUrlRaw, `${path}.base_url`, "base_url", errors);
152
+ if (!baseUrl)
153
+ return undefined;
154
+ const urlCheck = isSafeHttpUrl(baseUrl);
155
+ if (!urlCheck.ok) {
156
+ errors.push(err(`${path}.base_url`, "url", urlCheck.reason));
157
+ return undefined;
158
+ }
159
+ const authModeRaw = pickKey(raw, "auth_mode", "authMode");
160
+ let authMode;
161
+ if (authModeRaw === undefined || authModeRaw === null) {
162
+ authMode = undefined;
163
+ }
164
+ else if (authModeRaw === "none" || authModeRaw === "cookie_jar" || authModeRaw === "storage_state") {
165
+ authMode = authModeRaw;
166
+ }
167
+ else {
168
+ errors.push(err(`${path}.auth_mode`, "enum", `auth_mode must be none, cookie_jar, or storage_state (got ${JSON.stringify(authModeRaw)})`));
169
+ return undefined;
170
+ }
171
+ const authRefRaw = pickKey(raw, "auth_ref", "authRef");
172
+ const authRef = authRefRaw === undefined || authRefRaw === null
173
+ ? undefined
174
+ : asString(authRefRaw, `${path}.auth_ref`, "auth_ref", errors);
175
+ if (authRef && looksLikeInlineSecret(authRef)) {
176
+ errors.push(err(`${path}.auth_ref`, "unsafe", "auth_ref must be an opaque ref (env:VAR or path token), not a secret"));
177
+ return undefined;
178
+ }
179
+ const keys = parseKeysMap(pickKey(raw, "keys", "keys"), `${path}.keys`, errors);
180
+ const profile = { id, baseUrl, keys: Object.keys(keys).length ? keys : undefined };
181
+ if (authMode !== undefined)
182
+ profile.authMode = authMode;
183
+ if (authRef !== undefined)
184
+ profile.authRef = authRef;
185
+ return profile;
186
+ }
187
+ function parseStructuredCheck(raw, path, errors) {
188
+ if (!isPlainObject(raw)) {
189
+ errors.push(err(path, "type", "structured_check must be an object"));
190
+ return undefined;
191
+ }
192
+ const pathVal = asString(pickKey(raw, "path", "path"), `${path}.path`, "path", errors);
193
+ if (!pathVal)
194
+ return undefined;
195
+ const id = pickKey(raw, "id", "id");
196
+ const check = { path: pathVal };
197
+ if (id !== undefined && id !== null) {
198
+ const sid = asString(id, `${path}.id`, "id", errors);
199
+ if (sid)
200
+ check.id = sid;
201
+ }
202
+ if (Object.prototype.hasOwnProperty.call(raw, "expect")) {
203
+ check.expect = raw.expect;
204
+ }
205
+ return check;
206
+ }
207
+ function parseJudgeRubric(raw, path, errors) {
208
+ if (!isPlainObject(raw)) {
209
+ errors.push(err(path, "type", "judge_rubric must be an object"));
210
+ return undefined;
211
+ }
212
+ const id = asString(pickKey(raw, "id", "id"), `${path}.id`, "id", errors);
213
+ if (!id)
214
+ return undefined;
215
+ const rubric = { id };
216
+ const modelRef = pickKey(raw, "model_ref", "modelRef");
217
+ if (modelRef !== undefined && modelRef !== null) {
218
+ const m = asString(modelRef, `${path}.model_ref`, "model_ref", errors);
219
+ if (m)
220
+ rubric.modelRef = m;
221
+ }
222
+ const summary = pickKey(raw, "summary", "summary");
223
+ if (summary !== undefined && summary !== null) {
224
+ const s = asString(summary, `${path}.summary`, "summary", errors);
225
+ if (s)
226
+ rubric.summary = s;
227
+ }
228
+ const ctxSel = pickKey(raw, "context_selector", "contextSelector");
229
+ if (ctxSel !== undefined && ctxSel !== null) {
230
+ const cs = asString(ctxSel, `${path}.context_selector`, "context_selector", errors);
231
+ if (cs)
232
+ rubric.contextSelector = cs;
233
+ }
234
+ return rubric;
235
+ }
236
+ function parseSuccessCriteria(raw, path, errors) {
237
+ if (!isPlainObject(raw)) {
238
+ errors.push(err(path, "type", "success_criteria must be an object"));
239
+ return undefined;
240
+ }
241
+ const out = {};
242
+ const urlMatches = pickKey(raw, "url_matches", "urlMatches");
243
+ if (urlMatches !== undefined && urlMatches !== null) {
244
+ if (typeof urlMatches === "string") {
245
+ out.urlMatches = urlMatches;
246
+ }
247
+ else if (Array.isArray(urlMatches) && urlMatches.every((x) => typeof x === "string")) {
248
+ out.urlMatches = urlMatches;
249
+ }
250
+ else {
251
+ errors.push(err(`${path}.url_matches`, "type", "url_matches must be a string or string[]"));
252
+ return undefined;
253
+ }
254
+ }
255
+ const dom = pickKey(raw, "dom_signals", "domSignals");
256
+ if (dom !== undefined && dom !== null) {
257
+ if (!Array.isArray(dom) || !dom.every((x) => typeof x === "string")) {
258
+ errors.push(err(`${path}.dom_signals`, "type", "dom_signals must be string[]"));
259
+ return undefined;
260
+ }
261
+ out.domSignals = dom;
262
+ }
263
+ const tp = pickKey(raw, "text_present", "textPresent");
264
+ if (tp !== undefined && tp !== null) {
265
+ if (!Array.isArray(tp) || !tp.every((x) => typeof x === "string")) {
266
+ errors.push(err(`${path}.text_present`, "type", "text_present must be string[]"));
267
+ return undefined;
268
+ }
269
+ out.textPresent = tp;
270
+ }
271
+ const ta = pickKey(raw, "text_absent", "textAbsent");
272
+ if (ta !== undefined && ta !== null) {
273
+ if (!Array.isArray(ta) || !ta.every((x) => typeof x === "string")) {
274
+ errors.push(err(`${path}.text_absent`, "type", "text_absent must be string[]"));
275
+ return undefined;
276
+ }
277
+ out.textAbsent = ta;
278
+ }
279
+ const sc = pickKey(raw, "structured_checks", "structuredChecks");
280
+ if (sc !== undefined && sc !== null) {
281
+ if (!Array.isArray(sc)) {
282
+ errors.push(err(`${path}.structured_checks`, "type", "structured_checks must be an array"));
283
+ return undefined;
284
+ }
285
+ const checks = [];
286
+ sc.forEach((item, i) => {
287
+ const c = parseStructuredCheck(item, `${path}.structured_checks[${i}]`, errors);
288
+ if (c)
289
+ checks.push(c);
290
+ });
291
+ if (checks.length)
292
+ out.structuredChecks = checks;
293
+ }
294
+ const jr = pickKey(raw, "judge_rubric", "judgeRubric");
295
+ if (jr !== undefined && jr !== null) {
296
+ const rubric = parseJudgeRubric(jr, `${path}.judge_rubric`, errors);
297
+ if (rubric)
298
+ out.judgeRubric = rubric;
299
+ }
300
+ const hasAny = out.urlMatches != null ||
301
+ (out.domSignals != null && out.domSignals.length > 0) ||
302
+ (out.textPresent != null && out.textPresent.length > 0) ||
303
+ (out.textAbsent != null && out.textAbsent.length > 0) ||
304
+ (out.structuredChecks != null && out.structuredChecks.length > 0) ||
305
+ out.judgeRubric != null;
306
+ if (!hasAny) {
307
+ errors.push(err(path, "success_criteria_empty", "success_criteria must include at least one of: url_matches, dom_signals, text_present, text_absent, structured_checks, judge_rubric"));
308
+ return undefined;
309
+ }
310
+ return out;
311
+ }
312
+ function parseGoal(raw, path, errors) {
313
+ if (!isPlainObject(raw)) {
314
+ errors.push(err(path, "type", "goal must be an object"));
315
+ return undefined;
316
+ }
317
+ const id = asString(pickKey(raw, "id", "id"), `${path}.id`, "id", errors);
318
+ const description = asString(pickKey(raw, "description", "description"), `${path}.description`, "description", errors);
319
+ const typeRaw = pickKey(raw, "type", "type");
320
+ if (typeof typeRaw !== "string" || !["browser", "performance", "native"].includes(typeRaw)) {
321
+ errors.push(err(`${path}.type`, "enum", `type must be browser, performance, or native (got ${JSON.stringify(typeRaw)})`));
322
+ return undefined;
323
+ }
324
+ const type = typeRaw;
325
+ const scRaw = pickKey(raw, "success_criteria", "successCriteria");
326
+ const successCriteria = parseSuccessCriteria(scRaw, `${path}.success_criteria`, errors);
327
+ if (!id || !description || !successCriteria)
328
+ return undefined;
329
+ const goal = { id, type, description, successCriteria };
330
+ const pre = pickKey(raw, "preconditions", "preconditions");
331
+ if (pre !== undefined && pre !== null) {
332
+ if (!Array.isArray(pre) || !pre.every((x) => typeof x === "string")) {
333
+ errors.push(err(`${path}.preconditions`, "type", "preconditions must be string[]"));
334
+ return undefined;
335
+ }
336
+ goal.preconditions = pre;
337
+ }
338
+ const clean = pickKey(raw, "cleanup", "cleanup");
339
+ if (clean !== undefined && clean !== null) {
340
+ if (!Array.isArray(clean) || !clean.every((x) => typeof x === "string")) {
341
+ errors.push(err(`${path}.cleanup`, "type", "cleanup must be string[]"));
342
+ return undefined;
343
+ }
344
+ goal.cleanup = clean;
345
+ }
346
+ const ex = pickKey(raw, "exclusive_with", "exclusiveWith");
347
+ if (ex !== undefined && ex !== null) {
348
+ if (!Array.isArray(ex) || !ex.every((x) => typeof x === "string")) {
349
+ errors.push(err(`${path}.exclusive_with`, "type", "exclusive_with must be string[]"));
350
+ return undefined;
351
+ }
352
+ goal.exclusiveWith = ex;
353
+ }
354
+ const tags = pickKey(raw, "tags", "tags");
355
+ if (tags !== undefined && tags !== null) {
356
+ if (!Array.isArray(tags) || !tags.every((x) => typeof x === "string")) {
357
+ errors.push(err(`${path}.tags`, "type", "tags must be string[]"));
358
+ return undefined;
359
+ }
360
+ goal.tags = tags;
361
+ }
362
+ return goal;
363
+ }
364
+ function parseSuite(raw, index, path, envIds, errors) {
365
+ if (!isPlainObject(raw)) {
366
+ errors.push(err(path, "type", `suites[${index}] must be an object`));
367
+ return undefined;
368
+ }
369
+ const id = asString(pickKey(raw, "id", "id"), `${path}.id`, "id", errors);
370
+ const environment = asString(pickKey(raw, "environment", "environment"), `${path}.environment`, "environment", errors);
371
+ if (!id || !environment)
372
+ return undefined;
373
+ if (!envIds.has(environment)) {
374
+ errors.push(err(`${path}.environment`, "unknown_environment", `Suite "${id}" references unknown environment "${environment}". Defined environments: ${[...envIds].join(", ") || "(none)"}`));
375
+ return undefined;
376
+ }
377
+ const goalsRaw = pickKey(raw, "goals", "goals");
378
+ if (!Array.isArray(goalsRaw) || goalsRaw.length === 0) {
379
+ errors.push(err(`${path}.goals`, "required", `Suite "${id}" must declare a non-empty goals array`));
380
+ return undefined;
381
+ }
382
+ const goals = [];
383
+ goalsRaw.forEach((g, gi) => {
384
+ const goal = parseGoal(g, `${path}.goals[${gi}]`, errors);
385
+ if (goal)
386
+ goals.push(goal);
387
+ });
388
+ if (goals.length !== goalsRaw.length)
389
+ return undefined;
390
+ const suite = { id, environment, goals };
391
+ const desc = pickKey(raw, "description", "description");
392
+ if (desc !== undefined && desc !== null) {
393
+ const d = asString(desc, `${path}.description`, "description", errors);
394
+ if (d)
395
+ suite.description = d;
396
+ }
397
+ const tags = pickKey(raw, "tags", "tags");
398
+ if (tags !== undefined && tags !== null) {
399
+ if (!Array.isArray(tags) || !tags.every((x) => typeof x === "string")) {
400
+ errors.push(err(`${path}.tags`, "type", "tags must be string[]"));
401
+ return undefined;
402
+ }
403
+ suite.tags = tags;
404
+ }
405
+ const rp = parseRetryPolicy(pickKey(raw, "retry_policy", "retryPolicy"), `${path}.retry_policy`, errors);
406
+ if (rp)
407
+ suite.retryPolicy = rp;
408
+ const dto = asPosInt(pickKey(raw, "default_timeout_ms", "defaultTimeoutMs"), `${path}.default_timeout_ms`, "default_timeout_ms", errors);
409
+ if (dto !== undefined)
410
+ suite.defaultTimeoutMs = dto;
411
+ const ap = parseArtifactPolicy(pickKey(raw, "artifact_policy", "artifactPolicy"), `${path}.artifact_policy`, errors);
412
+ if (ap)
413
+ suite.artifactPolicy = ap;
414
+ return suite;
415
+ }
416
+ function mergeDefaults(suite, defaults) {
417
+ if (!defaults)
418
+ return suite;
419
+ const merged = { ...suite };
420
+ if (merged.retryPolicy === undefined && defaults.retryPolicy !== undefined) {
421
+ merged.retryPolicy = { ...defaults.retryPolicy };
422
+ }
423
+ if (merged.defaultTimeoutMs === undefined && defaults.defaultTimeoutMs !== undefined) {
424
+ merged.defaultTimeoutMs = defaults.defaultTimeoutMs;
425
+ }
426
+ if (merged.artifactPolicy === undefined && defaults.artifactPolicy !== undefined) {
427
+ merged.artifactPolicy = { ...defaults.artifactPolicy };
428
+ }
429
+ return merged;
430
+ }
431
+ function collectUnknownRootKeys(raw, errors) {
432
+ for (const k of Object.keys(raw)) {
433
+ if (!ROOT_KEYS.has(k)) {
434
+ errors.push(err("", "unknown_root_key", `Unknown root key "${k}". Allowed: schema_version, keys, defaults, environments, suites, adapter_hooks, target_url_overrides`));
435
+ }
436
+ }
437
+ }
438
+ /**
439
+ * Parse and validate a config document (already decoded from YAML/JSON).
440
+ */
441
+ export function validateConfigDocument(raw) {
442
+ const errors = [];
443
+ if (!isPlainObject(raw)) {
444
+ return { ok: false, errors: [err("", "root_type", "Config root must be a plain object")] };
445
+ }
446
+ collectUnknownRootKeys(raw, errors);
447
+ const schemaRaw = pickKey(raw, "schema_version", "schemaVersion");
448
+ let schemaStr;
449
+ if (schemaRaw === undefined || schemaRaw === null) {
450
+ errors.push(err("schema_version", "required", 'schema_version is required (use "1")'));
451
+ }
452
+ else if (typeof schemaRaw !== "string") {
453
+ errors.push(err("schema_version", "type", "schema_version must be a string"));
454
+ }
455
+ else if (schemaRaw.trim() === "") {
456
+ errors.push(err("schema_version", "empty", "schema_version must be non-empty"));
457
+ }
458
+ else {
459
+ schemaStr = schemaRaw.trim();
460
+ if (!SUPPORTED_SCHEMA_VERSIONS.includes(schemaStr)) {
461
+ errors.push(err("schema_version", "unsupported", `Unsupported schema_version "${schemaStr}". Supported: ${SUPPORTED_SCHEMA_VERSIONS.join(", ")}`));
462
+ }
463
+ }
464
+ const environmentsRaw = pickKey(raw, "environments", "environments");
465
+ if (!isPlainObject(environmentsRaw)) {
466
+ errors.push(err("environments", "required", "environments must be a non-empty object of id → profile"));
467
+ return { ok: false, errors };
468
+ }
469
+ const envKeys = Object.keys(environmentsRaw);
470
+ if (envKeys.length === 0) {
471
+ errors.push(err("environments", "required", "Define at least one environment"));
472
+ return { ok: false, errors };
473
+ }
474
+ const environments = {};
475
+ const envIdSet = new Set();
476
+ for (const envId of envKeys) {
477
+ const p = parseEnvironment(envId, environmentsRaw[envId], `environments.${envId}`, errors);
478
+ if (p) {
479
+ environments[envId] = p;
480
+ envIdSet.add(envId);
481
+ }
482
+ }
483
+ const globalKeys = parseKeysMap(pickKey(raw, "keys", "keys"), "keys", errors);
484
+ const defaults = parseDefaults(pickKey(raw, "defaults", "defaults"), "defaults", errors);
485
+ const suitesRaw = pickKey(raw, "suites", "suites");
486
+ if (!Array.isArray(suitesRaw) || suitesRaw.length === 0) {
487
+ errors.push(err("suites", "required", "suites must be a non-empty array"));
488
+ return { ok: false, errors };
489
+ }
490
+ const suites = [];
491
+ suitesRaw.forEach((s, i) => {
492
+ const suite = parseSuite(s, i, `suites[${i}]`, envIdSet, errors);
493
+ if (suite)
494
+ suites.push(mergeDefaults(suite, defaults));
495
+ });
496
+ const adapterHooks = parseStringMap(pickKey(raw, "adapter_hooks", "adapterHooks"), "adapter_hooks", errors, "adapter hook command");
497
+ const targetUrlOverrides = parseUrlOverrideMap(pickKey(raw, "target_url_overrides", "targetUrlOverrides"), "target_url_overrides", errors);
498
+ if (errors.length > 0) {
499
+ return { ok: false, errors };
500
+ }
501
+ if (!schemaStr || !SUPPORTED_SCHEMA_VERSIONS.includes(schemaStr)) {
502
+ return {
503
+ ok: false,
504
+ errors: [err("schema_version", "invalid", "schema_version is missing or unsupported after validation")],
505
+ };
506
+ }
507
+ if (suites.length !== suitesRaw.length) {
508
+ return { ok: false, errors: [err("suites", "parse", "One or more suites failed validation")] };
509
+ }
510
+ const config = {
511
+ schemaVersion: schemaStr,
512
+ keys: globalKeys,
513
+ defaults,
514
+ environments,
515
+ suites,
516
+ adapterHooks,
517
+ targetUrlOverrides,
518
+ };
519
+ validateMvpRunnerRestrictions(config, errors);
520
+ if (errors.length > 0) {
521
+ return { ok: false, errors };
522
+ }
523
+ return { ok: true, config };
524
+ }
525
+ /**
526
+ * Preconditions, cleanup, and adapter_hooks are not executed by the current runner.
527
+ * Reject non-empty values so repos do not rely on silent no-ops.
528
+ */
529
+ export function validateMvpRunnerRestrictions(config, errors) {
530
+ if (Object.keys(config.adapterHooks).length > 0) {
531
+ errors.push(err("adapter_hooks", "unsupported_mvp", "This MVP runner does not execute adapter_hooks. Remove all entries or use adapter_hooks: {}."));
532
+ }
533
+ for (let si = 0; si < config.suites.length; si++) {
534
+ const suite = config.suites[si];
535
+ for (let gi = 0; gi < suite.goals.length; gi++) {
536
+ const goal = suite.goals[gi];
537
+ const base = `suites[${si}].goals[${gi}]`;
538
+ if (goal.preconditions !== undefined && goal.preconditions.length > 0) {
539
+ errors.push(err(`${base}.preconditions`, "unsupported_mvp", `Goal "${goal.id}": preconditions are not executed in this MVP runner. Remove the preconditions array.`));
540
+ }
541
+ if (goal.cleanup !== undefined && goal.cleanup.length > 0) {
542
+ errors.push(err(`${base}.cleanup`, "unsupported_mvp", `Goal "${goal.id}": cleanup is not executed in this MVP runner. Remove the cleanup array.`));
543
+ }
544
+ }
545
+ }
546
+ }
547
+ function parseStringMap(raw, path, errors, valueLabel) {
548
+ if (raw === undefined || raw === null)
549
+ return {};
550
+ if (!isPlainObject(raw)) {
551
+ errors.push(err(path, "type", `${path} must be an object of string → string`));
552
+ return {};
553
+ }
554
+ const out = {};
555
+ for (const [k, v] of Object.entries(raw)) {
556
+ const s = asString(v, `${path}.${k}`, valueLabel, errors);
557
+ if (!s)
558
+ continue;
559
+ if (looksLikeInlineSecret(s)) {
560
+ errors.push(err(`${path}.${k}`, "unsafe", "Value looks like an inline secret; use refs or env vars outside this file"));
561
+ continue;
562
+ }
563
+ out[k] = s;
564
+ }
565
+ return out;
566
+ }
567
+ function parseUrlOverrideMap(raw, path, errors) {
568
+ if (raw === undefined || raw === null)
569
+ return {};
570
+ if (!isPlainObject(raw)) {
571
+ errors.push(err(path, "type", `${path} must be an object of environment id → URL`));
572
+ return {};
573
+ }
574
+ const out = {};
575
+ for (const [k, v] of Object.entries(raw)) {
576
+ const s = asString(v, `${path}.${k}`, "override URL", errors);
577
+ if (!s)
578
+ continue;
579
+ const chk = isSafeHttpUrl(s);
580
+ if (!chk.ok) {
581
+ errors.push(err(`${path}.${k}`, "url", `${k}: ${chk.reason}`));
582
+ continue;
583
+ }
584
+ out[k] = s;
585
+ }
586
+ return out;
587
+ }
588
+ export function resolveSuite(config, suiteId) {
589
+ const suite = config.suites.find((s) => s.id === suiteId);
590
+ if (!suite) {
591
+ return {
592
+ ok: false,
593
+ errors: [
594
+ err("suites", "suite_not_found", `No suite with id "${suiteId}". Available: ${config.suites.map((s) => s.id).join(", ") || "(none)"}`),
595
+ ],
596
+ };
597
+ }
598
+ return { ok: true, suite };
599
+ }
600
+ export function resolveEnvironmentProfile(config, environmentId) {
601
+ const base = config.environments[environmentId];
602
+ if (!base) {
603
+ return {
604
+ ok: false,
605
+ errors: [
606
+ err("environments", "unknown_environment", `No environment "${environmentId}". Defined: ${Object.keys(config.environments).join(", ") || "(none)"}`),
607
+ ],
608
+ };
609
+ }
610
+ const override = config.targetUrlOverrides[environmentId];
611
+ if (override === undefined) {
612
+ return { ok: true, profile: { ...base } };
613
+ }
614
+ return { ok: true, profile: { ...base, baseUrl: override } };
615
+ }
616
+ /** Merge global keys with environment-specific keys (env wins on collision). */
617
+ export function resolvedKeysForEnvironment(config, environmentId) {
618
+ const env = config.environments[environmentId];
619
+ return { ...config.keys, ...(env?.keys ?? {}) };
620
+ }
621
+ /** Human-readable multi-line summary for CLI or CI logs. */
622
+ export function formatConfigErrors(errors) {
623
+ return errors
624
+ .map((e) => {
625
+ const loc = e.path === "" ? "(root)" : e.path;
626
+ return `${loc}: ${e.message} [${e.code}]`;
627
+ })
628
+ .join("\n");
629
+ }
630
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@restormel/testing-config",
3
+ "version": "0.1.0",
4
+ "description": "Load and validate restormel-testing.yaml / JSON workspace config.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/Allotment-Technology-Ltd/restormel-testing.git",
9
+ "directory": "packages/config"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/Allotment-Technology-Ltd/restormel-testing/issues"
13
+ },
14
+ "homepage": "https://github.com/Allotment-Technology-Ltd/restormel-testing/tree/main/packages/config#readme",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "dependencies": {
34
+ "yaml": "^2.7.0",
35
+ "@restormel/testing-core": "0.1.0"
36
+ },
37
+ "devDependencies": {
38
+ "typescript": "^5.7.0"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -b tsconfig.json",
42
+ "typecheck": "tsc -b tsconfig.json"
43
+ }
44
+ }