@voxgig/sdkgen 4.22.0 → 4.23.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 (195) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/cmp/ReadmeTop.js +1 -1
  3. package/dist/cmp/ReadmeTop.js.map +1 -1
  4. package/dist/cmp/ReadmeUnions.js +1 -1
  5. package/dist/cmp/ReadmeUnions.js.map +1 -1
  6. package/dist/cmp/Test.js +1 -1
  7. package/dist/cmp/Test.js.map +1 -1
  8. package/dist/helpers/buildIdNames.d.ts +3 -1
  9. package/dist/helpers/buildIdNames.js +15 -7
  10. package/dist/helpers/buildIdNames.js.map +1 -1
  11. package/dist/helpers/canonSpec.js +2 -2
  12. package/dist/helpers/canonSpec.js.map +1 -1
  13. package/dist/helpers/getMatchEntries.js +2 -2
  14. package/dist/helpers/getMatchEntries.js.map +1 -1
  15. package/dist/helpers/modelNames.js +5 -1
  16. package/dist/helpers/modelNames.js.map +1 -1
  17. package/dist/helpers/opShape.js +33 -33
  18. package/dist/helpers/opShape.js.map +1 -1
  19. package/dist/helpers/pointPath.js +5 -10
  20. package/dist/helpers/pointPath.js.map +1 -1
  21. package/dist/helpers/resolved.js +2 -29
  22. package/dist/helpers/resolved.js.map +1 -1
  23. package/dist/sdkgen.d.ts +2 -2
  24. package/dist/sdkgen.js +5 -3
  25. package/dist/sdkgen.js.map +1 -1
  26. package/dist/tsconfig.tsbuildinfo +1 -1
  27. package/dist/utility.js +15 -7
  28. package/dist/utility.js.map +1 -1
  29. package/package.json +3 -3
  30. package/project/.sdk/src/cmp/c/EntityTypes_c.ts +4 -4
  31. package/project/.sdk/src/cmp/c/ReadmeEntity_c.ts +3 -3
  32. package/project/.sdk/src/cmp/c/ReadmeModel_c.ts +3 -3
  33. package/project/.sdk/src/cmp/c/ReadmeRef_c.ts +5 -5
  34. package/project/.sdk/src/cmp/c/Schema_c.ts +1 -1
  35. package/project/.sdk/src/cmp/c/TestDirect_c.ts +12 -12
  36. package/project/.sdk/src/cmp/clojure/ReadmeEntity_clojure.ts +3 -3
  37. package/project/.sdk/src/cmp/clojure/ReadmeModel_clojure.ts +3 -3
  38. package/project/.sdk/src/cmp/clojure/ReadmeRef_clojure.ts +5 -5
  39. package/project/.sdk/src/cmp/clojure/Schema_clojure.ts +1 -1
  40. package/project/.sdk/src/cmp/cpp/EntityTypes_cpp.ts +3 -3
  41. package/project/.sdk/src/cmp/cpp/ReadmeEntity_cpp.ts +3 -3
  42. package/project/.sdk/src/cmp/cpp/ReadmeModel_cpp.ts +3 -3
  43. package/project/.sdk/src/cmp/cpp/ReadmeRef_cpp.ts +5 -5
  44. package/project/.sdk/src/cmp/cpp/Schema_cpp.ts +1 -1
  45. package/project/.sdk/src/cmp/cpp/TestDirect_cpp.ts +14 -14
  46. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +51 -50
  47. package/project/.sdk/src/cmp/csharp/EntityTypes_csharp.ts +4 -4
  48. package/project/.sdk/src/cmp/csharp/ReadmeEntity_csharp.ts +3 -3
  49. package/project/.sdk/src/cmp/csharp/ReadmeModel_csharp.ts +3 -3
  50. package/project/.sdk/src/cmp/csharp/ReadmeRef_csharp.ts +5 -5
  51. package/project/.sdk/src/cmp/csharp/Schema_csharp.ts +1 -1
  52. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +30 -30
  53. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +66 -65
  54. package/project/.sdk/src/cmp/elixir/EntityTypes_elixir.ts +4 -4
  55. package/project/.sdk/src/cmp/elixir/ReadmeEntity_elixir.ts +3 -3
  56. package/project/.sdk/src/cmp/elixir/ReadmeModel_elixir.ts +3 -3
  57. package/project/.sdk/src/cmp/elixir/ReadmeRef_elixir.ts +4 -4
  58. package/project/.sdk/src/cmp/elixir/Schema_elixir.ts +1 -1
  59. package/project/.sdk/src/cmp/go/EntityTypes_go.ts +4 -4
  60. package/project/.sdk/src/cmp/go/ReadmeEntity_go.ts +3 -3
  61. package/project/.sdk/src/cmp/go/ReadmeModel_go.ts +3 -3
  62. package/project/.sdk/src/cmp/go/ReadmeRef_go.ts +5 -5
  63. package/project/.sdk/src/cmp/go/Schema_go.ts +1 -1
  64. package/project/.sdk/src/cmp/go/TestDirect_go.ts +38 -38
  65. package/project/.sdk/src/cmp/go/TestEntity_go.ts +75 -74
  66. package/project/.sdk/src/cmp/go/utility_go.ts +5 -5
  67. package/project/.sdk/src/cmp/java/EntityTypes_java.ts +4 -4
  68. package/project/.sdk/src/cmp/java/ReadmeEntity_java.ts +3 -3
  69. package/project/.sdk/src/cmp/java/ReadmeModel_java.ts +3 -3
  70. package/project/.sdk/src/cmp/java/ReadmeRef_java.ts +5 -5
  71. package/project/.sdk/src/cmp/java/Schema_java.ts +1 -1
  72. package/project/.sdk/src/cmp/java/TestDirect_java.ts +30 -30
  73. package/project/.sdk/src/cmp/java/TestEntity_java.ts +69 -68
  74. package/project/.sdk/src/cmp/js/EntityTypes_js.ts +5 -5
  75. package/project/.sdk/src/cmp/js/ReadmeEntity_js.ts +3 -3
  76. package/project/.sdk/src/cmp/js/ReadmeModel_js.ts +3 -3
  77. package/project/.sdk/src/cmp/js/ReadmeRef_js.ts +5 -5
  78. package/project/.sdk/src/cmp/js/Schema_js.ts +1 -1
  79. package/project/.sdk/src/cmp/js/TestDirect_js.ts +27 -27
  80. package/project/.sdk/src/cmp/js/TestEntity_js.ts +66 -69
  81. package/project/.sdk/src/cmp/js/TestLive_js.ts +3 -3
  82. package/project/.sdk/src/cmp/js/utility_js.ts +5 -5
  83. package/project/.sdk/src/cmp/kotlin/EntityTypes_kotlin.ts +4 -4
  84. package/project/.sdk/src/cmp/kotlin/ReadmeEntity_kotlin.ts +3 -3
  85. package/project/.sdk/src/cmp/kotlin/ReadmeModel_kotlin.ts +3 -3
  86. package/project/.sdk/src/cmp/kotlin/ReadmeRef_kotlin.ts +5 -5
  87. package/project/.sdk/src/cmp/kotlin/Schema_kotlin.ts +1 -1
  88. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +30 -30
  89. package/project/.sdk/src/cmp/kotlin/TestEntity_kotlin.ts +67 -66
  90. package/project/.sdk/src/cmp/lua/EntityTypes_lua.ts +5 -5
  91. package/project/.sdk/src/cmp/lua/ReadmeEntity_lua.ts +3 -3
  92. package/project/.sdk/src/cmp/lua/ReadmeModel_lua.ts +3 -3
  93. package/project/.sdk/src/cmp/lua/ReadmeQuick_lua.ts +4 -4
  94. package/project/.sdk/src/cmp/lua/ReadmeRef_lua.ts +5 -5
  95. package/project/.sdk/src/cmp/lua/Schema_lua.ts +1 -1
  96. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +25 -25
  97. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +66 -65
  98. package/project/.sdk/src/cmp/ocaml/ReadmeEntity_ocaml.ts +3 -3
  99. package/project/.sdk/src/cmp/ocaml/ReadmeModel_ocaml.ts +3 -3
  100. package/project/.sdk/src/cmp/ocaml/ReadmeRef_ocaml.ts +5 -5
  101. package/project/.sdk/src/cmp/ocaml/Schema_ocaml.ts +1 -1
  102. package/project/.sdk/src/cmp/perl/ReadmeEntity_perl.ts +3 -3
  103. package/project/.sdk/src/cmp/perl/ReadmeModel_perl.ts +3 -3
  104. package/project/.sdk/src/cmp/perl/ReadmeRef_perl.ts +5 -5
  105. package/project/.sdk/src/cmp/perl/Schema_perl.ts +1 -1
  106. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +25 -25
  107. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +60 -59
  108. package/project/.sdk/src/cmp/php/EntityTypes_php.ts +4 -4
  109. package/project/.sdk/src/cmp/php/ReadmeEntity_php.ts +3 -3
  110. package/project/.sdk/src/cmp/php/ReadmeModel_php.ts +3 -3
  111. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +4 -4
  112. package/project/.sdk/src/cmp/php/ReadmeRef_php.ts +5 -5
  113. package/project/.sdk/src/cmp/php/Schema_php.ts +1 -1
  114. package/project/.sdk/src/cmp/php/TestDirect_php.ts +25 -25
  115. package/project/.sdk/src/cmp/php/TestEntity_php.ts +66 -65
  116. package/project/.sdk/src/cmp/py/EntityTypes_py.ts +4 -4
  117. package/project/.sdk/src/cmp/py/ReadmeEntity_py.ts +3 -3
  118. package/project/.sdk/src/cmp/py/ReadmeModel_py.ts +3 -3
  119. package/project/.sdk/src/cmp/py/ReadmeRef_py.ts +5 -5
  120. package/project/.sdk/src/cmp/py/Schema_py.ts +1 -1
  121. package/project/.sdk/src/cmp/py/TestDirect_py.ts +25 -25
  122. package/project/.sdk/src/cmp/py/TestEntity_py.ts +66 -65
  123. package/project/.sdk/src/cmp/py-data/Main_py-data.ts +4 -4
  124. package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +4 -4
  125. package/project/.sdk/src/cmp/rb/ReadmeEntity_rb.ts +3 -3
  126. package/project/.sdk/src/cmp/rb/ReadmeModel_rb.ts +3 -3
  127. package/project/.sdk/src/cmp/rb/ReadmeQuick_rb.ts +4 -4
  128. package/project/.sdk/src/cmp/rb/ReadmeRef_rb.ts +5 -5
  129. package/project/.sdk/src/cmp/rb/Schema_rb.ts +1 -1
  130. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +25 -25
  131. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +66 -65
  132. package/project/.sdk/src/cmp/rust/EntityTypes_rust.ts +4 -4
  133. package/project/.sdk/src/cmp/rust/ReadmeEntity_rust.ts +3 -3
  134. package/project/.sdk/src/cmp/rust/ReadmeModel_rust.ts +3 -3
  135. package/project/.sdk/src/cmp/rust/ReadmeRef_rust.ts +5 -5
  136. package/project/.sdk/src/cmp/rust/Schema_rust.ts +1 -1
  137. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +18 -18
  138. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +63 -62
  139. package/project/.sdk/src/cmp/scala/EntityTypes_scala.ts +4 -4
  140. package/project/.sdk/src/cmp/scala/ReadmeEntity_scala.ts +3 -3
  141. package/project/.sdk/src/cmp/scala/ReadmeModel_scala.ts +3 -3
  142. package/project/.sdk/src/cmp/scala/ReadmeRef_scala.ts +5 -5
  143. package/project/.sdk/src/cmp/scala/Schema_scala.ts +1 -1
  144. package/project/.sdk/src/cmp/scala/TestDirect_scala.ts +14 -14
  145. package/project/.sdk/src/cmp/scala/TestEntity_scala.ts +60 -59
  146. package/project/.sdk/src/cmp/swift/EntityTypes_swift.ts +4 -4
  147. package/project/.sdk/src/cmp/swift/ReadmeEntity_swift.ts +3 -3
  148. package/project/.sdk/src/cmp/swift/ReadmeModel_swift.ts +3 -3
  149. package/project/.sdk/src/cmp/swift/ReadmeRef_swift.ts +5 -5
  150. package/project/.sdk/src/cmp/swift/Schema_swift.ts +1 -1
  151. package/project/.sdk/src/cmp/ts/EntityTypes_ts.ts +5 -5
  152. package/project/.sdk/src/cmp/ts/ReadmeEntity_ts.ts +3 -3
  153. package/project/.sdk/src/cmp/ts/ReadmeModel_ts.ts +3 -3
  154. package/project/.sdk/src/cmp/ts/ReadmeQuick_ts.ts +1 -1
  155. package/project/.sdk/src/cmp/ts/ReadmeRef_ts.ts +5 -5
  156. package/project/.sdk/src/cmp/ts/Schema_ts.ts +1 -1
  157. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +40 -40
  158. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +72 -75
  159. package/project/.sdk/src/cmp/ts/TestLive_ts.ts +3 -3
  160. package/project/.sdk/src/cmp/ts/utility_ts.ts +5 -5
  161. package/project/.sdk/src/cmp/zig/ReadmeEntity_zig.ts +3 -3
  162. package/project/.sdk/src/cmp/zig/ReadmeModel_zig.ts +3 -3
  163. package/project/.sdk/src/cmp/zig/ReadmeRef_zig.ts +5 -5
  164. package/project/.sdk/src/cmp/zig/Schema_zig.ts +1 -1
  165. package/project/.sdk/tm/c/feature/test.c +20 -4
  166. package/project/.sdk/tm/clojure/src/sdk/features.clj +6 -4
  167. package/project/.sdk/tm/cpp/feature/test.hpp +17 -6
  168. package/project/.sdk/tm/csharp/feature/TestFeature.cs +10 -4
  169. package/project/.sdk/tm/elixir/lib/projectname/feature/test.ex +11 -5
  170. package/project/.sdk/tm/java/feature/TestFeature.java +11 -6
  171. package/project/.sdk/tm/js/test/live-entity.js +29 -29
  172. package/project/.sdk/tm/js/test/live-scenarios.js +4 -4
  173. package/project/.sdk/tm/kotlin/feature/TestFeature.kt +8 -4
  174. package/project/.sdk/tm/ocaml/sdk_features.ml +6 -4
  175. package/project/.sdk/tm/perl/feature/test_feature.pm +6 -4
  176. package/project/.sdk/tm/rb/feature/test_feature.rb +6 -4
  177. package/project/.sdk/tm/rust/feature/test.rs +8 -4
  178. package/project/.sdk/tm/scala/feature/TestFeature.scala +10 -6
  179. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/TestFeature.swift +10 -6
  180. package/project/.sdk/tm/ts/test/live-entity.ts +26 -26
  181. package/project/.sdk/tm/ts/test/live-scenarios.ts +3 -3
  182. package/project/.sdk/tm/zig/feature/test.zig +11 -4
  183. package/project/sdkgen-package.json +1 -1
  184. package/src/cmp/ReadmeTop.ts +1 -1
  185. package/src/cmp/ReadmeUnions.ts +1 -1
  186. package/src/cmp/Test.ts +1 -1
  187. package/src/helpers/buildIdNames.ts +17 -7
  188. package/src/helpers/canonSpec.ts +2 -2
  189. package/src/helpers/getMatchEntries.ts +2 -2
  190. package/src/helpers/modelNames.ts +6 -1
  191. package/src/helpers/opShape.ts +33 -33
  192. package/src/helpers/pointPath.ts +5 -10
  193. package/src/helpers/resolved.ts +3 -14
  194. package/src/sdkgen.ts +3 -1
  195. package/src/utility.ts +16 -7
@@ -109,15 +109,22 @@ fn envelope(ctx: *Context, data: Value) Value {
109
109
  const restf = h.getpath(&.{ "transform", "res" }, ctx.point);
110
110
  if (restf != .string) return data;
111
111
  const spec = restf.string;
112
- // Exactly `body.<key>`; a deeper path is not an envelope this mock can
113
- // synthesise, so it is left alone rather than guessed at.
112
+ // Rebuild whatever nesting the transform unwraps. Multi-segment on purpose:
113
+ // GraphQL ops unwrap `body.data.<field>`, not just one envelope property.
114
114
  if (spec.len < 8) return data;
115
115
  if (!std.mem.startsWith(u8, spec, "`body.")) return data;
116
116
  if (!std.mem.endsWith(u8, spec, "`")) return data;
117
117
  const inner = spec[6 .. spec.len - 1];
118
118
  if (inner.len == 0) return data;
119
- if (std.mem.indexOfScalar(u8, inner, '.') != null) return data;
120
- return h.jo(&.{.{ inner, data }});
119
+ var out = data;
120
+ var end: usize = inner.len;
121
+ while (true) {
122
+ const cut = std.mem.lastIndexOfScalar(u8, inner[0..end], '.');
123
+ const start = if (cut) |c| c + 1 else 0;
124
+ out = h.jo(&.{.{ inner[start..end], out }});
125
+ if (cut) |c| end = c else break;
126
+ }
127
+ return out;
121
128
  }
122
129
 
123
130
  fn respond(ctx: *Context, status: i64, data: Value, extra: []const h.Pair) Value {
@@ -3,7 +3,7 @@
3
3
  "package": 1
4
4
  },
5
5
  "name": "@voxgig/sdkgen",
6
- "version": "4.22.0",
6
+ "version": "4.23.0",
7
7
  "provides": {
8
8
  "target": [
9
9
  "c",
@@ -192,7 +192,7 @@ Learn more about Voxgig SDKs at [voxgig.com/sdk](${VOXGIG_SDK}).
192
192
  // Named here, in one line, with the detail left to each target's README.
193
193
  const features = featureDocs(model)
194
194
  if (0 < features.length) {
195
- Content(`> **Features:** ${features.map((f: any) => '`' + f.name + '`').join(', ')} — opt-in,
195
+ Content(`> **Features:** ${features.map((f: any) => '`' + f.n + '`').join(', ')} — opt-in,
196
196
  > inactive until switched on, and configured per client. See the Features
197
197
  > section of any SDK README below for what each one does.
198
198
 
@@ -28,7 +28,7 @@ const ReadmeUnions = cmp(function ReadmeUnions(props: any) {
28
28
  }
29
29
  rows.push({
30
30
  entity: ent.name,
31
- field: field.name,
31
+ field: field.n,
32
32
  branches: union.branches,
33
33
  depth: union.depth,
34
34
  })
package/src/cmp/Test.ts CHANGED
@@ -27,7 +27,7 @@ const Test = cmp(function Test(props: any) {
27
27
  const supported = ['ts', 'js'].includes(target.name)
28
28
  File({ name: 'live-coverage.json' }, () => Content(JSON.stringify({
29
29
  version: 1, target: target.name, scenarios: supported ? 'supported' : 'unsupported',
30
- points: points.map(point => point.contract?.id || point.method + ' ' + point.orig),
30
+ points: points.map(point => point.co?.id || point.m + ' ' + point.o),
31
31
  ...(!supported ? { reason: 'This target does not yet execute declarative live recipes. Its existing tests do not establish full operation coverage.' } : {}),
32
32
  }, null, 2)))
33
33
  if (!supported) log.warn({ point: 'live-scenarios-unsupported', note: 'Declarative live recipes are not executed by target ' + target.name })
@@ -26,24 +26,24 @@ function buildIdNames(entity: EntityLike, flow: FlowLike): string[] {
26
26
 
27
27
  const ancestors: string[] = (entity.relations?.ancestors || []).flat()
28
28
  for (const anc of ancestors) {
29
- for (let i = 1; i <= COUNT; i++) push(`${anc}0${i}`)
29
+ for (let i = 1; i <= COUNT; i++) push(`${entityRelationName(anc)}0${i}`)
30
30
  }
31
31
 
32
32
  const steps = Array.isArray(flow?.step)
33
33
  ? flow.step
34
34
  : Object.values(flow?.step || {})
35
- for (const step of steps) {
36
- if (step?.match) {
37
- for (const v of Object.values(step.match)) {
35
+ for (const step of steps.filter((s: any) => false !== s.a)) {
36
+ if (step?.m) {
37
+ for (const v of Object.values(step.m)) {
38
38
  if (typeof v === 'string' && v && !v.endsWith('$')) push(v)
39
39
  }
40
40
  }
41
- // step.data values can also be aliased via setup (e.g. update step.data
41
+ // step.d values can also be aliased via setup (e.g. update step.d
42
42
  // = {data_type_id: 'data_type01'} → setup adds idmap[data_type_id] =
43
43
  // idmap[data_type01]). The right-hand side `data_type01` must be in the
44
44
  // idmap or the alias resolves to undefined.
45
- if (step?.data) {
46
- for (const v of Object.values(step.data)) {
45
+ if (step?.d) {
46
+ for (const v of Object.values(step.d)) {
47
47
  if (typeof v === 'string' && v && !v.endsWith('$')) push(v)
48
48
  }
49
49
  }
@@ -53,6 +53,16 @@ function buildIdNames(entity: EntityLike, flow: FlowLike): string[] {
53
53
  }
54
54
 
55
55
 
56
+ function entityRelationName(ref: string): string {
57
+ return ref.startsWith('$.main.kit.entity.') ? ref.slice('$.main.kit.entity.'.length) : ref
58
+ }
59
+
60
+ function flowSteps(flow: FlowLike): any[] {
61
+ return Object.values(flow?.step || {}).filter((step: any) => false !== step.a)
62
+ }
63
+
56
64
  export {
57
65
  buildIdNames,
66
+ entityRelationName,
67
+ flowSteps,
58
68
  }
@@ -101,10 +101,10 @@ function entityDataSpec(ent: any): Record<string, any> {
101
101
 
102
102
  const fields = (ent && ent.fields) ? each(ent.fields) : []
103
103
  for (const f of fields) {
104
- if (null == f || null == f.name || false === f.active) {
104
+ if (null == f || null == f.n || false === f.a) {
105
105
  continue
106
106
  }
107
- spec[f.name] = canonToSpec(f.type, false === f.req)
107
+ spec[f.n] = canonToSpec(f.t, false === f.r)
108
108
  }
109
109
 
110
110
  return spec
@@ -1,7 +1,7 @@
1
1
 
2
2
  function getMatchEntries(step: any): [string, any][] {
3
- if (!step?.match) return []
4
- return Object.entries(step.match).filter(([k]: any) => !k.endsWith('$'))
3
+ if (!step?.m) return []
4
+ return Object.entries(step.m).filter(([k]: any) => !k.endsWith('$'))
5
5
  }
6
6
 
7
7
 
@@ -4,6 +4,8 @@
4
4
  import { each, names } from 'jostraca'
5
5
  import { KIT } from '@voxgig/apidef'
6
6
 
7
+ import { entityRelationName } from './buildIdNames'
8
+
7
9
  import { prefixLeadingDigit } from './naming'
8
10
 
9
11
 
@@ -172,7 +174,10 @@ function renameReferences(model: any, renames: Rename[]): void {
172
174
  }
173
175
  ent.relations.ancestors = ancestors.map((a: any) =>
174
176
  Array.isArray(a)
175
- ? a.map((n: any) => map.get(n) ?? n)
177
+ ? a.map((n: string) => {
178
+ const renamed = map.get(entityRelationName(n))
179
+ return renamed == null ? n : n.startsWith('$.') ? '$.main.kit.entity.' + renamed : renamed
180
+ })
176
181
  : (map.get(a) ?? a))
177
182
  })
178
183
  }
@@ -62,10 +62,10 @@ function opActions(op: any): { action: string, path: string }[] {
62
62
  const points: any[] = op && op.points ? each(op.points) : []
63
63
 
64
64
  return points
65
- .filter((pt: any) => null != (pt && pt.select && pt.select['$action']))
65
+ .filter((pt: any) => null != (pt && pt.q && pt.q['$action']))
66
66
  .map((pt: any) => ({
67
- action: String(pt.select['$action']),
68
- path: String(pt.orig || ''),
67
+ action: String(pt.q['$action']),
68
+ path: String(pt.o || ''),
69
69
  }))
70
70
  .sort((a, b) => a.action < b.action ? -1 : a.action > b.action ? 1 : 0)
71
71
  }
@@ -93,11 +93,11 @@ function entityPath(entity: any): string {
93
93
 
94
94
  const points: any[] = op.points ? each(op.points) : []
95
95
  const canonical = points.filter((pt: any) =>
96
- null == (pt && pt.select && pt.select['$action']))
96
+ null == (pt && pt.q && pt.q['$action']))
97
97
 
98
98
  const pick = (0 < canonical.length ? canonical : points)[0]
99
- if (null != pick && null != pick.orig && '' !== pick.orig) {
100
- return String(pick.orig)
99
+ if (null != pick && null != pick.o && '' !== pick.o) {
100
+ return String(pick.o)
101
101
  }
102
102
  }
103
103
 
@@ -109,7 +109,7 @@ function ownPoint(points: any[]): any {
109
109
  let best = points[0]
110
110
 
111
111
  for (const pt of points) {
112
- if (null == pt || null == pt.segments || null == best || null == best.segments) {
112
+ if (null == pt || null == pt.s || null == best || null == best.s) {
113
113
  continue
114
114
  }
115
115
 
@@ -140,7 +140,7 @@ function opParams(op: any): any[] {
140
140
  let points: any[] = op && op.points ? each(op.points) : []
141
141
 
142
142
  const canonical = points.filter((pt: any) =>
143
- null == (pt && pt.select && pt.select['$action']))
143
+ null == (pt && pt.q && pt.q['$action']))
144
144
  if (0 < canonical.length) {
145
145
  points = canonical
146
146
  }
@@ -152,17 +152,17 @@ function opParams(op: any): any[] {
152
152
  points.forEach((pt: any, pointIndex: number) => {
153
153
  // Path AND query: a path-param-only read misses e.g. GET /result?trace_id=,
154
154
  // which has no path param at all but still addresses one record.
155
- const pathParams = pt && pt.args && pt.args.params ? each(pt.args.params) : []
156
- const queryParams = pt && pt.args && pt.args.query ? each(pt.args.query) : []
155
+ const pathParams = pt && pt.g && pt.g.params ? each(pt.g.params) : []
156
+ const queryParams = pt && pt.g && pt.g.query ? each(pt.g.query) : []
157
157
  const params = [...pathParams, ...queryParams]
158
158
  const requiredHere: Record<string, boolean> = {}
159
159
  params.forEach((p: any) => {
160
- if (p && null != p.name) {
161
- requiredHere[p.name] = false !== p.reqd
162
- if (!seen[p.name]) {
163
- seen[p.name] = { ...p }
164
- requiredOnAll[p.name] = 0 === pointIndex
165
- out.push(seen[p.name])
160
+ if (p && null != p.n) {
161
+ requiredHere[p.n] = false !== p.r
162
+ if (!seen[p.n]) {
163
+ seen[p.n] = { ...p }
164
+ requiredOnAll[p.n] = 0 === pointIndex
165
+ out.push(seen[p.n])
166
166
  }
167
167
  }
168
168
  })
@@ -174,10 +174,10 @@ function opParams(op: any): any[] {
174
174
  })
175
175
 
176
176
  out.forEach((p: any) => {
177
- p.reqd = true === requiredOnAll[p.name]
177
+ p.r = true === requiredOnAll[p.n]
178
178
  })
179
179
 
180
- if (1 < points.length && !out.some((p: any) => p.reqd) && !samePath(points)) {
180
+ if (1 < points.length && !out.some((p: any) => p.r) && !samePath(points)) {
181
181
  return opParams({ points: [ownPoint(points)] })
182
182
  }
183
183
 
@@ -194,12 +194,12 @@ function fieldInOp(field: any, opname: string): boolean {
194
194
  function fieldOptional(field: any, opname: string): boolean {
195
195
  switch (opname) {
196
196
  case 'create':
197
- return false === field.req
197
+ return false === field.r
198
198
  case 'update':
199
199
  return true
200
200
  case 'load':
201
201
  case 'remove':
202
- return 'id' !== field.name
202
+ return 'id' !== field.n
203
203
  case 'list':
204
204
  default:
205
205
  return true
@@ -223,30 +223,30 @@ function opRequestShape(ent: any, opname: string):
223
223
  const params = opParams(op)
224
224
  if (0 < params.length && !isbodyop) {
225
225
  const items = params.map((p: any) => ({
226
- name: p.name,
227
- type: p.type,
228
- optional: false === p.reqd,
226
+ name: p.n,
227
+ type: p.t,
228
+ optional: false === p.r,
229
229
  }))
230
230
  return { items, fromParams: true }
231
231
  }
232
232
 
233
233
  const paramItems = isbodyop ? params.map((p: any) => ({
234
- name: p.name,
235
- type: p.type,
236
- optional: false === p.reqd,
234
+ name: p.n,
235
+ type: p.t,
236
+ optional: false === p.r,
237
237
  })) : []
238
238
  const paramNames = new Set(paramItems.map((p: any) => p.name))
239
239
 
240
240
  const fields = (ent.fields ? each(ent.fields) : [])
241
- .filter((f: any) => f.active !== false)
241
+ .filter((f: any) => f.a !== false)
242
242
  .filter((f: any) => fieldInOp(f, opname))
243
243
 
244
244
  const items = paramItems.concat(
245
245
  fields
246
- .filter((f: any) => !paramNames.has(f.name))
246
+ .filter((f: any) => !paramNames.has(f.n))
247
247
  .map((f: any) => ({
248
- name: f.name,
249
- type: f.type,
248
+ name: f.n,
249
+ type: f.t,
250
250
  optional: fieldOptional(f, opname),
251
251
  })))
252
252
 
@@ -453,7 +453,7 @@ function medianOf(xs: number[]): number {
453
453
  }
454
454
 
455
455
 
456
- // The id field on the entity's DATA type (its fields[]), or null. DISTINCT from
456
+ // The id field on the entity's DATA type (its fields{}), or null. DISTINCT from
457
457
  // entityIdField (the load-MATCH key): an API can model a load match that carries
458
458
  // an `id` param while the response entity itself has no `id` field, so `.id`
459
459
  // access on a RETURNED record must be guarded on this, not on the match key.
@@ -463,10 +463,10 @@ function entityDataIdField(ent: any): string | null {
463
463
  }
464
464
  const idName = (ent.id && ent.id.field) || 'id'
465
465
  const fields = ent.fields ? each(ent.fields) : []
466
- if (fields.some((f: any) => f && f.name === idName)) {
466
+ if (fields.some((f: any) => f && f.n === idName)) {
467
467
  return idName
468
468
  }
469
- if (fields.some((f: any) => f && f.name === 'id')) {
469
+ if (fields.some((f: any) => f && f.n === 'id')) {
470
470
  return 'id'
471
471
  }
472
472
  return null
@@ -12,18 +12,13 @@ type PathSegment = {
12
12
 
13
13
 
14
14
  function pointSegments(point: any): PathSegment[] {
15
- const segments = point && point.segments
15
+ const segments = point && point.s
16
16
 
17
- if (!Array.isArray(segments) && Array.isArray(point && point.parts)) {
17
+ if (!Array.isArray(segments) && (Array.isArray(point?.parts) || Array.isArray(point?.segments))) {
18
18
  throw new SdkGenError(
19
- 'model: the point for `' + ((point && point.orig) || '(unknown path)') +
20
- '` still describes its path as `parts` (' +
21
- JSON.stringify(point.parts) + ') and carries no `segments`. apidef ' +
22
- 'replaced the braced-string form with the typed segment vector in ' +
23
- '8.2.0 (its ADR-003), so this model was generated by an older apidef ' +
24
- 'and has not been regenerated. Generating from it would build every ' +
25
- 'URL as the API root. Run `npm run generate` in the project\'s `.sdk` ' +
26
- 'so apidef rewrites its entity models, then generate again.')
19
+ 'model: the point for `' + (point?.o || point?.orig || '(unknown path)') +
20
+ '` uses an obsolete path shape. Typed segments belong in `s`. ' +
21
+ 'Run `npm run generate` in the project\'s `.sdk` to regenerate the API model.')
27
22
  }
28
23
 
29
24
  return Array.isArray(segments) ? segments : []
@@ -13,13 +13,8 @@ function resolvedFor(ctx$: any): ResolvedSpec | undefined {
13
13
 
14
14
 
15
15
 
16
- // A point's live-scenario hint. apidef sets `point.live` from the guide; a
17
- // model built before it did carries the hint only inside the contract.
18
16
  function liveHint(point: any): any {
19
- if (null == point) return undefined
20
- if (undefined !== point.live) return point.live
21
- if (null == point.contract?.json) return undefined
22
- try { return JSON.parse(point.contract.json).live } catch { return undefined }
17
+ return point?.li
23
18
  }
24
19
 
25
20
 
@@ -30,18 +25,12 @@ function hasLiveScenarios(model: any): boolean {
30
25
  }
31
26
 
32
27
 
33
- // A point's resolved specification facts. Prefers the capability apidef
34
- // publishes; falls back to the contract for a model built before it, or a
35
- // generation not driven through a model build.
36
28
  function pointFacts(ctx$: any, point: any): any {
37
- const resolved = resolvedFor(ctx$)
38
- const facts = resolved?.operation(point?.method, point?.orig)
39
- if (null != facts) return facts
40
- if (null == point?.contract?.json) return {}
41
- try { return JSON.parse(point.contract.json) } catch { return {} }
29
+ return resolvedFor(ctx$)?.operation(point?.m, point?.o) || {}
42
30
  }
43
31
 
44
32
 
33
+
45
34
  export {
46
35
  resolvedFor,
47
36
  liveHint,
package/src/sdkgen.ts CHANGED
@@ -57,7 +57,7 @@ import { registerComponent } from './cmp/Registered'
57
57
  import { resolvedFor, liveHint, pointFacts, hasLiveScenarios } from './helpers/resolved'
58
58
  import type { RegisterOptions } from './cmp/Registered'
59
59
 
60
- import { buildIdNames } from './helpers/buildIdNames'
60
+ import { buildIdNames, entityRelationName, flowSteps } from './helpers/buildIdNames'
61
61
  import { getMatchEntries } from './helpers/getMatchEntries'
62
62
  import { collectDeps } from './helpers/collectDeps'
63
63
  import { guardModelNames } from './helpers/modelNames'
@@ -992,6 +992,8 @@ export {
992
992
  SdkGenError,
993
993
 
994
994
  buildIdNames,
995
+ entityRelationName,
996
+ flowSteps,
995
997
  getMatchEntries,
996
998
  collectDeps,
997
999
 
package/src/utility.ts CHANGED
@@ -263,13 +263,19 @@ function withPointParts(op: any): any {
263
263
  each(op, (o: any, opname: string) => {
264
264
  out[opname] = null == o || null == o.points ? o : {
265
265
  ...o,
266
- points: each(o.points).map((pt: any) => {
266
+ points: each(o.points).filter((pt: any) => false !== pt?.a).map((pt: any) => {
267
267
  if (null == pt) return pt
268
- // Contracts feed test generation directly from the model. Keeping
269
- // them in every runtime entity also retains entire request/response
270
- // schemas in clones and debug output, exhausting large SDKs' memory.
271
- const { contract, ...runtimePoint } = pt
272
- return { ...runtimePoint, parts: pointParts(pt) }
268
+ const args = Object.fromEntries(Object.entries(pt.g || {}).map(([kind, values]) =>
269
+ [kind, each(values as any).filter((arg: any) => false !== arg.a).map((arg: any) => ({
270
+ name: arg.n, orig: arg.or, type: arg.t, kind: arg.k,
271
+ reqd: arg.r, example: arg.ex,
272
+ }))]))
273
+ // Runtime hooks expose descriptive names independently of the model schema.
274
+ return {
275
+ active: pt.a, kind: pt.k, method: pt.m, orig: pt.o,
276
+ segments: pt.s, parts: pointParts(pt), rename: pt.r,
277
+ transform: pt.t, args, select: pt.q, live: pt.li, graphql: pt.gq,
278
+ }
273
279
  }),
274
280
  }
275
281
  })
@@ -298,7 +304,10 @@ function configDefinition(model: any, targetname?: string): { def: any, json: st
298
304
  const entityStubs: any = {}
299
305
  each(entity, (e: any) => {
300
306
  entityDefs[e.name] = clean({
301
- fields: e.fields,
307
+ fields: each(e.fields || {}).filter((f: any) => false !== f.a).map((f: any) => ({
308
+ name: f.n, title: f.h, type: f.t, req: f.r, op: f.op,
309
+ short: f.sh, readOnly: f.ro, writeOnly: f.wo, deprecated: f.de, format: f.fo,
310
+ })),
302
311
  id: e.id,
303
312
  name: e.name,
304
313
  op: withPointParts(e.op),