@toa.io/core 1.0.0-alpha.21 → 1.0.0-alpha.212

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.
Files changed (48) hide show
  1. package/package.json +7 -9
  2. package/src/call.js +6 -0
  3. package/src/cascade.js +2 -3
  4. package/src/component.js +15 -18
  5. package/src/composition.js +1 -1
  6. package/src/connector.js +4 -10
  7. package/src/context.js +4 -0
  8. package/src/contract/contract.js +22 -0
  9. package/src/contract/reply.js +26 -9
  10. package/src/contract/request.js +15 -5
  11. package/src/contract/schemas/query.yaml +14 -1
  12. package/src/discovery.js +2 -5
  13. package/src/effect.js +19 -0
  14. package/src/entities/changeset.js +5 -8
  15. package/src/entities/entity.js +48 -23
  16. package/src/entities/factory.js +15 -4
  17. package/src/entities/newid.js +11 -0
  18. package/src/entities/set.js +13 -0
  19. package/src/exceptions.js +26 -19
  20. package/src/exposition.js +3 -2
  21. package/src/guard.js +17 -0
  22. package/src/index.js +6 -0
  23. package/src/observation.js +1 -9
  24. package/src/operation.js +28 -7
  25. package/src/query/options.js +3 -2
  26. package/src/query.js +3 -1
  27. package/src/receiver.js +17 -10
  28. package/src/remote.js +5 -7
  29. package/src/state.js +69 -33
  30. package/src/transition.js +8 -19
  31. package/src/transmission.js +12 -3
  32. package/src/unmanaged.js +11 -0
  33. package/test/component.test.js +4 -3
  34. package/test/contract/conditions.test.js +5 -5
  35. package/test/contract/request.test.js +7 -7
  36. package/test/entities/entity.test.js +0 -45
  37. package/test/entities/factory.test.js +3 -3
  38. package/test/state.test.js +0 -14
  39. package/types/bindings.d.ts +7 -5
  40. package/types/component.d.ts +4 -1
  41. package/types/extensions.d.ts +4 -3
  42. package/types/index.ts +1 -0
  43. package/types/operations.d.ts +6 -0
  44. package/types/query.d.ts +2 -0
  45. package/types/remote.d.ts +18 -0
  46. package/types/request.d.ts +4 -0
  47. package/types/storages.d.ts +11 -9
  48. package/src/contract/conditions.js +0 -21
@@ -3,10 +3,10 @@
3
3
  const clone = require('clone-deep')
4
4
  const { generate } = require('randomstring')
5
5
 
6
- jest.mock('../../src/contract/conditions')
6
+ jest.mock('../../src/contract/contract')
7
7
 
8
8
  const { Request } = require('../../src/contract/request')
9
- const { Conditions } = require('../../src/contract/conditions')
9
+ const { Contract } = require('../../src/contract/contract')
10
10
  const fixtures = require('./contract.fixtures')
11
11
 
12
12
  let contract
@@ -14,14 +14,14 @@ let contract
14
14
  beforeEach(() => {
15
15
  jest.clearAllMocks()
16
16
 
17
- contract = new Request(fixtures.schema)
17
+ contract = new Request(fixtures.schema, {})
18
18
  })
19
19
 
20
20
  const dummy = { schema: { properties: {} } }
21
21
 
22
22
  it('should extend Conditions', () => {
23
- expect(contract).toBeInstanceOf(Conditions)
24
- expect(Conditions).toHaveBeenCalledWith(fixtures.schema)
23
+ expect(contract).toBeInstanceOf(Contract)
24
+ expect(Contract).toHaveBeenCalledWith(fixtures.schema)
25
25
  })
26
26
 
27
27
  it('should fit request', () => {
@@ -29,7 +29,7 @@ it('should fit request', () => {
29
29
 
30
30
  contract.fit(request)
31
31
 
32
- expect(Conditions.mock.instances[0].fit).toHaveBeenCalledWith(request)
32
+ expect(Contract.mock.instances[0].fit).toHaveBeenCalledWith(request)
33
33
  })
34
34
 
35
35
  describe('schema', () => {
@@ -59,7 +59,7 @@ describe('schema', () => {
59
59
 
60
60
  it('should not contain query if declaration.query is false', () => {
61
61
  schema.properties.query = { type: 'null' }
62
- expect(Request.schema({ query: false }, dummy)).toStrictEqual(schema)
62
+ expect(Request.schema({ query: false }, dummy)).toMatchObject(schema)
63
63
  })
64
64
 
65
65
  it('should require query if declaration.query is true', () => {
@@ -7,35 +7,7 @@ beforeEach(() => {
7
7
  jest.clearAllMocks()
8
8
  })
9
9
 
10
- describe('new', () => {
11
- it('should throw on schema error', () => {
12
- const entity = new Entity(fixtures.schema)
13
-
14
- expect(() => entity.set(fixtures.failed())).toThrow()
15
- })
16
-
17
- it('should provide state', () => {
18
- const entity = new Entity(fixtures.schema)
19
- const state = fixtures.state()
20
-
21
- entity.set(state)
22
-
23
- expect(entity.get()).toEqual(state)
24
- })
25
- })
26
-
27
10
  describe('argument', () => {
28
- it('should provide initial state if no argument passed', () => {
29
- const entity = new Entity(fixtures.schema)
30
- const defaults = fixtures.schema.defaults.mock.results[0].value
31
- const expected = {
32
- ...defaults,
33
- _version: 0
34
- }
35
-
36
- expect(entity.get()).toStrictEqual(expect.objectContaining(expected))
37
- })
38
-
39
11
  it('should set state', () => {
40
12
  const state = fixtures.state()
41
13
  const entity = new Entity(fixtures.schema, state)
@@ -63,20 +35,3 @@ it('should provide event', () => {
63
35
  })
64
36
  }))
65
37
  })
66
-
67
- it('should define `id` as readonly', async () => {
68
- const origin = fixtures.state()
69
- const entity = new Entity(fixtures.schema, origin)
70
- const state = entity.get()
71
-
72
- expect(() => (state.id = 1)).toThrow('assign to read only property')
73
- })
74
-
75
- it('should seal id', async () => {
76
- const origin = fixtures.state()
77
- const entity = new Entity(fixtures.schema, origin)
78
- const state = entity.get()
79
- const redefine = () => Object.defineProperty(state, 'id', { writable: true })
80
-
81
- expect(redefine).toThrow('redefine property')
82
- })
@@ -23,14 +23,14 @@ it('should create initial', () => {
23
23
  const initial = factory.init(id)
24
24
 
25
25
  expect(initial).toBeInstanceOf(mock.Entity)
26
- expect(initial.constructor).toHaveBeenCalledWith(fixtures.schema, id)
26
+ expect(initial.constructor).toHaveBeenCalledWith(fixtures.schema, id, expect.any(Function))
27
27
  })
28
28
 
29
29
  it('should create instance', () => {
30
30
  const object = factory.object(fixtures.entity)
31
31
 
32
32
  expect(object).toBeInstanceOf(mock.Entity)
33
- expect(object.constructor).toHaveBeenCalledWith(fixtures.schema, fixtures.entity)
33
+ expect(object.constructor).toHaveBeenCalledWith(fixtures.schema, fixtures.entity, expect.any(Function))
34
34
  })
35
35
 
36
36
  it('should create set', () => {
@@ -39,7 +39,7 @@ it('should create set', () => {
39
39
  expect(objects).toBeInstanceOf(mock.EntitySet)
40
40
 
41
41
  const instances = fixtures.set.map((entity, index) => {
42
- expect(mock.Entity).toHaveBeenNthCalledWith(index + 1, fixtures.schema, entity)
42
+ expect(mock.Entity).toHaveBeenNthCalledWith(index + 1, fixtures.schema, entity, expect.any(Function))
43
43
 
44
44
  return mock.Entity.mock.instances[index]
45
45
  })
@@ -19,14 +19,6 @@ it('should provide object', async () => {
19
19
  expect(fixtures.factory.object).toHaveBeenCalledWith(fixtures.storage.get.mock.results[0].value)
20
20
  })
21
21
 
22
- it('should provide objects', async () => {
23
- const set = await state.objects(fixtures.query)
24
-
25
- expect(fixtures.storage.find).toHaveBeenCalledWith(fixtures.query)
26
- expect(set).toStrictEqual(fixtures.factory.objects.mock.results[0].value)
27
- expect(fixtures.factory.objects).toHaveBeenCalledWith(fixtures.storage.find.mock.results[0].value)
28
- })
29
-
30
22
  it('should store entity', async () => {
31
23
  await state.commit(fixtures.initial)
32
24
 
@@ -38,9 +30,3 @@ it('should emit', async () => {
38
30
 
39
31
  expect(fixtures.emitter.emit).toHaveBeenCalledWith(fixtures.entity.event.mock.results[0].value)
40
32
  })
41
-
42
- it('should not emit if state has not been changed', async () => {
43
- await state.commit(fixtures.unchanged)
44
-
45
- expect(fixtures.emitter.emit).not.toHaveBeenCalled()
46
- })
@@ -1,26 +1,28 @@
1
1
  import * as _core from './index'
2
2
 
3
- declare namespace toa.core.bindings{
3
+ declare namespace toa.core.bindings {
4
4
 
5
5
  type Properties = {
6
6
  async?: boolean
7
7
  }
8
8
 
9
- interface Consumer extends _core.Connector{
9
+ interface Consumer extends _core.Connector {
10
10
  request (request: Request): Promise<_core.Reply>
11
+
12
+ task (request: Request): Promise<void>
11
13
  }
12
14
 
13
- interface Emitter extends _core.Connector{
15
+ interface Emitter extends _core.Connector {
14
16
  emit (message: _core.Message): Promise<void>
15
17
  }
16
18
 
17
- interface Broadcast<L> extends _core.Connector{
19
+ interface Broadcast<L> extends _core.Connector {
18
20
  transmit<T> (label: L, payload: T): Promise<void>
19
21
 
20
22
  receive<T> (label: L, callback: (payload: T) => void | Promise<void>): Promise<void>
21
23
  }
22
24
 
23
- interface Factory{
25
+ interface Factory {
24
26
  producer? (locator: _core.Locator, endpoints: Array<string>, producer: _core.Component): _core.Connector
25
27
 
26
28
  consumer? (locator: _core.Locator, endpoint: string): Consumer
@@ -1,9 +1,12 @@
1
1
  import { Connector } from './connector'
2
2
  import { Locator } from './locator'
3
3
  import { Request } from './request'
4
+ import { Operation } from './operations'
4
5
 
5
- export interface Component extends Connector{
6
+ export class Component extends Connector {
6
7
  locator: Locator
7
8
 
9
+ constructor (locator: Locator, operations: Record<string, Operation>)
10
+
8
11
  invoke<T = any> (endpoint: string, request: Request): Promise<T>
9
12
  }
@@ -3,9 +3,10 @@ import * as _component from './component'
3
3
  import * as _context from './context'
4
4
  import * as _storages from './storages'
5
5
  import * as _bindings from './bindings'
6
+ import { Manifest } from '@toa.io/norm'
6
7
 
7
- export interface Factory{
8
- tenant? (locator: _core.Locator, manifest: object): _core.Connector
8
+ export interface Factory {
9
+ tenant? (locator: _core.Locator, manifest: object, component: Manifest): _core.Connector
9
10
 
10
11
  aspect? (locator: _core.Locator, manifest: object | null): Aspect | Aspect[]
11
12
 
@@ -22,7 +23,7 @@ export interface Factory{
22
23
  receiver? (receiver: _core.Receiver, locator: _core.Locator): _core.Receiver
23
24
  }
24
25
 
25
- export interface Aspect extends _core.Connector{
26
+ export interface Aspect extends _core.Connector {
26
27
  name: string
27
28
 
28
29
  invoke (...args: any[]): any
package/types/index.ts CHANGED
@@ -5,6 +5,7 @@ export * as bridges from './bridges'
5
5
  export * as operations from './operations'
6
6
 
7
7
  export type { Component } from './component'
8
+ export type { Remote } from './remote'
8
9
  export { Connector } from './connector'
9
10
  export type { Context } from './context'
10
11
  export type { Exception } from './exception'
@@ -1,2 +1,8 @@
1
+ import { Request } from './request'
2
+
1
3
  export type type = 'transition' | 'observation' | 'assignment' | 'computation' | 'effect'
2
4
  export type scope = 'object' | 'objects' | 'changeset'
5
+
6
+ export class Operation {
7
+ invoke<T = any> (request: Request): Promise<T>
8
+ }
package/types/query.d.ts CHANGED
@@ -4,6 +4,8 @@ declare namespace toa.core {
4
4
  id?: string
5
5
  version?: number
6
6
  criteria?: Object
7
+ search?: string
8
+ sample?: number
7
9
  omit?: number
8
10
  limit?: number
9
11
  sort?: string[]
@@ -0,0 +1,18 @@
1
+ import { Component } from './component'
2
+
3
+ export class Remote extends Component {
4
+ explain (endpoint: string): Promise<Explanation>
5
+ }
6
+
7
+ interface Explanation {
8
+ input: Schema | null
9
+ output: Schema | null
10
+ errors?: string[]
11
+ }
12
+
13
+ interface Schema {
14
+ type: string
15
+ properties: {
16
+ [key: string]: Schema
17
+ }
18
+ }
@@ -3,17 +3,21 @@ import { Exception } from './exception'
3
3
  export interface Query {
4
4
  id?: string
5
5
  criteria?: string
6
+ search?: string
7
+ sample?: number
6
8
  omit?: number
7
9
  limit?: number
8
10
  sort?: Array<string>
9
11
  projection?: Array<string>
10
12
  version?: number
13
+ deleted?: boolean
11
14
  }
12
15
 
13
16
  export interface Request {
14
17
  input?: any
15
18
  query?: Query
16
19
  authentic?: boolean
20
+ task?: boolean
17
21
  }
18
22
 
19
23
  export interface Reply {
@@ -30,36 +30,38 @@ declare namespace toa.core {
30
30
  id?: string
31
31
  version?: number
32
32
  criteria?: ast.Node
33
+ search?: string
34
+ sample?: number
33
35
  options?: Object
34
36
  }
35
37
 
36
38
  interface Migration {
37
- disconnect(): Promise<void>
39
+ disconnect (): Promise<void>
38
40
 
39
- database(name: string): Promise<void>
41
+ database (name: string): Promise<void>
40
42
 
41
- table(database: string, locator: Locator, schema: Object, reset?: boolean): Promise<string>
43
+ table (database: string, locator: Locator, schema: Object, reset?: boolean): Promise<string>
42
44
  }
43
45
 
44
46
  interface Factory {
45
- storage(locator: Locator, properties?: object): Storage
47
+ storage (locator: Locator, properties?: object): Storage
46
48
 
47
- migration?(driver?: string): Migration
49
+ migration? (driver?: string): Migration
48
50
  }
49
51
  }
50
52
 
51
53
  interface Storage extends Connector {
52
54
  // object observation
53
- get?(query: storages.Query): Promise<storages.Record | null>
55
+ get? (query: storages.Query): Promise<storages.Record | null>
54
56
 
55
57
  // objects observation
56
- find?(query: storages.Query): Promise<storages.Record[]>
58
+ find? (query: storages.Query): Promise<storages.Record[]>
57
59
 
58
60
  // commit
59
- store?(record: storages.Record): Promise<boolean>
61
+ store? (record: storages.Record): Promise<boolean>
60
62
 
61
63
  // assignment
62
- upsert?(query: storages.Query, changeset: Object, insert: storages.Record): Promise<storages.Record>
64
+ upsert? (query: storages.Query, changeset: Object, insert: storages.Record): Promise<storages.Record>
63
65
  }
64
66
 
65
67
  }
@@ -1,21 +0,0 @@
1
- 'use strict'
2
-
3
- const { SystemException } = require('../exceptions')
4
-
5
- class Conditions {
6
- #schema
7
-
8
- constructor (schema) {
9
- this.#schema = schema
10
- }
11
-
12
- fit (value) {
13
- const error = this.#schema.fit(value)
14
-
15
- if (error !== null) throw new this.constructor.Exception(error)
16
- }
17
-
18
- static Exception = SystemException
19
- }
20
-
21
- exports.Conditions = Conditions