@toa.io/userland 1.0.0-alpha.30 → 1.0.0-alpha.301
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 +115 -0
- package/example/components/echo/manifest.toa.yaml +15 -5
- package/example/components/echo/operations/get.js +1 -5
- package/example/components/echo/operations/resolve.js +1 -5
- package/example/components/echo/operations/signal.js +3 -7
- package/example/components/math.calculations/manifest.toa.yaml +19 -6
- package/example/components/math.calculations/operations/add.js +1 -5
- package/example/components/math.calculations/operations/increment.js +1 -5
- package/example/components/math.proxy/manifest.toa.yaml +8 -3
- package/example/components/math.proxy/operations/add.js +1 -5
- package/example/components/tea.pots/manifest.toa.yaml +29 -9
- package/example/components/tea.pots/operations/same.js +1 -5
- package/example/components/tea.pots/receivers/store.orders.created.js +1 -5
- package/example/components/web/manifest.toa.yaml +2 -4
- package/example/components/web/operations/get.js +3 -8
- package/example/context.toa.yaml +2 -7
- package/example/stage/call.test.js +17 -10
- package/example/stage/events.test.js +63 -16
- package/example/stage/invoke.test.js +12 -9
- package/package.json +18 -13
- package/stage/package.json +1 -0
- package/stage/src/component.js +3 -12
- package/stage/src/composition.js +3 -11
- package/stage/src/index.js +7 -18
- package/stage/src/manifest.js +2 -6
- package/stage/src/remote.js +11 -8
- package/stage/src/service.js +11 -10
- package/stage/src/shutdown.js +10 -9
- package/stage/src/state.js +2 -4
- package/stage/src/workload.js +19 -0
- package/stage/test/boot.mock.js +9 -11
- package/stage/test/component.test.js +20 -10
- package/stage/test/composition.test.js +11 -20
- package/stage/test/manifest.test.js +15 -8
- package/stage/test/remote.test.js +14 -12
- package/stage/test/shutdown.test.js +26 -22
- package/stage/test/state.mock.js +5 -6
- package/stage/test/state.test.js +13 -12
- package/stage/types/index.d.ts +17 -9
- package/stage/types/state.d.ts +3 -4
- package/stage/src/binding/binding.js +0 -50
- package/stage/src/binding/consumer.js +0 -32
- package/stage/src/binding/emitter.js +0 -27
- package/stage/src/binding/factory.js +0 -49
- package/stage/src/binding/index.js +0 -10
- package/stage/src/binding/label.js +0 -12
- package/stage/src/binding/producer.js +0 -43
- package/stage/src/binding/receiver.js +0 -34
- package/stage/test/binding/binding.test.js +0 -15
- package/stage/test/binding/consumer.test.js +0 -52
- package/stage/test/binding/emitter.test.js +0 -78
- package/stage/test/binding/producer.fixtures.js +0 -10
- package/stage/test/binding/producer.test.js +0 -49
- package/stage/test/binding/receiver.fixtures.js +0 -7
- package/stage/test/binding/receiver.test.js +0 -54
- package/stage/test/binding.mock.js +0 -8
- package/stage/types/binding.d.ts +0 -20
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
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.301](https://github.com/toa-io/toa/compare/v1.0.0-alpha.300...v1.0.0-alpha.301) (2026-09-11)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# [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)
|
|
15
|
+
|
|
16
|
+
* feat(boot)!: a process is a thing, and an extension may keep something in one ([528d6cd](https://github.com/toa-io/toa/commit/528d6cdd307b45a6c30b6a184d7e06b3328cecf8))
|
|
17
|
+
|
|
18
|
+
### BREAKING CHANGES
|
|
19
|
+
|
|
20
|
+
* a composition booted directly has no readiness probe. Readiness is
|
|
21
|
+
the process's, and a composition is not a process. `stage.workload` boots one where a
|
|
22
|
+
suite needs it.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [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)
|
|
26
|
+
|
|
27
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# [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)
|
|
34
|
+
|
|
35
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# [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)
|
|
42
|
+
|
|
43
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# [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)
|
|
50
|
+
|
|
51
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# [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)
|
|
58
|
+
|
|
59
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# [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)
|
|
66
|
+
|
|
67
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# [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)
|
|
74
|
+
|
|
75
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# [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)
|
|
82
|
+
|
|
83
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# [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)
|
|
90
|
+
|
|
91
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# [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)
|
|
98
|
+
|
|
99
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# [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)
|
|
106
|
+
|
|
107
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# [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)
|
|
114
|
+
|
|
115
|
+
**Note:** Version bump only for package @toa.io/userland
|
|
@@ -2,14 +2,24 @@ name: echo
|
|
|
2
2
|
|
|
3
3
|
operations:
|
|
4
4
|
signal:
|
|
5
|
-
output:
|
|
5
|
+
output:
|
|
6
|
+
type: string
|
|
6
7
|
get:
|
|
7
|
-
output:
|
|
8
|
+
output:
|
|
9
|
+
type: string
|
|
8
10
|
resolve:
|
|
9
|
-
input:
|
|
10
|
-
|
|
11
|
+
input:
|
|
12
|
+
type: string
|
|
13
|
+
output:
|
|
14
|
+
type: string
|
|
11
15
|
|
|
12
16
|
configuration:
|
|
13
|
-
|
|
17
|
+
schema:
|
|
18
|
+
type: object
|
|
19
|
+
properties:
|
|
20
|
+
signal:
|
|
21
|
+
type: string
|
|
22
|
+
defaults:
|
|
23
|
+
signal: quack
|
|
14
24
|
|
|
15
25
|
state: ~
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
class Computation {
|
|
1
|
+
export class Computation {
|
|
4
2
|
#context
|
|
5
3
|
|
|
6
|
-
async mount
|
|
4
|
+
async mount(context) {
|
|
7
5
|
this.#context = context
|
|
8
6
|
}
|
|
9
7
|
|
|
10
|
-
async execute
|
|
8
|
+
async execute() {
|
|
11
9
|
return this.#context.configuration.signal
|
|
12
10
|
}
|
|
13
11
|
}
|
|
14
|
-
|
|
15
|
-
exports.Computation = Computation
|
|
@@ -4,11 +4,24 @@ namespace: math
|
|
|
4
4
|
operations:
|
|
5
5
|
add:
|
|
6
6
|
input:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
properties:
|
|
8
|
+
a:
|
|
9
|
+
type: number
|
|
10
|
+
b:
|
|
11
|
+
type: number
|
|
12
|
+
type: object
|
|
13
|
+
output:
|
|
14
|
+
type: number
|
|
10
15
|
increment:
|
|
11
16
|
input:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
properties:
|
|
18
|
+
value:
|
|
19
|
+
type: number
|
|
20
|
+
times:
|
|
21
|
+
type: number
|
|
22
|
+
type: object
|
|
23
|
+
required:
|
|
24
|
+
- value
|
|
25
|
+
- times
|
|
26
|
+
output:
|
|
27
|
+
type: number
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
async function computation (input, context) {
|
|
1
|
+
export async function computation(input, context) {
|
|
4
2
|
let value = input.value
|
|
5
3
|
|
|
6
4
|
for (let i = 0; i < input.times; i++) {
|
|
@@ -9,5 +7,3 @@ async function computation (input, context) {
|
|
|
9
7
|
|
|
10
8
|
return value
|
|
11
9
|
}
|
|
12
|
-
|
|
13
|
-
exports.computation = computation
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
async function computation (input, context) {
|
|
1
|
+
export async function computation(input, context) {
|
|
4
2
|
const request = { input }
|
|
5
3
|
|
|
6
4
|
// noinspection JSUnresolvedVariable
|
|
7
5
|
return context.remote.math.calculations.add(request)
|
|
8
6
|
}
|
|
9
|
-
|
|
10
|
-
exports.computation = computation
|
|
@@ -3,21 +3,35 @@ namespace: tea
|
|
|
3
3
|
|
|
4
4
|
entity:
|
|
5
5
|
storage: mongodb
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
properties:
|
|
7
|
+
volume: &volume
|
|
8
|
+
type: number
|
|
9
|
+
booked: &booked
|
|
10
|
+
type: boolean
|
|
11
|
+
material: &material
|
|
12
|
+
type: string
|
|
13
|
+
enum:
|
|
14
|
+
- glass
|
|
15
|
+
- ceramic
|
|
16
|
+
- steel
|
|
17
|
+
required:
|
|
18
|
+
- material
|
|
19
|
+
blank:
|
|
9
20
|
booked: false
|
|
10
21
|
|
|
11
22
|
operations:
|
|
12
23
|
transit:
|
|
13
24
|
concurrency: none
|
|
14
25
|
input:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
26
|
+
properties:
|
|
27
|
+
material: *material
|
|
28
|
+
volume: *volume
|
|
29
|
+
booked: *booked
|
|
30
|
+
type: object
|
|
18
31
|
same:
|
|
19
|
-
input:
|
|
20
|
-
output:
|
|
32
|
+
input: *material
|
|
33
|
+
output:
|
|
34
|
+
type: array
|
|
21
35
|
|
|
22
36
|
receivers:
|
|
23
37
|
store.orders.created:
|
|
@@ -25,4 +39,10 @@ receivers:
|
|
|
25
39
|
binding: amqp # avoid discovery
|
|
26
40
|
|
|
27
41
|
configuration:
|
|
28
|
-
|
|
42
|
+
schema:
|
|
43
|
+
type: object
|
|
44
|
+
properties:
|
|
45
|
+
step:
|
|
46
|
+
type: number
|
|
47
|
+
defaults:
|
|
48
|
+
step: 0.5
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
async function computation (input, context) {
|
|
1
|
+
export async function computation(input, context) {
|
|
4
2
|
const criteria = `material==${input}`
|
|
5
3
|
const query = { criteria, limit }
|
|
6
4
|
|
|
@@ -9,5 +7,3 @@ async function computation (input, context) {
|
|
|
9
7
|
}
|
|
10
8
|
|
|
11
9
|
const limit = 10
|
|
12
|
-
|
|
13
|
-
exports.computation = computation
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
async function computation (_, context) {
|
|
4
|
-
const response = await context.http.dev.path.to.resource.get()
|
|
1
|
+
export async function computation(_, context) {
|
|
2
|
+
const response = await context.fetch('http://api.example.com/path/to/resource')
|
|
5
3
|
const type = response.headers.get('content-type')
|
|
6
4
|
|
|
7
|
-
if (type !== 'application/json')
|
|
8
|
-
return ERR_UNSUPPORTED_MEDIA_TYPE
|
|
5
|
+
if (type !== 'application/json') return ERR_UNSUPPORTED_MEDIA_TYPE
|
|
9
6
|
|
|
10
7
|
return await response.json()
|
|
11
8
|
}
|
|
12
9
|
|
|
13
10
|
const ERR_UNSUPPORTED_MEDIA_TYPE = new Error('UNSUPPORTED_MEDIA_TYPE')
|
|
14
|
-
|
|
15
|
-
exports.computation = computation
|
package/example/context.toa.yaml
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
import { it, before, after } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { resolve } from 'node:path'
|
|
5
|
+
import { exceptions } from '@toa.io/core'
|
|
6
|
+
import * as stage from '@toa.io/userland/stage'
|
|
6
7
|
|
|
7
|
-
const
|
|
8
|
+
const { RequestContractException } = exceptions
|
|
9
|
+
|
|
10
|
+
const root = resolve(import.meta.dirname, '../components')
|
|
8
11
|
|
|
9
12
|
let echo
|
|
10
13
|
let math
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
before(async () => {
|
|
13
16
|
process.env.TOA_DEV = '1'
|
|
17
|
+
process.env.TOA_CONFIGURATION_DEFAULT_ECHO = '{}'
|
|
18
|
+
process.env.TOA_CONFIGURATION_TEA_POTS = '{}'
|
|
14
19
|
|
|
15
20
|
const paths = ['echo', 'math.calculations'].map((rel) => resolve(root, rel))
|
|
16
21
|
|
|
@@ -20,7 +25,7 @@ beforeAll(async () => {
|
|
|
20
25
|
math = await stage.remote('math.calculations')
|
|
21
26
|
})
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
after(async () => {
|
|
24
29
|
await stage.shutdown()
|
|
25
30
|
|
|
26
31
|
delete process.env.TOA_DEV
|
|
@@ -29,13 +34,15 @@ afterAll(async () => {
|
|
|
29
34
|
it('should call endpoint', async () => {
|
|
30
35
|
const reply = await echo.invoke('signal', {})
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
assert.deepStrictEqual(reply, 'quack')
|
|
33
38
|
})
|
|
34
39
|
|
|
35
40
|
it('should throw on invalid input', async () => {
|
|
36
41
|
const a = 'not a number'
|
|
37
42
|
const b = 'neither'
|
|
38
43
|
|
|
39
|
-
await
|
|
40
|
-
.
|
|
44
|
+
await assert.rejects(math.invoke('add', { input: { a, b } }), (error) => {
|
|
45
|
+
assert.ok(error instanceof RequestContractException)
|
|
46
|
+
return true
|
|
47
|
+
})
|
|
41
48
|
})
|
|
@@ -1,51 +1,98 @@
|
|
|
1
|
-
|
|
1
|
+
import { it, before, after } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
import { resolve } from 'node:path'
|
|
5
|
+
import * as boot from '@toa.io/boot'
|
|
6
|
+
import { Connector, Locator } from '@toa.io/core'
|
|
7
|
+
import { timeout } from '@toa.io/generic'
|
|
8
|
+
import * as stage from '@toa.io/userland/stage'
|
|
5
9
|
|
|
6
|
-
const
|
|
7
|
-
const root = resolve(__dirname, '../components')
|
|
10
|
+
const root = resolve(import.meta.dirname, '../components')
|
|
8
11
|
|
|
9
12
|
let remote
|
|
13
|
+
let emitter
|
|
14
|
+
let consumer
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
before(async () => {
|
|
12
17
|
process.env.TOA_DEV = '1'
|
|
18
|
+
process.env.TOA_CONFIGURATION_TEA_POTS = '{}'
|
|
19
|
+
|
|
20
|
+
// the outbox pumps on a tick; at the default five seconds a test would end before it ran
|
|
21
|
+
process.env.TOA_OUTBOX_INTERVAL = '100'
|
|
13
22
|
|
|
14
23
|
const path = resolve(root, 'tea.pots')
|
|
15
24
|
|
|
16
25
|
await stage.composition([path])
|
|
17
26
|
|
|
18
27
|
remote = await stage.remote('tea.pots')
|
|
28
|
+
|
|
29
|
+
// what `store.orders` would emit, sent the way it would send it
|
|
30
|
+
emitter = await boot.bindings.emit(AMQP, new Locator('orders', 'store'), 'created')
|
|
31
|
+
|
|
32
|
+
await emitter.connect()
|
|
19
33
|
})
|
|
20
34
|
|
|
21
|
-
|
|
35
|
+
after(async () => {
|
|
36
|
+
await consumer?.disconnect()
|
|
37
|
+
await emitter.disconnect()
|
|
22
38
|
await stage.shutdown()
|
|
23
39
|
|
|
24
40
|
delete process.env.TOA_DEV
|
|
41
|
+
delete process.env.TOA_CONFIGURATION_TEA_POTS
|
|
42
|
+
delete process.env.TOA_OUTBOX_INTERVAL
|
|
25
43
|
})
|
|
26
44
|
|
|
27
45
|
it('should receive event', async () => {
|
|
28
46
|
const created = await remote.invoke('transit', { input: { material: 'glass' } })
|
|
29
47
|
const id = created.id
|
|
30
|
-
const payload = { pot: id }
|
|
31
|
-
const message = { payload }
|
|
32
48
|
const request = { query: { id } }
|
|
33
49
|
|
|
34
|
-
await
|
|
50
|
+
await emitter.emit({ payload: { pot: id } })
|
|
51
|
+
|
|
52
|
+
// the receiver books the pot on delivery, which is asynchronous
|
|
53
|
+
const deadline = Date.now() + 5000
|
|
35
54
|
|
|
36
|
-
|
|
55
|
+
let reply
|
|
37
56
|
|
|
38
|
-
|
|
57
|
+
do {
|
|
58
|
+
await timeout(50)
|
|
59
|
+
|
|
60
|
+
reply = await remote.invoke('observe', request)
|
|
61
|
+
} while (reply.booked !== true && Date.now() < deadline)
|
|
62
|
+
|
|
63
|
+
assert.deepStrictEqual(reply.booked, true)
|
|
39
64
|
})
|
|
40
65
|
|
|
41
66
|
it('should emit event', async () => {
|
|
42
|
-
expect.assertions(1)
|
|
43
|
-
|
|
44
67
|
const material = 'steel'
|
|
45
68
|
|
|
46
|
-
|
|
47
|
-
|
|
69
|
+
const received = new Promise((resolve) => {
|
|
70
|
+
consumer = boot.receive('tea.pots.created', new Subscriber(resolve))
|
|
48
71
|
})
|
|
49
72
|
|
|
73
|
+
consumer = await consumer
|
|
74
|
+
|
|
75
|
+
await consumer.connect()
|
|
50
76
|
await remote.invoke('transit', { input: { material } })
|
|
77
|
+
|
|
78
|
+
const payload = await received
|
|
79
|
+
|
|
80
|
+
assert.deepStrictEqual(payload.material, material)
|
|
51
81
|
})
|
|
82
|
+
|
|
83
|
+
/** What the event consumer hands deliveries to. */
|
|
84
|
+
class Subscriber extends Connector {
|
|
85
|
+
#handler
|
|
86
|
+
|
|
87
|
+
constructor(handler) {
|
|
88
|
+
super()
|
|
89
|
+
|
|
90
|
+
this.#handler = handler
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async receive(message) {
|
|
94
|
+
this.#handler(message.payload)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const AMQP = '@toa.io/bindings.amqp'
|
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import { it, before, after } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
import { resolve } from 'node:path'
|
|
5
|
+
import * as stage from '@toa.io/userland/stage'
|
|
5
6
|
|
|
6
|
-
const root = resolve(
|
|
7
|
+
const root = resolve(import.meta.dirname, '../components')
|
|
7
8
|
|
|
8
|
-
/** @type {toa.core.Component} */
|
|
9
|
+
/** @type {import('@toa.io/core').Component} */
|
|
9
10
|
let component
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
before(async () => {
|
|
12
13
|
process.env.TOA_DEV = '1'
|
|
14
|
+
process.env.TOA_CONFIGURATION_DEFAULT_ECHO = '{}'
|
|
15
|
+
process.env.TOA_CONFIGURATION_TEA_POTS = '{}'
|
|
13
16
|
|
|
14
17
|
const path = resolve(root, 'math.calculations')
|
|
15
18
|
|
|
16
19
|
component = await stage.component(path)
|
|
17
20
|
})
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
after(async () => {
|
|
20
23
|
await stage.shutdown()
|
|
21
24
|
|
|
22
25
|
delete process.env.TOA_DEV
|
|
@@ -28,6 +31,6 @@ it('should invoke', async () => {
|
|
|
28
31
|
|
|
29
32
|
const reply = await component.invoke('add', { input: { a, b } })
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
assert.strictEqual(reply.exception, undefined)
|
|
35
|
+
assert.deepStrictEqual(reply.output, a + b)
|
|
33
36
|
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toa.io/userland",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.301",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "Toa development kit",
|
|
5
6
|
"homepage": "https://toa.io",
|
|
6
7
|
"author": {
|
|
@@ -16,23 +17,27 @@
|
|
|
16
17
|
"url": "https://github.com/toa-io/toa/issues"
|
|
17
18
|
},
|
|
18
19
|
"engines": {
|
|
19
|
-
"node": ">=
|
|
20
|
+
"node": ">= 24.0.0"
|
|
20
21
|
},
|
|
21
22
|
"publishConfig": {
|
|
22
23
|
"access": "public"
|
|
23
24
|
},
|
|
24
25
|
"main": "src/index.js",
|
|
25
|
-
"
|
|
26
|
+
"exports": {
|
|
27
|
+
".": "./src/index.js",
|
|
28
|
+
"./stage": {
|
|
29
|
+
"types": "./stage/types/index.d.ts",
|
|
30
|
+
"default": "./stage/src/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
26
34
|
"dependencies": {
|
|
27
|
-
"@toa.io/boot": "1.0.0-alpha.
|
|
28
|
-
"@toa.io/core": "1.0.0-alpha.
|
|
29
|
-
"@toa.io/
|
|
30
|
-
"@toa.io/
|
|
31
|
-
"@toa.io/
|
|
32
|
-
"@toa.io/
|
|
33
|
-
"@toa.io/storages.null": "0.22.0",
|
|
34
|
-
"@toa.io/yaml": "1.0.0-alpha.30",
|
|
35
|
-
"tap": "16.3.4"
|
|
35
|
+
"@toa.io/boot": "1.0.0-alpha.301",
|
|
36
|
+
"@toa.io/core": "1.0.0-alpha.301",
|
|
37
|
+
"@toa.io/generic": "1.0.0-alpha.301",
|
|
38
|
+
"@toa.io/norm": "1.0.0-alpha.301",
|
|
39
|
+
"@toa.io/schemas": "1.0.0-alpha.301",
|
|
40
|
+
"@toa.io/storages.null": "1.0.0-alpha.301"
|
|
36
41
|
},
|
|
37
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "cc49bc90efd35464b2ad7803246786c607a44685"
|
|
38
43
|
}
|