@toa.io/norm 1.0.0-alpha.31 → 1.0.0-alpha.310
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/CHANGELOG.md +208 -0
- package/package.json +9 -7
- package/src/.component/.expand/bridge.js +2 -6
- package/src/.component/.expand/entity.js +2 -9
- package/src/.component/.expand/events.js +2 -6
- package/src/.component/.expand/extensions.js +6 -8
- package/src/.component/.expand/index.js +7 -19
- package/src/.component/.expand/operations.js +2 -9
- package/src/.component/.expand/receivers.js +4 -7
- package/src/.component/.expand/version.js +67 -28
- package/src/.component/.normalize/entity.js +7 -0
- package/src/.component/.normalize/events.js +16 -4
- package/src/.component/.normalize/index.js +4 -9
- package/src/.component/.normalize/operations.js +13 -6
- package/src/.component/.normalize/receivers.js +4 -5
- package/src/.component/collapse.js +60 -9
- package/src/.component/defaults.js +5 -11
- package/src/.component/dependencies.js +14 -10
- package/src/.component/dereference.js +5 -49
- package/src/.component/expand.js +3 -9
- package/src/.component/extensions.js +9 -10
- package/src/.component/index.js +10 -21
- package/src/.component/merge.js +25 -15
- package/src/.component/migrations.js +57 -0
- package/src/.component/normalize.js +10 -6
- package/src/.component/schema.yaml +147 -73
- package/src/.component/validate.js +37 -17
- package/src/.context/.dependencies/connectors.js +5 -9
- package/src/.context/.dependencies/describe.js +4 -5
- package/src/.context/.dependencies/extensions.js +93 -20
- package/src/.context/.dependencies/index.js +3 -9
- package/src/.context/.dependencies/resolve.js +44 -7
- package/src/.context/complete.js +1 -5
- package/src/.context/converge.js +31 -0
- package/src/.context/dependencies.js +43 -6
- package/src/.context/dereference.js +11 -6
- package/src/.context/evict.js +38 -0
- package/src/.context/expand.js +11 -6
- package/src/.context/index.js +8 -15
- package/src/.context/normalize.js +9 -7
- package/src/.context/schema.yaml +181 -11
- package/src/.context/validate.js +8 -14
- package/src/component.js +33 -14
- package/src/context.js +44 -15
- package/src/definition.js +56 -0
- package/src/entity.js +15 -0
- package/src/index.js +7 -9
- package/src/manifest.js +154 -0
- package/src/map.js +24 -0
- package/src/shortcuts.js +9 -14
- package/test/component/collapse.fixtures.js +30 -39
- package/test/component/collapse.test.js +90 -10
- package/test/component/dependencies.test.js +16 -14
- package/test/component/dereference.fixtures.js +10 -98
- package/test/component/dereference.test.js +10 -14
- package/test/component/dummies/extension/index.js +1 -5
- package/test/component/dummies/migrations/conflicting/migrations/0001-one.yaml +2 -0
- package/test/component/dummies/migrations/conflicting/migrations/0001-one.yml +2 -0
- package/test/component/dummies/migrations/malformed/migrations/0001-one.yaml +1 -0
- package/test/component/dummies/migrations/ordered/migrations/0001-first.yml +4 -0
- package/test/component/dummies/migrations/ordered/migrations/0002-second.yaml +4 -0
- package/test/component/dummies/migrations/ordered/migrations/0010-third.json +1 -0
- package/test/component/dummies/migrations/stateless/migrations/0001-one.yaml +2 -0
- package/test/component/expand.fixtures.js +13 -13
- package/test/component/expand.test.js +17 -13
- package/test/component/migrations.test.js +62 -0
- package/test/component/normalize.fixtures.js +3 -7
- package/test/component/normalize.test.js +94 -28
- package/test/component/validate.fixtures.js +15 -13
- package/test/component/validate.test.js +180 -109
- package/test/context/complete.fixtures.js +2 -8
- package/test/context/complete.test.js +14 -8
- package/test/context/converge.test.js +57 -0
- package/test/context/dereference.fixtures.js +3 -9
- package/test/context/dereference.test.js +18 -7
- package/test/context/evict.fixtures.js +39 -0
- package/test/context/evict.test.js +72 -0
- package/test/context/expand.fixtures.js +1 -5
- package/test/context/expand.test.js +36 -8
- package/test/context/normalize.fixtures.js +2 -7
- package/test/context/normalize.test.js +33 -9
- package/test/context/validate.fixtures.js +1 -6
- package/test/context/validate.test.js +158 -35
- package/test/definition.test.js +35 -0
- package/test/dummies/bare/index.js +1 -0
- package/test/dummies/defined/definition.js +1 -0
- package/test/dummies/defined/index.js +1 -0
- package/test/dummies/defined/package.json +1 -0
- package/test/manifest.test.js +126 -0
- package/test/shortcuts.fixtures.js +4 -9
- package/test/shortcuts.test.js +17 -15
- package/types/component.d.ts +27 -4
- package/types/context/declaration.d.ts +34 -3
- package/types/context.d.ts +27 -13
- package/types/entity.d.ts +7 -0
- package/types/index.d.ts +18 -3
- package/src/.component/.expand/properties.js +0 -14
- package/src/.context/.dependencies/load.js +0 -36
- package/test/context/dependencies.load.test.js +0 -24
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
# [1.0.0-alpha.310](https://github.com/toa-io/toa/compare/v1.0.0-alpha.309...v1.0.0-alpha.310) (2026-09-16)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# [1.0.0-alpha.309](https://github.com/toa-io/toa/compare/v1.0.0-alpha.308...v1.0.0-alpha.309) (2026-09-16)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# [1.0.0-alpha.308](https://github.com/toa-io/toa/compare/v1.0.0-alpha.307...v1.0.0-alpha.308) (2026-09-15)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# [1.0.0-alpha.307](https://github.com/toa-io/toa/compare/v1.0.0-alpha.306...v1.0.0-alpha.307) (2026-09-15)
|
|
31
|
+
|
|
32
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# [1.0.0-alpha.306](https://github.com/toa-io/toa/compare/v1.0.0-alpha.305...v1.0.0-alpha.306) (2026-09-14)
|
|
39
|
+
|
|
40
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# [1.0.0-alpha.305](https://github.com/toa-io/toa/compare/v1.0.0-alpha.304...v1.0.0-alpha.305) (2026-09-13)
|
|
47
|
+
|
|
48
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# [1.0.0-alpha.304](https://github.com/toa-io/toa/compare/v1.0.0-alpha.303...v1.0.0-alpha.304) (2026-09-13)
|
|
55
|
+
|
|
56
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# [1.0.0-alpha.303](https://github.com/toa-io/toa/compare/v1.0.0-alpha.302...v1.0.0-alpha.303) (2026-09-12)
|
|
63
|
+
|
|
64
|
+
### Features
|
|
65
|
+
|
|
66
|
+
* **operations:** a composition states how many replicas it runs ([4466f5a](https://github.com/toa-io/toa/commit/4466f5abcc22c6dceb2994a0143b6bf9d5201d9d))
|
|
67
|
+
* **telemetry:** let a component declare its own metrics ([05aa3c7](https://github.com/toa-io/toa/commit/05aa3c72cd6a160e1cef99df6176a7f627075bc0))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# [1.0.0-alpha.302](https://github.com/toa-io/toa/compare/v1.0.0-alpha.301...v1.0.0-alpha.302) (2026-09-11)
|
|
71
|
+
|
|
72
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# [1.0.0-alpha.301](https://github.com/toa-io/toa/compare/v1.0.0-alpha.300...v1.0.0-alpha.301) (2026-09-11)
|
|
79
|
+
|
|
80
|
+
### Bug Fixes
|
|
81
|
+
|
|
82
|
+
* **norm:** an operation that takes no input states none ([3b69b4c](https://github.com/toa-io/toa/commit/3b69b4c92b3f06361a3552f036a927f4ff32e58b))
|
|
83
|
+
|
|
84
|
+
### Features
|
|
85
|
+
|
|
86
|
+
* **norm:** an environment name may fall back along a colon-separated chain ([a267c1c](https://github.com/toa-io/toa/commit/a267c1caae816a75ada8352d5361b99817c72eb1))
|
|
87
|
+
* **operations:** an evicted component is given its environment and configuration ([6cf7890](https://github.com/toa-io/toa/commit/6cf7890a632a2185d2b7d9790890a04187e5a897))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# [1.0.0-alpha.300](https://github.com/toa-io/toa/compare/v1.0.0-alpha.299...v1.0.0-alpha.300) (2026-09-11)
|
|
91
|
+
|
|
92
|
+
* feat(boot)!: a process is a thing, and an extension may keep something in one ([528d6cd](https://github.com/toa-io/toa/commit/528d6cdd307b45a6c30b6a184d7e06b3328cecf8))
|
|
93
|
+
* feat(core)!: an operation may ask to run once ([dca616c](https://github.com/toa-io/toa/commit/dca616cb380a7a389e277875d3bd5ca55a6e4d45))
|
|
94
|
+
|
|
95
|
+
### Features
|
|
96
|
+
|
|
97
|
+
* **core:** a call may name the process it goes to, and wait for a set time ([7d8adb2](https://github.com/toa-io/toa/commit/7d8adb2772a95ff45ae5374efdedfb5a857fbbe9))
|
|
98
|
+
* **core:** an assignment may ask to run once as well ([10fbcbd](https://github.com/toa-io/toa/commit/10fbcbd86a5e82960e65f62c09d0a465ae8d0353))
|
|
99
|
+
* **norm:** a context says what it does not deploy ([135e6fd](https://github.com/toa-io/toa/commit/135e6fdfbc4270762028e9e5a0516766960ce59c))
|
|
100
|
+
|
|
101
|
+
### BREAKING CHANGES
|
|
102
|
+
|
|
103
|
+
* `Storage.store`, `.upsert` and `.ensure` take one more
|
|
104
|
+
argument, and `Storage` has two more members. A connector that ignores them
|
|
105
|
+
works exactly as it did; a component that asks it for `once` is refused at
|
|
106
|
+
boot. See migrations/299.md.
|
|
107
|
+
* a composition booted directly has no readiness probe. Readiness is
|
|
108
|
+
the process's, and a composition is not a process. `stage.workload` boots one where a
|
|
109
|
+
suite needs it.
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# [1.0.0-alpha.299](https://github.com/toa-io/toa/compare/v1.0.0-alpha.298...v1.0.0-alpha.299) (2026-09-10)
|
|
113
|
+
|
|
114
|
+
### Features
|
|
115
|
+
|
|
116
|
+
* **convergence:** deployments of one context converge ([8a70343](https://github.com/toa-io/toa/commit/8a70343cf6953aab58d4a25bac215508ff8d9a37))
|
|
117
|
+
* **convergence:** what an extension ships converges too ([b3be33d](https://github.com/toa-io/toa/commit/b3be33d2a1db45cfd844288467441aea2f4a722d))
|
|
118
|
+
* **core:** a record carries the region that wrote it ([13ed187](https://github.com/toa-io/toa/commit/13ed187604f06dec66feec2e26ccf9dae30bb048))
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# [1.0.0-alpha.298](https://github.com/toa-io/toa/compare/v1.0.0-alpha.297...v1.0.0-alpha.298) (2026-09-08)
|
|
122
|
+
|
|
123
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# [1.0.0-alpha.297](https://github.com/toa-io/toa/compare/v1.0.0-alpha.296...v1.0.0-alpha.297) (2026-09-08)
|
|
130
|
+
|
|
131
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# [1.0.0-alpha.296](https://github.com/toa-io/toa/compare/v1.0.0-alpha.295...v1.0.0-alpha.296) (2026-09-08)
|
|
138
|
+
|
|
139
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# [1.0.0-alpha.295](https://github.com/toa-io/toa/compare/v1.0.0-alpha.294...v1.0.0-alpha.295) (2026-09-07)
|
|
146
|
+
|
|
147
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# [1.0.0-alpha.294](https://github.com/toa-io/toa/compare/v1.0.0-alpha.293...v1.0.0-alpha.294) (2026-09-07)
|
|
154
|
+
|
|
155
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# [1.0.0-alpha.293](https://github.com/toa-io/toa/compare/v1.0.0-alpha.292...v1.0.0-alpha.293) (2026-09-07)
|
|
162
|
+
|
|
163
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# [1.0.0-alpha.292](https://github.com/toa-io/toa/compare/v1.0.0-alpha.291...v1.0.0-alpha.292) (2026-09-07)
|
|
170
|
+
|
|
171
|
+
### Features
|
|
172
|
+
|
|
173
|
+
* **cli:** the deployment library is a peer, and the binary is the CLI's ([a923f81](https://github.com/toa-io/toa/commit/a923f8173a55ed1c091213a7c7db1863ca1d0ba6))
|
|
174
|
+
* **definitions:** the version of Toa is the definitions package's ([3d0272e](https://github.com/toa-io/toa/commit/3d0272ea0ab862f4b6c2e58a2f003f92d0f8a87f))
|
|
175
|
+
* **definitions:** what a package declares is read from one package ([7052341](https://github.com/toa-io/toa/commit/70523411b5d9e2b204c999aa02365173f3bb518d))
|
|
176
|
+
* **norm:** a package's definition is read by one resolver ([bffd41c](https://github.com/toa-io/toa/commit/bffd41c8d18c42786b0bf321623088b9dabc4724))
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# [1.0.0-alpha.291](https://github.com/toa-io/toa/compare/v1.0.0-alpha.290...v1.0.0-alpha.291) (2026-09-07)
|
|
180
|
+
|
|
181
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# [1.0.0-alpha.289](https://github.com/toa-io/toa/compare/v1.0.0-alpha.288...v1.0.0-alpha.289) (2026-09-07)
|
|
188
|
+
|
|
189
|
+
* A deploy moves only what changed, and a component sees none of the runtime's environment (#1073) ([f38e3db](https://github.com/toa-io/toa/commit/f38e3db533f24db866c57bfa1ef294eff1eaf499)), closes [#1073](https://github.com/toa-io/toa/issues/1073) [#1064](https://github.com/toa-io/toa/issues/1064) [#1066](https://github.com/toa-io/toa/issues/1066) [#1067](https://github.com/toa-io/toa/issues/1067) [#1068](https://github.com/toa-io/toa/issues/1068) [#1069](https://github.com/toa-io/toa/issues/1069) [#1071](https://github.com/toa-io/toa/issues/1071) [#1070](https://github.com/toa-io/toa/issues/1070) [#1072](https://github.com/toa-io/toa/issues/1072)
|
|
190
|
+
|
|
191
|
+
### BREAKING CHANGES
|
|
192
|
+
|
|
193
|
+
* a component that read `process.env.TOA_*` reads `context` instead;
|
|
194
|
+
`echo(input)` no longer substitutes from the environment; a bash operation sees no
|
|
195
|
+
`TOA_*`; images no longer set `USER node` — see migrations/289.md.
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# [1.0.0-alpha.288](https://github.com/toa-io/toa/compare/v1.0.0-alpha.287...v1.0.0-alpha.288) (2026-09-06)
|
|
199
|
+
|
|
200
|
+
**Note:** Version bump only for package @toa.io/norm
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# [1.0.0-alpha.287](https://github.com/toa-io/toa/compare/v1.0.0-alpha.286...v1.0.0-alpha.287) (2026-09-06)
|
|
207
|
+
|
|
208
|
+
**Note:** Version bump only for package @toa.io/norm
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toa.io/norm",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.310",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "Toa declarations normalization and validation",
|
|
5
6
|
"author": "temich <tema.gurtovoy@gmail.com>",
|
|
6
7
|
"homepage": "https://github.com/toa-io/toa#readme",
|
|
@@ -20,11 +21,12 @@
|
|
|
20
21
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
|
21
22
|
},
|
|
22
23
|
"dependencies": {
|
|
23
|
-
"@toa.io/core": "1.0.0-alpha.
|
|
24
|
-
"@toa.io/
|
|
25
|
-
"@toa.io/
|
|
26
|
-
"@toa.io/
|
|
27
|
-
"@toa.io/
|
|
24
|
+
"@toa.io/core": "1.0.0-alpha.310",
|
|
25
|
+
"@toa.io/definitions": "1.0.0-alpha.310",
|
|
26
|
+
"@toa.io/generic": "1.0.0-alpha.310",
|
|
27
|
+
"@toa.io/prototype": "1.0.0-alpha.301",
|
|
28
|
+
"@toa.io/schemas": "1.0.0-alpha.310",
|
|
29
|
+
"fast-glob": "3.3.3"
|
|
28
30
|
},
|
|
29
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "d952c57f77279729e26d52d50c6df47138ad0a4f"
|
|
30
32
|
}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolve } from '../../shortcuts.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const { resolve } = require('../../shortcuts')
|
|
6
|
-
|
|
7
|
-
function entity (manifest) {
|
|
3
|
+
export function entity(manifest) {
|
|
8
4
|
if (!('entity' in manifest)) return
|
|
9
|
-
if ('schema' in manifest.entity) manifest.entity.schema = expand(manifest.entity.schema)
|
|
10
5
|
|
|
11
6
|
manifest.entity.storage = resolve(manifest.entity.storage)
|
|
12
7
|
}
|
|
13
|
-
|
|
14
|
-
exports.entity = entity
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolve } from '../../shortcuts.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function events (manifest) {
|
|
3
|
+
export function events(manifest) {
|
|
6
4
|
if (manifest.events === undefined) return
|
|
7
5
|
|
|
8
6
|
for (const event of Object.values(manifest.events)) {
|
|
@@ -10,5 +8,3 @@ function events (manifest) {
|
|
|
10
8
|
if (event.bridge !== undefined) event.bridge = resolve(event.bridge)
|
|
11
9
|
}
|
|
12
10
|
}
|
|
13
|
-
|
|
14
|
-
exports.events = events
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { recognize } from '../../shortcuts.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function extensions (manifest) {
|
|
3
|
+
export function extensions(manifest) {
|
|
6
4
|
recognize(SHORTCUTS, manifest, 'extensions')
|
|
7
5
|
recognize(SHORTCUTS, manifest.extensions)
|
|
8
6
|
}
|
|
@@ -10,11 +8,11 @@ function extensions (manifest) {
|
|
|
10
8
|
const SHORTCUTS = {
|
|
11
9
|
exposition: '@toa.io/extensions.exposition',
|
|
12
10
|
realtime: '@toa.io/extensions.realtime',
|
|
13
|
-
origins: '@toa.io/extensions.origins',
|
|
14
11
|
configuration: '@toa.io/extensions.configuration',
|
|
15
12
|
state: '@toa.io/extensions.state',
|
|
16
13
|
stash: '@toa.io/extensions.stash',
|
|
17
|
-
storages: '@toa.io/extensions.storages'
|
|
14
|
+
storages: '@toa.io/extensions.storages',
|
|
15
|
+
cadence: '@toa.io/extensions.cadence',
|
|
16
|
+
introspection: '@toa.io/extensions.introspection',
|
|
17
|
+
telemetry: '@toa.io/extensions.telemetry'
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
exports.extensions = extensions
|
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const { properties } = require('./properties')
|
|
9
|
-
const { receivers } = require('./receivers')
|
|
10
|
-
const { version } = require('./version')
|
|
11
|
-
|
|
12
|
-
exports.bridge = bridge
|
|
13
|
-
exports.entity = entity
|
|
14
|
-
exports.events = events
|
|
15
|
-
exports.extensions = extensions
|
|
16
|
-
exports.operations = operations
|
|
17
|
-
exports.properties = properties
|
|
18
|
-
exports.receivers = receivers
|
|
19
|
-
exports.version = version
|
|
1
|
+
export { bridge } from './bridge.js'
|
|
2
|
+
export { entity } from './entity.js'
|
|
3
|
+
export { events } from './events.js'
|
|
4
|
+
export { extensions } from './extensions.js'
|
|
5
|
+
export { operations } from './operations.js'
|
|
6
|
+
export { receivers } from './receivers.js'
|
|
7
|
+
export { version } from './version.js'
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolve } from '../../shortcuts.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
const { resolve } = require('../../shortcuts')
|
|
5
|
-
|
|
6
|
-
function operations (manifest) {
|
|
3
|
+
export function operations(manifest) {
|
|
7
4
|
if (manifest.operations === undefined) return
|
|
8
5
|
|
|
9
6
|
for (const operation of Object.values(manifest.operations)) {
|
|
10
|
-
if (operation.input !== undefined) operation.input = expand(operation.input)
|
|
11
|
-
if (operation.output !== undefined) operation.output = expand(operation.output)
|
|
12
7
|
if (operation.bridge !== undefined) operation.bridge = resolve(operation.bridge)
|
|
13
8
|
|
|
14
9
|
if (operation.bindings !== undefined && operation.bindings !== null) {
|
|
@@ -16,5 +11,3 @@ function operations (manifest) {
|
|
|
16
11
|
}
|
|
17
12
|
}
|
|
18
13
|
}
|
|
19
|
-
|
|
20
|
-
exports.operations = operations
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolve } from '../../shortcuts.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function receivers (manifest) {
|
|
3
|
+
export function receivers(manifest) {
|
|
6
4
|
if (manifest.receivers === undefined) return
|
|
7
5
|
|
|
8
6
|
for (const [locator, receiver] of Object.entries(manifest.receivers)) {
|
|
9
|
-
if (typeof receiver === 'string')
|
|
7
|
+
if (typeof receiver === 'string')
|
|
8
|
+
manifest.receivers[locator] = { operation: receiver }
|
|
10
9
|
|
|
11
10
|
if (receiver.binding !== undefined) receiver.binding = resolve(receiver.binding)
|
|
12
11
|
if (receiver.bridge !== undefined) receiver.bridge = resolve(receiver.bridge)
|
|
13
12
|
}
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
exports.receivers = receivers
|
|
@@ -1,45 +1,84 @@
|
|
|
1
|
-
|
|
1
|
+
import { join } from 'node:path'
|
|
2
|
+
import { createHash } from 'node:crypto'
|
|
3
|
+
import fs from 'node:fs/promises'
|
|
4
|
+
import glob from 'fast-glob'
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
const { createHash } = require('node:crypto')
|
|
5
|
-
const fs = require('node:fs/promises')
|
|
6
|
-
const { createReadStream } = require('node:fs')
|
|
7
|
-
const { once } = require('node:events')
|
|
6
|
+
import { definition } from '../../definition.js'
|
|
8
7
|
|
|
9
|
-
async function version
|
|
10
|
-
manifest.version ??= await hash(manifest
|
|
8
|
+
export async function version(manifest) {
|
|
9
|
+
manifest.version ??= await hash(manifest)
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Identifies a build of a component: it becomes the tag of its image, so it must be the
|
|
14
|
+
* same for the same sources and different for different ones — on any machine, and whichever
|
|
15
|
+
* build produced them.
|
|
16
|
+
*
|
|
17
|
+
* What a build leaves out cannot change it: the bridge states what no build ships, a component
|
|
18
|
+
* adds to that with `ignore` and puts one back with `!`, and `files` names what its version is
|
|
19
|
+
* made of where a build copies only some of it. Its manifest is always one of them, because
|
|
20
|
+
* what it declares is what a caller is held to.
|
|
21
|
+
*/
|
|
22
|
+
async function hash(manifest) {
|
|
23
|
+
const files = (await list(manifest)).sort()
|
|
24
|
+
const digests = await Promise.all(files.map((file) => digest(join(manifest.path, file))))
|
|
25
|
+
const total = createHash('sha256')
|
|
15
26
|
|
|
16
|
-
|
|
27
|
+
// the path is part of it: moving a file changes the build even if no content did
|
|
28
|
+
for (let i = 0; i < files.length; i++) total.update(files[i]).update(digests[i])
|
|
29
|
+
|
|
30
|
+
return total.digest('hex').slice(0, 8)
|
|
17
31
|
}
|
|
18
32
|
|
|
19
33
|
/**
|
|
20
|
-
* @param {
|
|
21
|
-
* @
|
|
34
|
+
* @param {toa.norm.Component} manifest
|
|
35
|
+
* @returns {Promise<string[]>} paths relative to the component
|
|
22
36
|
*/
|
|
23
|
-
async function
|
|
24
|
-
const
|
|
37
|
+
async function list(manifest) {
|
|
38
|
+
const files = await glob(patterns(manifest.files), {
|
|
39
|
+
cwd: manifest.path,
|
|
40
|
+
dot: true,
|
|
41
|
+
onlyFiles: true,
|
|
42
|
+
followSymbolicLinks: false,
|
|
43
|
+
ignore: await ignore(manifest)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// what a component declares is what a caller is held to, so its manifest is always one of them
|
|
47
|
+
if (!files.includes(MANIFEST) && (await exists(join(manifest.path, MANIFEST))))
|
|
48
|
+
files.push(MANIFEST)
|
|
25
49
|
|
|
26
|
-
|
|
27
|
-
|
|
50
|
+
return files
|
|
51
|
+
}
|
|
28
52
|
|
|
29
|
-
|
|
53
|
+
/** A path names what is under it, and a pattern is taken as it is. */
|
|
54
|
+
function patterns(files = ['**']) {
|
|
55
|
+
return files.flatMap((file) => (file.includes('*') ? [file] : [file, file + '/**']))
|
|
56
|
+
}
|
|
30
57
|
|
|
31
|
-
|
|
32
|
-
}
|
|
58
|
+
async function ignore(manifest) {
|
|
59
|
+
const { module } = await definition(manifest.bridge)
|
|
60
|
+
const stated = manifest.ignore ?? []
|
|
61
|
+
const back = new Set(
|
|
62
|
+
stated.filter((pattern) => pattern[0] === '!').map((pattern) => pattern.slice(1))
|
|
63
|
+
)
|
|
33
64
|
|
|
34
|
-
|
|
35
|
-
|
|
65
|
+
return [
|
|
66
|
+
...(module.ignore ?? []).filter((pattern) => !back.has(pattern)),
|
|
67
|
+
...stated.filter((pattern) => pattern[0] !== '!')
|
|
68
|
+
]
|
|
69
|
+
}
|
|
36
70
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
71
|
+
async function exists(path) {
|
|
72
|
+
return await fs
|
|
73
|
+
.access(path)
|
|
74
|
+
.then(() => true)
|
|
75
|
+
.catch(() => false)
|
|
76
|
+
}
|
|
40
77
|
|
|
41
|
-
|
|
42
|
-
|
|
78
|
+
async function digest(path) {
|
|
79
|
+
return createHash('sha256')
|
|
80
|
+
.update(await fs.readFile(path))
|
|
81
|
+
.digest()
|
|
43
82
|
}
|
|
44
83
|
|
|
45
|
-
|
|
84
|
+
const MANIFEST = 'manifest.toa.yaml'
|
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import { definition } from '../../definition.js'
|
|
2
2
|
|
|
3
|
-
const events = (component) => {
|
|
3
|
+
export const events = async (component) => {
|
|
4
4
|
if (component.events === undefined) return
|
|
5
5
|
|
|
6
|
-
const binding = component.bindings
|
|
6
|
+
const binding = await asynchronous(component.bindings)
|
|
7
7
|
|
|
8
8
|
for (const event of Object.values(component.events)) {
|
|
9
9
|
if (event.binding === undefined) event.binding = binding
|
|
10
|
+
|
|
11
|
+
event.conditioned ??= false
|
|
12
|
+
event.subjective ??= false
|
|
10
13
|
}
|
|
11
14
|
}
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
/** The first binding that carries events, which only its module can say. */
|
|
17
|
+
async function asynchronous(bindings) {
|
|
18
|
+
for (const binding of bindings) {
|
|
19
|
+
const { properties } = (await definition(binding)).module
|
|
20
|
+
|
|
21
|
+
if (properties.async === true) return binding
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return undefined
|
|
25
|
+
}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const { receivers } = require('./receivers')
|
|
6
|
-
|
|
7
|
-
exports.events = events
|
|
8
|
-
exports.operations = operations
|
|
9
|
-
exports.receivers = receivers
|
|
1
|
+
export { entity } from './entity.js'
|
|
2
|
+
export { events } from './events.js'
|
|
3
|
+
export { operations } from './operations.js'
|
|
4
|
+
export { receivers } from './receivers.js'
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const operations = (component) => {
|
|
1
|
+
export const operations = (component) => {
|
|
4
2
|
if (component.operations === undefined) return
|
|
5
3
|
|
|
6
4
|
for (const [endpoint, operation] of Object.entries(component.operations)) {
|
|
7
|
-
|
|
5
|
+
// what an operation of this type acquires, where it did not say
|
|
6
|
+
if (operation.type === 'computation' || operation.type === 'unmanaged') {
|
|
7
|
+
operation.scope = 'none'
|
|
8
8
|
operation.query = false
|
|
9
|
+
} else if (operation.type === 'effect') operation.scope ??= 'none'
|
|
10
|
+
|
|
11
|
+
if (operation.scope === 'none') operation.query = false
|
|
12
|
+
|
|
13
|
+
// an operation that states no output states an empty schema, which every reply fits
|
|
14
|
+
operation.output ??= {}
|
|
15
|
+
|
|
16
|
+
// a bridge says an algorithm takes no input with `null`, which the manifest states as none
|
|
17
|
+
if (operation.input === null) delete operation.input
|
|
9
18
|
|
|
10
19
|
if (operation.bindings === undefined) operation.bindings = component.bindings
|
|
11
20
|
if (operation.bindings === null) operation.bindings = []
|
|
12
21
|
if (operation.virtual === true) delete component.operations[endpoint]
|
|
13
22
|
}
|
|
14
23
|
}
|
|
15
|
-
|
|
16
|
-
exports.operations = operations
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function receivers (component) {
|
|
1
|
+
export function receivers(component) {
|
|
4
2
|
if (component.receivers === undefined) return
|
|
5
3
|
|
|
6
4
|
const receivers = component.receivers
|
|
@@ -9,6 +7,9 @@ function receivers (component) {
|
|
|
9
7
|
const segments = key.split('.')
|
|
10
8
|
const source = value.source ?? 'default'
|
|
11
9
|
|
|
10
|
+
value.conditioned ??= false
|
|
11
|
+
value.adaptive ??= false
|
|
12
|
+
|
|
12
13
|
if (source !== 'default') continue
|
|
13
14
|
if (segments.length === 3) continue // already with a namespace
|
|
14
15
|
|
|
@@ -18,5 +19,3 @@ function receivers (component) {
|
|
|
18
19
|
receivers[newKey] = value
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
-
exports.receivers = receivers
|