@haibun/core 3.6.0 → 3.8.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/build/currentVersion.d.ts +1 -1
- package/build/currentVersion.js +1 -1
- package/build/lib/EventLogger.d.ts +6 -7
- package/build/lib/EventLogger.d.ts.map +1 -1
- package/build/lib/EventLogger.js +12 -33
- package/build/lib/EventLogger.js.map +1 -1
- package/build/lib/PhaseRunner.d.ts +16 -0
- package/build/lib/PhaseRunner.d.ts.map +1 -0
- package/build/lib/PhaseRunner.js +39 -0
- package/build/lib/PhaseRunner.js.map +1 -0
- package/build/lib/defs.d.ts +9 -11
- package/build/lib/defs.d.ts.map +1 -1
- package/build/lib/defs.js +8 -0
- package/build/lib/defs.js.map +1 -1
- package/build/lib/feature-variables.d.ts +10 -22
- package/build/lib/feature-variables.d.ts.map +1 -1
- package/build/lib/feature-variables.js +42 -58
- package/build/lib/feature-variables.js.map +1 -1
- package/build/lib/filter-schema.d.ts +49 -0
- package/build/lib/filter-schema.d.ts.map +1 -0
- package/build/lib/filter-schema.js +104 -0
- package/build/lib/filter-schema.js.map +1 -0
- package/build/lib/filter-types.d.ts +71 -0
- package/build/lib/filter-types.d.ts.map +1 -0
- package/build/lib/filter-types.js +121 -0
- package/build/lib/filter-types.js.map +1 -0
- package/build/lib/monitor-event-collector.d.ts +16 -0
- package/build/lib/monitor-event-collector.d.ts.map +1 -0
- package/build/lib/monitor-event-collector.js +26 -0
- package/build/lib/monitor-event-collector.js.map +1 -0
- package/build/lib/populateActionArgs.js +1 -1
- package/build/lib/populateActionArgs.js.map +1 -1
- package/build/lib/secrets.d.ts +17 -0
- package/build/lib/secrets.d.ts.map +1 -0
- package/build/lib/secrets.js +46 -0
- package/build/lib/secrets.js.map +1 -0
- package/build/lib/test/lib.js +3 -3
- package/build/lib/test/lib.js.map +1 -1
- package/build/lib/util/actualURI.d.ts +1 -1
- package/build/lib/util/actualURI.d.ts.map +1 -1
- package/build/lib/util/index.d.ts +1 -0
- package/build/lib/util/index.d.ts.map +1 -1
- package/build/lib/util/index.js +1 -0
- package/build/lib/util/index.js.map +1 -1
- package/build/lib/util/secret-utils.d.ts +7 -0
- package/build/lib/util/secret-utils.d.ts.map +1 -0
- package/build/lib/util/secret-utils.js +36 -0
- package/build/lib/util/secret-utils.js.map +1 -0
- package/build/phases/Executor.d.ts.map +1 -1
- package/build/phases/Executor.js +4 -6
- package/build/phases/Executor.js.map +1 -1
- package/build/phases/collector.d.ts +3 -2
- package/build/phases/collector.d.ts.map +1 -1
- package/build/phases/collector.js +19 -7
- package/build/phases/collector.js.map +1 -1
- package/build/run-policy/run-policy-schema.d.ts +44 -0
- package/build/run-policy/run-policy-schema.d.ts.map +1 -0
- package/build/run-policy/run-policy-schema.js +263 -0
- package/build/run-policy/run-policy-schema.js.map +1 -0
- package/build/run-policy/run-policy-types.d.ts +60 -0
- package/build/run-policy/run-policy-types.d.ts.map +1 -0
- package/build/run-policy/run-policy-types.js +106 -0
- package/build/run-policy/run-policy-types.js.map +1 -0
- package/build/runfilter/filter-schema.d.ts +76 -0
- package/build/runfilter/filter-schema.d.ts.map +1 -0
- package/build/runfilter/filter-schema.js +129 -0
- package/build/runfilter/filter-schema.js.map +1 -0
- package/build/runfilter/filter-types.d.ts +58 -0
- package/build/runfilter/filter-types.d.ts.map +1 -0
- package/build/runfilter/filter-types.js +102 -0
- package/build/runfilter/filter-types.js.map +1 -0
- package/build/runner.d.ts +0 -3
- package/build/runner.d.ts.map +1 -1
- package/build/runner.js +19 -52
- package/build/runner.js.map +1 -1
- package/build/schema/protocol.d.ts +2 -2
- package/build/steps/activities-stepper.d.ts +4 -4
- package/build/steps/activities-stepper.d.ts.map +1 -1
- package/build/steps/activities-stepper.js +0 -2
- package/build/steps/activities-stepper.js.map +1 -1
- package/build/steps/haibun.d.ts +4 -4
- package/build/steps/narrator.d.ts +4 -4
- package/build/steps/variables-stepper.d.ts +25 -25
- package/build/steps/variables-stepper.d.ts.map +1 -1
- package/build/steps/variables-stepper.js +45 -41
- package/build/steps/variables-stepper.js.map +1 -1
- package/haibun-core-specl.schema.json +42 -0
- package/package.json +6 -4
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FeatureVariables - QuadStore-backed variable storage
|
|
3
|
-
*
|
|
4
|
-
* Domain IS the predicate: (varName, domainType, value, shared)
|
|
5
|
-
* Example: (user_role, roles, "admin", shared)
|
|
6
|
-
*
|
|
7
|
-
* This enables semantic queries: queryQuads({ predicate: 'roles' })
|
|
8
|
-
*/
|
|
9
1
|
import { isLiteralValue } from "./util/index.js";
|
|
10
2
|
import { Origin } from '../schema/protocol.js';
|
|
11
3
|
import { DOMAIN_JSON, DOMAIN_STRING, normalizeDomainKey } from "./domain-types.js";
|
|
@@ -13,6 +5,7 @@ import { QuadStore } from "./quad-store.js";
|
|
|
13
5
|
export const SHARED_GRAPH = 'variables';
|
|
14
6
|
export const META_GRAPH = 'meta';
|
|
15
7
|
export const OBSERVATION_GRAPH = 'observation';
|
|
8
|
+
export const OBSCURED_VALUE = '[o̴b̵s̵c̷u̶r̸e̵d̵]';
|
|
16
9
|
export class FeatureVariables {
|
|
17
10
|
world;
|
|
18
11
|
store;
|
|
@@ -29,7 +22,6 @@ export class FeatureVariables {
|
|
|
29
22
|
}
|
|
30
23
|
}
|
|
31
24
|
}
|
|
32
|
-
/** Get the underlying QuadStore for direct queries */
|
|
33
25
|
getStore() {
|
|
34
26
|
return this.store;
|
|
35
27
|
}
|
|
@@ -70,20 +62,15 @@ export class FeatureVariables {
|
|
|
70
62
|
if (domain === undefined) {
|
|
71
63
|
throw Error(`Cannot set variable "${sv.term}": unknown domain "${sv.domain}"`);
|
|
72
64
|
}
|
|
73
|
-
|
|
74
|
-
const autoSecret = /password/i.test(sv.term);
|
|
75
|
-
const normalized = { ...sv, domain: domainKey, secret: sv.secret || autoSecret };
|
|
65
|
+
const normalized = { ...sv, domain: domainKey };
|
|
76
66
|
domain.coerce(normalized);
|
|
77
67
|
const existingProvenance = this.values[sv.term]?.provenance;
|
|
78
68
|
const provenances = existingProvenance ? [...existingProvenance, provenance] : [provenance];
|
|
79
|
-
// Store in values map (keeps existing behavior)
|
|
80
69
|
this.values[sv.term] = {
|
|
81
70
|
...normalized,
|
|
82
71
|
provenance: provenances
|
|
83
72
|
};
|
|
84
|
-
// Store as quad with domain as predicate
|
|
85
73
|
this.storeAsQuad(sv.term, { ...normalized, provenance: provenances }, namedGraph);
|
|
86
|
-
// Emit quad observation event for real-time graph building
|
|
87
74
|
const timestamp = Date.now();
|
|
88
75
|
this.world.eventLogger?.emit({
|
|
89
76
|
id: `quad-${timestamp}`,
|
|
@@ -96,14 +83,12 @@ export class FeatureVariables {
|
|
|
96
83
|
json: {
|
|
97
84
|
quadObservation: {
|
|
98
85
|
subject: sv.term,
|
|
99
|
-
predicate: domainKey,
|
|
100
|
-
object: normalized.value,
|
|
86
|
+
predicate: domainKey,
|
|
87
|
+
object: this.isSecret(sv.term) ? OBSCURED_VALUE : normalized.value,
|
|
101
88
|
namedGraph,
|
|
102
|
-
// Move provenance to separate quads in meta namedGraph, don't embed
|
|
103
89
|
}
|
|
104
90
|
},
|
|
105
91
|
});
|
|
106
|
-
// Emit meta quads for origin/provenance/readonly if present
|
|
107
92
|
if (sv.origin) {
|
|
108
93
|
this.world.eventLogger?.emit({
|
|
109
94
|
id: `quad-meta-origin-${timestamp}`,
|
|
@@ -124,33 +109,15 @@ export class FeatureVariables {
|
|
|
124
109
|
});
|
|
125
110
|
}
|
|
126
111
|
}
|
|
127
|
-
get(name) {
|
|
128
|
-
if (!this.values[name])
|
|
129
|
-
return undefined;
|
|
130
|
-
const domainKey = normalizeDomainKey(this.values[name].domain);
|
|
131
|
-
const domain = this.world.domains[domainKey];
|
|
132
|
-
if (!domain) {
|
|
133
|
-
throw Error(`Cannot read variable "${name}": unknown domain "${this.values[name].domain}"`);
|
|
134
|
-
}
|
|
135
|
-
const ret = domain.coerce({ ...this.values[name], domain: domainKey });
|
|
136
|
-
return ret;
|
|
137
|
-
}
|
|
138
|
-
getJSON(name) {
|
|
139
|
-
if (!this.values[name])
|
|
140
|
-
return undefined;
|
|
141
|
-
if (this.values[name].domain !== DOMAIN_JSON)
|
|
142
|
-
throw Error(`${name} is ${this.values[name].domain}, not json`);
|
|
143
|
-
return JSON.parse(this.values[name].value);
|
|
144
|
-
}
|
|
145
112
|
/**
|
|
146
113
|
* Resolves a variable and its domain based on its actual origin.
|
|
114
|
+
* Requires explicit options.secure to return the real value of a secret.
|
|
147
115
|
*/
|
|
148
|
-
resolveVariable(input, featureStep, steppers) {
|
|
116
|
+
resolveVariable(input, featureStep, steppers, options = { secure: false }) {
|
|
149
117
|
const resolved = {
|
|
150
118
|
term: input.term,
|
|
151
119
|
value: undefined,
|
|
152
120
|
};
|
|
153
|
-
// Handle {varName} syntax - extract variable name from braces
|
|
154
121
|
let lookupTerm = input.term;
|
|
155
122
|
if (lookupTerm.startsWith('{') && lookupTerm.endsWith('}')) {
|
|
156
123
|
lookupTerm = lookupTerm.slice(1, -1);
|
|
@@ -161,7 +128,7 @@ export class FeatureVariables {
|
|
|
161
128
|
resolved.domain = input.domain;
|
|
162
129
|
}
|
|
163
130
|
else if (input.origin === Origin.env) {
|
|
164
|
-
resolved.value = this.world.options.envVariables[lookupTerm];
|
|
131
|
+
resolved.value = this.world.options.envVariables[lookupTerm];
|
|
165
132
|
resolved.domain = DOMAIN_STRING;
|
|
166
133
|
}
|
|
167
134
|
else if (input.origin === Origin.var) {
|
|
@@ -169,6 +136,8 @@ export class FeatureVariables {
|
|
|
169
136
|
resolved.domain = storedEntry.domain;
|
|
170
137
|
resolved.value = storedEntry.value;
|
|
171
138
|
resolved.provenance = storedEntry.provenance;
|
|
139
|
+
resolved.readonly = storedEntry.readonly;
|
|
140
|
+
resolved.secret = storedEntry.secret; // Propagate secret property
|
|
172
141
|
}
|
|
173
142
|
}
|
|
174
143
|
else if (input.origin === Origin.defined) {
|
|
@@ -186,6 +155,7 @@ export class FeatureVariables {
|
|
|
186
155
|
resolved.value = storedEntry.value;
|
|
187
156
|
resolved.domain = storedEntry.domain;
|
|
188
157
|
resolved.provenance = storedEntry.provenance;
|
|
158
|
+
resolved.readonly = storedEntry.readonly;
|
|
189
159
|
resolved.origin = Origin.var;
|
|
190
160
|
}
|
|
191
161
|
else if (isLiteralValue(input.term)) {
|
|
@@ -208,6 +178,7 @@ export class FeatureVariables {
|
|
|
208
178
|
resolved.value = storedEntry.value;
|
|
209
179
|
resolved.domain = storedEntry.domain;
|
|
210
180
|
resolved.provenance = storedEntry.provenance;
|
|
181
|
+
resolved.readonly = storedEntry.readonly;
|
|
211
182
|
resolved.origin = Origin.var;
|
|
212
183
|
}
|
|
213
184
|
}
|
|
@@ -228,6 +199,9 @@ export class FeatureVariables {
|
|
|
228
199
|
}
|
|
229
200
|
resolved.value = domain.coerce({ ...resolved, domain: domainKey }, featureStep, steppers);
|
|
230
201
|
resolved.domain = domainKey;
|
|
202
|
+
if (!options.secure && this.isSecret(input.term)) {
|
|
203
|
+
resolved.value = OBSCURED_VALUE;
|
|
204
|
+
}
|
|
231
205
|
}
|
|
232
206
|
return resolved;
|
|
233
207
|
}
|
|
@@ -246,26 +220,19 @@ export class FeatureVariables {
|
|
|
246
220
|
.map(v => v.value);
|
|
247
221
|
return { values: memberValues };
|
|
248
222
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Query quads. The predicate IS the domain type.
|
|
254
|
-
* Example: queryQuads({ predicate: 'roles' }) to find all role-typed values.
|
|
255
|
-
*/
|
|
223
|
+
get(term, secure = false) {
|
|
224
|
+
return this.resolveVariable({ term, origin: Origin.defined }, undefined, undefined, { secure }).value;
|
|
225
|
+
}
|
|
256
226
|
queryQuads(pattern) {
|
|
257
227
|
const queryPattern = { ...pattern, namedGraph: pattern.namedGraph };
|
|
258
228
|
return this.store.query(queryPattern);
|
|
259
229
|
}
|
|
260
|
-
/** Check existence of a quad */
|
|
261
230
|
existsQuad(pattern) {
|
|
262
231
|
return this.queryQuads(pattern).length > 0;
|
|
263
232
|
}
|
|
264
|
-
/** Count quads matching pattern */
|
|
265
233
|
countQuads(pattern) {
|
|
266
234
|
return this.queryQuads(pattern).length;
|
|
267
235
|
}
|
|
268
|
-
/** Add a quad directly (for non-variable observations like HTTP traces) */
|
|
269
236
|
addQuad(quad) {
|
|
270
237
|
this.store.add(quad);
|
|
271
238
|
// Emit event for graph visualization
|
|
@@ -283,17 +250,38 @@ export class FeatureVariables {
|
|
|
283
250
|
},
|
|
284
251
|
});
|
|
285
252
|
}
|
|
286
|
-
/** Remove quads matching a pattern */
|
|
287
253
|
removeQuad(pattern) {
|
|
288
254
|
this.store.remove(pattern);
|
|
289
255
|
}
|
|
290
|
-
/** Get all quads */
|
|
291
256
|
allQuads() {
|
|
292
257
|
return this.store.all();
|
|
293
258
|
}
|
|
294
|
-
/** Check if a variable is marked as secret */
|
|
295
259
|
isSecret(name) {
|
|
296
|
-
|
|
260
|
+
if (this.values[name]?.secret) {
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
if (this.values[name]?.secret === false) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
return /(password|secret)/i.test(name);
|
|
267
|
+
}
|
|
268
|
+
getSecrets() {
|
|
269
|
+
const secrets = {};
|
|
270
|
+
const envVars = this.world.options.envVariables;
|
|
271
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
272
|
+
if (this.isSecret(key)) {
|
|
273
|
+
secrets[key] = String(value);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
for (const [key, variable] of Object.entries(this.all())) {
|
|
277
|
+
if (this.isSecret(key)) {
|
|
278
|
+
secrets[key] = String(variable.value);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return secrets;
|
|
282
|
+
}
|
|
283
|
+
getSecretValues() {
|
|
284
|
+
return Object.values(this.getSecrets());
|
|
297
285
|
}
|
|
298
286
|
// =========================================================================
|
|
299
287
|
// Private helpers
|
|
@@ -302,7 +290,6 @@ export class FeatureVariables {
|
|
|
302
290
|
const domainKey = normalizeDomainKey(sv.domain);
|
|
303
291
|
// Domain IS the predicate: (name, domainType, value, shared)
|
|
304
292
|
this.store.add({ subject: name, predicate: domainKey, object: sv.value, namedGraph });
|
|
305
|
-
// Store metadata as separate quads in META namedGraph
|
|
306
293
|
if (sv.origin) {
|
|
307
294
|
this.store.add({ subject: name, predicate: 'origin', object: sv.origin, namedGraph: META_GRAPH });
|
|
308
295
|
}
|
|
@@ -312,9 +299,6 @@ export class FeatureVariables {
|
|
|
312
299
|
if (sv.readonly) {
|
|
313
300
|
this.store.add({ subject: name, predicate: 'readonly', object: true, namedGraph: META_GRAPH });
|
|
314
301
|
}
|
|
315
|
-
if (sv.secret) {
|
|
316
|
-
this.store.add({ subject: name, predicate: 'secret', object: true, namedGraph: META_GRAPH });
|
|
317
|
-
}
|
|
318
302
|
}
|
|
319
303
|
}
|
|
320
304
|
//# sourceMappingURL=feature-variables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-variables.js","sourceRoot":"","sources":["../../src/lib/feature-variables.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-variables.js","sourceRoot":"","sources":["../../src/lib/feature-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type TFilterConfig } from './filter-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Zod schema for the filter policy JSON file.
|
|
5
|
+
*
|
|
6
|
+
* The JSON Schema file defines which env+dir+access combinations are allowed.
|
|
7
|
+
* Structure:
|
|
8
|
+
* {
|
|
9
|
+
* "environments": ["local", "dev", "test", "prod"],
|
|
10
|
+
* "directories": ["smoke", "api", "web", "regression"],
|
|
11
|
+
* "deny": [
|
|
12
|
+
* { "env": "prod", "access": "w" },
|
|
13
|
+
* { "env": "prod", "dir": "regression", "access": "a" }
|
|
14
|
+
* ]
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* - `environments`: valid environment names
|
|
18
|
+
* - `directories`: valid directory names
|
|
19
|
+
* - `deny`: rules that block specific combinations. Each rule matches when
|
|
20
|
+
* all specified fields match. Omitted fields match everything (wildcard).
|
|
21
|
+
*/
|
|
22
|
+
export declare const FilterPolicySchema: z.ZodObject<{
|
|
23
|
+
environments: z.ZodArray<z.ZodString>;
|
|
24
|
+
directories: z.ZodArray<z.ZodString>;
|
|
25
|
+
deny: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
26
|
+
env: z.ZodOptional<z.ZodString>;
|
|
27
|
+
dir: z.ZodOptional<z.ZodString>;
|
|
28
|
+
access: z.ZodOptional<z.ZodEnum<{
|
|
29
|
+
r: "r";
|
|
30
|
+
a: "a";
|
|
31
|
+
w: "w";
|
|
32
|
+
}>>;
|
|
33
|
+
}, z.core.$strip>>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type TFilterPolicy = z.infer<typeof FilterPolicySchema>;
|
|
36
|
+
/**
|
|
37
|
+
* Load and parse a filter policy JSON file.
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadFilterPolicy(schemaPath: string): TFilterPolicy;
|
|
40
|
+
/**
|
|
41
|
+
* Validate a runtime filter config against a loaded filter policy.
|
|
42
|
+
* Returns an array of error messages (empty = valid).
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateFilterConfig(config: TFilterConfig, policy: TFilterPolicy): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Load schema, validate config, and throw on failure.
|
|
47
|
+
*/
|
|
48
|
+
export declare function loadAndValidateFilters(config: TFilterConfig): TFilterPolicy;
|
|
49
|
+
//# sourceMappingURL=filter-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-schema.d.ts","sourceRoot":"","sources":["../../src/lib/filter-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;iBAU7B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE/D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAsBlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAiC3F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAO3E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { ACCESS_LEVELS } from './filter-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Zod schema for the filter policy JSON file.
|
|
6
|
+
*
|
|
7
|
+
* The JSON Schema file defines which env+dir+access combinations are allowed.
|
|
8
|
+
* Structure:
|
|
9
|
+
* {
|
|
10
|
+
* "environments": ["local", "dev", "test", "prod"],
|
|
11
|
+
* "directories": ["smoke", "api", "web", "regression"],
|
|
12
|
+
* "deny": [
|
|
13
|
+
* { "env": "prod", "access": "w" },
|
|
14
|
+
* { "env": "prod", "dir": "regression", "access": "a" }
|
|
15
|
+
* ]
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* - `environments`: valid environment names
|
|
19
|
+
* - `directories`: valid directory names
|
|
20
|
+
* - `deny`: rules that block specific combinations. Each rule matches when
|
|
21
|
+
* all specified fields match. Omitted fields match everything (wildcard).
|
|
22
|
+
*/
|
|
23
|
+
export const FilterPolicySchema = z.object({
|
|
24
|
+
environments: z.array(z.string()).min(1),
|
|
25
|
+
directories: z.array(z.string()).min(1),
|
|
26
|
+
deny: z.array(z.object({
|
|
27
|
+
env: z.string().optional(),
|
|
28
|
+
dir: z.string().optional(),
|
|
29
|
+
access: z.enum(ACCESS_LEVELS).optional(),
|
|
30
|
+
})).default([]),
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* Load and parse a filter policy JSON file.
|
|
34
|
+
*/
|
|
35
|
+
export function loadFilterPolicy(schemaPath) {
|
|
36
|
+
let raw;
|
|
37
|
+
try {
|
|
38
|
+
raw = readFileSync(schemaPath, 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
throw new Error(`Cannot read filter schema file "${schemaPath}": ${err.message}`);
|
|
42
|
+
}
|
|
43
|
+
let parsed;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(raw);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new Error(`Filter schema file "${schemaPath}" is not valid JSON`);
|
|
49
|
+
}
|
|
50
|
+
const result = FilterPolicySchema.safeParse(parsed);
|
|
51
|
+
if (!result.success) {
|
|
52
|
+
const issues = result.error.issues.map((i) => ` ${i.path.join('.')}: ${i.message}`).join('\n');
|
|
53
|
+
throw new Error(`Filter schema file "${schemaPath}" has invalid structure:\n${issues}`);
|
|
54
|
+
}
|
|
55
|
+
return result.data;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate a runtime filter config against a loaded filter policy.
|
|
59
|
+
* Returns an array of error messages (empty = valid).
|
|
60
|
+
*/
|
|
61
|
+
export function validateFilterConfig(config, policy) {
|
|
62
|
+
const errors = [];
|
|
63
|
+
// Validate environment
|
|
64
|
+
if (!policy.environments.includes(config.env)) {
|
|
65
|
+
errors.push(`Environment "${config.env}" is not allowed. Valid: ${policy.environments.join(', ')}`);
|
|
66
|
+
}
|
|
67
|
+
// Validate directories
|
|
68
|
+
for (const df of config.dirFilters) {
|
|
69
|
+
if (!policy.directories.includes(df.dir)) {
|
|
70
|
+
errors.push(`Directory "${df.dir}" is not allowed. Valid: ${policy.directories.join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Check deny rules
|
|
74
|
+
for (const rule of policy.deny) {
|
|
75
|
+
for (const df of config.dirFilters) {
|
|
76
|
+
const envMatch = !rule.env || rule.env === config.env;
|
|
77
|
+
const dirMatch = !rule.dir || rule.dir === df.dir;
|
|
78
|
+
const accessMatch = !rule.access || rule.access === df.access;
|
|
79
|
+
if (envMatch && dirMatch && accessMatch) {
|
|
80
|
+
const parts = [];
|
|
81
|
+
if (rule.env)
|
|
82
|
+
parts.push(`env=${rule.env}`);
|
|
83
|
+
if (rule.dir)
|
|
84
|
+
parts.push(`dir=${rule.dir}`);
|
|
85
|
+
if (rule.access)
|
|
86
|
+
parts.push(`access=${rule.access}`);
|
|
87
|
+
errors.push(`Denied by policy rule: ${parts.join(', ')} (matched ${df.dir}:${df.access} in ${config.env})`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return errors;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Load schema, validate config, and throw on failure.
|
|
95
|
+
*/
|
|
96
|
+
export function loadAndValidateFilters(config) {
|
|
97
|
+
const policy = loadFilterPolicy(config.schemaPath);
|
|
98
|
+
const errors = validateFilterConfig(config, policy);
|
|
99
|
+
if (errors.length > 0) {
|
|
100
|
+
throw new Error(`Filter validation failed:\n${errors.map((e) => ` • ${e}`).join('\n')}`);
|
|
101
|
+
}
|
|
102
|
+
return policy;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=filter-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-schema.js","sourceRoot":"","sources":["../../src/lib/filter-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** CLI option name for filters */
|
|
3
|
+
export declare const OPTION_FILTERS = "--filters";
|
|
4
|
+
/** Environment variable for filters (format: "schema.json env dir:access,dir:access") */
|
|
5
|
+
export declare const HAIBUN_FILTERS = "HAIBUN_FILTERS";
|
|
6
|
+
/** Valid access levels, forming a strict hierarchy: r ⊂ a ⊂ w */
|
|
7
|
+
export declare const ACCESS_LEVELS: readonly ["r", "a", "w"];
|
|
8
|
+
/** Feature filename prefixes corresponding to access levels */
|
|
9
|
+
export declare const ACCESS_PREFIX_R = "r_";
|
|
10
|
+
export declare const ACCESS_PREFIX_A = "a_";
|
|
11
|
+
export declare const ACCESS_PREFIX_W = "w_";
|
|
12
|
+
export declare const ACCESS_PREFIXES: readonly ["r_", "a_", "w_"];
|
|
13
|
+
export type AccessLevel = (typeof ACCESS_LEVELS)[number];
|
|
14
|
+
export declare const AccessLevelSchema: z.ZodEnum<{
|
|
15
|
+
r: "r";
|
|
16
|
+
a: "a";
|
|
17
|
+
w: "w";
|
|
18
|
+
}>;
|
|
19
|
+
/** A single directory + access pair, e.g. "smoke:r" */
|
|
20
|
+
export type TDirFilter = {
|
|
21
|
+
dir: string;
|
|
22
|
+
access: AccessLevel;
|
|
23
|
+
};
|
|
24
|
+
/** Parsed --filters configuration */
|
|
25
|
+
export type TFilterConfig = {
|
|
26
|
+
schemaPath: string;
|
|
27
|
+
env: string;
|
|
28
|
+
dirFilters: TDirFilter[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Parse the dir:access,dir:access string into TDirFilter[].
|
|
32
|
+
* E.g. "smoke:r,api:a" → [{ dir: "smoke", access: "r" }, { dir: "api", access: "a" }]
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseDirFilters(input: string): TDirFilter[];
|
|
35
|
+
/**
|
|
36
|
+
* Parse --filters arguments: schemaPath env dir:access[,dir:access]
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseFilterArgs(schemaPath: string, env: string, dirAccessStr: string): TFilterConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Parse HAIBUN_FILTERS env var value: "schema.json env dir:access,dir:access"
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseFilterEnv(value: string): TFilterConfig;
|
|
43
|
+
/**
|
|
44
|
+
* Returns the numeric rank of an access level for comparison.
|
|
45
|
+
* r=0, a=1, w=2
|
|
46
|
+
*/
|
|
47
|
+
export declare function accessRank(level: AccessLevel): number;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a granted access level includes the required level.
|
|
50
|
+
* Access levels are cumulative: w includes a includes r.
|
|
51
|
+
*/
|
|
52
|
+
export declare function accessLevelIncludes(granted: AccessLevel, required: AccessLevel): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Extract the access prefix from a feature filename.
|
|
55
|
+
* Returns the access level if the file starts with r_, a_, or w_.
|
|
56
|
+
* Returns undefined for unprefixed/unrecognized files (they will be skipped).
|
|
57
|
+
*/
|
|
58
|
+
export declare function getFeatureAccessPrefix(filename: string): AccessLevel | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Determine if a feature file should run given the active filters.
|
|
61
|
+
*
|
|
62
|
+
* - Unprefixed/unrecognized files are silently skipped (returns false).
|
|
63
|
+
* - Files whose access prefix exceeds the granted level are skipped.
|
|
64
|
+
* - Files in directories not listed in the filters are skipped.
|
|
65
|
+
*
|
|
66
|
+
* @param featurePath - relative path from features root, e.g. "/smoke/r_health.feature"
|
|
67
|
+
* @param dirFilters - active directory filters
|
|
68
|
+
* @returns true if the feature should execute
|
|
69
|
+
*/
|
|
70
|
+
export declare function featureMatchesFilter(featurePath: string, dirFilters: TDirFilter[]): boolean;
|
|
71
|
+
//# sourceMappingURL=filter-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-types.d.ts","sourceRoot":"","sources":["../../src/lib/filter-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,kCAAkC;AAClC,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,yFAAyF;AACzF,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,iEAAiE;AACjE,eAAO,MAAM,aAAa,0BAA2B,CAAC;AAEtD,+DAA+D;AAC/D,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,eAAe,6BAA+D,CAAC;AAM5F,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,eAAO,MAAM,iBAAiB;;;;EAAwB,CAAC;AAEvD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B,CAAC;AAMF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAY3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,aAAa,CAUpG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAM3D;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAExF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAKhF;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAe3F"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Constants
|
|
4
|
+
// ============================================================================
|
|
5
|
+
/** CLI option name for filters */
|
|
6
|
+
export const OPTION_FILTERS = '--filters';
|
|
7
|
+
/** Environment variable for filters (format: "schema.json env dir:access,dir:access") */
|
|
8
|
+
export const HAIBUN_FILTERS = 'HAIBUN_FILTERS';
|
|
9
|
+
/** Valid access levels, forming a strict hierarchy: r ⊂ a ⊂ w */
|
|
10
|
+
export const ACCESS_LEVELS = ['r', 'a', 'w'];
|
|
11
|
+
/** Feature filename prefixes corresponding to access levels */
|
|
12
|
+
export const ACCESS_PREFIX_R = 'r_';
|
|
13
|
+
export const ACCESS_PREFIX_A = 'a_';
|
|
14
|
+
export const ACCESS_PREFIX_W = 'w_';
|
|
15
|
+
export const ACCESS_PREFIXES = [ACCESS_PREFIX_R, ACCESS_PREFIX_A, ACCESS_PREFIX_W];
|
|
16
|
+
export const AccessLevelSchema = z.enum(ACCESS_LEVELS);
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Parsing
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Parse the dir:access,dir:access string into TDirFilter[].
|
|
22
|
+
* E.g. "smoke:r,api:a" → [{ dir: "smoke", access: "r" }, { dir: "api", access: "a" }]
|
|
23
|
+
*/
|
|
24
|
+
export function parseDirFilters(input) {
|
|
25
|
+
return input.split(',').map((pair) => {
|
|
26
|
+
const [dir, accessStr] = pair.split(':');
|
|
27
|
+
if (!dir || !accessStr) {
|
|
28
|
+
throw new Error(`Invalid dir:access pair "${pair}". Expected format: dir:access (e.g. smoke:r)`);
|
|
29
|
+
}
|
|
30
|
+
const parsed = AccessLevelSchema.safeParse(accessStr);
|
|
31
|
+
if (!parsed.success) {
|
|
32
|
+
throw new Error(`Invalid access level "${accessStr}" in "${pair}". Must be one of: ${ACCESS_LEVELS.join(', ')}`);
|
|
33
|
+
}
|
|
34
|
+
return { dir, access: parsed.data };
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse --filters arguments: schemaPath env dir:access[,dir:access]
|
|
39
|
+
*/
|
|
40
|
+
export function parseFilterArgs(schemaPath, env, dirAccessStr) {
|
|
41
|
+
if (!schemaPath)
|
|
42
|
+
throw new Error(`${OPTION_FILTERS} requires a schema path`);
|
|
43
|
+
if (!env)
|
|
44
|
+
throw new Error(`${OPTION_FILTERS} requires an environment`);
|
|
45
|
+
if (!dirAccessStr)
|
|
46
|
+
throw new Error(`${OPTION_FILTERS} requires dir:access pairs`);
|
|
47
|
+
return {
|
|
48
|
+
schemaPath,
|
|
49
|
+
env,
|
|
50
|
+
dirFilters: parseDirFilters(dirAccessStr),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse HAIBUN_FILTERS env var value: "schema.json env dir:access,dir:access"
|
|
55
|
+
*/
|
|
56
|
+
export function parseFilterEnv(value) {
|
|
57
|
+
const parts = value.trim().split(/\s+/);
|
|
58
|
+
if (parts.length !== 3) {
|
|
59
|
+
throw new Error(`${HAIBUN_FILTERS} must have 3 space-separated parts: "schema env dir:access[,dir:access]" (got ${parts.length})`);
|
|
60
|
+
}
|
|
61
|
+
return parseFilterArgs(parts[0], parts[1], parts[2]);
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Access Level Logic
|
|
65
|
+
// ============================================================================
|
|
66
|
+
/**
|
|
67
|
+
* Returns the numeric rank of an access level for comparison.
|
|
68
|
+
* r=0, a=1, w=2
|
|
69
|
+
*/
|
|
70
|
+
export function accessRank(level) {
|
|
71
|
+
return ACCESS_LEVELS.indexOf(level);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a granted access level includes the required level.
|
|
75
|
+
* Access levels are cumulative: w includes a includes r.
|
|
76
|
+
*/
|
|
77
|
+
export function accessLevelIncludes(granted, required) {
|
|
78
|
+
return accessRank(granted) >= accessRank(required);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extract the access prefix from a feature filename.
|
|
82
|
+
* Returns the access level if the file starts with r_, a_, or w_.
|
|
83
|
+
* Returns undefined for unprefixed/unrecognized files (they will be skipped).
|
|
84
|
+
*/
|
|
85
|
+
export function getFeatureAccessPrefix(filename) {
|
|
86
|
+
const match = filename.match(/^([raw])_/);
|
|
87
|
+
if (!match)
|
|
88
|
+
return undefined;
|
|
89
|
+
const parsed = AccessLevelSchema.safeParse(match[1]);
|
|
90
|
+
return parsed.success ? parsed.data : undefined;
|
|
91
|
+
}
|
|
92
|
+
// ============================================================================
|
|
93
|
+
// Feature Matching
|
|
94
|
+
// ============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Determine if a feature file should run given the active filters.
|
|
97
|
+
*
|
|
98
|
+
* - Unprefixed/unrecognized files are silently skipped (returns false).
|
|
99
|
+
* - Files whose access prefix exceeds the granted level are skipped.
|
|
100
|
+
* - Files in directories not listed in the filters are skipped.
|
|
101
|
+
*
|
|
102
|
+
* @param featurePath - relative path from features root, e.g. "/smoke/r_health.feature"
|
|
103
|
+
* @param dirFilters - active directory filters
|
|
104
|
+
* @returns true if the feature should execute
|
|
105
|
+
*/
|
|
106
|
+
export function featureMatchesFilter(featurePath, dirFilters) {
|
|
107
|
+
const parts = featurePath.replace(/^\//, '').split('/');
|
|
108
|
+
const filename = parts[parts.length - 1];
|
|
109
|
+
const featureDir = parts.length > 1 ? parts[0] : undefined;
|
|
110
|
+
// Unrecognized prefix → skip silently
|
|
111
|
+
const requiredAccess = getFeatureAccessPrefix(filename);
|
|
112
|
+
if (!requiredAccess)
|
|
113
|
+
return false;
|
|
114
|
+
// No matching directory filter → skip
|
|
115
|
+
const matchingFilter = dirFilters.find((f) => f.dir === featureDir);
|
|
116
|
+
if (!matchingFilter)
|
|
117
|
+
return false;
|
|
118
|
+
// Check access hierarchy
|
|
119
|
+
return accessLevelIncludes(matchingFilter.access, requiredAccess);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=filter-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-types.js","sourceRoot":"","sources":["../../src/lib/filter-types.ts"],"names":[],"mappings":"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"}
|