@voxgig/sdkgen 0.24.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/bin/voxgig-sdkgen +6 -6
  2. package/dist/action/action.js +1 -2
  3. package/dist/action/action.js.map +1 -1
  4. package/dist/action/feature.js +4 -2
  5. package/dist/action/feature.js.map +1 -1
  6. package/dist/action/target.js +4 -2
  7. package/dist/action/target.js.map +1 -1
  8. package/dist/cmp/Entity.js +2 -1
  9. package/dist/cmp/Entity.js.map +1 -1
  10. package/dist/cmp/FeatureHook.js +2 -1
  11. package/dist/cmp/FeatureHook.js.map +1 -1
  12. package/dist/cmp/Main.js.map +1 -1
  13. package/dist/cmp/ReadmeEntity.js +2 -1
  14. package/dist/cmp/ReadmeEntity.js.map +1 -1
  15. package/dist/cmp/Test.d.ts +2 -0
  16. package/dist/cmp/Test.js +17 -0
  17. package/dist/cmp/Test.js.map +1 -0
  18. package/dist/sdkgen.d.ts +2 -1
  19. package/dist/sdkgen.js +17 -28
  20. package/dist/sdkgen.js.map +1 -1
  21. package/dist/tsconfig.tsbuildinfo +1 -1
  22. package/dist/types.d.ts +3 -1
  23. package/dist/types.js +4 -0
  24. package/dist/types.js.map +1 -1
  25. package/model/sdkgen.jsonic +8 -8
  26. package/package.json +8 -6
  27. package/project/.sdk/model/feature/log.jsonic +2 -2
  28. package/project/.sdk/model/feature/test.jsonic +7 -2
  29. package/project/.sdk/model/target/js.jsonic +2 -2
  30. package/project/.sdk/model/target/ts.jsonic +2 -2
  31. package/project/.sdk/src/cmp/js/Main_js.ts +3 -3
  32. package/project/.sdk/src/cmp/js/Quick_js.ts +1 -1
  33. package/project/.sdk/src/cmp/ts/Config_ts.ts +53 -6
  34. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +3 -21
  35. package/project/.sdk/src/cmp/ts/Entity_ts.ts +3 -5
  36. package/project/.sdk/src/cmp/ts/Main_ts.ts +22 -12
  37. package/project/.sdk/src/cmp/ts/Package_ts.ts +32 -12
  38. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +341 -2
  39. package/project/.sdk/src/cmp/ts/TestMain_ts.ts +0 -3
  40. package/project/.sdk/src/cmp/ts/Test_ts.ts +21 -3
  41. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +38 -5
  42. package/project/.sdk/src/cmp/ts/fragment/Entity.fragment.ts +50 -38
  43. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +9 -7
  44. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +47 -31
  45. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +49 -31
  46. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +50 -33
  47. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +50 -31
  48. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +51 -31
  49. package/project/.sdk/src/cmp/ts/fragment/Main.fragment.ts +70 -34
  50. package/project/.sdk/src/cmp/ts/tsconfig.json +15 -0
  51. package/project/.sdk/src/cmp/ts/utility_ts.ts +55 -1
  52. package/project/.sdk/tm/ts/src/feature/test/TestFeature.ts +158 -104
  53. package/project/.sdk/tm/ts/src/types.ts +164 -34
  54. package/project/.sdk/tm/ts/src/utility/AuthUtility.ts +8 -2
  55. package/project/.sdk/tm/ts/src/utility/BodyUtility.ts +9 -6
  56. package/project/.sdk/tm/ts/src/utility/CleanUtility.ts +17 -31
  57. package/project/.sdk/tm/ts/src/utility/ContextUtility.ts +14 -54
  58. package/project/.sdk/tm/ts/src/utility/DoneUtility.ts +1 -1
  59. package/project/.sdk/tm/ts/src/utility/ErrorUtility.ts +7 -3
  60. package/project/.sdk/tm/ts/src/utility/FeaturehookUtility.ts +8 -5
  61. package/project/.sdk/tm/ts/src/utility/FetcherUtility.ts +18 -2
  62. package/project/.sdk/tm/ts/src/utility/FindparamUtility.ts +12 -5
  63. package/project/.sdk/tm/ts/src/utility/FullurlUtility.ts +21 -5
  64. package/project/.sdk/tm/ts/src/utility/InitfeatureUtility.ts +3 -1
  65. package/project/.sdk/tm/ts/src/utility/OperationUtility.ts +23 -0
  66. package/project/.sdk/tm/ts/src/utility/OptionsUtility.ts +25 -3
  67. package/project/.sdk/tm/ts/src/utility/ParamsUtility.ts +10 -10
  68. package/project/.sdk/tm/ts/src/utility/PreparePathUtility.ts +18 -0
  69. package/project/.sdk/tm/ts/src/utility/QueryUtility.ts +2 -2
  70. package/project/.sdk/tm/ts/src/utility/ReqformUtility.ts +2 -2
  71. package/project/.sdk/tm/ts/src/utility/RequestUtility.ts +20 -3
  72. package/project/.sdk/tm/ts/src/utility/ResbasicUtility.ts +1 -1
  73. package/project/.sdk/tm/ts/src/utility/ResbodyUtility.ts +5 -3
  74. package/project/.sdk/tm/ts/src/utility/ResformUtility.ts +3 -3
  75. package/project/.sdk/tm/ts/src/utility/ResheadersUtility.ts +9 -7
  76. package/project/.sdk/tm/ts/src/utility/ResponseUtility.ts +35 -4
  77. package/project/.sdk/tm/ts/src/utility/ResultUtility.ts +24 -4
  78. package/project/.sdk/tm/ts/src/utility/SelectionUtility.ts +78 -0
  79. package/project/.sdk/tm/ts/src/utility/SpecUtility.ts +34 -27
  80. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1117 -509
  81. package/project/.sdk/tm/ts/src/utility/Utility.ts +10 -8
  82. package/project/.sdk/tm/ts/test/exists.test.ts +0 -1
  83. package/project/.sdk/tm/ts/test/runner.ts +12 -10
  84. package/project/.sdk/tm/ts/test/utility/Custom.test.ts +30 -29
  85. package/project/.sdk/tm/ts/test/utility/PrimaryUtility.test.ts +53 -47
  86. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +433 -189
  87. package/src/action/action.ts +1 -2
  88. package/src/action/feature.ts +7 -2
  89. package/src/action/target.ts +7 -7
  90. package/src/cmp/Entity.ts +7 -1
  91. package/src/cmp/FeatureHook.ts +6 -1
  92. package/src/cmp/Main.ts +4 -0
  93. package/src/cmp/ReadmeEntity.ts +6 -1
  94. package/src/cmp/Test.ts +31 -0
  95. package/src/sdkgen.ts +19 -34
  96. package/src/types.ts +10 -1
  97. package/project/.sdk/src/cmp/ts/EntityTest_ts.ts +0 -180
  98. package/project/.sdk/tm/ts/src/utility/OperatorUtility.ts +0 -90
@@ -1,13 +1,352 @@
1
1
 
2
- import { cmp, camelify, Content } from '@voxgig/sdkgen'
2
+ import * as Path from 'node:path'
3
+
4
+
5
+ import {
6
+ flatten,
7
+ items,
8
+ join,
9
+ jsonify,
10
+ slice,
11
+ } from '@voxgig/struct'
12
+
13
+ import {
14
+ KIT,
15
+ Model,
16
+ ModelEntity,
17
+ ModelEntityFlow,
18
+ ModelEntityFlowStep,
19
+ getModelPath,
20
+ nom,
21
+ } from '@voxgig/apidef'
22
+
23
+
24
+ import {
25
+ Content,
26
+ File,
27
+ Folder,
28
+ Fragment,
29
+ Slot,
30
+ cmp,
31
+ each,
32
+ } from '@voxgig/sdkgen'
33
+
34
+
35
+ import {
36
+ projectPath
37
+ } from './utility_ts'
38
+
39
+
40
+ type OpGen = (model: any, entity: any, flow: any, step: any, index: any) => void
3
41
 
4
42
 
5
43
  const TestEntity = cmp(function TestEntity(props: any) {
6
- const { entity } = props
44
+ const ctx$ = props.ctx$
45
+ const model = ctx$.model
46
+ const stdrep = ctx$.stdrep
47
+
48
+ const target = props.target
49
+ const entity = props.entity
50
+
51
+ // TODO: should be a utility function
52
+ const ff = projectPath('src/cmp/ts/fragment/')
53
+
54
+ Folder({ name: entity.name }, () => {
55
+
56
+ File({ name: nom(entity, 'Name') + 'Entity.test.' + target.name }, () => {
57
+
58
+ Fragment({
59
+ from: ff + 'Entity.test.fragment.ts',
60
+ replace: {
61
+ SdkName: nom(model.const, 'Name'),
62
+ EntityName: nom(entity, 'Name'),
63
+ ...stdrep,
64
+ }
65
+ }, () => {
66
+
67
+ const basicflow = getModelPath(model, `main.${KIT}.flow.Basic${entity.Name}Flow`)
68
+
69
+ const dobasic = basicflow && true === basicflow.active
70
+
71
+ if (!dobasic) {
72
+ return;
73
+ }
74
+
75
+ const indent = 2
76
+
77
+ const idlist = flatten([
78
+ '${entity.name}01',
79
+ '${entity.name}02',
80
+ '${entity.name}03',
81
+ flatten(items(entity.relations.ancestors, (ap: any) =>
82
+ items(ap[1], (a: any) =>
83
+ items(['01', '02', '03'], (n: any) =>
84
+ a[1] + n[1]))), 2)
85
+ ])
86
+
87
+ Slot({ name: 'basicSetup' }, () => {
88
+ Content(`
89
+ function basicSetup(extra?: any) {
90
+ // TODO: fix test def options
91
+ const options: any = {} // ${jsonify(basicflow.test, { offset: indent - 2 })}
92
+
93
+ // TODO: needs test utility to resolve path
94
+ const entityDataFile =
95
+ Path.resolve(__dirname,
96
+ '../../../../.sdk/test/entity/${entity.name}/${nom(entity, 'Name')}TestData.json')
97
+
98
+ // TODO: file ready util needed?
99
+ const entityDataSource = Fs.readFileSync(entityDataFile).toString('utf8')
100
+
101
+ // TODO: need a xlang JSON parse utility in voxgig/struct with better error msgs
102
+ const entityData = JSON.parse(entityDataSource)
103
+
104
+ options.entity = entityData.existing
105
+
106
+ let client = ${model.Name}SDK.test(options, extra)
107
+ const struct = client.utility().struct
108
+ const merge = struct.merge
109
+ const transform = struct.transform
110
+
111
+ let idmap = transform(
112
+ ['${join(idlist, '\',\'')}'],
113
+ {
114
+ '\`$PACK\`': ['', {
115
+ '\`$KEY\`': '\`$COPY\`',
116
+ '\`$VAL\`': ['\`$FORMAT\`', 'upper', '\`$COPY\`']
117
+ }]
118
+ })
119
+
120
+ const env = envOverride({
121
+ '${nom(model.const, 'NAME')}_TEST_${nom(entity, 'NAME')}_ENTID': idmap,
122
+ '${nom(model.const, 'NAME')}_TEST_LIVE': 'FALSE',
123
+ '${nom(model.const, 'NAME')}_TEST_EXPLAIN': 'FALSE',
124
+ '${nom(model.const, 'NAME')}_APIKEY': 'NONE',
125
+ })
126
+
127
+ idmap = env['${nom(model.const, 'NAME')}_TEST_${nom(entity, 'NAME')}_ENTID']
128
+
129
+ if ('TRUE' === env.${model.NAME}_TEST_LIVE) {
130
+ client = new ${model.Name}SDK(merge([
131
+ {
132
+ apikey: env.${nom(model.const, 'NAME')}_APIKEY,
133
+ },
134
+ extra
135
+ ]))
136
+ }
137
+
138
+ const setup = {
139
+ idmap,
140
+ env,
141
+ options,
142
+ client,
143
+ struct,
144
+ data: entityData,
145
+ explain: 'TRUE' === env.${nom(model.const, 'NAME')}_TEST_EXPLAIN,
146
+ now: Date.now(),
147
+ }
148
+
149
+ return setup
150
+ }
151
+ `)
152
+ })
153
+
154
+
155
+ Slot({ name: 'basic' }, () => {
156
+ Content(`
157
+ const setup = basicSetup()
158
+ const client = setup.client
159
+ const struct = setup.struct
7
160
 
161
+ const isempty = struct.isempty
162
+ const select = struct.select
163
+
164
+ `)
165
+
166
+ each(basicflow.step, (step: any, index: any) => {
167
+ const opgen: OpGen = GENERATE_OP[step.op]
168
+ opgen(model, entity, basicflow, step, index)
169
+ Content('\n')
170
+ })
171
+ })
172
+ })
173
+ })
174
+ })
8
175
  })
9
176
 
10
177
 
178
+ const generateCreate: OpGen = (
179
+ model: Model,
180
+ entity: ModelEntity,
181
+ flow: ModelEntityFlow,
182
+ step: ModelEntityFlowStep,
183
+ index: number
184
+ ) => {
185
+ const ref = step.input.ref ?? entity.name + '_ref01'
186
+ const entvar = step.input.entvar ?? ref + '_ent'
187
+ const datavar = step.input.datavar ?? (ref + '_data' + (step.input.suffix ?? ''))
188
+
189
+ Content(`
190
+ // CREATE
191
+ const ${entvar} = client.${nom(entity, 'Name')}()
192
+ const ${datavar} =
193
+ await ${entvar}.create(setup.data.new.${entity.name}['${ref}'])
194
+ assert(null != ${datavar}.id)
195
+ `)
196
+ }
197
+
198
+
199
+ const generateList: OpGen = (
200
+ model: Model,
201
+ entity: ModelEntity,
202
+ flow: ModelEntityFlow,
203
+ step: ModelEntityFlowStep,
204
+ index: number
205
+ ) => {
206
+ const ref = step.input.ref ?? entity.name + '_ref01'
207
+ const entvar = step.input.entvar ?? ref + '_ent'
208
+ const matchvar = step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? ''))
209
+ const listvar = step.input.listvar ?? (ref + '_list' + (step.input.suffix ?? ''))
210
+
211
+ Content(`
212
+ // LIST
213
+ const ${matchvar}: any = {}
214
+ `)
215
+
216
+ each(step.match, (mi: any) => {
217
+ Content(` ${matchvar}['${mi.key$}'] = setup.idmap['${mi.key$}']
218
+ `)
219
+ })
220
+
221
+ Content(`
222
+ const ${listvar} = await ${entvar}.list(${matchvar})
223
+ `)
224
+ for (let vI = 0; vI < step.valid.length; vI++) {
225
+ const validator = step.valid[vI]
226
+ if ('ItemExists' === validator.apply) {
227
+ Content(`
228
+ assert(!isempty(select(${listvar}, { id: ${validator.def.ref}_data.id })))
229
+ `)
230
+ }
231
+ else if ('ItemNotExists' === validator.apply) {
232
+ Content(`
233
+ assert(isempty(select(${listvar}, { id: ${validator.def.ref}_data.id })))
234
+ `)
235
+ }
236
+ }
237
+ }
238
+
239
+
240
+ const generateUpdate: OpGen = (
241
+ model: Model,
242
+ entity: ModelEntity,
243
+ flow: ModelEntityFlow,
244
+ step: ModelEntityFlowStep,
245
+ index: number
246
+ ) => {
247
+ const ref = step.input.ref ?? entity.name + '_ref01'
248
+ const entvar = step.input.entvar ?? ref + '_ent'
249
+ const datavar = step.input.datavar ?? (ref + '_data' + (step.input.suffix ?? ''))
250
+ const resdatavar = step.input.resdatavar ?? (ref + '_resdata' + (step.input.suffix ?? ''))
251
+ const markdefvar = step.input.markdefvar ?? (ref + '_markdef' + (step.input.suffix ?? ''))
252
+ const srcdatavar = step.input.srcdatavar ?? (ref + '_data' + (step.input.suffix ?? ''))
253
+
254
+ Content(`
255
+ // UPDATE
256
+ const ${datavar}: any = {}
257
+ ${datavar}.id = ${srcdatavar}.id
258
+ `)
259
+
260
+ each(step.data, (mi: any) => {
261
+ if ('id' !== mi.key$) {
262
+ Content(` ${datavar} ['${mi.key$}'] = setup.idmap['${mi.key$}']
263
+ `)
264
+ }
265
+ })
266
+
267
+
268
+ for (let sI = 0; sI < step.spec.length; sI++) {
269
+ const spec = step.spec[sI]
270
+ if ('TextFieldMark' === spec.apply && null != step.input.textfield) {
271
+ const fieldname = step.input.textfield
272
+ const fieldvalue = spec.def.mark
273
+ Content(`
274
+ const ${markdefvar} = { name: '${fieldname}', value: '${fieldvalue}_' + setup.now }
275
+ ${datavar} [${markdefvar}.name] = ${markdefvar}.value
276
+ `)
277
+ }
278
+ }
279
+
280
+ Content(`
281
+ const ${resdatavar} = await ${entvar}.update(${datavar})
282
+ assert(${resdatavar}.id === ${datavar}.id)
283
+ `)
284
+
285
+ for (let sI = 0; sI < step.spec.length; sI++) {
286
+ const spec = step.spec[sI]
287
+ if ('TextFieldMark' === spec.apply) {
288
+ Content(`
289
+ assert(${resdatavar}[${markdefvar}.name] === ${markdefvar}.value)
290
+ `)
291
+ }
292
+ }
293
+
294
+ }
295
+
296
+
297
+ const generateLoad: OpGen = (
298
+ model: Model,
299
+ entity: ModelEntity,
300
+ flow: ModelEntityFlow,
301
+ step: ModelEntityFlowStep,
302
+ index: number
303
+ ) => {
304
+ const ref = step.input.ref ?? entity.name + '_ref01'
305
+ const entvar = step.input.entvar ?? ref + '_ent'
306
+ const matchvar = step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? ''))
307
+ const datavar = step.input.datavar ?? (ref + '_data' + (step.input.suffix ?? ''))
308
+ const srcdatavar = step.input.srcdatavar ?? (ref + '_data' + (step.input.suffix ?? ''))
309
+
310
+ Content(`
311
+ // LOAD
312
+ const ${matchvar}: any = {}
313
+ ${matchvar}.id = ${srcdatavar}.id
314
+ const ${datavar} = await ${entvar}.load(${matchvar})
315
+ assert(${datavar}.id === ${srcdatavar}.id)
316
+ `)
317
+ }
318
+
319
+
320
+ const generateRemove: OpGen = (
321
+ model: Model,
322
+ entity: ModelEntity,
323
+ flow: ModelEntityFlow,
324
+ step: ModelEntityFlowStep,
325
+ index: number
326
+ ) => {
327
+ const ref = step.input.ref ?? entity.name + '_ref01'
328
+ const entvar = step.input.entvar ?? ref + '_ent'
329
+ const matchvar = step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? ''))
330
+ const srcdatavar = step.input.srcdatavar ?? (ref + '_data')
331
+
332
+ Content(`
333
+ // REMOVE
334
+ const ${matchvar}: any = {}
335
+ ${matchvar}.id = ${srcdatavar}.id
336
+ await ${entvar}.remove(${matchvar})
337
+ `)
338
+ }
339
+
340
+
341
+ const GENERATE_OP: Record<string, OpGen> = {
342
+ create: generateCreate,
343
+ list: generateList,
344
+ update: generateUpdate,
345
+ load: generateLoad,
346
+ remove: generateRemove,
347
+ }
348
+
349
+
11
350
  export {
12
351
  TestEntity
13
352
  }
@@ -2,9 +2,6 @@
2
2
  import { cmp, each, File, Content } from '@voxgig/sdkgen'
3
3
 
4
4
 
5
- import { TestEntity } from './TestEntity_ts'
6
-
7
-
8
5
  const TestMain = cmp(function TestMain(props: any) {
9
6
  const { target } = props
10
7
  const { model } = props.ctx$
@@ -1,16 +1,34 @@
1
1
 
2
- import { cmp, Folder } from '@voxgig/sdkgen'
2
+ import {
3
+ KIT,
4
+ getModelPath
5
+ } from '@voxgig/apidef'
6
+
7
+ import type {
8
+ ModelEntity
9
+ } from '@voxgig/apidef'
10
+
11
+ import { cmp, each, Folder } from '@voxgig/sdkgen'
12
+
3
13
 
4
14
  // import { Quick } from './Quick_ts'
5
- import { TestMain } from './TestMain_ts'
15
+ // import { TestMain } from './TestMain_ts'
16
+ import { TestEntity } from './TestEntity_ts'
6
17
 
7
18
 
8
19
  const Test = cmp(function Test(props: any) {
20
+ const { model, stdrep } = props.ctx$
9
21
  const { target } = props
10
22
 
11
23
  Folder({ name: 'test' }, () => {
12
24
  // Quick({ target })
13
- TestMain({ target })
25
+ // TestMain({ target })
26
+
27
+ Folder({ name: 'entity' }, () => {
28
+ each(model.main[KIT].entity, (entity: ModelEntity) => {
29
+ TestEntity({ target, entity })
30
+ })
31
+ })
14
32
  })
15
33
  })
16
34
 
@@ -1,11 +1,38 @@
1
1
 
2
- const Config = {
2
+ import { BaseFeature } from './feature/base/BaseFeature'
3
+ // #ImportFeatures
3
4
 
4
- options: {
5
- base: '$$main.def.servers.0.url$$',
5
+
6
+ const FEATURE_CLASS: Record<string, typeof BaseFeature> = {
7
+ // #FeatureClasses
8
+ }
9
+
10
+
11
+ class Config {
12
+
13
+ makeFeature(this: any, fn: string) {
14
+ const fc = FEATURE_CLASS[fn]
15
+ const fi = new fc()
16
+ // TODO: errors etc
17
+ return fi
18
+ }
19
+
20
+
21
+ main = {
22
+ name: 'ProjectName',
23
+ }
24
+
25
+
26
+ feature = {
27
+ // #FeatureConfigs
28
+ }
29
+
30
+
31
+ options = {
32
+ base: '$$main.kit.info.servers.0.url$$',
6
33
 
7
34
  auth: {
8
- prefix: '$$main.sdk.config.auth.prefix$$',
35
+ prefix: '$$main.kit.config.auth.prefix$$',
9
36
  },
10
37
 
11
38
  headers: 'HEADERS',
@@ -14,9 +41,15 @@ const Config = {
14
41
  // #EntityConfigs
15
42
  }
16
43
  }
44
+
45
+
46
+ entity = 'ENTITYMAP'
17
47
  }
18
48
 
19
49
 
50
+ const config = new Config()
51
+
20
52
  export {
21
- Config
53
+ config
22
54
  }
55
+
@@ -6,6 +6,9 @@ import {
6
6
  SdkNameEntity,
7
7
  } from '../SdkNameSDK'
8
8
 
9
+ import {
10
+ Utility
11
+ } from '../utility/Utility'
9
12
 
10
13
  import type {
11
14
  Operation,
@@ -14,14 +17,17 @@ import type {
14
17
  } from '../types'
15
18
 
16
19
 
20
+ // TODO: needs Entity superclass
17
21
  class EntityNameEntity {
22
+ name = 'entityname'
23
+
18
24
  #client: SdkNameSDK
25
+ #utility: Utility
19
26
  #entopts: any
20
- #utility: any
21
27
  #data: any
22
28
  #match: any
23
29
 
24
- #_basectx: any
30
+ _entctx: Context
25
31
 
26
32
  constructor(client: SdkNameSDK, entopts: any) {
27
33
  // super()
@@ -34,17 +40,15 @@ class EntityNameEntity {
34
40
  this.#data = {}
35
41
  this.#match = {}
36
42
 
37
- const contextify = this.#utility.contextify
38
- this.#_basectx = contextify({
43
+ const makeContext = this.#utility.makeContext
44
+
45
+ this._entctx = makeContext({
39
46
  entity: this,
40
- client,
41
- utility: this.#utility,
42
47
  entopts,
43
- options: client.options()
44
- })
48
+ }, client._rootctx)
45
49
 
46
- const featurehook = this.#utility.featurehook
47
- featurehook(this.#_basectx, 'PostConstructEntity')
50
+ const featureHook = this.#utility.featureHook
51
+ featureHook(this._entctx, 'PostConstructEntity')
48
52
  }
49
53
 
50
54
  entopts() {
@@ -61,37 +65,42 @@ class EntityNameEntity {
61
65
 
62
66
 
63
67
  data(this: any, data?: any) {
64
- const featurehook = this.#utility.featurehook
65
- const ctx = this.#_basectx
68
+ const struct = this.#utility.struct
69
+ const featureHook = this.#utility.featureHook
66
70
 
67
71
  if (null != data) {
68
- featurehook(ctx, 'SetData')
69
- this.#data = { ...data }
72
+ this.#data = struct.clone(data)
73
+ featureHook(this._entctx, 'SetData')
70
74
  }
71
75
 
72
- let out = { ...this.#data }
76
+ featureHook(this._entctx, 'GetData')
77
+ let out = struct.clone(this.#data)
73
78
 
74
- featurehook(ctx, 'GetData')
75
79
  return out
76
80
  }
77
81
 
78
82
 
79
83
  match(match?: any) {
80
- const featurehook = this.#utility.featurehook
81
- const ctx = this.#_basectx
84
+ const struct = this.#utility.struct
85
+ const featureHook = this.#utility.featureHook
82
86
 
83
87
  if (null != match) {
84
- featurehook(ctx, 'SetMatch')
85
- this.#match = { ...match }
88
+ this.#match = struct.clone(match)
89
+ featureHook(this._entctx, 'SetMatch')
86
90
  }
87
91
 
88
- let out = { ...this.#match }
92
+ featureHook(this._entctx, 'GetMatch')
93
+ let out = struct.clone(this.#match)
89
94
 
90
- featurehook(ctx, 'GetMatch')
91
95
  return out
92
96
  }
93
97
 
94
98
 
99
+ toJSON() {
100
+ const struct = this.#utility.struct
101
+ return struct.merge([{}, struct.getdef(this.#data, {}), { $entity: 'EntityName' }])
102
+ }
103
+
95
104
  toString() {
96
105
  return 'EntityName ' + this.#utility.struct.jsonify(this.#data)
97
106
  }
@@ -112,32 +121,37 @@ class EntityNameEntity {
112
121
  // #RemoveOp
113
122
 
114
123
 
115
-
116
124
  #unexpected(this: any, ctx: Context, err: any) {
125
+ const clean = this.#utility.clean
126
+ const struct = this.#utility.struct
127
+
128
+ const delprop = struct.delprop
129
+ const clone = struct.clone
130
+ const merge = struct.merge
131
+
117
132
  const ctrl = ctx.ctrl
118
133
 
119
134
  ctrl.err = err
120
135
 
121
136
  if (ctrl.explain) {
122
- const { clean, struct } = this.#utility
123
- const { delprop, clone } = struct
124
-
125
137
  ctx.ctrl.explain = clean(ctx, ctx.ctrl.explain)
126
138
  delprop(ctx.ctrl.explain.result, 'err')
127
139
 
128
140
  if (null != ctx.result && null != ctx.result.err) {
129
- ctrl.explain.err = clean(ctx, {
130
- ...clone({ err: ctx.result.err }).err,
131
- message: ctx.result.err.message,
132
- stack: ctx.result.err.stack,
133
- })
141
+ ctrl.explain.err = clean(ctx, merge([
142
+ clone({ err: ctx.result.err }).err,
143
+ {
144
+ message: ctx.result.err.message,
145
+ stack: ctx.result.err.stack,
146
+ }]))
134
147
  }
135
148
 
136
- const cleanerr = clean(ctx, {
137
- ...clone({ err }).err,
138
- message: err.message,
139
- stack: err.stack,
140
- })
149
+ const cleanerr = clean(ctx, merge([
150
+ clone({ err }).err,
151
+ {
152
+ message: err.message,
153
+ stack: err.stack,
154
+ }]))
141
155
 
142
156
  if (null == ctrl.explain.err) {
143
157
  ctrl.explain.err = cleanerr
@@ -157,8 +171,6 @@ class EntityNameEntity {
157
171
  }
158
172
 
159
173
 
160
-
161
-
162
174
  export {
163
175
  EntityNameEntity
164
176
  }
@@ -2,21 +2,23 @@
2
2
  const envlocal = __dirname + '/../../../.env.local'
3
3
  require('dotenv').config({ quiet: true, path: [envlocal] })
4
4
 
5
+ import Path from 'node:path'
6
+ import * as Fs from 'node:fs'
5
7
 
6
8
  import { test, describe } from 'node:test'
7
- import { equal } from 'node:assert'
9
+ import assert from 'node:assert'
8
10
 
9
11
 
10
- import { ProjectNameSDK, BaseFeature, utility } from '../..'
12
+ import { ProjectNameSDK, BaseFeature, stdutil } from '../../..'
11
13
 
12
14
  import {
13
- makeStepData,
15
+ envOverride,
16
+ makeCtrl,
14
17
  makeMatch,
15
18
  makeReqdata,
19
+ makeStepData,
16
20
  makeValid,
17
- makeCtrl,
18
- envOverride,
19
- } from '../utility'
21
+ } from '../../utility'
20
22
 
21
23
 
22
24
  describe('EntityNameEntity', async () => {
@@ -24,7 +26,7 @@ describe('EntityNameEntity', async () => {
24
26
  test('instance', async () => {
25
27
  const testsdk = ProjectNameSDK.test()
26
28
  const ent = testsdk.EntityName()
27
- equal(null !== ent, true)
29
+ assert(null != ent)
28
30
  })
29
31
 
30
32