@voxgig/sdkgen 4.16.0 → 4.17.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 (104) hide show
  1. package/README.md +8 -0
  2. package/bin/voxgig-sdkgen +2 -2
  3. package/dist/action/action.js +2 -2
  4. package/dist/action/action.js.map +1 -1
  5. package/dist/action/check.js +9 -8
  6. package/dist/action/check.js.map +1 -1
  7. package/dist/action/dispatch.js +4 -4
  8. package/dist/action/dispatch.js.map +1 -1
  9. package/dist/action/doctor.js +16 -15
  10. package/dist/action/doctor.js.map +1 -1
  11. package/dist/action/edition.d.ts +4 -0
  12. package/dist/action/{docs.js → edition.js} +57 -54
  13. package/dist/action/edition.js.map +1 -0
  14. package/dist/action/kind.d.ts +1 -2
  15. package/dist/action/kind.js +22 -38
  16. package/dist/action/kind.js.map +1 -1
  17. package/dist/action/package.js +17 -16
  18. package/dist/action/package.js.map +1 -1
  19. package/dist/action/resolve.d.ts +3 -1
  20. package/dist/action/resolve.js +29 -11
  21. package/dist/action/resolve.js.map +1 -1
  22. package/dist/admin/status.d.ts +43 -0
  23. package/dist/admin/status.js +161 -0
  24. package/dist/admin/status.js.map +1 -0
  25. package/dist/cmp/Test.js +11 -0
  26. package/dist/cmp/Test.js.map +1 -1
  27. package/dist/helpers/kindCollection.d.ts +1 -0
  28. package/dist/helpers/kindCollection.js +14 -0
  29. package/dist/helpers/kindCollection.js.map +1 -0
  30. package/dist/helpers/modelcheck.d.ts +1 -1
  31. package/dist/helpers/modelcheck.js +13 -3
  32. package/dist/helpers/modelcheck.js.map +1 -1
  33. package/dist/helpers/shipped.js +2 -3
  34. package/dist/helpers/shipped.js.map +1 -1
  35. package/dist/helpers/testPolicy.d.ts +1 -1
  36. package/dist/helpers/testPolicy.js +6 -37
  37. package/dist/helpers/testPolicy.js.map +1 -1
  38. package/dist/sdkgen.d.ts +1 -1
  39. package/dist/sdkgen.js +22 -89
  40. package/dist/sdkgen.js.map +1 -1
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/dist/utility.js +9 -1
  43. package/dist/utility.js.map +1 -1
  44. package/model/sdkgen.aon +5 -52
  45. package/package.json +1 -1
  46. package/project/.sdk/src/cmp/go/Config_go.ts +4 -4
  47. package/project/.sdk/src/cmp/go/utility_go.ts +10 -2
  48. package/project/.sdk/src/cmp/js/Package_js.ts +5 -1
  49. package/project/.sdk/src/cmp/js/TestDirect_js.ts +11 -7
  50. package/project/.sdk/src/cmp/js/TestEntity_js.ts +16 -2
  51. package/project/.sdk/src/cmp/js/TestLive_js.ts +32 -0
  52. package/project/.sdk/src/cmp/js/Test_js.ts +2 -0
  53. package/project/.sdk/src/cmp/js/fragment/Direct.test.fragment.js +1 -1
  54. package/project/.sdk/src/cmp/js/fragment/Entity.test.fragment.js +4 -2
  55. package/project/.sdk/src/cmp/php/ReadmeExamplesTest_php.ts +30 -9
  56. package/project/.sdk/src/cmp/php/ReadmeHowto_php.ts +8 -3
  57. package/project/.sdk/src/cmp/php/ReadmeQuick_php.ts +5 -4
  58. package/project/.sdk/src/cmp/php/ReadmeTopQuick_php.ts +2 -2
  59. package/project/.sdk/src/cmp/ts/Package_ts.ts +5 -1
  60. package/project/.sdk/src/cmp/ts/ReadmeHowto_ts.ts +5 -0
  61. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +15 -11
  62. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +13 -16
  63. package/project/.sdk/src/cmp/ts/TestLive_ts.ts +32 -0
  64. package/project/.sdk/src/cmp/ts/Test_ts.ts +2 -0
  65. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +1 -0
  66. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +2 -0
  67. package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +9 -2
  68. package/project/.sdk/tm/js/test/live-contract.js +183 -0
  69. package/project/.sdk/tm/js/test/live-entity.js +169 -0
  70. package/project/.sdk/tm/js/test/live-runner.js +129 -0
  71. package/project/.sdk/tm/js/test/live-scenarios.js +142 -0
  72. package/project/.sdk/tm/js/test/utility.js +84 -0
  73. package/project/.sdk/tm/ts/test/live-contract.ts +104 -0
  74. package/project/.sdk/tm/ts/test/live-entity.ts +142 -0
  75. package/project/.sdk/tm/ts/test/live-runner.ts +166 -0
  76. package/project/.sdk/tm/ts/test/live-scenarios.ts +112 -0
  77. package/project/.sdk/tm/ts/test/utility.ts +1 -2
  78. package/project/sdkgen-package.json +1 -1
  79. package/src/action/action.ts +2 -2
  80. package/src/action/check.ts +3 -2
  81. package/src/action/dispatch.ts +4 -4
  82. package/src/action/doctor.ts +10 -9
  83. package/src/action/{docs.ts → edition.ts} +56 -53
  84. package/src/action/kind.ts +12 -33
  85. package/src/action/package.ts +4 -3
  86. package/src/action/resolve.ts +26 -2
  87. package/src/admin/status.ts +124 -0
  88. package/src/cmp/Test.ts +13 -1
  89. package/src/helpers/kindCollection.ts +11 -0
  90. package/src/helpers/modelcheck.ts +10 -3
  91. package/src/helpers/shipped.ts +2 -3
  92. package/src/helpers/testPolicy.ts +7 -45
  93. package/src/sdkgen.ts +15 -94
  94. package/src/utility.ts +8 -2
  95. package/dist/action/docs.d.ts +0 -4
  96. package/dist/action/docs.js.map +0 -1
  97. package/dist/cmp/Docs.d.ts +0 -4
  98. package/dist/cmp/Docs.js +0 -98
  99. package/dist/cmp/Docs.js.map +0 -1
  100. package/dist/cmp/ExternalDocs.d.ts +0 -2
  101. package/dist/cmp/ExternalDocs.js +0 -43
  102. package/dist/cmp/ExternalDocs.js.map +0 -1
  103. package/src/cmp/Docs.ts +0 -125
  104. package/src/cmp/ExternalDocs.ts +0 -54
@@ -1,3 +1,4 @@
1
+ import { kindCollection } from '../helpers/kindCollection'
1
2
  // `package add` / `package list` — the whole-package verbs.
2
3
  //
3
4
  // See docs/design/sdkgen-packages.md §9.
@@ -78,7 +79,7 @@ const CMD_MAP: any = Object.assign(Object.create(null), {
78
79
  // reads them at generate time rather than at add time, installing it last
79
80
  // keeps the add log in the order a reader would expect and leaves the model
80
81
  // complete before anything reads it.
81
- const ADD_ORDER = ['target', 'feature', 'docs']
82
+ const ADD_ORDER = ['target', 'feature', 'edition']
82
83
 
83
84
 
84
85
  async function action_package(
@@ -663,7 +664,7 @@ function installedFrom(pkgname: string, actx: ActionContext): Installed[] {
663
664
  const found: Installed[] = []
664
665
 
665
666
  for (const kind of Object.keys(KINDS).sort()) {
666
- const items = kit[kind] ?? {}
667
+ const items = kindCollection({ main: { [KIT]: kit } }, kind)
667
668
 
668
669
  for (const name of Object.keys(items).sort()) {
669
670
  const item = items[name]
@@ -1078,7 +1079,7 @@ async function cmd_package_list(
1078
1079
  const groups: Record<string, any[]> = Object.create(null)
1079
1080
 
1080
1081
  for (const kind of Object.keys(KINDS).sort()) {
1081
- const items = kit[kind] ?? {}
1082
+ const items = kindCollection({ main: { [KIT]: kit } }, kind)
1082
1083
 
1083
1084
  for (const name of Object.keys(items).sort()) {
1084
1085
  const item = items[name]
@@ -1,3 +1,4 @@
1
+ import { kindCollection } from '../helpers/kindCollection'
1
2
  // Where a `<kind> add <ref>` gets its definition from.
2
3
  //
3
4
  // One resolver for every KIND of thing an add can install — targets today,
@@ -59,6 +60,9 @@ function lastSegment(ref: string): string {
59
60
 
60
61
 
61
62
  function resolveSource(ref: string, kind: string, ctx$: any): Source {
63
+ // Registration and copying must resolve a bare resync name identically.
64
+ const declared = kindCollection(ctx$.model, kind)?.[ref]
65
+ ref = (isBare(ref) && recordedRef(declared, ref)) || ref
62
66
  const root = ctx$.folder
63
67
  const fs = ctx$.fs()
64
68
 
@@ -275,7 +279,7 @@ function registerInstalled(kind: string, refs: string[], ctx$: any) {
275
279
  return
276
280
  }
277
281
 
278
- const items = kit[kind] = kit[kind] ?? {}
282
+ const items = kindCollection(ctx$.model, kind, true)
279
283
 
280
284
  for (const ref of refs) {
281
285
  let source: Source
@@ -317,7 +321,7 @@ function registerInstalled(kind: string, refs: string[], ctx$: any) {
317
321
  function nameConflict(
318
322
  kind: string, source: Source, ctx$: any,
319
323
  ): { package?: string, base?: string } | undefined {
320
- const declared: any = ctx$.model?.main?.[KIT]?.[kind]?.[source.name]
324
+ const declared: any = kindCollection(ctx$.model, kind)?.[source.name]
321
325
 
322
326
  if (null == declared || 'object' !== typeof declared) {
323
327
  return undefined
@@ -423,6 +427,24 @@ function providesStill(
423
427
  }
424
428
 
425
429
 
430
+ function recordedRef(declared: any, name: string): string | undefined {
431
+ if (null == declared?.base || '' === declared.base) {
432
+ return undefined
433
+ }
434
+
435
+ const origname = declared.origname || name
436
+
437
+ return Path.join(declared.base, '..', origname) +
438
+ (origname === name ? '' : '~' + name)
439
+ }
440
+
441
+
442
+ // A bare NAME, as opposed to a ref that locates a source.
443
+ function isBare(ref: string): boolean {
444
+ return !ref.includes('/') && !ref.includes(Path.sep)
445
+ }
446
+
447
+
426
448
  function normaliseBase(base: string): string {
427
449
  return Path.normalize(String(base ?? '')).split(Path.sep).join('/')
428
450
  }
@@ -439,6 +461,8 @@ export type {
439
461
 
440
462
  export {
441
463
  resolveSource,
464
+ recordedRef,
465
+ isBare,
442
466
  registerInstalled,
443
467
  nameConflict,
444
468
  lastSegment,
@@ -0,0 +1,124 @@
1
+ import Fs from 'node:fs'
2
+ import Path from 'node:path'
3
+ import { spawnSync } from 'node:child_process'
4
+
5
+ function command(cwd: string, bin: string, args: string[]) {
6
+ return spawnSync(bin, args, { cwd, encoding: 'utf8', timeout: 15000, windowsHide: true, env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' } })
7
+ }
8
+ function git(cwd: string, args: string[]): string | null {
9
+ const result = command(cwd, 'git', args)
10
+ return result.status === 0 ? result.stdout.trim() : null
11
+ }
12
+ function directory(path: string): boolean {
13
+ return Fs.existsSync(path) && Fs.statSync(path).isDirectory()
14
+ }
15
+ function entries(value: any): [string, any][] {
16
+ return Object.entries(value || {}).filter(([name]) => !name.includes('$')).sort(([a], [b]) => a.localeCompare(b))
17
+ }
18
+ function workingTree(folder: string) {
19
+ if (!directory(folder)) return 'missing'
20
+ const state = git(folder, ['status', '--porcelain=v1', '--untracked-files=normal', '--', '.'])
21
+ return state === null ? 'not a git repository' : state ? 'modified' : 'clean'
22
+ }
23
+
24
+ // Read the compiled model and working trees. Never fetch, build, test, or publish.
25
+ export function repositoryStatus(root: string) {
26
+ root = Path.resolve(root)
27
+ const sdk = Path.join(root, '.sdk')
28
+ if (!directory(sdk)) throw new Error('Expected an SDK repository containing .sdk: ' + root)
29
+ const file = Path.join(sdk, 'model/sdk.json')
30
+ let model: any, modelError: string | undefined
31
+ if (Fs.existsSync(file)) {
32
+ try {
33
+ model = JSON.parse(Fs.readFileSync(file, 'utf8'))
34
+ if (!model?.main?.kit) throw new Error('missing main.kit')
35
+ } catch (err: any) { modelError = 'Invalid compiled model: ' + err.message }
36
+ }
37
+ const kit = model?.main?.kit || {}
38
+ const upstream = git(root, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'])
39
+ const counts = upstream && git(root, ['rev-list', '--left-right', '--count', 'HEAD...@{upstream}'])
40
+ const [ahead, behind] = counts ? counts.split(/\s+/).map(Number) : [null, null]
41
+ const packages = ['sdkgen', 'apidef', 'model', 'docgen'].map(name => {
42
+ const file = Path.join(sdk, 'node_modules/@voxgig', name, 'package.json')
43
+ try { return { name: '@voxgig/' + name, version: JSON.parse(Fs.readFileSync(file, 'utf8')).version } }
44
+ catch { return { name: '@voxgig/' + name, version: 'not installed' } }
45
+ })
46
+ return {
47
+ root, name: model?.name || Path.basename(root),
48
+ repository: {
49
+ branch: git(root, ['branch', '--show-current']) || 'detached or not initialised',
50
+ commit: git(root, ['rev-parse', '--short', 'HEAD']), state: workingTree(root), upstream, ahead, behind,
51
+ },
52
+ model: { path: file, compiled: !!model && !modelError, error: modelError,
53
+ generatedAt: Fs.existsSync(file) ? Fs.statSync(file).mtime.toISOString() : null },
54
+ toolchain: { node: process.version, packages },
55
+ targets: entries(kit.target).map(([name, target]) => {
56
+ const folder = Path.resolve(root, target.output?.path || name)
57
+ const present = directory(folder)
58
+ return { name, active: target.active !== false, path: folder, present,
59
+ state: workingTree(folder), readme: Fs.existsSync(Path.join(folder, 'README.md')),
60
+ version: target.publish?.version || null,
61
+ publication: target.publish?.registry?.state || 'not recorded',
62
+ }
63
+ }),
64
+ editions: entries(kit.doc?.edition).map(([name, edition]) => ({ name,
65
+ active: kit.doc?.active !== false && edition.active !== false, kind: edition.kind,
66
+ path: edition.output?.path || null,
67
+ present: !!edition.output?.path && Fs.existsSync(Path.resolve(root, edition.output.path)),
68
+ })),
69
+ }
70
+ }
71
+
72
+ function githubStatus(root: string) {
73
+ const run = (args: string[]) => {
74
+ const result = command(root, 'gh', args)
75
+ if (result.status !== 0) throw new Error(result.error?.message || result.stderr.trim() || 'GitHub query failed')
76
+ return JSON.parse(result.stdout)
77
+ }
78
+ const repository = run(['repo', 'view', '--json', 'nameWithOwner,url'])
79
+ const host = new URL(repository.url).hostname
80
+ const pages = command(root, 'gh', ['api', '--hostname', host, 'repos/' + repository.nameWithOwner + '/pages'])
81
+ let site: any
82
+ try { site = JSON.parse(pages.stdout || '{}') } catch { site = {} }
83
+ if (pages.status !== 0 && String(site.status) !== '404') throw new Error(pages.error?.message || pages.stderr.trim() || 'Pages query failed')
84
+ return { repository: repository.nameWithOwner,
85
+ pages: pages.status === 0 ? { url: site.html_url, status: site.status, buildType: site.build_type } : { status: 'not configured' },
86
+ runs: run(['run', 'list', '--limit', '5', '--json', 'workflowName,status,conclusion,headBranch,url']),
87
+ }
88
+ }
89
+
90
+ export function main(args = process.argv.slice(2)): number {
91
+ const root = args.shift()
92
+ if (args.includes('--help') || root === '--help') {
93
+ console.log('Usage: .sdk/admin/status.sh [--json] [--github]\nRead local repository, SDK, and documentation status. --github also reads Pages and recent CI runs.\nBuild and test results are not inferred from generated files. No commands that change the repository are run.')
94
+ return 0
95
+ }
96
+ if (!root || args.some(arg => !['--json', '--github'].includes(arg))) throw new Error('Usage: status.sh [--json] [--github]')
97
+ const report: any = repositoryStatus(root)
98
+ let failed = !!report.model.error
99
+ if (args.includes('--github')) {
100
+ try { report.github = githubStatus(report.root) }
101
+ catch (err: any) { report.github = { error: err.message }; failed = true }
102
+ }
103
+ if (args.includes('--json')) console.log(JSON.stringify(report, null, 2))
104
+ else {
105
+ console.log('Repository: ' + report.root)
106
+ console.log('Git: ' + report.repository.branch + ' | ' + report.repository.state + ' | ' + (report.repository.commit || 'no commits'))
107
+ console.log('Upstream: ' + (report.repository.upstream ? report.repository.upstream + ' | ahead ' + report.repository.ahead + ', behind ' + report.repository.behind + ' (local tracking refs)' : 'not configured'))
108
+ console.log('Model: ' + (report.model.error || (report.model.compiled ? 'compiled ' + report.model.generatedAt : 'not generated; run npm run generate from .sdk')))
109
+ console.log('Toolchain: Node ' + report.toolchain.node + '; ' + report.toolchain.packages.map((p: any) => p.name + ' ' + p.version).join('; '))
110
+ console.log('\nSDKs and tools (publication state comes from the model):')
111
+ for (const t of report.targets) console.log(' ' + t.name + ' | ' + (t.active ? 'active' : 'inactive') + ' | ' + t.state + ' | version ' + (t.version || 'not recorded') + ' | ' + t.publication + ' | ' + t.path)
112
+ if (!report.targets.length) console.log(' No targets in the compiled model.')
113
+ console.log('\nDocumentation:')
114
+ for (const e of report.editions) console.log(' ' + e.name + ' | ' + (e.active ? 'active' : 'inactive') + ' | ' + (e.present ? 'present' : 'missing') + ' | ' + (e.path || 'no output path'))
115
+ if (!report.editions.length) console.log(' No editions in the compiled model.')
116
+ console.log('\nLocal status does not run builds/tests or check registries. Use --github for remote CI and Pages status.')
117
+ if (report.github) console.log('\nGitHub:\n' + JSON.stringify(report.github, null, 2))
118
+ }
119
+ return failed ? 1 : 0
120
+ }
121
+
122
+ if (require.main === module) {
123
+ try { process.exitCode = main() } catch (err: any) { console.error(err.message); process.exitCode = 1 }
124
+ }
package/src/cmp/Test.ts CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  import {
3
- cmp,
3
+ cmp, File, Content,
4
4
  } from 'jostraca'
5
5
 
6
6
  import { requirePath } from '../utility'
@@ -19,6 +19,18 @@ const Test = cmp(function Test(props: any) {
19
19
  const { model, log } = ctx$
20
20
  const stdrep = ensureStdrep(ctx$)
21
21
 
22
+ const points = Object.values(model.main.kit.entity || {}).flatMap((entity: any) =>
23
+ Object.values(entity.op || {}).flatMap((op: any) => op.points || [])) as any[]
24
+ if (points.some(point => point.contract && JSON.parse(point.contract.json).live)) {
25
+ const supported = ['ts', 'js'].includes(target.name)
26
+ File({ name: 'live-coverage.json' }, () => Content(JSON.stringify({
27
+ version: 1, target: target.name, scenarios: supported ? 'supported' : 'unsupported',
28
+ points: points.map(point => point.contract?.id || point.method + ' ' + point.orig),
29
+ ...(!supported ? { reason: 'This target does not yet execute declarative live recipes. Its existing tests do not establish full operation coverage.' } : {}),
30
+ }, null, 2)))
31
+ if (!supported) log.warn({ point: 'live-scenarios-unsupported', note: 'Declarative live recipes are not executed by target ' + target.name })
32
+ }
33
+
22
34
  const Test_sdk = requirePath(ctx$, `./cmp/${target.name}/Test_${target.name}`)
23
35
  Test_sdk['Test']({ model, target, stdrep })
24
36
 
@@ -0,0 +1,11 @@
1
+ import { KIT } from '../types'
2
+
3
+ // Physical kind names and model namespaces are independent.
4
+ export function kindCollection(model: any, kind: string, create = false): any {
5
+ const kit = create ? (model.main ??= {})[KIT] ??= {} : model?.main?.[KIT]
6
+ if (kind === 'edition') {
7
+ const doc = create ? kit.doc ??= {} : kit?.doc
8
+ return create ? doc.edition ??= {} : doc?.edition ?? {}
9
+ }
10
+ return create ? kit[kind] ??= {} : kit?.[kind] ?? {}
11
+ }
@@ -33,6 +33,8 @@
33
33
  // project's own file, not the package's.
34
34
 
35
35
  import { Aontu } from 'aontu'
36
+ import { createRequire } from 'node:module'
37
+ import Path from 'node:path'
36
38
 
37
39
  import { schemaFile } from './shipped'
38
40
 
@@ -112,8 +114,8 @@ function slashComments(text: string): { line: number, text: string }[] {
112
114
  // A FRESH INSTANCE each time: the option call mutates the instance's jsonic,
113
115
  // so a cached one would leak its configuration into the bare compile that is
114
116
  // deliberately paired with it.
115
- function strictAontu(): any {
116
- const aontu: any = new Aontu()
117
+ function strictAontu(options?: any): any {
118
+ const aontu: any = new Aontu(options)
117
119
  aontu.lang.jsonic.options({ comment: { def: { slash: null, multi: null } } })
118
120
  return aontu
119
121
  }
@@ -186,7 +188,12 @@ function compileModel(
186
188
  includeLine(schemaFile()) + '\n' + src : src
187
189
 
188
190
  try {
189
- const aontu = false === opts?.strict ? new Aontu() : strictAontu()
191
+ // Resolve package includes from the model being checked, including native
192
+ // package self-references. The SDK toolchain's dependencies are unrelated.
193
+ const localRequire = Object.assign(createRequire(Path.resolve(path)), { main: require.main })
194
+ // Aontu forwards this runtime resolver option to Lang; its public type omits it.
195
+ const options: any = { require: localRequire }
196
+ const aontu = false === opts?.strict ? new Aontu(options) : strictAontu(options)
190
197
  const model = aontu.generate(text, { path, errs })
191
198
 
192
199
  return {
@@ -9,9 +9,8 @@
9
9
  // installation doing the checking, which is this one.
10
10
  //
11
11
  // `__dirname` is `dist/helpers` in the shipped package, so the package root is
12
- // two levels up. npm can only ship files under that root, which is why the
13
- // canonical `model/` is mirrored into `ts/model/` (the model-mirror guard
14
- // fails on drift).
12
+ // two levels up. The authoritative schema lives directly in its model/
13
+ // directory, in both a checkout and an installed package.
15
14
 
16
15
  import Path from 'node:path'
17
16
 
@@ -1,52 +1,14 @@
1
- // How strict the generated LIVE tests are.
2
- //
3
- // WHY THIS IS A MODEL DECISION
4
- //
5
- // The generated direct tests are deliberately lenient in live mode:
6
- //
7
- // if (setup.live) {
8
- // // Live mode is lenient: synthetic IDs frequently 4xx.
9
- // if (!result.ok || result.status < 200 || result.status >= 300) {
10
- // return // <-- passes
11
- // }
12
- // } else {
13
- // assert(result.ok === true)
14
- // ...
15
- // }
16
- //
17
- // That is CORRECT for sdkgen's default case — a fleet SDK generated against
18
- // an arbitrary third-party public API, where synthetic IDs 4xx constantly and
19
- // list response shapes vary wildly. Asserting there would mean permanent red.
20
- //
21
- // It is WRONG for a project that owns the server it tests against, and those
22
- // projects had no way to say so. Measured on voxgig-solardemo-sdk: the live
23
- // TypeScript suite reports 186 pass / 0 fail against the local test app —
24
- // and 184 pass / 2 fail with the server STOPPED. Only the two entity `basic`
25
- // flows noticed. A green live run said almost nothing.
26
- //
27
- // Gaps that announce themselves as a passing test suite are worse than the
28
- // ones that break a build.
29
-
30
1
  import { KIT } from '../types'
31
2
 
32
-
33
- // True when live assertions should match the offline ones. Per-target
34
- // override first, then the SDK-wide default, then false.
35
- //
36
- // main: kit: test: live: strict: true
37
- // main: kit: target: go: test: live: strict: true
3
+ // Live requests assert success by default. This never enables fail-fast:
4
+ // independent tests continue and their framework aggregates the failures.
5
+ // An explicit false preserves the legacy exploratory policy for callers
6
+ // migrating a fleet; it must not be confused with full live verification.
38
7
  function liveStrict(model: any, target?: string): boolean {
39
8
  const perTarget = null == target ? undefined :
40
9
  model?.main?.[KIT]?.target?.[target]?.test?.live?.strict
41
-
42
- if (null != perTarget) {
43
- return true === perTarget
44
- }
45
-
46
- return true === model?.main?.[KIT]?.test?.live?.strict
10
+ const configured = perTarget ?? model?.main?.[KIT]?.test?.live?.strict
11
+ return false !== configured
47
12
  }
48
13
 
49
-
50
- export {
51
- liveStrict,
52
- }
14
+ export { liveStrict }
package/src/sdkgen.ts CHANGED
@@ -24,8 +24,6 @@ import { SdkGenError, requirePath, isAuthActive, resolveAuthPrefix, isHttpBasicA
24
24
  import { Main } from './cmp/Main'
25
25
  import { featureApplies, targetFeatures, featureTags, unknownTags, TAGS } from './helpers/applicability'
26
26
  import { ExternalTarget } from './cmp/ExternalTarget'
27
- import { Docs, DocsItem } from './cmp/Docs'
28
- import { ExternalDocs } from './cmp/ExternalDocs'
29
27
 
30
28
  import { KIT } from '@voxgig/apidef'
31
29
  import { Deploy } from './cmp/Deploy'
@@ -150,7 +148,7 @@ import {
150
148
 
151
149
  import { cmd_package_check } from './action/check'
152
150
 
153
- import { docs_add } from './action/docs'
151
+ import { edition_add } from './action/edition'
154
152
 
155
153
  // The verbs, built from the kind registry — see action/dispatch.
156
154
  import { ACTION_MAP, actionNames, needsModel } from './action/dispatch'
@@ -350,7 +348,7 @@ function SdkGen(opts: SdkGenOptions) {
350
348
  // if it appeared between those checks, the pass could write into content
351
349
  // that was never ownership-validated.
352
350
  const external: ExternalPlan[] =
353
- externalItems(model, root, ['target', 'docs'], externalOverride)
351
+ externalItems(model, root, ['target'], externalOverride)
354
352
  .map((ext) => ({ ...ext, skip: externalSkipReason(ext, fs) }))
355
353
 
356
354
  // Before ANY file is written, in-tree included: a destination that turns
@@ -363,74 +361,13 @@ function SdkGen(opts: SdkGenOptions) {
363
361
 
364
362
  showChanges(jopts.log, 'generate-result', jres, Path.dirname(process.cwd()))
365
363
 
366
- // IN-TREE DOCS, in their own pass over the same root.
367
- //
368
- // The alternative is one `Kinds()` call in the consumer's `Root.ts` —
369
- // which create-sdkgen writes once and never revisits, so every project
370
- // scaffolded before the docs kind existed would have to be hand-edited
371
- // before `docs add` did anything. A second pass costs one more changes
372
- // report and makes the kind work in projects that predate it, which is
373
- // the whole point of putting the destinations in packages.
374
- //
375
- // Items with `output: path` are excluded here and generated by the loop
376
- // below, exactly as out-of-tree targets are.
377
- const intreedocs = Object.keys(model?.main?.[KIT]?.docs ?? {})
378
- .filter((name: string) => {
379
- const item = model.main[KIT].docs[name]
380
- const path = item?.output?.path
381
- return false !== item?.active && (null == path || '' === path)
364
+ // Docgen owns editions, destinations, templates, text QA and deployment.
365
+ if (model?.main?.[KIT]?.doc?.active !== false && Object.values(model?.main?.[KIT]?.doc?.edition ?? {})
366
+ .some((item: any) => item.active !== false)) {
367
+ const docgenPath = require.resolve('@voxgig/docgen', {
368
+ paths: [Path.join(root, '.sdk')],
382
369
  })
383
-
384
- // AN IN-TREE DOCS ITEM AND A TARGET CANNOT SHARE A NAME.
385
- //
386
- // `docs` and `target` are separate namespaces — deliberately, so an item
387
- // of each may be called `api` — and their `.sdk` trees are nested apart
388
- // (`src/cmp/docs/<n>` vs `src/cmp/<n>`), so installing both is fine.
389
- //
390
- // Their GENERATED destinations are not separate. Both render into
391
- // `<sdk-repo>/<name>/`, the docs pass runs second, and jostraca is
392
- // last-write-wins — so a docs item named `go` would quietly overwrite the
393
- // Go SDK's README, and whatever else the two have in common, leaving a
394
- // corrupt SDK and a green run.
395
- //
396
- // Refused rather than reordered, and refused BEFORE the docs pass writes
397
- // anything: this is the in-tree half of the rule `checkExternalFolders`
398
- // enforces for out-of-tree destinations, and the fix is the same either
399
- // way — give one of them `output: path`, or rename it.
400
- const targets: any = model?.main?.[KIT]?.target ?? {}
401
-
402
- for (const name of intreedocs) {
403
- const target = targets[name]
404
-
405
- if (null == target || false === target.active) {
406
- continue
407
- }
408
-
409
- const tpath = target.output?.path
410
-
411
- if (null != tpath && '' !== tpath) {
412
- continue
413
- }
414
-
415
- throw new SdkGenError(
416
- 'Docs item "' + name + '" and target "' + name + '" would both ' +
417
- 'generate into <sdk-project>/' + name + '/.\n' +
418
- ' They are separate kinds, so sharing a name is legal — but they ' +
419
- 'share one output folder, and the docs pass runs second, so it ' +
420
- 'would overwrite the SDK.\n' +
421
- ' Give one of them `output: path`, or rename it.')
422
- }
423
-
424
- if (0 < intreedocs.length) {
425
- log.info({
426
- point: 'generate-docs-start', docs: intreedocs,
427
- note: intreedocs.join(', ')
428
- })
429
-
430
- const dres = await jostraca.generate(jopts, () => Docs({ model }))
431
-
432
- showChanges(jopts.log, 'generate-docs-result', dres,
433
- Path.dirname(process.cwd()))
370
+ await require(docgenPath).generate({ ...jopts, folder: root, model })
434
371
  }
435
372
 
436
373
  for (const ext of external) {
@@ -462,12 +399,7 @@ function SdkGen(opts: SdkGenOptions) {
462
399
 
463
400
  const sdkrelpath = externalSdkRel(ext, root, log)
464
401
 
465
- const eres = 'docs' === ext.kind ?
466
- await jostraca.generate(
467
- { ...jopts, folder: ext.folder },
468
- () => ExternalDocs({
469
- model, item: ext.target, cmpfolder: folder, sdkrelpath,
470
- })) :
402
+ const eres =
471
403
  await jostraca.generate(
472
404
  { ...jopts, folder: ext.folder },
473
405
  () => ExternalTarget({
@@ -628,10 +560,10 @@ function SdkGen(opts: SdkGenOptions) {
628
560
 
629
561
  // The third kind. sdkgen ships no docs items, so every ref here is a path
630
562
  // into a package — see action/docs.
631
- const docs = {
563
+ const edition = {
632
564
  add: async (items: string[]): Promise<ActionResult> => {
633
565
  const ctx = resolveActionContext()
634
- return docs_add(items, ctx)
566
+ return edition_add(items, ctx)
635
567
  }
636
568
  }
637
569
 
@@ -680,7 +612,7 @@ function SdkGen(opts: SdkGenOptions) {
680
612
  generate,
681
613
  action,
682
614
  check,
683
- docs,
615
+ edition,
684
616
  target,
685
617
  feature,
686
618
 
@@ -822,16 +754,8 @@ function resolveExternalOverride(
822
754
  }
823
755
 
824
756
 
825
- // Every item, of every kind, that generates OUTSIDE the SDK repo.
826
- //
827
- // Keyed by kind because `docs` needs exactly this and a second copy of it
828
- // would drift: the out-of-tree rules — a destination must be outside the
829
- // project, unclaimed, and either empty or previously generated into — are
830
- // properties of WRITING SOMEWHERE ELSE, not of being a target.
831
- //
832
- // The claim map spanning kinds is the load-bearing part: a docs item and a
833
- // target pointed at the same folder would otherwise silently overwrite each
834
- // other, in whatever order the passes happen to run.
757
+ // SDK targets can generate into separately owned repositories. Documentation
758
+ // editions are confined to this SDK repository and are handled by docgen.
835
759
  function externalItems(
836
760
  model: any, folder: string, kinds: string[],
837
761
  override: Record<string, ExternalOverride>,
@@ -841,10 +765,7 @@ function externalItems(
841
765
 
842
766
  return Object.keys(items).sort()
843
767
  .map((name: string) => {
844
- // Keyed by NAME, across kinds: a docs item and a target that share a
845
- // name share an override. They already share an output folder if both
846
- // are pointed at one (the claim map refuses that), so a name that
847
- // means two things is a problem before it reaches here.
768
+ // Overrides are keyed by installed target name.
848
769
  const ov = override[name] || {}
849
770
 
850
771
  // A SHALLOW CLONE, so the override never writes back into the model.
package/src/utility.ts CHANGED
@@ -381,8 +381,14 @@ function withPointParts(op: any): any {
381
381
  each(op, (o: any, opname: string) => {
382
382
  out[opname] = null == o || null == o.points ? o : {
383
383
  ...o,
384
- points: each(o.points).map((pt: any) =>
385
- null == pt ? pt : { ...pt, parts: pointParts(pt) }),
384
+ points: each(o.points).map((pt: any) => {
385
+ if (null == pt) return pt
386
+ // Contracts feed test generation directly from the model. Keeping
387
+ // them in every runtime entity also retains entire request/response
388
+ // schemas in clones and debug output, exhausting large SDKs' memory.
389
+ const { contract, ...runtimePoint } = pt
390
+ return { ...runtimePoint, parts: pointParts(pt) }
391
+ }),
386
392
  }
387
393
  })
388
394
 
@@ -1,4 +0,0 @@
1
- import type { ActionContext, ActionResult } from '../types';
2
- declare function action_docs(args: string[], actx: ActionContext): Promise<ActionResult>;
3
- declare function docs_add(docs: string[], actx: ActionContext): Promise<ActionResult>;
4
- export { action_docs, docs_add, };
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/action/docs.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- declare function prepareModel(model: any, ctx$: any): void;
2
- declare const DocsItem: import("jostraca").Component;
3
- declare const Docs: import("jostraca").Component;
4
- export { Docs, DocsItem, prepareModel, };