@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.
- package/dist/apidef.d.ts +7 -2
- package/dist/apidef.js +190 -114
- package/dist/apidef.js.map +1 -1
- package/dist/builder/entity/entity.d.ts +3 -0
- package/dist/builder/entity/{apiEntity.js → entity.js} +12 -9
- package/dist/builder/entity/entity.js.map +1 -0
- package/dist/builder/entity/info.d.ts +3 -0
- package/dist/builder/entity/info.js +22 -0
- package/dist/builder/entity/info.js.map +1 -0
- package/dist/builder/entity.js +7 -21
- package/dist/builder/entity.js.map +1 -1
- package/dist/builder/flow/flowHeuristic01.js +21 -11
- package/dist/builder/flow/flowHeuristic01.js.map +1 -1
- package/dist/builder/flow.d.ts +2 -1
- package/dist/builder/flow.js +39 -12
- package/dist/builder/flow.js.map +1 -1
- package/dist/def.d.ts +62 -0
- package/dist/def.js +4 -0
- package/dist/def.js.map +1 -0
- package/dist/desc.d.ts +87 -0
- package/dist/desc.js +4 -0
- package/dist/desc.js.map +1 -0
- package/dist/guide/guide.d.ts +2 -1
- package/dist/guide/guide.js +161 -30
- package/dist/guide/guide.js.map +1 -1
- package/dist/guide/heuristic01.d.ts +2 -1
- package/dist/guide/heuristic01.js +1122 -234
- package/dist/guide/heuristic01.js.map +1 -1
- package/dist/model.d.ts +90 -0
- package/dist/model.js +4 -0
- package/dist/model.js.map +1 -0
- package/dist/parse.d.ts +4 -3
- package/dist/parse.js +40 -46
- package/dist/parse.js.map +1 -1
- package/dist/resolver.js +2 -1
- package/dist/resolver.js.map +1 -1
- package/dist/transform/args.d.ts +3 -0
- package/dist/transform/args.js +54 -0
- package/dist/transform/args.js.map +1 -0
- package/dist/transform/clean.d.ts +2 -2
- package/dist/transform/clean.js +28 -3
- package/dist/transform/clean.js.map +1 -1
- package/dist/transform/entity.d.ts +9 -1
- package/dist/transform/entity.js +57 -41
- package/dist/transform/entity.js.map +1 -1
- package/dist/transform/field.d.ts +1 -1
- package/dist/transform/field.js +89 -65
- package/dist/transform/field.js.map +1 -1
- package/dist/transform/flow.d.ts +3 -0
- package/dist/transform/flow.js +26 -0
- package/dist/transform/flow.js.map +1 -0
- package/dist/transform/flowstep.d.ts +3 -0
- package/dist/transform/flowstep.js +145 -0
- package/dist/transform/flowstep.js.map +1 -0
- package/dist/transform/operation.d.ts +3 -3
- package/dist/transform/operation.js +101 -296
- package/dist/transform/operation.js.map +1 -1
- package/dist/transform/select.d.ts +3 -0
- package/dist/transform/select.js +65 -0
- package/dist/transform/select.js.map +1 -0
- package/dist/transform/top.js +24 -2
- package/dist/transform/top.js.map +1 -1
- package/dist/transform.d.ts +1 -1
- package/dist/transform.js +4 -0
- package/dist/transform.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +115 -14
- package/dist/types.js +4 -2
- package/dist/types.js.map +1 -1
- package/dist/utility.d.ts +34 -2
- package/dist/utility.js +444 -6
- package/dist/utility.js.map +1 -1
- package/model/apidef.jsonic +76 -1
- package/model/guide.jsonic +14 -44
- package/package.json +19 -16
- package/src/apidef.ts +258 -122
- package/src/builder/entity/{apiEntity.ts → entity.ts} +18 -11
- package/src/builder/entity/info.ts +53 -0
- package/src/builder/entity.ts +9 -35
- package/src/builder/flow/flowHeuristic01.ts +46 -12
- package/src/builder/flow.ts +54 -13
- package/src/def.ts +91 -0
- package/src/desc.ts +154 -0
- package/src/guide/guide.ts +208 -134
- package/src/guide/heuristic01.ts +1653 -272
- package/src/model.ts +143 -0
- package/src/parse.ts +50 -59
- package/src/resolver.ts +3 -1
- package/src/schematron.ts.off +317 -0
- package/src/transform/args.ts +98 -0
- package/src/transform/clean.ts +45 -11
- package/src/transform/entity.ts +96 -50
- package/src/transform/field.ts +136 -75
- package/src/transform/flow.ts +59 -0
- package/src/transform/flowstep.ts +242 -0
- package/src/transform/operation.ts +119 -419
- package/src/transform/select.ts +119 -0
- package/src/transform/top.ts +46 -4
- package/src/transform.ts +8 -4
- package/src/types.ts +181 -5
- package/src/utility.ts +567 -9
- package/dist/builder/entity/apiEntity.d.ts +0 -3
- package/dist/builder/entity/apiEntity.js.map +0 -1
- package/dist/builder/entity/def.d.ts +0 -3
- package/dist/builder/entity/def.js +0 -19
- package/dist/builder/entity/def.js.map +0 -1
- package/src/builder/entity/def.ts +0 -44
- package/src/guide.ts.off +0 -136
package/model/guide.jsonic
CHANGED
|
@@ -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
|
-
|
|
3
|
+
active?: boolean
|
|
4
|
+
name: key()
|
|
5
|
+
|
|
39
6
|
path: &: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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": "
|
|
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
|
|
11
|
-
"
|
|
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=\"$
|
|
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": "
|
|
45
|
+
"@types/node": "25.2.3",
|
|
44
46
|
"json-schema-to-ts": "^3.1.1",
|
|
45
|
-
"typescript": "^5.9.
|
|
47
|
+
"typescript": "^5.9.3"
|
|
46
48
|
},
|
|
47
49
|
"peerDependencies": {
|
|
48
|
-
"aontu": ">=0.
|
|
49
|
-
"memfs": ">=4.
|
|
50
|
+
"aontu": ">=0.35.2",
|
|
51
|
+
"memfs": ">=4.56.10"
|
|
50
52
|
},
|
|
51
53
|
"dependencies": {
|
|
52
|
-
"@redocly/openapi-core": "1.34.
|
|
54
|
+
"@redocly/openapi-core": "1.34.6",
|
|
53
55
|
"@voxgig/struct": "^0.0.9",
|
|
54
|
-
"@voxgig/util": "^0.2.
|
|
55
|
-
"chokidar": "^
|
|
56
|
-
"
|
|
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.
|
|
59
|
-
"
|
|
60
|
-
"pino
|
|
61
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
let ctx: ApiDefContext | undefined = undefined
|
|
101
|
+
let ctrl: Control | undefined = undefined
|
|
102
|
+
let jres: JostracaResult | undefined = undefined
|
|
86
103
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
115
|
+
names(model, model.name)
|
|
93
116
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
117
|
+
const apimodel: ApiModel = {
|
|
118
|
+
main: {
|
|
119
|
+
[KIT]: {
|
|
120
|
+
info: {},
|
|
121
|
+
entity: {},
|
|
122
|
+
flow: {},
|
|
123
|
+
},
|
|
98
124
|
},
|
|
99
|
-
|
|
100
|
-
},
|
|
101
|
-
}
|
|
125
|
+
}
|
|
102
126
|
|
|
103
|
-
|
|
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
|
-
|
|
129
|
+
let defpath = model.def
|
|
131
130
|
|
|
132
|
-
|
|
131
|
+
// TOOD: defpath should be independently defined
|
|
132
|
+
defpath = Path.join(buildspec.base, '..', 'def', defpath)
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
log.info({
|
|
135
|
+
point: 'generate-start',
|
|
136
|
+
note: relativizePath(defpath),
|
|
137
|
+
defpath,
|
|
138
|
+
start
|
|
139
|
+
})
|
|
135
140
|
|
|
136
|
-
|
|
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
|
-
|
|
172
|
+
work: {}
|
|
173
|
+
}
|
|
139
174
|
|
|
140
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
180
|
+
log.info({
|
|
181
|
+
point: 'root-keys',
|
|
182
|
+
defpath,
|
|
183
|
+
note: defkeys.join(', ')
|
|
184
|
+
})
|
|
147
185
|
|
|
148
|
-
|
|
149
|
-
|
|
186
|
+
const safedef = decircular(def)
|
|
187
|
+
const fullsrc = JSON.stringify(safedef, null, 2)
|
|
150
188
|
|
|
151
|
-
|
|
189
|
+
fs.writeFileSync(defpath + '.full.json', fullsrc)
|
|
152
190
|
|
|
191
|
+
ctx.def = safedef
|
|
153
192
|
|
|
154
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
200
|
+
const guideModel = await buildGuide(ctx)
|
|
201
|
+
if (null == guideModel) {
|
|
202
|
+
throw new Error('Unable to build guide.')
|
|
203
|
+
}
|
|
169
204
|
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
-
|
|
189
|
-
now: spec.now,
|
|
190
|
-
fs: () => fs,
|
|
191
|
-
log,
|
|
192
|
-
})
|
|
239
|
+
steps.push('builders')
|
|
193
240
|
|
|
194
|
-
const jmodel = {}
|
|
195
241
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
275
|
+
steps.push('generate')
|
|
217
276
|
|
|
218
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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,
|
|
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
|
}
|