@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.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/cmp/Main.js +0 -12
- package/dist/cmp/Main.js.map +1 -1
- package/package.json +2 -3
- package/project/.sdk/model/feature/log.jsonic +1 -1
- package/project/.sdk/model/target/js.jsonic +1 -1
- package/project/.sdk/model/target/py.jsonic +1 -1
- package/project/.sdk/model/target/ts.jsonic +2 -2
- 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/Package_php.ts +2 -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/Package_py.ts +1 -1
- 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,31 @@
|
|
|
1
|
+
|
|
2
|
+
const {
|
|
3
|
+
walk, size, pad, slice, clone
|
|
4
|
+
} = require('./StructUtility')
|
|
5
|
+
|
|
6
|
+
// Clean request data by partially hiding sensitive values.
|
|
7
|
+
function clean(ctx, val) {
|
|
8
|
+
const options = ctx.options
|
|
9
|
+
|
|
10
|
+
const cleankeyre = options?.__derived__?.clean?.keyre
|
|
11
|
+
const hintsize = 4
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
if (null != cleankeyre) {
|
|
15
|
+
val = walk(clone(val), (key, subval) => {
|
|
16
|
+
if (cleankeyre.exec(key) && 'string' === typeof subval) {
|
|
17
|
+
const len = size(subval)
|
|
18
|
+
const hint = (hintsize * 4) < len ? slice(subval, 0, hintsize) : ''
|
|
19
|
+
subval = pad(hint, len, '*')
|
|
20
|
+
}
|
|
21
|
+
return subval
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
return val
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
clean
|
|
31
|
+
}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
|
|
2
|
+
const { clean } = require('./CleanUtility')
|
|
3
|
+
|
|
2
4
|
function done(ctx) {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const error = ctx.utility.makeError
|
|
6
|
+
const delprop = ctx.utility.struct.delprop
|
|
7
|
+
|
|
8
|
+
if (ctx.ctrl.explain) {
|
|
9
|
+
ctx.ctrl.explain = clean(ctx, ctx.ctrl.explain)
|
|
10
|
+
delprop(ctx.ctrl.explain.result, 'err')
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (ctx.result && ctx.result.ok) {
|
|
6
14
|
return ctx.result.resdata
|
|
7
15
|
}
|
|
8
16
|
|
|
9
17
|
return error(ctx)
|
|
10
18
|
}
|
|
11
19
|
|
|
12
|
-
|
|
13
20
|
module.exports = {
|
|
14
21
|
done
|
|
15
22
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
function featureAdd(ctx, f) {
|
|
3
|
+
const client = ctx.client
|
|
4
|
+
const struct = ctx.utility.struct
|
|
5
|
+
const setprop = struct.setprop
|
|
6
|
+
const getprop = struct.getprop
|
|
7
|
+
|
|
8
|
+
const fopts = getprop(f, '_options', {})
|
|
9
|
+
let added = false
|
|
10
|
+
const features = client._features
|
|
11
|
+
|
|
12
|
+
if (fopts.__before__ || fopts.__after__ || fopts.__replace__) {
|
|
13
|
+
|
|
14
|
+
for (let i = 0; i < features.length; i++) {
|
|
15
|
+
let ef = client._features[i]
|
|
16
|
+
if (fopts.__before__ === ef.name) {
|
|
17
|
+
client._features = [...features.slice(0, i), f, ...features.slice(i)]
|
|
18
|
+
added = true
|
|
19
|
+
break
|
|
20
|
+
}
|
|
21
|
+
else if (fopts.__after__ === ef.name) {
|
|
22
|
+
client._features = [...features.slice(0, ++i), f, ...features.slice(i)]
|
|
23
|
+
added = true
|
|
24
|
+
break
|
|
25
|
+
}
|
|
26
|
+
else if (fopts.__replace__ === ef.name) {
|
|
27
|
+
client._features = setprop(features, i, f)
|
|
28
|
+
added = true
|
|
29
|
+
break
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!added) {
|
|
35
|
+
client._features = setprop(features, features.length, f)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
featureAdd
|
|
42
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
function featureHook(ctx, name) {
|
|
3
|
+
const client = ctx.client
|
|
4
|
+
|
|
5
|
+
let resp = []
|
|
6
|
+
const features = client._features || []
|
|
7
|
+
|
|
8
|
+
for (let f of features) {
|
|
9
|
+
const fh = f[name]
|
|
10
|
+
if (null != fh) {
|
|
11
|
+
const fres = fh(ctx)
|
|
12
|
+
if (fres instanceof Promise) {
|
|
13
|
+
resp.push(fres)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (0 < resp.length) {
|
|
19
|
+
return Promise.all(resp)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
module.exports = {
|
|
24
|
+
featureHook
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
// Make HTTP call using library. Replace this utility for mocking etc.
|
|
3
|
+
async function fetcher(ctx, fullurl, fetchdef) {
|
|
4
|
+
|
|
5
|
+
if ('live' !== ctx.client._mode) {
|
|
6
|
+
return ctx.error('fetch_mode_block', 'Request blocked by mode: "' + ctx.client._mode +
|
|
7
|
+
'" (URL was: "' + fullurl + '")')
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const options = ctx.client.options()
|
|
11
|
+
|
|
12
|
+
const getpath = ctx.utility.struct.getpath
|
|
13
|
+
|
|
14
|
+
if (true === getpath(options, 'feature.test.active')) {
|
|
15
|
+
return ctx.error('fetch_test_block', 'Request blocked as test feature is active' +
|
|
16
|
+
' (URL was: "' + fullurl + '")')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const fetch = options.system.fetch
|
|
20
|
+
|
|
21
|
+
const response = await fetch(fullurl, fetchdef)
|
|
22
|
+
|
|
23
|
+
return response
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
fetcher
|
|
28
|
+
}
|
|
@@ -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
|
+
}
|