@voxgig/apidef 0.0.3 → 0.0.4

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 CHANGED
@@ -51,7 +51,13 @@ function ApiDef(opts = {}) {
51
51
  const model = {
52
52
  main: { api: { entity: {} } }
53
53
  };
54
- transform(bundle.bundle.parsed, model);
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
- function extractFields(properties) {
73
- const fieldMap = (0, jostraca_1.each)(properties)
74
- .reduce((a, p) => (a[p.key$] =
75
- { name: p.key$, kind: (0, jostraca_1.camelify)(p.type) }, a), {});
76
- return fieldMap;
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.name = spec.meta.name;
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
- const firstPath = Object.keys(entity.path)[0];
86
- const firstParts = firstPath.split('/');
87
- const entityPathPrefix = firstParts[0];
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
- const parts = path.key$.split('/');
91
- // TODO: use method prop in model!!!
92
- // Entity Fields
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
- // Entity Commands
106
- else if (pathdef.post) {
107
- if (2 < parts.length && parts[0] === entityPathPrefix) {
108
- const suffix = parts[parts.length - 1];
109
- let param = (0, jostraca_1.getx)(pathdef.post, 'parameters?in=path') || [];
110
- let query = (0, jostraca_1.getx)(pathdef.post, 'parameters?in!=path') || [];
111
- let response = (0, jostraca_1.getx)(pathdef.post, 'responses 200 content ' +
112
- 'application/json schema properties');
113
- entityModel.cmd[suffix] = {
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"apidef.js","sourceRoot":"","sources":["../src/apidef.ts"],"names":[],"mappings":"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"}
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",
3
+ "version": "0.0.4",
4
4
  "main": "dist/apidef.js",
5
5
  "type": "commonjs",
6
6
  "types": "dist/apidef.d.ts",
@@ -35,7 +35,7 @@
35
35
  "devDependencies": {
36
36
  "@hapi/code": "^9.0.3",
37
37
  "@types/js-yaml": "^4.0.9",
38
- "@types/node": "22.5.0",
38
+ "@types/node": "22.5.1",
39
39
  "aontu": "^0.21.1",
40
40
  "esbuild": "^0.23.1",
41
41
  "json-schema-to-ts": "^3.1.0",
@@ -43,8 +43,8 @@
43
43
  "typescript": "^5.5.4"
44
44
  },
45
45
  "dependencies": {
46
- "@redocly/openapi-core": "^1.21.0",
46
+ "@redocly/openapi-core": "^1.21.1",
47
47
  "chokidar": "^3.6.0",
48
- "jostraca": "^0.2.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
- transform(bundle.bundle.parsed, model)
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
- function extractFields(properties: any) {
86
- const fieldMap = each(properties)
87
- .reduce((a: any, p: any) => (a[p.key$] =
88
- { name: p.key$, kind: camelify(p.type) }, a), {})
89
- return fieldMap
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.name = spec.meta.name
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
- const firstPath: any = Object.keys(entity.path)[0]
103
- const firstParts = firstPath.split('/')
104
- const entityPathPrefix = firstParts[0]
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
- const parts = path.key$.split('/')
110
-
111
- // TODO: use method prop in model!!!
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
- // Entity Commands
130
- else if (pathdef.post) {
131
-
132
- if (2 < parts.length && parts[0] === entityPathPrefix) {
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
- let param = getx(pathdef.post, 'parameters?in=path') || []
209
+ // console.log('ENTITY-PATH', entity, path)
136
210
 
137
- let query = getx(pathdef.post, 'parameters?in!=path') || []
211
+ each(path.op, (op: any) => {
212
+ const opbuild = opBuilder[op.key$]
138
213
 
139
- let response = getx(pathdef.post, 'responses 200 content ' +
140
- 'application/json schema properties')
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
  }