@voxgig/sdkgen 0.36.0 → 0.38.1

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 (141) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/cmp/Main.js +0 -12
  3. package/dist/cmp/Main.js.map +1 -1
  4. package/package.json +2 -3
  5. package/project/.sdk/model/feature/log.jsonic +1 -1
  6. package/project/.sdk/model/target/js.jsonic +1 -1
  7. package/project/.sdk/model/target/py.jsonic +1 -1
  8. package/project/.sdk/model/target/ts.jsonic +2 -2
  9. package/project/.sdk/src/cmp/go/Config_go.ts +6 -2
  10. package/project/.sdk/src/cmp/js/EntityBase_js.ts +34 -0
  11. package/project/.sdk/src/cmp/js/Main_js.ts +10 -0
  12. package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +33 -0
  13. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +123 -0
  14. package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +152 -0
  15. package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +25 -0
  16. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +65 -0
  17. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +36 -0
  18. package/project/.sdk/src/cmp/js/TestDirect_js.ts +53 -5
  19. package/project/.sdk/src/cmp/js/TestEntity_js.ts +114 -20
  20. package/project/.sdk/src/cmp/js/fragment/Entity.fragment.js +7 -139
  21. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +149 -0
  22. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +6 -10
  23. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +6 -10
  24. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -11
  25. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -11
  26. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -11
  27. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +2 -0
  28. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +0 -2
  29. package/project/.sdk/src/cmp/lua/Config_lua.ts +6 -2
  30. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +3 -1
  31. package/project/.sdk/src/cmp/php/Config_php.ts +6 -2
  32. package/project/.sdk/src/cmp/php/Package_php.ts +2 -2
  33. package/project/.sdk/src/cmp/php/TestDirect_php.ts +2 -2
  34. package/project/.sdk/src/cmp/php/TestEntity_php.ts +10 -15
  35. package/project/.sdk/src/cmp/py/Config_py.ts +6 -2
  36. package/project/.sdk/src/cmp/py/Package_py.ts +1 -1
  37. package/project/.sdk/src/cmp/py/TestEntity_py.ts +3 -1
  38. package/project/.sdk/src/cmp/rb/Config_rb.ts +6 -2
  39. package/project/.sdk/src/cmp/ts/Main_ts.ts +7 -0
  40. package/project/.sdk/tm/go/feature/log_feature.go +1 -1
  41. package/project/.sdk/tm/go/test/runner_test.go +16 -2
  42. package/project/.sdk/tm/js/src/Context.js +142 -0
  43. package/project/.sdk/tm/js/src/Control.js +16 -0
  44. package/project/.sdk/tm/js/src/Operation.js +19 -0
  45. package/project/.sdk/tm/js/src/Point.js +24 -0
  46. package/project/.sdk/tm/js/src/README.md +1 -0
  47. package/project/.sdk/tm/js/src/Response.js +19 -0
  48. package/project/.sdk/tm/js/src/Result.js +21 -0
  49. package/project/.sdk/tm/js/src/Spec.js +26 -0
  50. package/project/.sdk/tm/js/src/feature/README.md +1 -0
  51. package/project/.sdk/tm/js/src/feature/base/BaseFeature.js +45 -0
  52. package/project/.sdk/tm/js/src/feature/log/LogFeature.js +46 -47
  53. package/project/.sdk/tm/js/src/feature/test/TestFeature.js +207 -0
  54. package/project/.sdk/tm/js/src/types.js +22 -0
  55. package/project/.sdk/tm/js/src/utility/CleanUtility.js +31 -0
  56. package/project/.sdk/tm/js/src/utility/DoneUtility.js +11 -4
  57. package/project/.sdk/tm/js/src/utility/FeatureAddUtility.js +42 -0
  58. package/project/.sdk/tm/js/src/utility/FeatureHookUtility.js +25 -0
  59. package/project/.sdk/tm/js/src/utility/FeatureInitUtility.js +11 -0
  60. package/project/.sdk/tm/js/src/utility/FetcherUtility.js +28 -0
  61. package/project/.sdk/tm/js/src/utility/MakeContextUtility.js +11 -0
  62. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +55 -0
  63. package/project/.sdk/tm/js/src/utility/MakeFetchDefUtility.js +44 -0
  64. package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +93 -0
  65. package/project/.sdk/tm/js/src/utility/MakePointUtility.js +77 -0
  66. package/project/.sdk/tm/js/src/utility/MakeRequestUtility.js +63 -0
  67. package/project/.sdk/tm/js/src/utility/MakeResponseUtility.js +55 -0
  68. package/project/.sdk/tm/js/src/utility/MakeResultUtility.js +54 -0
  69. package/project/.sdk/tm/js/src/utility/MakeSpecUtility.js +58 -0
  70. package/project/.sdk/tm/js/src/utility/MakeUrlUtility.js +40 -0
  71. package/project/.sdk/tm/js/src/utility/ParamUtility.js +61 -0
  72. package/project/.sdk/tm/js/src/utility/PrepareAuthUtility.js +41 -0
  73. package/project/.sdk/tm/js/src/utility/PrepareBodyUtility.js +25 -0
  74. package/project/.sdk/tm/js/src/utility/PrepareHeadersUtility.js +18 -0
  75. package/project/.sdk/tm/js/src/utility/{MethodUtility.js → PrepareMethodUtility.js} +7 -7
  76. package/project/.sdk/tm/js/src/utility/PrepareParamsUtility.js +25 -0
  77. package/project/.sdk/tm/js/src/utility/PreparePathUtility.js +13 -0
  78. package/project/.sdk/tm/js/src/utility/PrepareQueryUtility.js +26 -0
  79. package/project/.sdk/tm/js/src/utility/README.md +1 -0
  80. package/project/.sdk/tm/js/src/utility/ResultBasicUtility.js +34 -0
  81. package/project/.sdk/tm/js/src/utility/ResultBodyUtility.js +18 -0
  82. package/project/.sdk/tm/js/src/utility/ResultHeadersUtility.js +22 -0
  83. package/project/.sdk/tm/js/src/utility/StructUtility.js +2219 -1078
  84. package/project/.sdk/tm/js/src/utility/TransformRequestUtility.js +28 -0
  85. package/project/.sdk/tm/js/src/utility/TransformResponseUtility.js +31 -0
  86. package/project/.sdk/tm/js/src/utility/Utility.js +61 -61
  87. package/project/.sdk/tm/js/test/README.md +1 -0
  88. package/project/.sdk/tm/js/test/exists.test.js +16 -0
  89. package/project/.sdk/tm/js/test/runner.js +323 -107
  90. package/project/.sdk/tm/js/test/utility/Custom.test.js +41 -63
  91. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +390 -116
  92. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +728 -175
  93. package/project/.sdk/tm/js/test/utility/index.js +9 -0
  94. package/project/.sdk/tm/js/test/utility.js +72 -0
  95. package/project/.sdk/tm/lua/test/primary_utility_test.lua +1213 -0
  96. package/project/.sdk/tm/lua/test/runner.lua +2 -2
  97. package/project/.sdk/tm/lua/test/struct_runner.lua +602 -0
  98. package/project/.sdk/tm/lua/test/struct_utility_test.lua +959 -0
  99. package/project/.sdk/tm/lua/utility/struct/struct.lua +10 -0
  100. package/project/.sdk/tm/php/feature/TestFeature.php +59 -96
  101. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +1309 -0
  102. package/project/.sdk/tm/php/test/Runner.php +24 -1
  103. package/project/.sdk/tm/php/test/StructRunner.php +275 -0
  104. package/project/.sdk/tm/php/test/StructUtilityTest.php +1336 -0
  105. package/project/.sdk/tm/php/utility/Fetcher.php +6 -2
  106. package/project/.sdk/tm/php/utility/MakeOptions.php +5 -1
  107. package/project/.sdk/tm/php/utility/MakeResult.php +3 -0
  108. package/project/.sdk/tm/php/utility/Param.php +9 -7
  109. package/project/.sdk/tm/php/utility/struct/Struct.php +312 -208
  110. package/project/.sdk/tm/py/test/runner.py +13 -0
  111. package/project/.sdk/tm/py/test/struct_runner.py +411 -0
  112. package/project/.sdk/tm/py/test/test_primary_utility.py +1101 -0
  113. package/project/.sdk/tm/py/test/test_struct_utility.py +751 -0
  114. package/project/.sdk/tm/rb/test/primary_utility_test.rb +1083 -0
  115. package/project/.sdk/tm/rb/test/runner.rb +5 -0
  116. package/project/.sdk/tm/rb/test/struct_runner.rb +309 -0
  117. package/project/.sdk/tm/rb/test/struct_utility_test.rb +670 -0
  118. package/src/cmp/Main.ts +1 -16
  119. package/project/.sdk/src/cmp/js/Quick_js.ts +0 -78
  120. package/project/.sdk/src/cmp/js/TestAcceptEntity_js.ts +0 -13
  121. package/project/.sdk/src/cmp/js/TestAccept_js.ts +0 -18
  122. package/project/.sdk/tm/js/src/utility/AuthUtility.js +0 -21
  123. package/project/.sdk/tm/js/src/utility/BodyUtility.js +0 -29
  124. package/project/.sdk/tm/js/src/utility/ErrorUtility.js +0 -33
  125. package/project/.sdk/tm/js/src/utility/FindparamUtility.js +0 -31
  126. package/project/.sdk/tm/js/src/utility/FullurlUtility.js +0 -39
  127. package/project/.sdk/tm/js/src/utility/HeadersUtility.js +0 -13
  128. package/project/.sdk/tm/js/src/utility/JoinurlUtility.js +0 -14
  129. package/project/.sdk/tm/js/src/utility/OperatorUtility.js +0 -44
  130. package/project/.sdk/tm/js/src/utility/OptionsUtility.js +0 -54
  131. package/project/.sdk/tm/js/src/utility/ParamsUtility.js +0 -21
  132. package/project/.sdk/tm/js/src/utility/QueryUtility.js +0 -21
  133. package/project/.sdk/tm/js/src/utility/ReqformUtility.js +0 -32
  134. package/project/.sdk/tm/js/src/utility/RequestUtility.js +0 -48
  135. package/project/.sdk/tm/js/src/utility/ResbasicUtility.js +0 -27
  136. package/project/.sdk/tm/js/src/utility/ResbodyUtility.js +0 -15
  137. package/project/.sdk/tm/js/src/utility/ResformUtility.js +0 -34
  138. package/project/.sdk/tm/js/src/utility/ResheadersUtility.js +0 -19
  139. package/project/.sdk/tm/js/src/utility/ResponseUtility.js +0 -37
  140. package/project/.sdk/tm/js/src/utility/ResultUtility.js +0 -28
  141. package/project/.sdk/tm/js/src/utility/SpecUtility.js +0 -35
@@ -0,0 +1,142 @@
1
+
2
+ const { inspect } = require('node:util')
3
+
4
+ const { ProjectNameError } = require('./ProjectNameError')
5
+
6
+ const { getprop, setprop, getpath } = require('./utility/StructUtility')
7
+
8
+ const { Operation } = require('./Operation')
9
+ const { Response } = require('./Response')
10
+ const { Result } = require('./Result')
11
+ const { Spec } = require('./Spec')
12
+
13
+
14
+ // TODO: move to own file
15
+ class Context {
16
+
17
+ id = 'C' + ('' + Math.random()).substring(2, 10)
18
+
19
+ // Store the output of each operation step.
20
+ out = {}
21
+
22
+ // Store for the current operation.
23
+ current = new WeakMap()
24
+
25
+
26
+ ctrl = {}
27
+ meta = {}
28
+
29
+ client
30
+ utility
31
+
32
+ op
33
+ point
34
+
35
+ config
36
+ entopts
37
+ options
38
+
39
+ opmap
40
+
41
+ response
42
+ result
43
+ spec
44
+
45
+ data
46
+ reqdata
47
+ match
48
+ reqmatch
49
+
50
+ entity
51
+
52
+ // Shared persistent store.
53
+ shared
54
+
55
+
56
+ constructor(ctxmap, basectx) {
57
+ this.client = getprop(ctxmap, 'client', getprop(basectx, 'client'))
58
+ this.utility = getprop(ctxmap, 'utility', getprop(basectx, 'utility'))
59
+
60
+ this.ctrl = getprop(ctxmap, 'ctrl', getprop(basectx, 'ctrl', this.ctrl))
61
+ this.meta = getprop(ctxmap, 'meta', getprop(basectx, 'meta', this.meta))
62
+
63
+ this.config = getprop(ctxmap, 'config', getprop(basectx, 'config'))
64
+ this.entopts = getprop(ctxmap, 'entopts', getprop(basectx, 'entopts'))
65
+ this.options = getprop(ctxmap, 'options', getprop(basectx, 'options'))
66
+
67
+ this.entity = getprop(ctxmap, 'entity', getprop(basectx, 'entity'))
68
+ this.shared = getprop(ctxmap, 'shared', getprop(basectx, 'shared'))
69
+ this.opmap = getprop(ctxmap, 'opmap', getprop(basectx, 'opmap'))
70
+
71
+ this.data = getprop(ctxmap, 'data', {})
72
+ this.reqdata = getprop(ctxmap, 'reqdata', {})
73
+ this.match = getprop(ctxmap, 'match', {})
74
+ this.reqmatch = getprop(ctxmap, 'reqmatch', {})
75
+
76
+ this.point = getprop(ctxmap, 'point', getprop(basectx, 'point'))
77
+ this.spec = getprop(ctxmap, 'spec', getprop(basectx, 'spec'))
78
+ this.result = getprop(ctxmap, 'result', getprop(basectx, 'result'))
79
+ this.response = getprop(ctxmap, 'response', getprop(basectx, 'response'))
80
+
81
+ const opname = getprop(ctxmap, 'opname')
82
+ this.op = this.resolveOp(opname)
83
+ }
84
+
85
+
86
+ resolveOp(opname) {
87
+ let op = getprop(this.opmap, opname)
88
+
89
+ if (null == op && null != opname) {
90
+ const entname = getprop(this.entity, 'name', '')
91
+ const opcfg = getpath(this.config, ['entity', entname, 'op', opname])
92
+ let input = 'match'
93
+
94
+ if ('update' === opname || 'create' === opname) {
95
+ input = 'data'
96
+ }
97
+
98
+ op = new Operation({
99
+ entity: entname,
100
+ name: opname,
101
+ input,
102
+ points: getprop(opcfg, 'points', [])
103
+ })
104
+
105
+ setprop(this.opmap, opname, op)
106
+ }
107
+
108
+ return op
109
+ }
110
+
111
+
112
+ error(code, msg) {
113
+ return new ProjectNameError(code, msg, this)
114
+ }
115
+
116
+
117
+ toJSON() {
118
+ return {
119
+ id: this.id,
120
+ op: this.op,
121
+ spec: this.spec,
122
+ entity: this.entity,
123
+ result: this.result,
124
+ response: this.response,
125
+ meta: this.meta,
126
+ }
127
+ }
128
+
129
+ toString() {
130
+ return 'Context ' + this.utility?.struct.jsonify(this.toJSON())
131
+ }
132
+
133
+ [inspect.custom]() {
134
+ return this.toString()
135
+ }
136
+
137
+ }
138
+
139
+
140
+ module.exports = {
141
+ Context,
142
+ }
@@ -0,0 +1,16 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+
5
+ class Control {
6
+ constructor(ctrlmap) {
7
+ this.throw = getprop(ctrlmap, 'throw')
8
+ this.err = getprop(ctrlmap, 'err')
9
+ this.explain = getprop(ctrlmap, 'explain')
10
+ }
11
+ }
12
+
13
+
14
+ module.exports = {
15
+ Control,
16
+ }
@@ -0,0 +1,19 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+ const { Point } = require('./Point')
5
+
6
+
7
+ class Operation {
8
+ constructor(opmap) {
9
+ this.entity = getprop(opmap, 'entity', '_')
10
+ this.name = getprop(opmap, 'name', '_')
11
+ this.input = getprop(opmap, 'input', '_')
12
+ this.points = getprop(opmap, 'points', [])
13
+ }
14
+ }
15
+
16
+
17
+ module.exports = {
18
+ Operation,
19
+ }
@@ -0,0 +1,24 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+
5
+ class Point {
6
+ constructor(altmap) {
7
+ this.args = getprop(altmap, 'args', { params: [] })
8
+ this.rename = getprop(altmap, 'rename', { params: {} })
9
+ this.method = getprop(altmap, 'method', '')
10
+ this.orig = getprop(altmap, 'orig', '')
11
+ this.parts = getprop(altmap, 'parts', [])
12
+ this.params = getprop(altmap, 'params', [])
13
+ this.select = getprop(altmap, 'select')
14
+ this.active = getprop(altmap, 'active', false)
15
+ this.relations = getprop(altmap, 'relations', [])
16
+ this.alias = getprop(altmap, 'alias', {})
17
+ this.transform = getprop(altmap, 'transform', { req: undefined, res: undefined })
18
+ }
19
+ }
20
+
21
+
22
+ module.exports = {
23
+ Point,
24
+ }
@@ -0,0 +1 @@
1
+ # src
@@ -0,0 +1,19 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+
5
+ class Response {
6
+ constructor(resmap) {
7
+ this.status = getprop(resmap, 'status', -1)
8
+ this.statusText = getprop(resmap, 'statusText', '')
9
+ this.headers = getprop(resmap, 'headers')
10
+ this.json = resmap.json ? resmap.json.bind(resmap) : async () => undefined
11
+ this.body = getprop(resmap, 'body')
12
+ this.err = getprop(resmap, 'err')
13
+ }
14
+ }
15
+
16
+
17
+ module.exports = {
18
+ Response,
19
+ }
@@ -0,0 +1,21 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+
5
+ class Result {
6
+ constructor(resmap) {
7
+ this.ok = getprop(resmap, 'ok', false)
8
+ this.status = getprop(resmap, 'status', -1)
9
+ this.statusText = getprop(resmap, 'statusText', '')
10
+ this.headers = getprop(resmap, 'headers', {})
11
+ this.body = getprop(resmap, 'body')
12
+ this.err = getprop(resmap, 'err')
13
+ this.resdata = getprop(resmap, 'resdata')
14
+ this.resmatch = getprop(resmap, 'resmatch')
15
+ }
16
+ }
17
+
18
+
19
+ module.exports = {
20
+ Result,
21
+ }
@@ -0,0 +1,26 @@
1
+
2
+ const { getprop } = require('./utility/StructUtility')
3
+
4
+
5
+ class Spec {
6
+ constructor(specmap) {
7
+ this.parts = getprop(specmap, 'parts', [])
8
+ this.headers = getprop(specmap, 'headers', {})
9
+ this.alias = getprop(specmap, 'alias', {})
10
+ this.base = getprop(specmap, 'base', '')
11
+ this.prefix = getprop(specmap, 'prefix', '')
12
+ this.suffix = getprop(specmap, 'suffix', '')
13
+ this.params = getprop(specmap, 'params', {})
14
+ this.query = getprop(specmap, 'query', {})
15
+ this.step = getprop(specmap, 'step', '')
16
+ this.method = getprop(specmap, 'method', 'GET')
17
+ this.body = getprop(specmap, 'body')
18
+ this.url = getprop(specmap, 'url')
19
+ this.path = getprop(specmap, 'path')
20
+ }
21
+ }
22
+
23
+
24
+ module.exports = {
25
+ Spec,
26
+ }
@@ -0,0 +1 @@
1
+ # Feature
@@ -0,0 +1,45 @@
1
+
2
+
3
+ class BaseFeature {
4
+ version = '0.0.1'
5
+ name = 'base'
6
+ active = true
7
+
8
+
9
+ init(_ctx, _options) { }
10
+
11
+
12
+ PostConstruct(_ctx) { }
13
+
14
+ PostConstructEntity(_ctx) { }
15
+
16
+
17
+ SetData(_ctx) { }
18
+
19
+ GetData(_ctx) { }
20
+
21
+ SetMatch(_ctx) { }
22
+
23
+ GetMatch(_ctx) { }
24
+
25
+
26
+ PrePoint(_ctx) { }
27
+
28
+ PreSpec(_ctx) { }
29
+
30
+ PreRequest(_ctx) { }
31
+
32
+ PreResponse(_ctx) { }
33
+
34
+ PreResult(_ctx) { }
35
+
36
+ PreDone(_ctx) { }
37
+
38
+ PreUnexpected(_ctx) { }
39
+
40
+ }
41
+
42
+
43
+ module.exports = {
44
+ BaseFeature
45
+ }
@@ -1,98 +1,97 @@
1
1
 
2
2
 
3
+ const { BaseFeature } = require('../base/BaseFeature')
4
+
5
+
3
6
  const Pino = require('pino')
4
7
  const PinoPretty = require('pino-pretty')
5
8
 
6
9
 
7
- class LogFeature {
8
- version = 'FEATURE_VERSION'
9
-
10
- #client // SDK client instance
11
- #options // SDK client feature options
12
- #config // Feature config from model
13
- #logger // Pino-style interface
14
-
15
- constructor(client, options, config) {
16
- // TOOD: make this a default for all features
17
- options = options || {}
18
- options.active = false !== options.active
19
10
 
20
- this.#client = client
21
- this.#options = options
22
- this.#config = config
11
+ class LogFeature extends BaseFeature {
12
+ version = '0.0.1'
13
+ name = 'log'
14
+ active = true
15
+
16
+ _client
17
+ _options
18
+ _logger
19
+
23
20
 
24
- if(options.active) {
25
- let logger = options.logger
21
+ init(ctx, options) {
22
+ this._client = ctx.client
23
+ this._options = options
24
+ this.active = options.active
26
25
 
27
- if(null ==logger) {
26
+ if (this.active) {
27
+ let logger = this._options.logger
28
+
29
+ if (null == logger) {
28
30
  let pretty = PinoPretty({
29
31
  sync: true,
30
32
  ignore: 'ctx',
31
33
  })
32
34
 
33
- let name = options.name || 'FEATURE_Name'
34
- let level = options.level || 'info'
35
-
36
- logger = Pino({ name, level }, pretty)
35
+ let level = this._options.level || 'info'
36
+
37
+ logger = Pino({ name: 'log', level }, pretty)
38
+
39
+ this._logger = logger
37
40
  }
38
- this.#logger = logger
39
41
  }
40
42
  }
41
43
 
42
- options() {
43
- return { ...this.#options }
44
- }
45
-
46
- client() {
47
- return this.#client
48
- }
49
44
 
50
-
51
45
  PostConstruct(ctx) {
52
- this.#loghook('PostConstruct', ctx)
46
+ this._loghook('PostConstruct', ctx)
53
47
  }
54
48
 
55
49
  PostConstructEntity(ctx) {
56
- this.#loghook('PostConstructEntity', ctx)
50
+ this._loghook('PostConstructEntity', ctx)
57
51
  }
58
52
 
59
53
  SetData(ctx) {
60
- this.#loghook('SetData', ctx)
54
+ this._loghook('SetData', ctx)
61
55
  }
62
-
56
+
63
57
  GetData(ctx) {
64
- this.#loghook('GetData', ctx)
58
+ this._loghook('GetData', ctx)
65
59
  }
66
-
60
+
67
61
  GetMatch(ctx) {
68
- this.#loghook('GetMatch', ctx)
62
+ this._loghook('GetMatch', ctx)
69
63
  }
70
64
 
71
65
 
72
66
  PrePoint(ctx) {
73
- this.#loghook('PrePoint', ctx)
67
+ this._loghook('PrePoint', ctx)
74
68
  }
75
69
 
76
70
  PreSpec(ctx) {
77
- this.#loghook('PreSpec', ctx)
71
+ this._loghook('PreSpec', ctx)
78
72
  }
79
73
 
80
74
  PreRequest(ctx) {
81
- this.#loghook('PreRequest', ctx)
75
+ this._loghook('PreRequest', ctx)
82
76
  }
83
77
 
84
78
  PreResponse(ctx) {
85
- this.#loghook('PreResponse', ctx)
79
+ this._loghook('PreResponse', ctx)
86
80
  }
87
81
 
88
82
  PreResult(ctx) {
89
- this.#loghook('PreResult', ctx)
83
+ this._loghook('PreResult', ctx)
90
84
  }
91
-
92
- #loghook(hook, ctx, level) {
85
+
86
+ _loghook(hook, ctx, level) {
93
87
  level = level || 'info'
94
- if(this.#logger) {
95
- this.#logger[level]({hook,op:ctx.op,spec:ctx.spec,ctx})
88
+ if (this._logger) {
89
+ this._logger[level]({
90
+ hook,
91
+ op: ctx.op,
92
+ spec: ctx.spec,
93
+ ctx
94
+ })
96
95
  }
97
96
  }
98
97
  }
@@ -0,0 +1,207 @@
1
+
2
+ const { BaseFeature } = require('../base/BaseFeature')
3
+
4
+
5
+ const S_NOT_FOUND = 'Not found'
6
+
7
+
8
+ class TestFeature extends BaseFeature {
9
+ version = '0.0.1'
10
+ name = 'test'
11
+ active = true
12
+
13
+ _client
14
+ _options
15
+
16
+
17
+ init(ctx, options) {
18
+ this._client = ctx.client
19
+ this._options = options
20
+
21
+ const struct = ctx.utility.struct
22
+ const walk = struct.walk
23
+ const size = struct.size
24
+ const setprop = struct.setprop
25
+
26
+ const entity = this._options.entity
27
+
28
+ this._client._mode = 'test'
29
+
30
+ // Ensure entity ids are correct.
31
+ walk(entity, (k, v, _parent, path) => {
32
+ if (2 === size(path)) {
33
+ setprop(v, 'id', k)
34
+ }
35
+ return v
36
+ })
37
+
38
+ const self = this
39
+
40
+ function testFetcher(ctx, _fullurl, _fetchdef) {
41
+ const struct = ctx.utility.struct
42
+ const param = ctx.utility.param
43
+
44
+ const getprop = struct.getprop
45
+ const clone = struct.clone
46
+ const merge = struct.merge
47
+ const getelem = struct.getelem
48
+ const select = struct.select
49
+ const delprop = struct.delprop
50
+ const getdef = struct.getdef
51
+
52
+ function respond(status, data, res) {
53
+ const out = merge([
54
+ {
55
+ status,
56
+ statusText: 'OK',
57
+ json: async () => data,
58
+ body: 'not-used',
59
+ },
60
+ getdef(res, {})
61
+ ])
62
+
63
+ const headers = getprop(out, 'headers', {})
64
+
65
+ // JS specific iterator.
66
+ out.headers = {
67
+ forEach(callback) {
68
+ Object.keys(headers).forEach((key) => {
69
+ callback(headers[key], key, this)
70
+ })
71
+ }
72
+ }
73
+
74
+ return out
75
+ }
76
+
77
+
78
+ const op = ctx.op
79
+ const entmap = getprop(entity, op.entity, {})
80
+
81
+ if ('load' === op.name) {
82
+ const args = self.buildArgs(ctx, op, ctx.reqmatch)
83
+ const found = select(entmap, args)
84
+ const ent = getelem(found, 0)
85
+ if (null == ent) {
86
+ return respond(404, undefined, { statusText: S_NOT_FOUND })
87
+ }
88
+ else {
89
+ delprop(ent, '$KEY')
90
+ const out = clone(ent)
91
+ return respond(200, out)
92
+ }
93
+ }
94
+ else if ('list' === op.name) {
95
+ const args = self.buildArgs(ctx, op, ctx.reqmatch)
96
+ const found = select(entmap, args)
97
+ if (null == found) {
98
+ return respond(404, undefined, { statusText: S_NOT_FOUND })
99
+ }
100
+ else {
101
+ found.map((ent) => delprop(ent, '$KEY'))
102
+ const out = clone(found)
103
+ return respond(200, out)
104
+ }
105
+ }
106
+ else if ('update' === op.name) {
107
+ const args = self.buildArgs(ctx, op, ctx.reqdata)
108
+ const found = select(entmap, args)
109
+ const ent = getelem(found, 0)
110
+ if (null == ent) {
111
+ return respond(404, undefined, { statusText: S_NOT_FOUND })
112
+ }
113
+ else {
114
+ merge([ent, (ctx.reqdata || {})])
115
+ delprop(ent, '$KEY')
116
+ const out = clone(ent)
117
+ return respond(200, out)
118
+ }
119
+ }
120
+ else if ('remove' === op.name) {
121
+ const args = self.buildArgs(ctx, op, ctx.reqmatch)
122
+ const found = select(entmap, args)
123
+ const ent = getelem(found, 0)
124
+ if (null == ent) {
125
+ return respond(404, undefined, { statusText: S_NOT_FOUND })
126
+ }
127
+ else {
128
+ delprop(entmap, getprop(ent, 'id'))
129
+ return respond(200)
130
+ }
131
+ }
132
+ else if ('create' === op.name) {
133
+ const args = self.buildArgs(ctx, op, ctx.reqdata)
134
+ let id = param(ctx, 'id')
135
+ if (null == id) {
136
+ id = ((1e4 * Math.random() | 0).toString(16) +
137
+ (1e4 * Math.random() | 0).toString(16) +
138
+ (1e4 * Math.random() | 0).toString(16) +
139
+ (1e4 * Math.random() | 0).toString(16)).padEnd(16, '0')
140
+ }
141
+
142
+ const ent = clone(ctx.reqdata)
143
+ setprop(ent, 'id', id)
144
+ setprop(entmap, id, ent)
145
+ delprop(ent, '$KEY')
146
+ const out = clone(ent)
147
+ return respond(200, out)
148
+ }
149
+ }
150
+
151
+ ctx.utility.fetcher = testFetcher
152
+ }
153
+
154
+
155
+ buildArgs(ctx, op, args) {
156
+ const struct = ctx.utility.struct
157
+ const param = ctx.utility.param
158
+
159
+ const getprop = struct.getprop
160
+ const keysof = struct.keysof
161
+ const getpath = struct.getpath
162
+ const getelem = struct.getelem
163
+ const select = struct.select
164
+ const transform = struct.transform
165
+ const isempty = struct.isempty
166
+
167
+ const opname = getprop(op, 'name')
168
+ const point =
169
+ getelem(getpath(ctx.config, [
170
+ 'entity', getprop(ctx.entity, 'name'), 'op', opname, 'points']), -1)
171
+
172
+ const reqd = transform(
173
+ select(getpath(point, ['args', 'params']), { reqd: true }),
174
+ ['`$EACH`', '', '`$KEY.name`']
175
+ )
176
+
177
+ const qand = []
178
+ const q = { '`$AND`': qand }
179
+
180
+ for (let k of keysof(args)) {
181
+ if ('id' === k || !isempty(select(reqd, k))) {
182
+ const v = param(ctx, k)
183
+ const ka = getprop(op.alias, k)
184
+
185
+ let qor = [{ [k]: v }]
186
+ if (null != ka) {
187
+ qor.push({ [ka]: v })
188
+ }
189
+
190
+ qor = { '`$OR`': qor }
191
+
192
+ qand.push(qor)
193
+ }
194
+ }
195
+
196
+ if (ctx.ctrl.explain) {
197
+ ctx.ctrl.explain.test = { query: q }
198
+ }
199
+
200
+ return q
201
+ }
202
+ }
203
+
204
+
205
+ module.exports = {
206
+ TestFeature
207
+ }
@@ -0,0 +1,22 @@
1
+
2
+ const { ProjectNameEntityBase } = require('./ProjectNameEntityBase')
3
+
4
+ const { Point } = require('./Point')
5
+ const { Context } = require('./Context')
6
+ const { Control } = require('./Control')
7
+ const { Operation } = require('./Operation')
8
+ const { Response } = require('./Response')
9
+ const { Result } = require('./Result')
10
+ const { Spec } = require('./Spec')
11
+
12
+
13
+ module.exports = {
14
+ Point,
15
+ Context,
16
+ Control,
17
+ Operation,
18
+ Response,
19
+ Result,
20
+ Spec,
21
+ ProjectNameEntityBase,
22
+ }