@voxgig/apidef 1.9.0 → 2.0.2
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 +3 -29
- package/dist/apidef.js +65 -186
- package/dist/apidef.js.map +1 -1
- package/dist/builder/entity/apiEntity.d.ts +3 -0
- package/dist/builder/entity/apiEntity.js +51 -0
- package/dist/builder/entity/apiEntity.js.map +1 -0
- package/dist/builder/entity/def.d.ts +3 -0
- package/dist/builder/entity/def.js +19 -0
- package/dist/builder/entity/def.js.map +1 -0
- package/dist/builder/entity.d.ts +2 -0
- package/dist/builder/entity.js +30 -0
- package/dist/builder/entity.js.map +1 -0
- package/dist/builder/flow/flowHeuristic01.d.ts +2 -0
- package/dist/builder/flow/flowHeuristic01.js +153 -0
- package/dist/builder/flow/flowHeuristic01.js.map +1 -0
- package/dist/builder/flow.d.ts +2 -0
- package/dist/builder/flow.js +41 -0
- package/dist/builder/flow.js.map +1 -0
- package/dist/guide/heuristic01.d.ts +2 -0
- package/dist/guide/heuristic01.js +119 -0
- package/dist/guide/heuristic01.js.map +1 -0
- package/dist/guide.d.ts +2 -0
- package/dist/guide.js +60 -0
- package/dist/guide.js.map +1 -0
- package/dist/parse.d.ts +1 -1
- package/dist/parse.js +5 -4
- package/dist/parse.js.map +1 -1
- package/dist/resolver.d.ts +2 -0
- package/dist/resolver.js +62 -0
- package/dist/resolver.js.map +1 -0
- package/dist/transform/entity.js +25 -4
- package/dist/transform/entity.js.map +1 -1
- package/dist/transform/field.js +4 -84
- package/dist/transform/field.js.map +1 -1
- package/dist/transform/operation.d.ts +2 -2
- package/dist/transform/operation.js +60 -30
- package/dist/transform/operation.js.map +1 -1
- package/dist/transform/top.d.ts +2 -2
- package/dist/transform/top.js +5 -4
- package/dist/transform/top.js.map +1 -1
- package/dist/transform.d.ts +1 -1
- package/dist/transform.js +20 -10
- package/dist/transform.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +691 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/dist/utility.d.ts +5 -0
- package/dist/utility.js +84 -0
- package/dist/utility.js.map +1 -0
- package/model/apidef.jsonic +28 -24
- package/package.json +9 -7
- package/src/apidef.ts +94 -271
- package/src/builder/entity/apiEntity.ts +88 -0
- package/src/builder/entity/def.ts +44 -0
- package/src/builder/entity.ts +54 -0
- package/src/builder/flow/flowHeuristic01.ts +200 -0
- package/src/builder/flow.ts +61 -0
- package/src/guide/heuristic01.ts +178 -0
- package/src/guide.ts +87 -0
- package/src/parse.ts +6 -4
- package/src/resolver.ts +91 -0
- package/src/transform/entity.ts +36 -10
- package/src/transform/field.ts +9 -92
- package/src/transform/operation.ts +112 -46
- package/src/transform/top.ts +11 -9
- package/src/transform.ts +22 -11
- package/src/types.ts +89 -0
- package/src/utility.ts +161 -0
- package/dist/transform/manual.d.ts +0 -3
- package/dist/transform/manual.js +0 -12
- package/dist/transform/manual.js.map +0 -1
- package/src/transform/manual.ts +0 -29
package/dist/apidef.d.ts
CHANGED
|
@@ -1,36 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
def?: string;
|
|
4
|
-
fs?: any;
|
|
5
|
-
pino?: ReturnType<typeof Pino>;
|
|
6
|
-
debug?: boolean | string;
|
|
7
|
-
folder?: string;
|
|
8
|
-
meta?: Record<string, any>;
|
|
9
|
-
outprefix?: string;
|
|
10
|
-
};
|
|
11
|
-
type ApiModel = {
|
|
12
|
-
main: {
|
|
13
|
-
api: {
|
|
14
|
-
entity: Record<string, any>;
|
|
15
|
-
};
|
|
16
|
-
def: Record<string, any>;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
1
|
+
import type { ApiDefOptions, ApiModel } from './types';
|
|
2
|
+
import { parse } from './parse';
|
|
19
3
|
declare function ApiDef(opts: ApiDefOptions): {
|
|
20
4
|
generate: (spec: any) => Promise<{
|
|
21
|
-
ok: boolean;
|
|
22
|
-
name: string;
|
|
23
|
-
processResult: {
|
|
24
|
-
ok: boolean;
|
|
25
|
-
msg: string;
|
|
26
|
-
results: import("./transform").TransformResult[];
|
|
27
|
-
};
|
|
28
|
-
apimodel?: undefined;
|
|
29
|
-
} | {
|
|
30
5
|
ok: boolean;
|
|
31
6
|
name: string;
|
|
32
7
|
apimodel: ApiModel;
|
|
33
|
-
processResult?: undefined;
|
|
34
8
|
}>;
|
|
35
9
|
};
|
|
36
10
|
declare namespace ApiDef {
|
|
@@ -40,4 +14,4 @@ declare namespace ApiDef {
|
|
|
40
14
|
}>;
|
|
41
15
|
}
|
|
42
16
|
export type { ApiDefOptions, };
|
|
43
|
-
export { ApiDef, };
|
|
17
|
+
export { ApiDef, parse, };
|
package/dist/apidef.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* Copyright (c) 2024 Voxgig, MIT License */
|
|
2
|
+
/* Copyright (c) 2024-2025 Voxgig, MIT License */
|
|
3
3
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
4
|
if (k2 === undefined) k2 = k;
|
|
5
5
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -37,50 +37,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
38
|
};
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.parse = void 0;
|
|
40
41
|
exports.ApiDef = ApiDef;
|
|
41
42
|
const Fs = __importStar(require("node:fs"));
|
|
42
43
|
const node_path_1 = __importDefault(require("node:path"));
|
|
43
|
-
const node_util_1 = require("node:util");
|
|
44
|
-
const openapi_core_1 = require("@redocly/openapi-core");
|
|
45
|
-
const gubu_1 = require("gubu");
|
|
46
44
|
const jostraca_1 = require("jostraca");
|
|
47
45
|
const util_1 = require("@voxgig/util");
|
|
46
|
+
const types_1 = require("./types");
|
|
47
|
+
const guide_1 = require("./guide");
|
|
48
|
+
const parse_1 = require("./parse");
|
|
49
|
+
Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parse_1.parse; } });
|
|
48
50
|
const transform_1 = require("./transform");
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const OpenModelShape = (0, gubu_1.Gubu)((0, gubu_1.Open)(ModelShape));
|
|
58
|
-
const BuildShape = (0, gubu_1.Gubu)({
|
|
59
|
-
spec: {
|
|
60
|
-
base: '',
|
|
61
|
-
path: '',
|
|
62
|
-
debug: '',
|
|
63
|
-
use: {},
|
|
64
|
-
res: [],
|
|
65
|
-
require: '',
|
|
66
|
-
log: {},
|
|
67
|
-
fs: (0, gubu_1.Any)(),
|
|
68
|
-
watch: {
|
|
69
|
-
mod: true,
|
|
70
|
-
add: true,
|
|
71
|
-
rem: true,
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
const OpenBuildShape = (0, gubu_1.Gubu)((0, gubu_1.Open)(BuildShape));
|
|
51
|
+
const resolver_1 = require("./resolver");
|
|
52
|
+
const utility_1 = require("./utility");
|
|
53
|
+
const top_1 = require("./transform/top");
|
|
54
|
+
const entity_1 = require("./transform/entity");
|
|
55
|
+
const operation_1 = require("./transform/operation");
|
|
56
|
+
const field_1 = require("./transform/field");
|
|
57
|
+
const entity_2 = require("./builder/entity");
|
|
58
|
+
const flow_1 = require("./builder/flow");
|
|
76
59
|
function ApiDef(opts) {
|
|
60
|
+
// TODO: gubu opts!
|
|
77
61
|
const fs = opts.fs || Fs;
|
|
78
62
|
const pino = (0, util_1.prettyPino)('apidef', opts);
|
|
79
63
|
const log = pino.child({ cmp: 'apidef' });
|
|
64
|
+
opts.strategy = opts.strategy || 'heuristic01';
|
|
80
65
|
async function generate(spec) {
|
|
81
66
|
const start = Date.now();
|
|
82
|
-
const model = OpenModelShape(spec.model);
|
|
83
|
-
const build = OpenBuildShape(spec.build);
|
|
67
|
+
const model = (0, types_1.OpenModelShape)(spec.model);
|
|
68
|
+
const build = (0, types_1.OpenBuildShape)(spec.build);
|
|
69
|
+
(0, jostraca_1.names)(model, model.name);
|
|
70
|
+
const apimodel = {
|
|
71
|
+
main: {
|
|
72
|
+
api: {
|
|
73
|
+
entity: {}
|
|
74
|
+
},
|
|
75
|
+
def: {},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
84
78
|
const buildspec = build.spec;
|
|
85
79
|
let defpath = model.def;
|
|
86
80
|
// TOOD: defpath should be independently defined
|
|
@@ -91,61 +85,51 @@ function ApiDef(opts) {
|
|
|
91
85
|
});
|
|
92
86
|
// TODO: Validate spec
|
|
93
87
|
const ctx = {
|
|
88
|
+
fs,
|
|
94
89
|
log,
|
|
95
90
|
spec,
|
|
96
91
|
opts,
|
|
97
92
|
util: { fixName: transform_1.fixName },
|
|
98
93
|
defpath: node_path_1.default.dirname(defpath),
|
|
99
94
|
model,
|
|
95
|
+
apimodel,
|
|
96
|
+
def: undefined
|
|
100
97
|
};
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
const defsrc = (0, utility_1.loadFile)(defpath, 'def', fs, log);
|
|
99
|
+
const def = await (0, parse_1.parse)('OpenAPI', defsrc, { file: defpath });
|
|
100
|
+
ctx.def = def;
|
|
101
|
+
const guideBuilder = await (0, guide_1.resolveGuide)(ctx);
|
|
102
|
+
// const transformSpec = await resolveTransforms(ctx)
|
|
103
|
+
const transforms = await (0, resolver_1.resolveElements)(ctx, 'transform', 'openapi', {
|
|
104
|
+
top: top_1.topTransform,
|
|
105
|
+
entity: entity_1.entityTransform,
|
|
106
|
+
operation: operation_1.operationTransform,
|
|
107
|
+
field: field_1.fieldTransform,
|
|
105
108
|
});
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
entity: {}
|
|
131
|
-
},
|
|
132
|
-
def: {},
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
const def = bundle.bundle.parsed;
|
|
136
|
-
const processResult = await (0, transform_1.processTransforms)(ctx, transformSpec, apimodel, def);
|
|
137
|
-
if (!processResult.ok) {
|
|
138
|
-
log.error({
|
|
139
|
-
fail: 'process', point: 'transform-result',
|
|
140
|
-
result: processResult, note: processResult.msg,
|
|
141
|
-
err: processResult.results[0]?.err
|
|
142
|
-
});
|
|
143
|
-
return { ok: false, name: 'apidef', processResult };
|
|
144
|
-
}
|
|
145
|
-
const modelPath = node_path_1.default.normalize(spec.config.model);
|
|
146
|
-
buildModel_api(apimodel, modelPath);
|
|
147
|
-
buildModel_def(apimodel, modelPath);
|
|
148
|
-
buildModel_entity(apimodel, modelPath);
|
|
109
|
+
const builders = await (0, resolver_1.resolveElements)(ctx, 'builder', 'standard', {
|
|
110
|
+
entity: entity_2.makeEntityBuilder,
|
|
111
|
+
flow: flow_1.makeFlowBuilder,
|
|
112
|
+
});
|
|
113
|
+
const jostraca = (0, jostraca_1.Jostraca)({
|
|
114
|
+
now: spec.now,
|
|
115
|
+
fs: () => fs,
|
|
116
|
+
log,
|
|
117
|
+
});
|
|
118
|
+
const jmodel = {};
|
|
119
|
+
const root = () => (0, jostraca_1.Project)({ folder: '.' }, async () => {
|
|
120
|
+
guideBuilder();
|
|
121
|
+
// entityBuilder()
|
|
122
|
+
// flowBuilder()
|
|
123
|
+
for (let builder of builders) {
|
|
124
|
+
builder();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const jres = await jostraca.generate({
|
|
128
|
+
// folder: Path.dirname(opts.folder as string),
|
|
129
|
+
folder: opts.folder,
|
|
130
|
+
model: jmodel,
|
|
131
|
+
existing: { txt: { merge: true } }
|
|
132
|
+
}, root);
|
|
149
133
|
log.info({ point: 'generate-end', note: 'success', break: true });
|
|
150
134
|
return {
|
|
151
135
|
ok: true,
|
|
@@ -153,102 +137,16 @@ function ApiDef(opts) {
|
|
|
153
137
|
apimodel,
|
|
154
138
|
};
|
|
155
139
|
}
|
|
156
|
-
function buildModel_api(apimodel, modelPath) {
|
|
157
|
-
const modelapi = { main: { api: apimodel.main.api } };
|
|
158
|
-
let modelSrc = JSON.stringify(modelapi, null, 2);
|
|
159
|
-
modelSrc =
|
|
160
|
-
'# GENERATED FILE - DO NOT EDIT\n\n' +
|
|
161
|
-
modelSrc.substring(1, modelSrc.length - 1).replace(/\n /g, '\n');
|
|
162
|
-
writeChanged('api-model', modelPath, modelSrc);
|
|
163
|
-
return modelPath;
|
|
164
|
-
}
|
|
165
|
-
function buildModel_def(apimodel, modelPath) {
|
|
166
|
-
const modelBasePath = node_path_1.default.dirname(modelPath);
|
|
167
|
-
const defFilePath = node_path_1.default.join(modelBasePath, (null == opts.outprefix ? '' : opts.outprefix) + 'def-generated.jsonic');
|
|
168
|
-
const modelDef = { main: { def: apimodel.main.def } };
|
|
169
|
-
let modelDefSrc = JSON.stringify(modelDef, null, 2);
|
|
170
|
-
modelDefSrc =
|
|
171
|
-
'# GENERATED FILE - DO NOT EDIT\n\n' +
|
|
172
|
-
modelDefSrc.substring(1, modelDefSrc.length - 1).replace(/\n /g, '\n');
|
|
173
|
-
writeChanged('def-model', defFilePath, modelDefSrc);
|
|
174
|
-
}
|
|
175
|
-
function buildModel_entity(apimodel, modelPath) {
|
|
176
|
-
const modelBasePath = node_path_1.default.dirname(modelPath);
|
|
177
|
-
const entityIncludes = [];
|
|
178
|
-
(0, jostraca_1.each)(apimodel.main.api.entity, ((entity) => {
|
|
179
|
-
entityIncludes.push(entity.name);
|
|
180
|
-
// HEURISTIC: id may be name_id or nameId
|
|
181
|
-
const fieldAliases = (0, jostraca_1.each)(entity.op, (op) => (0, jostraca_1.each)(op.param))
|
|
182
|
-
.flat()
|
|
183
|
-
.reduce((a, p) => (entity.field[p.keys] ? null :
|
|
184
|
-
(p.key$.toLowerCase().includes(entity.name) ?
|
|
185
|
-
(a[p.key$] = 'id', a.id = p.key$) :
|
|
186
|
-
null)
|
|
187
|
-
, a), {});
|
|
188
|
-
const fieldAliasesSrc = JSON.stringify(fieldAliases, null, 2)
|
|
189
|
-
.replace(/\n/g, '\n ');
|
|
190
|
-
const entityFileSrc = `
|
|
191
|
-
# Entity ${entity.name}
|
|
192
|
-
|
|
193
|
-
main: sdk: entity: ${entity.name}: {
|
|
194
|
-
alias: field: ${fieldAliasesSrc}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
`;
|
|
198
|
-
const entityFilePath = node_path_1.default.join(modelBasePath, 'entity', (null == opts.outprefix ? '' : opts.outprefix) + entity.name + '.jsonic');
|
|
199
|
-
fs.mkdirSync(node_path_1.default.dirname(entityFilePath), { recursive: true });
|
|
200
|
-
// TODO: diff merge
|
|
201
|
-
writeChanged('entity-model', entityFilePath, entityFileSrc, { update: false });
|
|
202
|
-
}));
|
|
203
|
-
modifyModel(fs, node_path_1.default.join(modelBasePath, (null == opts.outprefix ? '' : opts.outprefix) + 'sdk.jsonic'), entityIncludes);
|
|
204
|
-
}
|
|
205
|
-
function writeChanged(point, path, content, flags) {
|
|
206
|
-
let exists = false;
|
|
207
|
-
let changed = false;
|
|
208
|
-
flags = flags || {};
|
|
209
|
-
flags.update = null == flags.update ? true : !!flags.update;
|
|
210
|
-
let action = '';
|
|
211
|
-
try {
|
|
212
|
-
let existingContent = '';
|
|
213
|
-
path = node_path_1.default.normalize(path);
|
|
214
|
-
exists = fs.existsSync(path);
|
|
215
|
-
if (exists) {
|
|
216
|
-
action = 'read';
|
|
217
|
-
existingContent = fs.readFileSync(path, 'utf8');
|
|
218
|
-
}
|
|
219
|
-
changed = existingContent !== content;
|
|
220
|
-
action = flags.update ? 'write' : 'skip';
|
|
221
|
-
log.info({
|
|
222
|
-
point: 'write-' + point,
|
|
223
|
-
note: (changed ? '' : 'not-') + 'changed ' + path,
|
|
224
|
-
write: 'file', skip: !changed, exists, changed,
|
|
225
|
-
contentLength: content.length, file: path
|
|
226
|
-
});
|
|
227
|
-
if (!exists || (changed && flags.update)) {
|
|
228
|
-
fs.writeFileSync(path, content);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
catch (err) {
|
|
232
|
-
log.error({
|
|
233
|
-
fail: action, point, file: path, exists, changed,
|
|
234
|
-
contentLength: content.length, err
|
|
235
|
-
});
|
|
236
|
-
err.__logged__ = true;
|
|
237
|
-
throw err;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
140
|
return {
|
|
241
141
|
generate,
|
|
242
142
|
};
|
|
243
143
|
}
|
|
244
144
|
ApiDef.makeBuild = async function (opts) {
|
|
245
145
|
let apidef = undefined;
|
|
246
|
-
const outprefix = null == opts.outprefix ? '' : opts.outprefix
|
|
146
|
+
// const outprefix = null == opts.outprefix ? '' : opts.outprefix
|
|
247
147
|
const config = {
|
|
248
148
|
def: opts.def || 'no-def',
|
|
249
149
|
kind: 'openapi3',
|
|
250
|
-
model: opts.folder ?
|
|
251
|
-
(opts.folder + '/' + outprefix + 'api-generated.jsonic') : 'no-model',
|
|
252
150
|
meta: opts.meta || {},
|
|
253
151
|
};
|
|
254
152
|
const build = async function (model, build, ctx) {
|
|
@@ -263,23 +161,4 @@ ApiDef.makeBuild = async function (opts) {
|
|
|
263
161
|
build.step = 'pre';
|
|
264
162
|
return build;
|
|
265
163
|
};
|
|
266
|
-
async function modifyModel(fs, path, entityIncludes) {
|
|
267
|
-
// TODO: This is a kludge.
|
|
268
|
-
// Aontu should provide option for as-is AST so that can be used
|
|
269
|
-
// to find injection point more reliably
|
|
270
|
-
let src = fs.existsSync(path) ? fs.readFileSync(path, 'utf8') :
|
|
271
|
-
'main: sdk: entity: {}\n';
|
|
272
|
-
let newsrc = '' + src;
|
|
273
|
-
// Inject target file references into model
|
|
274
|
-
entityIncludes.sort().map((entname) => {
|
|
275
|
-
const lineRE = new RegExp(`@"entity/${entname}.jsonic"`);
|
|
276
|
-
if (!src.match(lineRE)) {
|
|
277
|
-
newsrc = newsrc.replace(/(main:\s+sdk:\s+entity:\s+\{\s*\}\n)/, '$1' +
|
|
278
|
-
`@"entity/${entname}.jsonic"\n`);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
if (newsrc.length !== src.length) {
|
|
282
|
-
fs.writeFileSync(path, newsrc);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
164
|
//# sourceMappingURL=apidef.js.map
|
package/dist/apidef.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Voxgig, MIT License */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.resolveApiEntity = resolveApiEntity;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const jostraca_1 = require("jostraca");
|
|
10
|
+
const utility_1 = require("../../utility");
|
|
11
|
+
function resolveApiEntity(apimodel, opts) {
|
|
12
|
+
const barrel = [
|
|
13
|
+
'# Entity Models\n'
|
|
14
|
+
];
|
|
15
|
+
const entityFiles = [];
|
|
16
|
+
(0, jostraca_1.each)(apimodel.main.api.entity, ((entity, entityName) => {
|
|
17
|
+
const entityFile = (null == opts.outprefix ? '' : opts.outprefix) + entityName + '.jsonic';
|
|
18
|
+
const entityJSON = JSON.stringify(entity, null, 2);
|
|
19
|
+
const fieldAliasesSrc = fieldAliases(entity);
|
|
20
|
+
const entitySrc = `# Entity: ${entity.name}\n\n` +
|
|
21
|
+
`main: api: entity: ${entity.name}: {\n\n` +
|
|
22
|
+
` alias: field: ${fieldAliasesSrc}\n` +
|
|
23
|
+
(0, utility_1.formatJsonSrc)(entityJSON.substring(1, entityJSON.length - 1)) +
|
|
24
|
+
'\n\n}\n';
|
|
25
|
+
entityFiles.push({ name: entityFile, src: entitySrc });
|
|
26
|
+
barrel.push(`@"${node_path_1.default.basename(entityFile)}"`);
|
|
27
|
+
}));
|
|
28
|
+
const indexFile = (null == opts.outprefix ? '' : opts.outprefix) + 'api-entity-index.jsonic';
|
|
29
|
+
return function apiEntityBuilder() {
|
|
30
|
+
(0, jostraca_1.Folder)({ name: 'api' }, () => {
|
|
31
|
+
(0, jostraca_1.each)(entityFiles, (entityFile) => {
|
|
32
|
+
(0, jostraca_1.File)({ name: entityFile.name }, () => (0, jostraca_1.Content)(entityFile.src));
|
|
33
|
+
});
|
|
34
|
+
(0, jostraca_1.File)({ name: indexFile }, () => (0, jostraca_1.Content)(barrel.join('\n')));
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function fieldAliases(entity) {
|
|
39
|
+
// HEURISTIC: id may be name_id or nameId
|
|
40
|
+
const fieldAliases = (0, jostraca_1.each)(entity.op, (op) => (0, jostraca_1.each)(op.param))
|
|
41
|
+
.flat()
|
|
42
|
+
.reduce((a, p) => (entity.field[p.keys] ? null :
|
|
43
|
+
(p.key$.toLowerCase().includes(entity.name) ?
|
|
44
|
+
(a[p.key$] = 'id', a.id = p.key$) :
|
|
45
|
+
null)
|
|
46
|
+
, a), {});
|
|
47
|
+
const fieldAliasesSrc = JSON.stringify(fieldAliases, null, 2)
|
|
48
|
+
.replace(/\n/g, '\n ');
|
|
49
|
+
return fieldAliasesSrc;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=apiEntity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiEntity.js","sourceRoot":"","sources":["../../../src/builder/entity/apiEntity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Voxgig, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.resolveDef = resolveDef;
|
|
5
|
+
const jostraca_1 = require("jostraca");
|
|
6
|
+
function resolveDef(apimodel, opts) {
|
|
7
|
+
const defFile = (null == opts.outprefix ? '' : opts.outprefix) + 'api-def.jsonic';
|
|
8
|
+
const modelDef = { main: { def: apimodel.main.def } };
|
|
9
|
+
let modelDefSrc = JSON.stringify(modelDef, null, 2);
|
|
10
|
+
modelDefSrc =
|
|
11
|
+
'# API Definition\n\n' +
|
|
12
|
+
modelDefSrc.substring(1, modelDefSrc.length - 1).replace(/\n /g, '\n');
|
|
13
|
+
return function defBuilder() {
|
|
14
|
+
(0, jostraca_1.Folder)({ name: 'api' }, () => {
|
|
15
|
+
(0, jostraca_1.File)({ name: defFile }, () => (0, jostraca_1.Content)(modelDefSrc));
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=def.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"def.js","sourceRoot":"","sources":["../../../src/builder/entity/def.ts"],"names":[],"mappings":";AAAA,4CAA4C;;AA0C1C,gCAAU;AA/BZ,uCAIiB;AAGjB,SAAS,UAAU,CACjB,QAAkB,EAClB,IAAmB;IAEnB,MAAM,OAAO,GACX,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAA;IAEnE,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACrD,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAEnD,WAAW;QACT,sBAAsB;YACtB,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAEzE,OAAO,SAAS,UAAU;QACxB,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;YAC3B,IAAA,eAAI,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAO,EAAC,WAAW,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AAEH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Voxgig, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.makeEntityBuilder = makeEntityBuilder;
|
|
5
|
+
// import { each } from 'jostraca'
|
|
6
|
+
// import type {
|
|
7
|
+
// ApiDefOptions,
|
|
8
|
+
// Log,
|
|
9
|
+
// FsUtil,
|
|
10
|
+
// } from '../types'
|
|
11
|
+
// import {
|
|
12
|
+
// writeChanged
|
|
13
|
+
// } from '../utility'
|
|
14
|
+
const apiEntity_1 = require("./entity/apiEntity");
|
|
15
|
+
const def_1 = require("./entity/def");
|
|
16
|
+
// import {
|
|
17
|
+
// resolveSdkEntity
|
|
18
|
+
// } from './entity/sdkEntity'
|
|
19
|
+
async function makeEntityBuilder(ctx) {
|
|
20
|
+
const { apimodel, opts } = ctx;
|
|
21
|
+
const apiEntityBuilder = (0, apiEntity_1.resolveApiEntity)(apimodel, opts);
|
|
22
|
+
const defBuilder = (0, def_1.resolveDef)(apimodel, opts);
|
|
23
|
+
// const sdkEntityBuilder = resolveSdkEntity(apimodel, opts)
|
|
24
|
+
return function entityBuilder() {
|
|
25
|
+
apiEntityBuilder();
|
|
26
|
+
defBuilder();
|
|
27
|
+
// sdkEntityBuilder()
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/builder/entity.ts"],"names":[],"mappings":";AAAA,4CAA4C;;AAoD1C,8CAAiB;AAhDnB,kCAAkC;AAGlC,gBAAgB;AAChB,mBAAmB;AACnB,SAAS;AACT,YAAY;AACZ,oBAAoB;AAGpB,WAAW;AACX,iBAAiB;AACjB,sBAAsB;AAGtB,kDAE2B;AAE3B,sCAEqB;AAErB,WAAW;AACX,qBAAqB;AACrB,8BAA8B;AAI9B,KAAK,UAAU,iBAAiB,CAAC,GAAQ;IACvC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAA;IAE9B,MAAM,gBAAgB,GAAG,IAAA,4BAAgB,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,IAAA,gBAAU,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC7C,4DAA4D;IAE5D,OAAO,SAAS,aAAa;QAC3B,gBAAgB,EAAE,CAAA;QAClB,UAAU,EAAE,CAAA;QACZ,qBAAqB;IACvB,CAAC,CAAA;AACH,CAAC"}
|