@grest-ts/config 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/src/GGConfig.d.ts +13 -0
- package/dist/src/GGConfig.d.ts.map +1 -0
- package/dist/src/GGConfig.js +58 -0
- package/dist/src/GGConfig.js.map +1 -0
- package/dist/src/GGConfigKey.d.ts +29 -0
- package/dist/src/GGConfigKey.d.ts.map +1 -0
- package/dist/src/GGConfigKey.js +79 -0
- package/dist/src/GGConfigKey.js.map +1 -0
- package/dist/src/GGConfigLocator.d.ts +35 -0
- package/dist/src/GGConfigLocator.d.ts.map +1 -0
- package/dist/src/GGConfigLocator.js +95 -0
- package/dist/src/GGConfigLocator.js.map +1 -0
- package/dist/src/GGConfigStore.d.ts +24 -0
- package/dist/src/GGConfigStore.d.ts.map +1 -0
- package/dist/src/GGConfigStore.js +89 -0
- package/dist/src/GGConfigStore.js.map +1 -0
- package/dist/src/GG_CONFIG.d.ts +4 -0
- package/dist/src/GG_CONFIG.d.ts.map +1 -0
- package/dist/src/GG_CONFIG.js +3 -0
- package/dist/src/GG_CONFIG.js.map +1 -0
- package/dist/src/assureValidConfigPath.d.ts +12 -0
- package/dist/src/assureValidConfigPath.d.ts.map +1 -0
- package/dist/src/assureValidConfigPath.js +35 -0
- package/dist/src/assureValidConfigPath.js.map +1 -0
- package/dist/src/index-node.d.ts +12 -0
- package/dist/src/index-node.d.ts.map +1 -0
- package/dist/src/index-node.js +12 -0
- package/dist/src/index-node.js.map +1 -0
- package/dist/src/keys/GGResource.d.ts +9 -0
- package/dist/src/keys/GGResource.d.ts.map +1 -0
- package/dist/src/keys/GGResource.js +14 -0
- package/dist/src/keys/GGResource.js.map +1 -0
- package/dist/src/keys/GGSecret.d.ts +9 -0
- package/dist/src/keys/GGSecret.d.ts.map +1 -0
- package/dist/src/keys/GGSecret.js +14 -0
- package/dist/src/keys/GGSecret.js.map +1 -0
- package/dist/src/keys/GGSetting.d.ts +11 -0
- package/dist/src/keys/GGSetting.d.ts.map +1 -0
- package/dist/src/keys/GGSetting.js +20 -0
- package/dist/src/keys/GGSetting.js.map +1 -0
- package/dist/src/stores/GGConfigStoreFile.d.ts +17 -0
- package/dist/src/stores/GGConfigStoreFile.d.ts.map +1 -0
- package/dist/src/stores/GGConfigStoreFile.js +62 -0
- package/dist/src/stores/GGConfigStoreFile.js.map +1 -0
- package/dist/src/stores/GGConfigStoreLocal.d.ts +54 -0
- package/dist/src/stores/GGConfigStoreLocal.d.ts.map +1 -0
- package/dist/src/stores/GGConfigStoreLocal.js +76 -0
- package/dist/src/stores/GGConfigStoreLocal.js.map +1 -0
- package/dist/src/tsconfig.json +16 -0
- package/dist/testkit/GGConfigCommands.d.ts +18 -0
- package/dist/testkit/GGConfigCommands.d.ts.map +1 -0
- package/dist/testkit/GGConfigCommands.js +42 -0
- package/dist/testkit/GGConfigCommands.js.map +1 -0
- package/dist/testkit/GGConfigTestComponent.d.ts +9 -0
- package/dist/testkit/GGConfigTestComponent.d.ts.map +1 -0
- package/dist/testkit/GGConfigTestComponent.js +20 -0
- package/dist/testkit/GGConfigTestComponent.js.map +1 -0
- package/dist/testkit/GGConfigTestStore.d.ts +23 -0
- package/dist/testkit/GGConfigTestStore.d.ts.map +1 -0
- package/dist/testkit/GGConfigTestStore.js +85 -0
- package/dist/testkit/GGConfigTestStore.js.map +1 -0
- package/dist/testkit/GGTestSelectorConfig.d.ts +22 -0
- package/dist/testkit/GGTestSelectorConfig.d.ts.map +1 -0
- package/dist/testkit/GGTestSelectorConfig.js +57 -0
- package/dist/testkit/GGTestSelectorConfig.js.map +1 -0
- package/dist/testkit/index-testkit.d.ts +5 -0
- package/dist/testkit/index-testkit.d.ts.map +1 -0
- package/dist/testkit/index-testkit.js +5 -0
- package/dist/testkit/index-testkit.js.map +1 -0
- package/dist/tsconfig.publish.tsbuildinfo +1 -0
- package/package.json +59 -0
- package/src/GGConfig.ts +70 -0
- package/src/GGConfigKey.ts +107 -0
- package/src/GGConfigLocator.ts +112 -0
- package/src/GGConfigStore.ts +100 -0
- package/src/GG_CONFIG.ts +4 -0
- package/src/assureValidConfigPath.spec.ts +140 -0
- package/src/assureValidConfigPath.ts +34 -0
- package/src/index-node.ts +11 -0
- package/src/keys/GGResource.ts +20 -0
- package/src/keys/GGSecret.ts +20 -0
- package/src/keys/GGSetting.ts +28 -0
- package/src/stores/GGConfigStoreFile.ts +69 -0
- package/src/stores/GGConfigStoreLocal.ts +110 -0
- package/src/tsconfig.json +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './GGConfig.js';
|
|
2
|
+
export * from './GG_CONFIG.js';
|
|
3
|
+
export * from './GGConfigLocator.js';
|
|
4
|
+
export * from "./GGConfigKey.js";
|
|
5
|
+
export * from "./GGConfigStore.js";
|
|
6
|
+
export * from "./stores/GGConfigStoreFile.js";
|
|
7
|
+
export * from "./stores/GGConfigStoreLocal.js";
|
|
8
|
+
export * from "./keys/GGSetting.js";
|
|
9
|
+
export * from "./keys/GGSecret.js";
|
|
10
|
+
export * from "./keys/GGResource.js";
|
|
11
|
+
export { assureValidConfigPath } from "./assureValidConfigPath.js";
|
|
12
|
+
//# sourceMappingURL=index-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node.js","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GGConfigKey } from "../GGConfigKey";
|
|
2
|
+
import { GGValidator } from "@grest-ts/schema";
|
|
3
|
+
export declare class GGResource<T> extends GGConfigKey<T> {
|
|
4
|
+
static readonly NAME = "[GGResource]";
|
|
5
|
+
constructor(name: string, schema: GGValidator<T>, description: string);
|
|
6
|
+
getStoreKey(): string;
|
|
7
|
+
get(): T;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GGResource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGResource.d.ts","sourceRoot":"","sources":["../../../src/keys/GGResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAE7C,gBAAuB,IAAI,kBAAkB;gBAEjC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM;IAI9D,WAAW,IAAI,MAAM;IAIrB,GAAG,IAAI,CAAC;CAIlB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GGConfigKey } from "../GGConfigKey.js";
|
|
2
|
+
export class GGResource extends GGConfigKey {
|
|
3
|
+
static NAME = "[GGResource]";
|
|
4
|
+
constructor(name, schema, description) {
|
|
5
|
+
super(name, schema, description);
|
|
6
|
+
}
|
|
7
|
+
getStoreKey() {
|
|
8
|
+
return GGResource.NAME;
|
|
9
|
+
}
|
|
10
|
+
get() {
|
|
11
|
+
return this.getValue();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=GGResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGResource.js","sourceRoot":"","sources":["../../../src/keys/GGResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAG3C,MAAM,OAAO,UAAc,SAAQ,WAAc;IAEtC,MAAM,CAAU,IAAI,GAAG,cAAc,CAAC;IAE7C,YAAY,IAAY,EAAE,MAAsB,EAAE,WAAmB;QACjE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC;IAEM,WAAW;QACd,OAAO,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GGConfigKey } from "../GGConfigKey";
|
|
2
|
+
import { GGValidator } from "@grest-ts/schema";
|
|
3
|
+
export declare class GGSecret<T> extends GGConfigKey<T> {
|
|
4
|
+
static readonly NAME = "[GGSecret]";
|
|
5
|
+
constructor(name: string, schema: GGValidator<T>, description: string);
|
|
6
|
+
getStoreKey(): string;
|
|
7
|
+
reveal(): T;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GGSecret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSecret.d.ts","sourceRoot":"","sources":["../../../src/keys/GGSecret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,QAAQ,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAE3C,gBAAuB,IAAI,gBAAgB;gBAE/B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM;IAI9D,WAAW,IAAI,MAAM;IAIrB,MAAM,IAAI,CAAC;CAIrB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GGConfigKey } from "../GGConfigKey.js";
|
|
2
|
+
export class GGSecret extends GGConfigKey {
|
|
3
|
+
static NAME = "[GGSecret]";
|
|
4
|
+
constructor(name, schema, description) {
|
|
5
|
+
super(name, schema, description);
|
|
6
|
+
}
|
|
7
|
+
getStoreKey() {
|
|
8
|
+
return GGSecret.NAME;
|
|
9
|
+
}
|
|
10
|
+
reveal() {
|
|
11
|
+
return this.getValue();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=GGSecret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSecret.js","sourceRoot":"","sources":["../../../src/keys/GGSecret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAG3C,MAAM,OAAO,QAAY,SAAQ,WAAc;IAEpC,MAAM,CAAU,IAAI,GAAG,YAAY,CAAC;IAE3C,YAAY,IAAY,EAAE,MAAsB,EAAE,WAAmB;QACjE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC;IAEM,WAAW;QACd,OAAO,QAAQ,CAAC,IAAI,CAAA;IACxB,CAAC;IAEM,MAAM;QACT,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { GGConfigKey, Widen } from "../GGConfigKey";
|
|
2
|
+
import { GGValidator } from "@grest-ts/schema";
|
|
3
|
+
export declare class GGSetting<T> extends GGConfigKey<T> {
|
|
4
|
+
#private;
|
|
5
|
+
static readonly NAME = "[GGSetting]";
|
|
6
|
+
constructor(name: string, schema: GGValidator<T>, defaultValue: Widen<T>, description: string);
|
|
7
|
+
getDefault(): T;
|
|
8
|
+
getStoreKey(): string;
|
|
9
|
+
get(): T;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=GGSetting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSetting.d.ts","sourceRoot":"","sources":["../../../src/keys/GGSetting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;;IAE5C,gBAAuB,IAAI,iBAAiB;gBAIhC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM;IAK7E,UAAU,IAAI,CAAC;IAIxB,WAAW,IAAI,MAAM;IAIrB,GAAG,IAAI,CAAC;CAIlB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GGConfigKey } from "../GGConfigKey.js";
|
|
2
|
+
import { deepFreeze } from "@grest-ts/common";
|
|
3
|
+
export class GGSetting extends GGConfigKey {
|
|
4
|
+
static NAME = "[GGSetting]";
|
|
5
|
+
#default;
|
|
6
|
+
constructor(name, schema, defaultValue, description) {
|
|
7
|
+
super(name, schema, description);
|
|
8
|
+
this.#default = deepFreeze(defaultValue);
|
|
9
|
+
}
|
|
10
|
+
getDefault() {
|
|
11
|
+
return this.#default;
|
|
12
|
+
}
|
|
13
|
+
getStoreKey() {
|
|
14
|
+
return GGSetting.NAME;
|
|
15
|
+
}
|
|
16
|
+
get() {
|
|
17
|
+
return this.getValue();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=GGSetting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSetting.js","sourceRoot":"","sources":["../../../src/keys/GGSetting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAQ,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAG5C,MAAM,OAAO,SAAa,SAAQ,WAAc;IAErC,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC;IAEnC,QAAQ,CAAI;IAErB,YAAY,IAAY,EAAE,MAAsB,EAAE,YAAsB,EAAE,WAAmB;QACzF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,YAAiB,CAAC,CAAC;IAClD,CAAC;IAEe,UAAU;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,WAAW;QACd,OAAO,SAAS,CAAC,IAAI,CAAA;IACzB,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GGConfigStore } from "../GGConfigStore";
|
|
2
|
+
import { GGConfigKey } from "../GGConfigKey";
|
|
3
|
+
/**
|
|
4
|
+
* Local file-based settings strategy.
|
|
5
|
+
* Reads settings from settings.json in the config directory.
|
|
6
|
+
* Watches file for changes and automatically reloads.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GGConfigStoreFile<Key extends GGConfigKey> extends GGConfigStore<Key> {
|
|
9
|
+
#private;
|
|
10
|
+
private readonly file;
|
|
11
|
+
constructor(file: string, moduleUrl?: string);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
teardown(): Promise<void>;
|
|
14
|
+
refresh(isInitialLoad: boolean): Promise<void>;
|
|
15
|
+
getValue<T>(key: GGConfigKey<T>): T;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=GGConfigStoreFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigStoreFile.d.ts","sourceRoot":"","sources":["../../../src/stores/GGConfigStoreFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAI3C;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,GAAG,SAAS,WAAW,CAAE,SAAQ,aAAa,CAAC,GAAG,CAAC;;IAE9E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAKlB,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAMtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQlC,OAAO,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;CAI7C"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { GGConfigStore } from "../GGConfigStore.js";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
/**
|
|
6
|
+
* Local file-based settings strategy.
|
|
7
|
+
* Reads settings from settings.json in the config directory.
|
|
8
|
+
* Watches file for changes and automatically reloads.
|
|
9
|
+
*/
|
|
10
|
+
export class GGConfigStoreFile extends GGConfigStore {
|
|
11
|
+
file;
|
|
12
|
+
#watcher = null;
|
|
13
|
+
#debounceTimer = null;
|
|
14
|
+
#valuesCache = new Map();
|
|
15
|
+
constructor(file, moduleUrl) {
|
|
16
|
+
super();
|
|
17
|
+
const prefix = moduleUrl ? dirname(fileURLToPath(moduleUrl)) : "";
|
|
18
|
+
this.file = join(prefix, file);
|
|
19
|
+
}
|
|
20
|
+
async start() {
|
|
21
|
+
await super.start();
|
|
22
|
+
await this.refresh(true);
|
|
23
|
+
this.#watcher = fs.watch(this.file, (eventType) => {
|
|
24
|
+
if (eventType === 'change') {
|
|
25
|
+
if (this.#debounceTimer)
|
|
26
|
+
clearTimeout(this.#debounceTimer);
|
|
27
|
+
// Adding debounce so file writes would have time to correctly complete.
|
|
28
|
+
this.#debounceTimer = setTimeout(() => this.refresh(false), 100);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async teardown() {
|
|
33
|
+
if (this.#watcher) {
|
|
34
|
+
this.#watcher.close();
|
|
35
|
+
this.#watcher = null;
|
|
36
|
+
}
|
|
37
|
+
await super.teardown();
|
|
38
|
+
}
|
|
39
|
+
async refresh(isInitialLoad) {
|
|
40
|
+
const fileContent = fs.readFileSync(this.file, 'utf-8');
|
|
41
|
+
if (!fileContent) {
|
|
42
|
+
throw new Error("Settings file is empty! Why is that?");
|
|
43
|
+
}
|
|
44
|
+
const fileJson = JSON.parse(fileContent);
|
|
45
|
+
this.#valuesCache.clear();
|
|
46
|
+
this.keys.forEach(key => {
|
|
47
|
+
const path = key.name.split("/");
|
|
48
|
+
let val = undefined;
|
|
49
|
+
if (path.length > 1) {
|
|
50
|
+
val = fileJson;
|
|
51
|
+
for (let i = 1; i < path.length; i++) {
|
|
52
|
+
val = val?.[path[i]];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this.#valuesCache.set(key, this.resolveValue(key, val, isInitialLoad));
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
getValue(key) {
|
|
59
|
+
return this.#valuesCache.get(key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=GGConfigStoreFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigStoreFile.js","sourceRoot":"","sources":["../../../src/stores/GGConfigStoreFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { GGConfigStore } from "../GGConfigStore";
|
|
2
|
+
import { GGConfigKey, Widen } from "../GGConfigKey";
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the keys from T that are GGConfigKey instances or objects containing them.
|
|
5
|
+
* Uses a depth limit (D) to prevent infinite recursion on circular types (e.g. GGSchema).
|
|
6
|
+
*/
|
|
7
|
+
type ConfigKeyOf<T, D extends 1[] = []> = D['length'] extends 5 ? never : {
|
|
8
|
+
[K in keyof T]: [T[K]] extends [never] ? never : T[K] extends GGConfigKey<any> ? K : T[K] extends Function ? never : T[K] extends object ? (ConfigKeyOf<T[K], [...D, 1]> extends never ? never : K) : never;
|
|
9
|
+
}[keyof T];
|
|
10
|
+
/**
|
|
11
|
+
* Maps a config definition to the shape of values it expects.
|
|
12
|
+
* GGConfigKey<V> → V, objects with config keys → recurse, everything else → excluded.
|
|
13
|
+
*/
|
|
14
|
+
export type ConfigValues<T, D extends 1[] = []> = D['length'] extends 5 ? never : T extends GGConfigKey<infer V> ? Widen<V> : T extends object ? (ConfigKeyOf<T, D> extends never ? never : {
|
|
15
|
+
[K in ConfigKeyOf<T, D>]: ConfigValues<T[K], [...D, 1]>;
|
|
16
|
+
}) : never;
|
|
17
|
+
/**
|
|
18
|
+
* Type-checks a local config values object against a config definition.
|
|
19
|
+
* Returns the values object as-is — this is a compile-time helper, not a store.
|
|
20
|
+
*
|
|
21
|
+
* Use with GGConfigStoreLocal in your runtime's compose():
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // config/local.ts — just data:
|
|
25
|
+
* export default createLocalConfig(MyConfig, {
|
|
26
|
+
* mysql: {
|
|
27
|
+
* host: { host: "localhost", port: 3306, database: "mydb" },
|
|
28
|
+
* user: { username: "root", password: "root" },
|
|
29
|
+
* },
|
|
30
|
+
* jwtSecret: "dev-secret",
|
|
31
|
+
* })
|
|
32
|
+
*
|
|
33
|
+
* // runtime.ts — fresh store per compose():
|
|
34
|
+
* import localConfig from "./config/local.js";
|
|
35
|
+
* new GGConfigLocator(MyConfig)
|
|
36
|
+
* .add([GGResource, GGSecret], new GGConfigStoreLocal(MyConfig, localConfig))
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function createLocalConfig<T extends object>(_config: T, values: ConfigValues<T>): ConfigValues<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Type-safe local development config store.
|
|
42
|
+
* Refuses to start in production — crashes immediately if NODE_ENV is "production".
|
|
43
|
+
* Use createLocalConfig() for the best DX, or .set() for manual control.
|
|
44
|
+
*/
|
|
45
|
+
export declare class GGConfigStoreLocal<Struct extends object, Key extends GGConfigKey = GGConfigKey> extends GGConfigStore<Key> {
|
|
46
|
+
#private;
|
|
47
|
+
constructor(config: Struct, values: ConfigValues<Struct>);
|
|
48
|
+
set<T>(key: GGConfigKey<T>, value: T): this;
|
|
49
|
+
start(): Promise<void>;
|
|
50
|
+
teardown(): Promise<void>;
|
|
51
|
+
getValue<T>(key: GGConfigKey<T>): T;
|
|
52
|
+
}
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=GGConfigStoreLocal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigStoreLocal.d.ts","sourceRoot":"","sources":["../../../src/stores/GGConfigStoreLocal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAGlD;;;GAGG;AACH,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAC1C,CAAC,CAAC,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,KAAK,GACzB,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK;CACrG,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAC1C,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,GACzB,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GACrC,CAAC,SAAS,MAAM,GAAG,CACf,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG;KAAG,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;CAAE,CACpG,GAAG,KAAK,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAGxG;AAED;;;;GAIG;AACH,qBAAa,kBAAkB,CAAC,MAAM,SAAS,MAAM,EAAE,GAAG,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,GAAG,CAAC;;gBAKxG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;IAKjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAK5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;CAI7C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { GGConfigStore } from "../GGConfigStore.js";
|
|
2
|
+
import { GGConfigKey } from "../GGConfigKey.js";
|
|
3
|
+
import { deepFreeze } from "@grest-ts/common";
|
|
4
|
+
/**
|
|
5
|
+
* Type-checks a local config values object against a config definition.
|
|
6
|
+
* Returns the values object as-is — this is a compile-time helper, not a store.
|
|
7
|
+
*
|
|
8
|
+
* Use with GGConfigStoreLocal in your runtime's compose():
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // config/local.ts — just data:
|
|
12
|
+
* export default createLocalConfig(MyConfig, {
|
|
13
|
+
* mysql: {
|
|
14
|
+
* host: { host: "localhost", port: 3306, database: "mydb" },
|
|
15
|
+
* user: { username: "root", password: "root" },
|
|
16
|
+
* },
|
|
17
|
+
* jwtSecret: "dev-secret",
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* // runtime.ts — fresh store per compose():
|
|
21
|
+
* import localConfig from "./config/local.js";
|
|
22
|
+
* new GGConfigLocator(MyConfig)
|
|
23
|
+
* .add([GGResource, GGSecret], new GGConfigStoreLocal(MyConfig, localConfig))
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function createLocalConfig(_config, values) {
|
|
27
|
+
deepFreeze(values);
|
|
28
|
+
return values;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Type-safe local development config store.
|
|
32
|
+
* Refuses to start in production — crashes immediately if NODE_ENV is "production".
|
|
33
|
+
* Use createLocalConfig() for the best DX, or .set() for manual control.
|
|
34
|
+
*/
|
|
35
|
+
export class GGConfigStoreLocal extends GGConfigStore {
|
|
36
|
+
#values = new Map();
|
|
37
|
+
#valuesCache = new Map();
|
|
38
|
+
constructor(config, values) {
|
|
39
|
+
super();
|
|
40
|
+
walkAndSet(this, config, values);
|
|
41
|
+
}
|
|
42
|
+
set(key, value) {
|
|
43
|
+
this.#values.set(key, value);
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
async start() {
|
|
47
|
+
if (process.env.NODE_ENV === "production") {
|
|
48
|
+
throw new Error("GGConfigStoreLocal cannot be used in production. " +
|
|
49
|
+
"Use GGConfigStoreAwsSecretsManager or another production-safe store.");
|
|
50
|
+
}
|
|
51
|
+
this.keys.forEach(key => {
|
|
52
|
+
this.#valuesCache.set(key, this.resolveValue(key, this.#values.get(key), true));
|
|
53
|
+
});
|
|
54
|
+
await super.start();
|
|
55
|
+
}
|
|
56
|
+
async teardown() {
|
|
57
|
+
this.#valuesCache.clear();
|
|
58
|
+
await super.teardown();
|
|
59
|
+
}
|
|
60
|
+
getValue(key) {
|
|
61
|
+
return this.#valuesCache.get(key);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function walkAndSet(store, config, values) {
|
|
65
|
+
for (const prop of Object.keys(values)) {
|
|
66
|
+
const configEntry = config[prop];
|
|
67
|
+
const value = values[prop];
|
|
68
|
+
if (configEntry instanceof GGConfigKey) {
|
|
69
|
+
store.set(configEntry, value);
|
|
70
|
+
}
|
|
71
|
+
else if (configEntry != null && typeof configEntry === 'object' && value != null && typeof value === 'object') {
|
|
72
|
+
walkAndSet(store, configEntry, value);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=GGConfigStoreLocal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigStoreLocal.js","sourceRoot":"","sources":["../../../src/stores/GGConfigStoreLocal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAQ,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAwB5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAAmB,OAAU,EAAE,MAAuB;IACnF,UAAU,CAAC,MAAM,CAAC,CAAA;IAClB,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAiF,SAAQ,aAAkB;IAE3G,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC1C,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IAExD,YAAY,MAAc,EAAE,MAA4B;QACpD,KAAK,EAAE,CAAC;QACR,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CAAI,GAAmB,EAAE,KAAQ;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,KAAK,CAAC,KAAK;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACX,mDAAmD;gBACnD,sEAAsE,CACzE,CAAC;QACN,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEe,KAAK,CAAC,QAAQ;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEM,QAAQ,CAAI,GAAmB;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;IAC3C,CAAC;CAEJ;AAED,SAAS,UAAU,CAAC,KAA8B,EAAE,MAAW,EAAE,MAAW;IACxE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,WAAW,YAAY,WAAW,EAAE,CAAC;YACrC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9G,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ConfigUpdatePayload {
|
|
2
|
+
storeName: string;
|
|
3
|
+
keyName: string;
|
|
4
|
+
value: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface ConfigGetPayload {
|
|
7
|
+
storeName: string;
|
|
8
|
+
keyName: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const GGConfigIPC: {
|
|
11
|
+
worker: {
|
|
12
|
+
update: import("@grest-ts/ipc").IPCClientRequest<ConfigUpdatePayload, void>;
|
|
13
|
+
replace: import("@grest-ts/ipc").IPCClientRequest<ConfigUpdatePayload, void>;
|
|
14
|
+
get: import("@grest-ts/ipc").IPCClientRequest<ConfigGetPayload, unknown>;
|
|
15
|
+
resetAfterTest: import("@grest-ts/ipc").IPCClientRequest<void, void>;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=GGConfigCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigCommands.d.ts","sourceRoot":"","sources":["../../testkit/GGConfigCommands.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,WAAW;;;;;;;CAOvB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GG_TEST_RUNTIME_WORKER, GGTestRuntimeWorker } from "@grest-ts/testkit";
|
|
2
|
+
import { IPCClient } from "@grest-ts/ipc";
|
|
3
|
+
import { GGConfigTestStore } from "./GGConfigTestStore.js";
|
|
4
|
+
import { GGConfigKey } from "../src/GGConfigKey.js";
|
|
5
|
+
import { GG_CONFIG } from "../src/GG_CONFIG.js";
|
|
6
|
+
export const GGConfigIPC = {
|
|
7
|
+
worker: {
|
|
8
|
+
update: IPCClient.defineRequest("config.update"),
|
|
9
|
+
replace: IPCClient.defineRequest("config.replace"),
|
|
10
|
+
get: IPCClient.defineRequest("config.get"),
|
|
11
|
+
resetAfterTest: IPCClient.defineRequest("config.resetAfterTest"),
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
// Register handler - safe at module load time, executed during worker.start()
|
|
15
|
+
GGTestRuntimeWorker.onBeforeRuntimeStart(() => {
|
|
16
|
+
const worker = GG_TEST_RUNTIME_WORKER.get();
|
|
17
|
+
const getStore = (storeName) => {
|
|
18
|
+
const store = GG_CONFIG.get().getStoreByConfigKeyName(storeName);
|
|
19
|
+
if (!(store instanceof GGConfigTestStore))
|
|
20
|
+
throw new Error("Store is not wrapped with GGConfigTestStore");
|
|
21
|
+
return store;
|
|
22
|
+
};
|
|
23
|
+
worker.ipcClient.onFrameworkRequest(GGConfigIPC.worker.get, async (payload) => {
|
|
24
|
+
worker.runtime.scope.enter();
|
|
25
|
+
return getStore(payload.storeName).getValue(GGConfigKey.getKey(payload.keyName));
|
|
26
|
+
});
|
|
27
|
+
worker.ipcClient.onFrameworkRequest(GGConfigIPC.worker.update, async (payload) => {
|
|
28
|
+
worker.runtime.scope.enter();
|
|
29
|
+
await getStore(payload.storeName).updateValueOverride(GGConfigKey.getKey(payload.keyName), payload.value);
|
|
30
|
+
});
|
|
31
|
+
worker.ipcClient.onFrameworkRequest(GGConfigIPC.worker.replace, async (payload) => {
|
|
32
|
+
worker.runtime.scope.enter();
|
|
33
|
+
await getStore(payload.storeName).replaceValueOverride(GGConfigKey.getKey(payload.keyName), payload.value);
|
|
34
|
+
});
|
|
35
|
+
worker.ipcClient.onFrameworkRequest(GGConfigIPC.worker.resetAfterTest, async () => {
|
|
36
|
+
worker.runtime.scope.enter();
|
|
37
|
+
for (const store of GG_CONFIG.get().getStores().values()) {
|
|
38
|
+
await store.resetAfterTest();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=GGConfigCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigCommands.js","sourceRoot":"","sources":["../../testkit/GGConfigCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAE,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAa3C,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,MAAM,EAAE;QACJ,MAAM,EAAE,SAAS,CAAC,aAAa,CAA4B,eAAe,CAAC;QAC3E,OAAO,EAAE,SAAS,CAAC,aAAa,CAA4B,gBAAgB,CAAC;QAC7E,GAAG,EAAE,SAAS,CAAC,aAAa,CAA4B,YAAY,CAAC;QACrE,cAAc,EAAE,SAAS,CAAC,aAAa,CAAa,uBAAuB,CAAC;KAC/E;CACJ,CAAA;AAED,8EAA8E;AAC9E,mBAAmB,CAAC,oBAAoB,CAAC,GAAG,EAAE;IAC1C,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAqB,EAAE;QACtD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC1G,OAAO,KAAK,CAAC;IACjB,CAAC,CAAA;IAED,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1E,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7E,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9E,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,MAAO,KAA2B,CAAC,cAAc,EAAE,CAAC;QACxD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { GGTestComponent, GGTestRunner } from "@grest-ts/testkit";
|
|
2
|
+
export declare class GGConfigTestComponent implements GGTestComponent {
|
|
3
|
+
private readonly runner;
|
|
4
|
+
private configModifiedInTest;
|
|
5
|
+
constructor(runner: GGTestRunner);
|
|
6
|
+
markConfigModified(): void;
|
|
7
|
+
afterEach(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GGConfigTestComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigTestComponent.d.ts","sourceRoot":"","sources":["../../testkit/GGConfigTestComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAE,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAGhE,qBAAa,qBAAsB,YAAW,eAAe;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,MAAM,EAAE,YAAY;IAIhC,kBAAkB,IAAI,IAAI;IAIpB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAKnC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GGTestRunner } from "@grest-ts/testkit";
|
|
2
|
+
import { GGConfigIPC } from "./GGConfigCommands.js";
|
|
3
|
+
export class GGConfigTestComponent {
|
|
4
|
+
runner;
|
|
5
|
+
configModifiedInTest = false;
|
|
6
|
+
constructor(runner) {
|
|
7
|
+
this.runner = runner;
|
|
8
|
+
}
|
|
9
|
+
markConfigModified() {
|
|
10
|
+
this.configModifiedInTest = true;
|
|
11
|
+
}
|
|
12
|
+
async afterEach() {
|
|
13
|
+
if (!this.configModifiedInTest)
|
|
14
|
+
return;
|
|
15
|
+
await this.runner.sendCommand(GGConfigIPC.worker.resetAfterTest, undefined);
|
|
16
|
+
this.configModifiedInTest = false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
GGTestRunner.registerExtension(GGConfigTestComponent);
|
|
20
|
+
//# sourceMappingURL=GGConfigTestComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigTestComponent.js","sourceRoot":"","sources":["../../testkit/GGConfigTestComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAE/C,MAAM,OAAO,qBAAqB;IAEb,MAAM,CAAe;IAC9B,oBAAoB,GAAG,KAAK,CAAC;IAErC,YAAY,MAAoB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,kBAAkB;QACd,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS;QACX,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACtC,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { GGConfigKey } from "../src/GGConfigKey";
|
|
2
|
+
import { ConfigUpdateCallback, GGConfigStore } from "../src/GGConfigStore";
|
|
3
|
+
import { GGTestCommand } from "@grest-ts/testkit";
|
|
4
|
+
import { ConfigUpdatePayload } from "./GGConfigCommands";
|
|
5
|
+
/**
|
|
6
|
+
* Test config store that wraps a parent store and allows overriding values.
|
|
7
|
+
* Overrides validation to always throw (fail fast in tests).
|
|
8
|
+
*/
|
|
9
|
+
export declare class GGConfigTestStore<Key extends GGConfigKey = GGConfigKey> extends GGConfigStore<Key> {
|
|
10
|
+
private readonly wrappedStore;
|
|
11
|
+
private readonly initialConfigOverridesMap;
|
|
12
|
+
private readonly activeConfigOverridesMap;
|
|
13
|
+
constructor(parent: GGConfigStore<Key>, initialOverrides: GGTestCommand<ConfigUpdatePayload>[]);
|
|
14
|
+
setKeys(keys: readonly Key[]): void;
|
|
15
|
+
getValue<T>(key: GGConfigKey<T>): T;
|
|
16
|
+
updateValueOverride(key: GGConfigKey, value: unknown): Promise<void>;
|
|
17
|
+
replaceValueOverride(key: GGConfigKey, value: unknown): Promise<void>;
|
|
18
|
+
resetAfterTest(): Promise<void>;
|
|
19
|
+
watch(key: GGConfigKey, callback: ConfigUpdateCallback): () => void;
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
teardown(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=GGConfigTestStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigTestStore.d.ts","sourceRoot":"","sources":["../../testkit/GGConfigTestStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAyB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAC,oBAAoB,EAAE,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAyB,aAAa,EAAC,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAC,mBAAmB,EAAc,MAAM,oBAAoB,CAAC;AAEpE;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,GAAG,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,GAAG,CAAC;IAE5F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAwC;IAClF,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAwC;gBAErE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE;IAe9E,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI;IAKnC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;IAItC,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAU7D,KAAK;IAKL,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { GGConfigKey } from "../src/GGConfigKey.js";
|
|
2
|
+
import { GGConfigStore } from "../src/GGConfigStore.js";
|
|
3
|
+
import { GGConfigLocator } from "../src/GGConfigLocator.js";
|
|
4
|
+
import { GG_TEST_RUNTIME_WORKER } from "@grest-ts/testkit";
|
|
5
|
+
import { GGConfigIPC } from "./GGConfigCommands.js";
|
|
6
|
+
/**
|
|
7
|
+
* Test config store that wraps a parent store and allows overriding values.
|
|
8
|
+
* Overrides validation to always throw (fail fast in tests).
|
|
9
|
+
*/
|
|
10
|
+
export class GGConfigTestStore extends GGConfigStore {
|
|
11
|
+
wrappedStore;
|
|
12
|
+
initialConfigOverridesMap = new Map();
|
|
13
|
+
activeConfigOverridesMap = new Map();
|
|
14
|
+
constructor(parent, initialOverrides) {
|
|
15
|
+
super();
|
|
16
|
+
this.wrappedStore = parent;
|
|
17
|
+
for (const command of initialOverrides) {
|
|
18
|
+
if (GGConfigKey.hasKey(command.payload.keyName)) {
|
|
19
|
+
const key = GGConfigKey.getKey(command.payload.keyName);
|
|
20
|
+
const value = this.resolveValue(key, command.payload.value, true);
|
|
21
|
+
this.initialConfigOverridesMap.set(key, value);
|
|
22
|
+
this.activeConfigOverridesMap.set(key, value);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// To throw here, we would need to let the test runner know what config keys each service uses so it can target config updates better.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
setKeys(keys) {
|
|
30
|
+
super.setKeys(keys);
|
|
31
|
+
this.wrappedStore.setKeys(keys);
|
|
32
|
+
}
|
|
33
|
+
getValue(key) {
|
|
34
|
+
return this.activeConfigOverridesMap.has(key) ? this.activeConfigOverridesMap.get(key) : this.wrappedStore.getValue(key);
|
|
35
|
+
}
|
|
36
|
+
async updateValueOverride(key, value) {
|
|
37
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
38
|
+
const existingValue = this.activeConfigOverridesMap.get(key) ?? this.wrappedStore.getValue(key);
|
|
39
|
+
if (existingValue !== null && typeof existingValue === 'object' && !Array.isArray(existingValue)) {
|
|
40
|
+
value = { ...existingValue, ...value };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return this.replaceValueOverride(key, value);
|
|
44
|
+
}
|
|
45
|
+
async replaceValueOverride(key, value) {
|
|
46
|
+
this.activeConfigOverridesMap.set(key, this.resolveValue(key, value, false));
|
|
47
|
+
await this.notify(key);
|
|
48
|
+
}
|
|
49
|
+
async resetAfterTest() {
|
|
50
|
+
this.activeConfigOverridesMap.clear();
|
|
51
|
+
for (const [key, value] of this.initialConfigOverridesMap) {
|
|
52
|
+
await this.replaceValueOverride(key, value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
watch(key, callback) {
|
|
56
|
+
this.wrappedStore.watch(key, async () => {
|
|
57
|
+
// We only notify of the change if we don't have overrides. If we have override, then for watcher config value doesn't change.
|
|
58
|
+
if (!this.activeConfigOverridesMap.has(key)) {
|
|
59
|
+
return this.notify(key);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return super.watch(key, callback);
|
|
63
|
+
}
|
|
64
|
+
async start() {
|
|
65
|
+
await this.wrappedStore.start();
|
|
66
|
+
await super.start();
|
|
67
|
+
}
|
|
68
|
+
async teardown() {
|
|
69
|
+
await this.wrappedStore.teardown();
|
|
70
|
+
await super.teardown();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const wrapperMap = new WeakMap();
|
|
74
|
+
GGConfigLocator.prototype.add = function (key, store) {
|
|
75
|
+
store = this._useLocalStoreIfNeeded(store);
|
|
76
|
+
const initialOverrides = GG_TEST_RUNTIME_WORKER.get().getInitialCommandsFor(GGConfigIPC.worker.update);
|
|
77
|
+
let wrapped = wrapperMap.get(store);
|
|
78
|
+
if (!wrapped) {
|
|
79
|
+
wrapped = new GGConfigTestStore(store, initialOverrides);
|
|
80
|
+
wrapperMap.set(store, wrapped);
|
|
81
|
+
}
|
|
82
|
+
this._add(key, wrapped);
|
|
83
|
+
return this;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=GGConfigTestStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGConfigTestStore.js","sourceRoot":"","sources":["../../testkit/GGConfigTestStore.ts"],"names":[],"mappings":"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"}
|