@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.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/cmp/Main.js +0 -12
- package/dist/cmp/Main.js.map +1 -1
- package/package.json +1 -1
- package/project/.sdk/src/cmp/go/Config_go.ts +6 -2
- package/project/.sdk/src/cmp/js/EntityBase_js.ts +34 -0
- package/project/.sdk/src/cmp/js/Main_js.ts +10 -0
- package/project/.sdk/src/cmp/js/ReadmeExplanation_js.ts +33 -0
- package/project/.sdk/src/cmp/js/ReadmeHowto_js.ts +123 -0
- package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +152 -0
- package/project/.sdk/src/cmp/js/ReadmeTopHowto_js.ts +25 -0
- package/project/.sdk/src/cmp/js/ReadmeTopQuick_js.ts +65 -0
- package/project/.sdk/src/cmp/js/ReadmeTopTest_js.ts +36 -0
- package/project/.sdk/src/cmp/js/TestDirect_js.ts +53 -5
- package/project/.sdk/src/cmp/js/TestEntity_js.ts +114 -20
- package/project/.sdk/src/cmp/js/fragment/Entity.fragment.js +7 -139
- package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +149 -0
- package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +6 -10
- package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +6 -10
- package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -11
- package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +2 -0
- package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +0 -2
- package/project/.sdk/src/cmp/lua/Config_lua.ts +6 -2
- package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +3 -1
- package/project/.sdk/src/cmp/php/Config_php.ts +6 -2
- package/project/.sdk/src/cmp/php/TestDirect_php.ts +2 -2
- package/project/.sdk/src/cmp/php/TestEntity_php.ts +10 -15
- package/project/.sdk/src/cmp/py/Config_py.ts +6 -2
- package/project/.sdk/src/cmp/py/TestEntity_py.ts +3 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +6 -2
- package/project/.sdk/src/cmp/ts/Main_ts.ts +7 -0
- package/project/.sdk/tm/go/feature/log_feature.go +1 -1
- package/project/.sdk/tm/go/test/runner_test.go +16 -2
- package/project/.sdk/tm/js/src/Context.js +142 -0
- package/project/.sdk/tm/js/src/Control.js +16 -0
- package/project/.sdk/tm/js/src/Operation.js +19 -0
- package/project/.sdk/tm/js/src/Point.js +24 -0
- package/project/.sdk/tm/js/src/README.md +1 -0
- package/project/.sdk/tm/js/src/Response.js +19 -0
- package/project/.sdk/tm/js/src/Result.js +21 -0
- package/project/.sdk/tm/js/src/Spec.js +26 -0
- package/project/.sdk/tm/js/src/feature/README.md +1 -0
- package/project/.sdk/tm/js/src/feature/base/BaseFeature.js +45 -0
- package/project/.sdk/tm/js/src/feature/log/LogFeature.js +46 -47
- package/project/.sdk/tm/js/src/feature/test/TestFeature.js +207 -0
- package/project/.sdk/tm/js/src/types.js +22 -0
- package/project/.sdk/tm/js/src/utility/CleanUtility.js +31 -0
- package/project/.sdk/tm/js/src/utility/DoneUtility.js +11 -4
- package/project/.sdk/tm/js/src/utility/FeatureAddUtility.js +42 -0
- package/project/.sdk/tm/js/src/utility/FeatureHookUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/FeatureInitUtility.js +11 -0
- package/project/.sdk/tm/js/src/utility/FetcherUtility.js +28 -0
- package/project/.sdk/tm/js/src/utility/MakeContextUtility.js +11 -0
- package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +55 -0
- package/project/.sdk/tm/js/src/utility/MakeFetchDefUtility.js +44 -0
- package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +93 -0
- package/project/.sdk/tm/js/src/utility/MakePointUtility.js +77 -0
- package/project/.sdk/tm/js/src/utility/MakeRequestUtility.js +63 -0
- package/project/.sdk/tm/js/src/utility/MakeResponseUtility.js +55 -0
- package/project/.sdk/tm/js/src/utility/MakeResultUtility.js +54 -0
- package/project/.sdk/tm/js/src/utility/MakeSpecUtility.js +58 -0
- package/project/.sdk/tm/js/src/utility/MakeUrlUtility.js +40 -0
- package/project/.sdk/tm/js/src/utility/ParamUtility.js +61 -0
- package/project/.sdk/tm/js/src/utility/PrepareAuthUtility.js +41 -0
- package/project/.sdk/tm/js/src/utility/PrepareBodyUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/PrepareHeadersUtility.js +18 -0
- package/project/.sdk/tm/js/src/utility/{MethodUtility.js → PrepareMethodUtility.js} +7 -7
- package/project/.sdk/tm/js/src/utility/PrepareParamsUtility.js +25 -0
- package/project/.sdk/tm/js/src/utility/PreparePathUtility.js +13 -0
- package/project/.sdk/tm/js/src/utility/PrepareQueryUtility.js +26 -0
- package/project/.sdk/tm/js/src/utility/README.md +1 -0
- package/project/.sdk/tm/js/src/utility/ResultBasicUtility.js +34 -0
- package/project/.sdk/tm/js/src/utility/ResultBodyUtility.js +18 -0
- package/project/.sdk/tm/js/src/utility/ResultHeadersUtility.js +22 -0
- package/project/.sdk/tm/js/src/utility/StructUtility.js +2219 -1078
- package/project/.sdk/tm/js/src/utility/TransformRequestUtility.js +28 -0
- package/project/.sdk/tm/js/src/utility/TransformResponseUtility.js +31 -0
- package/project/.sdk/tm/js/src/utility/Utility.js +61 -61
- package/project/.sdk/tm/js/test/README.md +1 -0
- package/project/.sdk/tm/js/test/exists.test.js +16 -0
- package/project/.sdk/tm/js/test/runner.js +323 -107
- package/project/.sdk/tm/js/test/utility/Custom.test.js +41 -63
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +390 -116
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +728 -175
- package/project/.sdk/tm/js/test/utility/index.js +9 -0
- package/project/.sdk/tm/js/test/utility.js +72 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +1213 -0
- package/project/.sdk/tm/lua/test/runner.lua +2 -2
- package/project/.sdk/tm/lua/test/struct_runner.lua +602 -0
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +959 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +10 -0
- package/project/.sdk/tm/php/feature/TestFeature.php +59 -96
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +1309 -0
- package/project/.sdk/tm/php/test/Runner.php +24 -1
- package/project/.sdk/tm/php/test/StructRunner.php +275 -0
- package/project/.sdk/tm/php/test/StructUtilityTest.php +1336 -0
- package/project/.sdk/tm/php/utility/Fetcher.php +6 -2
- package/project/.sdk/tm/php/utility/MakeOptions.php +5 -1
- package/project/.sdk/tm/php/utility/MakeResult.php +3 -0
- package/project/.sdk/tm/php/utility/Param.php +9 -7
- package/project/.sdk/tm/php/utility/struct/Struct.php +312 -208
- package/project/.sdk/tm/py/test/runner.py +13 -0
- package/project/.sdk/tm/py/test/struct_runner.py +411 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +1101 -0
- package/project/.sdk/tm/py/test/test_struct_utility.py +751 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +1083 -0
- package/project/.sdk/tm/rb/test/runner.rb +5 -0
- package/project/.sdk/tm/rb/test/struct_runner.rb +309 -0
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +670 -0
- package/src/cmp/Main.ts +1 -16
- package/project/.sdk/src/cmp/js/Quick_js.ts +0 -78
- package/project/.sdk/src/cmp/js/TestAcceptEntity_js.ts +0 -13
- package/project/.sdk/src/cmp/js/TestAccept_js.ts +0 -18
- package/project/.sdk/tm/js/src/utility/AuthUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/BodyUtility.js +0 -29
- package/project/.sdk/tm/js/src/utility/ErrorUtility.js +0 -33
- package/project/.sdk/tm/js/src/utility/FindparamUtility.js +0 -31
- package/project/.sdk/tm/js/src/utility/FullurlUtility.js +0 -39
- package/project/.sdk/tm/js/src/utility/HeadersUtility.js +0 -13
- package/project/.sdk/tm/js/src/utility/JoinurlUtility.js +0 -14
- package/project/.sdk/tm/js/src/utility/OperatorUtility.js +0 -44
- package/project/.sdk/tm/js/src/utility/OptionsUtility.js +0 -54
- package/project/.sdk/tm/js/src/utility/ParamsUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/QueryUtility.js +0 -21
- package/project/.sdk/tm/js/src/utility/ReqformUtility.js +0 -32
- package/project/.sdk/tm/js/src/utility/RequestUtility.js +0 -48
- package/project/.sdk/tm/js/src/utility/ResbasicUtility.js +0 -27
- package/project/.sdk/tm/js/src/utility/ResbodyUtility.js +0 -15
- package/project/.sdk/tm/js/src/utility/ResformUtility.js +0 -34
- package/project/.sdk/tm/js/src/utility/ResheadersUtility.js +0 -19
- package/project/.sdk/tm/js/src/utility/ResponseUtility.js +0 -37
- package/project/.sdk/tm/js/src/utility/ResultUtility.js +0 -28
- 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
|
+
}
|