@voxgig/apidef 0.0.3 → 0.0.5
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.js +90 -39
- package/dist/apidef.js.map +1 -1
- package/package.json +6 -6
- package/src/apidef.ts +113 -45
package/dist/apidef.js
CHANGED
|
@@ -51,7 +51,13 @@ function ApiDef(opts = {}) {
|
|
|
51
51
|
const model = {
|
|
52
52
|
main: { api: { entity: {} } }
|
|
53
53
|
};
|
|
54
|
-
|
|
54
|
+
try {
|
|
55
|
+
transform(bundle.bundle.parsed, model);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.log('APIDEF ERROR', err);
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
55
61
|
let vxgsrc = JSON.stringify(model, null, 2);
|
|
56
62
|
vxgsrc = vxgsrc.substring(1, vxgsrc.length - 1);
|
|
57
63
|
fs.writeFileSync(spec.model, vxgsrc);
|
|
@@ -68,55 +74,100 @@ function ApiDef(opts = {}) {
|
|
|
68
74
|
function resolveTranform(spec, opts) {
|
|
69
75
|
return makeOpenAPITransform(spec, opts);
|
|
70
76
|
}
|
|
77
|
+
function extractFields(properties) {
|
|
78
|
+
const fieldMap = (0, jostraca_1.each)(properties)
|
|
79
|
+
.reduce((a, p) => (a[p.key$] =
|
|
80
|
+
{ name: p.key$, kind: (0, jostraca_1.camelify)(p.type) }, a), {});
|
|
81
|
+
return fieldMap;
|
|
82
|
+
}
|
|
83
|
+
function fixName(base, name, prop = 'name') {
|
|
84
|
+
base[prop.toLowerCase()] = name.toLowerCase();
|
|
85
|
+
base[(0, jostraca_1.camelify)(prop)] = (0, jostraca_1.camelify)(name);
|
|
86
|
+
base[prop.toUpperCase()] = name.toUpperCase();
|
|
87
|
+
}
|
|
71
88
|
function makeOpenAPITransform(spec, opts) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
const paramBuilder = (paramMap, paramDef, entityModel, pathdef, op, path, entity, model) => {
|
|
90
|
+
paramMap[paramDef.name] = {
|
|
91
|
+
required: paramDef.required
|
|
92
|
+
};
|
|
93
|
+
fixName(paramMap[paramDef.name], paramDef.name);
|
|
94
|
+
fixName(paramMap[paramDef.name], paramDef.schema.type, 'type');
|
|
95
|
+
};
|
|
96
|
+
const queryBuilder = (queryMap, queryDef, entityModel, pathdef, op, path, entity, model) => {
|
|
97
|
+
queryMap[queryDef.name] = {
|
|
98
|
+
required: queryDef.required
|
|
99
|
+
};
|
|
100
|
+
fixName(queryMap[queryDef.name], queryDef.name);
|
|
101
|
+
fixName(queryMap[queryDef.name], queryDef.schema.type, 'type');
|
|
102
|
+
};
|
|
103
|
+
const opBuilder = {
|
|
104
|
+
any: (entityModel, pathdef, op, path, entity, model) => {
|
|
105
|
+
const em = entityModel.op[op.key$] = {
|
|
106
|
+
path: path.key$,
|
|
107
|
+
method: op.val$,
|
|
108
|
+
param: {},
|
|
109
|
+
query: {},
|
|
110
|
+
};
|
|
111
|
+
fixName(em, op.key$);
|
|
112
|
+
// Params are in the path
|
|
113
|
+
if (0 < path.params.length) {
|
|
114
|
+
let params = (0, jostraca_1.getx)(pathdef[op.val$], 'parameters?in=path') || [];
|
|
115
|
+
if (Array.isArray(params)) {
|
|
116
|
+
params.reduce((a, p) => (paramBuilder(a, p, entityModel, pathdef, op, path, entity, model), a), em.param);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Queries are after the ?
|
|
120
|
+
let queries = (0, jostraca_1.getx)(pathdef[op.val$], 'parameters?in!=path') || [];
|
|
121
|
+
if (Array.isArray(queries)) {
|
|
122
|
+
queries.reduce((a, p) => (queryBuilder(a, p, entityModel, pathdef, op, path, entity, model), a), em.query);
|
|
123
|
+
}
|
|
124
|
+
return em;
|
|
125
|
+
},
|
|
126
|
+
list: (entityModel, pathdef, op, path, entity, model) => {
|
|
127
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model);
|
|
128
|
+
},
|
|
129
|
+
load: (entityModel, pathdef, op, path, entity, model) => {
|
|
130
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model);
|
|
131
|
+
},
|
|
132
|
+
create: (entityModel, pathdef, op, path, entity, model) => {
|
|
133
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model);
|
|
134
|
+
},
|
|
135
|
+
save: (entityModel, pathdef, op, path, entity, model) => {
|
|
136
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model);
|
|
137
|
+
},
|
|
138
|
+
remove: (entityModel, pathdef, op, path, entity, model) => {
|
|
139
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
78
142
|
return function OpenAPITransform(def, model) {
|
|
79
|
-
model.main.api
|
|
143
|
+
fixName(model.main.api, spec.meta.name);
|
|
80
144
|
(0, jostraca_1.each)(spec.entity, (entity) => {
|
|
81
145
|
const entityModel = model.main.api.entity[entity.key$] = {
|
|
146
|
+
op: {},
|
|
82
147
|
field: {},
|
|
83
148
|
cmd: {},
|
|
84
149
|
};
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
const
|
|
150
|
+
fixName(entityModel, entity.key$);
|
|
151
|
+
// const firstPath: any = Object.keys(entity.path)[0]
|
|
152
|
+
// const firstParts = firstPath.split('/')
|
|
153
|
+
// const entityPathPrefix = firstParts[0]
|
|
88
154
|
(0, jostraca_1.each)(entity.path, (path) => {
|
|
89
155
|
const pathdef = def.paths[path.key$];
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (pathdef.get) {
|
|
94
|
-
// GET foo/{id} -> single item
|
|
95
|
-
let properties = (0, jostraca_1.getx)(pathdef.get, 'parameters=1 ^1 responses 200 content ' +
|
|
96
|
-
'application/json schema properties');
|
|
97
|
-
// GET foo -> item list
|
|
98
|
-
if (null == properties) {
|
|
99
|
-
properties = (0, jostraca_1.getx)(pathdef.get, 'parameters=null ^1 responses 200 content ' +
|
|
100
|
-
'application/json schema items properties');
|
|
101
|
-
}
|
|
102
|
-
const field = extractFields(properties);
|
|
103
|
-
Object.assign(entityModel.field, field);
|
|
156
|
+
if (null == pathdef) {
|
|
157
|
+
throw new Error('APIDEF: path not found in OpenAPI: ' + path.key$ +
|
|
158
|
+
' (entity: ' + entity.name + ')');
|
|
104
159
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
entityModel
|
|
114
|
-
query,
|
|
115
|
-
param: param.reduce((a, p) => (a[p.name] = { name: p.name, kind: (0, jostraca_1.camelify)(p.schema.type) }, a), {}),
|
|
116
|
-
response: { field: extractFields(response) }
|
|
117
|
-
};
|
|
160
|
+
path.parts = path.key$.split('/');
|
|
161
|
+
path.params = path.parts
|
|
162
|
+
.filter((p) => p.startsWith('{'))
|
|
163
|
+
.map((p) => p.substring(1, p.length - 1));
|
|
164
|
+
// console.log('ENTITY-PATH', entity, path)
|
|
165
|
+
(0, jostraca_1.each)(path.op, (op) => {
|
|
166
|
+
const opbuild = opBuilder[op.key$];
|
|
167
|
+
if (opbuild) {
|
|
168
|
+
opbuild(entityModel, pathdef, op, path, entity, model);
|
|
118
169
|
}
|
|
119
|
-
}
|
|
170
|
+
});
|
|
120
171
|
});
|
|
121
172
|
});
|
|
122
173
|
};
|
package/dist/apidef.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.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.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"main": "dist/apidef.js",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"types": "dist/apidef.d.ts",
|
|
@@ -35,16 +35,16 @@
|
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@hapi/code": "^9.0.3",
|
|
37
37
|
"@types/js-yaml": "^4.0.9",
|
|
38
|
-
"@types/node": "22.5.
|
|
39
|
-
"aontu": "^0.
|
|
38
|
+
"@types/node": "22.5.2",
|
|
39
|
+
"aontu": "^0.22.0",
|
|
40
40
|
"esbuild": "^0.23.1",
|
|
41
|
-
"json-schema-to-ts": "^3.1.
|
|
41
|
+
"json-schema-to-ts": "^3.1.1",
|
|
42
42
|
"memfs": "^4.11.1",
|
|
43
43
|
"typescript": "^5.5.4"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@redocly/openapi-core": "^1.
|
|
46
|
+
"@redocly/openapi-core": "^1.22.1",
|
|
47
47
|
"chokidar": "^3.6.0",
|
|
48
|
-
"jostraca": "^0.
|
|
48
|
+
"jostraca": "^0.3.0"
|
|
49
49
|
}
|
|
50
50
|
}
|
package/src/apidef.ts
CHANGED
|
@@ -49,7 +49,13 @@ function ApiDef(opts: ApiDefOptions = {}) {
|
|
|
49
49
|
main: { api: { entity: {} } }
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
try {
|
|
53
|
+
transform(bundle.bundle.parsed, model)
|
|
54
|
+
}
|
|
55
|
+
catch (err: any) {
|
|
56
|
+
console.log('APIDEF ERROR', err)
|
|
57
|
+
throw err
|
|
58
|
+
}
|
|
53
59
|
|
|
54
60
|
let vxgsrc = JSON.stringify(model, null, 2)
|
|
55
61
|
vxgsrc = vxgsrc.substring(1, vxgsrc.length - 1)
|
|
@@ -79,74 +85,136 @@ function resolveTranform(spec: any, opts: any) {
|
|
|
79
85
|
return makeOpenAPITransform(spec, opts)
|
|
80
86
|
}
|
|
81
87
|
|
|
88
|
+
|
|
89
|
+
function extractFields(properties: any) {
|
|
90
|
+
const fieldMap = each(properties)
|
|
91
|
+
.reduce((a: any, p: any) => (a[p.key$] =
|
|
92
|
+
{ name: p.key$, kind: camelify(p.type) }, a), {})
|
|
93
|
+
return fieldMap
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
function fixName(base: any, name: string, prop = 'name') {
|
|
98
|
+
base[prop.toLowerCase()] = name.toLowerCase()
|
|
99
|
+
base[camelify(prop)] = camelify(name)
|
|
100
|
+
base[prop.toUpperCase()] = name.toUpperCase()
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
82
104
|
function makeOpenAPITransform(spec: any, opts: any) {
|
|
83
105
|
|
|
106
|
+
const paramBuilder = (paramMap: any, paramDef: any,
|
|
107
|
+
entityModel: any, pathdef: any,
|
|
108
|
+
op: any, path: any, entity: any, model: any) => {
|
|
109
|
+
paramMap[paramDef.name] = {
|
|
110
|
+
required: paramDef.required
|
|
111
|
+
}
|
|
112
|
+
fixName(paramMap[paramDef.name], paramDef.name)
|
|
113
|
+
fixName(paramMap[paramDef.name], paramDef.schema.type, 'type')
|
|
114
|
+
}
|
|
115
|
+
|
|
84
116
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
117
|
+
const queryBuilder = (queryMap: any, queryDef: any,
|
|
118
|
+
entityModel: any, pathdef: any,
|
|
119
|
+
op: any, path: any, entity: any, model: any) => {
|
|
120
|
+
queryMap[queryDef.name] = {
|
|
121
|
+
required: queryDef.required
|
|
122
|
+
}
|
|
123
|
+
fixName(queryMap[queryDef.name], queryDef.name)
|
|
124
|
+
fixName(queryMap[queryDef.name], queryDef.schema.type, 'type')
|
|
90
125
|
}
|
|
91
126
|
|
|
92
127
|
|
|
128
|
+
const opBuilder: any = {
|
|
129
|
+
any: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
130
|
+
const em = entityModel.op[op.key$] = {
|
|
131
|
+
path: path.key$,
|
|
132
|
+
method: op.val$,
|
|
133
|
+
param: {},
|
|
134
|
+
query: {},
|
|
135
|
+
}
|
|
136
|
+
fixName(em, op.key$)
|
|
137
|
+
|
|
138
|
+
// Params are in the path
|
|
139
|
+
if (0 < path.params.length) {
|
|
140
|
+
let params = getx(pathdef[op.val$], 'parameters?in=path') || []
|
|
141
|
+
if (Array.isArray(params)) {
|
|
142
|
+
params.reduce((a: any, p: any) =>
|
|
143
|
+
(paramBuilder(a, p, entityModel, pathdef, op, path, entity, model), a), em.param)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Queries are after the ?
|
|
148
|
+
let queries = getx(pathdef[op.val$], 'parameters?in!=path') || []
|
|
149
|
+
if (Array.isArray(queries)) {
|
|
150
|
+
queries.reduce((a: any, p: any) =>
|
|
151
|
+
(queryBuilder(a, p, entityModel, pathdef, op, path, entity, model), a), em.query)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return em
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
list: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
159
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model)
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
load: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
163
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model)
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
create: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
167
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model)
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
save: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
171
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model)
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
remove: (entityModel: any, pathdef: any, op: any, path: any, entity: any, model: any) => {
|
|
175
|
+
return opBuilder.any(entityModel, pathdef, op, path, entity, model)
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
}
|
|
179
|
+
|
|
93
180
|
return function OpenAPITransform(def: any, model: any) {
|
|
94
|
-
model.main.api
|
|
181
|
+
fixName(model.main.api, spec.meta.name)
|
|
95
182
|
|
|
96
183
|
each(spec.entity, (entity: any) => {
|
|
97
184
|
const entityModel: any = model.main.api.entity[entity.key$] = {
|
|
185
|
+
op: {},
|
|
98
186
|
field: {},
|
|
99
187
|
cmd: {},
|
|
100
188
|
}
|
|
101
189
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
190
|
+
fixName(entityModel, entity.key$)
|
|
191
|
+
|
|
192
|
+
// const firstPath: any = Object.keys(entity.path)[0]
|
|
193
|
+
// const firstParts = firstPath.split('/')
|
|
194
|
+
// const entityPathPrefix = firstParts[0]
|
|
105
195
|
|
|
106
196
|
each(entity.path, (path: any) => {
|
|
107
197
|
const pathdef = def.paths[path.key$]
|
|
108
198
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
// Entity Fields
|
|
114
|
-
if (pathdef.get) {
|
|
115
|
-
// GET foo/{id} -> single item
|
|
116
|
-
let properties = getx(pathdef.get, 'parameters=1 ^1 responses 200 content ' +
|
|
117
|
-
'application/json schema properties')
|
|
118
|
-
|
|
119
|
-
// GET foo -> item list
|
|
120
|
-
if (null == properties) {
|
|
121
|
-
properties = getx(pathdef.get, 'parameters=null ^1 responses 200 content ' +
|
|
122
|
-
'application/json schema items properties')
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const field = extractFields(properties)
|
|
126
|
-
Object.assign(entityModel.field, field)
|
|
199
|
+
if (null == pathdef) {
|
|
200
|
+
throw new Error('APIDEF: path not found in OpenAPI: ' + path.key$ +
|
|
201
|
+
' (entity: ' + entity.name + ')')
|
|
127
202
|
}
|
|
128
203
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const suffix = parts[parts.length - 1]
|
|
204
|
+
path.parts = path.key$.split('/')
|
|
205
|
+
path.params = path.parts
|
|
206
|
+
.filter((p: string) => p.startsWith('{'))
|
|
207
|
+
.map((p: string) => p.substring(1, p.length - 1))
|
|
134
208
|
|
|
135
|
-
|
|
209
|
+
// console.log('ENTITY-PATH', entity, path)
|
|
136
210
|
|
|
137
|
-
|
|
211
|
+
each(path.op, (op: any) => {
|
|
212
|
+
const opbuild = opBuilder[op.key$]
|
|
138
213
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
entityModel.cmd[suffix] = {
|
|
143
|
-
query,
|
|
144
|
-
param: param.reduce((a: any, p: any) =>
|
|
145
|
-
(a[p.name] = { name: p.name, kind: camelify(p.schema.type) }, a), {}),
|
|
146
|
-
response: { field: extractFields(response) }
|
|
147
|
-
}
|
|
214
|
+
if (opbuild) {
|
|
215
|
+
opbuild(entityModel, pathdef, op, path, entity, model)
|
|
148
216
|
}
|
|
149
|
-
}
|
|
217
|
+
})
|
|
150
218
|
})
|
|
151
219
|
})
|
|
152
220
|
}
|