@toa.io/extensions.configuration 1.0.0-alpha.284 → 1.0.0-alpha.286
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/components/configuration.values/manifest.toa.yaml +14 -21
- package/components/configuration.values/migrations/0001-system-properties.yaml +14 -0
- package/components/configuration.values/migrations/0002-indexes.yaml +7 -0
- package/components/configuration.values/operations/create.js +1 -2
- package/components/configuration.values/operations/fetch.js +1 -1
- package/components/configuration.values/operations/get.js +1 -1
- package/components/configuration.values/operations/lib/map.js +1 -1
- package/components/configuration.values/operations/lib/resolve.js +3 -3
- package/components/configuration.values/operations/list.js +1 -1
- package/components/configuration.values/source/create.ts +3 -5
- package/components/configuration.values/source/fetch.ts +12 -10
- package/components/configuration.values/source/get.ts +2 -3
- package/components/configuration.values/source/lib/map.test.ts +7 -2
- package/components/configuration.values/source/lib/map.ts +3 -3
- package/components/configuration.values/source/lib/resolve.ts +9 -6
- package/components/configuration.values/source/list.ts +8 -6
- package/components/configuration.values/tsconfig.tsbuildinfo +1 -1
- package/components/configuration.values/types/toa.d.ts +5 -5
- package/cucumber.mjs +3 -0
- package/features/site/index.html +6 -2
- package/features/steps/UI.ts +20 -13
- package/notes/consistency.md +10 -9
- package/package.json +6 -6
- package/readme.md +15 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/source/Aspect.test.ts +32 -8
- package/source/Aspect.ts +28 -19
- package/source/Client.test.ts +31 -14
- package/source/Client.ts +41 -48
- package/source/Composition.ts +6 -6
- package/source/Factory.ts +7 -7
- package/source/Secret.test.ts +1 -1
- package/source/Secret.ts +5 -5
- package/source/UI.ts +33 -32
- package/source/configuration.test.ts +14 -8
- package/source/configuration.ts +11 -15
- package/source/const.ts +13 -1
- package/source/context.ts +2 -2
- package/source/deployment.test.ts +37 -12
- package/source/deployment.ts +45 -19
- package/source/epoch.test.ts +8 -2
- package/source/epoch.ts +6 -5
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +12 -6
- package/source/manifest.ts +1 -1
- package/transpiled/Aspect.d.ts +2 -1
- package/transpiled/Aspect.js +15 -3
- package/transpiled/Aspect.js.map +1 -1
- package/transpiled/Client.d.ts +1 -1
- package/transpiled/Client.js +8 -2
- package/transpiled/Client.js.map +1 -1
- package/transpiled/Composition.js +2 -2
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Secret.js.map +1 -1
- package/transpiled/UI.js +2 -1
- package/transpiled/UI.js.map +1 -1
- package/transpiled/configuration.js.map +1 -1
- package/transpiled/const.d.ts +8 -1
- package/transpiled/const.js +10 -0
- package/transpiled/const.js.map +1 -1
- package/transpiled/context.d.ts +1 -1
- package/transpiled/context.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +19 -5
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/epoch.js +3 -1
- package/transpiled/epoch.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/ui/dist/_app/immutable/chunks/{mvspXr3J.js → 6fUKYVLr.js} +2 -2
- package/ui/dist/_app/immutable/chunks/{p9RyiXQ-.js → BGxZNgfH.js} +1 -1
- package/ui/dist/_app/immutable/chunks/{Bxde3uE_.js → By3hKJVT.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DamfpXnK.js +1 -0
- package/ui/dist/_app/immutable/chunks/{_I_MUoRn.js → vHown6GG.js} +1 -1
- package/ui/dist/_app/immutable/entry/{app.C1VIepN7.js → app.cjzrCTnf.js} +2 -2
- package/ui/dist/_app/immutable/entry/start.C18omPso.js +1 -0
- package/ui/dist/_app/immutable/nodes/{0.D_0dtFej.js → 0.DjKXI3st.js} +1 -1
- package/ui/dist/_app/immutable/nodes/{1.DFlgHh-H.js → 1.Dh71z_Aw.js} +1 -1
- package/ui/dist/_app/immutable/nodes/{2.BIHgAxXR.js → 2.TzrOmdn2.js} +1 -1
- package/ui/dist/_app/immutable/nodes/3.DlvWZctZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/{4.BZMuJGfA.js → 4.D8kjaqXl.js} +1 -1
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +28 -23
- package/CHANGELOG.md +0 -372
- package/ui/dist/_app/immutable/chunks/BzG-gka8.js +0 -1
- package/ui/dist/_app/immutable/entry/start.BQWCs_Pq.js +0 -1
- package/ui/dist/_app/immutable/nodes/3.R-_yCt5X.js +0 -1
|
@@ -8,27 +8,20 @@ name: values
|
|
|
8
8
|
# prototype's `created` event.
|
|
9
9
|
|
|
10
10
|
entity:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- configuration
|
|
26
|
-
- originator
|
|
27
|
-
index:
|
|
28
|
-
lookup:
|
|
29
|
-
component: asc
|
|
30
|
-
epoch: asc
|
|
31
|
-
_created: desc
|
|
11
|
+
properties:
|
|
12
|
+
component:
|
|
13
|
+
type: string
|
|
14
|
+
epoch:
|
|
15
|
+
type: string
|
|
16
|
+
configuration:
|
|
17
|
+
type: object
|
|
18
|
+
originator:
|
|
19
|
+
type: string
|
|
20
|
+
required:
|
|
21
|
+
- component
|
|
22
|
+
- epoch
|
|
23
|
+
- configuration
|
|
24
|
+
- originator
|
|
32
25
|
|
|
33
26
|
operations:
|
|
34
27
|
# the latest configuration of a component: created, else deployed defaults, else none
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# 1.0.0-alpha.286 renamed the four system properties of a record. A database written before it
|
|
2
|
+
# holds them under the old names, where nothing reads them: such a record is never created,
|
|
3
|
+
# never updated, never deleted, and at version zero.
|
|
4
|
+
#
|
|
5
|
+
# `$rename` leaves a record that has none of them alone, so this is a no-op for a component
|
|
6
|
+
# that has only ever run this release.
|
|
7
|
+
- update:
|
|
8
|
+
filter: {}
|
|
9
|
+
update:
|
|
10
|
+
$rename:
|
|
11
|
+
_version: VERSION
|
|
12
|
+
_created: CREATED
|
|
13
|
+
_updated: UPDATED
|
|
14
|
+
_deleted: DELETED
|
|
@@ -4,7 +4,6 @@ export async function transition(input, object) {
|
|
|
4
4
|
const known = entry(input.component);
|
|
5
5
|
if (known === undefined)
|
|
6
6
|
return new UnknownComponentError(input.component);
|
|
7
|
-
// the schema fills its defaults, so what is stored is whole
|
|
8
7
|
const configuration = structuredClone(input.configuration);
|
|
9
8
|
const schema = schemas.schema(known.schema);
|
|
10
9
|
try {
|
|
@@ -28,4 +27,4 @@ class UnknownComponentError extends Error {
|
|
|
28
27
|
class InvalidConfigurationError extends Error {
|
|
29
28
|
code = 'INVALID_CONFIGURATION';
|
|
30
29
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFHcEMsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsS0FBWSxFQUFFLE1BQWM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUVwQyxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUUxRSxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRTFELE1BQU0sTUFBTSxHQUFnQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUV4RCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxJQUFJLHlCQUF5QixDQUFFLEtBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO0lBQ2xDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQTtJQUMxQixNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtJQUNwQyxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO0lBRXZDLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELE1BQU0scUJBQXNCLFNBQVEsS0FBSztJQUN2QixJQUFJLEdBQUcsbUJBQW1CLENBQUE7SUFFMUMsWUFBbUIsU0FBaUI7UUFDbEMsS0FBSyxDQUFDLGNBQWMsU0FBUyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3JELENBQUM7Q0FDRjtBQUVELE1BQU0seUJBQTBCLFNBQVEsS0FBSztJQUMzQixJQUFJLEdBQUcsdUJBQXVCLENBQUE7Q0FDL0MifQ==
|
|
@@ -10,4 +10,4 @@ export async function computation(input, context) {
|
|
|
10
10
|
};
|
|
11
11
|
}));
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zb3VyY2UvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQTtBQUV4RCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxLQUFhLEVBQUUsT0FBZ0I7SUFDL0QsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUV0RCxPQUFPO1lBQ0wsU0FBUztZQUNULEtBQUs7WUFDTCxhQUFhLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUMxRCxPQUFPLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztTQUM1QyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -16,4 +16,4 @@ export async function computation(input, context) {
|
|
|
16
16
|
epoch: input.epoch ?? known.epoch
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2dldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sa0JBQWtCLENBQUE7QUFFeEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLEtBQVksRUFBRSxPQUFnQjtJQUM5RCxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbEUsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRS9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFcEMsT0FBTztRQUNMLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtRQUNsQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU07UUFDckIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBTSxDQUFDLEtBQUs7S0FDbkMsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -18,4 +18,4 @@ function read() {
|
|
|
18
18
|
let parsed = null;
|
|
19
19
|
let values = {};
|
|
20
20
|
export const VARIABLE = 'TOA_CONFIGURATION_VALUES';
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2xpYi9tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxLQUFLLENBQUMsU0FBaUI7SUFDckMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQsMENBQTBDO0FBQzFDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ25DLENBQUM7QUFFRCxTQUFTLElBQUk7SUFDWCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUU1QyxvRkFBb0Y7SUFDcEYsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDdEIsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFXLENBQUE7UUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUNqQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQTtBQUNoQyxJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUE7QUFFdkIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixDQUFBIn0=
|
|
@@ -11,14 +11,14 @@ export async function resolve(context, component, epoch) {
|
|
|
11
11
|
// one query per pair, so that a component's latest is never behind another's newer ones
|
|
12
12
|
const query = {
|
|
13
13
|
criteria: `component=="${component}";epoch=="${epoch}"`,
|
|
14
|
-
sort: ['
|
|
14
|
+
sort: ['CREATED:desc'],
|
|
15
15
|
limit: 1
|
|
16
16
|
};
|
|
17
17
|
const objects = await context.local.enumerate({ query });
|
|
18
18
|
if (objects.length > 0)
|
|
19
|
-
return { configuration: objects[0].configuration, created: objects[0].
|
|
19
|
+
return { configuration: objects[0].configuration, created: objects[0].CREATED };
|
|
20
20
|
if (known !== undefined && known.epoch === epoch)
|
|
21
21
|
return { configuration: known.defaults ?? {}, created: 0 };
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9saWIvcmVzb2x2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWhDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUMzQixPQUFnQixFQUNoQixTQUFpQixFQUNqQixLQUFjO0lBRWQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRTlCLEtBQUssS0FBSyxLQUFLLEVBQUUsS0FBSyxDQUFBO0lBRXRCLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUVwQyx3RkFBd0Y7SUFDeEYsTUFBTSxLQUFLLEdBQVU7UUFDbkIsUUFBUSxFQUFFLGVBQWUsU0FBUyxhQUFhLEtBQUssR0FBRztRQUN2RCxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUM7UUFDdEIsS0FBSyxFQUFFLENBQUM7S0FDVCxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFFeEQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDcEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFakYsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSztRQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTtJQUU1RCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMifQ==
|
|
@@ -8,4 +8,4 @@ export async function computation(_, context) {
|
|
|
8
8
|
return { component, epoch, schema, configuration: value.configuration };
|
|
9
9
|
}));
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sa0JBQWtCLENBQUE7QUFFeEQsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLENBQU8sRUFBRSxPQUFnQjtJQUN6RCxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDdEIsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUUsQ0FBQTtRQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBTSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzFFLENBQUMsQ0FBQyxDQUNILENBQUE7QUFDSCxDQUFDIn0=
|
|
@@ -2,13 +2,11 @@ import * as schemas from '@toa.io/schemas'
|
|
|
2
2
|
import { entry } from './lib/map.js'
|
|
3
3
|
import type { Schema } from '@toa.io/schemas'
|
|
4
4
|
|
|
5
|
-
export async function transition
|
|
5
|
+
export async function transition(input: Input, object: Entity): Promise<Entity | Error> {
|
|
6
6
|
const known = entry(input.component)
|
|
7
7
|
|
|
8
|
-
if (known === undefined)
|
|
9
|
-
return new UnknownComponentError(input.component)
|
|
8
|
+
if (known === undefined) return new UnknownComponentError(input.component)
|
|
10
9
|
|
|
11
|
-
// the schema fills its defaults, so what is stored is whole
|
|
12
10
|
const configuration = structuredClone(input.configuration)
|
|
13
11
|
|
|
14
12
|
const schema: Schema<any> = schemas.schema(known.schema)
|
|
@@ -30,7 +28,7 @@ export async function transition (input: Input, object: Entity): Promise<Entity
|
|
|
30
28
|
class UnknownComponentError extends Error {
|
|
31
29
|
public readonly code = 'UNKNOWN_COMPONENT'
|
|
32
30
|
|
|
33
|
-
public constructor
|
|
31
|
+
public constructor(component: string) {
|
|
34
32
|
super(`Component '${component}' is not configured`)
|
|
35
33
|
}
|
|
36
34
|
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { resolve, type Context } from './lib/resolve.js'
|
|
2
2
|
|
|
3
|
-
export async function computation
|
|
4
|
-
return await Promise.all(
|
|
5
|
-
|
|
3
|
+
export async function computation(input: Pair[], context: Context): Promise<Fetched[]> {
|
|
4
|
+
return await Promise.all(
|
|
5
|
+
input.map(async ({ component, epoch }) => {
|
|
6
|
+
const value = await resolve(context, component, epoch)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
return {
|
|
9
|
+
component,
|
|
10
|
+
epoch,
|
|
11
|
+
configuration: value === null ? null : value.configuration,
|
|
12
|
+
created: value === null ? 0 : value.created
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
)
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
interface Pair {
|
|
@@ -6,11 +6,10 @@ import { resolve, type Context } from './lib/resolve.js'
|
|
|
6
6
|
* schema is the deployment's, so an epoch the deployment does not know has none — the
|
|
7
7
|
* value is still what was stored for it.
|
|
8
8
|
*/
|
|
9
|
-
export async function computation
|
|
9
|
+
export async function computation(input: Input, context: Context): Promise<Item | null> {
|
|
10
10
|
const value = await resolve(context, input.component, input.epoch)
|
|
11
11
|
|
|
12
|
-
if (value === null)
|
|
13
|
-
return null
|
|
12
|
+
if (value === null) return null
|
|
14
13
|
|
|
15
14
|
const known = entry(input.component)
|
|
16
15
|
|
|
@@ -12,7 +12,9 @@ it('should be empty without the variable', () => {
|
|
|
12
12
|
})
|
|
13
13
|
|
|
14
14
|
it('should read the variable', () => {
|
|
15
|
-
const values = {
|
|
15
|
+
const values = {
|
|
16
|
+
'a.b': { epoch: 'e', schema: { type: 'object' }, defaults: { foo: 1 } }
|
|
17
|
+
}
|
|
16
18
|
|
|
17
19
|
process.env[VARIABLE] = JSON.stringify(values)
|
|
18
20
|
|
|
@@ -31,7 +33,10 @@ it('should follow the variable', () => {
|
|
|
31
33
|
})
|
|
32
34
|
|
|
33
35
|
it('should list the components by name', () => {
|
|
34
|
-
process.env[VARIABLE] = JSON.stringify({
|
|
36
|
+
process.env[VARIABLE] = JSON.stringify({
|
|
37
|
+
'b.two': { epoch: 'e', schema: {} },
|
|
38
|
+
'a.one': { epoch: 'e', schema: {} }
|
|
39
|
+
})
|
|
35
40
|
|
|
36
41
|
assert.deepStrictEqual(components(), ['a.one', 'b.two'])
|
|
37
42
|
})
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/** What the deployment told the service about every configured component. */
|
|
2
|
-
export function entry
|
|
2
|
+
export function entry(component: string): Entry | undefined {
|
|
3
3
|
return read()[component]
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
/** The configured components, by name. */
|
|
7
|
-
export function components
|
|
7
|
+
export function components(): string[] {
|
|
8
8
|
return Object.keys(read()).sort()
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
function read
|
|
11
|
+
function read(): Values {
|
|
12
12
|
const source = process.env[VARIABLE] ?? '{}'
|
|
13
13
|
|
|
14
14
|
// read again once the variable changes, as it does between scenarios of one process
|
|
@@ -4,25 +4,28 @@ import { entry } from './map.js'
|
|
|
4
4
|
* The latest configuration created for the component and the epoch; the deployed
|
|
5
5
|
* defaults when none was; `null` when the epoch is not the one deployed.
|
|
6
6
|
*/
|
|
7
|
-
export async function resolve
|
|
7
|
+
export async function resolve(
|
|
8
|
+
context: Context,
|
|
9
|
+
component: string,
|
|
10
|
+
epoch?: string
|
|
11
|
+
): Promise<Value | null> {
|
|
8
12
|
const known = entry(component)
|
|
9
13
|
|
|
10
14
|
epoch ??= known?.epoch
|
|
11
15
|
|
|
12
|
-
if (epoch === undefined)
|
|
13
|
-
return null
|
|
16
|
+
if (epoch === undefined) return null
|
|
14
17
|
|
|
15
18
|
// one query per pair, so that a component's latest is never behind another's newer ones
|
|
16
19
|
const query: Query = {
|
|
17
20
|
criteria: `component=="${component}";epoch=="${epoch}"`,
|
|
18
|
-
sort: ['
|
|
21
|
+
sort: ['CREATED:desc'],
|
|
19
22
|
limit: 1
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
const objects = await context.local.enumerate({ query })
|
|
23
26
|
|
|
24
27
|
if (objects.length > 0)
|
|
25
|
-
return { configuration: objects[0].configuration, created: objects[0].
|
|
28
|
+
return { configuration: objects[0].configuration, created: objects[0].CREATED }
|
|
26
29
|
|
|
27
30
|
if (known !== undefined && known.epoch === epoch)
|
|
28
31
|
return { configuration: known.defaults ?? {}, created: 0 }
|
|
@@ -50,5 +53,5 @@ interface Query {
|
|
|
50
53
|
|
|
51
54
|
interface Stored {
|
|
52
55
|
configuration: object
|
|
53
|
-
|
|
56
|
+
CREATED: number
|
|
54
57
|
}
|
|
@@ -2,13 +2,15 @@ import { components, entry } from './lib/map.js'
|
|
|
2
2
|
import { resolve, type Context } from './lib/resolve.js'
|
|
3
3
|
|
|
4
4
|
/** The configuration of every component for its deployed epoch, by component name. */
|
|
5
|
-
export async function computation
|
|
6
|
-
return await Promise.all(
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
export async function computation(_: null, context: Context): Promise<Item[]> {
|
|
6
|
+
return await Promise.all(
|
|
7
|
+
components().map(async (component) => {
|
|
8
|
+
const { epoch, schema } = entry(component)!
|
|
9
|
+
const value = await resolve(context, component, epoch)
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
return { component, epoch, schema, configuration: value!.configuration }
|
|
12
|
+
})
|
|
13
|
+
)
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
interface Item {
|