@toa.io/norm 1.0.0-alpha.320 → 1.0.0-alpha.321

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 CHANGED
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.0.0-alpha.321](https://github.com/toa-io/toa/compare/v1.0.0-alpha.320...v1.0.0-alpha.321) (2026-09-28)
7
+
8
+ ### Features
9
+
10
+ * **core:** let an operation declared unchained begin a chain of its own ([6d94324](https://github.com/toa-io/toa/commit/6d94324cb43ff4b12e1bc267d81498445b40a02e))
11
+
12
+
6
13
  # [1.0.0-alpha.320](https://github.com/toa-io/toa/compare/v1.0.0-alpha.319...v1.0.0-alpha.320) (2026-09-28)
7
14
 
8
15
  **Note:** Version bump only for package @toa.io/norm
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/norm",
3
- "version": "1.0.0-alpha.320",
3
+ "version": "1.0.0-alpha.321",
4
4
  "type": "module",
5
5
  "description": "Toa declarations normalization and validation",
6
6
  "author": "temich <tema.gurtovoy@gmail.com>",
@@ -21,12 +21,12 @@
21
21
  "test": "echo \"Error: run tests from root\" && exit 1"
22
22
  },
23
23
  "dependencies": {
24
- "@toa.io/core": "1.0.0-alpha.320",
25
- "@toa.io/definitions": "1.0.0-alpha.320",
24
+ "@toa.io/core": "1.0.0-alpha.321",
25
+ "@toa.io/definitions": "1.0.0-alpha.321",
26
26
  "@toa.io/generic": "1.0.0-alpha.311",
27
27
  "@toa.io/prototype": "1.0.0-alpha.319",
28
28
  "@toa.io/schemas": "1.0.0-alpha.311",
29
29
  "fast-glob": "3.3.3"
30
30
  },
31
- "gitHead": "5ef92ab939a596e4ac820965c59c015820eba7b2"
31
+ "gitHead": "fa850e861a0c748d7364ccf7c8a09ce26973fc04"
32
32
  }
@@ -166,6 +166,9 @@ properties:
166
166
  stateful:
167
167
  # served by every process under an address of its own, which a call names; see documentation/stateful.md
168
168
  type: boolean
169
+ unchained:
170
+ # every call begins a chain of its own, so a circle through it is refused by neither rule; see documentation/cycles.md
171
+ type: boolean
169
172
  stream:
170
173
  # the input property that carries a stream, read as its caller writes it; see documentation/streams.md
171
174
  $ref: "#/definitions/name"
@@ -383,6 +383,24 @@ describe('stateful', () => {
383
383
  })
384
384
  })
385
385
 
386
+ describe('unchained', () => {
387
+ it('should be allowed on an operation', async () => {
388
+ const [operation] = Object.values(manifest.operations)
389
+
390
+ operation.unchained = true
391
+
392
+ await assert.doesNotReject(validate(manifest))
393
+ })
394
+
395
+ it('should be a boolean', async () => {
396
+ const [operation] = Object.values(manifest.operations)
397
+
398
+ operation.unchained = 'yes'
399
+
400
+ await assert.rejects(validate(manifest), (error) => /must be boolean/.test(error.message))
401
+ })
402
+ })
403
+
386
404
  describe('stream', () => {
387
405
  beforeEach(() => {
388
406
  manifest.operations.read = {
@@ -16,6 +16,8 @@ export type Operation = {
16
16
  query?: boolean
17
17
  /** served by every process under an address of its own, which a call to it names */
18
18
  stateful?: boolean
19
+ /** every call begins a chain of its own */
20
+ unchained?: boolean
19
21
  /** the input property that carries a stream, read as its caller writes it */
20
22
  stream?: string
21
23
  }