@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 CHANGED
@@ -8,7 +8,7 @@ const { Gubu, Fault, One } = require('gubu')
8
8
 
9
9
  const { SdkGen } = require('../dist/sdkgen.js')
10
10
 
11
- const VERSION = '0.34.8'
11
+ const VERSION = '0.34.11'
12
12
  const KONSOLE = console
13
13
 
14
14
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxgig/sdkgen",
3
- "version": "0.34.8",
3
+ "version": "0.34.11",
4
4
  "main": "dist/sdkgen.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/sdkgen.d.ts",
@@ -39,6 +39,7 @@ const Entity = cmp(function Entity(props: any) {
39
39
  from: ff + 'Entity.fragment.js',
40
40
  replace: {
41
41
  ...entrep,
42
+ entityname: entity.name,
42
43
  SdkName: model.const.Name,
43
44
  EntityName: entity.Name,
44
45
 
@@ -40,6 +40,7 @@ const Entity = cmp(function Entity(props: any) {
40
40
  from: ff + 'Entity.fragment.ts',
41
41
  replace: {
42
42
  ...entrep,
43
+ entityname: entity.name,
43
44
  SdkName: model.const.Name,
44
45
  EntityName: entity.Name,
45
46
 
@@ -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.points[0]
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.points[0]
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
- '${entity.name}01',
82
- '${entity.name}02',
83
- '${entity.name}03',
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.key$)
223
- const needsEnt = !priorSteps.some((s: any) => 'create' === s.op)
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.key$)
335
- const hasCreate = priorSteps.some((s: any) => 'create' === s.op)
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 (!hasCreate) {
374
+ if (!hasEntVar) {
341
375
  Content(` const ${entvar} = client.${nom(entity, 'Name')}()
342
- const ${srcdatavar} = Object.values(setup.data.existing.${entity.name})[0] as any
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.key$)
366
- const needsEnt = !priorSteps.some((s: any) => 'create' === s.op)
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]