@voxgig/apidef 0.3.0 → 1.0.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/bin/{run-apidef.js → voxgig-apidef} +24 -24
- package/dist/apidef.d.ts +2 -2
- package/dist/apidef.js +30 -48
- package/dist/apidef.js.map +1 -1
- package/dist/transform.js +1 -1
- package/dist/transform.js.map +1 -1
- package/package.json +7 -6
- package/src/apidef.ts +41 -57
- package/src/transform.ts +1 -1
- package/bin/run-apidef.js~ +0 -330
|
@@ -15,33 +15,35 @@ const { ApiDef } = require('../dist/apidef.js')
|
|
|
15
15
|
|
|
16
16
|
let CONSOLE = console
|
|
17
17
|
|
|
18
|
+
run()
|
|
18
19
|
|
|
19
|
-
try {
|
|
20
|
-
let options = resolveOptions()
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
async function run() {
|
|
22
|
+
try {
|
|
23
|
+
let options = resolveOptions()
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
if(options.version) {
|
|
26
|
+
version()
|
|
27
|
+
}
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
if(options.help) {
|
|
30
|
+
help()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if(options.version || options.help) {
|
|
34
|
+
exit()
|
|
35
|
+
}
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
options = validateOptions(options)
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
await generate(options)
|
|
40
|
+
}
|
|
41
|
+
catch(err) {
|
|
42
|
+
handleError(err)
|
|
43
|
+
}
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
|
|
44
|
-
|
|
45
47
|
function exit(err) {
|
|
46
48
|
let code = 0
|
|
47
49
|
if(err) {
|
|
@@ -51,7 +53,7 @@ function exit(err) {
|
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
|
|
54
|
-
function generate(options) {
|
|
56
|
+
async function generate(options) {
|
|
55
57
|
const apidef = new ApiDef({
|
|
56
58
|
debug: options.debug
|
|
57
59
|
})
|
|
@@ -64,12 +66,11 @@ function generate(options) {
|
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
if(options.watch) {
|
|
67
|
-
apidef.watch(spec)
|
|
69
|
+
await apidef.watch(spec)
|
|
68
70
|
}
|
|
69
71
|
else {
|
|
70
|
-
apidef.generate(spec)
|
|
72
|
+
await apidef.generate(spec)
|
|
71
73
|
}
|
|
72
|
-
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
|
|
@@ -159,10 +160,9 @@ function validateOptions(rawOptions) {
|
|
|
159
160
|
}
|
|
160
161
|
|
|
161
162
|
|
|
162
|
-
function handleError(err) {
|
|
163
|
+
async function handleError(err) {
|
|
163
164
|
CONSOLE.log('Voxgig API Definition Error:')
|
|
164
165
|
CONSOLE.log(err)
|
|
165
|
-
|
|
166
166
|
exit(err)
|
|
167
167
|
}
|
|
168
168
|
|
package/dist/apidef.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Pino from '
|
|
1
|
+
import { Pino } from '@voxgig/util';
|
|
2
2
|
type ApiDefOptions = {
|
|
3
3
|
fs?: any;
|
|
4
4
|
pino?: ReturnType<typeof Pino>;
|
|
@@ -22,7 +22,7 @@ declare function ApiDef(opts?: ApiDefOptions): {
|
|
|
22
22
|
def: {};
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
|
-
}>;
|
|
25
|
+
} | undefined>;
|
|
26
26
|
};
|
|
27
27
|
export type { ApiDefOptions, };
|
|
28
28
|
export { ApiDef, };
|
package/dist/apidef.js
CHANGED
|
@@ -33,23 +33,11 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
33
33
|
const openapi_core_1 = require("@redocly/openapi-core");
|
|
34
34
|
const chokidar_1 = require("chokidar");
|
|
35
35
|
const aontu_1 = require("aontu");
|
|
36
|
-
const
|
|
37
|
-
const pino_pretty_1 = __importDefault(require("pino-pretty"));
|
|
36
|
+
const util_1 = require("@voxgig/util");
|
|
38
37
|
const transform_1 = require("./transform");
|
|
39
38
|
function ApiDef(opts = {}) {
|
|
40
39
|
const fs = opts.fs || Fs;
|
|
41
|
-
|
|
42
|
-
if (null == pino) {
|
|
43
|
-
let pretty = (0, pino_pretty_1.default)({ sync: true });
|
|
44
|
-
const level = null == opts.debug ? 'info' :
|
|
45
|
-
true === opts.debug ? 'debug' :
|
|
46
|
-
'string' == typeof opts.debug ? opts.debug :
|
|
47
|
-
'info';
|
|
48
|
-
pino = (0, pino_1.default)({
|
|
49
|
-
name: 'apidef',
|
|
50
|
-
level,
|
|
51
|
-
}, pretty);
|
|
52
|
-
}
|
|
40
|
+
const pino = (0, util_1.prettyPino)('apidef', opts);
|
|
53
41
|
const log = pino.child({ cmp: 'apidef' });
|
|
54
42
|
async function watch(spec) {
|
|
55
43
|
log.info({ point: 'watch-start' });
|
|
@@ -67,7 +55,9 @@ function ApiDef(opts = {}) {
|
|
|
67
55
|
}
|
|
68
56
|
async function generate(spec) {
|
|
69
57
|
const start = Date.now();
|
|
70
|
-
|
|
58
|
+
// TODO: validate spec
|
|
59
|
+
const defpath = node_path_1.default.normalize(spec.def);
|
|
60
|
+
log.info({ point: 'generate-start', note: 'defpath', defpath, start });
|
|
71
61
|
log.debug({ point: 'generate-spec', spec });
|
|
72
62
|
// TODO: Validate spec
|
|
73
63
|
const ctx = {
|
|
@@ -76,9 +66,12 @@ function ApiDef(opts = {}) {
|
|
|
76
66
|
guide: {},
|
|
77
67
|
opts,
|
|
78
68
|
util: { fixName: transform_1.fixName },
|
|
79
|
-
defpath: node_path_1.default.dirname(
|
|
69
|
+
defpath: node_path_1.default.dirname(defpath)
|
|
80
70
|
};
|
|
81
71
|
const guide = await resolveGuide(spec, opts);
|
|
72
|
+
if (null == guide) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
82
75
|
log.debug({ point: 'guide', guide });
|
|
83
76
|
ctx.guide = guide;
|
|
84
77
|
const transformSpec = await (0, transform_1.resolveTransforms)(ctx);
|
|
@@ -88,7 +81,7 @@ function ApiDef(opts = {}) {
|
|
|
88
81
|
source = fs.readFileSync(spec.def, 'utf8');
|
|
89
82
|
}
|
|
90
83
|
catch (err) {
|
|
91
|
-
log.error({ read: 'fail', what: 'def', file:
|
|
84
|
+
log.error({ read: 'fail', what: 'def', file: defpath, err });
|
|
92
85
|
throw err;
|
|
93
86
|
}
|
|
94
87
|
const config = await (0, openapi_core_1.createConfig)({});
|
|
@@ -101,7 +94,7 @@ function ApiDef(opts = {}) {
|
|
|
101
94
|
});
|
|
102
95
|
}
|
|
103
96
|
catch (err) {
|
|
104
|
-
log.error({ parse: 'fail', what: 'openapi', file:
|
|
97
|
+
log.error({ parse: 'fail', what: 'openapi', file: defpath, err });
|
|
105
98
|
throw err;
|
|
106
99
|
}
|
|
107
100
|
const model = {
|
|
@@ -137,23 +130,7 @@ function ApiDef(opts = {}) {
|
|
|
137
130
|
let modelDefSrc = JSON.stringify(modelDef, null, 2);
|
|
138
131
|
modelDefSrc = modelDefSrc.substring(1, modelDefSrc.length - 1);
|
|
139
132
|
writeChanged('def-model', defFilePath, modelDefSrc);
|
|
140
|
-
|
|
141
|
-
let existingSrc: string = ''
|
|
142
|
-
if (fs.existsSync(defFilePath)) {
|
|
143
|
-
existingSrc = fs.readFileSync(defFilePath, 'utf8')
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
let writeModelDef = existingSrc !== modelDefSrc
|
|
147
|
-
// console.log('APIDEF', writeModelDef)
|
|
148
|
-
|
|
149
|
-
// Only write the model def if it has changed
|
|
150
|
-
if (writeModelDef) {
|
|
151
|
-
fs.writeFileSync(
|
|
152
|
-
defFilePath,
|
|
153
|
-
modelDefSrc
|
|
154
|
-
)
|
|
155
|
-
}
|
|
156
|
-
*/
|
|
133
|
+
log.info({ point: 'generate-end', note: 'success', break: true });
|
|
157
134
|
return {
|
|
158
135
|
ok: true,
|
|
159
136
|
model,
|
|
@@ -165,6 +142,7 @@ function ApiDef(opts = {}) {
|
|
|
165
142
|
let action = '';
|
|
166
143
|
try {
|
|
167
144
|
let existingContent = '';
|
|
145
|
+
path = node_path_1.default.normalize(path);
|
|
168
146
|
exists = fs.existsSync(path);
|
|
169
147
|
if (exists) {
|
|
170
148
|
action = 'read';
|
|
@@ -172,6 +150,8 @@ function ApiDef(opts = {}) {
|
|
|
172
150
|
}
|
|
173
151
|
changed = existingContent !== content;
|
|
174
152
|
log.info({
|
|
153
|
+
point: 'write-' + what,
|
|
154
|
+
note: 'changed,file',
|
|
175
155
|
write: 'file', what, skip: !changed, exists, changed,
|
|
176
156
|
contentLength: content.length, file: path
|
|
177
157
|
});
|
|
@@ -235,11 +215,21 @@ guide: control: transform: openapi: order: \`
|
|
|
235
215
|
const root = (0, aontu_1.Aontu)(src, aopts);
|
|
236
216
|
const hasErr = root.err && 0 < root.err.length;
|
|
237
217
|
if (hasErr) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
218
|
+
for (let serr of root.err) {
|
|
219
|
+
let err = new Error('Guide model: ' + serr.msg);
|
|
220
|
+
err.cause$ = [serr];
|
|
221
|
+
if ('syntax' === serr.why) {
|
|
222
|
+
err.uxmsg$ = true;
|
|
223
|
+
}
|
|
224
|
+
log.error({ fail: 'parse', point: 'guide-parse', file: path, err });
|
|
225
|
+
if (err.uxmsg$) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
err.rooterrs$ = root.err;
|
|
230
|
+
throw err;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
243
233
|
}
|
|
244
234
|
let genctx = new aontu_1.Context({ root });
|
|
245
235
|
const guide = spec.guideModel = root.gen(genctx);
|
|
@@ -255,14 +245,6 @@ guide: control: transform: openapi: order: \`
|
|
|
255
245
|
spec.guideModelPath = node_path_1.default.join(pathParts.dir, pathParts.name + '.json');
|
|
256
246
|
const updatedSrc = JSON.stringify(guide, null, 2);
|
|
257
247
|
writeChanged('guide-model', spec.guideModelPath, updatedSrc);
|
|
258
|
-
// console.log('APIDEF resolveGuide write', spec.guideModelPath, src !== updatedSrc)
|
|
259
|
-
// let existingSrc = ''
|
|
260
|
-
// if (fs.existsSync(spec.guideModelPath)) {
|
|
261
|
-
// existingSrc = fs.readFileSync(spec.guideModelPath, 'utf8')
|
|
262
|
-
// }
|
|
263
|
-
// if (existingSrc !== updatedSrc) {
|
|
264
|
-
// fs.writeFileSync(spec.guideModelPath, updatedSrc)
|
|
265
|
-
// }
|
|
266
248
|
return guide;
|
|
267
249
|
}
|
|
268
250
|
return {
|
package/dist/apidef.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":";AAAA,4CAA4C;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":"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"}
|
package/dist/transform.js
CHANGED
|
@@ -32,7 +32,7 @@ async function resolveTransforms(ctx) {
|
|
|
32
32
|
.split(/\s*,\s*/)
|
|
33
33
|
.map((t) => t.trim())
|
|
34
34
|
.filter((t) => '' != t);
|
|
35
|
-
log.info({
|
|
35
|
+
log.info({ point: 'transform', note: 'order', order: transformNames });
|
|
36
36
|
for (const tn of transformNames) {
|
|
37
37
|
log.debug({ what: 'transform', transform: tn });
|
|
38
38
|
const transform = await resolveTransform(tn, ctx);
|
package/dist/transform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":";AAAA,4CAA4C;;;;;AA6L1C,0BAAO;AACP,8CAAiB;AACjB,8CAAiB;AA5LnB,0DAA4B;AAE5B,uCAA+C;AAG/C,yCAA8C;AAC9C,+CAAoD;AACpD,qDAA0D;AAC1D,6CAAkD;AAClD,+CAAoD;AAoCpD,MAAM,SAAS,GAA8B;IAC3C,GAAG,EAAE,kBAAY;IACjB,MAAM,EAAE,wBAAe;IACvB,SAAS,EAAE,8BAAkB;IAC7B,KAAK,EAAE,sBAAc;IACrB,MAAM,EAAE,wBAAe;CACxB,CAAA;AAKD,KAAK,UAAU,iBAAiB,CAAC,GAAiB;IAChD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,GAAG,CAAA;IAErC,MAAM,KAAK,GAAkB;QAC3B,SAAS,EAAE,EAAE;KACd,CAAA;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,SAAS,CAAA;IACzB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK;SAC1D,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;IAEjC,GAAG,CAAC,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voxgig/apidef",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"main": "dist/apidef.js",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"types": "dist/apidef.d.ts",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"url": "git://github.com/voxgig/apidef.git"
|
|
17
17
|
},
|
|
18
18
|
"bin": {
|
|
19
|
-
"apidef": "bin/
|
|
19
|
+
"voxgig-apidef": "bin/voxgig-apidef"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
22
|
"test": "node --enable-source-maps --test dist-test",
|
|
@@ -41,20 +41,21 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@hapi/code": "^9.0.3",
|
|
43
43
|
"@types/js-yaml": "^4.0.9",
|
|
44
|
-
"@types/node": "22.
|
|
45
|
-
"aontu": "^0.
|
|
44
|
+
"@types/node": "22.9.0",
|
|
45
|
+
"aontu": "^0.25.0",
|
|
46
46
|
"esbuild": "^0.24.0",
|
|
47
47
|
"json-schema-to-ts": "^3.1.1",
|
|
48
48
|
"memfs": "^4.14.0",
|
|
49
49
|
"typescript": "^5.6.3"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@redocly/openapi-core": "^1.25.
|
|
52
|
+
"@redocly/openapi-core": "^1.25.11",
|
|
53
|
+
"@voxgig/util": "^0.0.4",
|
|
53
54
|
"chokidar": "^4.0.1",
|
|
54
55
|
"gubu": "^8.3.0",
|
|
55
56
|
"jostraca": "^0.7.7",
|
|
56
57
|
"pino": "^9.5.0",
|
|
57
|
-
"pino-pretty": "^
|
|
58
|
+
"pino-pretty": "^13.0.0",
|
|
58
59
|
"sonic-boom": "^4.2.0"
|
|
59
60
|
}
|
|
60
61
|
}
|
package/src/apidef.ts
CHANGED
|
@@ -7,10 +7,8 @@ import Path from 'node:path'
|
|
|
7
7
|
import { bundleFromString, createConfig } from '@redocly/openapi-core'
|
|
8
8
|
import { FSWatcher } from 'chokidar'
|
|
9
9
|
import { Aontu, Context } from 'aontu'
|
|
10
|
-
import Pino from 'pino'
|
|
11
|
-
import PinoPretty from 'pino-pretty'
|
|
12
|
-
|
|
13
10
|
|
|
11
|
+
import { prettyPino, Pino } from '@voxgig/util'
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
import {
|
|
@@ -37,23 +35,7 @@ type ApiDefSpec = {
|
|
|
37
35
|
|
|
38
36
|
function ApiDef(opts: ApiDefOptions = {}) {
|
|
39
37
|
const fs = opts.fs || Fs
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (null == pino) {
|
|
43
|
-
let pretty = PinoPretty({ sync: true })
|
|
44
|
-
const level = null == opts.debug ? 'info' :
|
|
45
|
-
true === opts.debug ? 'debug' :
|
|
46
|
-
'string' == typeof opts.debug ? opts.debug :
|
|
47
|
-
'info'
|
|
48
|
-
|
|
49
|
-
pino = Pino({
|
|
50
|
-
name: 'apidef',
|
|
51
|
-
level,
|
|
52
|
-
},
|
|
53
|
-
pretty
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
|
|
38
|
+
const pino = prettyPino('apidef', opts)
|
|
57
39
|
|
|
58
40
|
const log = pino.child({ cmp: 'apidef' })
|
|
59
41
|
|
|
@@ -82,7 +64,11 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
82
64
|
async function generate(spec: ApiDefSpec) {
|
|
83
65
|
const start = Date.now()
|
|
84
66
|
|
|
85
|
-
|
|
67
|
+
// TODO: validate spec
|
|
68
|
+
|
|
69
|
+
const defpath = Path.normalize(spec.def)
|
|
70
|
+
|
|
71
|
+
log.info({ point: 'generate-start', note: 'defpath', defpath, start })
|
|
86
72
|
log.debug({ point: 'generate-spec', spec })
|
|
87
73
|
|
|
88
74
|
// TODO: Validate spec
|
|
@@ -92,10 +78,18 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
92
78
|
guide: {},
|
|
93
79
|
opts,
|
|
94
80
|
util: { fixName },
|
|
95
|
-
defpath: Path.dirname(
|
|
81
|
+
defpath: Path.dirname(defpath)
|
|
96
82
|
}
|
|
97
83
|
|
|
84
|
+
|
|
85
|
+
|
|
98
86
|
const guide = await resolveGuide(spec, opts)
|
|
87
|
+
|
|
88
|
+
if (null == guide) {
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
99
93
|
log.debug({ point: 'guide', guide })
|
|
100
94
|
|
|
101
95
|
ctx.guide = guide
|
|
@@ -108,7 +102,7 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
108
102
|
source = fs.readFileSync(spec.def, 'utf8')
|
|
109
103
|
}
|
|
110
104
|
catch (err: any) {
|
|
111
|
-
log.error({ read: 'fail', what: 'def', file:
|
|
105
|
+
log.error({ read: 'fail', what: 'def', file: defpath, err })
|
|
112
106
|
throw err
|
|
113
107
|
}
|
|
114
108
|
|
|
@@ -124,7 +118,7 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
124
118
|
})
|
|
125
119
|
}
|
|
126
120
|
catch (err: any) {
|
|
127
|
-
log.error({ parse: 'fail', what: 'openapi', file:
|
|
121
|
+
log.error({ parse: 'fail', what: 'openapi', file: defpath, err })
|
|
128
122
|
throw err
|
|
129
123
|
}
|
|
130
124
|
|
|
@@ -171,23 +165,7 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
171
165
|
|
|
172
166
|
writeChanged('def-model', defFilePath, modelDefSrc)
|
|
173
167
|
|
|
174
|
-
|
|
175
|
-
let existingSrc: string = ''
|
|
176
|
-
if (fs.existsSync(defFilePath)) {
|
|
177
|
-
existingSrc = fs.readFileSync(defFilePath, 'utf8')
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
let writeModelDef = existingSrc !== modelDefSrc
|
|
181
|
-
// console.log('APIDEF', writeModelDef)
|
|
182
|
-
|
|
183
|
-
// Only write the model def if it has changed
|
|
184
|
-
if (writeModelDef) {
|
|
185
|
-
fs.writeFileSync(
|
|
186
|
-
defFilePath,
|
|
187
|
-
modelDefSrc
|
|
188
|
-
)
|
|
189
|
-
}
|
|
190
|
-
*/
|
|
168
|
+
log.info({ point: 'generate-end', note: 'success', break: true })
|
|
191
169
|
|
|
192
170
|
return {
|
|
193
171
|
ok: true,
|
|
@@ -203,6 +181,8 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
203
181
|
let action = ''
|
|
204
182
|
try {
|
|
205
183
|
let existingContent: string = ''
|
|
184
|
+
path = Path.normalize(path)
|
|
185
|
+
|
|
206
186
|
exists = fs.existsSync(path)
|
|
207
187
|
|
|
208
188
|
if (exists) {
|
|
@@ -213,6 +193,8 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
213
193
|
changed = existingContent !== content
|
|
214
194
|
|
|
215
195
|
log.info({
|
|
196
|
+
point: 'write-' + what,
|
|
197
|
+
note: 'changed,file',
|
|
216
198
|
write: 'file', what, skip: !changed, exists, changed,
|
|
217
199
|
contentLength: content.length, file: path
|
|
218
200
|
})
|
|
@@ -282,17 +264,29 @@ guide: control: transform: openapi: order: \`
|
|
|
282
264
|
throw err
|
|
283
265
|
}
|
|
284
266
|
|
|
285
|
-
|
|
286
267
|
const aopts = { path }
|
|
287
268
|
const root = Aontu(src, aopts)
|
|
288
269
|
const hasErr = root.err && 0 < root.err.length
|
|
289
270
|
|
|
290
271
|
if (hasErr) {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
272
|
+
for (let serr of root.err) {
|
|
273
|
+
let err: any = new Error('Guide model: ' + serr.msg)
|
|
274
|
+
err.cause$ = [serr]
|
|
275
|
+
|
|
276
|
+
if ('syntax' === serr.why) {
|
|
277
|
+
err.uxmsg$ = true
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
log.error({ fail: 'parse', point: 'guide-parse', file: path, err })
|
|
281
|
+
|
|
282
|
+
if (err.uxmsg$) {
|
|
283
|
+
return
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
err.rooterrs$ = root.err
|
|
287
|
+
throw err
|
|
288
|
+
}
|
|
289
|
+
}
|
|
296
290
|
}
|
|
297
291
|
|
|
298
292
|
let genctx = new Context({ root })
|
|
@@ -314,16 +308,6 @@ guide: control: transform: openapi: order: \`
|
|
|
314
308
|
|
|
315
309
|
writeChanged('guide-model', spec.guideModelPath, updatedSrc)
|
|
316
310
|
|
|
317
|
-
// console.log('APIDEF resolveGuide write', spec.guideModelPath, src !== updatedSrc)
|
|
318
|
-
// let existingSrc = ''
|
|
319
|
-
// if (fs.existsSync(spec.guideModelPath)) {
|
|
320
|
-
// existingSrc = fs.readFileSync(spec.guideModelPath, 'utf8')
|
|
321
|
-
// }
|
|
322
|
-
|
|
323
|
-
// if (existingSrc !== updatedSrc) {
|
|
324
|
-
// fs.writeFileSync(spec.guideModelPath, updatedSrc)
|
|
325
|
-
// }
|
|
326
|
-
|
|
327
311
|
return guide
|
|
328
312
|
}
|
|
329
313
|
|
package/src/transform.ts
CHANGED
|
@@ -71,7 +71,7 @@ async function resolveTransforms(ctx: TransformCtx): Promise<TransformSpec> {
|
|
|
71
71
|
.map((t: string) => t.trim())
|
|
72
72
|
.filter((t: string) => '' != t)
|
|
73
73
|
|
|
74
|
-
log.info({
|
|
74
|
+
log.info({ point: 'transform', note: 'order', order: transformNames })
|
|
75
75
|
|
|
76
76
|
for (const tn of transformNames) {
|
|
77
77
|
log.debug({ what: 'transform', transform: tn })
|
package/bin/run-apidef.js~
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const Path = require('node:path')
|
|
4
|
-
const { statSync } = require('node:fs')
|
|
5
|
-
const { parseArgs } = require('node:util')
|
|
6
|
-
|
|
7
|
-
const { Gubu, Fault } = require('gubu')
|
|
8
|
-
const { Aontu, Context } = require('aontu')
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const Pkg = require('../package.json')
|
|
12
|
-
|
|
13
|
-
const { CreateSdkGen } = require('../dist/create-sdkgen.js')
|
|
14
|
-
|
|
15
|
-
// const { Root } = require('../dist/standard/Root')
|
|
16
|
-
const rootpath = require.resolve('../dist/standard/Root')
|
|
17
|
-
|
|
18
|
-
let DEBUG = false
|
|
19
|
-
let CONSOLE = console
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
let options = resolveOptions()
|
|
24
|
-
|
|
25
|
-
if(options.debug) {
|
|
26
|
-
DEBUG = true
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if(options.version) {
|
|
30
|
-
version()
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if(options.help) {
|
|
34
|
-
help()
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if(options.version || options.help) {
|
|
38
|
-
exit()
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
options = validateOptions(options)
|
|
42
|
-
|
|
43
|
-
generate(options)
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
catch(err) {
|
|
47
|
-
handleError(err)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
function exit(err) {
|
|
53
|
-
let code = 0
|
|
54
|
-
if(err) {
|
|
55
|
-
code = 1
|
|
56
|
-
}
|
|
57
|
-
process.exit(code)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
function generate(options) {
|
|
62
|
-
const createSdkGen = CreateSdkGen({
|
|
63
|
-
folder: options.folder,
|
|
64
|
-
rootpath
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const model = resolveModel(options)
|
|
69
|
-
|
|
70
|
-
const spec = {
|
|
71
|
-
// TODO: move to CreateSdkGen options
|
|
72
|
-
spec: options.spec,
|
|
73
|
-
model,
|
|
74
|
-
// root: Root,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if(options.watch) {
|
|
78
|
-
spec.watch = [
|
|
79
|
-
'../tm',
|
|
80
|
-
'../feature',
|
|
81
|
-
'../def',
|
|
82
|
-
'../dist',
|
|
83
|
-
]
|
|
84
|
-
createSdkGen.watch(spec)
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
createSdkGen.generate(spec)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
function resolveModel(options) {
|
|
94
|
-
|
|
95
|
-
const typespec = `
|
|
96
|
-
name: string
|
|
97
|
-
year: number
|
|
98
|
-
def: filepath: string
|
|
99
|
-
feature: &: {
|
|
100
|
-
active: *false | boolean
|
|
101
|
-
}
|
|
102
|
-
`
|
|
103
|
-
|
|
104
|
-
const features = options.feature.map(name=>`feature:${name}:active:true`)
|
|
105
|
-
|
|
106
|
-
const src = [
|
|
107
|
-
typespec,
|
|
108
|
-
`name: ${options.name}`,
|
|
109
|
-
`year: ${new Date().getFullYear()}`,
|
|
110
|
-
`def: filepath: "${options.def || 'def.yml'}"`,
|
|
111
|
-
'' === options.model ? '' : `@"${options.model}"`,
|
|
112
|
-
...(options.set||[]),
|
|
113
|
-
...(features||[]),
|
|
114
|
-
].join('\n')
|
|
115
|
-
const aopts = {}
|
|
116
|
-
const root = Aontu(src, aopts)
|
|
117
|
-
const hasErr = root.err && 0 < root.err.length
|
|
118
|
-
|
|
119
|
-
// TODO: collect all errors
|
|
120
|
-
if (hasErr) {
|
|
121
|
-
// console.log('ERROR ROOT', root.err)
|
|
122
|
-
throw root.err[0].msg
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
let genctx = new Context({ root })
|
|
126
|
-
const model = root.gen(genctx)
|
|
127
|
-
|
|
128
|
-
// TODO: collect all errors
|
|
129
|
-
if (genctx.err && 0 < genctx.err.length) {
|
|
130
|
-
// console.log(genctx.err)
|
|
131
|
-
// console.log('ERROR GEN', genctx.err)
|
|
132
|
-
throw new Error(JSON.stringify(genctx.err[0]))
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
model.def.filename = Path.basename(model.def.filepath)
|
|
136
|
-
|
|
137
|
-
// console.log('MODEL')
|
|
138
|
-
// console.dir(model,{depth:null})
|
|
139
|
-
|
|
140
|
-
return model
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
function resolveOptions() {
|
|
145
|
-
|
|
146
|
-
const args = parseArgs({
|
|
147
|
-
allowPositionals: true,
|
|
148
|
-
options: {
|
|
149
|
-
folder: {
|
|
150
|
-
type: 'string',
|
|
151
|
-
short: 'f',
|
|
152
|
-
default: '',
|
|
153
|
-
},
|
|
154
|
-
|
|
155
|
-
def: {
|
|
156
|
-
type: 'string',
|
|
157
|
-
short: 'd',
|
|
158
|
-
default: '',
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
set: {
|
|
162
|
-
type: 'string',
|
|
163
|
-
short: 's',
|
|
164
|
-
multiple: true,
|
|
165
|
-
},
|
|
166
|
-
|
|
167
|
-
model: {
|
|
168
|
-
type: 'string',
|
|
169
|
-
short: 'm',
|
|
170
|
-
default: '',
|
|
171
|
-
},
|
|
172
|
-
|
|
173
|
-
feature: {
|
|
174
|
-
type: 'string',
|
|
175
|
-
short: 't',
|
|
176
|
-
multiple: true,
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
watch: {
|
|
180
|
-
type: 'boolean',
|
|
181
|
-
short: 'w',
|
|
182
|
-
},
|
|
183
|
-
|
|
184
|
-
debug: {
|
|
185
|
-
type: 'boolean',
|
|
186
|
-
short: 'g',
|
|
187
|
-
},
|
|
188
|
-
|
|
189
|
-
help: {
|
|
190
|
-
type: 'boolean',
|
|
191
|
-
short: 'h',
|
|
192
|
-
},
|
|
193
|
-
|
|
194
|
-
version: {
|
|
195
|
-
type: 'boolean',
|
|
196
|
-
short: 'v',
|
|
197
|
-
},
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
const options = {
|
|
203
|
-
name: args.positionals[0],
|
|
204
|
-
folder: '' === args.values.folder ? args.positionals[0] : args.values.folder,
|
|
205
|
-
def: args.values.def,
|
|
206
|
-
model: args.values.model,
|
|
207
|
-
feature: args.values.feature,
|
|
208
|
-
set: args.values.set,
|
|
209
|
-
watch: !!args.values.watch,
|
|
210
|
-
debug: !!args.values.debug,
|
|
211
|
-
help: !!args.values.help,
|
|
212
|
-
version: !!args.values.version,
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return options
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
function validateOptions(rawOptions) {
|
|
220
|
-
const optShape = Gubu({
|
|
221
|
-
name: Fault('The first argument should be the project name.', String),
|
|
222
|
-
folder: String,
|
|
223
|
-
def: '',
|
|
224
|
-
model: '',
|
|
225
|
-
feature: [String],
|
|
226
|
-
set: [String],
|
|
227
|
-
watch: Boolean,
|
|
228
|
-
debug: Boolean,
|
|
229
|
-
help: Boolean,
|
|
230
|
-
version: Boolean,
|
|
231
|
-
})
|
|
232
|
-
|
|
233
|
-
const err = []
|
|
234
|
-
const options = optShape(rawOptions,{err})
|
|
235
|
-
|
|
236
|
-
if(err[0]) {
|
|
237
|
-
throw new Error(err[0].text)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
if('' !== options.def) {
|
|
241
|
-
options.def = Path.resolve(options.def)
|
|
242
|
-
const stat = statSync(options.def, {throwIfNoEntry:false})
|
|
243
|
-
if(null == stat) {
|
|
244
|
-
throw new Error('Definition file not found: '+options.def)
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if('' !== options.model) {
|
|
249
|
-
options.model = Path.resolve(options.model)
|
|
250
|
-
const stat = statSync(options.model, {throwIfNoEntry:false})
|
|
251
|
-
if(null == stat) {
|
|
252
|
-
throw new Error('Model file not found: '+options.model)
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return options
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
function handleError(err) {
|
|
261
|
-
CONSOLE.log('Voxgig SDK Generator Error:')
|
|
262
|
-
|
|
263
|
-
if(DEBUG) {
|
|
264
|
-
CONSOLE.log(err)
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
CONSOLE.log(err.message)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
exit(err)
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
function version() {
|
|
275
|
-
CONSOLE.log(Pkg.version)
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
function help() {
|
|
280
|
-
let s = `
|
|
281
|
-
Create a Voxgig SDK Generator project.
|
|
282
|
-
|
|
283
|
-
Usage: npm create @voxgig/sdkgen@latest <name> <args>
|
|
284
|
-
|
|
285
|
-
where <name> is the name of the SDK project. This is also used to
|
|
286
|
-
create a project folder if one is not explictly defined using the -f
|
|
287
|
-
argument. If run against an existing folder generated files will be
|
|
288
|
-
overwritten.
|
|
289
|
-
|
|
290
|
-
<args> are the command arguments:
|
|
291
|
-
|
|
292
|
-
--folder <folder> Specific the folder for the SDK project. Optional.
|
|
293
|
-
-f <folder> Default: <name> in current folder.
|
|
294
|
-
|
|
295
|
-
--def <file> Specify the API definition file (OpenAPI, Swagger, etc)
|
|
296
|
-
-d that defines the SDK. Optional.
|
|
297
|
-
|
|
298
|
-
--model <file> Specify the SDK model file to customize the SDK. Optional.
|
|
299
|
-
-m
|
|
300
|
-
|
|
301
|
-
--watch Run in watch mode. The SDK project will be updated if any of the
|
|
302
|
-
-w project inputs (such as the spec file) change.
|
|
303
|
-
|
|
304
|
-
--debug Print verbose logging.
|
|
305
|
-
-d
|
|
306
|
-
|
|
307
|
-
--help Print this help message.
|
|
308
|
-
-h
|
|
309
|
-
|
|
310
|
-
--version Print version number.
|
|
311
|
-
-v
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
Examples:
|
|
315
|
-
|
|
316
|
-
# Basic usage
|
|
317
|
-
> npm create @voxgig/sdkgen@latest foo
|
|
318
|
-
# Creates the SDK Project in the folder ./foo
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
# Custom project folder
|
|
322
|
-
> npm create @voxgig/sdkgen@latest foo -f ~/Projects/Foo
|
|
323
|
-
# Creates the SDK Project in the folder ~/Projects/Foo
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
See also: https://voxgig.com/sdkgen
|
|
327
|
-
`
|
|
328
|
-
|
|
329
|
-
CONSOLE.log(s)
|
|
330
|
-
}
|