@voxgig/sdkgen 0.36.0 → 0.37.0

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 (135) 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 +1 -1
  5. package/project/.sdk/src/cmp/go/Config_go.ts +6 -2
  6. package/project/.sdk/src/cmp/js/EntityBase_js.ts +34 -0
  7. package/project/.sdk/src/cmp/js/Main_js.ts +10 -0
  8. package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +33 -0
  9. package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +123 -0
  10. package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +152 -0
  11. package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +25 -0
  12. package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +65 -0
  13. package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +36 -0
  14. package/project/.sdk/src/cmp/js/TestDirect_js.ts +53 -5
  15. package/project/.sdk/src/cmp/js/TestEntity_js.ts +114 -20
  16. package/project/.sdk/src/cmp/js/fragment/Entity.fragment.js +7 -139
  17. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +149 -0
  18. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +6 -10
  19. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +6 -10
  20. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -11
  21. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -11
  22. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -11
  23. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +2 -0
  24. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +0 -2
  25. package/project/.sdk/src/cmp/lua/Config_lua.ts +6 -2
  26. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +3 -1
  27. package/project/.sdk/src/cmp/php/Config_php.ts +6 -2
  28. package/project/.sdk/src/cmp/php/TestDirect_php.ts +2 -2
  29. package/project/.sdk/src/cmp/php/TestEntity_php.ts +10 -15
  30. package/project/.sdk/src/cmp/py/Config_py.ts +6 -2
  31. package/project/.sdk/src/cmp/py/TestEntity_py.ts +3 -1
  32. package/project/.sdk/src/cmp/rb/Config_rb.ts +6 -2
  33. package/project/.sdk/src/cmp/ts/Main_ts.ts +7 -0
  34. package/project/.sdk/tm/go/feature/log_feature.go +1 -1
  35. package/project/.sdk/tm/go/test/runner_test.go +16 -2
  36. package/project/.sdk/tm/js/src/Context.js +142 -0
  37. package/project/.sdk/tm/js/src/Control.js +16 -0
  38. package/project/.sdk/tm/js/src/Operation.js +19 -0
  39. package/project/.sdk/tm/js/src/Point.js +24 -0
  40. package/project/.sdk/tm/js/src/README.md +1 -0
  41. package/project/.sdk/tm/js/src/Response.js +19 -0
  42. package/project/.sdk/tm/js/src/Result.js +21 -0
  43. package/project/.sdk/tm/js/src/Spec.js +26 -0
  44. package/project/.sdk/tm/js/src/feature/README.md +1 -0
  45. package/project/.sdk/tm/js/src/feature/base/BaseFeature.js +45 -0
  46. package/project/.sdk/tm/js/src/feature/log/LogFeature.js +46 -47
  47. package/project/.sdk/tm/js/src/feature/test/TestFeature.js +207 -0
  48. package/project/.sdk/tm/js/src/types.js +22 -0
  49. package/project/.sdk/tm/js/src/utility/CleanUtility.js +31 -0
  50. package/project/.sdk/tm/js/src/utility/DoneUtility.js +11 -4
  51. package/project/.sdk/tm/js/src/utility/FeatureAddUtility.js +42 -0
  52. package/project/.sdk/tm/js/src/utility/FeatureHookUtility.js +25 -0
  53. package/project/.sdk/tm/js/src/utility/FeatureInitUtility.js +11 -0
  54. package/project/.sdk/tm/js/src/utility/FetcherUtility.js +28 -0
  55. package/project/.sdk/tm/js/src/utility/MakeContextUtility.js +11 -0
  56. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +55 -0
  57. package/project/.sdk/tm/js/src/utility/MakeFetchDefUtility.js +44 -0
  58. package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +93 -0
  59. package/project/.sdk/tm/js/src/utility/MakePointUtility.js +77 -0
  60. package/project/.sdk/tm/js/src/utility/MakeRequestUtility.js +63 -0
  61. package/project/.sdk/tm/js/src/utility/MakeResponseUtility.js +55 -0
  62. package/project/.sdk/tm/js/src/utility/MakeResultUtility.js +54 -0
  63. package/project/.sdk/tm/js/src/utility/MakeSpecUtility.js +58 -0
  64. package/project/.sdk/tm/js/src/utility/MakeUrlUtility.js +40 -0
  65. package/project/.sdk/tm/js/src/utility/ParamUtility.js +61 -0
  66. package/project/.sdk/tm/js/src/utility/PrepareAuthUtility.js +41 -0
  67. package/project/.sdk/tm/js/src/utility/PrepareBodyUtility.js +25 -0
  68. package/project/.sdk/tm/js/src/utility/PrepareHeadersUtility.js +18 -0
  69. package/project/.sdk/tm/js/src/utility/{MethodUtility.js → PrepareMethodUtility.js} +7 -7
  70. package/project/.sdk/tm/js/src/utility/PrepareParamsUtility.js +25 -0
  71. package/project/.sdk/tm/js/src/utility/PreparePathUtility.js +13 -0
  72. package/project/.sdk/tm/js/src/utility/PrepareQueryUtility.js +26 -0
  73. package/project/.sdk/tm/js/src/utility/README.md +1 -0
  74. package/project/.sdk/tm/js/src/utility/ResultBasicUtility.js +34 -0
  75. package/project/.sdk/tm/js/src/utility/ResultBodyUtility.js +18 -0
  76. package/project/.sdk/tm/js/src/utility/ResultHeadersUtility.js +22 -0
  77. package/project/.sdk/tm/js/src/utility/StructUtility.js +2219 -1078
  78. package/project/.sdk/tm/js/src/utility/TransformRequestUtility.js +28 -0
  79. package/project/.sdk/tm/js/src/utility/TransformResponseUtility.js +31 -0
  80. package/project/.sdk/tm/js/src/utility/Utility.js +61 -61
  81. package/project/.sdk/tm/js/test/README.md +1 -0
  82. package/project/.sdk/tm/js/test/exists.test.js +16 -0
  83. package/project/.sdk/tm/js/test/runner.js +323 -107
  84. package/project/.sdk/tm/js/test/utility/Custom.test.js +41 -63
  85. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +390 -116
  86. package/project/.sdk/tm/js/test/utility/StructUtility.test.js +728 -175
  87. package/project/.sdk/tm/js/test/utility/index.js +9 -0
  88. package/project/.sdk/tm/js/test/utility.js +72 -0
  89. package/project/.sdk/tm/lua/test/primary_utility_test.lua +1213 -0
  90. package/project/.sdk/tm/lua/test/runner.lua +2 -2
  91. package/project/.sdk/tm/lua/test/struct_runner.lua +602 -0
  92. package/project/.sdk/tm/lua/test/struct_utility_test.lua +959 -0
  93. package/project/.sdk/tm/lua/utility/struct/struct.lua +10 -0
  94. package/project/.sdk/tm/php/feature/TestFeature.php +59 -96
  95. package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +1309 -0
  96. package/project/.sdk/tm/php/test/Runner.php +24 -1
  97. package/project/.sdk/tm/php/test/StructRunner.php +275 -0
  98. package/project/.sdk/tm/php/test/StructUtilityTest.php +1336 -0
  99. package/project/.sdk/tm/php/utility/Fetcher.php +6 -2
  100. package/project/.sdk/tm/php/utility/MakeOptions.php +5 -1
  101. package/project/.sdk/tm/php/utility/MakeResult.php +3 -0
  102. package/project/.sdk/tm/php/utility/Param.php +9 -7
  103. package/project/.sdk/tm/php/utility/struct/Struct.php +312 -208
  104. package/project/.sdk/tm/py/test/runner.py +13 -0
  105. package/project/.sdk/tm/py/test/struct_runner.py +411 -0
  106. package/project/.sdk/tm/py/test/test_primary_utility.py +1101 -0
  107. package/project/.sdk/tm/py/test/test_struct_utility.py +751 -0
  108. package/project/.sdk/tm/rb/test/primary_utility_test.rb +1083 -0
  109. package/project/.sdk/tm/rb/test/runner.rb +5 -0
  110. package/project/.sdk/tm/rb/test/struct_runner.rb +309 -0
  111. package/project/.sdk/tm/rb/test/struct_utility_test.rb +670 -0
  112. package/src/cmp/Main.ts +1 -16
  113. package/project/.sdk/src/cmp/js/Quick_js.ts +0 -78
  114. package/project/.sdk/src/cmp/js/TestAcceptEntity_js.ts +0 -13
  115. package/project/.sdk/src/cmp/js/TestAccept_js.ts +0 -18
  116. package/project/.sdk/tm/js/src/utility/AuthUtility.js +0 -21
  117. package/project/.sdk/tm/js/src/utility/BodyUtility.js +0 -29
  118. package/project/.sdk/tm/js/src/utility/ErrorUtility.js +0 -33
  119. package/project/.sdk/tm/js/src/utility/FindparamUtility.js +0 -31
  120. package/project/.sdk/tm/js/src/utility/FullurlUtility.js +0 -39
  121. package/project/.sdk/tm/js/src/utility/HeadersUtility.js +0 -13
  122. package/project/.sdk/tm/js/src/utility/JoinurlUtility.js +0 -14
  123. package/project/.sdk/tm/js/src/utility/OperatorUtility.js +0 -44
  124. package/project/.sdk/tm/js/src/utility/OptionsUtility.js +0 -54
  125. package/project/.sdk/tm/js/src/utility/ParamsUtility.js +0 -21
  126. package/project/.sdk/tm/js/src/utility/QueryUtility.js +0 -21
  127. package/project/.sdk/tm/js/src/utility/ReqformUtility.js +0 -32
  128. package/project/.sdk/tm/js/src/utility/RequestUtility.js +0 -48
  129. package/project/.sdk/tm/js/src/utility/ResbasicUtility.js +0 -27
  130. package/project/.sdk/tm/js/src/utility/ResbodyUtility.js +0 -15
  131. package/project/.sdk/tm/js/src/utility/ResformUtility.js +0 -34
  132. package/project/.sdk/tm/js/src/utility/ResheadersUtility.js +0 -19
  133. package/project/.sdk/tm/js/src/utility/ResponseUtility.js +0 -37
  134. package/project/.sdk/tm/js/src/utility/ResultUtility.js +0 -28
  135. package/project/.sdk/tm/js/src/utility/SpecUtility.js +0 -35
@@ -0,0 +1,55 @@
1
+
2
+ const { Result } = require('../Result')
3
+
4
+ const { clean } = require('./CleanUtility')
5
+ const { clone, delprop } = require('./StructUtility')
6
+
7
+ function makeError(ctx, err) {
8
+
9
+ ctx = ctx || {}
10
+ const op = ctx.op || {}
11
+ op.name = op.name || 'unknown operation'
12
+
13
+ const result = ctx.result || new Result({})
14
+ result.ok = false
15
+
16
+ const reserr = result.err
17
+
18
+ err = undefined === err ? reserr : err
19
+ err = err || ctx.error('unknown', 'unknown error')
20
+
21
+ const errmsg = err.message || 'unknown error'
22
+ const msg = 'ProjectNameSDK: ' + op.name + ': ' + errmsg
23
+ err.message = clean(ctx, msg)
24
+
25
+ if (result.err) {
26
+ delprop(result, 'err')
27
+ }
28
+
29
+ const spec = ctx.spec || {}
30
+
31
+ if (ctx.ctrl.explain) {
32
+ ctx.ctrl.explain.err = {
33
+ ...clone({ err }).err,
34
+ message: err.message,
35
+ stack: err.stack,
36
+ }
37
+ }
38
+
39
+ err.result = clean(ctx, result)
40
+ err.spec = clean(ctx, spec)
41
+
42
+ ctx.ctrl.err = err
43
+
44
+ // TODO: model option to return instead
45
+ if (false === ctx.ctrl.throw) {
46
+ return result.resdata
47
+ }
48
+ else {
49
+ throw err
50
+ }
51
+ }
52
+
53
+ module.exports = {
54
+ makeError
55
+ }
@@ -0,0 +1,44 @@
1
+
2
+ const { Result } = require('../Result')
3
+
4
+ function makeFetchDef(ctx) {
5
+ const spec = ctx.spec
6
+ const utility = ctx.utility
7
+ const makeUrl = utility.makeUrl
8
+ const struct = utility.struct
9
+ const jsonify = struct.jsonify
10
+
11
+ if (null == spec) {
12
+ return ctx.error('fetchdef_no_spec', 'Expected context spec property to be defined.')
13
+ }
14
+
15
+ if (null == ctx.result) {
16
+ ctx.result = new Result({})
17
+ }
18
+
19
+ spec.step = 'prepare'
20
+
21
+ const url = makeUrl(ctx)
22
+ if (url instanceof Error) {
23
+ return url
24
+ }
25
+
26
+ spec.url = url
27
+
28
+ const fetchdef = {
29
+ url,
30
+ method: spec.method,
31
+ headers: spec.headers,
32
+ }
33
+
34
+ if (null != spec.body) {
35
+ fetchdef.body =
36
+ 'object' === typeof spec.body ? jsonify(spec.body) : spec.body
37
+ }
38
+
39
+ return fetchdef
40
+ }
41
+
42
+ module.exports = {
43
+ makeFetchDef
44
+ }
@@ -0,0 +1,93 @@
1
+
2
+ function makeOptions(ctx) {
3
+ const utility = ctx.utility
4
+ const options = ctx.options
5
+ const struct = utility.struct
6
+ const items = struct.items
7
+ const setprop = struct.setprop
8
+ const merge = struct.merge
9
+ const validate = struct.validate
10
+ const escre = struct.escre
11
+
12
+ let opts = { ...(options || {}) }
13
+
14
+ const customUtils = opts.utility || {}
15
+ for (let [key, val] of items(customUtils)) {
16
+ setprop(utility, key, val)
17
+ }
18
+
19
+ let config = ctx.config || {}
20
+ let cfgopts = config.options || {}
21
+
22
+ // Standard SDK option values.
23
+ const optspec = {
24
+ apikey: '',
25
+ base: 'http://localhost:8000',
26
+ prefix: '',
27
+ suffix: '',
28
+ auth: {
29
+ prefix: ''
30
+ },
31
+ headers: {
32
+ '`$CHILD`': '`$STRING`'
33
+ },
34
+ allow: {
35
+ method: 'GET,PUT,POST,PATCH,DELETE,OPTIONS',
36
+ op: 'create,update,load,list,remove,command,direct'
37
+ },
38
+ entity: {
39
+ '`$CHILD`': {
40
+ '`$OPEN`': true,
41
+ active: false,
42
+ alias: {}
43
+ }
44
+ },
45
+ feature: {
46
+ '`$CHILD`': {
47
+ '`$OPEN`': true,
48
+ active: false,
49
+ }
50
+ },
51
+ utility: {},
52
+ system: {
53
+ fetch: undefined
54
+ },
55
+ test: {
56
+ active: false,
57
+ entity: {
58
+ '`$OPEN`': true,
59
+ }
60
+ },
61
+ clean: {
62
+ keys: 'key,token,id'
63
+ }
64
+ }
65
+
66
+ // JavaScript specific option values.
67
+ optspec.system.fetch = opts.system?.fetch || global.fetch
68
+
69
+ opts = merge([{}, cfgopts, opts])
70
+
71
+ opts = validate(opts, optspec)
72
+
73
+ opts.__derived__ = {
74
+ clean: {
75
+ keyre: undefined
76
+ }
77
+ }
78
+
79
+ const keyre = opts.clean.keys
80
+ .split(/\s*,\s*/)
81
+ .filter((s) => null != s && '' !== s)
82
+ .map((key) => escre(key)).join('|')
83
+
84
+ if ('' != keyre) {
85
+ opts.__derived__.clean.keyre = keyre
86
+ }
87
+
88
+ return opts
89
+ }
90
+
91
+ module.exports = {
92
+ makeOptions
93
+ }
@@ -0,0 +1,77 @@
1
+
2
+ function makePoint(ctx) {
3
+ if (ctx.out.point) {
4
+ return ctx.point = ctx.out.point
5
+ }
6
+
7
+ const getprop = ctx.utility.struct.getprop
8
+ const op = ctx.op
9
+ const options = ctx.options
10
+
11
+ if (!options.allow.op.includes(op.name)) {
12
+ return ctx.error('point_op_allow', 'Operation "' + op.name +
13
+ '" not allowed by SDK option allow.op value: "' + options.allow.op + '"')
14
+ }
15
+
16
+ if (0 === op.points.length) {
17
+ return ctx.error('point_no_points',
18
+ 'Operation "' + op.name + '" has no endpoint definitions.')
19
+ }
20
+
21
+ // Choose the appropriate point based on the match or data.
22
+ if (1 === op.points.length) {
23
+ ctx.point = op.points[0]
24
+ }
25
+ else {
26
+ // Operation argument has priority, but also look in current data or match.
27
+ const reqselector = getprop(ctx, 'req' + op.input)
28
+ const selector = getprop(ctx, op.input)
29
+
30
+ let point
31
+ for (let i = 0; i < op.points.length; i++) {
32
+ point = op.points[i]
33
+ const select = point.select
34
+ let found = true
35
+
36
+ if (selector && select.exist) {
37
+ for (let j = 0; j < select.exist.length; j++) {
38
+ const existkey = select.exist[j]
39
+
40
+ if (
41
+ undefined === getprop(reqselector, existkey)
42
+ && undefined === getprop(selector, existkey)
43
+ ) {
44
+ found = false
45
+ break
46
+ }
47
+ }
48
+ }
49
+
50
+ // Action is only in operation argument.
51
+ if (found && reqselector.$action !== select.$action) {
52
+ found = false
53
+ }
54
+
55
+ if (found) {
56
+ break
57
+ }
58
+ }
59
+
60
+ if (
61
+ null != reqselector.$action &&
62
+ null != point &&
63
+ reqselector.$action !== point.select.$action
64
+ ) {
65
+ return ctx.error('point_action_invalid', 'Operation "' + op.name +
66
+ '" action "' + reqselector.$action + '" is not valid.')
67
+ }
68
+
69
+ ctx.point = point
70
+ }
71
+
72
+ return ctx.point
73
+ }
74
+
75
+ module.exports = {
76
+ makePoint,
77
+ }
@@ -0,0 +1,63 @@
1
+
2
+ const { Response } = require('../Response')
3
+ const { Result } = require('../Result')
4
+
5
+ async function makeRequest(ctx) {
6
+ // PreRequest feature hook has already provided a result.
7
+ if (ctx.out.request) {
8
+ return ctx.out.request
9
+ }
10
+
11
+ const spec = ctx.spec
12
+ const utility = ctx.utility
13
+ const fetcher = utility.fetcher
14
+ const makeFetchDef = utility.makeFetchDef
15
+
16
+ let response = new Response({})
17
+
18
+ let result = new Result({})
19
+
20
+ ctx.result = result
21
+
22
+ if (null == spec) {
23
+ return ctx.error('request_no_spec', 'Expected context spec property to be defined.')
24
+ }
25
+
26
+ try {
27
+ const fetchdef = makeFetchDef(ctx)
28
+ if (fetchdef instanceof Error) {
29
+ throw fetchdef
30
+ }
31
+
32
+ if (ctx.ctrl.explain) {
33
+ ctx.ctrl.explain.fetchdef = fetchdef
34
+ }
35
+
36
+ spec.step = 'prerequest'
37
+
38
+ const fetched = await fetcher(ctx, fetchdef.url, fetchdef)
39
+
40
+ if (null == fetched) {
41
+ response = new Response({ err: ctx.error('request_no_response', 'response: undefined') })
42
+ }
43
+ else if (fetched instanceof Error) {
44
+ response = new Response({ err: fetched })
45
+ }
46
+ else {
47
+ response = new Response(fetched)
48
+ }
49
+ }
50
+ catch (err) {
51
+ response.err = err
52
+ }
53
+
54
+ spec.step = 'postrequest'
55
+
56
+ ctx.response = response
57
+
58
+ return response
59
+ }
60
+
61
+ module.exports = {
62
+ makeRequest
63
+ }
@@ -0,0 +1,55 @@
1
+
2
+ async function makeResponse(ctx) {
3
+ // PreResponse feature hook has already provided a result.
4
+ if (ctx.out.response) {
5
+ return ctx.out.response
6
+ }
7
+
8
+ const utility = ctx.utility
9
+ const resultBasic = utility.resultBasic
10
+ const resultHeaders = utility.resultHeaders
11
+ const resultBody = utility.resultBody
12
+ const transformResponse = utility.transformResponse
13
+
14
+ const spec = ctx.spec
15
+ const result = ctx.result
16
+ const response = ctx.response
17
+
18
+ if (null == spec) {
19
+ return ctx.error('response_no_spec', 'Expected context spec property to be defined.')
20
+ }
21
+
22
+ if (null == response) {
23
+ return ctx.error('response_no_response', 'Expected context response property to be defined.')
24
+ }
25
+
26
+ if (null == result) {
27
+ return ctx.error('response_no_result', 'Expected context result property to be defined.')
28
+ }
29
+
30
+ spec.step = 'response'
31
+
32
+ try {
33
+ resultBasic(ctx)
34
+ resultHeaders(ctx)
35
+ await resultBody(ctx)
36
+ transformResponse(ctx)
37
+
38
+ if (null == result.err) {
39
+ result.ok = true
40
+ }
41
+ }
42
+ catch (err) {
43
+ result.err = err
44
+ }
45
+
46
+ if (ctx.ctrl.explain) {
47
+ ctx.ctrl.explain.result = result
48
+ }
49
+
50
+ return response
51
+ }
52
+
53
+ module.exports = {
54
+ makeResponse
55
+ }
@@ -0,0 +1,54 @@
1
+
2
+ const { Result } = require('../Result')
3
+
4
+ function makeResult(ctx) {
5
+ // PreResult feature hook has already provided a result.
6
+ if (ctx.out.result) {
7
+ return ctx.out.result
8
+ }
9
+
10
+ const utility = ctx.utility
11
+ const transformResponse = utility.transformResponse
12
+
13
+ const op = ctx.op
14
+ const entity = ctx.entity
15
+
16
+ const spec = ctx.spec
17
+ const result = ctx.result
18
+
19
+ if (null == spec) {
20
+ return ctx.error('result_no_spec', 'Expected context spec property to be defined.')
21
+ }
22
+
23
+ if (null == result) {
24
+ return ctx.error('result_no_result', 'Expected context result property to be defined.')
25
+ }
26
+
27
+ spec.step = 'result'
28
+
29
+ transformResponse(ctx)
30
+
31
+ if ('list' == op.name) {
32
+ const resdata = result.resdata
33
+ result.resdata = []
34
+
35
+ if (null != resdata && 0 < resdata.length) {
36
+ for (let entry of resdata) {
37
+ const ent = entity.make()
38
+ ent.data(entry)
39
+ result.resdata.push(ent)
40
+ }
41
+ }
42
+ }
43
+
44
+ if (ctx.ctrl.explain) {
45
+ ctx.ctrl.explain.result = result
46
+ }
47
+
48
+ // NOTE: returns processesd result.
49
+ return result
50
+ }
51
+
52
+ module.exports = {
53
+ makeResult
54
+ }
@@ -0,0 +1,58 @@
1
+
2
+ const { Spec } = require('../Spec')
3
+
4
+ // Create request specificaton.
5
+ function makeSpec(ctx) {
6
+ if (ctx.out.spec) {
7
+ return ctx.spec = ctx.out.spec
8
+ }
9
+
10
+ const point = ctx.point
11
+ const options = ctx.options
12
+ const utility = ctx.utility
13
+
14
+ const prepareMethod = utility.prepareMethod
15
+ const prepareParams = utility.prepareParams
16
+ const prepareQuery = utility.prepareQuery
17
+ const prepareHeaders = utility.prepareHeaders
18
+ const prepareBody = utility.prepareBody
19
+ const preparePath = utility.preparePath
20
+ const prepareAuth = utility.prepareAuth
21
+
22
+ ctx.spec = new Spec({
23
+ base: options.base,
24
+ prefix: options.prefix,
25
+ parts: point.parts,
26
+ suffix: options.suffix,
27
+ step: 'start',
28
+ })
29
+
30
+ ctx.spec.method = prepareMethod(ctx)
31
+
32
+ if (!options.allow.method.includes(ctx.spec.method)) {
33
+ return ctx.error('spec_method_allow', 'Method "' + ctx.spec.method +
34
+ '" not allowed by SDK option allow.method value: "' + options.allow.method + '"')
35
+ }
36
+
37
+ ctx.spec.params = prepareParams(ctx)
38
+ ctx.spec.query = prepareQuery(ctx)
39
+ ctx.spec.headers = prepareHeaders(ctx)
40
+ ctx.spec.body = prepareBody(ctx)
41
+ ctx.spec.path = preparePath(ctx)
42
+
43
+ if (ctx.ctrl.explain) {
44
+ ctx.ctrl.explain.spec = ctx.spec
45
+ }
46
+
47
+ const spec = prepareAuth(ctx)
48
+
49
+ if (!(spec instanceof Error)) {
50
+ ctx.spec = spec
51
+ }
52
+
53
+ return spec
54
+ }
55
+
56
+ module.exports = {
57
+ makeSpec
58
+ }
@@ -0,0 +1,40 @@
1
+
2
+ function makeUrl(ctx) {
3
+ const utility = ctx.utility
4
+ const spec = ctx.spec
5
+ const result = ctx.result
6
+
7
+ const struct = utility.struct
8
+ const escurl = struct.escurl
9
+ const escre = struct.escre
10
+ const join = struct.join
11
+ const items = struct.items
12
+
13
+ if (null == spec) {
14
+ return ctx.error('url_no_spec', 'Expected context spec property to be defined.')
15
+ }
16
+
17
+ if (null == result) {
18
+ return ctx.error('url_no_result', 'Expected context result property to be defined.')
19
+ }
20
+
21
+ let url = join([spec.base, spec.prefix, spec.path, spec.suffix], '/', true)
22
+ let resmatch = {}
23
+
24
+ const params = spec.params
25
+
26
+ for (let [key, val] of items(params)) {
27
+ if (null != val) {
28
+ url = url.replace(RegExp('{' + escre(key) + '}'), escurl(val))
29
+ resmatch[key] = val
30
+ }
31
+ }
32
+
33
+ result.resmatch = resmatch
34
+
35
+ return url
36
+ }
37
+
38
+ module.exports = {
39
+ makeUrl
40
+ }
@@ -0,0 +1,61 @@
1
+
2
+ function param(ctx, paramdef) {
3
+ const point = ctx.point
4
+ const spec = ctx.spec
5
+ const match = ctx.match
6
+ const reqmatch = ctx.reqmatch
7
+ const data = ctx.data
8
+ const reqdata = ctx.reqdata
9
+
10
+ const utility = ctx.utility
11
+ const struct = utility.struct
12
+
13
+ const getprop = struct.getprop
14
+ const setprop = struct.setprop
15
+
16
+ const typify = struct.typify
17
+ const T_string = struct.T_string
18
+
19
+ const pt = typify(paramdef)
20
+
21
+ const key = 0 < (T_string & pt) ? paramdef : getprop(paramdef, 'name')
22
+
23
+ let akey = getprop(point.alias, key)
24
+
25
+ let val = getprop(reqmatch, key)
26
+
27
+ if (null == val) {
28
+ val = getprop(match, key)
29
+ }
30
+
31
+ if (null == val && null != akey) {
32
+
33
+ if (null != spec) {
34
+ setprop(spec.alias, akey, key)
35
+ }
36
+
37
+ val = getprop(reqmatch, akey)
38
+ }
39
+
40
+ if (null == val) {
41
+ val = getprop(reqdata, key)
42
+ }
43
+
44
+ if (null == val) {
45
+ val = getprop(data, key)
46
+ }
47
+
48
+ if (null == val && null != akey) {
49
+ val = getprop(reqdata, akey)
50
+
51
+ if (null == val) {
52
+ val = getprop(data, akey)
53
+ }
54
+ }
55
+
56
+ return val
57
+ }
58
+
59
+ module.exports = {
60
+ param
61
+ }
@@ -0,0 +1,41 @@
1
+
2
+ const HEADER_auth = 'authorization'
3
+
4
+ const OPTION_apikey = 'apikey'
5
+
6
+ const NOTFOUND = '__NOTFOUND__'
7
+
8
+ function prepareAuth(ctx) {
9
+ const utility = ctx.utility
10
+
11
+ const struct = utility.struct
12
+ const getprop = struct.getprop
13
+ const setprop = struct.setprop
14
+ const delprop = struct.delprop
15
+
16
+ const client = ctx.client
17
+ const spec = ctx.spec
18
+
19
+ if (null == spec) {
20
+ return ctx.error('auth_no_spec', 'Expected context spec property to be defined.')
21
+ }
22
+
23
+ const headers = spec.headers
24
+
25
+ const options = client.options()
26
+
27
+ const apikey = getprop(options, OPTION_apikey, NOTFOUND)
28
+
29
+ if (NOTFOUND === apikey) {
30
+ delprop(headers, HEADER_auth)
31
+ }
32
+ else {
33
+ setprop(headers, HEADER_auth, options.auth.prefix + ' ' + apikey)
34
+ }
35
+
36
+ return spec
37
+ }
38
+
39
+ module.exports = {
40
+ prepareAuth
41
+ }
@@ -0,0 +1,25 @@
1
+
2
+ function prepareBody(ctx) {
3
+ const op = ctx.op
4
+
5
+ const utility = ctx.utility
6
+ const error = utility.makeError
7
+ const transformRequest = utility.transformRequest
8
+
9
+ let body = undefined
10
+
11
+ if ('data' === op.input) {
12
+ try {
13
+ body = transformRequest(ctx)
14
+ }
15
+ catch (err) {
16
+ return error(ctx, err)
17
+ }
18
+ }
19
+
20
+ return body
21
+ }
22
+
23
+ module.exports = {
24
+ prepareBody
25
+ }
@@ -0,0 +1,18 @@
1
+
2
+ function prepareHeaders(ctx) {
3
+ const struct = ctx.utility.struct
4
+ const clone = struct.clone
5
+ const getprop = struct.getprop
6
+
7
+ const client = ctx.client
8
+
9
+ const options = client.options()
10
+
11
+ let out = clone(getprop(options, 'headers', {}))
12
+
13
+ return out
14
+ }
15
+
16
+ module.exports = {
17
+ prepareHeaders
18
+ }