@glubean/cli 0.1.2
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/bin/gb.js +2 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +842 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +75 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/patch.d.ts +8 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +73 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/run.d.ts +26 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +1093 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +6 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +62 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/spec_split.d.ts +5 -0
- package/dist/commands/spec_split.d.ts.map +1 -0
- package/dist/commands/spec_split.js +56 -0
- package/dist/commands/spec_split.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +252 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/trigger.d.ts +13 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +213 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/validate_metadata.d.ts +6 -0
- package/dist/commands/validate_metadata.d.ts.map +1 -0
- package/dist/commands/validate_metadata.js +103 -0
- package/dist/commands/validate_metadata.js.map +1 -0
- package/dist/commands/worker.d.ts +14 -0
- package/dist/commands/worker.d.ts.map +1 -0
- package/dist/commands/worker.js +10 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/lib/auth.d.ts +39 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +82 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/ci.d.ts +12 -0
- package/dist/lib/ci.d.ts.map +1 -0
- package/dist/lib/ci.js +42 -0
- package/dist/lib/ci.js.map +1 -0
- package/dist/lib/config.d.ts +116 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +264 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +6 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +6 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/env.d.ts +19 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +40 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/git.d.ts +8 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +68 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/openapi_patch.d.ts +23 -0
- package/dist/lib/openapi_patch.d.ts.map +1 -0
- package/dist/lib/openapi_patch.js +232 -0
- package/dist/lib/openapi_patch.js.map +1 -0
- package/dist/lib/openapi_split.d.ts +16 -0
- package/dist/lib/openapi_split.d.ts.map +1 -0
- package/dist/lib/openapi_split.js +188 -0
- package/dist/lib/openapi_split.js.map +1 -0
- package/dist/lib/upload.d.ts +44 -0
- package/dist/lib/upload.d.ts.map +1 -0
- package/dist/lib/upload.js +297 -0
- package/dist/lib/upload.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +319 -0
- package/dist/main.js.map +1 -0
- package/dist/metadata.d.ts +17 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +61 -0
- package/dist/metadata.js.map +1 -0
- package/dist/update_check.d.ts +14 -0
- package/dist/update_check.d.ts.map +1 -0
- package/dist/update_check.js +130 -0
- package/dist/update_check.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +34 -0
- package/templates/AI-INSTRUCTIONS.md +163 -0
- package/templates/README.md +226 -0
- package/templates/claude-skill-glubean-test.md +382 -0
- package/templates/data/create-user.json +14 -0
- package/templates/data/endpoints.csv +5 -0
- package/templates/data/scenarios.yaml +19 -0
- package/templates/data/search-examples.json +14 -0
- package/templates/data/users.json +17 -0
- package/templates/data-driven.test.ts.tpl +118 -0
- package/templates/demo.test.result.json +398 -0
- package/templates/demo.test.ts.tpl +226 -0
- package/templates/explore-api.test.result.json +79 -0
- package/templates/minimal/README.md +42 -0
- package/templates/minimal-api.test.ts.tpl +42 -0
- package/templates/minimal-auth.test.ts.tpl +45 -0
- package/templates/minimal-search.test.ts.tpl +34 -0
- package/templates/openapi.sample.json +97 -0
- package/templates/pick.test.result.json +165 -0
- package/templates/pick.test.ts.tpl +126 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified project-level configuration loader for the Glubean CLI.
|
|
3
|
+
*
|
|
4
|
+
* Supports composable config merging with the following priority chain:
|
|
5
|
+
*
|
|
6
|
+
* - No --config: defaults -> package.json "glubean" field -> CLI flags
|
|
7
|
+
* - With --config: defaults -> file1 -> file2 -> ... -> fileN -> CLI flags
|
|
8
|
+
*
|
|
9
|
+
* When --config is specified, the automatic package.json read is skipped
|
|
10
|
+
* (unless package.json is explicitly included in the --config list).
|
|
11
|
+
*
|
|
12
|
+
* Files named "package.json" are special-cased: only the "glubean" field
|
|
13
|
+
* is extracted. All other files are treated as plain glubean config JSON.
|
|
14
|
+
*/
|
|
15
|
+
import type { RedactionConfig } from "@glubean/redaction";
|
|
16
|
+
import type { SharedRunConfig } from "@glubean/runner";
|
|
17
|
+
import type { ThresholdConfig } from "@glubean/sdk";
|
|
18
|
+
/** Run-related configuration (resolved — all fields have values). */
|
|
19
|
+
export interface GlubeanRunConfig {
|
|
20
|
+
verbose: boolean;
|
|
21
|
+
pretty: boolean;
|
|
22
|
+
logFile: boolean;
|
|
23
|
+
emitFullTrace: boolean;
|
|
24
|
+
envFile: string;
|
|
25
|
+
failFast: boolean;
|
|
26
|
+
failAfter: number | null;
|
|
27
|
+
/** Directory containing permanent test files (default: "./tests") */
|
|
28
|
+
testDir: string;
|
|
29
|
+
/** Directory containing exploratory test files (default: "./explore") */
|
|
30
|
+
exploreDir: string;
|
|
31
|
+
/** Per-test timeout in ms. Default: 30_000. */
|
|
32
|
+
perTestTimeoutMs: number;
|
|
33
|
+
concurrency: number;
|
|
34
|
+
}
|
|
35
|
+
/** Partial run config as read from a file (all fields optional). */
|
|
36
|
+
export interface GlubeanRunConfigInput {
|
|
37
|
+
verbose?: boolean;
|
|
38
|
+
pretty?: boolean;
|
|
39
|
+
logFile?: boolean;
|
|
40
|
+
emitFullTrace?: boolean;
|
|
41
|
+
envFile?: string;
|
|
42
|
+
failFast?: boolean;
|
|
43
|
+
failAfter?: number | null;
|
|
44
|
+
testDir?: string;
|
|
45
|
+
exploreDir?: string;
|
|
46
|
+
perTestTimeoutMs?: number;
|
|
47
|
+
concurrency?: number;
|
|
48
|
+
}
|
|
49
|
+
/** Redaction config input from user files (additive fields only). */
|
|
50
|
+
export interface GlubeanRedactionConfigInput {
|
|
51
|
+
sensitiveKeys?: {
|
|
52
|
+
additional?: string[];
|
|
53
|
+
excluded?: string[];
|
|
54
|
+
};
|
|
55
|
+
patterns?: {
|
|
56
|
+
custom?: Array<{
|
|
57
|
+
name: string;
|
|
58
|
+
regex: string;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
replacementFormat?: "simple" | "labeled" | "partial";
|
|
62
|
+
}
|
|
63
|
+
/** Cloud connection config. */
|
|
64
|
+
export interface GlubeanCloudConfigInput {
|
|
65
|
+
projectId?: string;
|
|
66
|
+
apiUrl?: string;
|
|
67
|
+
token?: string;
|
|
68
|
+
}
|
|
69
|
+
/** Fully resolved top-level config. */
|
|
70
|
+
export interface GlubeanConfig {
|
|
71
|
+
run: GlubeanRunConfig;
|
|
72
|
+
redaction: RedactionConfig;
|
|
73
|
+
cloud?: GlubeanCloudConfigInput;
|
|
74
|
+
thresholds?: ThresholdConfig;
|
|
75
|
+
}
|
|
76
|
+
/** Partial top-level config as read from a file. */
|
|
77
|
+
export interface GlubeanConfigInput {
|
|
78
|
+
run?: GlubeanRunConfigInput;
|
|
79
|
+
redaction?: GlubeanRedactionConfigInput;
|
|
80
|
+
cloud?: GlubeanCloudConfigInput;
|
|
81
|
+
thresholds?: ThresholdConfig;
|
|
82
|
+
}
|
|
83
|
+
export declare const RUN_DEFAULTS: GlubeanRunConfig;
|
|
84
|
+
export declare const CONFIG_DEFAULTS: GlubeanConfig;
|
|
85
|
+
/**
|
|
86
|
+
* Read a single config source from disk.
|
|
87
|
+
*
|
|
88
|
+
* If the file is a package.json, extract the "glubean" field.
|
|
89
|
+
* Otherwise treat the entire file as a glubean config object.
|
|
90
|
+
*/
|
|
91
|
+
export declare function readSingleConfig(filePath: string): Promise<GlubeanConfigInput>;
|
|
92
|
+
/**
|
|
93
|
+
* Merge two config inputs. Later (overlay) values take precedence.
|
|
94
|
+
*
|
|
95
|
+
* - Scalar fields: right wins.
|
|
96
|
+
* - Array fields (sensitiveKeys.additional, sensitiveKeys.excluded,
|
|
97
|
+
* patterns.custom): concatenated (additive by nature).
|
|
98
|
+
*/
|
|
99
|
+
export declare function mergeConfigInputs(base: GlubeanConfigInput, overlay: GlubeanConfigInput): GlubeanConfigInput;
|
|
100
|
+
/**
|
|
101
|
+
* Load the resolved GlubeanConfig.
|
|
102
|
+
*
|
|
103
|
+
* - If `configPaths` is undefined or empty: auto-read package.json in `rootDir`.
|
|
104
|
+
* - If `configPaths` has entries: merge left-to-right, skip auto-read.
|
|
105
|
+
*/
|
|
106
|
+
export declare function loadConfig(rootDir: string, configPaths?: string[]): Promise<GlubeanConfig>;
|
|
107
|
+
/**
|
|
108
|
+
* Merge resolved run config with CLI flags.
|
|
109
|
+
*/
|
|
110
|
+
export declare function mergeRunOptions(config: GlubeanRunConfig, cliFlags: Record<string, unknown>): GlubeanRunConfig;
|
|
111
|
+
/**
|
|
112
|
+
* Convert a resolved GlubeanRunConfig to a SharedRunConfig
|
|
113
|
+
* suitable for TestExecutor.fromSharedConfig().
|
|
114
|
+
*/
|
|
115
|
+
export declare function toSharedRunConfig(config: GlubeanRunConfig): SharedRunConfig;
|
|
116
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified project-level configuration loader for the Glubean CLI.
|
|
3
|
+
*
|
|
4
|
+
* Supports composable config merging with the following priority chain:
|
|
5
|
+
*
|
|
6
|
+
* - No --config: defaults -> package.json "glubean" field -> CLI flags
|
|
7
|
+
* - With --config: defaults -> file1 -> file2 -> ... -> fileN -> CLI flags
|
|
8
|
+
*
|
|
9
|
+
* When --config is specified, the automatic package.json read is skipped
|
|
10
|
+
* (unless package.json is explicitly included in the --config list).
|
|
11
|
+
*
|
|
12
|
+
* Files named "package.json" are special-cased: only the "glubean" field
|
|
13
|
+
* is extracted. All other files are treated as plain glubean config JSON.
|
|
14
|
+
*/
|
|
15
|
+
import { resolve } from "node:path";
|
|
16
|
+
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { DEFAULT_CONFIG } from "@glubean/redaction";
|
|
18
|
+
import { LOCAL_RUN_DEFAULTS } from "@glubean/runner";
|
|
19
|
+
// ── Defaults ─────────────────────────────────────────────────────────────────
|
|
20
|
+
export const RUN_DEFAULTS = {
|
|
21
|
+
verbose: false,
|
|
22
|
+
pretty: true,
|
|
23
|
+
logFile: false,
|
|
24
|
+
emitFullTrace: false,
|
|
25
|
+
envFile: ".env",
|
|
26
|
+
failFast: false,
|
|
27
|
+
failAfter: null,
|
|
28
|
+
testDir: "./tests",
|
|
29
|
+
exploreDir: "./explore",
|
|
30
|
+
perTestTimeoutMs: LOCAL_RUN_DEFAULTS.perTestTimeoutMs,
|
|
31
|
+
concurrency: LOCAL_RUN_DEFAULTS.concurrency,
|
|
32
|
+
};
|
|
33
|
+
export const CONFIG_DEFAULTS = {
|
|
34
|
+
run: { ...RUN_DEFAULTS },
|
|
35
|
+
redaction: structuredClone(DEFAULT_CONFIG),
|
|
36
|
+
};
|
|
37
|
+
// ── Internal helpers ─────────────────────────────────────────────────────────
|
|
38
|
+
/** Check if a filename should be treated as a package config file. */
|
|
39
|
+
function isPackageConfig(filePath) {
|
|
40
|
+
const name = filePath.split("/").pop() ?? "";
|
|
41
|
+
return name === "package.json";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read a single config source from disk.
|
|
45
|
+
*
|
|
46
|
+
* If the file is a package.json, extract the "glubean" field.
|
|
47
|
+
* Otherwise treat the entire file as a glubean config object.
|
|
48
|
+
*/
|
|
49
|
+
export async function readSingleConfig(filePath) {
|
|
50
|
+
const content = await readFile(filePath, "utf-8");
|
|
51
|
+
const parsed = JSON.parse(content);
|
|
52
|
+
if (isPackageConfig(filePath)) {
|
|
53
|
+
return parsed.glubean ?? {};
|
|
54
|
+
}
|
|
55
|
+
return parsed;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Merge two config inputs. Later (overlay) values take precedence.
|
|
59
|
+
*
|
|
60
|
+
* - Scalar fields: right wins.
|
|
61
|
+
* - Array fields (sensitiveKeys.additional, sensitiveKeys.excluded,
|
|
62
|
+
* patterns.custom): concatenated (additive by nature).
|
|
63
|
+
*/
|
|
64
|
+
export function mergeConfigInputs(base, overlay) {
|
|
65
|
+
const merged = {};
|
|
66
|
+
// ── Run section (shallow merge, scalars override) ──────────────────────
|
|
67
|
+
if (base.run || overlay.run) {
|
|
68
|
+
merged.run = { ...base.run, ...overlay.run };
|
|
69
|
+
}
|
|
70
|
+
// ── Redaction section ──────────────────────────────────────────────────
|
|
71
|
+
if (base.redaction || overlay.redaction) {
|
|
72
|
+
const br = base.redaction ?? {};
|
|
73
|
+
const or = overlay.redaction ?? {};
|
|
74
|
+
merged.redaction = {};
|
|
75
|
+
if (or.replacementFormat !== undefined) {
|
|
76
|
+
merged.redaction.replacementFormat = or.replacementFormat;
|
|
77
|
+
}
|
|
78
|
+
else if (br.replacementFormat !== undefined) {
|
|
79
|
+
merged.redaction.replacementFormat = br.replacementFormat;
|
|
80
|
+
}
|
|
81
|
+
if (br.sensitiveKeys || or.sensitiveKeys) {
|
|
82
|
+
merged.redaction.sensitiveKeys = {
|
|
83
|
+
additional: [
|
|
84
|
+
...(br.sensitiveKeys?.additional ?? []),
|
|
85
|
+
...(or.sensitiveKeys?.additional ?? []),
|
|
86
|
+
],
|
|
87
|
+
excluded: [
|
|
88
|
+
...(br.sensitiveKeys?.excluded ?? []),
|
|
89
|
+
...(or.sensitiveKeys?.excluded ?? []),
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (br.patterns || or.patterns) {
|
|
94
|
+
merged.redaction.patterns = {
|
|
95
|
+
custom: [
|
|
96
|
+
...(br.patterns?.custom ?? []),
|
|
97
|
+
...(or.patterns?.custom ?? []),
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ── Cloud section (shallow merge, scalars override) ─────────────────────
|
|
103
|
+
if (base.cloud || overlay.cloud) {
|
|
104
|
+
merged.cloud = { ...base.cloud, ...overlay.cloud };
|
|
105
|
+
}
|
|
106
|
+
// ── Thresholds section (shallow merge, later rules win per metric key) ──
|
|
107
|
+
if (base.thresholds || overlay.thresholds) {
|
|
108
|
+
merged.thresholds = { ...base.thresholds, ...overlay.thresholds };
|
|
109
|
+
}
|
|
110
|
+
return merged;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Apply a GlubeanConfigInput on top of the mandatory DEFAULT_CONFIG baseline
|
|
114
|
+
* to produce a fully resolved RedactionConfig.
|
|
115
|
+
*/
|
|
116
|
+
function resolveRedactionConfig(input) {
|
|
117
|
+
const merged = structuredClone(DEFAULT_CONFIG);
|
|
118
|
+
if (!input)
|
|
119
|
+
return merged;
|
|
120
|
+
if (input.sensitiveKeys?.additional) {
|
|
121
|
+
for (const key of input.sensitiveKeys.additional) {
|
|
122
|
+
if (typeof key === "string" &&
|
|
123
|
+
!merged.sensitiveKeys.additional.includes(key)) {
|
|
124
|
+
merged.sensitiveKeys.additional.push(key);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (input.patterns?.custom && Array.isArray(input.patterns.custom)) {
|
|
129
|
+
for (const pattern of input.patterns.custom) {
|
|
130
|
+
if (pattern &&
|
|
131
|
+
typeof pattern.name === "string" &&
|
|
132
|
+
typeof pattern.regex === "string") {
|
|
133
|
+
merged.patterns.custom.push({
|
|
134
|
+
name: pattern.name,
|
|
135
|
+
regex: pattern.regex,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (input.replacementFormat === "labeled" ||
|
|
141
|
+
input.replacementFormat === "partial") {
|
|
142
|
+
merged.replacementFormat = input.replacementFormat;
|
|
143
|
+
}
|
|
144
|
+
return merged;
|
|
145
|
+
}
|
|
146
|
+
// ── Validation ───────────────────────────────────────────────────────────────
|
|
147
|
+
const KNOWN_TOP_KEYS = new Set(["run", "redaction", "cloud", "thresholds"]);
|
|
148
|
+
const KNOWN_RUN_KEYS = new Set(Object.keys(RUN_DEFAULTS));
|
|
149
|
+
const KNOWN_REDACTION_KEYS = new Set([
|
|
150
|
+
"sensitiveKeys",
|
|
151
|
+
"patterns",
|
|
152
|
+
"replacementFormat",
|
|
153
|
+
]);
|
|
154
|
+
const KNOWN_CLOUD_KEYS = new Set(["projectId", "apiUrl", "token"]);
|
|
155
|
+
function warnUnknownKeys(obj, known, path) {
|
|
156
|
+
for (const key of Object.keys(obj)) {
|
|
157
|
+
if (!known.has(key)) {
|
|
158
|
+
console.error(`\x1b[33mWarning: unknown config key "${path}.${key}" — typo?\x1b[0m`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function validateConfigInput(input) {
|
|
163
|
+
warnUnknownKeys(input, KNOWN_TOP_KEYS, "glubean");
|
|
164
|
+
if (input.run) {
|
|
165
|
+
warnUnknownKeys(input.run, KNOWN_RUN_KEYS, "glubean.run");
|
|
166
|
+
}
|
|
167
|
+
if (input.redaction) {
|
|
168
|
+
warnUnknownKeys(input.redaction, KNOWN_REDACTION_KEYS, "glubean.redaction");
|
|
169
|
+
}
|
|
170
|
+
if (input.cloud) {
|
|
171
|
+
warnUnknownKeys(input.cloud, KNOWN_CLOUD_KEYS, "glubean.cloud");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ── Public API ───────────────────────────────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Load the resolved GlubeanConfig.
|
|
177
|
+
*
|
|
178
|
+
* - If `configPaths` is undefined or empty: auto-read package.json in `rootDir`.
|
|
179
|
+
* - If `configPaths` has entries: merge left-to-right, skip auto-read.
|
|
180
|
+
*/
|
|
181
|
+
export async function loadConfig(rootDir, configPaths) {
|
|
182
|
+
let accumulated = {};
|
|
183
|
+
if (configPaths && configPaths.length > 0) {
|
|
184
|
+
for (const configPath of configPaths) {
|
|
185
|
+
const absPath = resolve(rootDir, configPath);
|
|
186
|
+
try {
|
|
187
|
+
const single = await readSingleConfig(absPath);
|
|
188
|
+
validateConfigInput(single);
|
|
189
|
+
accumulated = mergeConfigInputs(accumulated, single);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
console.error(`Warning: Could not read config file: ${absPath}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// No --config: auto-read package.json in rootDir
|
|
198
|
+
const pkgPath = resolve(rootDir, "package.json");
|
|
199
|
+
try {
|
|
200
|
+
const single = await readSingleConfig(pkgPath);
|
|
201
|
+
validateConfigInput(single);
|
|
202
|
+
accumulated = mergeConfigInputs(accumulated, single);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Not found, use defaults
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const resolvedRun = {
|
|
209
|
+
...RUN_DEFAULTS,
|
|
210
|
+
...accumulated.run,
|
|
211
|
+
};
|
|
212
|
+
const resolvedRedaction = resolveRedactionConfig(accumulated.redaction);
|
|
213
|
+
return {
|
|
214
|
+
run: resolvedRun,
|
|
215
|
+
redaction: resolvedRedaction,
|
|
216
|
+
cloud: accumulated.cloud,
|
|
217
|
+
thresholds: accumulated.thresholds,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Merge resolved run config with CLI flags.
|
|
222
|
+
*/
|
|
223
|
+
export function mergeRunOptions(config, cliFlags) {
|
|
224
|
+
const result = { ...config };
|
|
225
|
+
if (cliFlags.verbose !== undefined)
|
|
226
|
+
result.verbose = !!cliFlags.verbose;
|
|
227
|
+
if (cliFlags.pretty !== undefined)
|
|
228
|
+
result.pretty = !!cliFlags.pretty;
|
|
229
|
+
if (cliFlags.logFile !== undefined)
|
|
230
|
+
result.logFile = !!cliFlags.logFile;
|
|
231
|
+
if (cliFlags.emitFullTrace !== undefined) {
|
|
232
|
+
result.emitFullTrace = !!cliFlags.emitFullTrace;
|
|
233
|
+
}
|
|
234
|
+
if (cliFlags.envFile !== undefined)
|
|
235
|
+
result.envFile = String(cliFlags.envFile);
|
|
236
|
+
if (cliFlags.failFast !== undefined)
|
|
237
|
+
result.failFast = !!cliFlags.failFast;
|
|
238
|
+
if (cliFlags.failAfter !== undefined) {
|
|
239
|
+
result.failAfter = cliFlags.failAfter === null ? null : Number(cliFlags.failAfter);
|
|
240
|
+
}
|
|
241
|
+
if (cliFlags.testDir !== undefined)
|
|
242
|
+
result.testDir = String(cliFlags.testDir);
|
|
243
|
+
if (cliFlags.exploreDir !== undefined) {
|
|
244
|
+
result.exploreDir = String(cliFlags.exploreDir);
|
|
245
|
+
}
|
|
246
|
+
if (cliFlags.timeout !== undefined) {
|
|
247
|
+
result.perTestTimeoutMs = Number(cliFlags.timeout);
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Convert a resolved GlubeanRunConfig to a SharedRunConfig
|
|
253
|
+
* suitable for TestExecutor.fromSharedConfig().
|
|
254
|
+
*/
|
|
255
|
+
export function toSharedRunConfig(config) {
|
|
256
|
+
return {
|
|
257
|
+
failFast: config.failFast,
|
|
258
|
+
failAfter: config.failAfter ?? undefined,
|
|
259
|
+
perTestTimeoutMs: config.perTestTimeoutMs,
|
|
260
|
+
concurrency: config.concurrency,
|
|
261
|
+
emitFullTrace: config.emitFullTrace,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sFAAsF;AACtF,eAAO,MAAM,eAAe,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared .env file loading for the Glubean CLI.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Load a single .env file and return its key-value pairs.
|
|
6
|
+
* Returns an empty object if the file doesn't exist or can't be read.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadEnvFile(envPath: string): Promise<Record<string, string>>;
|
|
9
|
+
/**
|
|
10
|
+
* Load `.env` + `.env.secrets` from a project root directory.
|
|
11
|
+
*
|
|
12
|
+
* The secrets file path follows the env file name:
|
|
13
|
+
* `.env` → `.env.secrets`
|
|
14
|
+
* `.env.staging` → `.env.staging.secrets`
|
|
15
|
+
*
|
|
16
|
+
* Secrets overlay env vars (later values win).
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadProjectEnv(rootDir: string, envFileName?: string): Promise<Record<string, string>>;
|
|
19
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQjC"}
|
package/dist/lib/env.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared .env file loading for the Glubean CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { parse as parseDotenv } from "dotenv";
|
|
7
|
+
/**
|
|
8
|
+
* Load a single .env file and return its key-value pairs.
|
|
9
|
+
* Returns an empty object if the file doesn't exist or can't be read.
|
|
10
|
+
*/
|
|
11
|
+
export async function loadEnvFile(envPath) {
|
|
12
|
+
try {
|
|
13
|
+
const content = await readFile(envPath, "utf-8");
|
|
14
|
+
return parseDotenv(content);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code === "ENOENT") {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
console.warn(`Warning: Could not read env file ${envPath}: ${error.message}`);
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load `.env` + `.env.secrets` from a project root directory.
|
|
26
|
+
*
|
|
27
|
+
* The secrets file path follows the env file name:
|
|
28
|
+
* `.env` → `.env.secrets`
|
|
29
|
+
* `.env.staging` → `.env.staging.secrets`
|
|
30
|
+
*
|
|
31
|
+
* Secrets overlay env vars (later values win).
|
|
32
|
+
*/
|
|
33
|
+
export async function loadProjectEnv(rootDir, envFileName = ".env") {
|
|
34
|
+
const envPath = resolve(rootDir, envFileName);
|
|
35
|
+
const secretsPath = resolve(rootDir, `${envFileName}.secrets`);
|
|
36
|
+
const envVars = await loadEnvFile(envPath);
|
|
37
|
+
const secrets = await loadEnvFile(secretsPath);
|
|
38
|
+
return { ...envVars, ...secrets };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,oCAAoC,OAAO,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,WAAW,GAAG,MAAM;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,WAAW,UAAU,CAAC,CAAC;IAE/D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAE/C,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git helper utilities for the Glubean CLI.
|
|
3
|
+
*/
|
|
4
|
+
export declare function isGitRepo(dir?: string): Promise<boolean>;
|
|
5
|
+
export declare function gitShow(ref: string, filePath: string, dir?: string): Promise<string | null>;
|
|
6
|
+
export declare function gitRoot(dir?: string): Promise<string | null>;
|
|
7
|
+
export declare function gitRelativePath(filePath: string, dir?: string): Promise<string | null>;
|
|
8
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;AAED,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,wBAAsB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQlE;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB"}
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git helper utilities for the Glubean CLI.
|
|
3
|
+
*/
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { resolve, relative } from "node:path";
|
|
6
|
+
function execGit(args, cwd) {
|
|
7
|
+
return new Promise((res) => {
|
|
8
|
+
execFile("git", args, { cwd, encoding: "utf-8" }, (error, stdout) => {
|
|
9
|
+
if (error) {
|
|
10
|
+
res({ code: error.code ? 1 : 1, stdout: "" });
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
res({ code: 0, stdout: stdout ?? "" });
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export async function isGitRepo(dir) {
|
|
19
|
+
try {
|
|
20
|
+
const { code } = await execGit(["rev-parse", "--is-inside-work-tree"], dir);
|
|
21
|
+
return code === 0;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function gitShow(ref, filePath, dir) {
|
|
28
|
+
try {
|
|
29
|
+
const { code, stdout } = await execGit(["show", `${ref}:${filePath}`], dir);
|
|
30
|
+
if (code !== 0)
|
|
31
|
+
return null;
|
|
32
|
+
return stdout;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export async function gitRoot(dir) {
|
|
39
|
+
try {
|
|
40
|
+
const { code, stdout } = await execGit(["rev-parse", "--show-toplevel"], dir);
|
|
41
|
+
if (code !== 0)
|
|
42
|
+
return null;
|
|
43
|
+
return stdout.trim();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function gitRelativePath(filePath, dir) {
|
|
50
|
+
try {
|
|
51
|
+
const { code, stdout } = await execGit(["ls-files", "--full-name", filePath], dir);
|
|
52
|
+
if (code !== 0)
|
|
53
|
+
return null;
|
|
54
|
+
const result = stdout.trim();
|
|
55
|
+
if (!result) {
|
|
56
|
+
const rootDir = await gitRoot(dir);
|
|
57
|
+
if (!rootDir)
|
|
58
|
+
return null;
|
|
59
|
+
const absPath = resolve(dir || process.cwd(), filePath);
|
|
60
|
+
return relative(rootDir, absPath);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI Patch — a concise YAML DSL for supplementing incomplete OpenAPI specs.
|
|
3
|
+
*/
|
|
4
|
+
type OpenApiSpec = Record<string, any>;
|
|
5
|
+
export interface PatchFile {
|
|
6
|
+
endpoints?: Record<string, Record<string, OperationPatch>>;
|
|
7
|
+
schemas?: Record<string, Record<string, unknown>>;
|
|
8
|
+
raw?: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
export interface OperationPatch {
|
|
11
|
+
summary?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
body?: Record<string, string>;
|
|
14
|
+
[statusOrField: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare function findPatchFile(specPath: string): Promise<string | null>;
|
|
17
|
+
export declare function loadPatchFile(path: string): Promise<PatchFile>;
|
|
18
|
+
export declare function parsePatchContent(content: string): PatchFile;
|
|
19
|
+
export declare function patchToOpenApi(patch: PatchFile): OpenApiSpec;
|
|
20
|
+
export declare function deepMerge(target: any, source: any): any;
|
|
21
|
+
export declare function applyPatch(spec: OpenApiSpec, patch: PatchFile): OpenApiSpec;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=openapi_patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi_patch.d.ts","sourceRoot":"","sources":["../../src/lib/openapi_patch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAMvC,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAqBD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAGpE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAM5D;AA8FD,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAqE5D;AAMD,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAuBvD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,CAW3E"}
|