@voxgig/apidef 2.4.1 → 3.1.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 (108) hide show
  1. package/dist/apidef.d.ts +7 -2
  2. package/dist/apidef.js +190 -114
  3. package/dist/apidef.js.map +1 -1
  4. package/dist/builder/entity/entity.d.ts +3 -0
  5. package/dist/builder/entity/{apiEntity.js → entity.js} +12 -9
  6. package/dist/builder/entity/entity.js.map +1 -0
  7. package/dist/builder/entity/info.d.ts +3 -0
  8. package/dist/builder/entity/info.js +22 -0
  9. package/dist/builder/entity/info.js.map +1 -0
  10. package/dist/builder/entity.js +7 -21
  11. package/dist/builder/entity.js.map +1 -1
  12. package/dist/builder/flow/flowHeuristic01.js +21 -11
  13. package/dist/builder/flow/flowHeuristic01.js.map +1 -1
  14. package/dist/builder/flow.d.ts +2 -1
  15. package/dist/builder/flow.js +39 -12
  16. package/dist/builder/flow.js.map +1 -1
  17. package/dist/def.d.ts +62 -0
  18. package/dist/def.js +4 -0
  19. package/dist/def.js.map +1 -0
  20. package/dist/desc.d.ts +87 -0
  21. package/dist/desc.js +4 -0
  22. package/dist/desc.js.map +1 -0
  23. package/dist/guide/guide.d.ts +2 -1
  24. package/dist/guide/guide.js +161 -30
  25. package/dist/guide/guide.js.map +1 -1
  26. package/dist/guide/heuristic01.d.ts +2 -1
  27. package/dist/guide/heuristic01.js +1122 -234
  28. package/dist/guide/heuristic01.js.map +1 -1
  29. package/dist/model.d.ts +90 -0
  30. package/dist/model.js +4 -0
  31. package/dist/model.js.map +1 -0
  32. package/dist/parse.d.ts +4 -3
  33. package/dist/parse.js +40 -46
  34. package/dist/parse.js.map +1 -1
  35. package/dist/resolver.js +2 -1
  36. package/dist/resolver.js.map +1 -1
  37. package/dist/transform/args.d.ts +3 -0
  38. package/dist/transform/args.js +54 -0
  39. package/dist/transform/args.js.map +1 -0
  40. package/dist/transform/clean.d.ts +2 -2
  41. package/dist/transform/clean.js +28 -3
  42. package/dist/transform/clean.js.map +1 -1
  43. package/dist/transform/entity.d.ts +9 -1
  44. package/dist/transform/entity.js +57 -41
  45. package/dist/transform/entity.js.map +1 -1
  46. package/dist/transform/field.d.ts +1 -1
  47. package/dist/transform/field.js +89 -65
  48. package/dist/transform/field.js.map +1 -1
  49. package/dist/transform/flow.d.ts +3 -0
  50. package/dist/transform/flow.js +26 -0
  51. package/dist/transform/flow.js.map +1 -0
  52. package/dist/transform/flowstep.d.ts +3 -0
  53. package/dist/transform/flowstep.js +145 -0
  54. package/dist/transform/flowstep.js.map +1 -0
  55. package/dist/transform/operation.d.ts +3 -3
  56. package/dist/transform/operation.js +101 -296
  57. package/dist/transform/operation.js.map +1 -1
  58. package/dist/transform/select.d.ts +3 -0
  59. package/dist/transform/select.js +65 -0
  60. package/dist/transform/select.js.map +1 -0
  61. package/dist/transform/top.js +24 -2
  62. package/dist/transform/top.js.map +1 -1
  63. package/dist/transform.d.ts +1 -1
  64. package/dist/transform.js +4 -0
  65. package/dist/transform.js.map +1 -1
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/dist/types.d.ts +115 -14
  68. package/dist/types.js +4 -2
  69. package/dist/types.js.map +1 -1
  70. package/dist/utility.d.ts +34 -2
  71. package/dist/utility.js +444 -6
  72. package/dist/utility.js.map +1 -1
  73. package/model/apidef.jsonic +76 -1
  74. package/model/guide.jsonic +14 -44
  75. package/package.json +19 -16
  76. package/src/apidef.ts +258 -122
  77. package/src/builder/entity/{apiEntity.ts → entity.ts} +18 -11
  78. package/src/builder/entity/info.ts +53 -0
  79. package/src/builder/entity.ts +9 -35
  80. package/src/builder/flow/flowHeuristic01.ts +46 -12
  81. package/src/builder/flow.ts +54 -13
  82. package/src/def.ts +91 -0
  83. package/src/desc.ts +154 -0
  84. package/src/guide/guide.ts +208 -134
  85. package/src/guide/heuristic01.ts +1653 -272
  86. package/src/model.ts +143 -0
  87. package/src/parse.ts +50 -59
  88. package/src/resolver.ts +3 -1
  89. package/src/schematron.ts.off +317 -0
  90. package/src/transform/args.ts +98 -0
  91. package/src/transform/clean.ts +45 -11
  92. package/src/transform/entity.ts +96 -50
  93. package/src/transform/field.ts +136 -75
  94. package/src/transform/flow.ts +59 -0
  95. package/src/transform/flowstep.ts +242 -0
  96. package/src/transform/operation.ts +119 -419
  97. package/src/transform/select.ts +119 -0
  98. package/src/transform/top.ts +46 -4
  99. package/src/transform.ts +8 -4
  100. package/src/types.ts +181 -5
  101. package/src/utility.ts +567 -9
  102. package/dist/builder/entity/apiEntity.d.ts +0 -3
  103. package/dist/builder/entity/apiEntity.js.map +0 -1
  104. package/dist/builder/entity/def.d.ts +0 -3
  105. package/dist/builder/entity/def.js +0 -19
  106. package/dist/builder/entity/def.js.map +0 -1
  107. package/src/builder/entity/def.ts +0 -44
  108. package/src/guide.ts.off +0 -136
@@ -1,50 +1,20 @@
1
1
 
2
- guide: control: {
3
-
4
- transform: openapi: {
5
- order: *`
6
- top,
7
- entity,
8
- operation,
9
- field,
10
- clean,
11
- ` | string,
12
-
13
- element: {
14
- top: {}
15
- entity: {}
16
- operation: {}
17
- field: {}
18
- }
19
- }
20
-
21
- builder: standard: {
22
- order: *`
23
- entity,
24
- flow,
25
- ` | string,
26
-
27
- element: {
28
- entity: {}
29
- flow: {}
30
- }
31
- }
32
-
33
- }
34
-
35
-
36
-
37
2
  guide: entity: &: {
38
- name: .$KEY
3
+ active?: boolean
4
+ name: key()
5
+
39
6
  path: &: {
40
- op: &: {
41
- method: *'get' | string
42
- transform: {
43
- # TODO: make these work
44
- # inward: *null | string | object
45
- # outward: *null | string | object
46
- }
47
- }
7
+ active?: boolean
8
+
9
+ op: &: {
10
+ active?: boolean
11
+ method: string
12
+
13
+ transform?: {
14
+ req?: top
15
+ res?: top
16
+ }
17
+ }
48
18
  }
49
19
  }
50
20
 
package/package.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "@voxgig/apidef",
3
- "version": "2.4.1",
3
+ "version": "3.1.0",
4
4
  "main": "dist/apidef.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/apidef.d.ts",
7
7
  "description": "Voxgig SDK Generator.",
8
8
  "homepage": "https://github.com/voxgig/voxgig-apidef",
9
9
  "keywords": [
10
- "voxgig-apidef",
11
- "voxgig-apidef"
10
+ "voxgig",
11
+ "apidef",
12
+ "api",
13
+ "sdk"
12
14
  ],
13
15
  "author": "Richard Rodger (http://richardrodger.com)",
14
16
  "repository": {
@@ -20,7 +22,7 @@
20
22
  },
21
23
  "scripts": {
22
24
  "test": "node --enable-source-maps --test \"dist-test/**/*.test.js\"",
23
- "test-some": "node --enable-source-maps --test-name-pattern=\"$npm_config_pattern\" --test \"dist-test/**/*.test.js\"",
25
+ "test-some": "node --enable-source-maps --test-name-pattern=\"$TEST_PATTERN\" --test \"dist-test/**/*.test.js\"",
24
26
  "watch": "tsc --build src test -w",
25
27
  "build": "tsc --build src test",
26
28
  "clean": "rm -rf dist dist-test node_modules yarn.lock package-lock.json",
@@ -40,24 +42,25 @@
40
42
  "devDependencies": {
41
43
  "@hapi/code": "^9.0.3",
42
44
  "@types/js-yaml": "^4.0.9",
43
- "@types/node": "24.3.0",
45
+ "@types/node": "25.2.3",
44
46
  "json-schema-to-ts": "^3.1.1",
45
- "typescript": "^5.9.2"
47
+ "typescript": "^5.9.3"
46
48
  },
47
49
  "peerDependencies": {
48
- "aontu": ">=0.28",
49
- "memfs": ">=4.36.3"
50
+ "aontu": ">=0.35.2",
51
+ "memfs": ">=4.56.10"
50
52
  },
51
53
  "dependencies": {
52
- "@redocly/openapi-core": "1.34.5",
54
+ "@redocly/openapi-core": "1.34.6",
53
55
  "@voxgig/struct": "^0.0.9",
54
- "@voxgig/util": "^0.2.0",
55
- "chokidar": "^4.0.3",
56
- "diff": "^8.0.2",
56
+ "@voxgig/util": "^0.2.1",
57
+ "chokidar": "^5.0.0",
58
+ "decircular": "^1.0.0",
59
+ "diff": "^8.0.3",
57
60
  "gubu": "^9.0.0",
58
- "jostraca": "^0.24.1",
59
- "pino": "^9.9.0",
60
- "pino-pretty": "^13.1.1",
61
- "sonic-boom": "^4.2.0"
61
+ "jostraca": "^0.25.1",
62
+ "ordu": "^4.1.1",
63
+ "pino": "^10.3.1",
64
+ "pino-pretty": "^13.1.3"
62
65
  }
63
66
  }
package/src/apidef.ts CHANGED
@@ -1,13 +1,18 @@
1
1
  /* Copyright (c) 2024-2025 Voxgig, MIT License */
2
2
 
3
+
3
4
  import * as Fs from 'node:fs'
4
5
  import Path from 'node:path'
5
- import { inspect } from 'node:util'
6
6
 
7
- import { Jostraca, Project, names } from 'jostraca'
7
+
8
+ import {
9
+ Jostraca, JostracaResult, Project, names
10
+ } from 'jostraca'
8
11
 
9
12
  import { prettyPino } from '@voxgig/util'
10
13
 
14
+ import decircular from 'decircular'
15
+
11
16
 
12
17
  import type {
13
18
  ApiDefOptions,
@@ -18,10 +23,14 @@ import type {
18
23
  ApiModel,
19
24
  } from './types'
20
25
 
26
+
21
27
  import {
28
+ KIT,
29
+
22
30
  OpenModelShape,
23
31
  OpenBuildShape,
24
32
  OpenControlShape,
33
+ ApiDefContext,
25
34
  } from './types'
26
35
 
27
36
 
@@ -32,7 +41,6 @@ import {
32
41
 
33
42
  import {
34
43
  parse,
35
- rewrite,
36
44
  } from './parse'
37
45
 
38
46
 
@@ -47,14 +55,25 @@ import {
47
55
  } from './resolver'
48
56
 
49
57
  import {
58
+ nom,
50
59
  loadFile,
51
60
  getdlog,
61
+ makeWarner,
62
+ formatJSONIC,
63
+ writeFileSyncWarn,
64
+ relativizePath,
65
+ getModelPath,
52
66
  } from './utility'
53
67
 
68
+
54
69
  import { topTransform } from './transform/top'
55
70
  import { entityTransform } from './transform/entity'
56
71
  import { operationTransform } from './transform/operation'
72
+ import { argsTransform } from './transform/args'
73
+ import { selectTransform } from './transform/select'
57
74
  import { fieldTransform } from './transform/field'
75
+ import { flowTransform } from './transform/flow'
76
+ import { flowstepTransform } from './transform/flowstep'
58
77
  import { cleanTransform } from './transform/clean'
59
78
 
60
79
  import { makeEntityBuilder } from './builder/entity'
@@ -66,168 +85,245 @@ const dlog = getdlog('apidef', __filename)
66
85
 
67
86
  function ApiDef(opts: ApiDefOptions) {
68
87
 
69
-
70
88
  // TODO: gubu opts!
71
89
  const fs = opts.fs || Fs
72
90
  const pino = prettyPino('apidef', opts)
73
91
  const log = pino.child({ cmp: 'apidef' })
92
+ const warn = makeWarner({ point: 'warning', log })
74
93
 
75
94
  opts.strategy = opts.strategy || 'heuristic01'
76
95
 
77
-
78
96
  async function generate(spec: any): Promise<ApiDefResult> {
79
97
  const start = Date.now()
80
98
  const steps: string[] = []
81
- // dlog('start')
82
99
 
83
- const ctrl: Control = OpenControlShape(spec.ctrl || {})
84
- const model: Model = OpenModelShape(spec.model || {})
85
- const build: Build = OpenBuildShape(spec.build || {})
100
+ let ctx: ApiDefContext | undefined = undefined
101
+ let ctrl: Control | undefined = undefined
102
+ let jres: JostracaResult | undefined = undefined
86
103
 
87
- // Step: parse (API spec).
88
- if (!ctrl.step.parse) {
89
- return { ok: false, steps, start, end: Date.now(), ctrl }
90
- }
104
+ try {
105
+ ctrl = OpenControlShape(spec.ctrl || {}) as Control
106
+
107
+ const model: Model = OpenModelShape(spec.model || {})
108
+ const build: Build = OpenBuildShape(spec.build || {})
109
+
110
+ // Step: parse (API spec).
111
+ if (!ctrl.step.parse) {
112
+ return { ok: true, steps, start, end: Date.now(), ctrl }
113
+ }
91
114
 
92
- names(model, model.name)
115
+ names(model, model.name)
93
116
 
94
- const apimodel: ApiModel = {
95
- main: {
96
- api: {
97
- entity: {}
117
+ const apimodel: ApiModel = {
118
+ main: {
119
+ [KIT]: {
120
+ info: {},
121
+ entity: {},
122
+ flow: {},
123
+ },
98
124
  },
99
- def: {},
100
- },
101
- }
125
+ }
102
126
 
103
- const buildspec = build.spec
104
-
105
- let defpath = model.def
106
-
107
- // TOOD: defpath should be independently defined
108
- defpath = Path.join(buildspec.base, '..', 'def', defpath)
109
-
110
- log.info({
111
- point: 'generate-start',
112
- note: defpath.replace(process.cwd(), '.'), defpath, start
113
- })
114
-
115
- // TODO: Validate spec
116
- const ctx = {
117
- fs,
118
- log,
119
- spec,
120
- opts,
121
- util: { fixName },
122
- defpath: Path.dirname(defpath),
123
- model,
124
- apimodel,
125
- guide: {},
126
- def: undefined,
127
- note: {}
128
- }
127
+ const buildspec = build.spec
129
128
 
130
- const defsrc = loadFile(defpath, 'def', fs, log)
129
+ let defpath = model.def
131
130
 
132
- let def = await parse('OpenAPI', defsrc, { file: defpath })
131
+ // TOOD: defpath should be independently defined
132
+ defpath = Path.join(buildspec.base, '..', 'def', defpath)
133
133
 
134
- def = rewrite(def)
134
+ log.info({
135
+ point: 'generate-start',
136
+ note: relativizePath(defpath),
137
+ defpath,
138
+ start
139
+ })
135
140
 
136
- fs.writeFileSync(defpath + '.full.json', JSON.stringify(def, null, 2))
141
+ // TODO: Validate spec
142
+ ctx = {
143
+ fs,
144
+ log,
145
+ spec,
146
+ opts,
147
+ util: { fixName },
148
+ defpath: Path.dirname(defpath),
149
+ model,
150
+ apimodel,
151
+ guide: {},
152
+ def: undefined,
153
+ note: {},
154
+ warn,
155
+
156
+ // TODO: remove (moved to guide)
157
+ metrics: {
158
+ count: {
159
+ path: 0,
160
+ method: 0,
161
+ origcmprefs: {},
162
+ cmp: 0,
163
+ tag: 0,
164
+ entity: 0,
165
+ },
166
+ found: {
167
+ cmp: {},
168
+ tag: {}
169
+ }
170
+ },
137
171
 
138
- ctx.def = def
172
+ work: {}
173
+ }
139
174
 
140
- steps.push('parse')
175
+ const defsrc = loadFile(defpath, 'def', fs, log)
141
176
 
177
+ const def = await parse('OpenAPI', defsrc, { file: defpath })
178
+ const defkeys = Object.keys(def)
142
179
 
143
- // Step: guide (derive).
144
- if (!ctrl.step.guide) {
145
- return { ok: false, steps, start, end: Date.now(), ctrl }
146
- }
180
+ log.info({
181
+ point: 'root-keys',
182
+ defpath,
183
+ note: defkeys.join(', ')
184
+ })
147
185
 
148
- const guideModel = await buildGuide(ctx)
149
- ctx.guide = guideModel.guide
186
+ const safedef = decircular(def)
187
+ const fullsrc = JSON.stringify(safedef, null, 2)
150
188
 
151
- steps.push('guide')
189
+ fs.writeFileSync(defpath + '.full.json', fullsrc)
152
190
 
191
+ ctx.def = safedef
153
192
 
154
- // Step: transformers (transform spec and guide into core structures).
155
- if (!ctrl.step.transformers) {
156
- return { ok: false, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
157
- }
193
+ steps.push('parse')
158
194
 
159
- // const transformSpec = await resolveTransforms(ctx)
160
- const transforms = await resolveElements(ctx, 'transform', 'openapi', {
161
- top: topTransform,
162
- entity: entityTransform,
163
- operation: operationTransform,
164
- field: fieldTransform,
165
- clean: cleanTransform,
166
- })
195
+ // Step: guide (derive).
196
+ if (!ctrl.step.guide) {
197
+ return { ok: false, steps, start, end: Date.now(), ctrl }
198
+ }
167
199
 
168
- steps.push('transformers')
200
+ const guideModel = await buildGuide(ctx)
201
+ if (null == guideModel) {
202
+ throw new Error('Unable to build guide.')
203
+ }
169
204
 
170
- // Step: builders (build generated sub models).
171
- if (!ctrl.step.builders) {
172
- return { ok: false, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
173
- }
205
+ ctx.guide = guideModel.guide
174
206
 
175
- const builders = await resolveElements(ctx, 'builder', 'standard', {
176
- entity: makeEntityBuilder,
177
- flow: makeFlowBuilder,
178
- })
207
+ steps.push('guide')
179
208
 
180
- steps.push('builders')
181
209
 
210
+ // Step: transformers (transform spec and guide into core structures).
211
+ if (!ctrl.step.transformers) {
212
+ return { ok: true, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
213
+ }
182
214
 
183
- // Step: generate (generate model files).
184
- if (!ctrl.step.generate) {
185
- return { ok: false, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
186
- }
215
+ await topTransform(ctx)
216
+ await entityTransform(ctx)
217
+ await operationTransform(ctx)
218
+ await argsTransform(ctx)
219
+ await selectTransform(ctx)
220
+ await fieldTransform(ctx)
221
+ await flowTransform(ctx)
222
+ await flowstepTransform(ctx)
223
+ await cleanTransform(ctx)
224
+
225
+ steps.push('transformers')
226
+
227
+ // Step: builders (build generated sub models).
228
+ if (!ctrl.step.builders) {
229
+ return { ok: true, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
230
+ }
231
+
232
+ const builders = [
233
+ await makeEntityBuilder(ctx),
234
+
235
+ // TODO: move to sdkgen
236
+ await makeFlowBuilder(ctx),
237
+ ]
187
238
 
188
- const jostraca = Jostraca({
189
- now: spec.now,
190
- fs: () => fs,
191
- log,
192
- })
239
+ steps.push('builders')
193
240
 
194
- const jmodel = {}
195
241
 
196
- const root = () => Project({ folder: '.' }, async () => {
197
- for (let builder of builders) {
198
- builder()
242
+ // Step: generate (generate model files).
243
+ if (!ctrl.step.generate) {
244
+ return { ok: true, steps, start, end: Date.now(), ctrl, guide: ctx.guide }
199
245
  }
200
- })
201
-
202
- const jres = await jostraca.generate({
203
- // folder: Path.dirname(opts.folder as string),
204
- folder: opts.folder,
205
- model: jmodel,
206
- existing: { txt: { merge: true } }
207
- }, root)
208
-
209
- const dlogs = dlog.log()
210
- if (0 < dlogs.length) {
211
- for (let dlogentry of dlogs) {
212
- log.debug({ point: 'generate-warning', dlogentry, note: String(dlogentry) })
246
+
247
+ const jostraca = Jostraca({
248
+ now: spec.now,
249
+ fs: () => fs,
250
+ log,
251
+ })
252
+
253
+ const jmodel = {}
254
+
255
+ const root = () => Project({ folder: '.' }, async () => {
256
+ for (let builder of builders) {
257
+ builder()
258
+ }
259
+ })
260
+
261
+ jres = await jostraca.generate({
262
+ // folder: Path.dirname(opts.folder as string),
263
+ folder: opts.folder,
264
+ model: jmodel,
265
+ existing: { txt: { merge: true } }
266
+ }, root)
267
+
268
+ const dlogs = dlog.log()
269
+ if (0 < dlogs.length) {
270
+ for (let dlogentry of dlogs) {
271
+ log.debug({ point: 'generate-debug', dlogentry, note: String(dlogentry) })
272
+ }
213
273
  }
214
- }
215
274
 
216
- steps.push('generate')
275
+ steps.push('generate')
217
276
 
218
- log.info({ point: 'generate-end', note: 'success', break: true })
277
+ const hasWarnings = 0 < warn.history.length
278
+ const endnote =
279
+ hasWarnings ? `PARTIAL BUILD! There were ${warn.history.length} warnings (see above).` :
280
+ 'success'
281
+ log[hasWarnings ? 'warn' : 'info']({ point: 'generate-end', note: endnote, break: true })
219
282
 
220
- return {
221
- ok: true,
222
- start,
223
- end: Date.now(),
224
- steps,
225
- ctrl,
283
+ if (hasWarnings) {
284
+ writeFileSyncWarn(warn, fs, './apidef-warnings.txt',
285
+ warn.history.map(n => formatJSONIC(n)).join('\n\n'))
286
+ }
226
287
 
227
- guide: ctx.guide,
228
- apimodel,
229
- ctx,
230
- jres,
288
+ return {
289
+ ok: true,
290
+ err: null,
291
+ start,
292
+ end: Date.now(),
293
+ steps,
294
+ ctrl,
295
+ guide: ctx.guide,
296
+ apimodel: ctx.apimodel,
297
+ ctx,
298
+ jres,
299
+ }
300
+ }
301
+ catch (err: any) {
302
+ const endnote = '!! BUILD FAILED !! ' + err.message
303
+ log.error({ point: 'generate-end', err, note: endnote, break: true })
304
+
305
+ warn.history.push({
306
+ point: warn.point,
307
+ when: Date.now(),
308
+ err,
309
+ note: endnote
310
+ })
311
+
312
+ writeFileSyncWarn(warn, fs, './apidef-warnings.txt',
313
+ warn.history.map(n => formatJSONIC(n)).join('\n\n'))
314
+
315
+ return {
316
+ ok: false,
317
+ err,
318
+ start,
319
+ end: Date.now(),
320
+ steps,
321
+ ctrl,
322
+ guide: ctx?.guide,
323
+ apimodel: ctx?.apimodel,
324
+ ctx,
325
+ jres,
326
+ }
231
327
  }
232
328
  }
233
329
 
@@ -246,7 +342,7 @@ ApiDef.makeBuild = async function(opts: ApiDefOptions) {
246
342
  meta: opts.meta || {},
247
343
  }
248
344
 
249
- const build = async function(model: any, build: any, ctx: any) {
345
+ const build = async function(model: any, build: any, _ctx: any) {
250
346
 
251
347
  if (null == apidef) {
252
348
  apidef = ApiDef({
@@ -258,6 +354,7 @@ ApiDef.makeBuild = async function(opts: ApiDefOptions) {
258
354
  outprefix: opts.outprefix,
259
355
  strategy: opts.strategy,
260
356
  pino: build.log,
357
+ why: opts.why,
261
358
  })
262
359
  }
263
360
 
@@ -280,8 +377,47 @@ export type {
280
377
  ApiDefOptions,
281
378
  }
282
379
 
380
+ export type {
381
+ PathDef,
382
+ MethodDef,
383
+ ServerDef,
384
+ ServerVariableDef,
385
+ ParameterDef,
386
+ SchemaDef,
387
+ } from './def'
388
+
389
+ export type {
390
+ CmpDesc,
391
+ BasicMethodDesc,
392
+ MethodDesc,
393
+ MethodEntityDesc,
394
+ EntityDesc,
395
+ EntityPathDesc,
396
+ PathDesc,
397
+ OpDesc,
398
+ } from './desc'
399
+
400
+ export type {
401
+ OpName,
402
+ ModelEntityRelations,
403
+ ModelOpMap,
404
+ ModelFieldOp,
405
+ ModelField,
406
+ ModelArg,
407
+ ModelAlt,
408
+ ModelOp,
409
+ ModelEntity,
410
+ Model,
411
+ ModelEntityFlow,
412
+ ModelEntityFlowStep,
413
+ } from './model'
414
+
283
415
 
284
416
  export {
417
+ KIT,
285
418
  ApiDef,
286
419
  parse,
420
+ formatJSONIC,
421
+ getModelPath,
422
+ nom,
287
423
  }