conftree 0.1.1 → 0.2.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/README.md +8 -0
- package/dist/cache/cache.d.ts +2 -0
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js +5 -1
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/change-bus.d.ts +5 -2
- package/dist/cache/change-bus.d.ts.map +1 -1
- package/dist/cache/change-bus.js +3 -0
- package/dist/cache/change-bus.js.map +1 -1
- package/dist/index.mjs +11 -2
- package/dist/index.mjs.map +1 -1
- package/dist/storage/memory-storage.d.ts.map +1 -1
- package/dist/storage/memory-storage.js +4 -2
- package/dist/storage/memory-storage.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,6 +81,14 @@ const { resolver, writer } = createEngine({
|
|
|
81
81
|
});
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
+
If you create engines repeatedly against a shared, long-lived bus (e.g. a Redis-backed one in a server process), call `cache.dispose()` when an engine is no longer needed — otherwise its cache stays subscribed to the bus forever:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
const { cache } = createEngine({ bus: sharedRedisBus });
|
|
88
|
+
// ...later, e.g. on module teardown:
|
|
89
|
+
cache.dispose();
|
|
90
|
+
```
|
|
91
|
+
|
|
84
92
|
### Value types
|
|
85
93
|
|
|
86
94
|
`BOOLEAN`, `NUMERIC`, `TEXT`, `ENUM`, `JSON`, `DATE`.
|
package/dist/cache/cache.d.ts
CHANGED
|
@@ -10,7 +10,9 @@ export declare class Cache {
|
|
|
10
10
|
private readonly options;
|
|
11
11
|
private readonly hierarchy?;
|
|
12
12
|
private readonly store;
|
|
13
|
+
private readonly listener;
|
|
13
14
|
constructor(bus: ChangeBus, options?: CacheOptions, hierarchy?: ScopeHierarchy | undefined);
|
|
15
|
+
dispose(): void;
|
|
14
16
|
get(key: string, scope: Scope): Value | undefined;
|
|
15
17
|
set(key: string, scope: Scope, value: Value): void;
|
|
16
18
|
drop(key: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,cAAc,CAAC;AAE3E,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,qBAAa,KAAK;IAKhB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAN5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmD;gBAG1D,GAAG,EAAE,SAAS,EACd,OAAO,GAAE,YAAiB,EAC1B,SAAS,CAAC,EAAE,cAAc,YAAA;IAK5C,OAAO,IAAI,IAAI;IAIf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS;IAYjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAoBlD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMvB,OAAO,IAAI,IAAI;IAIf,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAUlD,OAAO,CAAC,UAAU;YAaJ,QAAQ;IAatB,OAAO,CAAC,MAAM;CAGd"}
|
package/dist/cache/cache.js
CHANGED
|
@@ -8,11 +8,15 @@ class Cache {
|
|
|
8
8
|
options;
|
|
9
9
|
hierarchy;
|
|
10
10
|
store = new Map();
|
|
11
|
+
listener = (event) => this.onChange(event);
|
|
11
12
|
constructor(bus, options = {}, hierarchy) {
|
|
12
13
|
this.bus = bus;
|
|
13
14
|
this.options = options;
|
|
14
15
|
this.hierarchy = hierarchy;
|
|
15
|
-
this.bus.subscribe(
|
|
16
|
+
this.bus.subscribe(this.listener);
|
|
17
|
+
}
|
|
18
|
+
dispose() {
|
|
19
|
+
this.bus.unsubscribe(this.listener);
|
|
16
20
|
}
|
|
17
21
|
get(key, scope) {
|
|
18
22
|
if (this.options.enabled === false)
|
package/dist/cache/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":";;;AAiBA,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAa,KAAK;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":";;;AAiBA,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAa,KAAK;IAKC;IACA;IACA;IAND,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjC,QAAQ,GAAmB,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5E,YACkB,GAAc,EACd,UAAwB,EAAE,EAC1B,SAA0B;QAF1B,QAAG,GAAH,GAAG,CAAW;QACd,YAAO,GAAP,OAAO,CAAmB;QAC1B,cAAS,GAAT,SAAS,CAAiB;QAE3C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;QACN,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAY;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,KAAY;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,IACC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC,EAClE,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACxB,GAAG;YACH,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU,EAAE,KAAK,CAAC,KAAK;YACvB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAW;QACf,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,OAAO;QACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,aAAa,CAAC,WAA6B;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;IACF,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,WAA6B;QAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,IACC,KAAK,CAAC,GAAG,KAAK,GAAG;gBACjB,KAAK,CAAC,UAAU,KAAK,IAAI;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAC5B,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAkB;QACxC,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS;iBACtC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;iBAC7B,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBACxC,OAAO;YACR,CAAC;QACF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAEO,MAAM,CAAC,GAAW,EAAE,KAAY;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;CACD;AAjGD,sBAiGC"}
|
|
@@ -4,13 +4,16 @@ export interface ChangeEvent {
|
|
|
4
4
|
scopeKind: string;
|
|
5
5
|
scopeRefId: string | null;
|
|
6
6
|
}
|
|
7
|
+
export type ChangeListener = (event: ChangeEvent) => void | Promise<void>;
|
|
7
8
|
export interface ChangeBus {
|
|
8
9
|
publish(event: ChangeEvent): Promise<void>;
|
|
9
|
-
subscribe(listener:
|
|
10
|
+
subscribe(listener: ChangeListener): void;
|
|
11
|
+
unsubscribe(listener: ChangeListener): void;
|
|
10
12
|
}
|
|
11
13
|
export declare class LocalBus implements ChangeBus {
|
|
12
14
|
private readonly listeners;
|
|
13
15
|
publish(event: ChangeEvent): Promise<void>;
|
|
14
|
-
subscribe(listener:
|
|
16
|
+
subscribe(listener: ChangeListener): void;
|
|
17
|
+
unsubscribe(listener: ChangeListener): void;
|
|
15
18
|
}
|
|
16
19
|
//# sourceMappingURL=change-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-bus.d.ts","sourceRoot":"","sources":["../../src/cache/change-bus.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACzB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"change-bus.d.ts","sourceRoot":"","sources":["../../src/cache/change-bus.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1E,MAAM,WAAW,SAAS;IACzB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;CAC5C;AAED,qBAAa,QAAS,YAAW,SAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEjD,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIzC,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;CAG3C"}
|
package/dist/cache/change-bus.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-bus.js","sourceRoot":"","sources":["../../src/cache/change-bus.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"change-bus.js","sourceRoot":"","sources":["../../src/cache/change-bus.ts"],"names":[],"mappings":";;;AAeA,MAAa,QAAQ;IACH,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,KAAK,CAAC,OAAO,CAAC,KAAkB;QAC/B,MAAM,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CACpC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAChC,CACD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAwB;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,QAAwB;QACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACD;AAlBD,4BAkBC"}
|
package/dist/index.mjs
CHANGED
|
@@ -75,6 +75,9 @@ var LocalBus = class {
|
|
|
75
75
|
subscribe(listener) {
|
|
76
76
|
this.listeners.add(listener);
|
|
77
77
|
}
|
|
78
|
+
unsubscribe(listener) {
|
|
79
|
+
this.listeners.delete(listener);
|
|
80
|
+
}
|
|
78
81
|
};
|
|
79
82
|
|
|
80
83
|
// src/cache/cache.ts
|
|
@@ -85,12 +88,16 @@ var Cache = class {
|
|
|
85
88
|
this.bus = bus;
|
|
86
89
|
this.options = options;
|
|
87
90
|
this.hierarchy = hierarchy;
|
|
88
|
-
this.bus.subscribe(
|
|
91
|
+
this.bus.subscribe(this.listener);
|
|
89
92
|
}
|
|
90
93
|
bus;
|
|
91
94
|
options;
|
|
92
95
|
hierarchy;
|
|
93
96
|
store = /* @__PURE__ */ new Map();
|
|
97
|
+
listener = (event) => this.onChange(event);
|
|
98
|
+
dispose() {
|
|
99
|
+
this.bus.unsubscribe(this.listener);
|
|
100
|
+
}
|
|
94
101
|
get(key, scope) {
|
|
95
102
|
if (this.options.enabled === false) return void 0;
|
|
96
103
|
const cacheKey = this.keyFor(key, scope);
|
|
@@ -364,7 +371,9 @@ var MemoryStorageAdapter = class {
|
|
|
364
371
|
) ?? null,
|
|
365
372
|
closeValue: async (id) => {
|
|
366
373
|
const row = this.values.find((v) => v.id === id);
|
|
367
|
-
if (row)
|
|
374
|
+
if (!row) return;
|
|
375
|
+
const closed = { ...row, validTo: /* @__PURE__ */ new Date() };
|
|
376
|
+
this.values = this.values.map((v) => v === row ? closed : v);
|
|
368
377
|
},
|
|
369
378
|
createValue: async (input) => {
|
|
370
379
|
const record = {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/types.ts","../src/core/errors.ts","../src/cache/change-bus.ts","../src/cache/cache.ts","../src/hierarchy/scope-hierarchy.ts","../src/storage/memory-storage.ts","../src/engine/resolver.ts","../src/engine/writer.ts","../src/engine/auditor.ts","../src/engine/hierarchy-cache-sync.ts","../src/engine/engine.ts","../src/typed/typed-resolver.ts","../src/typed/typed-writer.ts","../src/typed/typed-auditor.ts","../src/typed/typed-engine.ts"],"sourcesContent":["export type JsonValue =\n\t| null\n\t| boolean\n\t| number\n\t| string\n\t| JsonValue[]\n\t| { [key: string]: JsonValue };\n\nexport type Value = Date | JsonValue;\n\nexport interface Scope {\n\tkind: string;\n\trefId: string | null;\n}\n\nexport const DEFAULT_SCOPE: Scope = { kind: 'default', refId: null };\n\nexport type ValueType =\n\t'BOOLEAN' | 'NUMERIC' | 'TEXT' | 'ENUM' | 'JSON' | 'DATE';\n\nexport type Inherit = 'LOCKED' | 'INHERITABLE_OVERRIDABLE' | 'INDEPENDENT';\n\nexport type Status = 'DRAFT' | 'STABLE' | 'DEPRECATED' | 'RETIRED';\n\nexport interface DefRecord {\n\tid: string;\n\tkey: string;\n\tversion: number;\n\tlabel: string;\n\tdescription: string | null;\n\ttype: ValueType;\n\toptions: string[];\n\tmin: number | null;\n\tmax: number | null;\n\tscopes: string[];\n\tinherit: Inherit;\n\trequired: boolean;\n\tsecret: boolean;\n\tstatus: Status;\n\tcategory: string | null;\n}\n\nexport interface ValueRecord {\n\tid: string;\n\tdefinitionId: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n\tbool: boolean | null;\n\tnum: number | null;\n\ttext: string | null;\n\tjson: unknown;\n\tjsonSet: boolean;\n\tdate: Date | null;\n\tversion: number;\n}\n\nexport interface ScopeHierarchy {\n\tchain(scopeRefId: string): Promise<string[]>;\n\tdescendants(scopeRefId: string): Promise<string[]>;\n\tchildren(scopeRefId: string): Promise<string[]>;\n\tparent(scopeRefId: string): Promise<string | null>;\n\tattach(id: string, parentId: string | null): Promise<void>;\n\tmove(id: string, newParentId: string | null): Promise<void>;\n\tdetach(id: string): Promise<void>;\n}\n","export type ErrorCode =\n\t| 'NOT_FOUND'\n\t| 'SCOPE'\n\t| 'REQUIRED'\n\t| 'VALUE'\n\t| 'CONFLICT'\n\t| 'CORRUPT'\n\t| 'CYCLE';\n\nexport class ConfTreeError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: ErrorCode,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = new.target.name;\n\t\tError.captureStackTrace?.(this, new.target);\n\t}\n}\n\nexport class NotFoundError extends ConfTreeError {\n\tconstructor(key: string) {\n\t\tsuper(`Unknown setting definition: \"${key}\"`, 'NOT_FOUND');\n\t}\n}\n\nexport class ScopeError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string) {\n\t\tsuper(\n\t\t\t`Setting \"${key}\" cannot be set or read at scope kind \"${scopeKind}\"`,\n\t\t\t'SCOPE',\n\t\t);\n\t}\n}\n\nexport class RequiredError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string, scopeRefId: string | null) {\n\t\tsuper(\n\t\t\t`Required setting \"${key}\" has no resolvable value for scope ${scopeKind}:${scopeRefId ?? 'null'} ` +\n\t\t\t\t`and no default is defined`,\n\t\t\t'REQUIRED',\n\t\t);\n\t}\n}\n\nexport class ValueError extends ConfTreeError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALUE');\n\t}\n}\n\nexport class ConflictError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string, scopeRefId: string | null) {\n\t\tsuper(\n\t\t\t`Setting \"${key}\" at scope ${scopeKind}:${scopeRefId ?? 'null'} was modified concurrently. ` +\n\t\t\t\t`Reload the current value and retry.`,\n\t\t\t'CONFLICT',\n\t\t);\n\t}\n}\n\nexport class CorruptError extends ConfTreeError {\n\tconstructor(valueId: string) {\n\t\tsuper(\n\t\t\t`setting value row ${valueId} has no typed value set: data corruption`,\n\t\t\t'CORRUPT',\n\t\t);\n\t}\n}\n\nexport class CycleError extends ConfTreeError {\n\tconstructor(id: string, newParentId: string) {\n\t\tsuper(\n\t\t\t`Cannot attach/move scope \"${id}\" under \"${newParentId}\": would create a cycle`,\n\t\t\t'CYCLE',\n\t\t);\n\t}\n}\n","export interface ChangeEvent {\n\tdefinitionId: string;\n\tkey: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n}\n\nexport interface ChangeBus {\n\tpublish(event: ChangeEvent): Promise<void>;\n\tsubscribe(listener: (event: ChangeEvent) => void | Promise<void>): void;\n}\n\nexport class LocalBus implements ChangeBus {\n\tprivate readonly listeners = new Set<\n\t\t(event: ChangeEvent) => void | Promise<void>\n\t>();\n\n\tasync publish(event: ChangeEvent): Promise<void> {\n\t\tawait Promise.all(\n\t\t\t[...this.listeners].map((listener) =>\n\t\t\t\tPromise.resolve(listener(event)),\n\t\t\t),\n\t\t);\n\t}\n\n\tsubscribe(listener: (event: ChangeEvent) => void | Promise<void>): void {\n\t\tthis.listeners.add(listener);\n\t}\n}\n","import type { Scope, ScopeHierarchy, Value } from '../core/types';\nimport type { ChangeBus, ChangeEvent } from './change-bus';\n\nexport interface CacheOptions {\n\tenabled?: boolean;\n\tttlMs?: number;\n\tmaxEntries?: number;\n}\n\ninterface Entry {\n\tkey: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n\tvalue: Value;\n\texpiresAt: number;\n}\n\nconst DEFAULT_TTL_MS = 30_000;\nconst DEFAULT_MAX_ENTRIES = 50_000;\n\nexport class Cache {\n\tprivate readonly store = new Map<string, Entry>();\n\n\tconstructor(\n\t\tprivate readonly bus: ChangeBus,\n\t\tprivate readonly options: CacheOptions = {},\n\t\tprivate readonly hierarchy?: ScopeHierarchy,\n\t) {\n\t\tthis.bus.subscribe((event) => this.onChange(event));\n\t}\n\n\tget(key: string, scope: Scope): Value | undefined {\n\t\tif (this.options.enabled === false) return undefined;\n\t\tconst cacheKey = this.keyFor(key, scope);\n\t\tconst entry = this.store.get(cacheKey);\n\t\tif (!entry) return undefined;\n\t\tif (entry.expiresAt <= Date.now()) {\n\t\t\tthis.store.delete(cacheKey);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn entry.value;\n\t}\n\n\tset(key: string, scope: Scope, value: Value): void {\n\t\tif (this.options.enabled === false) return;\n\t\tconst cacheKey = this.keyFor(key, scope);\n\t\tif (\n\t\t\t!this.store.has(cacheKey) &&\n\t\t\tthis.store.size >= (this.options.maxEntries ?? DEFAULT_MAX_ENTRIES)\n\t\t) {\n\t\t\tconst oldest = this.store.keys().next().value;\n\t\t\tif (oldest !== undefined) this.store.delete(oldest);\n\t\t}\n\t\tconst ttlMs = this.options.ttlMs ?? DEFAULT_TTL_MS;\n\t\tthis.store.set(cacheKey, {\n\t\t\tkey,\n\t\t\tscopeKind: scope.kind,\n\t\t\tscopeRefId: scope.refId,\n\t\t\tvalue,\n\t\t\texpiresAt: Date.now() + ttlMs,\n\t\t});\n\t}\n\n\tdrop(key: string): void {\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (entry.key === key) this.store.delete(cacheKey);\n\t\t}\n\t}\n\n\tdropAll(): void {\n\t\tthis.store.clear();\n\t}\n\n\tdropForScopes(scopeRefIds: Iterable<string>): void {\n\t\tconst targets = new Set(scopeRefIds);\n\t\tif (targets.size === 0) return;\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (entry.scopeRefId !== null && targets.has(entry.scopeRefId)) {\n\t\t\t\tthis.store.delete(cacheKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate dropScoped(key: string, scopeRefIds: Iterable<string>): void {\n\t\tconst targets = new Set(scopeRefIds);\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (\n\t\t\t\tentry.key === key &&\n\t\t\t\tentry.scopeRefId !== null &&\n\t\t\t\ttargets.has(entry.scopeRefId)\n\t\t\t) {\n\t\t\t\tthis.store.delete(cacheKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async onChange(event: ChangeEvent): Promise<void> {\n\t\tif (this.hierarchy && event.scopeRefId !== null) {\n\t\t\tconst descendants = await this.hierarchy\n\t\t\t\t.descendants(event.scopeRefId)\n\t\t\t\t.catch(() => null);\n\t\t\tif (descendants !== null) {\n\t\t\t\tthis.dropScoped(event.key, descendants);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.drop(event.key);\n\t}\n\n\tprivate keyFor(key: string, scope: Scope): string {\n\t\treturn JSON.stringify([key, scope.kind, scope.refId]);\n\t}\n}\n","import { CycleError } from '../core/errors';\nimport type { ScopeHierarchy } from '../core/types';\n\nexport class LocalScopeHierarchy implements ScopeHierarchy {\n\tprivate readonly parentOf = new Map<string, string | null>();\n\tprivate readonly childrenOf = new Map<string, Set<string>>();\n\n\tasync chain(id: string): Promise<string[]> {\n\t\tconst result: string[] = [];\n\t\tconst seen = new Set<string>();\n\t\tlet current: string | null = id;\n\t\twhile (current !== null) {\n\t\t\tif (seen.has(current)) break;\n\t\t\tseen.add(current);\n\t\t\tresult.push(current);\n\t\t\tcurrent = this.parentOf.get(current) ?? null;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync descendants(id: string): Promise<string[]> {\n\t\tconst result: string[] = [];\n\t\tconst stack = [id];\n\t\tconst seen = new Set<string>();\n\t\twhile (stack.length > 0) {\n\t\t\tconst current = stack.pop()!;\n\t\t\tif (seen.has(current)) continue;\n\t\t\tseen.add(current);\n\t\t\tresult.push(current);\n\t\t\tconst kids = this.childrenOf.get(current);\n\t\t\tif (kids) stack.push(...kids);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync children(id: string): Promise<string[]> {\n\t\treturn [...(this.childrenOf.get(id) ?? [])];\n\t}\n\n\tasync parent(id: string): Promise<string | null> {\n\t\treturn this.parentOf.get(id) ?? null;\n\t}\n\n\tasync attach(id: string, parentId: string | null): Promise<void> {\n\t\tif (parentId !== null) await this.assertNoCycle(id, parentId);\n\t\tconst oldParent = this.parentOf.get(id) ?? null;\n\t\tif (oldParent !== null) this.childrenOf.get(oldParent)?.delete(id);\n\t\tthis.parentOf.set(id, parentId);\n\t\tif (parentId !== null) this.addChild(parentId, id);\n\t\tif (!this.childrenOf.has(id)) this.childrenOf.set(id, new Set());\n\t}\n\n\tasync move(id: string, newParentId: string | null): Promise<void> {\n\t\tif (newParentId !== null) await this.assertNoCycle(id, newParentId);\n\t\tconst oldParent = this.parentOf.get(id) ?? null;\n\t\tif (oldParent !== null) this.childrenOf.get(oldParent)?.delete(id);\n\t\tthis.parentOf.set(id, newParentId);\n\t\tif (newParentId !== null) this.addChild(newParentId, id);\n\t}\n\n\tasync detach(id: string): Promise<void> {\n\t\tconst parentId = this.parentOf.get(id) ?? null;\n\t\tconst kids = [...(this.childrenOf.get(id) ?? [])];\n\t\tfor (const kid of kids) {\n\t\t\tawait this.move(kid, parentId);\n\t\t}\n\t\tif (parentId !== null) this.childrenOf.get(parentId)?.delete(id);\n\t\tthis.parentOf.delete(id);\n\t\tthis.childrenOf.delete(id);\n\t}\n\n\tprivate addChild(parentId: string, id: string): void {\n\t\tif (!this.childrenOf.has(parentId))\n\t\t\tthis.childrenOf.set(parentId, new Set());\n\t\tthis.childrenOf.get(parentId)!.add(id);\n\t}\n\n\tprivate async assertNoCycle(\n\t\tid: string,\n\t\tnewParentId: string,\n\t): Promise<void> {\n\t\tif (\n\t\t\tid === newParentId ||\n\t\t\t(await this.chain(newParentId)).includes(id)\n\t\t) {\n\t\t\tthrow new CycleError(id, newParentId);\n\t\t}\n\t}\n}\n","import type {\n\tAuditRecord,\n\tCreateAuditInput,\n\tCreateDefInput,\n\tCreateValueInput,\n\tFindAuditQuery,\n\tFindChainQuery,\n\tFindValuesQuery,\n\tListValuesQuery,\n\tListValuesResult,\n\tStorageAdapter,\n\tStorageTx,\n} from './storage-port';\nimport type {\n\tDefRecord,\n\tStatus,\n\tValue,\n\tValueRecord,\n\tValueType,\n} from '../core/types';\nimport { NotFoundError } from '../core/errors';\n\ninterface StoredValue extends ValueRecord {\n\tvalidFrom: Date;\n\tvalidTo: Date | null;\n}\n\nfunction toTypedColumns(type: ValueType, value: Value) {\n\treturn {\n\t\tbool: type === 'BOOLEAN' ? (value as boolean) : null,\n\t\tnum: type === 'NUMERIC' ? (value as number) : null,\n\t\ttext: type === 'TEXT' || type === 'ENUM' ? (value as string) : null,\n\t\tjson: type === 'JSON' ? value : null,\n\t\tjsonSet: type === 'JSON',\n\t\tdate: type === 'DATE' ? (value as Date) : null,\n\t};\n}\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n\tprivate defs: DefRecord[] = [];\n\tprivate values: StoredValue[] = [];\n\tprivate auditLog: AuditRecord[] = [];\n\tprivate nextId = 1;\n\tprivate txQueue: Promise<unknown> = Promise.resolve();\n\n\tprivate newId(prefix: string): string {\n\t\treturn `${prefix}-${this.nextId++}`;\n\t}\n\n\tasync findDefs(keys: string[]): Promise<DefRecord[]> {\n\t\tconst result: DefRecord[] = [];\n\t\tfor (const key of keys) {\n\t\t\tconst found = this.latestByStatus(key, ['STABLE', 'DEPRECATED']);\n\t\t\tif (found) result.push(found);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync findValues(query: FindValuesQuery): Promise<ValueRecord[]> {\n\t\tconst asOf = query.asOf ?? new Date();\n\t\tconst ids = new Set(query.definitionIds);\n\t\treturn this.values.filter(\n\t\t\t(v) =>\n\t\t\t\tids.has(v.definitionId) &&\n\t\t\t\tv.scopeKind === query.scopeKind &&\n\t\t\t\tv.scopeRefId === query.scopeRefId &&\n\t\t\t\tv.validFrom <= asOf &&\n\t\t\t\t(v.validTo === null || v.validTo > asOf),\n\t\t);\n\t}\n\n\tasync findChainValues(query: FindChainQuery): Promise<ValueRecord[]> {\n\t\tconst asOf = query.asOf ?? new Date();\n\t\tconst defIds = new Set(query.definitionIds);\n\t\tconst refIds = new Set(query.chain);\n\t\treturn this.values.filter(\n\t\t\t(v) =>\n\t\t\t\tdefIds.has(v.definitionId) &&\n\t\t\t\tv.scopeRefId !== null &&\n\t\t\t\trefIds.has(v.scopeRefId) &&\n\t\t\t\tv.validFrom <= asOf &&\n\t\t\t\t(v.validTo === null || v.validTo > asOf),\n\t\t);\n\t}\n\n\tasync findDefsByIds(ids: string[]): Promise<DefRecord[]> {\n\t\tconst idSet = new Set(ids);\n\t\treturn this.defs.filter((d) => idSet.has(d.id));\n\t}\n\n\tasync findAnyDef(key: string): Promise<DefRecord | null> {\n\t\treturn this.latestVersion(key) ?? null;\n\t}\n\n\tasync listValues(query: ListValuesQuery): Promise<ListValuesResult> {\n\t\tconst now = new Date();\n\t\tconst active = this.values\n\t\t\t.filter(\n\t\t\t\t(v) =>\n\t\t\t\t\tv.scopeKind === query.scopeKind &&\n\t\t\t\t\tv.scopeRefId === query.scopeRefId &&\n\t\t\t\t\tv.validFrom <= now &&\n\t\t\t\t\t(v.validTo === null || v.validTo > now),\n\t\t\t)\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id));\n\n\t\tconst startIndex = query.cursor\n\t\t\t? active.findIndex((v) => v.id === query.cursor) + 1\n\t\t\t: 0;\n\t\tconst limit = query.limit ?? active.length - startIndex;\n\t\tconst page = active.slice(startIndex, startIndex + limit);\n\t\tconst nextCursor =\n\t\t\tstartIndex + page.length < active.length\n\t\t\t\t? (page[page.length - 1]?.id ?? null)\n\t\t\t\t: null;\n\n\t\treturn { values: page, nextCursor };\n\t}\n\n\tasync findAudit(query: FindAuditQuery): Promise<AuditRecord[]> {\n\t\treturn this.auditLog\n\t\t\t.filter(\n\t\t\t\t(a) =>\n\t\t\t\t\ta.definitionId === query.definitionId &&\n\t\t\t\t\t(query.scopeKind === undefined ||\n\t\t\t\t\t\ta.scopeKind === query.scopeKind) &&\n\t\t\t\t\t(query.scopeRefId === undefined ||\n\t\t\t\t\t\ta.scopeRefId === query.scopeRefId),\n\t\t\t)\n\t\t\t.sort((a, b) => a.at.getTime() - b.at.getTime());\n\t}\n\n\tasync createDef(input: CreateDefInput): Promise<DefRecord> {\n\t\tconst existingVersions = this.defs.filter((d) => d.key === input.key);\n\t\tconst version =\n\t\t\texistingVersions.length > 0\n\t\t\t\t? Math.max(...existingVersions.map((d) => d.version)) + 1\n\t\t\t\t: 1;\n\t\tconst record: DefRecord = {\n\t\t\tid: this.newId('def'),\n\t\t\tkey: input.key,\n\t\t\tversion,\n\t\t\tlabel: input.label,\n\t\t\tdescription: input.description ?? null,\n\t\t\ttype: input.type,\n\t\t\toptions: input.options ?? [],\n\t\t\tmin: input.min ?? null,\n\t\t\tmax: input.max ?? null,\n\t\t\tscopes: input.scopes,\n\t\t\tinherit: input.inherit,\n\t\t\trequired: input.required,\n\t\t\tsecret: input.secret ?? false,\n\t\t\tstatus: input.status ?? 'DRAFT',\n\t\t\tcategory: input.category ?? null,\n\t\t};\n\t\tthis.defs.push(record);\n\t\treturn record;\n\t}\n\n\tasync updateDefStatus(key: string, status: Status): Promise<DefRecord> {\n\t\tconst current = this.latestVersion(key);\n\t\tif (!current) throw new NotFoundError(key);\n\n\t\tconst updated: DefRecord = { ...current, status };\n\t\tthis.defs = this.defs.map((d) => (d === current ? updated : d));\n\t\treturn updated;\n\t}\n\n\tasync listDefs(status?: Status): Promise<DefRecord[]> {\n\t\tconst rows = status\n\t\t\t? this.defs.filter((d) => d.status === status)\n\t\t\t: this.defs;\n\t\treturn [...rows].sort(\n\t\t\t(a, b) =>\n\t\t\t\t(a.category ?? '').localeCompare(b.category ?? '') ||\n\t\t\t\ta.key.localeCompare(b.key),\n\t\t);\n\t}\n\n\tasync transact<T>(fn: (tx: StorageTx) => Promise<T>): Promise<T> {\n\t\tconst run = this.txQueue.then(async () => {\n\t\t\tconst valuesSnapshot = structuredClone(this.values);\n\t\t\tconst auditLogSnapshot = structuredClone(this.auditLog);\n\t\t\ttry {\n\t\t\t\treturn await fn(this.tx());\n\t\t\t} catch (err) {\n\t\t\t\tthis.values = valuesSnapshot;\n\t\t\t\tthis.auditLog = auditLogSnapshot;\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t});\n\t\tthis.txQueue = run.catch(() => {});\n\t\treturn run;\n\t}\n\n\tprivate latestByStatus(\n\t\tkey: string,\n\t\tstatuses: Status[],\n\t): DefRecord | undefined {\n\t\tconst latest = this.latestVersion(key);\n\t\treturn latest && statuses.includes(latest.status) ? latest : undefined;\n\t}\n\n\tprivate latestVersion(key: string): DefRecord | undefined {\n\t\treturn this.defs\n\t\t\t.filter((d) => d.key === key)\n\t\t\t.sort((a, b) => b.version - a.version)[0];\n\t}\n\n\tprivate tx(): StorageTx {\n\t\treturn {\n\t\t\tfindDef: async (key: string) =>\n\t\t\t\tthis.latestByStatus(key, ['STABLE']) ?? null,\n\n\t\t\tfindValue: async (definitionId, scopeKind, scopeRefId) =>\n\t\t\t\tthis.values.find(\n\t\t\t\t\t(v) =>\n\t\t\t\t\t\tv.definitionId === definitionId &&\n\t\t\t\t\t\tv.scopeKind === scopeKind &&\n\t\t\t\t\t\tv.scopeRefId === scopeRefId &&\n\t\t\t\t\t\tv.validTo === null,\n\t\t\t\t) ?? null,\n\n\t\t\tcloseValue: async (id: string) => {\n\t\t\t\tconst row = this.values.find((v) => v.id === id);\n\t\t\t\tif (row) row.validTo = new Date();\n\t\t\t},\n\n\t\t\tcreateValue: async (input: CreateValueInput) => {\n\t\t\t\tconst record: StoredValue = {\n\t\t\t\t\tid: this.newId('val'),\n\t\t\t\t\tdefinitionId: input.definitionId,\n\t\t\t\t\tscopeKind: input.scopeKind,\n\t\t\t\t\tscopeRefId: input.scopeRefId,\n\t\t\t\t\tversion: input.version,\n\t\t\t\t\tvalidFrom: new Date(),\n\t\t\t\t\tvalidTo: null,\n\t\t\t\t\t...toTypedColumns(input.type, input.value),\n\t\t\t\t};\n\t\t\t\tthis.values.push(record);\n\t\t\t\treturn record;\n\t\t\t},\n\n\t\t\tcreateAudit: async (input: CreateAuditInput): Promise<void> => {\n\t\t\t\tthis.auditLog.push({\n\t\t\t\t\t...input,\n\t\t\t\t\tid: this.newId('audit'),\n\t\t\t\t\tat: new Date(),\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n}\n","import type {\n\tDefRecord,\n\tScope,\n\tScopeHierarchy,\n\tValue,\n\tValueRecord,\n} from '../core/types';\nimport { DEFAULT_SCOPE } from '../core/types';\nimport {\n\tCorruptError,\n\tRequiredError,\n\tScopeError,\n\tNotFoundError,\n} from '../core/errors';\nimport type { StorageReader } from '../storage/storage-port';\nimport type { Cache } from '../cache/cache';\n\nexport interface ListAtPage {\n\tentries: Record<string, Value>;\n\tnextCursor: string | null;\n}\n\nexport class Resolver {\n\tconstructor(\n\t\tprivate readonly storage: StorageReader,\n\t\tprivate readonly hierarchy?: ScopeHierarchy,\n\t\tprivate readonly cache?: Cache,\n\t) {}\n\n\tasync get(key: string, scope: Scope, asOf?: Date): Promise<Value> {\n\t\tconst result = await this.getMany([key], scope, asOf);\n\t\treturn result[key];\n\t}\n\n\tasync listAt(\n\t\tscope: Scope,\n\t\topts: { limit?: number; cursor?: string } = {},\n\t): Promise<ListAtPage> {\n\t\tconst { values, nextCursor } = await this.storage.listValues({\n\t\t\tscopeKind: scope.kind,\n\t\t\tscopeRefId: scope.refId,\n\t\t\tlimit: opts.limit,\n\t\t\tcursor: opts.cursor,\n\t\t});\n\t\tif (values.length === 0) return { entries: {}, nextCursor };\n\n\t\tconst defs = await this.storage.findDefsByIds([\n\t\t\t...new Set(values.map((v) => v.definitionId)),\n\t\t]);\n\t\tconst defById = new Map(defs.map((d) => [d.id, d]));\n\n\t\tconst entries: Record<string, Value> = {};\n\t\tfor (const row of values) {\n\t\t\tconst def = defById.get(row.definitionId);\n\t\t\tif (!def) continue;\n\t\t\tentries[def.key] = this.unwrap(def, row);\n\t\t}\n\t\treturn { entries, nextCursor };\n\t}\n\n\tasync getMany(\n\t\tkeys: string[],\n\t\tscope: Scope,\n\t\tasOf?: Date,\n\t): Promise<Record<string, Value>> {\n\t\tconst uniqueKeys = [...new Set(keys)];\n\t\tconst result: Record<string, Value> = {};\n\t\tconst uncached: string[] = [];\n\n\t\tif (asOf === undefined) {\n\t\t\tfor (const key of uniqueKeys) {\n\t\t\t\tconst cached = this.cache?.get(key, scope);\n\t\t\t\tif (cached !== undefined) result[key] = cached;\n\t\t\t\telse uncached.push(key);\n\t\t\t}\n\t\t} else {\n\t\t\tuncached.push(...uniqueKeys);\n\t\t}\n\t\tif (uncached.length === 0) return result;\n\n\t\tconst defByKey = await this.getDefs(uncached);\n\t\tfor (const key of uncached) {\n\t\t\tthis.checkScope(defByKey.get(key)!, scope);\n\t\t}\n\n\t\tconst exactDefs: DefRecord[] = [];\n\t\tconst chainDefs: DefRecord[] = [];\n\t\tfor (const key of uncached) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tconst climbsHierarchy =\n\t\t\t\tdef.inherit !== 'INDEPENDENT' &&\n\t\t\t\tscope.refId !== null &&\n\t\t\t\tthis.hierarchy;\n\t\t\t(climbsHierarchy ? chainDefs : exactDefs).push(def);\n\t\t}\n\n\t\tconst chain =\n\t\t\tchainDefs.length > 0 && scope.refId !== null && this.hierarchy\n\t\t\t\t? await this.hierarchy.chain(scope.refId)\n\t\t\t\t: [];\n\n\t\tconst [exactRows, chainRows] = await Promise.all([\n\t\t\texactDefs.length > 0\n\t\t\t\t? this.storage.findValues({\n\t\t\t\t\t\tdefinitionIds: exactDefs.map((d) => d.id),\n\t\t\t\t\t\tscopeKind: scope.kind,\n\t\t\t\t\t\tscopeRefId: scope.refId,\n\t\t\t\t\t\tasOf,\n\t\t\t\t\t})\n\t\t\t\t: Promise.resolve([] as ValueRecord[]),\n\t\t\tchainDefs.length > 0 && chain.length > 0\n\t\t\t\t? this.storage.findChainValues({\n\t\t\t\t\t\tdefinitionIds: chainDefs.map((d) => d.id),\n\t\t\t\t\t\tchain,\n\t\t\t\t\t\tasOf,\n\t\t\t\t\t})\n\t\t\t\t: Promise.resolve([] as ValueRecord[]),\n\t\t]);\n\n\t\tconst exactByDef = new Map(exactRows.map((r) => [r.definitionId, r]));\n\t\tconst chainByDef = new Map<string, ValueRecord[]>();\n\t\tfor (const row of chainRows) {\n\t\t\tconst list = chainByDef.get(row.definitionId) ?? [];\n\t\t\tlist.push(row);\n\t\t\tchainByDef.set(row.definitionId, list);\n\t\t}\n\t\tconst chainDefIds = new Set(chainDefs.map((d) => d.id));\n\n\t\tconst missing: DefRecord[] = [];\n\t\tfor (const key of uncached) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tlet row: ValueRecord | undefined;\n\t\t\tif (chainDefIds.has(def.id)) {\n\t\t\t\tconst byRef = new Map(\n\t\t\t\t\t(chainByDef.get(def.id) ?? []).map((v) => [\n\t\t\t\t\t\tv.scopeRefId,\n\t\t\t\t\t\tv,\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tfor (const ref of chain) {\n\t\t\t\t\trow = byRef.get(ref);\n\t\t\t\t\tif (row) break;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trow = exactByDef.get(def.id);\n\t\t\t}\n\t\t\tif (row) {\n\t\t\t\tresult[key] = this.unwrap(def, row);\n\t\t\t\tif (asOf === undefined)\n\t\t\t\t\tthis.cache?.set(key, scope, result[key]);\n\t\t\t} else {\n\t\t\t\tmissing.push(def);\n\t\t\t}\n\t\t}\n\n\t\tif (missing.length > 0)\n\t\t\tawait this.resolveMissing(\n\t\t\t\tmissing,\n\t\t\t\tscope,\n\t\t\t\tuncached,\n\t\t\t\tdefByKey,\n\t\t\t\tresult,\n\t\t\t\tasOf,\n\t\t\t);\n\n\t\treturn result;\n\t}\n\n\tprivate async resolveMissing(\n\t\tmissing: DefRecord[],\n\t\tscope: Scope,\n\t\tkeysInOrder: string[],\n\t\tdefByKey: Map<string, DefRecord>,\n\t\tresult: Record<string, Value>,\n\t\tasOf?: Date,\n\t): Promise<void> {\n\t\tconst defaultRows = await this.storage.findValues({\n\t\t\tdefinitionIds: missing.map((d) => d.id),\n\t\t\tscopeKind: DEFAULT_SCOPE.kind,\n\t\t\tscopeRefId: DEFAULT_SCOPE.refId,\n\t\t\tasOf,\n\t\t});\n\t\tconst defaultByDef = new Map(\n\t\t\tdefaultRows.map((r) => [r.definitionId, r]),\n\t\t);\n\t\tconst missingIds = new Set(missing.map((d) => d.id));\n\n\t\tfor (const key of keysInOrder) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tif (!missingIds.has(def.id)) continue;\n\t\t\tconst row = defaultByDef.get(def.id);\n\t\t\tif (!row) {\n\t\t\t\tthrow new RequiredError(def.key, scope.kind, scope.refId);\n\t\t\t}\n\t\t\tresult[key] = this.unwrap(def, row);\n\t\t\tif (asOf === undefined) this.cache?.set(key, scope, result[key]);\n\t\t}\n\t}\n\n\tprivate async getDefs(keys: string[]): Promise<Map<string, DefRecord>> {\n\t\tconst defs = await this.storage.findDefs(keys);\n\t\tconst byKey = new Map(defs.map((d) => [d.key, d]));\n\t\tfor (const key of keys) {\n\t\t\tif (!byKey.has(key)) throw new NotFoundError(key);\n\t\t}\n\t\treturn byKey;\n\t}\n\n\tprivate checkScope(def: DefRecord, scope: Scope): void {\n\t\tif (scope.kind === 'default') return;\n\t\tif (!def.scopes.includes(scope.kind)) {\n\t\t\tthrow new ScopeError(def.key, scope.kind);\n\t\t}\n\t}\n\n\tprivate unwrap(def: DefRecord, row: ValueRecord): Value {\n\t\tswitch (def.type) {\n\t\t\tcase 'BOOLEAN':\n\t\t\t\tif (row.bool === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.bool;\n\t\t\tcase 'NUMERIC':\n\t\t\t\tif (row.num === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.num;\n\t\t\tcase 'TEXT':\n\t\t\tcase 'ENUM':\n\t\t\t\tif (row.text === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.text;\n\t\t\tcase 'JSON':\n\t\t\t\tif (!row.jsonSet) throw new CorruptError(row.id);\n\t\t\t\treturn row.json as Value;\n\t\t\tcase 'DATE':\n\t\t\t\tif (row.date === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.date;\n\t\t}\n\t}\n}\n","import type { DefRecord, Scope, Value, ValueRecord } from '../core/types';\nimport {\n\tConflictError,\n\tScopeError,\n\tValueError,\n\tNotFoundError,\n} from '../core/errors';\nimport type { StorageAdapter, StorageTx } from '../storage/storage-port';\nimport type { ChangeBus } from '../cache/change-bus';\n\nexport interface SetParams {\n\tkey: string;\n\tscope: Scope;\n\tvalue: Value;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport interface UnsetParams {\n\tkey: string;\n\tscope: Scope;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nconst REDACTED = '[redacted]';\n\nexport class Writer {\n\tconstructor(\n\t\tprivate readonly storage: StorageAdapter,\n\t\tprivate readonly bus?: ChangeBus,\n\t) {}\n\n\tasync set(params: SetParams): Promise<ValueRecord> {\n\t\tconst created = await this.storage.transact((tx) =>\n\t\t\tthis.setInTx(tx, params),\n\t\t);\n\t\tawait this.emit(created, params.key);\n\t\treturn created;\n\t}\n\n\tasync setMany(paramsList: SetParams[]): Promise<ValueRecord[]> {\n\t\tconst created = await this.storage.transact(async (tx) => {\n\t\t\tconst results: ValueRecord[] = [];\n\t\t\tfor (const params of paramsList) {\n\t\t\t\tresults.push(await this.setInTx(tx, params));\n\t\t\t}\n\t\t\treturn results;\n\t\t});\n\t\tawait Promise.all(\n\t\t\tcreated.map((row, i) => this.emit(row, paramsList[i].key)),\n\t\t);\n\t\treturn created;\n\t}\n\n\tprivate async setInTx(\n\t\ttx: StorageTx,\n\t\tparams: SetParams,\n\t): Promise<ValueRecord> {\n\t\tconst def = await tx.findDef(params.key);\n\t\tif (!def) throw new NotFoundError(params.key);\n\n\t\tif (\n\t\t\tparams.scope.kind !== 'default' &&\n\t\t\t!def.scopes.includes(params.scope.kind)\n\t\t) {\n\t\t\tthrow new ScopeError(def.key, params.scope.kind);\n\t\t}\n\n\t\tthis.validate(def, params.value);\n\n\t\tconst current = await tx.findValue(\n\t\t\tdef.id,\n\t\t\tparams.scope.kind,\n\t\t\tparams.scope.refId,\n\t\t);\n\n\t\tconst currentVersion = current?.version ?? 0;\n\t\tconst expected = params.expectedVersion ?? 0;\n\t\tif (currentVersion !== expected) {\n\t\t\tthrow new ConflictError(\n\t\t\t\tdef.key,\n\t\t\t\tparams.scope.kind,\n\t\t\t\tparams.scope.refId,\n\t\t\t);\n\t\t}\n\n\t\tif (current) {\n\t\t\tawait tx.closeValue(current.id);\n\t\t}\n\n\t\tconst created = await tx.createValue({\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: params.scope.kind,\n\t\t\tscopeRefId: params.scope.refId,\n\t\t\tversion: currentVersion + 1,\n\t\t\tauthorId: params.authorId,\n\t\t\treason: params.reason,\n\t\t\ttype: def.type,\n\t\t\tvalue: params.value,\n\t\t});\n\n\t\tawait tx.createAudit({\n\t\t\tvalueId: created.id,\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: created.scopeKind,\n\t\t\tscopeRefId: created.scopeRefId,\n\t\t\taction: current ? 'superseded' : 'created',\n\t\t\tauthorId: params.authorId,\n\t\t\tbefore: current ? this.snapshotOf(def, current) : undefined,\n\t\t\tafter: this.snapshotOf(def, created),\n\t\t\treason: params.reason,\n\t\t});\n\n\t\treturn created;\n\t}\n\n\tasync unset(params: UnsetParams): Promise<void> {\n\t\tconst closed = await this.storage.transact((tx) =>\n\t\t\tthis.unsetInTx(tx, params),\n\t\t);\n\t\tif (closed) await this.emit(closed, params.key);\n\t}\n\n\tprivate async unsetInTx(\n\t\ttx: StorageTx,\n\t\tparams: UnsetParams,\n\t): Promise<ValueRecord | null> {\n\t\tconst def = await tx.findDef(params.key);\n\t\tif (!def) throw new NotFoundError(params.key);\n\n\t\tif (\n\t\t\tparams.scope.kind !== 'default' &&\n\t\t\t!def.scopes.includes(params.scope.kind)\n\t\t) {\n\t\t\tthrow new ScopeError(def.key, params.scope.kind);\n\t\t}\n\n\t\tconst current = await tx.findValue(\n\t\t\tdef.id,\n\t\t\tparams.scope.kind,\n\t\t\tparams.scope.refId,\n\t\t);\n\n\t\tconst currentVersion = current?.version ?? 0;\n\t\tconst expected = params.expectedVersion ?? 0;\n\t\tif (currentVersion !== expected) {\n\t\t\tthrow new ConflictError(\n\t\t\t\tdef.key,\n\t\t\t\tparams.scope.kind,\n\t\t\t\tparams.scope.refId,\n\t\t\t);\n\t\t}\n\t\tif (!current) return null;\n\n\t\tawait tx.closeValue(current.id);\n\t\tawait tx.createAudit({\n\t\t\tvalueId: current.id,\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: current.scopeKind,\n\t\t\tscopeRefId: current.scopeRefId,\n\t\t\taction: 'unset',\n\t\t\tauthorId: params.authorId,\n\t\t\tbefore: this.snapshotOf(def, current),\n\t\t\treason: params.reason,\n\t\t});\n\n\t\treturn current;\n\t}\n\n\tprivate async emit(created: ValueRecord, key: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bus?.publish({\n\t\t\t\tdefinitionId: created.definitionId,\n\t\t\t\tkey,\n\t\t\t\tscopeKind: created.scopeKind,\n\t\t\t\tscopeRefId: created.scopeRefId,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('conftree: change bus publish failed', err);\n\t\t}\n\t}\n\n\tprivate validate(def: DefRecord, value: Value): void {\n\t\tswitch (def.type) {\n\t\t\tcase 'BOOLEAN':\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a boolean`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'NUMERIC': {\n\t\t\t\tif (typeof value !== 'number' || !Number.isFinite(value)) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a finite number`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (def.min !== null && value < def.min) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be >= ${def.min}, got ${value}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (def.max !== null && value > def.max) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be <= ${def.max}, got ${value}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'TEXT':\n\t\t\t\tif (typeof value !== 'string') {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a string`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ENUM':\n\t\t\t\tif (typeof value !== 'string' || !def.options.includes(value)) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be one of: ${def.options.join(', ')}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'JSON': {\n\t\t\t\tlet serialized: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = JSON.stringify(value);\n\t\t\t\t} catch {\n\t\t\t\t\tserialized = undefined;\n\t\t\t\t}\n\t\t\t\tif (serialized === undefined) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a JSON-serializable value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'DATE':\n\t\t\t\tif (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a valid Date`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate snapshotOf(def: DefRecord, row: ValueRecord) {\n\t\tif (def.secret) {\n\t\t\treturn {\n\t\t\t\tscopeKind: row.scopeKind,\n\t\t\t\tscopeRefId: row.scopeRefId,\n\t\t\t\tversion: row.version,\n\t\t\t\tvalue: REDACTED,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tscopeKind: row.scopeKind,\n\t\t\tscopeRefId: row.scopeRefId,\n\t\t\tversion: row.version,\n\t\t\tbool: row.bool,\n\t\t\tnum: row.num,\n\t\t\ttext: row.text,\n\t\t\tjson: row.jsonSet ? row.json : undefined,\n\t\t\tdate: row.date,\n\t\t};\n\t}\n}\n","import type { Scope } from '../core/types';\nimport { NotFoundError } from '../core/errors';\nimport type { AuditRecord, StorageReader } from '../storage/storage-port';\n\nexport class Auditor {\n\tconstructor(private readonly storage: StorageReader) {}\n\n\tasync history(key: string, scope?: Scope): Promise<AuditRecord[]> {\n\t\tconst def = await this.storage.findAnyDef(key);\n\t\tif (!def) throw new NotFoundError(key);\n\n\t\treturn this.storage.findAudit({\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: scope?.kind,\n\t\t\tscopeRefId: scope?.refId,\n\t\t});\n\t}\n}\n","import type { Cache } from '../cache/cache';\nimport type { ScopeHierarchy } from '../core/types';\n\nexport function withHierarchyInvalidation(\n\thierarchy: ScopeHierarchy,\n\tcache: Cache,\n): ScopeHierarchy {\n\treturn {\n\t\tchain: (id) => hierarchy.chain(id),\n\t\tdescendants: (id) => hierarchy.descendants(id),\n\t\tchildren: (id) => hierarchy.children(id),\n\t\tparent: (id) => hierarchy.parent(id),\n\t\tattach: async (id, parentId) => {\n\t\t\tawait hierarchy.attach(id, parentId);\n\t\t\tcache.dropForScopes(await hierarchy.descendants(id));\n\t\t},\n\t\tmove: async (id, newParentId) => {\n\t\t\tconst descendants = await hierarchy.descendants(id);\n\t\t\tawait hierarchy.move(id, newParentId);\n\t\t\tcache.dropForScopes(descendants);\n\t\t},\n\t\tdetach: async (id) => {\n\t\t\tconst descendants = await hierarchy.descendants(id);\n\t\t\tawait hierarchy.detach(id);\n\t\t\tcache.dropForScopes(descendants);\n\t\t},\n\t};\n}\n","import type { ChangeBus } from '../cache/change-bus';\nimport { LocalBus } from '../cache/change-bus';\nimport type { CacheOptions } from '../cache/cache';\nimport { Cache } from '../cache/cache';\nimport { withHierarchyInvalidation } from './hierarchy-cache-sync';\nimport { MemoryStorageAdapter } from '../storage/memory-storage';\nimport { Resolver } from './resolver';\nimport { LocalScopeHierarchy } from '../hierarchy/scope-hierarchy';\nimport type { StorageAdapter } from '../storage/storage-port';\nimport type { ScopeHierarchy } from '../core/types';\nimport { Writer } from './writer';\nimport { Auditor } from './auditor';\n\nexport interface EngineOptions {\n\tstorage?: StorageAdapter;\n\thierarchy?: ScopeHierarchy;\n\tbus?: ChangeBus;\n\tcache?: CacheOptions | false;\n}\n\nexport interface Engine {\n\tstorage: StorageAdapter;\n\thierarchy: ScopeHierarchy;\n\tbus: ChangeBus;\n\tcache: Cache;\n\tresolver: Resolver;\n\twriter: Writer;\n\tauditor: Auditor;\n}\n\nexport function createEngine(options: EngineOptions = {}): Engine {\n\tconst storage = options.storage ?? new MemoryStorageAdapter();\n\tconst rawHierarchy = options.hierarchy ?? new LocalScopeHierarchy();\n\tconst bus = options.bus ?? new LocalBus();\n\tconst cacheOptions =\n\t\toptions.cache === false ? { enabled: false } : (options.cache ?? {});\n\tconst cache = new Cache(bus, cacheOptions, rawHierarchy);\n\tconst hierarchy = withHierarchyInvalidation(rawHierarchy, cache);\n\tconst resolver = new Resolver(storage, hierarchy, cache);\n\tconst writer = new Writer(storage, bus);\n\tconst auditor = new Auditor(storage);\n\treturn { storage, hierarchy, bus, cache, resolver, writer, auditor };\n}\n","import type { Scope } from '../core/types';\nimport type { Resolver } from '../engine/resolver';\nimport type { SettingScopeKind, SettingValue } from './registry';\n\nexport class TypedResolver<Registry> {\n\tconstructor(private readonly resolver: Resolver) {}\n\n\tget<K extends keyof Registry & string>(\n\t\tkey: K,\n\t\tscope: Scope & { kind: SettingScopeKind<Registry, K> },\n\t\tasOf?: Date,\n\t): Promise<SettingValue<Registry, K>> {\n\t\treturn this.resolver.get(key, scope, asOf) as Promise<\n\t\t\tSettingValue<Registry, K>\n\t\t>;\n\t}\n\n\tasync getMany<K extends readonly (keyof Registry & string)[]>(\n\t\tkeys: K,\n\t\tscope: Scope,\n\t\tasOf?: Date,\n\t): Promise<{ [P in K[number]]: SettingValue<Registry, P> }> {\n\t\tconst result = await this.resolver.getMany([...keys], scope, asOf);\n\t\treturn result as { [P in K[number]]: SettingValue<Registry, P> };\n\t}\n\n\tasync listAt(\n\t\tscope: Scope,\n\t\topts: { limit?: number; cursor?: string } = {},\n\t): Promise<{\n\t\tentries: Partial<{\n\t\t\t[K in keyof Registry & string]: SettingValue<Registry, K>;\n\t\t}>;\n\t\tnextCursor: string | null;\n\t}> {\n\t\tconst page = await this.resolver.listAt(scope, opts);\n\t\treturn page as {\n\t\t\tentries: Partial<{\n\t\t\t\t[K in keyof Registry & string]: SettingValue<Registry, K>;\n\t\t\t}>;\n\t\t\tnextCursor: string | null;\n\t\t};\n\t}\n}\n","import type { Scope, ValueRecord } from '../core/types';\nimport type { SetParams, Writer } from '../engine/writer';\nimport type { SettingScopeKind, SettingValue } from './registry';\n\nexport interface TypedSetParams<Registry, K extends keyof Registry & string> {\n\tkey: K;\n\tscope: Scope & { kind: SettingScopeKind<Registry, K> };\n\tvalue: SettingValue<Registry, K>;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport interface TypedUnsetParams<Registry, K extends keyof Registry & string> {\n\tkey: K;\n\tscope: Scope & { kind: SettingScopeKind<Registry, K> };\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport class TypedWriter<Registry> {\n\tconstructor(private readonly writer: Writer) {}\n\n\tset<K extends keyof Registry & string>(\n\t\tparams: TypedSetParams<Registry, K>,\n\t): Promise<ValueRecord> {\n\t\treturn this.writer.set(params as unknown as SetParams);\n\t}\n\n\tsetMany(\n\t\tparamsList: {\n\t\t\t[K in keyof Registry & string]: TypedSetParams<Registry, K>;\n\t\t}[keyof Registry & string][],\n\t): Promise<ValueRecord[]> {\n\t\treturn this.writer.setMany(paramsList as unknown as SetParams[]);\n\t}\n\n\tunset<K extends keyof Registry & string>(\n\t\tparams: TypedUnsetParams<Registry, K>,\n\t): Promise<void> {\n\t\treturn this.writer.unset(params);\n\t}\n}\n","import type { Scope } from '../core/types';\nimport type { Auditor } from '../engine/auditor';\nimport type { AuditRecord } from '../storage/storage-port';\nimport type { SettingScopeKind } from './registry';\n\nexport class TypedAuditor<Registry> {\n\tconstructor(private readonly auditor: Auditor) {}\n\n\thistory<K extends keyof Registry & string>(\n\t\tkey: K,\n\t\tscope?: Scope & { kind: SettingScopeKind<Registry, K> },\n\t): Promise<AuditRecord[]> {\n\t\treturn this.auditor.history(key, scope);\n\t}\n}\n","import type { Engine } from '../engine/engine';\nimport { TypedResolver } from './typed-resolver';\nimport { TypedWriter } from './typed-writer';\nimport { TypedAuditor } from './typed-auditor';\n\nexport interface TypedEngine<Registry> {\n\tresolver: TypedResolver<Registry>;\n\twriter: TypedWriter<Registry>;\n\tauditor: TypedAuditor<Registry>;\n}\n\nexport function createTypedEngine<Registry>(\n\tengine: Engine,\n): TypedEngine<Registry> {\n\treturn {\n\t\tresolver: new TypedResolver<Registry>(engine.resolver),\n\t\twriter: new TypedWriter<Registry>(engine.writer),\n\t\tauditor: new TypedAuditor<Registry>(engine.auditor),\n\t};\n}\n"],"mappings":";AAeO,IAAM,gBAAuB,EAAE,MAAM,WAAW,OAAO,KAAK;;;ACN5D,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACxC,YACC,SACgB,MACf;AACD,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO,WAAW;AACvB,UAAM,oBAAoB,MAAM,UAAU;AAAA,EAC3C;AAAA,EALiB;AAMlB;AAEO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAChD,YAAY,KAAa;AACxB,UAAM,gCAAgC,GAAG,KAAK,WAAW;AAAA,EAC1D;AACD;AAEO,IAAM,aAAN,cAAyB,cAAc;AAAA,EAC7C,YAAY,KAAa,WAAmB;AAC3C;AAAA,MACC,YAAY,GAAG,0CAA0C,SAAS;AAAA,MAClE;AAAA,IACD;AAAA,EACD;AACD;AAEO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAChD,YAAY,KAAa,WAAmB,YAA2B;AACtE;AAAA,MACC,qBAAqB,GAAG,uCAAuC,SAAS,IAAI,cAAc,MAAM;AAAA,MAEhG;AAAA,IACD;AAAA,EACD;AACD;AAEO,IAAM,aAAN,cAAyB,cAAc;AAAA,EAC7C,YAAY,SAAiB;AAC5B,UAAM,SAAS,OAAO;AAAA,EACvB;AACD;AAEO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAChD,YAAY,KAAa,WAAmB,YAA2B;AACtE;AAAA,MACC,YAAY,GAAG,cAAc,SAAS,IAAI,cAAc,MAAM;AAAA,MAE9D;AAAA,IACD;AAAA,EACD;AACD;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC/C,YAAY,SAAiB;AAC5B;AAAA,MACC,qBAAqB,OAAO;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AACD;AAEO,IAAM,aAAN,cAAyB,cAAc;AAAA,EAC7C,YAAY,IAAY,aAAqB;AAC5C;AAAA,MACC,6BAA6B,EAAE,YAAY,WAAW;AAAA,MACtD;AAAA,IACD;AAAA,EACD;AACD;;;ACjEO,IAAM,WAAN,MAAoC;AAAA,EACzB,YAAY,oBAAI,IAE/B;AAAA,EAEF,MAAM,QAAQ,OAAmC;AAChD,UAAM,QAAQ;AAAA,MACb,CAAC,GAAG,KAAK,SAAS,EAAE;AAAA,QAAI,CAAC,aACxB,QAAQ,QAAQ,SAAS,KAAK,CAAC;AAAA,MAChC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,UAA8D;AACvE,SAAK,UAAU,IAAI,QAAQ;AAAA,EAC5B;AACD;;;ACXA,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAErB,IAAM,QAAN,MAAY;AAAA,EAGlB,YACkB,KACA,UAAwB,CAAC,GACzB,WAChB;AAHgB;AACA;AACA;AAEjB,SAAK,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,KAAK,CAAC;AAAA,EACnD;AAAA,EALkB;AAAA,EACA;AAAA,EACA;AAAA,EALD,QAAQ,oBAAI,IAAmB;AAAA,EAUhD,IAAI,KAAa,OAAiC;AACjD,QAAI,KAAK,QAAQ,YAAY,MAAO,QAAO;AAC3C,UAAM,WAAW,KAAK,OAAO,KAAK,KAAK;AACvC,UAAM,QAAQ,KAAK,MAAM,IAAI,QAAQ;AACrC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,MAAM,aAAa,KAAK,IAAI,GAAG;AAClC,WAAK,MAAM,OAAO,QAAQ;AAC1B,aAAO;AAAA,IACR;AACA,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,IAAI,KAAa,OAAc,OAAoB;AAClD,QAAI,KAAK,QAAQ,YAAY,MAAO;AACpC,UAAM,WAAW,KAAK,OAAO,KAAK,KAAK;AACvC,QACC,CAAC,KAAK,MAAM,IAAI,QAAQ,KACxB,KAAK,MAAM,SAAS,KAAK,QAAQ,cAAc,sBAC9C;AACD,YAAM,SAAS,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AACxC,UAAI,WAAW,OAAW,MAAK,MAAM,OAAO,MAAM;AAAA,IACnD;AACA,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,SAAK,MAAM,IAAI,UAAU;AAAA,MACxB;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,WAAW,KAAK,IAAI,IAAI;AAAA,IACzB,CAAC;AAAA,EACF;AAAA,EAEA,KAAK,KAAmB;AACvB,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,OAAO;AAC3C,UAAI,MAAM,QAAQ,IAAK,MAAK,MAAM,OAAO,QAAQ;AAAA,IAClD;AAAA,EACD;AAAA,EAEA,UAAgB;AACf,SAAK,MAAM,MAAM;AAAA,EAClB;AAAA,EAEA,cAAc,aAAqC;AAClD,UAAM,UAAU,IAAI,IAAI,WAAW;AACnC,QAAI,QAAQ,SAAS,EAAG;AACxB,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,OAAO;AAC3C,UAAI,MAAM,eAAe,QAAQ,QAAQ,IAAI,MAAM,UAAU,GAAG;AAC/D,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,WAAW,KAAa,aAAqC;AACpE,UAAM,UAAU,IAAI,IAAI,WAAW;AACnC,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,OAAO;AAC3C,UACC,MAAM,QAAQ,OACd,MAAM,eAAe,QACrB,QAAQ,IAAI,MAAM,UAAU,GAC3B;AACD,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAc,SAAS,OAAmC;AACzD,QAAI,KAAK,aAAa,MAAM,eAAe,MAAM;AAChD,YAAM,cAAc,MAAM,KAAK,UAC7B,YAAY,MAAM,UAAU,EAC5B,MAAM,MAAM,IAAI;AAClB,UAAI,gBAAgB,MAAM;AACzB,aAAK,WAAW,MAAM,KAAK,WAAW;AACtC;AAAA,MACD;AAAA,IACD;AACA,SAAK,KAAK,MAAM,GAAG;AAAA,EACpB;AAAA,EAEQ,OAAO,KAAa,OAAsB;AACjD,WAAO,KAAK,UAAU,CAAC,KAAK,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,EACrD;AACD;;;AC7GO,IAAM,sBAAN,MAAoD;AAAA,EACzC,WAAW,oBAAI,IAA2B;AAAA,EAC1C,aAAa,oBAAI,IAAyB;AAAA,EAE3D,MAAM,MAAM,IAA+B;AAC1C,UAAM,SAAmB,CAAC;AAC1B,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,UAAyB;AAC7B,WAAO,YAAY,MAAM;AACxB,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAChB,aAAO,KAAK,OAAO;AACnB,gBAAU,KAAK,SAAS,IAAI,OAAO,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,YAAY,IAA+B;AAChD,UAAM,SAAmB,CAAC;AAC1B,UAAM,QAAQ,CAAC,EAAE;AACjB,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,MAAM,SAAS,GAAG;AACxB,YAAM,UAAU,MAAM,IAAI;AAC1B,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAChB,aAAO,KAAK,OAAO;AACnB,YAAM,OAAO,KAAK,WAAW,IAAI,OAAO;AACxC,UAAI,KAAM,OAAM,KAAK,GAAG,IAAI;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,SAAS,IAA+B;AAC7C,WAAO,CAAC,GAAI,KAAK,WAAW,IAAI,EAAE,KAAK,CAAC,CAAE;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAO,IAAoC;AAChD,WAAO,KAAK,SAAS,IAAI,EAAE,KAAK;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,IAAY,UAAwC;AAChE,QAAI,aAAa,KAAM,OAAM,KAAK,cAAc,IAAI,QAAQ;AAC5D,UAAM,YAAY,KAAK,SAAS,IAAI,EAAE,KAAK;AAC3C,QAAI,cAAc,KAAM,MAAK,WAAW,IAAI,SAAS,GAAG,OAAO,EAAE;AACjE,SAAK,SAAS,IAAI,IAAI,QAAQ;AAC9B,QAAI,aAAa,KAAM,MAAK,SAAS,UAAU,EAAE;AACjD,QAAI,CAAC,KAAK,WAAW,IAAI,EAAE,EAAG,MAAK,WAAW,IAAI,IAAI,oBAAI,IAAI,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,KAAK,IAAY,aAA2C;AACjE,QAAI,gBAAgB,KAAM,OAAM,KAAK,cAAc,IAAI,WAAW;AAClE,UAAM,YAAY,KAAK,SAAS,IAAI,EAAE,KAAK;AAC3C,QAAI,cAAc,KAAM,MAAK,WAAW,IAAI,SAAS,GAAG,OAAO,EAAE;AACjE,SAAK,SAAS,IAAI,IAAI,WAAW;AACjC,QAAI,gBAAgB,KAAM,MAAK,SAAS,aAAa,EAAE;AAAA,EACxD;AAAA,EAEA,MAAM,OAAO,IAA2B;AACvC,UAAM,WAAW,KAAK,SAAS,IAAI,EAAE,KAAK;AAC1C,UAAM,OAAO,CAAC,GAAI,KAAK,WAAW,IAAI,EAAE,KAAK,CAAC,CAAE;AAChD,eAAW,OAAO,MAAM;AACvB,YAAM,KAAK,KAAK,KAAK,QAAQ;AAAA,IAC9B;AACA,QAAI,aAAa,KAAM,MAAK,WAAW,IAAI,QAAQ,GAAG,OAAO,EAAE;AAC/D,SAAK,SAAS,OAAO,EAAE;AACvB,SAAK,WAAW,OAAO,EAAE;AAAA,EAC1B;AAAA,EAEQ,SAAS,UAAkB,IAAkB;AACpD,QAAI,CAAC,KAAK,WAAW,IAAI,QAAQ;AAChC,WAAK,WAAW,IAAI,UAAU,oBAAI,IAAI,CAAC;AACxC,SAAK,WAAW,IAAI,QAAQ,EAAG,IAAI,EAAE;AAAA,EACtC;AAAA,EAEA,MAAc,cACb,IACA,aACgB;AAChB,QACC,OAAO,gBACN,MAAM,KAAK,MAAM,WAAW,GAAG,SAAS,EAAE,GAC1C;AACD,YAAM,IAAI,WAAW,IAAI,WAAW;AAAA,IACrC;AAAA,EACD;AACD;;;AC7DA,SAAS,eAAe,MAAiB,OAAc;AACtD,SAAO;AAAA,IACN,MAAM,SAAS,YAAa,QAAoB;AAAA,IAChD,KAAK,SAAS,YAAa,QAAmB;AAAA,IAC9C,MAAM,SAAS,UAAU,SAAS,SAAU,QAAmB;AAAA,IAC/D,MAAM,SAAS,SAAS,QAAQ;AAAA,IAChC,SAAS,SAAS;AAAA,IAClB,MAAM,SAAS,SAAU,QAAiB;AAAA,EAC3C;AACD;AAEO,IAAM,uBAAN,MAAqD;AAAA,EACnD,OAAoB,CAAC;AAAA,EACrB,SAAwB,CAAC;AAAA,EACzB,WAA0B,CAAC;AAAA,EAC3B,SAAS;AAAA,EACT,UAA4B,QAAQ,QAAQ;AAAA,EAE5C,MAAM,QAAwB;AACrC,WAAO,GAAG,MAAM,IAAI,KAAK,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,SAAS,MAAsC;AACpD,UAAM,SAAsB,CAAC;AAC7B,eAAW,OAAO,MAAM;AACvB,YAAM,QAAQ,KAAK,eAAe,KAAK,CAAC,UAAU,YAAY,CAAC;AAC/D,UAAI,MAAO,QAAO,KAAK,KAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAAW,OAAgD;AAChE,UAAM,OAAO,MAAM,QAAQ,oBAAI,KAAK;AACpC,UAAM,MAAM,IAAI,IAAI,MAAM,aAAa;AACvC,WAAO,KAAK,OAAO;AAAA,MAClB,CAAC,MACA,IAAI,IAAI,EAAE,YAAY,KACtB,EAAE,cAAc,MAAM,aACtB,EAAE,eAAe,MAAM,cACvB,EAAE,aAAa,SACd,EAAE,YAAY,QAAQ,EAAE,UAAU;AAAA,IACrC;AAAA,EACD;AAAA,EAEA,MAAM,gBAAgB,OAA+C;AACpE,UAAM,OAAO,MAAM,QAAQ,oBAAI,KAAK;AACpC,UAAM,SAAS,IAAI,IAAI,MAAM,aAAa;AAC1C,UAAM,SAAS,IAAI,IAAI,MAAM,KAAK;AAClC,WAAO,KAAK,OAAO;AAAA,MAClB,CAAC,MACA,OAAO,IAAI,EAAE,YAAY,KACzB,EAAE,eAAe,QACjB,OAAO,IAAI,EAAE,UAAU,KACvB,EAAE,aAAa,SACd,EAAE,YAAY,QAAQ,EAAE,UAAU;AAAA,IACrC;AAAA,EACD;AAAA,EAEA,MAAM,cAAc,KAAqC;AACxD,UAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,WAAO,KAAK,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAM,WAAW,KAAwC;AACxD,WAAO,KAAK,cAAc,GAAG,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,OAAmD;AACnE,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,SAAS,KAAK,OAClB;AAAA,MACA,CAAC,MACA,EAAE,cAAc,MAAM,aACtB,EAAE,eAAe,MAAM,cACvB,EAAE,aAAa,QACd,EAAE,YAAY,QAAQ,EAAE,UAAU;AAAA,IACrC,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAEzC,UAAM,aAAa,MAAM,SACtB,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM,MAAM,IAAI,IACjD;AACH,UAAM,QAAQ,MAAM,SAAS,OAAO,SAAS;AAC7C,UAAM,OAAO,OAAO,MAAM,YAAY,aAAa,KAAK;AACxD,UAAM,aACL,aAAa,KAAK,SAAS,OAAO,SAC9B,KAAK,KAAK,SAAS,CAAC,GAAG,MAAM,OAC9B;AAEJ,WAAO,EAAE,QAAQ,MAAM,WAAW;AAAA,EACnC;AAAA,EAEA,MAAM,UAAU,OAA+C;AAC9D,WAAO,KAAK,SACV;AAAA,MACA,CAAC,MACA,EAAE,iBAAiB,MAAM,iBACxB,MAAM,cAAc,UACpB,EAAE,cAAc,MAAM,eACtB,MAAM,eAAe,UACrB,EAAE,eAAe,MAAM;AAAA,IAC1B,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,UAAU,OAA2C;AAC1D,UAAM,mBAAmB,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,GAAG;AACpE,UAAM,UACL,iBAAiB,SAAS,IACvB,KAAK,IAAI,GAAG,iBAAiB,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IACtD;AACJ,UAAM,SAAoB;AAAA,MACzB,IAAI,KAAK,MAAM,KAAK;AAAA,MACpB,KAAK,MAAM;AAAA,MACX;AAAA,MACA,OAAO,MAAM;AAAA,MACb,aAAa,MAAM,eAAe;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW,CAAC;AAAA,MAC3B,KAAK,MAAM,OAAO;AAAA,MAClB,KAAK,MAAM,OAAO;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM,UAAU;AAAA,MACxB,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,IAC7B;AACA,SAAK,KAAK,KAAK,MAAM;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,gBAAgB,KAAa,QAAoC;AACtE,UAAM,UAAU,KAAK,cAAc,GAAG;AACtC,QAAI,CAAC,QAAS,OAAM,IAAI,cAAc,GAAG;AAEzC,UAAM,UAAqB,EAAE,GAAG,SAAS,OAAO;AAChD,SAAK,OAAO,KAAK,KAAK,IAAI,CAAC,MAAO,MAAM,UAAU,UAAU,CAAE;AAC9D,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,SAAS,QAAuC;AACrD,UAAM,OAAO,SACV,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,IAC3C,KAAK;AACR,WAAO,CAAC,GAAG,IAAI,EAAE;AAAA,MAChB,CAAC,GAAG,OACF,EAAE,YAAY,IAAI,cAAc,EAAE,YAAY,EAAE,KACjD,EAAE,IAAI,cAAc,EAAE,GAAG;AAAA,IAC3B;AAAA,EACD;AAAA,EAEA,MAAM,SAAY,IAA+C;AAChE,UAAM,MAAM,KAAK,QAAQ,KAAK,YAAY;AACzC,YAAM,iBAAiB,gBAAgB,KAAK,MAAM;AAClD,YAAM,mBAAmB,gBAAgB,KAAK,QAAQ;AACtD,UAAI;AACH,eAAO,MAAM,GAAG,KAAK,GAAG,CAAC;AAAA,MAC1B,SAAS,KAAK;AACb,aAAK,SAAS;AACd,aAAK,WAAW;AAChB,cAAM;AAAA,MACP;AAAA,IACD,CAAC;AACD,SAAK,UAAU,IAAI,MAAM,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO;AAAA,EACR;AAAA,EAEQ,eACP,KACA,UACwB;AACxB,UAAM,SAAS,KAAK,cAAc,GAAG;AACrC,WAAO,UAAU,SAAS,SAAS,OAAO,MAAM,IAAI,SAAS;AAAA,EAC9D;AAAA,EAEQ,cAAc,KAAoC;AACzD,WAAO,KAAK,KACV,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,EAC3B,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAAA,EAC1C;AAAA,EAEQ,KAAgB;AACvB,WAAO;AAAA,MACN,SAAS,OAAO,QACf,KAAK,eAAe,KAAK,CAAC,QAAQ,CAAC,KAAK;AAAA,MAEzC,WAAW,OAAO,cAAc,WAAW,eAC1C,KAAK,OAAO;AAAA,QACX,CAAC,MACA,EAAE,iBAAiB,gBACnB,EAAE,cAAc,aAChB,EAAE,eAAe,cACjB,EAAE,YAAY;AAAA,MAChB,KAAK;AAAA,MAEN,YAAY,OAAO,OAAe;AACjC,cAAM,MAAM,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/C,YAAI,IAAK,KAAI,UAAU,oBAAI,KAAK;AAAA,MACjC;AAAA,MAEA,aAAa,OAAO,UAA4B;AAC/C,cAAM,SAAsB;AAAA,UAC3B,IAAI,KAAK,MAAM,KAAK;AAAA,UACpB,cAAc,MAAM;AAAA,UACpB,WAAW,MAAM;AAAA,UACjB,YAAY,MAAM;AAAA,UAClB,SAAS,MAAM;AAAA,UACf,WAAW,oBAAI,KAAK;AAAA,UACpB,SAAS;AAAA,UACT,GAAG,eAAe,MAAM,MAAM,MAAM,KAAK;AAAA,QAC1C;AACA,aAAK,OAAO,KAAK,MAAM;AACvB,eAAO;AAAA,MACR;AAAA,MAEA,aAAa,OAAO,UAA2C;AAC9D,aAAK,SAAS,KAAK;AAAA,UAClB,GAAG;AAAA,UACH,IAAI,KAAK,MAAM,OAAO;AAAA,UACtB,IAAI,oBAAI,KAAK;AAAA,QACd,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AACD;;;ACtOO,IAAM,WAAN,MAAe;AAAA,EACrB,YACkB,SACA,WACA,OAChB;AAHgB;AACA;AACA;AAAA,EACf;AAAA,EAHe;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,MAAM,IAAI,KAAa,OAAc,MAA6B;AACjE,UAAM,SAAS,MAAM,KAAK,QAAQ,CAAC,GAAG,GAAG,OAAO,IAAI;AACpD,WAAO,OAAO,GAAG;AAAA,EAClB;AAAA,EAEA,MAAM,OACL,OACA,OAA4C,CAAC,GACvB;AACtB,UAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,KAAK,QAAQ,WAAW;AAAA,MAC5D,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACd,CAAC;AACD,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,WAAW;AAE1D,UAAM,OAAO,MAAM,KAAK,QAAQ,cAAc;AAAA,MAC7C,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAAA,IAC7C,CAAC;AACD,UAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAElD,UAAM,UAAiC,CAAC;AACxC,eAAW,OAAO,QAAQ;AACzB,YAAM,MAAM,QAAQ,IAAI,IAAI,YAAY;AACxC,UAAI,CAAC,IAAK;AACV,cAAQ,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK,GAAG;AAAA,IACxC;AACA,WAAO,EAAE,SAAS,WAAW;AAAA,EAC9B;AAAA,EAEA,MAAM,QACL,MACA,OACA,MACiC;AACjC,UAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AACpC,UAAM,SAAgC,CAAC;AACvC,UAAM,WAAqB,CAAC;AAE5B,QAAI,SAAS,QAAW;AACvB,iBAAW,OAAO,YAAY;AAC7B,cAAM,SAAS,KAAK,OAAO,IAAI,KAAK,KAAK;AACzC,YAAI,WAAW,OAAW,QAAO,GAAG,IAAI;AAAA,YACnC,UAAS,KAAK,GAAG;AAAA,MACvB;AAAA,IACD,OAAO;AACN,eAAS,KAAK,GAAG,UAAU;AAAA,IAC5B;AACA,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAC5C,eAAW,OAAO,UAAU;AAC3B,WAAK,WAAW,SAAS,IAAI,GAAG,GAAI,KAAK;AAAA,IAC1C;AAEA,UAAM,YAAyB,CAAC;AAChC,UAAM,YAAyB,CAAC;AAChC,eAAW,OAAO,UAAU;AAC3B,YAAM,MAAM,SAAS,IAAI,GAAG;AAC5B,YAAM,kBACL,IAAI,YAAY,iBAChB,MAAM,UAAU,QAChB,KAAK;AACN,OAAC,kBAAkB,YAAY,WAAW,KAAK,GAAG;AAAA,IACnD;AAEA,UAAM,QACL,UAAU,SAAS,KAAK,MAAM,UAAU,QAAQ,KAAK,YAClD,MAAM,KAAK,UAAU,MAAM,MAAM,KAAK,IACtC,CAAC;AAEL,UAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,UAAU,SAAS,IAChB,KAAK,QAAQ,WAAW;AAAA,QACxB,eAAe,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACxC,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB;AAAA,MACD,CAAC,IACA,QAAQ,QAAQ,CAAC,CAAkB;AAAA,MACtC,UAAU,SAAS,KAAK,MAAM,SAAS,IACpC,KAAK,QAAQ,gBAAgB;AAAA,QAC7B,eAAe,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACxC;AAAA,QACA;AAAA,MACD,CAAC,IACA,QAAQ,QAAQ,CAAC,CAAkB;AAAA,IACvC,CAAC;AAED,UAAM,aAAa,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;AACpE,UAAM,aAAa,oBAAI,IAA2B;AAClD,eAAW,OAAO,WAAW;AAC5B,YAAM,OAAO,WAAW,IAAI,IAAI,YAAY,KAAK,CAAC;AAClD,WAAK,KAAK,GAAG;AACb,iBAAW,IAAI,IAAI,cAAc,IAAI;AAAA,IACtC;AACA,UAAM,cAAc,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEtD,UAAM,UAAuB,CAAC;AAC9B,eAAW,OAAO,UAAU;AAC3B,YAAM,MAAM,SAAS,IAAI,GAAG;AAC5B,UAAI;AACJ,UAAI,YAAY,IAAI,IAAI,EAAE,GAAG;AAC5B,cAAM,QAAQ,IAAI;AAAA,WAChB,WAAW,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM;AAAA,YACzC,EAAE;AAAA,YACF;AAAA,UACD,CAAC;AAAA,QACF;AACA,mBAAW,OAAO,OAAO;AACxB,gBAAM,MAAM,IAAI,GAAG;AACnB,cAAI,IAAK;AAAA,QACV;AAAA,MACD,OAAO;AACN,cAAM,WAAW,IAAI,IAAI,EAAE;AAAA,MAC5B;AACA,UAAI,KAAK;AACR,eAAO,GAAG,IAAI,KAAK,OAAO,KAAK,GAAG;AAClC,YAAI,SAAS;AACZ,eAAK,OAAO,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;AAAA,MACzC,OAAO;AACN,gBAAQ,KAAK,GAAG;AAAA,MACjB;AAAA,IACD;AAEA,QAAI,QAAQ,SAAS;AACpB,YAAM,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAED,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,eACb,SACA,OACA,aACA,UACA,QACA,MACgB;AAChB,UAAM,cAAc,MAAM,KAAK,QAAQ,WAAW;AAAA,MACjD,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACtC,WAAW,cAAc;AAAA,MACzB,YAAY,cAAc;AAAA,MAC1B;AAAA,IACD,CAAC;AACD,UAAM,eAAe,IAAI;AAAA,MACxB,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;AAAA,IAC3C;AACA,UAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAEnD,eAAW,OAAO,aAAa;AAC9B,YAAM,MAAM,SAAS,IAAI,GAAG;AAC5B,UAAI,CAAC,WAAW,IAAI,IAAI,EAAE,EAAG;AAC7B,YAAM,MAAM,aAAa,IAAI,IAAI,EAAE;AACnC,UAAI,CAAC,KAAK;AACT,cAAM,IAAI,cAAc,IAAI,KAAK,MAAM,MAAM,MAAM,KAAK;AAAA,MACzD;AACA,aAAO,GAAG,IAAI,KAAK,OAAO,KAAK,GAAG;AAClC,UAAI,SAAS,OAAW,MAAK,OAAO,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;AAAA,IAChE;AAAA,EACD;AAAA,EAEA,MAAc,QAAQ,MAAiD;AACtE,UAAM,OAAO,MAAM,KAAK,QAAQ,SAAS,IAAI;AAC7C,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACjD,eAAW,OAAO,MAAM;AACvB,UAAI,CAAC,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,cAAc,GAAG;AAAA,IACjD;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,WAAW,KAAgB,OAAoB;AACtD,QAAI,MAAM,SAAS,UAAW;AAC9B,QAAI,CAAC,IAAI,OAAO,SAAS,MAAM,IAAI,GAAG;AACrC,YAAM,IAAI,WAAW,IAAI,KAAK,MAAM,IAAI;AAAA,IACzC;AAAA,EACD;AAAA,EAEQ,OAAO,KAAgB,KAAyB;AACvD,YAAQ,IAAI,MAAM;AAAA,MACjB,KAAK;AACJ,YAAI,IAAI,SAAS,KAAM,OAAM,IAAI,aAAa,IAAI,EAAE;AACpD,eAAO,IAAI;AAAA,MACZ,KAAK;AACJ,YAAI,IAAI,QAAQ,KAAM,OAAM,IAAI,aAAa,IAAI,EAAE;AACnD,eAAO,IAAI;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACJ,YAAI,IAAI,SAAS,KAAM,OAAM,IAAI,aAAa,IAAI,EAAE;AACpD,eAAO,IAAI;AAAA,MACZ,KAAK;AACJ,YAAI,CAAC,IAAI,QAAS,OAAM,IAAI,aAAa,IAAI,EAAE;AAC/C,eAAO,IAAI;AAAA,MACZ,KAAK;AACJ,YAAI,IAAI,SAAS,KAAM,OAAM,IAAI,aAAa,IAAI,EAAE;AACpD,eAAO,IAAI;AAAA,IACb;AAAA,EACD;AACD;;;AChNA,IAAM,WAAW;AAEV,IAAM,SAAN,MAAa;AAAA,EACnB,YACkB,SACA,KAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAFe;AAAA,EACA;AAAA,EAGlB,MAAM,IAAI,QAAyC;AAClD,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAAS,CAAC,OAC5C,KAAK,QAAQ,IAAI,MAAM;AAAA,IACxB;AACA,UAAM,KAAK,KAAK,SAAS,OAAO,GAAG;AACnC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAQ,YAAiD;AAC9D,UAAM,UAAU,MAAM,KAAK,QAAQ,SAAS,OAAO,OAAO;AACzD,YAAM,UAAyB,CAAC;AAChC,iBAAW,UAAU,YAAY;AAChC,gBAAQ,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC5C;AACA,aAAO;AAAA,IACR,CAAC;AACD,UAAM,QAAQ;AAAA,MACb,QAAQ,IAAI,CAAC,KAAK,MAAM,KAAK,KAAK,KAAK,WAAW,CAAC,EAAE,GAAG,CAAC;AAAA,IAC1D;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,QACb,IACA,QACuB;AACvB,UAAM,MAAM,MAAM,GAAG,QAAQ,OAAO,GAAG;AACvC,QAAI,CAAC,IAAK,OAAM,IAAI,cAAc,OAAO,GAAG;AAE5C,QACC,OAAO,MAAM,SAAS,aACtB,CAAC,IAAI,OAAO,SAAS,OAAO,MAAM,IAAI,GACrC;AACD,YAAM,IAAI,WAAW,IAAI,KAAK,OAAO,MAAM,IAAI;AAAA,IAChD;AAEA,SAAK,SAAS,KAAK,OAAO,KAAK;AAE/B,UAAM,UAAU,MAAM,GAAG;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACd;AAEA,UAAM,iBAAiB,SAAS,WAAW;AAC3C,UAAM,WAAW,OAAO,mBAAmB;AAC3C,QAAI,mBAAmB,UAAU;AAChC,YAAM,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,MACd;AAAA,IACD;AAEA,QAAI,SAAS;AACZ,YAAM,GAAG,WAAW,QAAQ,EAAE;AAAA,IAC/B;AAEA,UAAM,UAAU,MAAM,GAAG,YAAY;AAAA,MACpC,cAAc,IAAI;AAAA,MAClB,WAAW,OAAO,MAAM;AAAA,MACxB,YAAY,OAAO,MAAM;AAAA,MACzB,SAAS,iBAAiB;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,MAAM,IAAI;AAAA,MACV,OAAO,OAAO;AAAA,IACf,CAAC;AAED,UAAM,GAAG,YAAY;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,cAAc,IAAI;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,QAAQ,UAAU,eAAe;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,QAAQ,UAAU,KAAK,WAAW,KAAK,OAAO,IAAI;AAAA,MAClD,OAAO,KAAK,WAAW,KAAK,OAAO;AAAA,MACnC,QAAQ,OAAO;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,MAAM,QAAoC;AAC/C,UAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,MAAS,CAAC,OAC3C,KAAK,UAAU,IAAI,MAAM;AAAA,IAC1B;AACA,QAAI,OAAQ,OAAM,KAAK,KAAK,QAAQ,OAAO,GAAG;AAAA,EAC/C;AAAA,EAEA,MAAc,UACb,IACA,QAC8B;AAC9B,UAAM,MAAM,MAAM,GAAG,QAAQ,OAAO,GAAG;AACvC,QAAI,CAAC,IAAK,OAAM,IAAI,cAAc,OAAO,GAAG;AAE5C,QACC,OAAO,MAAM,SAAS,aACtB,CAAC,IAAI,OAAO,SAAS,OAAO,MAAM,IAAI,GACrC;AACD,YAAM,IAAI,WAAW,IAAI,KAAK,OAAO,MAAM,IAAI;AAAA,IAChD;AAEA,UAAM,UAAU,MAAM,GAAG;AAAA,MACxB,IAAI;AAAA,MACJ,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACd;AAEA,UAAM,iBAAiB,SAAS,WAAW;AAC3C,UAAM,WAAW,OAAO,mBAAmB;AAC3C,QAAI,mBAAmB,UAAU;AAChC,YAAM,IAAI;AAAA,QACT,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,MACd;AAAA,IACD;AACA,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,GAAG,WAAW,QAAQ,EAAE;AAC9B,UAAM,GAAG,YAAY;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,cAAc,IAAI;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,UAAU,OAAO;AAAA,MACjB,QAAQ,KAAK,WAAW,KAAK,OAAO;AAAA,MACpC,QAAQ,OAAO;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,MAAc,KAAK,SAAsB,KAA4B;AACpE,QAAI;AACH,YAAM,KAAK,KAAK,QAAQ;AAAA,QACvB,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,MACrB,CAAC;AAAA,IACF,SAAS,KAAK;AACb,cAAQ,MAAM,uCAAuC,GAAG;AAAA,IACzD;AAAA,EACD;AAAA,EAEQ,SAAS,KAAgB,OAAoB;AACpD,YAAQ,IAAI,MAAM;AAAA,MACjB,KAAK;AACJ,YAAI,OAAO,UAAU,WAAW;AAC/B,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG;AAAA,UACpB;AAAA,QACD;AACA;AAAA,MACD,KAAK,WAAW;AACf,YAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACzD,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG;AAAA,UACpB;AAAA,QACD;AACA,YAAI,IAAI,QAAQ,QAAQ,QAAQ,IAAI,KAAK;AACxC,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG,gBAAgB,IAAI,GAAG,SAAS,KAAK;AAAA,UACzD;AAAA,QACD;AACA,YAAI,IAAI,QAAQ,QAAQ,QAAQ,IAAI,KAAK;AACxC,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG,gBAAgB,IAAI,GAAG,SAAS,KAAK;AAAA,UACzD;AAAA,QACD;AACA;AAAA,MACD;AAAA,MACA,KAAK;AACJ,YAAI,OAAO,UAAU,UAAU;AAC9B,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG;AAAA,UACpB;AAAA,QACD;AACA;AAAA,MACD,KAAK;AACJ,YAAI,OAAO,UAAU,YAAY,CAAC,IAAI,QAAQ,SAAS,KAAK,GAAG;AAC9D,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG,qBAAqB,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC/D;AAAA,QACD;AACA;AAAA,MACD,KAAK,QAAQ;AACZ,YAAI;AACJ,YAAI;AACH,uBAAa,KAAK,UAAU,KAAK;AAAA,QAClC,QAAQ;AACP,uBAAa;AAAA,QACd;AACA,YAAI,eAAe,QAAW;AAC7B,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG;AAAA,UACpB;AAAA,QACD;AACA;AAAA,MACD;AAAA,MACA,KAAK;AACJ,YAAI,EAAE,iBAAiB,SAAS,OAAO,MAAM,MAAM,QAAQ,CAAC,GAAG;AAC9D,gBAAM,IAAI;AAAA,YACT,YAAY,IAAI,GAAG;AAAA,UACpB;AAAA,QACD;AACA;AAAA,IACF;AAAA,EACD;AAAA,EAEQ,WAAW,KAAgB,KAAkB;AACpD,QAAI,IAAI,QAAQ;AACf,aAAO;AAAA,QACN,WAAW,IAAI;AAAA,QACf,YAAY,IAAI;AAAA,QAChB,SAAS,IAAI;AAAA,QACb,OAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,MACN,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,MAAM,IAAI;AAAA,MACV,MAAM,IAAI,UAAU,IAAI,OAAO;AAAA,MAC/B,MAAM,IAAI;AAAA,IACX;AAAA,EACD;AACD;;;AC1QO,IAAM,UAAN,MAAc;AAAA,EACpB,YAA6B,SAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,MAAM,QAAQ,KAAa,OAAuC;AACjE,UAAM,MAAM,MAAM,KAAK,QAAQ,WAAW,GAAG;AAC7C,QAAI,CAAC,IAAK,OAAM,IAAI,cAAc,GAAG;AAErC,WAAO,KAAK,QAAQ,UAAU;AAAA,MAC7B,cAAc,IAAI;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO;AAAA,IACpB,CAAC;AAAA,EACF;AACD;;;ACdO,SAAS,0BACf,WACA,OACiB;AACjB,SAAO;AAAA,IACN,OAAO,CAAC,OAAO,UAAU,MAAM,EAAE;AAAA,IACjC,aAAa,CAAC,OAAO,UAAU,YAAY,EAAE;AAAA,IAC7C,UAAU,CAAC,OAAO,UAAU,SAAS,EAAE;AAAA,IACvC,QAAQ,CAAC,OAAO,UAAU,OAAO,EAAE;AAAA,IACnC,QAAQ,OAAO,IAAI,aAAa;AAC/B,YAAM,UAAU,OAAO,IAAI,QAAQ;AACnC,YAAM,cAAc,MAAM,UAAU,YAAY,EAAE,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,OAAO,IAAI,gBAAgB;AAChC,YAAM,cAAc,MAAM,UAAU,YAAY,EAAE;AAClD,YAAM,UAAU,KAAK,IAAI,WAAW;AACpC,YAAM,cAAc,WAAW;AAAA,IAChC;AAAA,IACA,QAAQ,OAAO,OAAO;AACrB,YAAM,cAAc,MAAM,UAAU,YAAY,EAAE;AAClD,YAAM,UAAU,OAAO,EAAE;AACzB,YAAM,cAAc,WAAW;AAAA,IAChC;AAAA,EACD;AACD;;;ACGO,SAAS,aAAa,UAAyB,CAAC,GAAW;AACjE,QAAM,UAAU,QAAQ,WAAW,IAAI,qBAAqB;AAC5D,QAAM,eAAe,QAAQ,aAAa,IAAI,oBAAoB;AAClE,QAAM,MAAM,QAAQ,OAAO,IAAI,SAAS;AACxC,QAAM,eACL,QAAQ,UAAU,QAAQ,EAAE,SAAS,MAAM,IAAK,QAAQ,SAAS,CAAC;AACnE,QAAM,QAAQ,IAAI,MAAM,KAAK,cAAc,YAAY;AACvD,QAAM,YAAY,0BAA0B,cAAc,KAAK;AAC/D,QAAM,WAAW,IAAI,SAAS,SAAS,WAAW,KAAK;AACvD,QAAM,SAAS,IAAI,OAAO,SAAS,GAAG;AACtC,QAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,SAAO,EAAE,SAAS,WAAW,KAAK,OAAO,UAAU,QAAQ,QAAQ;AACpE;;;ACtCO,IAAM,gBAAN,MAA8B;AAAA,EACpC,YAA6B,UAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,IACC,KACA,OACA,MACqC;AACrC,WAAO,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI;AAAA,EAG1C;AAAA,EAEA,MAAM,QACL,MACA,OACA,MAC2D;AAC3D,UAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,CAAC,GAAG,IAAI,GAAG,OAAO,IAAI;AACjE,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OACL,OACA,OAA4C,CAAC,GAM3C;AACF,UAAM,OAAO,MAAM,KAAK,SAAS,OAAO,OAAO,IAAI;AACnD,WAAO;AAAA,EAMR;AACD;;;ACtBO,IAAM,cAAN,MAA4B;AAAA,EAClC,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAAjB;AAAA,EAE7B,IACC,QACuB;AACvB,WAAO,KAAK,OAAO,IAAI,MAA8B;AAAA,EACtD;AAAA,EAEA,QACC,YAGyB;AACzB,WAAO,KAAK,OAAO,QAAQ,UAAoC;AAAA,EAChE;AAAA,EAEA,MACC,QACgB;AAChB,WAAO,KAAK,OAAO,MAAM,MAAM;AAAA,EAChC;AACD;;;ACtCO,IAAM,eAAN,MAA6B;AAAA,EACnC,YAA6B,SAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAE7B,QACC,KACA,OACyB;AACzB,WAAO,KAAK,QAAQ,QAAQ,KAAK,KAAK;AAAA,EACvC;AACD;;;ACHO,SAAS,kBACf,QACwB;AACxB,SAAO;AAAA,IACN,UAAU,IAAI,cAAwB,OAAO,QAAQ;AAAA,IACrD,QAAQ,IAAI,YAAsB,OAAO,MAAM;AAAA,IAC/C,SAAS,IAAI,aAAuB,OAAO,OAAO;AAAA,EACnD;AACD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/errors.ts","../src/cache/change-bus.ts","../src/cache/cache.ts","../src/hierarchy/scope-hierarchy.ts","../src/storage/memory-storage.ts","../src/engine/resolver.ts","../src/engine/writer.ts","../src/engine/auditor.ts","../src/engine/hierarchy-cache-sync.ts","../src/engine/engine.ts","../src/typed/typed-resolver.ts","../src/typed/typed-writer.ts","../src/typed/typed-auditor.ts","../src/typed/typed-engine.ts"],"sourcesContent":["export type JsonValue =\n\t| null\n\t| boolean\n\t| number\n\t| string\n\t| JsonValue[]\n\t| { [key: string]: JsonValue };\n\nexport type Value = Date | JsonValue;\n\nexport interface Scope {\n\tkind: string;\n\trefId: string | null;\n}\n\nexport const DEFAULT_SCOPE: Scope = { kind: 'default', refId: null };\n\nexport type ValueType =\n\t'BOOLEAN' | 'NUMERIC' | 'TEXT' | 'ENUM' | 'JSON' | 'DATE';\n\nexport type Inherit = 'LOCKED' | 'INHERITABLE_OVERRIDABLE' | 'INDEPENDENT';\n\nexport type Status = 'DRAFT' | 'STABLE' | 'DEPRECATED' | 'RETIRED';\n\nexport interface DefRecord {\n\tid: string;\n\tkey: string;\n\tversion: number;\n\tlabel: string;\n\tdescription: string | null;\n\ttype: ValueType;\n\toptions: string[];\n\tmin: number | null;\n\tmax: number | null;\n\tscopes: string[];\n\tinherit: Inherit;\n\trequired: boolean;\n\tsecret: boolean;\n\tstatus: Status;\n\tcategory: string | null;\n}\n\nexport interface ValueRecord {\n\tid: string;\n\tdefinitionId: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n\tbool: boolean | null;\n\tnum: number | null;\n\ttext: string | null;\n\tjson: unknown;\n\tjsonSet: boolean;\n\tdate: Date | null;\n\tversion: number;\n}\n\nexport interface ScopeHierarchy {\n\tchain(scopeRefId: string): Promise<string[]>;\n\tdescendants(scopeRefId: string): Promise<string[]>;\n\tchildren(scopeRefId: string): Promise<string[]>;\n\tparent(scopeRefId: string): Promise<string | null>;\n\tattach(id: string, parentId: string | null): Promise<void>;\n\tmove(id: string, newParentId: string | null): Promise<void>;\n\tdetach(id: string): Promise<void>;\n}\n","export type ErrorCode =\n\t| 'NOT_FOUND'\n\t| 'SCOPE'\n\t| 'REQUIRED'\n\t| 'VALUE'\n\t| 'CONFLICT'\n\t| 'CORRUPT'\n\t| 'CYCLE';\n\nexport class ConfTreeError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: ErrorCode,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = new.target.name;\n\t\tError.captureStackTrace?.(this, new.target);\n\t}\n}\n\nexport class NotFoundError extends ConfTreeError {\n\tconstructor(key: string) {\n\t\tsuper(`Unknown setting definition: \"${key}\"`, 'NOT_FOUND');\n\t}\n}\n\nexport class ScopeError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string) {\n\t\tsuper(\n\t\t\t`Setting \"${key}\" cannot be set or read at scope kind \"${scopeKind}\"`,\n\t\t\t'SCOPE',\n\t\t);\n\t}\n}\n\nexport class RequiredError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string, scopeRefId: string | null) {\n\t\tsuper(\n\t\t\t`Required setting \"${key}\" has no resolvable value for scope ${scopeKind}:${scopeRefId ?? 'null'} ` +\n\t\t\t\t`and no default is defined`,\n\t\t\t'REQUIRED',\n\t\t);\n\t}\n}\n\nexport class ValueError extends ConfTreeError {\n\tconstructor(message: string) {\n\t\tsuper(message, 'VALUE');\n\t}\n}\n\nexport class ConflictError extends ConfTreeError {\n\tconstructor(key: string, scopeKind: string, scopeRefId: string | null) {\n\t\tsuper(\n\t\t\t`Setting \"${key}\" at scope ${scopeKind}:${scopeRefId ?? 'null'} was modified concurrently. ` +\n\t\t\t\t`Reload the current value and retry.`,\n\t\t\t'CONFLICT',\n\t\t);\n\t}\n}\n\nexport class CorruptError extends ConfTreeError {\n\tconstructor(valueId: string) {\n\t\tsuper(\n\t\t\t`setting value row ${valueId} has no typed value set: data corruption`,\n\t\t\t'CORRUPT',\n\t\t);\n\t}\n}\n\nexport class CycleError extends ConfTreeError {\n\tconstructor(id: string, newParentId: string) {\n\t\tsuper(\n\t\t\t`Cannot attach/move scope \"${id}\" under \"${newParentId}\": would create a cycle`,\n\t\t\t'CYCLE',\n\t\t);\n\t}\n}\n","export interface ChangeEvent {\n\tdefinitionId: string;\n\tkey: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n}\n\nexport type ChangeListener = (event: ChangeEvent) => void | Promise<void>;\n\nexport interface ChangeBus {\n\tpublish(event: ChangeEvent): Promise<void>;\n\tsubscribe(listener: ChangeListener): void;\n\tunsubscribe(listener: ChangeListener): void;\n}\n\nexport class LocalBus implements ChangeBus {\n\tprivate readonly listeners = new Set<ChangeListener>();\n\n\tasync publish(event: ChangeEvent): Promise<void> {\n\t\tawait Promise.all(\n\t\t\t[...this.listeners].map((listener) =>\n\t\t\t\tPromise.resolve(listener(event)),\n\t\t\t),\n\t\t);\n\t}\n\n\tsubscribe(listener: ChangeListener): void {\n\t\tthis.listeners.add(listener);\n\t}\n\n\tunsubscribe(listener: ChangeListener): void {\n\t\tthis.listeners.delete(listener);\n\t}\n}\n","import type { Scope, ScopeHierarchy, Value } from '../core/types';\nimport type { ChangeBus, ChangeEvent, ChangeListener } from './change-bus';\n\nexport interface CacheOptions {\n\tenabled?: boolean;\n\tttlMs?: number;\n\tmaxEntries?: number;\n}\n\ninterface Entry {\n\tkey: string;\n\tscopeKind: string;\n\tscopeRefId: string | null;\n\tvalue: Value;\n\texpiresAt: number;\n}\n\nconst DEFAULT_TTL_MS = 30_000;\nconst DEFAULT_MAX_ENTRIES = 50_000;\n\nexport class Cache {\n\tprivate readonly store = new Map<string, Entry>();\n\tprivate readonly listener: ChangeListener = (event) => this.onChange(event);\n\n\tconstructor(\n\t\tprivate readonly bus: ChangeBus,\n\t\tprivate readonly options: CacheOptions = {},\n\t\tprivate readonly hierarchy?: ScopeHierarchy,\n\t) {\n\t\tthis.bus.subscribe(this.listener);\n\t}\n\n\tdispose(): void {\n\t\tthis.bus.unsubscribe(this.listener);\n\t}\n\n\tget(key: string, scope: Scope): Value | undefined {\n\t\tif (this.options.enabled === false) return undefined;\n\t\tconst cacheKey = this.keyFor(key, scope);\n\t\tconst entry = this.store.get(cacheKey);\n\t\tif (!entry) return undefined;\n\t\tif (entry.expiresAt <= Date.now()) {\n\t\t\tthis.store.delete(cacheKey);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn entry.value;\n\t}\n\n\tset(key: string, scope: Scope, value: Value): void {\n\t\tif (this.options.enabled === false) return;\n\t\tconst cacheKey = this.keyFor(key, scope);\n\t\tif (\n\t\t\t!this.store.has(cacheKey) &&\n\t\t\tthis.store.size >= (this.options.maxEntries ?? DEFAULT_MAX_ENTRIES)\n\t\t) {\n\t\t\tconst oldest = this.store.keys().next().value;\n\t\t\tif (oldest !== undefined) this.store.delete(oldest);\n\t\t}\n\t\tconst ttlMs = this.options.ttlMs ?? DEFAULT_TTL_MS;\n\t\tthis.store.set(cacheKey, {\n\t\t\tkey,\n\t\t\tscopeKind: scope.kind,\n\t\t\tscopeRefId: scope.refId,\n\t\t\tvalue,\n\t\t\texpiresAt: Date.now() + ttlMs,\n\t\t});\n\t}\n\n\tdrop(key: string): void {\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (entry.key === key) this.store.delete(cacheKey);\n\t\t}\n\t}\n\n\tdropAll(): void {\n\t\tthis.store.clear();\n\t}\n\n\tdropForScopes(scopeRefIds: Iterable<string>): void {\n\t\tconst targets = new Set(scopeRefIds);\n\t\tif (targets.size === 0) return;\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (entry.scopeRefId !== null && targets.has(entry.scopeRefId)) {\n\t\t\t\tthis.store.delete(cacheKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate dropScoped(key: string, scopeRefIds: Iterable<string>): void {\n\t\tconst targets = new Set(scopeRefIds);\n\t\tfor (const [cacheKey, entry] of this.store) {\n\t\t\tif (\n\t\t\t\tentry.key === key &&\n\t\t\t\tentry.scopeRefId !== null &&\n\t\t\t\ttargets.has(entry.scopeRefId)\n\t\t\t) {\n\t\t\t\tthis.store.delete(cacheKey);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async onChange(event: ChangeEvent): Promise<void> {\n\t\tif (this.hierarchy && event.scopeRefId !== null) {\n\t\t\tconst descendants = await this.hierarchy\n\t\t\t\t.descendants(event.scopeRefId)\n\t\t\t\t.catch(() => null);\n\t\t\tif (descendants !== null) {\n\t\t\t\tthis.dropScoped(event.key, descendants);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.drop(event.key);\n\t}\n\n\tprivate keyFor(key: string, scope: Scope): string {\n\t\treturn JSON.stringify([key, scope.kind, scope.refId]);\n\t}\n}\n","import { CycleError } from '../core/errors';\nimport type { ScopeHierarchy } from '../core/types';\n\nexport class LocalScopeHierarchy implements ScopeHierarchy {\n\tprivate readonly parentOf = new Map<string, string | null>();\n\tprivate readonly childrenOf = new Map<string, Set<string>>();\n\n\tasync chain(id: string): Promise<string[]> {\n\t\tconst result: string[] = [];\n\t\tconst seen = new Set<string>();\n\t\tlet current: string | null = id;\n\t\twhile (current !== null) {\n\t\t\tif (seen.has(current)) break;\n\t\t\tseen.add(current);\n\t\t\tresult.push(current);\n\t\t\tcurrent = this.parentOf.get(current) ?? null;\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync descendants(id: string): Promise<string[]> {\n\t\tconst result: string[] = [];\n\t\tconst stack = [id];\n\t\tconst seen = new Set<string>();\n\t\twhile (stack.length > 0) {\n\t\t\tconst current = stack.pop()!;\n\t\t\tif (seen.has(current)) continue;\n\t\t\tseen.add(current);\n\t\t\tresult.push(current);\n\t\t\tconst kids = this.childrenOf.get(current);\n\t\t\tif (kids) stack.push(...kids);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync children(id: string): Promise<string[]> {\n\t\treturn [...(this.childrenOf.get(id) ?? [])];\n\t}\n\n\tasync parent(id: string): Promise<string | null> {\n\t\treturn this.parentOf.get(id) ?? null;\n\t}\n\n\tasync attach(id: string, parentId: string | null): Promise<void> {\n\t\tif (parentId !== null) await this.assertNoCycle(id, parentId);\n\t\tconst oldParent = this.parentOf.get(id) ?? null;\n\t\tif (oldParent !== null) this.childrenOf.get(oldParent)?.delete(id);\n\t\tthis.parentOf.set(id, parentId);\n\t\tif (parentId !== null) this.addChild(parentId, id);\n\t\tif (!this.childrenOf.has(id)) this.childrenOf.set(id, new Set());\n\t}\n\n\tasync move(id: string, newParentId: string | null): Promise<void> {\n\t\tif (newParentId !== null) await this.assertNoCycle(id, newParentId);\n\t\tconst oldParent = this.parentOf.get(id) ?? null;\n\t\tif (oldParent !== null) this.childrenOf.get(oldParent)?.delete(id);\n\t\tthis.parentOf.set(id, newParentId);\n\t\tif (newParentId !== null) this.addChild(newParentId, id);\n\t}\n\n\tasync detach(id: string): Promise<void> {\n\t\tconst parentId = this.parentOf.get(id) ?? null;\n\t\tconst kids = [...(this.childrenOf.get(id) ?? [])];\n\t\tfor (const kid of kids) {\n\t\t\tawait this.move(kid, parentId);\n\t\t}\n\t\tif (parentId !== null) this.childrenOf.get(parentId)?.delete(id);\n\t\tthis.parentOf.delete(id);\n\t\tthis.childrenOf.delete(id);\n\t}\n\n\tprivate addChild(parentId: string, id: string): void {\n\t\tif (!this.childrenOf.has(parentId))\n\t\t\tthis.childrenOf.set(parentId, new Set());\n\t\tthis.childrenOf.get(parentId)!.add(id);\n\t}\n\n\tprivate async assertNoCycle(\n\t\tid: string,\n\t\tnewParentId: string,\n\t): Promise<void> {\n\t\tif (\n\t\t\tid === newParentId ||\n\t\t\t(await this.chain(newParentId)).includes(id)\n\t\t) {\n\t\t\tthrow new CycleError(id, newParentId);\n\t\t}\n\t}\n}\n","import type {\n\tAuditRecord,\n\tCreateAuditInput,\n\tCreateDefInput,\n\tCreateValueInput,\n\tFindAuditQuery,\n\tFindChainQuery,\n\tFindValuesQuery,\n\tListValuesQuery,\n\tListValuesResult,\n\tStorageAdapter,\n\tStorageTx,\n} from './storage-port';\nimport type {\n\tDefRecord,\n\tStatus,\n\tValue,\n\tValueRecord,\n\tValueType,\n} from '../core/types';\nimport { NotFoundError } from '../core/errors';\n\ninterface StoredValue extends ValueRecord {\n\tvalidFrom: Date;\n\tvalidTo: Date | null;\n}\n\nfunction toTypedColumns(type: ValueType, value: Value) {\n\treturn {\n\t\tbool: type === 'BOOLEAN' ? (value as boolean) : null,\n\t\tnum: type === 'NUMERIC' ? (value as number) : null,\n\t\ttext: type === 'TEXT' || type === 'ENUM' ? (value as string) : null,\n\t\tjson: type === 'JSON' ? value : null,\n\t\tjsonSet: type === 'JSON',\n\t\tdate: type === 'DATE' ? (value as Date) : null,\n\t};\n}\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n\tprivate defs: DefRecord[] = [];\n\tprivate values: StoredValue[] = [];\n\tprivate auditLog: AuditRecord[] = [];\n\tprivate nextId = 1;\n\tprivate txQueue: Promise<unknown> = Promise.resolve();\n\n\tprivate newId(prefix: string): string {\n\t\treturn `${prefix}-${this.nextId++}`;\n\t}\n\n\tasync findDefs(keys: string[]): Promise<DefRecord[]> {\n\t\tconst result: DefRecord[] = [];\n\t\tfor (const key of keys) {\n\t\t\tconst found = this.latestByStatus(key, ['STABLE', 'DEPRECATED']);\n\t\t\tif (found) result.push(found);\n\t\t}\n\t\treturn result;\n\t}\n\n\tasync findValues(query: FindValuesQuery): Promise<ValueRecord[]> {\n\t\tconst asOf = query.asOf ?? new Date();\n\t\tconst ids = new Set(query.definitionIds);\n\t\treturn this.values.filter(\n\t\t\t(v) =>\n\t\t\t\tids.has(v.definitionId) &&\n\t\t\t\tv.scopeKind === query.scopeKind &&\n\t\t\t\tv.scopeRefId === query.scopeRefId &&\n\t\t\t\tv.validFrom <= asOf &&\n\t\t\t\t(v.validTo === null || v.validTo > asOf),\n\t\t);\n\t}\n\n\tasync findChainValues(query: FindChainQuery): Promise<ValueRecord[]> {\n\t\tconst asOf = query.asOf ?? new Date();\n\t\tconst defIds = new Set(query.definitionIds);\n\t\tconst refIds = new Set(query.chain);\n\t\treturn this.values.filter(\n\t\t\t(v) =>\n\t\t\t\tdefIds.has(v.definitionId) &&\n\t\t\t\tv.scopeRefId !== null &&\n\t\t\t\trefIds.has(v.scopeRefId) &&\n\t\t\t\tv.validFrom <= asOf &&\n\t\t\t\t(v.validTo === null || v.validTo > asOf),\n\t\t);\n\t}\n\n\tasync findDefsByIds(ids: string[]): Promise<DefRecord[]> {\n\t\tconst idSet = new Set(ids);\n\t\treturn this.defs.filter((d) => idSet.has(d.id));\n\t}\n\n\tasync findAnyDef(key: string): Promise<DefRecord | null> {\n\t\treturn this.latestVersion(key) ?? null;\n\t}\n\n\tasync listValues(query: ListValuesQuery): Promise<ListValuesResult> {\n\t\tconst now = new Date();\n\t\tconst active = this.values\n\t\t\t.filter(\n\t\t\t\t(v) =>\n\t\t\t\t\tv.scopeKind === query.scopeKind &&\n\t\t\t\t\tv.scopeRefId === query.scopeRefId &&\n\t\t\t\t\tv.validFrom <= now &&\n\t\t\t\t\t(v.validTo === null || v.validTo > now),\n\t\t\t)\n\t\t\t.sort((a, b) => a.id.localeCompare(b.id));\n\n\t\tconst startIndex = query.cursor\n\t\t\t? active.findIndex((v) => v.id === query.cursor) + 1\n\t\t\t: 0;\n\t\tconst limit = query.limit ?? active.length - startIndex;\n\t\tconst page = active.slice(startIndex, startIndex + limit);\n\t\tconst nextCursor =\n\t\t\tstartIndex + page.length < active.length\n\t\t\t\t? (page[page.length - 1]?.id ?? null)\n\t\t\t\t: null;\n\n\t\treturn { values: page, nextCursor };\n\t}\n\n\tasync findAudit(query: FindAuditQuery): Promise<AuditRecord[]> {\n\t\treturn this.auditLog\n\t\t\t.filter(\n\t\t\t\t(a) =>\n\t\t\t\t\ta.definitionId === query.definitionId &&\n\t\t\t\t\t(query.scopeKind === undefined ||\n\t\t\t\t\t\ta.scopeKind === query.scopeKind) &&\n\t\t\t\t\t(query.scopeRefId === undefined ||\n\t\t\t\t\t\ta.scopeRefId === query.scopeRefId),\n\t\t\t)\n\t\t\t.sort((a, b) => a.at.getTime() - b.at.getTime());\n\t}\n\n\tasync createDef(input: CreateDefInput): Promise<DefRecord> {\n\t\tconst existingVersions = this.defs.filter((d) => d.key === input.key);\n\t\tconst version =\n\t\t\texistingVersions.length > 0\n\t\t\t\t? Math.max(...existingVersions.map((d) => d.version)) + 1\n\t\t\t\t: 1;\n\t\tconst record: DefRecord = {\n\t\t\tid: this.newId('def'),\n\t\t\tkey: input.key,\n\t\t\tversion,\n\t\t\tlabel: input.label,\n\t\t\tdescription: input.description ?? null,\n\t\t\ttype: input.type,\n\t\t\toptions: input.options ?? [],\n\t\t\tmin: input.min ?? null,\n\t\t\tmax: input.max ?? null,\n\t\t\tscopes: input.scopes,\n\t\t\tinherit: input.inherit,\n\t\t\trequired: input.required,\n\t\t\tsecret: input.secret ?? false,\n\t\t\tstatus: input.status ?? 'DRAFT',\n\t\t\tcategory: input.category ?? null,\n\t\t};\n\t\tthis.defs.push(record);\n\t\treturn record;\n\t}\n\n\tasync updateDefStatus(key: string, status: Status): Promise<DefRecord> {\n\t\tconst current = this.latestVersion(key);\n\t\tif (!current) throw new NotFoundError(key);\n\n\t\tconst updated: DefRecord = { ...current, status };\n\t\tthis.defs = this.defs.map((d) => (d === current ? updated : d));\n\t\treturn updated;\n\t}\n\n\tasync listDefs(status?: Status): Promise<DefRecord[]> {\n\t\tconst rows = status\n\t\t\t? this.defs.filter((d) => d.status === status)\n\t\t\t: this.defs;\n\t\treturn [...rows].sort(\n\t\t\t(a, b) =>\n\t\t\t\t(a.category ?? '').localeCompare(b.category ?? '') ||\n\t\t\t\ta.key.localeCompare(b.key),\n\t\t);\n\t}\n\n\tasync transact<T>(fn: (tx: StorageTx) => Promise<T>): Promise<T> {\n\t\tconst run = this.txQueue.then(async () => {\n\t\t\tconst valuesSnapshot = structuredClone(this.values);\n\t\t\tconst auditLogSnapshot = structuredClone(this.auditLog);\n\t\t\ttry {\n\t\t\t\treturn await fn(this.tx());\n\t\t\t} catch (err) {\n\t\t\t\tthis.values = valuesSnapshot;\n\t\t\t\tthis.auditLog = auditLogSnapshot;\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t});\n\t\tthis.txQueue = run.catch(() => {});\n\t\treturn run;\n\t}\n\n\tprivate latestByStatus(\n\t\tkey: string,\n\t\tstatuses: Status[],\n\t): DefRecord | undefined {\n\t\tconst latest = this.latestVersion(key);\n\t\treturn latest && statuses.includes(latest.status) ? latest : undefined;\n\t}\n\n\tprivate latestVersion(key: string): DefRecord | undefined {\n\t\treturn this.defs\n\t\t\t.filter((d) => d.key === key)\n\t\t\t.sort((a, b) => b.version - a.version)[0];\n\t}\n\n\tprivate tx(): StorageTx {\n\t\treturn {\n\t\t\tfindDef: async (key: string) =>\n\t\t\t\tthis.latestByStatus(key, ['STABLE']) ?? null,\n\n\t\t\tfindValue: async (definitionId, scopeKind, scopeRefId) =>\n\t\t\t\tthis.values.find(\n\t\t\t\t\t(v) =>\n\t\t\t\t\t\tv.definitionId === definitionId &&\n\t\t\t\t\t\tv.scopeKind === scopeKind &&\n\t\t\t\t\t\tv.scopeRefId === scopeRefId &&\n\t\t\t\t\t\tv.validTo === null,\n\t\t\t\t) ?? null,\n\n\t\t\tcloseValue: async (id: string) => {\n\t\t\t\tconst row = this.values.find((v) => v.id === id);\n\t\t\t\tif (!row) return;\n\t\t\t\tconst closed: StoredValue = { ...row, validTo: new Date() };\n\t\t\t\tthis.values = this.values.map((v) => (v === row ? closed : v));\n\t\t\t},\n\n\t\t\tcreateValue: async (input: CreateValueInput) => {\n\t\t\t\tconst record: StoredValue = {\n\t\t\t\t\tid: this.newId('val'),\n\t\t\t\t\tdefinitionId: input.definitionId,\n\t\t\t\t\tscopeKind: input.scopeKind,\n\t\t\t\t\tscopeRefId: input.scopeRefId,\n\t\t\t\t\tversion: input.version,\n\t\t\t\t\tvalidFrom: new Date(),\n\t\t\t\t\tvalidTo: null,\n\t\t\t\t\t...toTypedColumns(input.type, input.value),\n\t\t\t\t};\n\t\t\t\tthis.values.push(record);\n\t\t\t\treturn record;\n\t\t\t},\n\n\t\t\tcreateAudit: async (input: CreateAuditInput): Promise<void> => {\n\t\t\t\tthis.auditLog.push({\n\t\t\t\t\t...input,\n\t\t\t\t\tid: this.newId('audit'),\n\t\t\t\t\tat: new Date(),\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t}\n}\n","import type {\n\tDefRecord,\n\tScope,\n\tScopeHierarchy,\n\tValue,\n\tValueRecord,\n} from '../core/types';\nimport { DEFAULT_SCOPE } from '../core/types';\nimport {\n\tCorruptError,\n\tRequiredError,\n\tScopeError,\n\tNotFoundError,\n} from '../core/errors';\nimport type { StorageReader } from '../storage/storage-port';\nimport type { Cache } from '../cache/cache';\n\nexport interface ListAtPage {\n\tentries: Record<string, Value>;\n\tnextCursor: string | null;\n}\n\nexport class Resolver {\n\tconstructor(\n\t\tprivate readonly storage: StorageReader,\n\t\tprivate readonly hierarchy?: ScopeHierarchy,\n\t\tprivate readonly cache?: Cache,\n\t) {}\n\n\tasync get(key: string, scope: Scope, asOf?: Date): Promise<Value> {\n\t\tconst result = await this.getMany([key], scope, asOf);\n\t\treturn result[key];\n\t}\n\n\tasync listAt(\n\t\tscope: Scope,\n\t\topts: { limit?: number; cursor?: string } = {},\n\t): Promise<ListAtPage> {\n\t\tconst { values, nextCursor } = await this.storage.listValues({\n\t\t\tscopeKind: scope.kind,\n\t\t\tscopeRefId: scope.refId,\n\t\t\tlimit: opts.limit,\n\t\t\tcursor: opts.cursor,\n\t\t});\n\t\tif (values.length === 0) return { entries: {}, nextCursor };\n\n\t\tconst defs = await this.storage.findDefsByIds([\n\t\t\t...new Set(values.map((v) => v.definitionId)),\n\t\t]);\n\t\tconst defById = new Map(defs.map((d) => [d.id, d]));\n\n\t\tconst entries: Record<string, Value> = {};\n\t\tfor (const row of values) {\n\t\t\tconst def = defById.get(row.definitionId);\n\t\t\tif (!def) continue;\n\t\t\tentries[def.key] = this.unwrap(def, row);\n\t\t}\n\t\treturn { entries, nextCursor };\n\t}\n\n\tasync getMany(\n\t\tkeys: string[],\n\t\tscope: Scope,\n\t\tasOf?: Date,\n\t): Promise<Record<string, Value>> {\n\t\tconst uniqueKeys = [...new Set(keys)];\n\t\tconst result: Record<string, Value> = {};\n\t\tconst uncached: string[] = [];\n\n\t\tif (asOf === undefined) {\n\t\t\tfor (const key of uniqueKeys) {\n\t\t\t\tconst cached = this.cache?.get(key, scope);\n\t\t\t\tif (cached !== undefined) result[key] = cached;\n\t\t\t\telse uncached.push(key);\n\t\t\t}\n\t\t} else {\n\t\t\tuncached.push(...uniqueKeys);\n\t\t}\n\t\tif (uncached.length === 0) return result;\n\n\t\tconst defByKey = await this.getDefs(uncached);\n\t\tfor (const key of uncached) {\n\t\t\tthis.checkScope(defByKey.get(key)!, scope);\n\t\t}\n\n\t\tconst exactDefs: DefRecord[] = [];\n\t\tconst chainDefs: DefRecord[] = [];\n\t\tfor (const key of uncached) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tconst climbsHierarchy =\n\t\t\t\tdef.inherit !== 'INDEPENDENT' &&\n\t\t\t\tscope.refId !== null &&\n\t\t\t\tthis.hierarchy;\n\t\t\t(climbsHierarchy ? chainDefs : exactDefs).push(def);\n\t\t}\n\n\t\tconst chain =\n\t\t\tchainDefs.length > 0 && scope.refId !== null && this.hierarchy\n\t\t\t\t? await this.hierarchy.chain(scope.refId)\n\t\t\t\t: [];\n\n\t\tconst [exactRows, chainRows] = await Promise.all([\n\t\t\texactDefs.length > 0\n\t\t\t\t? this.storage.findValues({\n\t\t\t\t\t\tdefinitionIds: exactDefs.map((d) => d.id),\n\t\t\t\t\t\tscopeKind: scope.kind,\n\t\t\t\t\t\tscopeRefId: scope.refId,\n\t\t\t\t\t\tasOf,\n\t\t\t\t\t})\n\t\t\t\t: Promise.resolve([] as ValueRecord[]),\n\t\t\tchainDefs.length > 0 && chain.length > 0\n\t\t\t\t? this.storage.findChainValues({\n\t\t\t\t\t\tdefinitionIds: chainDefs.map((d) => d.id),\n\t\t\t\t\t\tchain,\n\t\t\t\t\t\tasOf,\n\t\t\t\t\t})\n\t\t\t\t: Promise.resolve([] as ValueRecord[]),\n\t\t]);\n\n\t\tconst exactByDef = new Map(exactRows.map((r) => [r.definitionId, r]));\n\t\tconst chainByDef = new Map<string, ValueRecord[]>();\n\t\tfor (const row of chainRows) {\n\t\t\tconst list = chainByDef.get(row.definitionId) ?? [];\n\t\t\tlist.push(row);\n\t\t\tchainByDef.set(row.definitionId, list);\n\t\t}\n\t\tconst chainDefIds = new Set(chainDefs.map((d) => d.id));\n\n\t\tconst missing: DefRecord[] = [];\n\t\tfor (const key of uncached) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tlet row: ValueRecord | undefined;\n\t\t\tif (chainDefIds.has(def.id)) {\n\t\t\t\tconst byRef = new Map(\n\t\t\t\t\t(chainByDef.get(def.id) ?? []).map((v) => [\n\t\t\t\t\t\tv.scopeRefId,\n\t\t\t\t\t\tv,\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\tfor (const ref of chain) {\n\t\t\t\t\trow = byRef.get(ref);\n\t\t\t\t\tif (row) break;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trow = exactByDef.get(def.id);\n\t\t\t}\n\t\t\tif (row) {\n\t\t\t\tresult[key] = this.unwrap(def, row);\n\t\t\t\tif (asOf === undefined)\n\t\t\t\t\tthis.cache?.set(key, scope, result[key]);\n\t\t\t} else {\n\t\t\t\tmissing.push(def);\n\t\t\t}\n\t\t}\n\n\t\tif (missing.length > 0)\n\t\t\tawait this.resolveMissing(\n\t\t\t\tmissing,\n\t\t\t\tscope,\n\t\t\t\tuncached,\n\t\t\t\tdefByKey,\n\t\t\t\tresult,\n\t\t\t\tasOf,\n\t\t\t);\n\n\t\treturn result;\n\t}\n\n\tprivate async resolveMissing(\n\t\tmissing: DefRecord[],\n\t\tscope: Scope,\n\t\tkeysInOrder: string[],\n\t\tdefByKey: Map<string, DefRecord>,\n\t\tresult: Record<string, Value>,\n\t\tasOf?: Date,\n\t): Promise<void> {\n\t\tconst defaultRows = await this.storage.findValues({\n\t\t\tdefinitionIds: missing.map((d) => d.id),\n\t\t\tscopeKind: DEFAULT_SCOPE.kind,\n\t\t\tscopeRefId: DEFAULT_SCOPE.refId,\n\t\t\tasOf,\n\t\t});\n\t\tconst defaultByDef = new Map(\n\t\t\tdefaultRows.map((r) => [r.definitionId, r]),\n\t\t);\n\t\tconst missingIds = new Set(missing.map((d) => d.id));\n\n\t\tfor (const key of keysInOrder) {\n\t\t\tconst def = defByKey.get(key)!;\n\t\t\tif (!missingIds.has(def.id)) continue;\n\t\t\tconst row = defaultByDef.get(def.id);\n\t\t\tif (!row) {\n\t\t\t\tthrow new RequiredError(def.key, scope.kind, scope.refId);\n\t\t\t}\n\t\t\tresult[key] = this.unwrap(def, row);\n\t\t\tif (asOf === undefined) this.cache?.set(key, scope, result[key]);\n\t\t}\n\t}\n\n\tprivate async getDefs(keys: string[]): Promise<Map<string, DefRecord>> {\n\t\tconst defs = await this.storage.findDefs(keys);\n\t\tconst byKey = new Map(defs.map((d) => [d.key, d]));\n\t\tfor (const key of keys) {\n\t\t\tif (!byKey.has(key)) throw new NotFoundError(key);\n\t\t}\n\t\treturn byKey;\n\t}\n\n\tprivate checkScope(def: DefRecord, scope: Scope): void {\n\t\tif (scope.kind === 'default') return;\n\t\tif (!def.scopes.includes(scope.kind)) {\n\t\t\tthrow new ScopeError(def.key, scope.kind);\n\t\t}\n\t}\n\n\tprivate unwrap(def: DefRecord, row: ValueRecord): Value {\n\t\tswitch (def.type) {\n\t\t\tcase 'BOOLEAN':\n\t\t\t\tif (row.bool === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.bool;\n\t\t\tcase 'NUMERIC':\n\t\t\t\tif (row.num === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.num;\n\t\t\tcase 'TEXT':\n\t\t\tcase 'ENUM':\n\t\t\t\tif (row.text === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.text;\n\t\t\tcase 'JSON':\n\t\t\t\tif (!row.jsonSet) throw new CorruptError(row.id);\n\t\t\t\treturn row.json as Value;\n\t\t\tcase 'DATE':\n\t\t\t\tif (row.date === null) throw new CorruptError(row.id);\n\t\t\t\treturn row.date;\n\t\t}\n\t}\n}\n","import type { DefRecord, Scope, Value, ValueRecord } from '../core/types';\nimport {\n\tConflictError,\n\tScopeError,\n\tValueError,\n\tNotFoundError,\n} from '../core/errors';\nimport type { StorageAdapter, StorageTx } from '../storage/storage-port';\nimport type { ChangeBus } from '../cache/change-bus';\n\nexport interface SetParams {\n\tkey: string;\n\tscope: Scope;\n\tvalue: Value;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport interface UnsetParams {\n\tkey: string;\n\tscope: Scope;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nconst REDACTED = '[redacted]';\n\nexport class Writer {\n\tconstructor(\n\t\tprivate readonly storage: StorageAdapter,\n\t\tprivate readonly bus?: ChangeBus,\n\t) {}\n\n\tasync set(params: SetParams): Promise<ValueRecord> {\n\t\tconst created = await this.storage.transact((tx) =>\n\t\t\tthis.setInTx(tx, params),\n\t\t);\n\t\tawait this.emit(created, params.key);\n\t\treturn created;\n\t}\n\n\tasync setMany(paramsList: SetParams[]): Promise<ValueRecord[]> {\n\t\tconst created = await this.storage.transact(async (tx) => {\n\t\t\tconst results: ValueRecord[] = [];\n\t\t\tfor (const params of paramsList) {\n\t\t\t\tresults.push(await this.setInTx(tx, params));\n\t\t\t}\n\t\t\treturn results;\n\t\t});\n\t\tawait Promise.all(\n\t\t\tcreated.map((row, i) => this.emit(row, paramsList[i].key)),\n\t\t);\n\t\treturn created;\n\t}\n\n\tprivate async setInTx(\n\t\ttx: StorageTx,\n\t\tparams: SetParams,\n\t): Promise<ValueRecord> {\n\t\tconst def = await tx.findDef(params.key);\n\t\tif (!def) throw new NotFoundError(params.key);\n\n\t\tif (\n\t\t\tparams.scope.kind !== 'default' &&\n\t\t\t!def.scopes.includes(params.scope.kind)\n\t\t) {\n\t\t\tthrow new ScopeError(def.key, params.scope.kind);\n\t\t}\n\n\t\tthis.validate(def, params.value);\n\n\t\tconst current = await tx.findValue(\n\t\t\tdef.id,\n\t\t\tparams.scope.kind,\n\t\t\tparams.scope.refId,\n\t\t);\n\n\t\tconst currentVersion = current?.version ?? 0;\n\t\tconst expected = params.expectedVersion ?? 0;\n\t\tif (currentVersion !== expected) {\n\t\t\tthrow new ConflictError(\n\t\t\t\tdef.key,\n\t\t\t\tparams.scope.kind,\n\t\t\t\tparams.scope.refId,\n\t\t\t);\n\t\t}\n\n\t\tif (current) {\n\t\t\tawait tx.closeValue(current.id);\n\t\t}\n\n\t\tconst created = await tx.createValue({\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: params.scope.kind,\n\t\t\tscopeRefId: params.scope.refId,\n\t\t\tversion: currentVersion + 1,\n\t\t\tauthorId: params.authorId,\n\t\t\treason: params.reason,\n\t\t\ttype: def.type,\n\t\t\tvalue: params.value,\n\t\t});\n\n\t\tawait tx.createAudit({\n\t\t\tvalueId: created.id,\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: created.scopeKind,\n\t\t\tscopeRefId: created.scopeRefId,\n\t\t\taction: current ? 'superseded' : 'created',\n\t\t\tauthorId: params.authorId,\n\t\t\tbefore: current ? this.snapshotOf(def, current) : undefined,\n\t\t\tafter: this.snapshotOf(def, created),\n\t\t\treason: params.reason,\n\t\t});\n\n\t\treturn created;\n\t}\n\n\tasync unset(params: UnsetParams): Promise<void> {\n\t\tconst closed = await this.storage.transact((tx) =>\n\t\t\tthis.unsetInTx(tx, params),\n\t\t);\n\t\tif (closed) await this.emit(closed, params.key);\n\t}\n\n\tprivate async unsetInTx(\n\t\ttx: StorageTx,\n\t\tparams: UnsetParams,\n\t): Promise<ValueRecord | null> {\n\t\tconst def = await tx.findDef(params.key);\n\t\tif (!def) throw new NotFoundError(params.key);\n\n\t\tif (\n\t\t\tparams.scope.kind !== 'default' &&\n\t\t\t!def.scopes.includes(params.scope.kind)\n\t\t) {\n\t\t\tthrow new ScopeError(def.key, params.scope.kind);\n\t\t}\n\n\t\tconst current = await tx.findValue(\n\t\t\tdef.id,\n\t\t\tparams.scope.kind,\n\t\t\tparams.scope.refId,\n\t\t);\n\n\t\tconst currentVersion = current?.version ?? 0;\n\t\tconst expected = params.expectedVersion ?? 0;\n\t\tif (currentVersion !== expected) {\n\t\t\tthrow new ConflictError(\n\t\t\t\tdef.key,\n\t\t\t\tparams.scope.kind,\n\t\t\t\tparams.scope.refId,\n\t\t\t);\n\t\t}\n\t\tif (!current) return null;\n\n\t\tawait tx.closeValue(current.id);\n\t\tawait tx.createAudit({\n\t\t\tvalueId: current.id,\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: current.scopeKind,\n\t\t\tscopeRefId: current.scopeRefId,\n\t\t\taction: 'unset',\n\t\t\tauthorId: params.authorId,\n\t\t\tbefore: this.snapshotOf(def, current),\n\t\t\treason: params.reason,\n\t\t});\n\n\t\treturn current;\n\t}\n\n\tprivate async emit(created: ValueRecord, key: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bus?.publish({\n\t\t\t\tdefinitionId: created.definitionId,\n\t\t\t\tkey,\n\t\t\t\tscopeKind: created.scopeKind,\n\t\t\t\tscopeRefId: created.scopeRefId,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('conftree: change bus publish failed', err);\n\t\t}\n\t}\n\n\tprivate validate(def: DefRecord, value: Value): void {\n\t\tswitch (def.type) {\n\t\t\tcase 'BOOLEAN':\n\t\t\t\tif (typeof value !== 'boolean') {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a boolean`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'NUMERIC': {\n\t\t\t\tif (typeof value !== 'number' || !Number.isFinite(value)) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a finite number`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (def.min !== null && value < def.min) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be >= ${def.min}, got ${value}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (def.max !== null && value > def.max) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be <= ${def.max}, got ${value}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'TEXT':\n\t\t\t\tif (typeof value !== 'string') {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a string`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ENUM':\n\t\t\t\tif (typeof value !== 'string' || !def.options.includes(value)) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" must be one of: ${def.options.join(', ')}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'JSON': {\n\t\t\t\tlet serialized: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tserialized = JSON.stringify(value);\n\t\t\t\t} catch {\n\t\t\t\t\tserialized = undefined;\n\t\t\t\t}\n\t\t\t\tif (serialized === undefined) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a JSON-serializable value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'DATE':\n\t\t\t\tif (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n\t\t\t\t\tthrow new ValueError(\n\t\t\t\t\t\t`Setting \"${def.key}\" expects a valid Date`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate snapshotOf(def: DefRecord, row: ValueRecord) {\n\t\tif (def.secret) {\n\t\t\treturn {\n\t\t\t\tscopeKind: row.scopeKind,\n\t\t\t\tscopeRefId: row.scopeRefId,\n\t\t\t\tversion: row.version,\n\t\t\t\tvalue: REDACTED,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tscopeKind: row.scopeKind,\n\t\t\tscopeRefId: row.scopeRefId,\n\t\t\tversion: row.version,\n\t\t\tbool: row.bool,\n\t\t\tnum: row.num,\n\t\t\ttext: row.text,\n\t\t\tjson: row.jsonSet ? row.json : undefined,\n\t\t\tdate: row.date,\n\t\t};\n\t}\n}\n","import type { Scope } from '../core/types';\nimport { NotFoundError } from '../core/errors';\nimport type { AuditRecord, StorageReader } from '../storage/storage-port';\n\nexport class Auditor {\n\tconstructor(private readonly storage: StorageReader) {}\n\n\tasync history(key: string, scope?: Scope): Promise<AuditRecord[]> {\n\t\tconst def = await this.storage.findAnyDef(key);\n\t\tif (!def) throw new NotFoundError(key);\n\n\t\treturn this.storage.findAudit({\n\t\t\tdefinitionId: def.id,\n\t\t\tscopeKind: scope?.kind,\n\t\t\tscopeRefId: scope?.refId,\n\t\t});\n\t}\n}\n","import type { Cache } from '../cache/cache';\nimport type { ScopeHierarchy } from '../core/types';\n\nexport function withHierarchyInvalidation(\n\thierarchy: ScopeHierarchy,\n\tcache: Cache,\n): ScopeHierarchy {\n\treturn {\n\t\tchain: (id) => hierarchy.chain(id),\n\t\tdescendants: (id) => hierarchy.descendants(id),\n\t\tchildren: (id) => hierarchy.children(id),\n\t\tparent: (id) => hierarchy.parent(id),\n\t\tattach: async (id, parentId) => {\n\t\t\tawait hierarchy.attach(id, parentId);\n\t\t\tcache.dropForScopes(await hierarchy.descendants(id));\n\t\t},\n\t\tmove: async (id, newParentId) => {\n\t\t\tconst descendants = await hierarchy.descendants(id);\n\t\t\tawait hierarchy.move(id, newParentId);\n\t\t\tcache.dropForScopes(descendants);\n\t\t},\n\t\tdetach: async (id) => {\n\t\t\tconst descendants = await hierarchy.descendants(id);\n\t\t\tawait hierarchy.detach(id);\n\t\t\tcache.dropForScopes(descendants);\n\t\t},\n\t};\n}\n","import type { ChangeBus } from '../cache/change-bus';\nimport { LocalBus } from '../cache/change-bus';\nimport type { CacheOptions } from '../cache/cache';\nimport { Cache } from '../cache/cache';\nimport { withHierarchyInvalidation } from './hierarchy-cache-sync';\nimport { MemoryStorageAdapter } from '../storage/memory-storage';\nimport { Resolver } from './resolver';\nimport { LocalScopeHierarchy } from '../hierarchy/scope-hierarchy';\nimport type { StorageAdapter } from '../storage/storage-port';\nimport type { ScopeHierarchy } from '../core/types';\nimport { Writer } from './writer';\nimport { Auditor } from './auditor';\n\nexport interface EngineOptions {\n\tstorage?: StorageAdapter;\n\thierarchy?: ScopeHierarchy;\n\tbus?: ChangeBus;\n\tcache?: CacheOptions | false;\n}\n\nexport interface Engine {\n\tstorage: StorageAdapter;\n\thierarchy: ScopeHierarchy;\n\tbus: ChangeBus;\n\tcache: Cache;\n\tresolver: Resolver;\n\twriter: Writer;\n\tauditor: Auditor;\n}\n\nexport function createEngine(options: EngineOptions = {}): Engine {\n\tconst storage = options.storage ?? new MemoryStorageAdapter();\n\tconst rawHierarchy = options.hierarchy ?? new LocalScopeHierarchy();\n\tconst bus = options.bus ?? new LocalBus();\n\tconst cacheOptions =\n\t\toptions.cache === false ? { enabled: false } : (options.cache ?? {});\n\tconst cache = new Cache(bus, cacheOptions, rawHierarchy);\n\tconst hierarchy = withHierarchyInvalidation(rawHierarchy, cache);\n\tconst resolver = new Resolver(storage, hierarchy, cache);\n\tconst writer = new Writer(storage, bus);\n\tconst auditor = new Auditor(storage);\n\treturn { storage, hierarchy, bus, cache, resolver, writer, auditor };\n}\n","import type { Scope } from '../core/types';\nimport type { Resolver } from '../engine/resolver';\nimport type { SettingScopeKind, SettingValue } from './registry';\n\nexport class TypedResolver<Registry> {\n\tconstructor(private readonly resolver: Resolver) {}\n\n\tget<K extends keyof Registry & string>(\n\t\tkey: K,\n\t\tscope: Scope & { kind: SettingScopeKind<Registry, K> },\n\t\tasOf?: Date,\n\t): Promise<SettingValue<Registry, K>> {\n\t\treturn this.resolver.get(key, scope, asOf) as Promise<\n\t\t\tSettingValue<Registry, K>\n\t\t>;\n\t}\n\n\tasync getMany<K extends readonly (keyof Registry & string)[]>(\n\t\tkeys: K,\n\t\tscope: Scope,\n\t\tasOf?: Date,\n\t): Promise<{ [P in K[number]]: SettingValue<Registry, P> }> {\n\t\tconst result = await this.resolver.getMany([...keys], scope, asOf);\n\t\treturn result as { [P in K[number]]: SettingValue<Registry, P> };\n\t}\n\n\tasync listAt(\n\t\tscope: Scope,\n\t\topts: { limit?: number; cursor?: string } = {},\n\t): Promise<{\n\t\tentries: Partial<{\n\t\t\t[K in keyof Registry & string]: SettingValue<Registry, K>;\n\t\t}>;\n\t\tnextCursor: string | null;\n\t}> {\n\t\tconst page = await this.resolver.listAt(scope, opts);\n\t\treturn page as {\n\t\t\tentries: Partial<{\n\t\t\t\t[K in keyof Registry & string]: SettingValue<Registry, K>;\n\t\t\t}>;\n\t\t\tnextCursor: string | null;\n\t\t};\n\t}\n}\n","import type { Scope, ValueRecord } from '../core/types';\nimport type { SetParams, Writer } from '../engine/writer';\nimport type { SettingScopeKind, SettingValue } from './registry';\n\nexport interface TypedSetParams<Registry, K extends keyof Registry & string> {\n\tkey: K;\n\tscope: Scope & { kind: SettingScopeKind<Registry, K> };\n\tvalue: SettingValue<Registry, K>;\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport interface TypedUnsetParams<Registry, K extends keyof Registry & string> {\n\tkey: K;\n\tscope: Scope & { kind: SettingScopeKind<Registry, K> };\n\texpectedVersion?: number;\n\tauthorId: string;\n\treason?: string;\n}\n\nexport class TypedWriter<Registry> {\n\tconstructor(private readonly writer: Writer) {}\n\n\tset<K extends keyof Registry & string>(\n\t\tparams: TypedSetParams<Registry, K>,\n\t): Promise<ValueRecord> {\n\t\treturn this.writer.set(params as unknown as SetParams);\n\t}\n\n\tsetMany(\n\t\tparamsList: {\n\t\t\t[K in keyof Registry & string]: TypedSetParams<Registry, K>;\n\t\t}[keyof Registry & string][],\n\t): Promise<ValueRecord[]> {\n\t\treturn this.writer.setMany(paramsList as unknown as SetParams[]);\n\t}\n\n\tunset<K extends keyof Registry & string>(\n\t\tparams: TypedUnsetParams<Registry, K>,\n\t): Promise<void> {\n\t\treturn this.writer.unset(params);\n\t}\n}\n","import type { Scope } from '../core/types';\nimport type { Auditor } from '../engine/auditor';\nimport type { AuditRecord } from '../storage/storage-port';\nimport type { SettingScopeKind } from './registry';\n\nexport class TypedAuditor<Registry> {\n\tconstructor(private readonly auditor: Auditor) {}\n\n\thistory<K extends keyof Registry & string>(\n\t\tkey: K,\n\t\tscope?: Scope & { kind: SettingScopeKind<Registry, K> },\n\t): Promise<AuditRecord[]> {\n\t\treturn this.auditor.history(key, scope);\n\t}\n}\n","import type { Engine } from '../engine/engine';\nimport { TypedResolver } from './typed-resolver';\nimport { TypedWriter } from './typed-writer';\nimport { TypedAuditor } from './typed-auditor';\n\nexport interface TypedEngine<Registry> {\n\tresolver: TypedResolver<Registry>;\n\twriter: TypedWriter<Registry>;\n\tauditor: TypedAuditor<Registry>;\n}\n\nexport function createTypedEngine<Registry>(\n\tengine: Engine,\n): TypedEngine<Registry> {\n\treturn {\n\t\tresolver: new TypedResolver<Registry>(engine.resolver),\n\t\twriter: new TypedWriter<Registry>(engine.writer),\n\t\tauditor: new TypedAuditor<Registry>(engine.auditor),\n\t};\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EAEX,cAAc,EAEd,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,SAAS,EACT,MAAM,EAEN,WAAW,EAEX,MAAM,eAAe,CAAC;AAmBvB,qBAAa,oBAAqB,YAAW,cAAc;IAC1D,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,KAAK;IAIP,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAS9C,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAa1D,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAc9D,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIlD,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyB7D,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAaxD,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IA2BpD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAShE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAW/C,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBhE,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EAEX,cAAc,EAEd,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACX,SAAS,EACT,MAAM,EAEN,WAAW,EAEX,MAAM,eAAe,CAAC;AAmBvB,qBAAa,oBAAqB,YAAW,cAAc;IAC1D,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAuC;IAEtD,OAAO,CAAC,KAAK;IAIP,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAS9C,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAa1D,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAc9D,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIlD,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyB7D,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAaxD,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IA2BpD,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAShE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAW/C,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBhE,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,EAAE;CA6CV"}
|
|
@@ -157,8 +157,10 @@ class MemoryStorageAdapter {
|
|
|
157
157
|
v.validTo === null) ?? null,
|
|
158
158
|
closeValue: async (id) => {
|
|
159
159
|
const row = this.values.find((v) => v.id === id);
|
|
160
|
-
if (row)
|
|
161
|
-
|
|
160
|
+
if (!row)
|
|
161
|
+
return;
|
|
162
|
+
const closed = { ...row, validTo: new Date() };
|
|
163
|
+
this.values = this.values.map((v) => (v === row ? closed : v));
|
|
162
164
|
},
|
|
163
165
|
createValue: async (input) => {
|
|
164
166
|
const record = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conftree",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Generic hierarchical configuration engine with arbitrary scopes, inheritance, caching, and audit. Zero required dependencies: works standalone or with any storage/pub-sub backend via simple ports.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|