@voxgig/sdkgen 4.6.0 → 4.8.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 (144) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/cmp/Feature.js +5 -0
  3. package/dist/cmp/Feature.js.map +1 -1
  4. package/dist/cmp/TestControl.d.ts +4 -0
  5. package/dist/cmp/TestControl.js +51 -0
  6. package/dist/cmp/TestControl.js.map +1 -0
  7. package/dist/helpers/featureSource.d.ts +3 -1
  8. package/dist/helpers/featureSource.js +105 -0
  9. package/dist/helpers/featureSource.js.map +1 -1
  10. package/dist/helpers/opShape.js +8 -11
  11. package/dist/helpers/opShape.js.map +1 -1
  12. package/dist/helpers/pointPath.d.ts +10 -0
  13. package/dist/helpers/pointPath.js +54 -0
  14. package/dist/helpers/pointPath.js.map +1 -0
  15. package/dist/sdkgen.d.ts +6 -3
  16. package/dist/sdkgen.js +14 -4
  17. package/dist/sdkgen.js.map +1 -1
  18. package/dist/tsconfig.tsbuildinfo +1 -1
  19. package/dist/utility.d.ts +2 -1
  20. package/dist/utility.js +78 -1
  21. package/dist/utility.js.map +1 -1
  22. package/model/sdkgen.aon +58 -0
  23. package/package.json +2 -2
  24. package/project/.sdk/model/feature/secrets.aon +82 -0
  25. package/project/.sdk/src/cmp/c/Config_c.ts +7 -8
  26. package/project/.sdk/src/cmp/c/TestDirect_c.ts +4 -3
  27. package/project/.sdk/src/cmp/cpp/Main_cpp.ts +2 -1
  28. package/project/.sdk/src/cmp/cpp/TestDirect_cpp.ts +4 -3
  29. package/project/.sdk/src/cmp/cpp/Test_cpp.ts +5 -1
  30. package/project/.sdk/src/cmp/csharp/Main_csharp.ts +2 -1
  31. package/project/.sdk/src/cmp/csharp/TestDirect_csharp.ts +34 -9
  32. package/project/.sdk/src/cmp/csharp/TestEntity_csharp.ts +29 -5
  33. package/project/.sdk/src/cmp/csharp/Test_csharp.ts +5 -1
  34. package/project/.sdk/src/cmp/dart/Config_dart.ts +7 -8
  35. package/project/.sdk/src/cmp/dart/Main_dart.ts +2 -1
  36. package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +28 -10
  37. package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +28 -7
  38. package/project/.sdk/src/cmp/dart/Test_dart.ts +5 -1
  39. package/project/.sdk/src/cmp/elixir/Config_elixir.ts +9 -8
  40. package/project/.sdk/src/cmp/go/Config_go.ts +1 -7
  41. package/project/.sdk/src/cmp/go/Main_go.ts +2 -1
  42. package/project/.sdk/src/cmp/go/TestDirect_go.ts +5 -4
  43. package/project/.sdk/src/cmp/go/Test_go.ts +5 -1
  44. package/project/.sdk/src/cmp/java/Config_java.ts +7 -7
  45. package/project/.sdk/src/cmp/java/Main_java.ts +2 -1
  46. package/project/.sdk/src/cmp/java/TestDirect_java.ts +5 -4
  47. package/project/.sdk/src/cmp/java/Test_java.ts +5 -1
  48. package/project/.sdk/src/cmp/js/Config_js.ts +7 -8
  49. package/project/.sdk/src/cmp/js/Main_js.ts +2 -1
  50. package/project/.sdk/src/cmp/js/TestDirect_js.ts +34 -8
  51. package/project/.sdk/src/cmp/js/TestEntity_js.ts +35 -5
  52. package/project/.sdk/src/cmp/js/Test_js.ts +5 -1
  53. package/project/.sdk/src/cmp/js/fragment/Direct.test.fragment.js +7 -1
  54. package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +7 -1
  55. package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +7 -7
  56. package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +2 -1
  57. package/project/.sdk/src/cmp/kotlin/TestDirect_kotlin.ts +5 -4
  58. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +5 -1
  59. package/project/.sdk/src/cmp/lean/Config_lean.ts +9 -8
  60. package/project/.sdk/src/cmp/lua/Config_lua.ts +1 -7
  61. package/project/.sdk/src/cmp/lua/Main_lua.ts +2 -1
  62. package/project/.sdk/src/cmp/lua/TestDirect_lua.ts +32 -7
  63. package/project/.sdk/src/cmp/lua/TestEntity_lua.ts +24 -4
  64. package/project/.sdk/src/cmp/lua/Test_lua.ts +5 -1
  65. package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
  66. package/project/.sdk/src/cmp/perl/Main_perl.ts +2 -1
  67. package/project/.sdk/src/cmp/perl/TestDirect_perl.ts +29 -7
  68. package/project/.sdk/src/cmp/perl/TestEntity_perl.ts +24 -4
  69. package/project/.sdk/src/cmp/perl/Test_perl.ts +5 -1
  70. package/project/.sdk/src/cmp/perl/utility_perl.ts +10 -0
  71. package/project/.sdk/src/cmp/php/Config_php.ts +1 -7
  72. package/project/.sdk/src/cmp/php/Main_php.ts +2 -1
  73. package/project/.sdk/src/cmp/php/TestDirect_php.ts +28 -8
  74. package/project/.sdk/src/cmp/php/TestEntity_php.ts +28 -4
  75. package/project/.sdk/src/cmp/php/Test_php.ts +5 -1
  76. package/project/.sdk/src/cmp/py/Config_py.ts +1 -7
  77. package/project/.sdk/src/cmp/py/Main_py.ts +2 -1
  78. package/project/.sdk/src/cmp/py/TestDirect_py.ts +5 -4
  79. package/project/.sdk/src/cmp/py/Test_py.ts +5 -1
  80. package/project/.sdk/src/cmp/rb/Config_rb.ts +1 -7
  81. package/project/.sdk/src/cmp/rb/Main_rb.ts +2 -1
  82. package/project/.sdk/src/cmp/rb/TestDirect_rb.ts +28 -8
  83. package/project/.sdk/src/cmp/rb/TestEntity_rb.ts +24 -4
  84. package/project/.sdk/src/cmp/rb/Test_rb.ts +5 -1
  85. package/project/.sdk/src/cmp/rb/utility_rb.ts +3 -1
  86. package/project/.sdk/src/cmp/rust/Main_rust.ts +2 -1
  87. package/project/.sdk/src/cmp/rust/TestDirect_rust.ts +35 -7
  88. package/project/.sdk/src/cmp/rust/TestEntity_rust.ts +37 -4
  89. package/project/.sdk/src/cmp/rust/Test_rust.ts +5 -1
  90. package/project/.sdk/src/cmp/scala/Config_scala.ts +9 -7
  91. package/project/.sdk/src/cmp/scala/Main_scala.ts +2 -1
  92. package/project/.sdk/src/cmp/scala/TestDirect_scala.ts +4 -3
  93. package/project/.sdk/src/cmp/scala/Test_scala.ts +5 -1
  94. package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +3 -1
  95. package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +9 -5
  96. package/project/.sdk/src/cmp/ts/Config_ts.ts +57 -16
  97. package/project/.sdk/src/cmp/ts/Main_ts.ts +10 -2
  98. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +15 -7
  99. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +11 -3
  100. package/project/.sdk/src/cmp/ts/Test_ts.ts +5 -1
  101. package/project/.sdk/tm/csharp/test/Runner.cs +45 -0
  102. package/project/.sdk/tm/dart/test/utility.dart +39 -0
  103. package/project/.sdk/tm/js/test/sdk-test-control.json +19 -0
  104. package/project/.sdk/tm/js/test/utility.js +91 -1
  105. package/project/.sdk/tm/lua/test/runner.lua +40 -0
  106. package/project/.sdk/tm/ocaml/test/harness.ml +14 -4
  107. package/project/.sdk/tm/perl/t/runner.pm +30 -0
  108. package/project/.sdk/tm/php/test/Runner.php +36 -0
  109. package/project/.sdk/tm/rb/test/runner.rb +25 -0
  110. package/project/.sdk/tm/rust/tests/common/mod.rs +32 -0
  111. package/project/.sdk/tm/rust/utility/make_options.rs +1 -1
  112. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +8 -2
  113. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sigv4.ts +29 -5
  114. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +30 -21
  115. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +90 -0
  116. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +48 -0
  117. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/aws.ts +219 -0
  118. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/azuresecrets.ts +144 -0
  119. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/boru.ts +113 -0
  120. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/doppler.ts +77 -0
  121. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +51 -0
  122. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +31 -0
  123. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +54 -0
  124. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/gcpsecrets.ts +118 -0
  125. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/hashicorp.ts +159 -0
  126. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +66 -0
  127. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/infisical.ts +107 -0
  128. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +33 -0
  129. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/onepassword.ts +120 -0
  130. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +176 -0
  131. package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +15 -13
  132. package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +25 -19
  133. package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +1 -1
  134. package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
  135. package/project/.sdk/tm/zig/core/utility.zig +1 -1
  136. package/project/sdkgen-package.json +1 -1
  137. package/src/cmp/Feature.ts +5 -0
  138. package/src/cmp/TestControl.ts +64 -0
  139. package/src/helpers/featureSource.ts +130 -0
  140. package/src/helpers/opShape.ts +9 -14
  141. package/src/helpers/pointPath.ts +88 -0
  142. package/src/sdkgen.ts +18 -0
  143. package/src/utility.ts +92 -1
  144. package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Providers.ts +0 -1221
package/dist/utility.js CHANGED
@@ -8,6 +8,7 @@ exports.resolvePath = resolvePath;
8
8
  exports.requirePath = requirePath;
9
9
  exports.isAuthActive = isAuthActive;
10
10
  exports.resolveAuthPrefix = resolveAuthPrefix;
11
+ exports.resolveAuthExchange = resolveAuthExchange;
11
12
  exports.isHttpBasicAuth = isHttpBasicAuth;
12
13
  exports.isConfigData = isConfigData;
13
14
  exports.configRepr = configRepr;
@@ -20,6 +21,7 @@ const jostraca_1 = require("jostraca");
20
21
  const apidef_1 = require("@voxgig/apidef");
21
22
  const applicability_1 = require("./helpers/applicability");
22
23
  const serverVars_1 = require("./helpers/serverVars");
24
+ const pointPath_1 = require("./helpers/pointPath");
23
25
  const packageMeta_1 = require("./helpers/packageMeta");
24
26
  // Where a per-target component is loaded from: `<project>/.sdk/dist/<path>`.
25
27
  //
@@ -78,6 +80,29 @@ function isHttpBasicAuth(model) {
78
80
  return null != security && 'http' === security.type &&
79
81
  'basic' === String(security.prefix || '').toLowerCase();
80
82
  }
83
+ // The API's ACCESS-TOKEN EXCHANGE, as apidef recorded it from the spec
84
+ // (main.kit.info.security.exchange): where the token endpoint lives, and the
85
+ // field names it sends and answers with. Null when the spec describes none,
86
+ // which is the common case.
87
+ //
88
+ // These are FACTS ABOUT THE API, so they belong in the generated config
89
+ // rather than in a project's hand-written model: an SDK whose spec says the
90
+ // exchange is at `auth/token` should not need to be told so again. A feature
91
+ // opts in to receiving them with `spec: { authexchange: '<options-key>' }`;
92
+ // configDefinition does the overlay.
93
+ //
94
+ // Deliberately NOT included: `active`. Whether a client performs the
95
+ // exchange is the project's decision (some resolve a static credential
96
+ // through the same feature on an API that also has a token endpoint), so
97
+ // apidef records only what the exchange IS, never that it should run.
98
+ function resolveAuthExchange(model) {
99
+ const security = (0, apidef_1.getModelPath)(model, `main.${apidef_1.KIT}.info.security`, { only_active: false, required: false });
100
+ const exchange = security?.exchange;
101
+ if (null == exchange || 'object' !== typeof exchange) {
102
+ return null;
103
+ }
104
+ return exchange;
105
+ }
81
106
  function requirePath(ctx$, path, flags) {
82
107
  const fullpath = resolvePath(ctx$, path);
83
108
  const ignore = null == flags?.ignore ? false : flags.ignore;
@@ -263,6 +288,13 @@ function clean(o, dropDefaults) {
263
288
  function rawStringLiteral(s) {
264
289
  return "'" + s.replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'";
265
290
  }
291
+ // The closed vocabulary of spec-derived facts a feature may ask for by
292
+ // declaring `spec: { <fact>: <options-key> }`. Closed, and resolved through
293
+ // one function each, so a feature cannot reach arbitrarily into the model
294
+ // and a fact's shape is defined in exactly one place.
295
+ const SPEC_FACTS = {
296
+ authexchange: resolveAuthExchange,
297
+ };
266
298
  // THE CANONICAL CONFIG OBJECT, and the JSON the threshold is measured on.
267
299
  //
268
300
  // Every target builds its config from this one function, so the literal a
@@ -274,6 +306,30 @@ function rawStringLiteral(s) {
274
306
  //
275
307
  // Key order is `each`'s order, which is sorted, so the JSON is byte-stable
276
308
  // across runs exactly like the literal it replaces.
309
+ // The embedded config still speaks the braced-string path form
310
+ // (`['element', '{id}']`) that every generated runtime reads. apidef now
311
+ // emits the resolved vector instead (its ADR-003), so the old shape is
312
+ // reconstructed HERE — the single point at which a point reaches generated
313
+ // output — via the single reconstruction in helpers/pointPath.
314
+ //
315
+ // Both are written: `parts` for the runtimes as they stand, `segments`
316
+ // alongside it so a runtime can be moved over one language at a time. That
317
+ // duplication is deliberate and temporary, and it lives in GENERATED output,
318
+ // not in the model — which is what ADR-003 forbids. It ends when the last
319
+ // runtime reads segments and `parts` is dropped from this function.
320
+ function withPointParts(op) {
321
+ if (null == op) {
322
+ return op;
323
+ }
324
+ const out = {};
325
+ (0, jostraca_1.each)(op, (o, opname) => {
326
+ out[opname] = null == o || null == o.points ? o : {
327
+ ...o,
328
+ points: (0, jostraca_1.each)(o.points).map((pt) => null == pt ? pt : { ...pt, parts: (0, pointPath_1.pointParts)(pt) }),
329
+ };
330
+ });
331
+ return out;
332
+ }
277
333
  function configDefinition(model, targetname) {
278
334
  const entity = (0, apidef_1.getModelPath)(model, `main.${apidef_1.KIT}.entity`);
279
335
  // Gated by the target when one is named, so the embedded config cannot
@@ -298,7 +354,7 @@ function configDefinition(model, targetname) {
298
354
  entityDefs[e.name] = clean({
299
355
  fields: e.fields,
300
356
  name: e.name,
301
- op: e.op,
357
+ op: withPointParts(e.op),
302
358
  relations: e.relations,
303
359
  }, true);
304
360
  entityStubs[e.name] = {};
@@ -319,6 +375,27 @@ function configDefinition(model, targetname) {
319
375
  if (null != f.transport && '' !== f.transport) {
320
376
  fdef.transport = String(f.transport);
321
377
  }
378
+ // SPEC-DERIVED OPTIONS. A feature declares `spec: { <fact>: <options
379
+ // key> }` to receive facts apidef recorded from the OpenAPI spec — the
380
+ // same declare-never-infer rule `needs` and `transport` follow, and for
381
+ // the same reason: the alternative is this function knowing feature
382
+ // names, which is exactly the coupling the generic feature loop exists
383
+ // to avoid.
384
+ //
385
+ // The fact overlays the feature's DECLARED DEFAULTS, and rightly: a
386
+ // default like `path: 'auth/token'` is a generic guess, while the spec
387
+ // states where this API's endpoint actually is. A project that needs
388
+ // something else still overrides at runtime through `options.feature`,
389
+ // which beats the embedded config either way.
390
+ for (const factname of Object.keys(f.spec || {}).sort()) {
391
+ const optkey = f.spec[factname];
392
+ const fact = SPEC_FACTS[factname]?.(model);
393
+ if (null == fact || null == optkey || '' === optkey) {
394
+ continue;
395
+ }
396
+ fdef.options = { ...(fdef.options || {}) };
397
+ fdef.options[optkey] = { ...(fdef.options[optkey] || {}), ...fact };
398
+ }
322
399
  featureDefs[f.name] = fdef;
323
400
  });
324
401
  const options = { base: baseUrl };
@@ -1 +1 @@
1
- {"version":3,"file":"utility.js","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utility.js","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":"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"}
package/model/sdkgen.aon CHANGED
@@ -469,6 +469,64 @@ main: kit: feature: &: {
469
469
  # feature that both wraps AND dispatches hooks (station does).
470
470
  transport: *'none' | 'base' | 'wrap'
471
471
 
472
+ # SPEC-DERIVED OPTIONS. Facts apidef records from the OpenAPI spec, mapped
473
+ # onto the key in this feature's `config.options` that should carry them:
474
+ #
475
+ # spec: { authexchange: 'exchange' }
476
+ #
477
+ # configDefinition performs the overlay at generation time, so the fact
478
+ # reaches the SDK's embedded config without a project restating what its
479
+ # own spec already says. The fact name comes from a CLOSED vocabulary
480
+ # (`SPEC_FACTS` in ts/src/utility.ts); an unknown name is ignored rather
481
+ # than failing, so a project on an older sdkgen is unaffected.
482
+ #
483
+ # A map keyed by fact name, for the same reason `needs` is a map: aontu
484
+ # unifies maps by key, so a package can add one entry without restating
485
+ # the others.
486
+ spec: &: string
487
+
488
+ # PLUGINS — a feature's optional, separately-trimmed parts.
489
+ #
490
+ # A feature whose implementation is a thin layer over a library with
491
+ # OPTIONAL pieces (secrets over sekreto, whose thirteen provider kinds
492
+ # each carry their own platform cost) declares them here. Each plugin
493
+ # owns a template subfolder under the feature's own tree, and the
494
+ # feature trim removes an inactive one exactly as it removes an
495
+ # inactive feature — the same walk, one level deeper.
496
+ #
497
+ # This is what makes a generated SDK lean: a project whose chain is
498
+ # `[dotenv, env]` should not carry AWS request signing and seven HTTP
499
+ # vault clients, and before this it carried all of them because they
500
+ # were reachable from one import.
501
+ #
502
+ # `needs` is the same closed applicability vocabulary a feature uses,
503
+ # so a plugin requiring something of its target is gated the same way.
504
+ plugin: &: {
505
+ name: key()
506
+ active: *false | boolean
507
+ title: *'' | string
508
+
509
+ # What this plugin needs of the RUNTIME - 'fs', 'fetch', 'crypto'.
510
+ # Declared so a target that cannot provide it is refused at
511
+ # generation rather than at the consumer's first lookup.
512
+ needs: &: boolean
513
+
514
+ # The template paths this plugin OWNS, relative to the target
515
+ # template root, dropped when it is inactive.
516
+ #
517
+ # Declared rather than derived from a `plugin/<name>/` directory
518
+ # convention, because the files a plugin owns are frequently NOT
519
+ # free to move. sekreto's provider modules are VENDORED: the
520
+ # vendoring guard holds each file against its upstream path, and
521
+ # their relative imports (`./support`, `../Sigv4`) only resolve at
522
+ # upstream's own directory depth. Relocating them under a
523
+ # convention would break both at once.
524
+ #
525
+ # Empty means the convention — `src/feature/<feature>/plugin/<name>/`
526
+ # — which is right for a plugin whose files sdkgen owns outright.
527
+ path: *[] | [&: string]
528
+ }
529
+
472
530
  hook: &: {
473
531
  active: *false | boolean
474
532
  await: *false | boolean
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxgig/sdkgen",
3
- "version": "4.6.0",
3
+ "version": "4.8.0",
4
4
  "main": "dist/sdkgen.js",
5
5
  "type": "commonjs",
6
6
  "engines": {
@@ -88,7 +88,7 @@
88
88
  "peerDependencies": {
89
89
  "@tabnas/jsonic": "0.6.0",
90
90
  "@tabnas/parser": "0.8.0",
91
- "@voxgig/apidef": ">=8.0",
91
+ "@voxgig/apidef": ">=8.2",
92
92
  "@voxgig/struct": ">=0.2",
93
93
  "@voxgig/util": ">=0.5",
94
94
  "aontu": ">=0.52",
@@ -23,6 +23,88 @@ main: kit: feature: secrets: {
23
23
  # carry an import for a class it has no source for.
24
24
  needs: { sekreto: true }
25
25
 
26
+ # SPEC-DERIVED OPTIONS. apidef recognises an API's access-token exchange
27
+ # in the spec and records it as model facts (info.security.exchange): the
28
+ # endpoint's path and method, and the field names it sends and answers
29
+ # with. This maps those facts onto `options.exchange` below, so a project
30
+ # whose spec describes an exchange does not hand-copy its own API's token
31
+ # endpoint into its model.
32
+ #
33
+ # What arrives is WHAT THE EXCHANGE IS, never that it should run:
34
+ # `exchange.active` stays the project's call, because resolving a static
35
+ # credential through this feature on an API that also has a token endpoint
36
+ # is a legitimate configuration. Turning it on remains a deliberate act.
37
+ spec: { authexchange: 'exchange' }
38
+
39
+ # PLUGINS — the provider kinds, each carrying its own platform cost.
40
+ #
41
+ # This is what keeps a generated SDK lean. sekreto's core resolves a
42
+ # chain and ships `env` and `memory`, which import nothing; every other
43
+ # kind lives in its own module and REGISTERS ITSELF at import, so a kind
44
+ # nobody imports is not in the build. These entries decide which of
45
+ # those modules are generated at all.
46
+ #
47
+ # An SDK whose chain is `[dotenv, env]` — the common case, and
48
+ # elementdemo's — needs `dotenv` alone. Before this it carried AWS
49
+ # request signing and seven HTTP vault clients as well, because one
50
+ # import reached every kind.
51
+ #
52
+ # `path` is DECLARED rather than conventional: these files are vendored
53
+ # from sekreto, and both the vendoring guard and their own relative
54
+ # imports pin them at upstream's directory depth.
55
+ #
56
+ # All inactive by default, like the feature itself. A project turns on
57
+ # what its chain actually names.
58
+ plugin: {
59
+ dotenv: {
60
+ title: 'Read secrets from a .env file or a directory of files'
61
+ needs: { fs: true }
62
+ path: [
63
+ 'src/feature/secrets/sekreto/provider/dotenv.ts'
64
+ 'src/feature/secrets/sekreto/provider/file.ts'
65
+ ]
66
+ }
67
+
68
+ vault: {
69
+ title: 'HashiCorp Vault and boru'
70
+ needs: { fs: true, fetch: true }
71
+ path: [
72
+ 'src/feature/secrets/sekreto/provider/hashicorp.ts'
73
+ 'src/feature/secrets/sekreto/provider/boru.ts'
74
+ ]
75
+ }
76
+
77
+ cloud: {
78
+ title: 'GCP Secret Manager and Azure Key Vault'
79
+ needs: { fetch: true }
80
+ path: [
81
+ 'src/feature/secrets/sekreto/provider/gcpsecrets.ts'
82
+ 'src/feature/secrets/sekreto/provider/azuresecrets.ts'
83
+ ]
84
+ }
85
+
86
+ saas: {
87
+ title: '1Password, Doppler and Infisical'
88
+ needs: { fetch: true }
89
+ path: [
90
+ 'src/feature/secrets/sekreto/provider/onepassword.ts'
91
+ 'src/feature/secrets/sekreto/provider/doppler.ts'
92
+ 'src/feature/secrets/sekreto/provider/infisical.ts'
93
+ ]
94
+ }
95
+
96
+ # The only plugin that costs node:crypto: AWS request signing.
97
+ # `Sigv4.ts` goes with it, and goes only with it.
98
+ aws: {
99
+ title: 'AWS Secrets Manager and Parameter Store (SigV4 signing)'
100
+ needs: { fetch: true, crypto: true }
101
+ path: [
102
+ 'src/feature/secrets/sekreto/provider/aws.ts'
103
+ 'src/feature/secrets/sekreto/Sigv4.ts'
104
+ ]
105
+ }
106
+ }
107
+
26
108
  # Transport role (station design §8.4).
27
109
  #
28
110
  # 'wrap', because the access-token exchange below has to SEE the response:
@@ -22,7 +22,6 @@ import {
22
22
 
23
23
  import {
24
24
  cStringLiteral,
25
- clean,
26
25
  formatCValue,
27
26
  } from './utility_c'
28
27
 
@@ -81,13 +80,13 @@ const Config = cmp(async function Config(props: any) {
81
80
  options.auth = { prefix: authPrefix }
82
81
  }
83
82
 
84
- const entityConfig = Object.values(entity || {}).reduce((a: any, n: any) => (
85
- a[n.name] = clean({
86
- fields: n.fields,
87
- name: n.name,
88
- op: n.op,
89
- relations: n.relations,
90
- }, true), a), {})
83
+ // configDefinition's `def.entity` verbatim, NOT rebuilt here. This reduce
84
+ // was one of fourteen copies of that function's entityDefs loop, and when
85
+ // configDefinition started reconstructing a point's `parts` from apidef's
86
+ // segment vector (its ADR-003), only the copies that read `configDef` got
87
+ // it — this target's literal config emitted paths with no parts at all
88
+ // while its data config had them. One rule, one place.
89
+ const entityConfig = configDef.entity
91
90
 
92
91
  const config = {
93
92
  // main from configDefinition's def, not re-derived here, so the literal
@@ -11,6 +11,7 @@ import {
11
11
  File,
12
12
  cmp,
13
13
  snakify,
14
+ pointParts,
14
15
  } from '@voxgig/sdkgen'
15
16
 
16
17
 
@@ -75,10 +76,10 @@ const TestDirect = cmp(function TestDirect(props: any) {
75
76
  const listOp = (entity.op as any)?.list
76
77
 
77
78
  const loadPoint = loadOp?.points?.[0]
78
- const loadPath = loadPoint ? normalizePathParams(loadPoint.parts || [], loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
79
+ const loadPath = loadPoint ? normalizePathParams(pointParts(loadPoint), loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
79
80
  const allLoadParams = loadPoint?.args?.params || []
80
81
  const _pathPlaceholders = new Set<string>()
81
- for (const part of (loadPoint?.parts || [])) {
82
+ for (const part of pointParts(loadPoint)) {
82
83
  if (typeof part === 'string' && part.startsWith('{') && part.endsWith('}')) {
83
84
  _pathPlaceholders.add(part.slice(1, -1))
84
85
  }
@@ -95,7 +96,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
95
96
  _renamedPlaceholders.has(p.name) || _renamedPlaceholders.has(p.orig))
96
97
 
97
98
  const listPoint = listOp?.points?.[0]
98
- const listPath = listPoint ? normalizePathParams(listPoint.parts || [], listPoint?.args?.params || [], listPoint?.rename?.param) : ''
99
+ const listPath = listPoint ? normalizePathParams(pointParts(listPoint), listPoint?.args?.params || [], listPoint?.rename?.param) : ''
99
100
  const listParams = listPoint?.args?.params || []
100
101
 
101
102
  File({ name: entity.name + '_direct_test.c' }, () => {
@@ -4,6 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each,
6
6
  File, Content, Copy, Folder, Fragment,
7
+ TEST_CONTROL_EXCLUDE
7
8
  } from '@voxgig/sdkgen'
8
9
 
9
10
 
@@ -41,7 +42,7 @@ const Main = cmp(async function Main(props: any) {
41
42
  // only stages the per-feature custom-source dirs (target add), so exclude it.
42
43
  Copy({
43
44
  from: 'tm/' + target.name,
44
- exclude: [/src\//],
45
+ exclude: [/src\//, TEST_CONTROL_EXCLUDE],
45
46
  replace: {
46
47
  ...props.ctx$.stdrep,
47
48
  }
@@ -11,6 +11,7 @@ import {
11
11
  File,
12
12
  cmp,
13
13
  snakify,
14
+ pointParts,
14
15
  } from '@voxgig/sdkgen'
15
16
 
16
17
 
@@ -71,10 +72,10 @@ const TestDirect = cmp(function TestDirect(props: any) {
71
72
  const listOp = (entity.op as any)?.list
72
73
 
73
74
  const loadPoint = loadOp?.points?.[0]
74
- const loadPath = loadPoint ? normalizePathParams(loadPoint.parts || [], loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
75
+ const loadPath = loadPoint ? normalizePathParams(pointParts(loadPoint), loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
75
76
  const allLoadParams = loadPoint?.args?.params || []
76
77
  const _pathPlaceholders = new Set<string>()
77
- for (const part of (loadPoint?.parts || [])) {
78
+ for (const part of pointParts(loadPoint)) {
78
79
  if (typeof part === 'string' && part.startsWith('{') && part.endsWith('}')) {
79
80
  _pathPlaceholders.add(part.slice(1, -1))
80
81
  }
@@ -91,7 +92,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
91
92
  _renamedPlaceholders.has(p.name) || _renamedPlaceholders.has(p.orig))
92
93
 
93
94
  const listPoint = listOp?.points?.[0]
94
- const listPath = listPoint ? normalizePathParams(listPoint.parts || [], listPoint?.args?.params || [], listPoint?.rename?.param) : ''
95
+ const listPath = listPoint ? normalizePathParams(pointParts(listPoint), listPoint?.args?.params || [], listPoint?.rename?.param) : ''
95
96
  const listParams = listPoint?.args?.params || []
96
97
 
97
98
  const evar = cppVarName(entity.name)
@@ -3,7 +3,8 @@ import type {
3
3
  ModelEntity
4
4
  } from '@voxgig/apidef'
5
5
 
6
- import { cmp, each, Folder, entityCollection } from '@voxgig/sdkgen'
6
+ import { cmp, each, Folder, entityCollection,
7
+ TestControl } from '@voxgig/sdkgen'
7
8
 
8
9
 
9
10
  import { TestEntity } from './TestEntity_cpp'
@@ -19,6 +20,9 @@ const Test = cmp(function Test(props: any) {
19
20
  // netsim / struct corpus) ships as tm/cpp/test templates (copied verbatim).
20
21
  // Here we generate the per-entity model-driven tests into test/.
21
22
  Folder({ name: 'test' }, () => {
23
+
24
+ // Write-once: a project's edited control file survives regeneration.
25
+ TestControl({ target, dir: 'test' })
22
26
  const entity = each(entityCollection(model))
23
27
  .filter((e: any) => false !== e.active)
24
28
  each(entity, (entity: ModelEntity) => {
@@ -4,6 +4,7 @@ import * as Path from 'node:path'
4
4
  import {
5
5
  cmp, each,
6
6
  File, Content, Copy, Folder, Fragment,
7
+ TEST_CONTROL_EXCLUDE
7
8
  } from '@voxgig/sdkgen'
8
9
 
9
10
 
@@ -42,7 +43,7 @@ const Main = cmp(async function Main(props: any) {
42
43
  // per-feature extension folders (not shipped into the SDK output).
43
44
  Copy({
44
45
  from: 'tm/' + target.name,
45
- exclude: [/src\//],
46
+ exclude: [/src\//, TEST_CONTROL_EXCLUDE],
46
47
  replace: {
47
48
  ...props.ctx$.stdrep,
48
49
  }
@@ -11,7 +11,10 @@ import {
11
11
  File,
12
12
  cmp,
13
13
  snakify,
14
- isAuthActive, envName, envToken
14
+ isAuthActive, envName, envToken,
15
+ serverVarEnv,
16
+ serverVariables,
17
+ pointParts,
15
18
  } from '@voxgig/sdkgen'
16
19
 
17
20
  import { formatCsValue } from './utility_csharp'
@@ -67,12 +70,26 @@ const TestDirect = cmp(function TestDirect(props: any) {
67
70
 
68
71
  const authActive = isAuthActive(model)
69
72
  const apikeyEnvEntry = authActive
70
- ? `\n ["${PROJECTNAME}_APIKEY"] = "NONE",`
73
+ ? `\n ["${PROJECTNAME}_APIKEY"] = "",`
71
74
  : ''
72
75
  const apikeyLiveField = authActive
73
76
  ? `\n ["apikey"] = env["${PROJECTNAME}_APIKEY"],`
74
77
  : ''
75
78
 
79
+ // A templated server URL (OpenAPI server variables) makes a LIVE client
80
+ // impossible to construct without values: makeOptions raises rather than
81
+ // request a URL with a literal `{account_id}` in it. So the live suite
82
+ // takes them from the environment the same way it takes the apikey.
83
+ const svars = serverVariables(model)
84
+ const serverEnvEntry = svars
85
+ .map((v: any) => `\n ["${serverVarEnv(PROJECTNAME, v.name)}"] = ${JSON.stringify(v.dflt)},`).join('')
86
+ const serverLiveField = 0 === svars.length ? '' : `
87
+ ["server"] = new Dictionary<string, object?>
88
+ {${svars
89
+ .map((v: any) => `
90
+ ["${v.name}"] = env["${serverVarEnv(PROJECTNAME, v.name)}"],`).join('')}
91
+ },`
92
+
76
93
  const opnames = Object.keys(entity.op || {})
77
94
  const hasLoad = opnames.includes('load')
78
95
  const hasList = opnames.includes('list')
@@ -86,12 +103,12 @@ const TestDirect = cmp(function TestDirect(props: any) {
86
103
 
87
104
  // Get load point info
88
105
  const loadPoint = loadOp?.points?.[0]
89
- const loadPath = loadPoint ? normalizePathParams(loadPoint.parts || [], loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
106
+ const loadPath = loadPoint ? normalizePathParams(pointParts(loadPoint), loadPoint?.args?.params || [], loadPoint?.rename?.param) : ''
90
107
  const allLoadParams = loadPoint?.args?.params || []
91
108
  // Only path params that actually appear in the URL template drive direct
92
109
  // path-param setup and URL-substitution asserts.
93
110
  const _pathPlaceholders = new Set<string>()
94
- for (const part of (loadPoint?.parts || [])) {
111
+ for (const part of pointParts(loadPoint)) {
95
112
  if (typeof part === 'string' && part.startsWith('{') && part.endsWith('}')) {
96
113
  _pathPlaceholders.add(part.slice(1, -1))
97
114
  }
@@ -109,7 +126,7 @@ const TestDirect = cmp(function TestDirect(props: any) {
109
126
 
110
127
  // Get list point info
111
128
  const listPoint = listOp?.points?.[0]
112
- const listPath = listPoint ? normalizePathParams(listPoint.parts || [], listPoint?.args?.params || [], listPoint?.rename?.param) : ''
129
+ const listPath = listPoint ? normalizePathParams(pointParts(listPoint), listPoint?.args?.params || [], listPoint?.rename?.param) : ''
113
130
  const listParams = listPoint?.args?.params || []
114
131
 
115
132
  // Required query params with spec-provided examples - needed in live mode.
@@ -475,16 +492,24 @@ ${loadSkipBlock} var client = setup.Client;
475
492
  var env = TestRunner.EnvOverride(new Dictionary<string, object?>
476
493
  {
477
494
  ["${entidEnvVar}"] = new Dictionary<string, object?>(),
478
- ["${PROJECTNAME}_TEST_LIVE"] = "FALSE",${apikeyEnvEntry}
495
+ ["${PROJECTNAME}_TEST_LIVE"] = "FALSE",${apikeyEnvEntry}${serverEnvEntry}
479
496
  });
480
497
 
481
498
  var live = Equals(env["${PROJECTNAME}_TEST_LIVE"], "TRUE");
482
499
 
483
500
  if (live)
484
501
  {
485
- var liveClient = new ${Name}SDK(new Dictionary<string, object?>
486
- {${apikeyLiveField}
487
- });
502
+ // sdk-test-control.json's test.client.options goes UNDER the
503
+ // generated fields: it adds to the live client, it does not
504
+ // redirect it, so the generated entries overwrite it here.
505
+ var liveOpts = TestRunner.LiveClientOptions();
506
+ foreach (var _kv in new Dictionary<string, object?>
507
+ {${apikeyLiveField}${serverLiveField}
508
+ })
509
+ {
510
+ liveOpts[_kv.Key] = _kv.Value;
511
+ }
512
+ var liveClient = new ${Name}SDK(liveOpts);
488
513
 
489
514
  var idmap = new Dictionary<string, object?>();
490
515
  var entidRaw = env["${entidEnvVar}"];
@@ -17,7 +17,9 @@ import {
17
17
  each,
18
18
  buildIdNames,
19
19
  getMatchEntries,
20
- isAuthActive, envName, envToken
20
+ isAuthActive, envName, envToken,
21
+ serverVarEnv,
22
+ serverVariables
21
23
  } from '@voxgig/sdkgen'
22
24
 
23
25
 
@@ -59,12 +61,26 @@ const TestEntity = cmp(function TestEntity(props: any) {
59
61
 
60
62
  const authActive = isAuthActive(model)
61
63
  const apikeyEnvEntry = authActive
62
- ? `\n ["${PROJUPPER}_APIKEY"] = "NONE",`
64
+ ? `\n ["${PROJUPPER}_APIKEY"] = "",`
63
65
  : ''
64
66
  const apikeyLiveField = authActive
65
67
  ? `\n ["apikey"] = env["${PROJUPPER}_APIKEY"],`
66
68
  : ''
67
69
 
70
+ // A templated server URL (OpenAPI server variables) makes a LIVE client
71
+ // impossible to construct without values: makeOptions raises rather than
72
+ // request a URL with a literal `{account_id}` in it. So the live suite
73
+ // takes them from the environment the same way it takes the apikey.
74
+ const svars = serverVariables(model)
75
+ const serverEnvEntry = svars
76
+ .map((v: any) => `\n ["${serverVarEnv(PROJUPPER, v.name)}"] = ${JSON.stringify(v.dflt)},`).join('')
77
+ const serverLiveField = 0 === svars.length ? '' : `
78
+ ["server"] = new Dictionary<string, object?>
79
+ {${svars
80
+ .map((v: any) => `
81
+ ["${v.name}"] = env["${serverVarEnv(PROJUPPER, v.name)}"],`).join('')}
82
+ },`
83
+
68
84
  const idnames = buildIdNames(entity, basicflow)
69
85
  const idnamesStr = idnames.map(n => `"${n}"`).join(', ')
70
86
 
@@ -266,7 +282,7 @@ ${allSteps.length > 0 ? ' var client = setup.Client;\n\n' : ''}`)
266
282
  {
267
283
  ["${PROJUPPER}_TEST_${ENTUPPER}_ENTID"] = idmap,
268
284
  ["${PROJUPPER}_TEST_LIVE"] = "FALSE",
269
- ["${PROJUPPER}_TEST_EXPLAIN"] = "FALSE",${apikeyEnvEntry}
285
+ ["${PROJUPPER}_TEST_EXPLAIN"] = "FALSE",${apikeyEnvEntry}${serverEnvEntry}
270
286
  });
271
287
 
272
288
  var idmapResolved = Helpers.ToMapAny(env["${PROJUPPER}_TEST_${ENTUPPER}_ENTID"])
@@ -288,12 +304,20 @@ ${allSteps.length > 0 ? ' var client = setup.Client;\n\n' : ''}`)
288
304
  Content(`
289
305
  if (Equals(env["${PROJUPPER}_TEST_LIVE"], "TRUE"))
290
306
  {
307
+ // 'extra ?? new ...', not a bare 'extra': Merge returns null when
308
+ // the last entry is null, and BasicSetup is normally called with no
309
+ // argument at all - so a bare 'extra' silently discarded the apikey
310
+ // and server values above and handed the SDK null.
311
+ var extraOpts = extra ?? new Dictionary<string, object?>();
291
312
  var mergedOpts = StructUtils.Merge(new List<object?>
292
313
  {
314
+ // FIRST, so the generated fields below win: sdk-test-control.json's
315
+ // test.client.options adds to the live client, it does not redirect it.
316
+ TestRunner.LiveClientOptions(),
293
317
  new Dictionary<string, object?>
294
- {${apikeyLiveField}
318
+ {${apikeyLiveField}${serverLiveField}
295
319
  },
296
- extra,
320
+ extraOpts,
297
321
  });
298
322
  client = new ${Name}SDK(Helpers.ToMapAny(mergedOpts));
299
323
  }