@toa.io/norm 1.0.0-alpha.28 → 1.0.0-alpha.282

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 (72) hide show
  1. package/CHANGELOG.md +184 -0
  2. package/package.json +8 -7
  3. package/src/.component/.expand/bridge.js +2 -6
  4. package/src/.component/.expand/entity.js +2 -9
  5. package/src/.component/.expand/events.js +2 -6
  6. package/src/.component/.expand/extensions.js +4 -8
  7. package/src/.component/.expand/index.js +8 -19
  8. package/src/.component/.expand/operations.js +2 -9
  9. package/src/.component/.expand/properties.js +2 -6
  10. package/src/.component/.expand/receivers.js +2 -6
  11. package/src/.component/.expand/version.js +39 -27
  12. package/src/.component/.normalize/events.js +12 -5
  13. package/src/.component/.normalize/index.js +3 -9
  14. package/src/.component/.normalize/operations.js +2 -6
  15. package/src/.component/.normalize/receivers.js +1 -5
  16. package/src/.component/collapse.js +7 -6
  17. package/src/.component/defaults.js +14 -7
  18. package/src/.component/dependencies.js +7 -6
  19. package/src/.component/dereference.js +8 -7
  20. package/src/.component/expand.js +2 -15
  21. package/src/.component/extensions.js +13 -7
  22. package/src/.component/index.js +9 -21
  23. package/src/.component/merge.js +22 -9
  24. package/src/.component/normalize.js +3 -7
  25. package/src/.component/schema.yaml +81 -41
  26. package/src/.component/validate.js +15 -16
  27. package/src/.context/.dependencies/connectors.js +2 -6
  28. package/src/.context/.dependencies/describe.js +1 -5
  29. package/src/.context/.dependencies/extensions.js +11 -10
  30. package/src/.context/.dependencies/index.js +3 -9
  31. package/src/.context/.dependencies/load.js +14 -13
  32. package/src/.context/.dependencies/resolve.js +23 -6
  33. package/src/.context/complete.js +1 -5
  34. package/src/.context/dependencies.js +2 -6
  35. package/src/.context/dereference.js +1 -5
  36. package/src/.context/expand.js +2 -6
  37. package/src/.context/index.js +6 -15
  38. package/src/.context/normalize.js +2 -6
  39. package/src/.context/schema.yaml +115 -7
  40. package/src/.context/validate.js +8 -14
  41. package/src/component.js +31 -28
  42. package/src/context.js +28 -20
  43. package/src/index.js +3 -9
  44. package/src/shortcuts.js +7 -12
  45. package/test/component/collapse.fixtures.js +2 -5
  46. package/test/component/collapse.test.js +17 -10
  47. package/test/component/dependencies.test.js +12 -10
  48. package/test/component/dereference.fixtures.js +2 -7
  49. package/test/component/dereference.test.js +9 -8
  50. package/test/component/dummies/extension/index.js +1 -5
  51. package/test/component/expand.fixtures.js +13 -13
  52. package/test/component/expand.test.js +25 -10
  53. package/test/component/normalize.fixtures.js +3 -7
  54. package/test/component/normalize.test.js +27 -17
  55. package/test/component/validate.fixtures.js +1 -5
  56. package/test/component/validate.test.js +89 -90
  57. package/test/context/complete.fixtures.js +2 -8
  58. package/test/context/complete.test.js +10 -8
  59. package/test/context/dependencies.load.test.js +13 -12
  60. package/test/context/dereference.fixtures.js +3 -9
  61. package/test/context/dereference.test.js +8 -7
  62. package/test/context/expand.fixtures.js +1 -5
  63. package/test/context/expand.test.js +9 -8
  64. package/test/context/normalize.fixtures.js +2 -7
  65. package/test/context/normalize.test.js +10 -8
  66. package/test/context/validate.fixtures.js +1 -6
  67. package/test/context/validate.test.js +31 -30
  68. package/test/shortcuts.fixtures.js +4 -9
  69. package/test/shortcuts.test.js +16 -15
  70. package/types/context/declaration.d.ts +23 -2
  71. package/types/context.d.ts +2 -2
  72. package/types/index.d.ts +3 -3
@@ -1,13 +1,10 @@
1
- 'use strict'
2
-
3
- const context = {
1
+ export const context = {
4
2
  runtime: {
5
3
  version: '0.0.0'
6
4
  },
7
5
  name: 'test',
8
6
  description: 'context fixture',
9
7
  version: '0.0.0',
10
- packages: 'namespaces/**/*',
11
8
  build: {
12
9
  command: 'echo test'
13
10
  },
@@ -37,5 +34,3 @@ const context = {
37
34
  }
38
35
  }
39
36
  }
40
-
41
- exports.context = context
@@ -1,14 +1,15 @@
1
- 'use strict'
1
+ import { describe, it, before, beforeEach } from 'node:test'
2
+ import assert from 'node:assert/strict'
2
3
 
3
- const clone = require('clone-deep')
4
+ import clone from 'clone-deep'
4
5
 
5
- const { validate } = require('../../src/.context')
6
- const fixtures = require('./validate.fixtures')
6
+ import { validate } from '../../src/.context/index.js'
7
+ import * as fixtures from './validate.fixtures.js'
7
8
 
8
9
  let context
9
10
 
10
- beforeAll(() => {
11
- expect(() => validate(fixtures.context)).not.toThrow()
11
+ before(() => {
12
+ assert.doesNotThrow(() => validate(fixtures.context))
12
13
  })
13
14
 
14
15
  beforeEach(() => {
@@ -18,23 +19,23 @@ beforeEach(() => {
18
19
  describe('runtime', () => {
19
20
  it('should require', () => {
20
21
  delete context.runtime
21
- expect(() => validate(context)).toThrow(/required/)
22
+ assert.throws(() => validate(context), (error) => /required/.test(error.message))
22
23
  })
23
24
 
24
25
  it('should require registry to match uri format', () => {
25
26
  context.runtime.registry = 'not-a-uri'
26
- expect(() => validate(context)).toThrow(/must match format/)
27
+ assert.throws(() => validate(context), (error) => /must match format/.test(error.message))
27
28
 
28
29
  context.runtime.registry = 'http://localhost'
29
- expect(() => validate(context)).not.toThrow()
30
+ assert.doesNotThrow(() => validate(context))
30
31
  })
31
32
 
32
33
  it('should require proxy to match uri format', () => {
33
34
  context.runtime.proxy = 'not-a-uri'
34
- expect(() => validate(context)).toThrow(/must match format/)
35
+ assert.throws(() => validate(context), (error) => /must match format/.test(error.message))
35
36
 
36
37
  context.runtime.proxy = 'http://localhost'
37
- expect(() => validate(context)).not.toThrow()
38
+ assert.doesNotThrow(() => validate(context))
38
39
  })
39
40
  })
40
41
 
@@ -42,13 +43,7 @@ describe('registry', () => {
42
43
  it('should require', () => {
43
44
  delete context.registry
44
45
 
45
- expect(() => validate(context)).toThrow(/required property 'registry'/)
46
- })
47
-
48
- it('should require base', () => {
49
- delete context.registry.base
50
-
51
- expect(() => validate(context)).toThrow(/required property 'base'/)
46
+ assert.throws(() => validate(context), (error) => /required property 'registry'/.test(error.message))
52
47
  })
53
48
 
54
49
  it('should set default platforms', () => {
@@ -56,29 +51,35 @@ describe('registry', () => {
56
51
 
57
52
  validate(context)
58
53
 
59
- expect(context.registry.platforms).toBeInstanceOf(Array)
60
- expect(context.registry.platforms).toStrictEqual(['linux/amd64', 'linux/arm/v7', 'linux/arm64'])
54
+ assert.ok(context.registry.platforms instanceof Array)
55
+ assert.deepStrictEqual(context.registry.platforms, ['linux/amd64', 'linux/arm/v7', 'linux/arm64'])
61
56
  })
62
57
  })
63
58
 
64
59
  it('should require name as label', () => {
65
60
  delete context.name
66
- expect(() => validate(context)).toThrow(/required/)
61
+ assert.throws(() => validate(context), (error) => /required/.test(error.message))
67
62
 
68
63
  context.name = 'foo bar'
69
- expect(() => validate(context)).toThrow(/pattern/)
64
+ assert.throws(() => validate(context), (error) => /pattern/.test(error.message))
70
65
 
71
66
  context.name = 'foo-bar'
72
- expect(() => validate(context)).not.toThrow(/pattern/)
73
- })
74
-
75
- it('should set default packages location', () => {
76
- delete context.packages
77
- expect(() => validate(context)).not.toThrow()
78
- expect(context.packages).toBe('components/*')
67
+ assert.doesNotThrow(() => validate(context))
79
68
  })
80
69
 
81
70
  it('should require registry url', () => {
82
71
  delete context.registry
83
- expect(() => validate(context)).toThrow(/required/)
72
+ assert.throws(() => validate(context), (error) => /required/.test(error.message))
73
+ })
74
+
75
+ it('should allow mono replicas and resources', () => {
76
+ context.mono = {
77
+ replicas: 2,
78
+ resources: {
79
+ cpu: ['200m', '2'],
80
+ memory: ['256Mi', '2Gi']
81
+ }
82
+ }
83
+
84
+ assert.doesNotThrow(() => validate(context))
84
85
  })
@@ -1,14 +1,9 @@
1
- 'use strict'
1
+ import { generate } from 'randomstring'
2
+ import { random } from '@toa.io/generic'
2
3
 
3
- const { generate } = require('randomstring')
4
- const { random } = require('@toa.io/generic')
5
-
6
- const SHORTCUTS = {
4
+ export const SHORTCUTS = {
7
5
  amqp: '@toa.io/bindings.amqp',
8
6
  mongodb: '@toa.io/storages.mongodb'
9
7
  }
10
8
 
11
- const object = { foo: random(), bar: { baz: generate() } }
12
-
13
- exports.object = object
14
- exports.SHORTCUTS = SHORTCUTS
9
+ export const object = { foo: random(), bar: { baz: generate() } }
@@ -1,10 +1,11 @@
1
- 'use strict'
1
+ import { describe, it, beforeEach } from 'node:test'
2
+ import assert from 'node:assert/strict'
2
3
 
3
- const clone = require('clone-deep')
4
- const { generate } = require('randomstring')
4
+ import clone from 'clone-deep'
5
+ import { generate } from 'randomstring'
5
6
 
6
- const { recognize, resolve } = require('../src/shortcuts')
7
- const fixtures = require('./shortcuts.fixtures')
7
+ import { recognize, resolve } from '../src/shortcuts.js'
8
+ import * as fixtures from './shortcuts.fixtures.js'
8
9
 
9
10
  let object
10
11
 
@@ -14,16 +15,16 @@ beforeEach(() => {
14
15
 
15
16
  describe('resolve', () => {
16
17
  it('should be defined', () => {
17
- expect(resolve).toBeDefined()
18
+ assert.notStrictEqual(resolve, undefined)
18
19
  })
19
20
 
20
21
  it('should resolve', () => {
21
- expect(Object.keys(fixtures.SHORTCUTS).length).toBeGreaterThan(0)
22
+ assert.ok(Object.keys(fixtures.SHORTCUTS).length > 0)
22
23
 
23
24
  for (const [key, value] of Object.entries(fixtures.SHORTCUTS)) {
24
25
  const resolved = resolve(key)
25
26
 
26
- expect(resolved).toStrictEqual(value)
27
+ assert.deepStrictEqual(resolved, value)
27
28
  }
28
29
  })
29
30
  })
@@ -32,7 +33,7 @@ describe('recognize', () => {
32
33
  it('should not change unknown', () => {
33
34
  recognize(fixtures.SHORTCUTS, object)
34
35
 
35
- expect(object).toStrictEqual(fixtures.object)
36
+ assert.deepStrictEqual(object, fixtures.object)
36
37
  })
37
38
 
38
39
  it('should resolve known', () => {
@@ -41,8 +42,8 @@ describe('recognize', () => {
41
42
  recognize(fixtures.SHORTCUTS, object)
42
43
 
43
44
  for (const [alias, name] of Object.entries(fixtures.SHORTCUTS)) {
44
- expect(object[alias]).toBeUndefined()
45
- expect(object[name]).toStrictEqual(known[name])
45
+ assert.strictEqual(object[alias], undefined)
46
+ assert.deepStrictEqual(object[name], known[name])
46
47
  }
47
48
  })
48
49
 
@@ -52,9 +53,9 @@ describe('recognize', () => {
52
53
 
53
54
  recognize(fixtures.SHORTCUTS, object, group)
54
55
 
55
- expect(object[group]).toStrictEqual(known)
56
+ assert.deepStrictEqual(object[group], known)
56
57
 
57
- for (const alias of Object.keys(fixtures.SHORTCUTS)) expect(object[alias]).toBeUndefined()
58
+ for (const alias of Object.keys(fixtures.SHORTCUTS)) assert.strictEqual(object[alias], undefined)
58
59
  })
59
60
 
60
61
  it('should not overwrite group', () => {
@@ -67,7 +68,7 @@ describe('recognize', () => {
67
68
 
68
69
  recognize(fixtures.SHORTCUTS, object, group)
69
70
 
70
- expect(object[group]).toStrictEqual(expect.objectContaining(existing))
71
+ assert.partialDeepStrictEqual(object[group], existing)
71
72
  })
72
73
 
73
74
  it('should not create empty group', () => {
@@ -75,7 +76,7 @@ describe('recognize', () => {
75
76
 
76
77
  recognize(object, group)
77
78
 
78
- expect(object[group]).toBeUndefined()
79
+ assert.strictEqual(object[group], undefined)
79
80
  })
80
81
 
81
82
  const append = () => {
@@ -1,17 +1,38 @@
1
- import { Composition, Registry, Runtime } from '../context'
1
+ import { Composition, Registry, Runtime } from '../context.js'
2
2
 
3
3
  interface Composition {
4
4
  name: string,
5
5
  components: string[]
6
6
  }
7
7
 
8
+ export interface Resources {
9
+ cpu?: [string, string]
10
+ memory?: [string, string]
11
+ }
12
+
13
+ export interface Mono {
14
+ replicas?: number
15
+ resources?: Resources
16
+ }
17
+
18
+ /**
19
+ * Cluster-level ingress configuration, applied to every service that declares one.
20
+ */
21
+ export interface Ingress {
22
+ hosts?: string[]
23
+ class?: string
24
+ annotations?: Record<string, string>
25
+ default?: boolean
26
+ }
27
+
8
28
  export interface Declaration {
9
29
  name: string
10
30
  description?: string
11
31
  version?: string
12
32
  runtime?: Runtime | string
13
33
  registry?: Registry | string
14
- packages?: string
15
34
  compositions?: Composition[]
35
+ mono?: Mono
36
+ ingress?: Ingress
16
37
  annotations?: Record<string, object>
17
38
  }
@@ -1,6 +1,6 @@
1
- import { Manifest } from './component'
1
+ import { Manifest } from './component.js'
2
2
  import { Locator } from '@toa.io/core'
3
- import type { Declaration } from './context/declaration'
3
+ import type { Declaration } from './context/declaration.js'
4
4
 
5
5
  interface Runtime{
6
6
  version: string
package/types/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * as context from './context'
2
- export * as component from './component'
1
+ export * as context from './context.js'
2
+ export * as component from './component.js'
3
3
 
4
- export { Manifest } from './component'
4
+ export { Manifest } from './component.js'