@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
@@ -1,171 +1,387 @@
1
+ // VERSION: @voxgig/struct 0.0.10
2
+ // This test utility runs the JSON-specified tests in build/test/test.json.
3
+ // (or .sdk/test/test.json if used in a @voxgig/sdkgen project)
1
4
 
2
5
  const { readFileSync } = require('node:fs')
3
6
  const { join } = require('node:path')
4
- const { equal, deepEqual, fail, AssertionError } = require('node:assert')
7
+ const { deepStrictEqual, fail, AssertionError } = require('node:assert')
5
8
 
6
- const { NameSDK: SDK } = require('..')
9
+ const NULLMARK = '__NULL__' // Value is JSON null
10
+ const UNDEFMARK = '__UNDEF__' // Value is not present (thus, undefined).
11
+ const EXISTSMARK = '__EXISTS__' // Value exists (not undefined).
7
12
 
8
- const client = SDK.test()
9
- const utility = client.utility()
10
- const { walk, items, clone, isnode, ismap, getpath, stringify, inject } = utility.struct
11
13
 
14
+ async function makeRunner(testfile, client) {
12
15
 
13
- async function runner(name, store) {
16
+ return async function runner(
17
+ name,
18
+ store,
19
+ ) {
20
+ store = store || {}
14
21
 
22
+ const utility = client.utility()
23
+ const structUtils = utility.struct
24
+
25
+ let spec = resolveSpec(name, testfile)
26
+ let clients = await resolveClients(client, spec, store, structUtils)
27
+ let subject = resolveSubject(name, utility)
28
+
29
+ let runsetflags = async (
30
+ testspec,
31
+ flags,
32
+ testsubject
33
+ ) => {
34
+ subject = testsubject || subject
35
+ flags = resolveFlags(flags)
36
+ const testspecmap = fixJSON(testspec, flags)
37
+
38
+ const testset = testspecmap.set
39
+ for (let entry of testset) {
40
+ try {
41
+ entry = resolveEntry(entry, flags)
42
+
43
+ let testpack = resolveTestPack(name, entry, subject, client, clients)
44
+ let args = resolveArgs(entry, testpack, utility, structUtils)
45
+
46
+ let res = await testpack.subject(...args)
47
+ res = fixJSON(res, flags)
48
+ entry.res = res
49
+
50
+ checkResult(entry, args, res, structUtils)
51
+ }
52
+ catch (err) {
53
+ if (err instanceof AssertionError) {
54
+ throw err
55
+ }
56
+ handleError(entry, err, structUtils)
57
+ }
58
+ }
59
+ }
60
+
61
+ let runset = async (
62
+ testspec,
63
+ testsubject
64
+ ) => runsetflags(testspec, {}, testsubject)
65
+
66
+ const runpack = {
67
+ spec,
68
+ runset,
69
+ runsetflags,
70
+ subject,
71
+ client,
72
+ }
73
+
74
+ return runpack
75
+ }
76
+ }
77
+
78
+ function resolveSpec(name, testfile) {
15
79
  const alltests =
16
- JSON.parse(readFileSync(join(
17
- __dirname, '..', '..', '.sdk', 'test', 'test.json'), 'utf8'))
80
+ JSON.parse(readFileSync(join(__dirname, testfile), 'utf8'))
81
+
82
+ let spec = alltests.primary?.[name] || alltests[name] || alltests
83
+ return spec
84
+ }
85
+
18
86
 
19
- // TODO: a more coherent namespace perhaps?
20
- let spec = alltests.primary[name] || alltests[name]
87
+ async function resolveClients(
88
+ client,
89
+ spec,
90
+ store,
91
+ structUtils
92
+ ) {
21
93
 
22
94
  const clients = {}
23
- if(spec.DEF) {
24
- for(let cdef of items(spec.DEF.client)) {
25
- const copts = cdef[1].test.options || {}
26
- if(ismap(store)) {
27
- inject(copts, store)
95
+ if (spec.DEF && spec.DEF.client) {
96
+ for (let cn in spec.DEF.client) {
97
+ const cdef = spec.DEF.client[cn]
98
+ const copts = cdef.test.options || {}
99
+ if ('object' === typeof store && structUtils?.inject) {
100
+ structUtils.inject(copts, store)
28
101
  }
29
-
30
- clients[cdef[0]] = await SDK.test(copts)
102
+
103
+ clients[cn] = await client.tester(copts)
31
104
  }
32
105
  }
106
+ return clients
107
+ }
33
108
 
34
- let subject = utility[name]
35
109
 
36
- let runset = async (testspec, testsubject, makesubject) => {
37
- testsubject = testsubject || subject
110
+ function resolveSubject(name, container) {
111
+ const subject = container[name] || container.struct[name]
112
+ return subject
113
+ }
38
114
 
39
- next_entry:
40
- for (let entry of testspec.set) {
41
- try {
42
- let testclient = client
43
-
44
- if(entry.client) {
45
- testclient = clients[entry.client]
46
- testsubject = client.utility()[name]
47
- }
48
115
 
49
- if(makesubject) {
50
- testsubject = makesubject(testsubject)
51
- }
116
+ function resolveFlags(flags) {
117
+ if (null == flags) {
118
+ flags = {}
119
+ }
120
+ flags.null = null == flags.null ? true : !!flags.null
121
+ return flags
122
+ }
52
123
 
53
- let args = [clone(entry.in)]
54
124
 
55
- if(entry.ctx) {
56
- args = [entry.ctx]
57
- }
58
- else if(entry.args) {
59
- args = entry.args
60
- }
125
+ function resolveEntry(entry, flags) {
126
+ entry.out = null == entry.out && flags.null ? NULLMARK : entry.out
127
+ return entry
128
+ }
61
129
 
62
- if(entry.ctx || entry.args) {
63
- let first = args[0]
64
- if(ismap(first)) {
65
- entry.ctx = first = args[0] = clone(args[0])
66
- first.client = testclient
67
- first.utility = testclient.utility()
68
- }
69
- }
70
130
 
71
- let res = await testsubject(...args)
72
- entry.res = res
73
-
74
- if(undefined === entry.match || undefined !== entry.out) {
75
- // NOTE: don't use clone as we want to strip functions
76
- deepEqual(null != res ? JSON.parse(JSON.stringify(res)) : res, entry.out)
77
- }
78
-
79
- if(entry.match) {
80
- match(entry.match, {in:entry.in, out:entry.res, ctx:entry.ctx})
81
- }
82
- }
83
- catch (err) {
84
- entry.thrown = err
85
-
86
- const entry_err = entry.err
131
+ function checkResult(entry, args, res, structUtils) {
132
+ let matched = false
87
133
 
88
- if (null != entry_err) {
89
- // if (true === entry_err || (err.message.includes(entry_err))) {
90
- if (true === entry_err || matchval(entry_err, err.message)) {
134
+ if (entry.err) {
135
+ return fail('Expected error did not occur: ' + entry.err +
136
+ '\n\nENTRY: ' + safeStringify(entry))
137
+ }
91
138
 
92
- if(entry.match) {
93
- match(entry.match, {in:entry.in, out:entry.res, ctx:entry.ctx, err})
94
- }
139
+ if (entry.match) {
140
+ const result = { in: entry.in, args, out: entry.res, ctx: entry.ctx }
141
+ match(
142
+ entry.match,
143
+ result,
144
+ structUtils
145
+ )
95
146
 
96
- continue next_entry
97
- }
147
+ matched = true
148
+ }
98
149
 
99
- fail('ERROR MATCH: ['+stringify(entry_err)+'] <=> ['+err.message+']')
100
- }
101
- else if(err instanceof AssertionError ) {
102
- fail(err.message+'\n\nENTRY: '+JSON.stringify(entry,null,2))
103
- }
104
- else {
105
- fail(err.stack+'\\nnENTRY: '+JSON.stringify(entry,null,2))
106
- }
150
+ const out = entry.out
151
+
152
+ if (out === res) {
153
+ return
154
+ }
155
+
156
+ // NOTE: allow match with no out.
157
+ if (matched && (NULLMARK === out || null == out)) {
158
+ return
159
+ }
160
+
161
+ deepStrictEqual(null != res ? JSON.parse(safeStringify(res)) : res, entry.out)
162
+ }
163
+
164
+
165
+ // Handle errors from test execution
166
+ function handleError(entry, err, structUtils) {
167
+ entry.thrown = err
168
+
169
+ const entry_err = entry.err
170
+
171
+ if (null != entry_err) {
172
+ if (true === entry_err || matchval(entry_err, err.message, structUtils)) {
173
+ if (entry.match) {
174
+ match(
175
+ entry.match,
176
+ { in: entry.in, out: entry.res, ctx: entry.ctx, err: fixJSON(err, { null: true }) },
177
+ structUtils
178
+ )
107
179
  }
180
+ return
181
+ }
182
+
183
+ fail('ERROR MATCH: [' + structUtils.stringify(entry_err) +
184
+ '] <=> [' + err.message + ']')
185
+ }
186
+
187
+ // Unexpected error (test didn't specify an error expectation)
188
+ else if (err instanceof AssertionError) {
189
+ fail(err.message + '\n\nENTRY: ' + safeStringify(entry))
190
+ }
191
+ else {
192
+ fail(err.stack + '\n\nENTRY: ' + safeStringify(entry))
193
+ }
194
+ }
195
+
196
+
197
+ function resolveArgs(
198
+ entry,
199
+ testpack,
200
+ utility,
201
+ structUtils
202
+ ) {
203
+ let args = []
204
+
205
+ if (entry.ctx) {
206
+ args = [entry.ctx]
207
+ }
208
+ else if (entry.args) {
209
+ args = entry.args
210
+ }
211
+ else {
212
+ args = [structUtils.clone(entry.in)]
213
+ }
214
+
215
+ if (entry.ctx || entry.args) {
216
+ let first = args[0]
217
+ if (structUtils.ismap(first)) {
218
+ first = structUtils.clone(first)
219
+ first = utility.makeContext(first)
220
+ args[0] = first
221
+ entry.ctx = first
222
+
223
+ first.client = testpack.client
224
+ first.utility = testpack.utility
108
225
  }
109
226
  }
110
227
 
111
-
112
- return {
113
- spec,
114
- runset,
228
+ return args
229
+ }
230
+
231
+
232
+ function resolveTestPack(
233
+ name,
234
+ entry,
235
+ subject,
236
+ client,
237
+ clients
238
+ ) {
239
+ const testpack = {
240
+ name,
241
+ client,
115
242
  subject,
243
+ utility: client.utility(),
116
244
  }
245
+
246
+ if (entry.client) {
247
+ testpack.client = clients[entry.client]
248
+ testpack.utility = testpack.client.utility()
249
+ testpack.subject = resolveSubject(name, testpack.utility)
250
+ }
251
+
252
+ return testpack
117
253
  }
118
254
 
119
255
 
120
- function match(check, base) {
121
- let nodes = [base]
256
+ function match(
257
+ check,
258
+ basex,
259
+ structUtils
260
+ ) {
261
+ const cbase = structUtils.clone(basex)
262
+
263
+ structUtils.walk(check, (_key, val, _parent, path) => {
264
+ if (!structUtils.isnode(val)) {
265
+ let baseval = structUtils.getpath(cbase, path)
266
+
267
+ if (baseval === val) {
268
+ return val
269
+ }
270
+
271
+ // Explicit undefined expected
272
+ if (UNDEFMARK === val && undefined === baseval) {
273
+ return val
274
+ }
275
+
276
+ // Explicit defined expected
277
+ if (EXISTSMARK === val && null != baseval) {
278
+ return val
279
+ }
122
280
 
123
- // TODO: walk should be called on entry and exit from a node to
124
- // avoid needing getpath
125
- walk(check, (key, val, parent, path)=>{
126
- if(!isnode(val)) {
127
- let baseval = getpath(path, base)
128
-
129
- if(!matchval(val, baseval)) {
130
- fail('MATCH: '+path.join('.')+': ['+stringify(val)+'] <=> ['+stringify(baseval)+']')
281
+ if (!matchval(val, baseval, structUtils)) {
282
+ fail('MATCH: ' + path.join('.') +
283
+ ': [' + structUtils.stringify(val) +
284
+ '] <=> [' + structUtils.stringify(baseval) + ']')
131
285
  }
132
286
  }
287
+
288
+ return val
133
289
  })
134
290
  }
135
291
 
136
292
 
137
- function matchval(check, base) {
138
- check = '__UNDEF__' === check ? undefined : check
139
-
293
+ function matchval(
294
+ check,
295
+ base,
296
+ structUtils
297
+ ) {
140
298
  let pass = check === base
141
299
 
142
- if(!pass) {
300
+ if (!pass) {
301
+
302
+ if ('string' === typeof check) {
303
+ let basestr = structUtils.stringify(base)
143
304
 
144
- if('string' === typeof check) {
145
- let basestr = stringify(base)
146
-
147
305
  let rem = check.match(/^\/(.+)\/$/)
148
- if(rem) {
306
+ if (rem) {
149
307
  pass = new RegExp(rem[1]).test(basestr)
150
308
  }
151
309
  else {
152
- pass = basestr.toLowerCase().includes(stringify(check).toLowerCase())
310
+ pass = basestr.toLowerCase().includes(structUtils.stringify(check).toLowerCase())
153
311
  }
154
312
  }
155
- else if('function' === typeof check) {
313
+ else if ('function' === typeof check) {
156
314
  pass = true
157
315
  }
158
316
  }
159
317
 
160
-
161
-
162
318
  return pass
163
319
  }
164
320
 
165
321
 
166
- module.exports = {
167
- runner
322
+ function safeStringify(val) {
323
+ const seen = new WeakSet()
324
+ return JSON.stringify(val, (_k, v) => {
325
+ if ('object' === typeof v && null !== v) {
326
+ if (seen.has(v)) return '[Circular]'
327
+ seen.add(v)
328
+ }
329
+ if (v instanceof Error) {
330
+ return { name: v.name, message: v.message }
331
+ }
332
+ return v
333
+ }, 2)
334
+ }
335
+
336
+
337
+ function fixJSON(val, flags) {
338
+ if (null == val) {
339
+ return flags?.null ? NULLMARK : val
340
+ }
341
+
342
+ const seen = new WeakSet()
343
+ const replacer = (_k, v) => {
344
+ if (null == v && flags?.null) {
345
+ return NULLMARK
346
+ }
347
+
348
+ if (v instanceof Error) {
349
+ return {
350
+ ...v,
351
+ name: v.name,
352
+ message: v.message,
353
+ }
354
+ }
355
+
356
+ if ('object' === typeof v && null !== v) {
357
+ if (seen.has(v)) return '[Circular]'
358
+ seen.add(v)
359
+ }
360
+
361
+ return v
362
+ }
363
+
364
+ return JSON.parse(JSON.stringify(val, replacer))
168
365
  }
169
366
 
170
367
 
368
+ function nullModifier(
369
+ val,
370
+ key,
371
+ parent
372
+ ) {
373
+ if ("__NULL__" === val) {
374
+ parent[key] = null
375
+ }
376
+ else if ('string' === typeof val) {
377
+ parent[key] = val.replaceAll('__NULL__', 'null')
378
+ }
379
+ }
171
380
 
381
+
382
+ module.exports = {
383
+ NULLMARK,
384
+ EXISTSMARK,
385
+ nullModifier,
386
+ makeRunner,
387
+ }
@@ -1,85 +1,63 @@
1
1
 
2
2
  const { test, describe } = require('node:test')
3
- const { equal, deepEqual } = require('node:assert')
3
+ const { equal } = require('node:assert')
4
+
5
+ const { ProjectNameSDK } = require('../..')
6
+
7
+
8
+ describe('Custom', () => {
9
+
10
+ test('basic', async () => {
11
+ const client = ProjectNameSDK.test({}, {
12
+ apikey: 'APIKEY01',
13
+
14
+ // NOTE: original utility.options must remain in place.
15
+ utility: {
16
+ auth: () => ({ util: 'AUTH' }),
17
+ body: () => ({ util: 'BODY' }),
18
+ contextify: () => ({ util: 'CONTEXTIFY' }),
19
+ done: () => ({ util: 'DONE' }),
20
+ error: () => ({ util: 'ERROR' }),
21
+ findparam: () => ({ util: 'FINDPARAM' }),
22
+ fullurl: () => ({ util: 'FULLURL' }),
23
+ headers: () => ({ util: 'HEADERS' }),
24
+ method: () => ({ util: 'METHOD' }),
25
+ operator: () => ({ util: 'OPERATOR' }),
26
+ params: () => ({ util: 'PARAMS' }),
27
+ query: () => ({ util: 'QUERY' }),
28
+ reqform: () => ({ util: 'REQFORM' }),
29
+ request: () => ({ util: 'REQUEST' }),
30
+ resbasic: () => ({ util: 'RESBASIC' }),
31
+ resbody: () => ({ util: 'RESBODY' }),
32
+ resform: () => ({ util: 'RESFORM' }),
33
+ resheaders: () => ({ util: 'RESHEADERS' }),
34
+ response: () => ({ util: 'RESPONSE' }),
35
+ result: () => ({ util: 'RESULT' }),
36
+ spec: () => ({ util: 'SPEC' }),
37
+ }
38
+ })
4
39
 
5
- const { StatuspageSDK } = require('../..')
6
-
7
- const client = StatuspageSDK.test({
8
- apikey: 'APIKEY01',
9
- utility: {
10
- auth: ()=> ({util:'AUTH'}),
11
- body: () => ({util:'BODY'}),
12
- empty: () => ({util:'EMPTY'}),
13
- error: () => ({util:'ERROR'}),
14
- escre: () => ({util:'ESCRE'}),
15
- escurl: () => ({util:'ESCURL'}),
16
- fetch: () => ({util:'FETCH'}),
17
- findparam: () => ({util:'FINDPARAM'}),
18
- fullurl: () => ({util:'FULLURL'}),
19
- headers: () => ({util:'HEADERS'}),
20
- inward: () => ({util:'INWARD'}),
21
- joinurl: () => ({util:'JOINURL'}),
22
- method: () => ({util:'METHOD'}),
23
- operator: () => ({util:'OPERATOR'}),
24
- options: () => ({util:'OPTIONS'}),
25
- outward: () => ({util:'OUTWARD'}),
26
- params: () => ({util:'PARAMS'}),
27
- query: () => ({util:'QUERY'}),
28
- resbasic: () => ({util:'RESBASIC'}),
29
- resbody: () => ({util:'RESBODY'}),
30
- resheaders: () => ({util:'RESHEADERS'}),
31
- response: () => ({util:'RESPONSE'}),
32
- spec: () => ({util:'SPEC'}),
33
-
34
- string: {
35
- stringify: () => ({util:'STRING-STRINGIFY'}),
36
- },
37
-
38
- validate: {
39
- string: () => ({util:'VALIDATE-STRING'}),
40
- array: () => ({util:'VALIDATE-ARRAY'}),
41
- object: () => ({util:'VALIDATE-OBJECT'}),
42
- func: () => ({util:'VALIDATE-FUNC'}),
43
- }
44
-
45
- }
46
- })
47
-
48
-
49
- describe('Custom', ()=>{
50
- test('basic', async ()=>{
51
40
  const u = client.utility()
52
41
 
53
42
  equal(u.auth().util, 'AUTH')
54
43
  equal(u.body().util, 'BODY')
55
- equal(u.empty().util, 'EMPTY')
44
+ equal(u.contextify().util, 'CONTEXTIFY')
45
+ equal(u.done().util, 'DONE')
56
46
  equal(u.error().util, 'ERROR')
57
- equal(u.escre().util, 'ESCRE')
58
- equal(u.escurl().util, 'ESCURL')
59
- equal(u.fetch().util, 'FETCH')
60
47
  equal(u.findparam().util, 'FINDPARAM')
61
48
  equal(u.fullurl().util, 'FULLURL')
62
49
  equal(u.headers().util, 'HEADERS')
63
- equal(u.inward().util, 'INWARD')
64
- equal(u.joinurl().util, 'JOINURL')
65
50
  equal(u.method().util, 'METHOD')
66
51
  equal(u.operator().util, 'OPERATOR')
67
- equal(u.options().util, 'OPTIONS')
68
- equal(u.outward().util, 'OUTWARD')
69
52
  equal(u.params().util, 'PARAMS')
70
53
  equal(u.query().util, 'QUERY')
54
+ equal(u.reqform().util, 'REQFORM')
71
55
  equal(u.resbasic().util, 'RESBASIC')
72
56
  equal(u.resbody().util, 'RESBODY')
57
+ equal(u.resform().util, 'RESFORM')
73
58
  equal(u.resheaders().util, 'RESHEADERS')
74
59
  equal(u.response().util, 'RESPONSE')
60
+ equal(u.result().util, 'RESULT')
75
61
  equal(u.spec().util, 'SPEC')
76
-
77
- equal(u.string.stringify().util, 'STRING-STRINGIFY')
78
-
79
- equal(u.validate.string().util, 'VALIDATE-STRING')
80
- equal(u.validate.array().util, 'VALIDATE-ARRAY')
81
- equal(u.validate.object().util, 'VALIDATE-OBJECT')
82
- equal(u.validate.func().util, 'VALIDATE-FUNC')
83
-
84
62
  })
85
63
  })