@voxgig/sdkgen 0.34.8 → 0.34.11
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/package.json +1 -1
- package/project/.sdk/src/cmp/js/Entity_js.ts +1 -0
- package/project/.sdk/src/cmp/ts/Entity_ts.ts +1 -0
- package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +21 -5
- package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +51 -13
- package/project/.sdk/tm/go/utility/make_target.go +5 -0
- package/project/.sdk/tm/ts/src/utility/MakePointUtility.ts +5 -0
package/bin/voxgig-sdkgen
CHANGED
package/package.json
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
Fragment,
|
|
12
12
|
Slot,
|
|
13
13
|
cmp,
|
|
14
|
+
snakify,
|
|
14
15
|
} from '@voxgig/sdkgen'
|
|
15
16
|
|
|
16
17
|
|
|
@@ -121,20 +122,20 @@ function directSetup(mockres?: any) {
|
|
|
121
122
|
|
|
122
123
|
function generateDirectLoad(model: any, entity: any) {
|
|
123
124
|
const loadOp = entity.op.load
|
|
124
|
-
const loadPoint = loadOp
|
|
125
|
+
const loadPoint = loadOp?.points?.[0]
|
|
125
126
|
|
|
126
127
|
if (null == loadPoint) {
|
|
127
128
|
return
|
|
128
129
|
}
|
|
129
130
|
|
|
130
|
-
const loadPath = (loadPoint.parts || []).join('/')
|
|
131
131
|
const loadParams = loadPoint.args?.params || []
|
|
132
|
+
const loadPath = normalizePathParams(loadPoint.parts || [], loadParams)
|
|
132
133
|
|
|
133
134
|
// Get list info for live mode bootstrapping
|
|
134
135
|
const listOp = entity.op.list
|
|
135
136
|
const listPoint = listOp?.points?.[0]
|
|
136
|
-
const listPath = listPoint ? (listPoint.parts || []).join('/') : ''
|
|
137
137
|
const listParams = listPoint?.args?.params || []
|
|
138
|
+
const listPath = listPoint ? normalizePathParams(listPoint.parts || [], listParams) : ''
|
|
138
139
|
const hasList = null != listPoint
|
|
139
140
|
|
|
140
141
|
// Ancestor params (not 'id') for live mode
|
|
@@ -218,14 +219,14 @@ ${paramAsserts} }
|
|
|
218
219
|
|
|
219
220
|
function generateDirectList(model: any, entity: any) {
|
|
220
221
|
const listOp = entity.op.list
|
|
221
|
-
const listPoint = listOp
|
|
222
|
+
const listPoint = listOp?.points?.[0]
|
|
222
223
|
|
|
223
224
|
if (null == listPoint) {
|
|
224
225
|
return
|
|
225
226
|
}
|
|
226
227
|
|
|
227
|
-
const listPath = (listPoint.parts || []).join('/')
|
|
228
228
|
const listParams = listPoint.args?.params || []
|
|
229
|
+
const listPath = normalizePathParams(listPoint.parts || [], listParams)
|
|
229
230
|
|
|
230
231
|
// Build live params
|
|
231
232
|
const liveParams = listParams.map((p: any) => {
|
|
@@ -283,6 +284,21 @@ ${paramAsserts} }
|
|
|
283
284
|
}
|
|
284
285
|
|
|
285
286
|
|
|
287
|
+
// Replace raw OpenAPI parameter names in path parts with model parameter names.
|
|
288
|
+
// Path parts may have e.g. {subBreed} while model params use sub_breed.
|
|
289
|
+
function normalizePathParams(parts: string[], params: any[]): string {
|
|
290
|
+
return parts.map((part: string) => {
|
|
291
|
+
if (part.startsWith('{') && part.endsWith('}')) {
|
|
292
|
+
const rawName = part.slice(1, -1)
|
|
293
|
+
const snaked = snakify(rawName)
|
|
294
|
+
const param = params.find((p: any) => p.orig === snaked || p.name === snaked)
|
|
295
|
+
if (param) return '{' + param.name + '}'
|
|
296
|
+
}
|
|
297
|
+
return part
|
|
298
|
+
}).join('/')
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
286
302
|
export {
|
|
287
303
|
TestDirect
|
|
288
304
|
}
|
|
@@ -78,9 +78,9 @@ const TestEntity = cmp(function TestEntity(props: any) {
|
|
|
78
78
|
const indent = 2
|
|
79
79
|
|
|
80
80
|
const idlist = flatten([
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
entity.name + '01',
|
|
82
|
+
entity.name + '02',
|
|
83
|
+
entity.name + '03',
|
|
84
84
|
flatten(items(entity.relations.ancestors, (ap: any) =>
|
|
85
85
|
items(ap[1], (a: any) =>
|
|
86
86
|
items(['01', '02', '03'], (n: any) =>
|
|
@@ -189,11 +189,33 @@ const generateCreate: OpGen = (
|
|
|
189
189
|
const entvar = step.input.entvar ?? ref + '_ent'
|
|
190
190
|
const datavar = step.input.datavar ?? (ref + '_data' + (step.input.suffix ?? ''))
|
|
191
191
|
|
|
192
|
+
const priorSteps = Object.values(flow.step).slice(0, Number(index))
|
|
193
|
+
const needsEnt = !priorSteps.some((s: any) =>
|
|
194
|
+
['create', 'list', 'load', 'remove'].includes(s.op))
|
|
195
|
+
|
|
196
|
+
const hasDatvar = priorSteps.some((s: any) => {
|
|
197
|
+
if ('create' === s.op) {
|
|
198
|
+
const priorRef = s.input?.ref ?? entity.name + '_ref01'
|
|
199
|
+
const priorDatvar = s.input?.datavar ?? (priorRef + '_data' + (s.input?.suffix ?? ''))
|
|
200
|
+
return priorDatvar === datavar
|
|
201
|
+
}
|
|
202
|
+
return false
|
|
203
|
+
})
|
|
204
|
+
|
|
192
205
|
Content(`
|
|
193
206
|
// CREATE
|
|
194
|
-
const ${entvar} = client.${nom(entity, 'Name')}()
|
|
195
|
-
let ${datavar} = setup.data.new.${entity.name}['${ref}']
|
|
196
207
|
`)
|
|
208
|
+
if (needsEnt) {
|
|
209
|
+
Content(` const ${entvar} = client.${nom(entity, 'Name')}()
|
|
210
|
+
`)
|
|
211
|
+
}
|
|
212
|
+
if (hasDatvar) {
|
|
213
|
+
Content(` ${datavar} = setup.data.new.${entity.name}['${ref}']
|
|
214
|
+
`)
|
|
215
|
+
} else {
|
|
216
|
+
Content(` let ${datavar} = setup.data.new.${entity.name}['${ref}']
|
|
217
|
+
`)
|
|
218
|
+
}
|
|
197
219
|
|
|
198
220
|
each(step.match, (mi: any) => {
|
|
199
221
|
Content(` ${datavar}['${mi.key$}'] = setup.idmap['${mi.val$}']
|
|
@@ -219,8 +241,9 @@ const generateList: OpGen = (
|
|
|
219
241
|
const matchvar = step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? ''))
|
|
220
242
|
const listvar = step.input.listvar ?? (ref + '_list' + (step.input.suffix ?? ''))
|
|
221
243
|
|
|
222
|
-
const priorSteps = Object.values(flow.step).slice(0, index
|
|
223
|
-
const needsEnt = !priorSteps.some((s: any) =>
|
|
244
|
+
const priorSteps = Object.values(flow.step).slice(0, Number(index))
|
|
245
|
+
const needsEnt = !priorSteps.some((s: any) =>
|
|
246
|
+
['create', 'list', 'load', 'remove'].includes(s.op))
|
|
224
247
|
|
|
225
248
|
Content(`
|
|
226
249
|
// LIST
|
|
@@ -331,15 +354,29 @@ const generateLoad: OpGen = (
|
|
|
331
354
|
const datavar = step.input.datavar ?? (ref + '_data' + (step.input.suffix ?? ''))
|
|
332
355
|
const srcdatavar = step.input.srcdatavar ?? (ref + '_data' + (step.input.suffix ?? ''))
|
|
333
356
|
|
|
334
|
-
const priorSteps = Object.values(flow.step).slice(0, index
|
|
335
|
-
const
|
|
357
|
+
const priorSteps = Object.values(flow.step).slice(0, Number(index))
|
|
358
|
+
const hasEntVar = priorSteps.some((s: any) =>
|
|
359
|
+
['create', 'list', 'load', 'remove'].includes(s.op))
|
|
360
|
+
|
|
361
|
+
// Check if srcdatavar was declared by a prior create step
|
|
362
|
+
const hasSrcData = priorSteps.some((s: any) => {
|
|
363
|
+
if ('create' === s.op) {
|
|
364
|
+
const priorRef = s.input?.ref ?? entity.name + '_ref01'
|
|
365
|
+
const priorDatvar = s.input?.datavar ?? (priorRef + '_data' + (s.input?.suffix ?? ''))
|
|
366
|
+
return priorDatvar === srcdatavar
|
|
367
|
+
}
|
|
368
|
+
return false
|
|
369
|
+
})
|
|
336
370
|
|
|
337
371
|
Content(`
|
|
338
372
|
// LOAD
|
|
339
373
|
`)
|
|
340
|
-
if (!
|
|
374
|
+
if (!hasEntVar) {
|
|
341
375
|
Content(` const ${entvar} = client.${nom(entity, 'Name')}()
|
|
342
|
-
|
|
376
|
+
`)
|
|
377
|
+
}
|
|
378
|
+
if (!hasSrcData) {
|
|
379
|
+
Content(` const ${srcdatavar} = Object.values(setup.data.existing.${entity.name})[0] as any
|
|
343
380
|
`)
|
|
344
381
|
}
|
|
345
382
|
Content(` const ${matchvar}: any = {}
|
|
@@ -362,8 +399,9 @@ const generateRemove: OpGen = (
|
|
|
362
399
|
const matchvar = step.input.matchvar ?? (ref + '_match' + (step.input.suffix ?? ''))
|
|
363
400
|
const srcdatavar = step.input.srcdatavar ?? (ref + '_data')
|
|
364
401
|
|
|
365
|
-
const priorSteps = Object.values(flow.step).slice(0, index
|
|
366
|
-
const needsEnt = !priorSteps.some((s: any) =>
|
|
402
|
+
const priorSteps = Object.values(flow.step).slice(0, Number(index))
|
|
403
|
+
const needsEnt = !priorSteps.some((s: any) =>
|
|
404
|
+
['create', 'list', 'load', 'remove'].includes(s.op))
|
|
367
405
|
|
|
368
406
|
Content(`
|
|
369
407
|
// REMOVE
|
|
@@ -26,6 +26,11 @@ func makePointUtil(ctx *core.Context) (map[string]any, error) {
|
|
|
26
26
|
"\" not allowed by SDK option allow.op value: \""+allowOp+"\"")
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
if len(op.Points) == 0 {
|
|
30
|
+
return nil, ctx.MakeError("point_no_points",
|
|
31
|
+
"Operation \""+op.Name+"\" has no endpoint definitions.")
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
if len(op.Points) == 1 {
|
|
30
35
|
ctx.Point = op.Points[0]
|
|
31
36
|
} else {
|
|
@@ -16,6 +16,11 @@ function makePoint(ctx: Context): Point | Error {
|
|
|
16
16
|
'" not allowed by SDK option allow.op value: "' + options.allow.op + '"')
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
if (0 === op.points.length) {
|
|
20
|
+
return ctx.error('point_no_points',
|
|
21
|
+
'Operation "' + op.name + '" has no endpoint definitions.')
|
|
22
|
+
}
|
|
23
|
+
|
|
19
24
|
// Choose the appropriate point based on the match or data.
|
|
20
25
|
if (1 === op.points.length) {
|
|
21
26
|
ctx.point = op.points[0]
|