@looker/sdk-codegen 21.7.3 → 21.8.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/CHANGELOG.md +23 -0
- package/lib/codeGen.d.ts +1 -1
- package/lib/codeGen.js +28 -154
- package/lib/codeGen.js.map +1 -1
- package/lib/codeGenerators.js +0 -16
- package/lib/codeGenerators.js.map +1 -1
- package/lib/csharp.gen.js +3 -71
- package/lib/csharp.gen.js.map +1 -1
- package/lib/declarationInfo.js +0 -7
- package/lib/declarationInfo.js.map +1 -1
- package/lib/esm/codeGen.js +48 -157
- package/lib/esm/codeGen.js.map +1 -1
- package/lib/esm/codeGenerators.js +28 -20
- package/lib/esm/codeGenerators.js.map +1 -1
- package/lib/esm/csharp.gen.js +19 -75
- package/lib/esm/csharp.gen.js.map +1 -1
- package/lib/esm/declarationInfo.js +10 -7
- package/lib/esm/declarationInfo.js.map +1 -1
- package/lib/esm/exampleInfo.js +24 -23
- package/lib/esm/exampleInfo.js.map +1 -1
- package/lib/esm/go.gen.js +18 -92
- package/lib/esm/go.gen.js.map +1 -1
- package/lib/esm/index.js +148 -13
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/kotlin.gen.js +23 -118
- package/lib/esm/kotlin.gen.js.map +1 -1
- package/lib/esm/pseudo.gen.js +14 -24
- package/lib/esm/pseudo.gen.js.map +1 -1
- package/lib/esm/python.gen.js +19 -138
- package/lib/esm/python.gen.js.map +1 -1
- package/lib/esm/sdkModels.js +100 -432
- package/lib/esm/sdkModels.js.map +1 -1
- package/lib/esm/specConverter.js +58 -88
- package/lib/esm/specConverter.js.map +1 -1
- package/lib/esm/specDiff.js +36 -51
- package/lib/esm/specDiff.js.map +1 -1
- package/lib/esm/swift.gen.js +25 -137
- package/lib/esm/swift.gen.js.map +1 -1
- package/lib/esm/testUtils/index.js +17 -0
- package/lib/esm/testUtils/index.js.map +1 -0
- package/lib/esm/testUtils/testUtils.js +66 -0
- package/lib/esm/testUtils/testUtils.js.map +1 -0
- package/lib/esm/typescript.gen.js +24 -125
- package/lib/esm/typescript.gen.js.map +1 -1
- package/lib/exampleInfo.js +1 -31
- package/lib/exampleInfo.js.map +1 -1
- package/lib/go.gen.js +3 -87
- package/lib/go.gen.js.map +1 -1
- package/lib/index.js +0 -26
- package/lib/index.js.map +1 -1
- package/lib/kotlin.gen.js +7 -113
- package/lib/kotlin.gen.js.map +1 -1
- package/lib/pseudo.gen.js +3 -24
- package/lib/pseudo.gen.js.map +1 -1
- package/lib/python.gen.js +3 -133
- package/lib/python.gen.js.map +1 -1
- package/lib/sdkModels.js +8 -438
- package/lib/sdkModels.js.map +1 -1
- package/lib/specConverter.js +6 -106
- package/lib/specConverter.js.map +1 -1
- package/lib/specDiff.js +1 -56
- package/lib/specDiff.js.map +1 -1
- package/lib/swift.gen.js +3 -128
- package/lib/swift.gen.js.map +1 -1
- package/lib/testUtils/index.js +0 -2
- package/lib/testUtils/index.js.map +1 -1
- package/lib/testUtils/testUtils.js +1 -17
- package/lib/testUtils/testUtils.js.map +1 -1
- package/lib/typescript.gen.js +5 -117
- package/lib/typescript.gen.js.map +1 -1
- package/package.json +3 -3
package/lib/specConverter.js
CHANGED
|
@@ -3,64 +3,46 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
6
|
+
exports.upgradeSpecObject = exports.upgradeSpec = exports.swapXLookerTags = exports.swapRef = exports.structName = exports.openApiStyle = exports.loadSpecs = exports.isSwagger = exports.isOpenApi = exports.include31 = exports.getSpecsFromVersions = exports.getSpecLinks = exports.getLookerSpecs = exports.fixConversionObjects = exports.fixConversion = exports.defaultMimeFormats = exports.convertResponses = exports.convertPathsAndBodies = exports.convertParam = exports.convertOp = exports.convertDefs = void 0;
|
|
8
7
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
9
|
-
|
|
10
8
|
var _sdkModels = require("./sdkModels");
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
19
|
-
|
|
10
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
11
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
12
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
13
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
14
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
20
15
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
21
|
-
|
|
22
16
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
23
|
-
|
|
24
17
|
var warn = warning => {
|
|
25
18
|
throw new Error(warning);
|
|
26
19
|
};
|
|
27
|
-
|
|
28
20
|
var appJson = 'application/json';
|
|
29
|
-
|
|
30
21
|
var include31 = ver => {
|
|
31
22
|
return ver.status && ver.version && ver.swagger_url && ver.status !== 'internal_test' && ver.status !== 'deprecated' && ver.status !== 'legacy' || /\b3.1\b/.test(ver.version || '');
|
|
32
23
|
};
|
|
33
|
-
|
|
34
24
|
exports.include31 = include31;
|
|
35
|
-
|
|
36
25
|
var getSpecsFromVersions = function () {
|
|
37
26
|
var _ref = _asyncToGenerator(function* (versions) {
|
|
38
27
|
var fetcher = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
39
28
|
var include = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : include31;
|
|
40
29
|
var items = {};
|
|
41
|
-
|
|
42
30
|
var uniqueId = v => {
|
|
43
31
|
var _v$status;
|
|
44
|
-
|
|
45
32
|
var specKey = v.version || 'api';
|
|
46
33
|
var max = ((_v$status = v.status) === null || _v$status === void 0 ? void 0 : _v$status.length) || 0;
|
|
47
34
|
var frag = 1;
|
|
48
|
-
|
|
49
35
|
while (items[specKey]) {
|
|
50
36
|
if (frag <= max) {
|
|
51
37
|
var _v$status2;
|
|
52
|
-
|
|
53
38
|
specKey = "".concat(v.version).concat((_v$status2 = v.status) === null || _v$status2 === void 0 ? void 0 : _v$status2.substr(0, frag));
|
|
54
39
|
} else {
|
|
55
40
|
specKey = "".concat(v.version).concat(v.status).concat(frag);
|
|
56
41
|
}
|
|
57
|
-
|
|
58
42
|
frag++;
|
|
59
43
|
}
|
|
60
|
-
|
|
61
44
|
return specKey;
|
|
62
45
|
};
|
|
63
|
-
|
|
64
46
|
if (versions.supported_versions) {
|
|
65
47
|
for (var v of versions.supported_versions) {
|
|
66
48
|
if (v.status && v.version && v.swagger_url) {
|
|
@@ -72,32 +54,26 @@ var getSpecsFromVersions = function () {
|
|
|
72
54
|
isDefault: v.status === 'current',
|
|
73
55
|
specURL: v.swagger_url
|
|
74
56
|
};
|
|
75
|
-
|
|
76
57
|
if (fetcher) {
|
|
77
58
|
_spec.api = yield fetcher(_spec);
|
|
78
59
|
}
|
|
79
|
-
|
|
80
60
|
items[_spec.key] = _spec;
|
|
81
61
|
}
|
|
82
62
|
}
|
|
83
63
|
}
|
|
84
64
|
}
|
|
85
|
-
|
|
86
65
|
return items;
|
|
87
66
|
});
|
|
88
|
-
|
|
89
67
|
return function getSpecsFromVersions(_x) {
|
|
90
68
|
return _ref.apply(this, arguments);
|
|
91
69
|
};
|
|
92
70
|
}();
|
|
93
|
-
|
|
94
71
|
exports.getSpecsFromVersions = getSpecsFromVersions;
|
|
95
72
|
var defaultMimeFormats = {
|
|
96
73
|
produces: [appJson],
|
|
97
74
|
consumes: [appJson]
|
|
98
75
|
};
|
|
99
76
|
exports.defaultMimeFormats = defaultMimeFormats;
|
|
100
|
-
|
|
101
77
|
var swapXLookerTags = spec => {
|
|
102
78
|
var swaps = [{
|
|
103
79
|
pattern: /x-looker-nullable/gi,
|
|
@@ -114,9 +90,7 @@ var swapXLookerTags = spec => {
|
|
|
114
90
|
});
|
|
115
91
|
return spec;
|
|
116
92
|
};
|
|
117
|
-
|
|
118
93
|
exports.swapXLookerTags = swapXLookerTags;
|
|
119
|
-
|
|
120
94
|
var openApiStyle = collectionFormat => {
|
|
121
95
|
if (!collectionFormat) return undefined;
|
|
122
96
|
var styles = {
|
|
@@ -124,26 +98,19 @@ var openApiStyle = collectionFormat => {
|
|
|
124
98
|
pipes: 'pipeDelimited',
|
|
125
99
|
ssv: 'spaceDelimited'
|
|
126
100
|
};
|
|
127
|
-
|
|
128
101
|
if (collectionFormat in styles) {
|
|
129
102
|
return styles[collectionFormat];
|
|
130
103
|
}
|
|
131
|
-
|
|
132
104
|
return undefined;
|
|
133
105
|
};
|
|
134
|
-
|
|
135
106
|
exports.openApiStyle = openApiStyle;
|
|
136
|
-
|
|
137
107
|
var findOpenApiParam = (api, endpoint, verb, name) => {
|
|
138
108
|
var result = api.paths[endpoint][verb].parameters.find(p => p.name === name);
|
|
139
|
-
|
|
140
109
|
if (!result) {
|
|
141
110
|
warn("Missing parameter: ".concat(endpoint, " ").concat(verb, " parameter ").concat(name));
|
|
142
111
|
}
|
|
143
|
-
|
|
144
112
|
return result;
|
|
145
113
|
};
|
|
146
|
-
|
|
147
114
|
var fixConversionObjects = (api, swagger) => {
|
|
148
115
|
var paths = swagger.paths;
|
|
149
116
|
var fixes = [];
|
|
@@ -153,41 +120,33 @@ var fixConversionObjects = (api, swagger) => {
|
|
|
153
120
|
var [httpMethod, method] = _ref3;
|
|
154
121
|
var operation = method;
|
|
155
122
|
var params = operation.parameters;
|
|
156
|
-
|
|
157
123
|
if (params) {
|
|
158
124
|
Object.entries(params).forEach(_ref4 => {
|
|
159
125
|
var [, p] = _ref4;
|
|
160
126
|
var param = p;
|
|
161
|
-
|
|
162
127
|
if (param.name === 'body' && param.in === 'body') {
|
|
163
128
|
if ('required' in param) {
|
|
164
129
|
var required = param.required;
|
|
165
130
|
var fix = "".concat(endpoint, "::").concat(operation.operationId, " setting requestBody.required to ").concat(required);
|
|
166
131
|
var requestBody = api.paths[endpoint][httpMethod].requestBody;
|
|
167
|
-
|
|
168
132
|
if (!requestBody) {
|
|
169
133
|
warn("Failed to find \"requestBody\" in OAS for swagger \"body param\" fix: ".concat(fix));
|
|
170
134
|
} else {
|
|
171
135
|
if (requestBody.required !== required) {
|
|
172
136
|
fixes.push(fix);
|
|
173
137
|
}
|
|
174
|
-
|
|
175
138
|
requestBody.required = required;
|
|
176
139
|
}
|
|
177
140
|
}
|
|
178
141
|
}
|
|
179
|
-
|
|
180
142
|
if (param.collectionFormat) {
|
|
181
143
|
var format = param.collectionFormat;
|
|
182
144
|
var style = openApiStyle(format);
|
|
183
|
-
|
|
184
145
|
if (style === undefined) {
|
|
185
146
|
warn("OAS style conversion failed: collectionFormat '".concat(param.collectionFormat, "' is unknown"));
|
|
186
147
|
} else {
|
|
187
148
|
var _fix = "".concat(endpoint, "::").concat(operation.operationId, " ").concat(param.name, " '").concat(format, "' -> '").concat(style, "'");
|
|
188
|
-
|
|
189
149
|
var newParam = findOpenApiParam(api, endpoint, httpMethod, param.name);
|
|
190
|
-
|
|
191
150
|
if (newParam && newParam.style !== style) {
|
|
192
151
|
newParam.style = style;
|
|
193
152
|
fixes.push(_fix);
|
|
@@ -203,66 +162,46 @@ var fixConversionObjects = (api, swagger) => {
|
|
|
203
162
|
spec: JSON.stringify(api)
|
|
204
163
|
};
|
|
205
164
|
};
|
|
206
|
-
|
|
207
165
|
exports.fixConversionObjects = fixConversionObjects;
|
|
208
|
-
|
|
209
166
|
var isSwagger = spec => spec.swagger !== undefined;
|
|
210
|
-
|
|
211
167
|
exports.isSwagger = isSwagger;
|
|
212
|
-
|
|
213
168
|
var isOpenApi = spec => spec.openapi !== undefined;
|
|
214
|
-
|
|
215
169
|
exports.isOpenApi = isOpenApi;
|
|
216
|
-
|
|
217
170
|
var fixConversion = (openApiSpec, swaggerSpec) => {
|
|
218
171
|
return fixConversionObjects(JSON.parse(openApiSpec), JSON.parse(swaggerSpec));
|
|
219
172
|
};
|
|
220
|
-
|
|
221
173
|
exports.fixConversion = fixConversion;
|
|
222
|
-
|
|
223
174
|
var swapRef = ref => ref.replace(/#\/definitions\//g, '#/components/schemas/');
|
|
224
|
-
|
|
225
175
|
exports.swapRef = swapRef;
|
|
226
|
-
|
|
227
176
|
var structName = ref => {
|
|
228
177
|
if (!ref) return undefined;
|
|
229
178
|
var parts = ref.split('/');
|
|
230
179
|
return parts[parts.length - 1];
|
|
231
180
|
};
|
|
232
|
-
|
|
233
181
|
exports.structName = structName;
|
|
234
|
-
|
|
235
182
|
var convertParam = param => {
|
|
236
183
|
var schema = {
|
|
237
184
|
type: param.type
|
|
238
185
|
};
|
|
239
|
-
|
|
240
186
|
var result = _objectSpread({}, param);
|
|
241
|
-
|
|
242
187
|
delete result.type;
|
|
243
|
-
|
|
244
188
|
if (param.format) {
|
|
245
189
|
schema.format = param.format;
|
|
246
190
|
delete result.format;
|
|
247
191
|
}
|
|
248
|
-
|
|
249
192
|
if (param.collectionFormat) {
|
|
250
193
|
result.style = openApiStyle(param.collectionFormat);
|
|
251
194
|
delete result.collectionFormat;
|
|
252
195
|
}
|
|
253
|
-
|
|
254
196
|
if (param.items) {
|
|
255
197
|
schema.items = param.items;
|
|
256
198
|
result.explode = false;
|
|
257
199
|
delete result.items;
|
|
258
200
|
}
|
|
259
|
-
|
|
260
201
|
result.schema = schema;
|
|
261
202
|
return result;
|
|
262
203
|
};
|
|
263
|
-
|
|
264
204
|
exports.convertParam = convertParam;
|
|
265
|
-
|
|
266
205
|
var convertResponses = function convertResponses(responses) {
|
|
267
206
|
var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultMimeFormats;
|
|
268
207
|
Object.entries(responses).forEach(_ref5 => {
|
|
@@ -270,7 +209,6 @@ var convertResponses = function convertResponses(responses) {
|
|
|
270
209
|
responses[code] = {
|
|
271
210
|
description: response.description
|
|
272
211
|
};
|
|
273
|
-
|
|
274
212
|
if (response.schema) {
|
|
275
213
|
var content = {};
|
|
276
214
|
formats.produces.forEach(format => content[format] = {
|
|
@@ -281,49 +219,38 @@ var convertResponses = function convertResponses(responses) {
|
|
|
281
219
|
});
|
|
282
220
|
return responses;
|
|
283
221
|
};
|
|
284
|
-
|
|
285
222
|
exports.convertResponses = convertResponses;
|
|
286
|
-
|
|
287
223
|
var convertOp = function convertOp(op) {
|
|
288
224
|
var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultMimeFormats;
|
|
289
225
|
var moveKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
290
|
-
|
|
291
226
|
var moveKey = (key, value) => {
|
|
292
227
|
if (!moveKeys || !(key in op)) return value;
|
|
293
228
|
if (!value) value = op[key];
|
|
294
|
-
|
|
295
229
|
if (value) {
|
|
296
230
|
delete op[key];
|
|
297
231
|
op[key] = value;
|
|
298
232
|
}
|
|
299
|
-
|
|
300
233
|
return value;
|
|
301
234
|
};
|
|
302
|
-
|
|
303
235
|
var {
|
|
304
236
|
produces,
|
|
305
237
|
consumes
|
|
306
238
|
} = formats;
|
|
307
239
|
var body = {};
|
|
308
|
-
|
|
309
240
|
if (op.produces) {
|
|
310
241
|
produces = op.produces;
|
|
311
242
|
delete op.produces;
|
|
312
243
|
}
|
|
313
|
-
|
|
314
244
|
if (op.consumes) {
|
|
315
245
|
consumes = op.consumes;
|
|
316
246
|
delete op.consumes;
|
|
317
247
|
}
|
|
318
|
-
|
|
319
248
|
if (op.parameters) {
|
|
320
249
|
var params = _objectSpread({}, op.parameters);
|
|
321
|
-
|
|
322
250
|
op.parameters = [];
|
|
323
251
|
Object.values(params).forEach(p => {
|
|
324
252
|
if (p.in === 'body') {
|
|
325
253
|
op.requestBody = {};
|
|
326
|
-
|
|
327
254
|
if (p.schema) {
|
|
328
255
|
op.requestBody.content = {
|
|
329
256
|
[consumes[0]]: {
|
|
@@ -331,7 +258,6 @@ var convertOp = function convertOp(op) {
|
|
|
331
258
|
}
|
|
332
259
|
};
|
|
333
260
|
}
|
|
334
|
-
|
|
335
261
|
op.requestBody.description = p.description;
|
|
336
262
|
if ('required' in p) op.requestBody.required = p.required;
|
|
337
263
|
} else {
|
|
@@ -340,19 +266,16 @@ var convertOp = function convertOp(op) {
|
|
|
340
266
|
});
|
|
341
267
|
if (op.parameters.length === 0) delete op.parameters;
|
|
342
268
|
}
|
|
343
|
-
|
|
344
269
|
moveKey('responses', convertResponses(op.responses, {
|
|
345
270
|
produces,
|
|
346
271
|
consumes
|
|
347
272
|
}));
|
|
348
273
|
moveKey('deprecated');
|
|
349
274
|
var xdep = 'x-looker-deprecated';
|
|
350
|
-
|
|
351
275
|
if (xdep in op) {
|
|
352
276
|
op.deprecated = op[xdep];
|
|
353
277
|
delete op[xdep];
|
|
354
278
|
}
|
|
355
|
-
|
|
356
279
|
moveKey('x-looker-status');
|
|
357
280
|
moveKey('x-looker-activity-type');
|
|
358
281
|
moveKey('x-looker-rate-limited');
|
|
@@ -361,9 +284,7 @@ var convertOp = function convertOp(op) {
|
|
|
361
284
|
body
|
|
362
285
|
};
|
|
363
286
|
};
|
|
364
|
-
|
|
365
287
|
exports.convertOp = convertOp;
|
|
366
|
-
|
|
367
288
|
var convertPathsAndBodies = function convertPathsAndBodies(paths) {
|
|
368
289
|
var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultMimeFormats;
|
|
369
290
|
var result = {
|
|
@@ -386,15 +307,12 @@ var convertPathsAndBodies = function convertPathsAndBodies(paths) {
|
|
|
386
307
|
});
|
|
387
308
|
return result;
|
|
388
309
|
};
|
|
389
|
-
|
|
390
310
|
exports.convertPathsAndBodies = convertPathsAndBodies;
|
|
391
|
-
|
|
392
311
|
var convertDefs = defs => {
|
|
393
312
|
Object.entries(defs).forEach(_ref9 => {
|
|
394
313
|
var [_, struct] = _ref9;
|
|
395
314
|
Object.entries(struct.properties).forEach(_ref10 => {
|
|
396
315
|
var [name, prop] = _ref10;
|
|
397
|
-
|
|
398
316
|
if (prop.$ref) {
|
|
399
317
|
struct.properties[name] = {
|
|
400
318
|
$ref: prop.$ref
|
|
@@ -404,18 +322,14 @@ var convertDefs = defs => {
|
|
|
404
322
|
});
|
|
405
323
|
return defs;
|
|
406
324
|
};
|
|
407
|
-
|
|
408
325
|
exports.convertDefs = convertDefs;
|
|
409
|
-
|
|
410
326
|
var upgradeSpecObject = spec => {
|
|
411
327
|
if (isOpenApi(spec)) {
|
|
412
328
|
return JSON.parse(swapXLookerTags(JSON.stringify(spec)));
|
|
413
329
|
}
|
|
414
|
-
|
|
415
330
|
if (!isSwagger(spec)) {
|
|
416
331
|
throw new Error('Input is not a Swagger or OpenAPI specification');
|
|
417
332
|
}
|
|
418
|
-
|
|
419
333
|
var cleanup = swapRef(swapXLookerTags(JSON.stringify(spec)));
|
|
420
334
|
spec = JSON.parse(cleanup);
|
|
421
335
|
var consumes = spec.consumes || [appJson];
|
|
@@ -444,34 +358,26 @@ var upgradeSpecObject = spec => {
|
|
|
444
358
|
};
|
|
445
359
|
return api;
|
|
446
360
|
};
|
|
447
|
-
|
|
448
361
|
exports.upgradeSpecObject = upgradeSpecObject;
|
|
449
|
-
|
|
450
362
|
var upgradeSpec = spec => {
|
|
451
363
|
if (typeof spec === 'string') spec = JSON.parse(spec);
|
|
452
364
|
return JSON.stringify(upgradeSpecObject(spec));
|
|
453
365
|
};
|
|
454
|
-
|
|
455
366
|
exports.upgradeSpec = upgradeSpec;
|
|
456
|
-
|
|
457
367
|
var getLookerSpecs = function () {
|
|
458
368
|
var _ref11 = _asyncToGenerator(function* (sdk, serverUrl) {
|
|
459
369
|
var versionUrl = "".concat(serverUrl, "/versions");
|
|
460
370
|
var versions = yield sdk.ok(sdk.get(versionUrl));
|
|
461
371
|
return versions;
|
|
462
372
|
});
|
|
463
|
-
|
|
464
373
|
return function getLookerSpecs(_x2, _x3) {
|
|
465
374
|
return _ref11.apply(this, arguments);
|
|
466
375
|
};
|
|
467
376
|
}();
|
|
468
|
-
|
|
469
377
|
exports.getLookerSpecs = getLookerSpecs;
|
|
470
|
-
|
|
471
378
|
var getSpecLinks = function getSpecLinks(versions) {
|
|
472
379
|
var include = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : spec => spec.version > '2.99';
|
|
473
380
|
var prefix = "Release ".concat(versions.looker_release_version, " API ");
|
|
474
|
-
|
|
475
381
|
var deriveSpec = spec => {
|
|
476
382
|
var status = spec.swagger_url === versions.current_version.swagger_url ? 'current' : spec.status;
|
|
477
383
|
return {
|
|
@@ -482,13 +388,10 @@ var getSpecLinks = function getSpecLinks(versions) {
|
|
|
482
388
|
api: {}
|
|
483
389
|
};
|
|
484
390
|
};
|
|
485
|
-
|
|
486
391
|
var specs = versions.supported_versions.filter(v => include(v)).map(v => deriveSpec(v));
|
|
487
392
|
return specs;
|
|
488
393
|
};
|
|
489
|
-
|
|
490
394
|
exports.getSpecLinks = getSpecLinks;
|
|
491
|
-
|
|
492
395
|
var loadSpecs = function () {
|
|
493
396
|
var _ref12 = _asyncToGenerator(function* (sdk, links) {
|
|
494
397
|
for (var _spec2 of links) {
|
|
@@ -498,14 +401,11 @@ var loadSpecs = function () {
|
|
|
498
401
|
_spec2.api = _sdkModels.ApiModel.fromJson(upgradeSpecObject(json));
|
|
499
402
|
}
|
|
500
403
|
}
|
|
501
|
-
|
|
502
404
|
return links;
|
|
503
405
|
});
|
|
504
|
-
|
|
505
406
|
return function loadSpecs(_x4, _x5) {
|
|
506
407
|
return _ref12.apply(this, arguments);
|
|
507
408
|
};
|
|
508
409
|
}();
|
|
509
|
-
|
|
510
410
|
exports.loadSpecs = loadSpecs;
|
|
511
411
|
//# sourceMappingURL=specConverter.js.map
|
package/lib/specConverter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/specConverter.ts"],"names":["warn","warning","Error","appJson","include31","ver","status","version","swagger_url","test","getSpecsFromVersions","versions","fetcher","undefined","include","items","uniqueId","v","specKey","max","length","frag","substr","supported_versions","spec","key","isDefault","specURL","api","defaultMimeFormats","produces","consumes","swapXLookerTags","swaps","pattern","replacement","forEach","swap","replace","openApiStyle","collectionFormat","styles","csv","pipes","ssv","findOpenApiParam","endpoint","verb","name","result","paths","parameters","find","p","fixConversionObjects","swagger","fixes","Object","entries","op","httpMethod","method","operation","params","param","in","required","fix","operationId","requestBody","push","format","style","newParam","JSON","stringify","isSwagger","isOpenApi","openapi","fixConversion","openApiSpec","swaggerSpec","parse","swapRef","ref","structName","parts","split","convertParam","schema","type","explode","convertResponses","responses","formats","code","response","description","content","convertOp","moveKeys","moveKey","value","body","values","xdep","deprecated","convertPathsAndBodies","requestBodies","path","entry","ep","convertDefs","defs","_","struct","properties","prop","$ref","upgradeSpecObject","cleanup","schemas","definitions","info","tags","servers","url","schemes","host","basePath","components","upgradeSpec","getLookerSpecs","sdk","serverUrl","versionUrl","ok","get","getSpecLinks","prefix","looker_release_version","deriveSpec","current_version","specs","filter","map","loadSpecs","links","json","ApiModel","fromJson"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport isEmpty from 'lodash/isEmpty'\nimport type { APIMethods } from '@looker/sdk-rtl'\nimport type { ArgValues, IApiModel, KeyedCollection } from './sdkModels'\nimport { ApiModel } from './sdkModels'\n\nconst warn = (warning: string) => {\n throw new Error(warning)\n}\n\nconst appJson = 'application/json'\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersion {\n /**\n * Current Looker release version number (read-only)\n */\n looker_release_version?: string\n current_version?: IApiVersionElement\n /**\n * Array of versions supported by this Looker instance (read-only)\n */\n supported_versions?: IApiVersionElement[]\n /**\n * API server base url (read-only)\n */\n api_server_url?: string\n /**\n * Web server base url (read-only)\n */\n web_server_url?: string\n}\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersionElement {\n /**\n * Version number as it appears in '/api/xxx/' urls (read-only)\n */\n version?: string | null\n /**\n * Full version number including minor version (read-only)\n */\n full_version?: string | null\n /**\n * Status of this version (read-only)\n */\n status?: string | null\n /**\n * Url for swagger.json for this version (read-only)\n */\n swagger_url?: string | null\n}\n\n/**\n * Describes the mime types supported by an operation\n */\nexport interface MimeFormats {\n /**\n * Output types produced by an operation\n */\n produces: string[]\n /**\n * Input types accepted by an operation\n */\n consumes: string[]\n}\n\n/** codegen specification item */\nexport interface SpecItem {\n /** Key for specification in collection. Duplicated for atomic passing */\n key: string\n /** API version status */\n status: string // 'current' | 'deprecated' | 'experimental' | 'stable'\n /** API version of spec */\n version: string\n /** true if this is the default spec */\n isDefault: boolean\n /** Compiled version of spec */\n api?: ApiModel\n /** URL for retrieving spec */\n specURL?: string\n /** string content of spec */\n specContent?: string\n}\n\n/** Keyed collection of specification items */\nexport type SpecList = KeyedCollection<SpecItem>\n\n/**\n * Looker specification version item from versions payload\n */\nexport interface ISpecItem {\n /** Abbreviated version of the API */\n version: string\n /** Semantic version of the API */\n full_version: string\n /** Usually legacy, stable, experimental, current */\n status: string\n /** Link to the swagger specification */\n swagger_url: string\n}\n\n/**\n * Callback for fetching and compiling specification to ApiModel\n */\nexport type SpecFetcher = (spec: SpecItem) => Promise<ApiModel | undefined>\nexport type IncludeVersion = (version: IApiVersionElement) => boolean\n\n/**\n * Should this specification version be included?\n * @param ver to check\n */\nexport const include31 = (ver: IApiVersionElement) => {\n return (\n (ver.status &&\n ver.version &&\n ver.swagger_url &&\n ver.status !== 'internal_test' &&\n ver.status !== 'deprecated' &&\n ver.status !== 'legacy') ||\n /\\b3.1\\b/.test(ver.version || '') // unfortunately, need to hard-code this for API Explorer's spec selector\n )\n}\n\n/**\n * Return all public API specifications from an ApiVersion payload\n * @param versions payload from a Looker server\n * @param fetcher fetches and compiles spec to ApiModel\n * @param include test for specification version inclusion\n */\nexport const getSpecsFromVersions = async (\n versions: IApiVersion,\n fetcher: SpecFetcher | undefined = undefined,\n include: IncludeVersion = include31\n): Promise<SpecList> => {\n const items = {}\n\n /**\n * Create a unique spec key for this version\n * @param v version to identify\n */\n const uniqueId = (v: IApiVersionElement) => {\n let specKey = v.version || 'api'\n const max = v.status?.length || 0\n let frag = 1\n while (items[specKey]) {\n if (frag <= max) {\n // More than one spec for this version\n specKey = `${v.version}${v.status?.substr(0, frag)}`\n } else {\n specKey = `${v.version}${v.status}${frag}`\n }\n frag++\n }\n return specKey\n }\n\n if (versions.supported_versions) {\n for (const v of versions.supported_versions) {\n // Tell TypeScript these are all defined because IApiVersion definition is lax\n if (v.status && v.version && v.swagger_url) {\n if (include(v)) {\n const spec: SpecItem = {\n key: uniqueId(v),\n status: v.status,\n version: v.version,\n isDefault: v.status === 'current',\n specURL: v.swagger_url,\n }\n if (fetcher) {\n spec.api = await fetcher(spec)\n }\n items[spec.key] = spec\n }\n }\n }\n }\n return items\n}\n\n/**\n * Payload returned by the Looker /versions endpoint\n */\nexport interface ILookerVersions {\n /** This Looker version */\n looker_release_version: string\n /** The current/default API version */\n current_version: ISpecItem\n /** All API versions */\n supported_versions: ISpecItem[]\n /** API server url */\n api_server_url: string\n /** Web server url */\n web_server_url: string\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n\n/**\n * Api Specification with on-demand determination of values\n */\nexport interface IApiSpecLink {\n /** Name of the specification */\n name: string\n /** API version */\n version: string\n /** API version status */\n status: string\n /** Location of the specification */\n url: string\n /** Parsed content. Will be loaded on demand but is assigned to an empty object by default. */\n api: IApiModel\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\nexport type SpecLinks = IApiSpecLink[]\n\n/**\n * Defaults the mime formats for producing and consuming\n */\nexport const defaultMimeFormats: MimeFormats = {\n produces: [appJson],\n consumes: [appJson],\n}\n/**\n * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#style-values\n */\ntype OpenApiParameterStyle =\n | 'matrix'\n | 'label'\n | 'form'\n | 'simple'\n | 'spaceDelimited'\n | 'pipeDelimited'\n | 'deepObject'\n | undefined\n\n/**\n * Replaces x-looker-nullable with nullable for parameters and properties in a string\n * @param {string} spec\n * @returns {Promise<string>} name of the file written\n */\nexport const swapXLookerTags = (spec: string) => {\n const swaps = [\n { pattern: /x-looker-nullable/gi, replacement: 'nullable' },\n { pattern: /x-looker-values/gi, replacement: 'enum' },\n { pattern: /x-looker-deprecated/gi, replacement: 'deprecated' },\n ]\n swaps.forEach((swap) => {\n spec = spec.replace(swap.pattern, swap.replacement)\n })\n return spec\n}\n\n/**\n * Convert OpenAPI 2 collectionFormat to OpenApi 3 style\n *\n * See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#style-values for\n * conversion guidelines\n *\n * @param collectionFormat string\n * @returns the converted style, or undefined\n */\nexport const openApiStyle = (\n collectionFormat: string\n): OpenApiParameterStyle => {\n if (!collectionFormat) return undefined\n const styles: { [key: string]: OpenApiParameterStyle } = {\n csv: 'simple',\n pipes: 'pipeDelimited',\n ssv: 'spaceDelimited',\n }\n if (collectionFormat in styles) {\n return styles[collectionFormat]\n }\n return undefined\n}\n\n/**\n * Utility function to find the named parameter for an OpenAPI endpoint\n * @param api JSON structure of OpenAPI spec\n * @param endpoint url pattern for endpoint\n * @param verb HTTP method to locate\n * @param name name of parameter to find\n * @returns the matched parameter, or undefined\n */\nconst findOpenApiParam = (\n api: any,\n endpoint: string,\n verb: string,\n name: string\n) => {\n const result = api.paths[endpoint][verb].parameters.find(\n (p: { name: string }) => p.name === name\n )\n if (!result) {\n warn(`Missing parameter: ${endpoint} ${verb} parameter ${name}`)\n }\n return result\n}\n\n/**\n * Results of the spec conversion\n */\nexport interface IConversionResults {\n /**\n * JSON.stringify of the spec\n */\n spec: string\n /**\n * List of fixes to the spec\n */\n fixes: string[]\n}\n\nexport const fixConversionObjects = (api: any, swagger: any) => {\n const paths = swagger.paths\n const fixes: string[] = []\n Object.entries(paths).forEach(([endpoint, op]) => {\n Object.entries(op as any).forEach(([httpMethod, method]) => {\n const operation = method as any\n const params = operation.parameters\n if (params) {\n Object.entries(params).forEach(([, p]) => {\n const param = p as any\n if (param.name === 'body' && param.in === 'body') {\n // Set `required` in requestBody\n if ('required' in param) {\n // explicitly setting required value\n const required = param.required\n const fix = `${endpoint}::${operation.operationId} setting requestBody.required to ${required}`\n const requestBody = api.paths[endpoint][httpMethod].requestBody\n if (!requestBody) {\n warn(\n `Failed to find \"requestBody\" in OAS for swagger \"body param\" fix: ${fix}`\n )\n } else {\n if (requestBody.required !== required) {\n fixes.push(fix)\n }\n requestBody.required = required\n }\n }\n }\n\n if (param.collectionFormat) {\n // Set style from collectionFormat if it's not set\n const format = param.collectionFormat\n const style = openApiStyle(format)\n if (style === undefined) {\n warn(\n `OAS style conversion failed: collectionFormat '${param.collectionFormat}' is unknown`\n )\n } else {\n const fix = `${endpoint}::${operation.operationId} ${param.name} '${format}' -> '${style}'`\n const newParam = findOpenApiParam(\n api,\n endpoint,\n httpMethod,\n param.name\n )\n if (newParam && newParam.style !== style) {\n newParam.style = style\n fixes.push(fix)\n }\n }\n }\n })\n }\n })\n })\n\n return { fixes, spec: JSON.stringify(api) }\n}\n\n/**\n * Returns true if this spec is a swagger specification\n * @param spec to check\n */\nexport const isSwagger = (spec: any) => spec.swagger !== undefined\n\n/**\n * Returns true spec is an OpenAPI specification\n * @param spec to check\n */\nexport const isOpenApi = (spec: any) => spec.openapi !== undefined\n\n/**\n * This is a post-fix operation for the OpenAPI converter which currently misses this type of conversion\n *\n * - Converts missing swagger collectionFormat values to OpenAPI styles\n * - Flags OAS.requestBody as required or optional\n *\n * @param openApiSpec converted OpenAPI spec\n * @param swaggerSpec original swagger spec that may contain missed conversions\n * @returns modified openApiSpec and fix log in IConversionResults\n */\nexport const fixConversion = (\n openApiSpec: string,\n swaggerSpec: string\n): IConversionResults => {\n return fixConversionObjects(JSON.parse(openApiSpec), JSON.parse(swaggerSpec))\n}\n\n/**\n * Convert a swagger structure ref to an OpenAPI structure ref\n *\n * TODO update this to the typescript that understands replaceAll\n * @param ref string reference to convert\n */\nexport const swapRef = (ref: string) =>\n ref.replace(/#\\/definitions\\//g, '#/components/schemas/')\n\n/**\n * Get the name of the structure from the reference string\n * @param ref to partse\n */\nexport const structName = (ref: string) => {\n if (!ref) return undefined\n const parts = ref.split('/')\n return parts[parts.length - 1]\n}\n\n/**\n * Moves type, format, items to schema\n * Converts collectionFormat to style\n * @param param to convert\n */\nexport const convertParam = (param: any) => {\n const schema: any = { type: param.type }\n const result = { ...param }\n delete result.type\n if (param.format) {\n schema.format = param.format\n delete result.format\n }\n if (param.collectionFormat) {\n result.style = openApiStyle(param.collectionFormat)\n delete result.collectionFormat\n }\n if (param.items) {\n schema.items = param.items\n result.explode = false\n delete result.items\n }\n result.schema = schema\n return result\n}\n\n/**\n * Convert responses for the right response formats\n * @param responses response to convert\n * @param formats mime formats\n */\nexport const convertResponses = (\n responses: ArgValues,\n formats = defaultMimeFormats\n) => {\n Object.entries(responses).forEach(([code, response]) => {\n responses[code] = {\n description: response.description,\n }\n if (response.schema) {\n const content = {}\n formats.produces.forEach(\n (format) => (content[format] = { schema: response.schema })\n )\n responses[code].content = content\n }\n })\n return responses\n}\n\n/**\n * Convert an operation\n * Assign schemas in params, create request bodies, update $refs\n * @param op operation to convert\n * @param formats mime format consumer and producer\n * @param moveKeys true to move keys for reference OAS comparison\n */\nexport const convertOp = (\n op: ArgValues,\n formats = defaultMimeFormats,\n moveKeys = false\n) => {\n // If keys need to be shuffled for file comparison reasons, uncomment this function\n const moveKey = (key: string, value?: any) => {\n if (!moveKeys || !(key in op)) return value\n if (!value) value = op[key]\n if (value) {\n delete op[key]\n op[key] = value\n }\n return value\n }\n\n let { produces, consumes } = formats\n const body = {}\n if (op.produces) {\n produces = op.produces\n delete op.produces\n }\n if (op.consumes) {\n consumes = op.consumes\n delete op.consumes\n }\n if (op.parameters) {\n // Copy parameters before rebuilding\n const params = { ...op.parameters }\n op.parameters = []\n Object.values(params).forEach((p: any) => {\n if (p.in === 'body') {\n // const struct = structName(p.schema?.$ref)\n op.requestBody = {}\n // if (struct) {\n // op.requestBody.$ref = `#/components/requestBodies/${struct}`\n // }\n if (p.schema) {\n op.requestBody.content = { [consumes[0]]: { schema: p.schema } }\n }\n op.requestBody.description = p.description\n if ('required' in p) op.requestBody.required = p.required\n // if (struct) {\n // body[struct] = { ...op.requestBody }\n // body[struct].$ref = `#/components/schema/${struct}`\n // }\n } else {\n op.parameters.push(convertParam(p))\n }\n })\n if (op.parameters.length === 0) delete op.parameters\n }\n moveKey('responses', convertResponses(op.responses, { produces, consumes }))\n moveKey('deprecated')\n const xdep = 'x-looker-deprecated'\n if (xdep in op) {\n op.deprecated = op[xdep]\n delete op[xdep]\n }\n moveKey('x-looker-status')\n moveKey('x-looker-activity-type')\n moveKey('x-looker-rate-limited')\n return { op, body }\n}\n\n/**\n * Assign schemas and request bodies\n * @param paths to process\n * @param formats mime response types\n */\nexport const convertPathsAndBodies = (\n paths: ArgValues,\n formats = defaultMimeFormats\n) => {\n const result = { paths: {}, requestBodies: {} }\n Object.entries(paths).forEach(([path, entry]) => {\n result.paths[path] = {}\n // Hack to accommodate linting limitations\n const endpoint: ArgValues = entry\n Object.entries(endpoint).forEach(([verb, op]) => {\n const ep = convertOp(op, formats)\n result.paths[path][verb] = ep.op\n Object.entries(ep.body as ArgValues).forEach(([name, body]) => {\n result.requestBodies[name] = body\n })\n })\n })\n return result\n}\n\n/**\n * Convert structure definitions\n * @param defs to convert\n */\nexport const convertDefs = (defs: ArgValues): ArgValues => {\n Object.entries(defs).forEach(([_, struct]) => {\n Object.entries(struct.properties as ArgValues).forEach(([name, prop]) => {\n if (prop.$ref) {\n // Evidently OAS only wants the ref for the property type\n struct.properties[name] = { $ref: prop.$ref }\n }\n })\n })\n return defs\n}\n\n/**\n * On-demand conversion of swagger to openAPI specification\n * @param spec to possibly convert\n * @returns OpenAPI version of the specification or throws error if not Swagger or OpenAPI\n */\nexport const upgradeSpecObject = (spec: any) => {\n if (isOpenApi(spec)) {\n return JSON.parse(swapXLookerTags(JSON.stringify(spec)))\n }\n if (!isSwagger(spec)) {\n throw new Error('Input is not a Swagger or OpenAPI specification')\n }\n const cleanup = swapRef(swapXLookerTags(JSON.stringify(spec)))\n spec = JSON.parse(cleanup)\n const consumes = spec.consumes || [appJson]\n const produces = spec.produces || [appJson]\n const formats = { produces, consumes }\n const { paths, requestBodies } = convertPathsAndBodies(spec.paths, formats)\n // TODO create a requestBodies entry for every struct used > 1x?\n // TODO reassign op.requestBody for all requestBodies entries?\n const schemas = convertDefs(spec.definitions)\n const api = {\n openapi: '3.0.0',\n info: spec.info,\n tags: spec.tags,\n paths,\n servers: [{ url: `${spec.schemes[0]}://${spec.host}${spec.basePath}` }],\n components: {\n requestBodies,\n schemas: schemas,\n },\n }\n // const result = fixConversionObjects(api, spec)\n return api\n}\n\n/**\n * Upgrade a spec to OpenAPI if it's not already an OpenAPI spec\n * @param spec to upgrade\n */\nexport const upgradeSpec = (spec: string | Record<string, unknown>) => {\n if (typeof spec === 'string') spec = JSON.parse(spec)\n return JSON.stringify(upgradeSpecObject(spec))\n}\n\n/**\n * Fetches specs via /versions payload from the API server url\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param serverUrl base url of the /versions server. Typically something like https://my.looker.com:19999 or https://my.looker.com\n */\nexport const getLookerSpecs = async (sdk: APIMethods, serverUrl: string) => {\n const versionUrl = `${serverUrl}/versions`\n const versions = await sdk.ok(sdk.get<ILookerVersions, Error>(versionUrl))\n return versions\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n/**\n * Convert a Looker versions payload into API specification links\n * @param versions\n * @param include lambda that returns true to include a spec item in the list\n */\nexport const getSpecLinks = (\n versions: ILookerVersions,\n include = (spec: ISpecItem) => spec.version > '2.99'\n) => {\n const prefix = `Release ${versions.looker_release_version} API `\n const deriveSpec = (spec: ISpecItem): IApiSpecLink => {\n const status =\n spec.swagger_url === versions.current_version.swagger_url\n ? 'current'\n : spec.status\n return {\n name: `${prefix}${spec.version}`,\n version: spec.version,\n status,\n url: spec.swagger_url,\n api: {} as IApiModel,\n }\n }\n const specs = versions.supported_versions\n .filter((v) => include(v))\n .map((v) => deriveSpec(v))\n return specs\n}\n\n/**\n * Fetch and parse API specifications from the established links\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param links list of specifications to load\n */\nexport const loadSpecs = async (sdk: APIMethods, links: SpecLinks) => {\n for (const spec of links) {\n if (isEmpty(spec.api)) {\n // Not parsed yet\n const content = await sdk.ok<string, Error>(sdk.get(spec.url))\n const json = typeof content === 'string' ? JSON.parse(content) : content\n spec.api = ApiModel.fromJson(upgradeSpecObject(json))\n }\n }\n return links\n}\n"],"file":"specConverter.js"}
|
|
1
|
+
{"version":3,"file":"specConverter.js","names":["warn","warning","Error","appJson","include31","ver","status","version","swagger_url","test","getSpecsFromVersions","versions","fetcher","undefined","include","items","uniqueId","v","specKey","max","length","frag","substr","supported_versions","spec","key","isDefault","specURL","api","defaultMimeFormats","produces","consumes","swapXLookerTags","swaps","pattern","replacement","forEach","swap","replace","openApiStyle","collectionFormat","styles","csv","pipes","ssv","findOpenApiParam","endpoint","verb","name","result","paths","parameters","find","p","fixConversionObjects","swagger","fixes","Object","entries","op","httpMethod","method","operation","params","param","in","required","fix","operationId","requestBody","push","format","style","newParam","JSON","stringify","isSwagger","isOpenApi","openapi","fixConversion","openApiSpec","swaggerSpec","parse","swapRef","ref","structName","parts","split","convertParam","schema","type","explode","convertResponses","responses","formats","code","response","description","content","convertOp","moveKeys","moveKey","value","body","values","xdep","deprecated","convertPathsAndBodies","requestBodies","path","entry","ep","convertDefs","defs","_","struct","properties","prop","$ref","upgradeSpecObject","cleanup","schemas","definitions","info","tags","servers","url","schemes","host","basePath","components","upgradeSpec","getLookerSpecs","sdk","serverUrl","versionUrl","ok","get","getSpecLinks","prefix","looker_release_version","deriveSpec","current_version","specs","filter","map","loadSpecs","links","isEmpty","json","ApiModel","fromJson"],"sources":["../src/specConverter.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport isEmpty from 'lodash/isEmpty'\nimport type { APIMethods } from '@looker/sdk-rtl'\nimport type { ArgValues, IApiModel, KeyedCollection } from './sdkModels'\nimport { ApiModel } from './sdkModels'\n\nconst warn = (warning: string) => {\n throw new Error(warning)\n}\n\nconst appJson = 'application/json'\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersion {\n /**\n * Current Looker release version number (read-only)\n */\n looker_release_version?: string\n current_version?: IApiVersionElement\n /**\n * Array of versions supported by this Looker instance (read-only)\n */\n supported_versions?: IApiVersionElement[]\n /**\n * API server base url (read-only)\n */\n api_server_url?: string\n /**\n * Web server base url (read-only)\n */\n web_server_url?: string\n}\n\n/** This declaration is duplicated DIRECTLY from @looker/sdk API 4.0 models to detach dependency */\nexport interface IApiVersionElement {\n /**\n * Version number as it appears in '/api/xxx/' urls (read-only)\n */\n version?: string | null\n /**\n * Full version number including minor version (read-only)\n */\n full_version?: string | null\n /**\n * Status of this version (read-only)\n */\n status?: string | null\n /**\n * Url for swagger.json for this version (read-only)\n */\n swagger_url?: string | null\n}\n\n/**\n * Describes the mime types supported by an operation\n */\nexport interface MimeFormats {\n /**\n * Output types produced by an operation\n */\n produces: string[]\n /**\n * Input types accepted by an operation\n */\n consumes: string[]\n}\n\n/** codegen specification item */\nexport interface SpecItem {\n /** Key for specification in collection. Duplicated for atomic passing */\n key: string\n /** API version status */\n status: string // 'current' | 'deprecated' | 'experimental' | 'stable'\n /** API version of spec */\n version: string\n /** true if this is the default spec */\n isDefault: boolean\n /** Compiled version of spec */\n api?: ApiModel\n /** URL for retrieving spec */\n specURL?: string\n /** string content of spec */\n specContent?: string\n}\n\n/** Keyed collection of specification items */\nexport type SpecList = KeyedCollection<SpecItem>\n\n/**\n * Looker specification version item from versions payload\n */\nexport interface ISpecItem {\n /** Abbreviated version of the API */\n version: string\n /** Semantic version of the API */\n full_version: string\n /** Usually legacy, stable, experimental, current */\n status: string\n /** Link to the swagger specification */\n swagger_url: string\n}\n\n/**\n * Callback for fetching and compiling specification to ApiModel\n */\nexport type SpecFetcher = (spec: SpecItem) => Promise<ApiModel | undefined>\nexport type IncludeVersion = (version: IApiVersionElement) => boolean\n\n/**\n * Should this specification version be included?\n * @param ver to check\n */\nexport const include31 = (ver: IApiVersionElement) => {\n return (\n (ver.status &&\n ver.version &&\n ver.swagger_url &&\n ver.status !== 'internal_test' &&\n ver.status !== 'deprecated' &&\n ver.status !== 'legacy') ||\n /\\b3.1\\b/.test(ver.version || '') // unfortunately, need to hard-code this for API Explorer's spec selector\n )\n}\n\n/**\n * Return all public API specifications from an ApiVersion payload\n * @param versions payload from a Looker server\n * @param fetcher fetches and compiles spec to ApiModel\n * @param include test for specification version inclusion\n */\nexport const getSpecsFromVersions = async (\n versions: IApiVersion,\n fetcher: SpecFetcher | undefined = undefined,\n include: IncludeVersion = include31\n): Promise<SpecList> => {\n const items = {}\n\n /**\n * Create a unique spec key for this version\n * @param v version to identify\n */\n const uniqueId = (v: IApiVersionElement) => {\n let specKey = v.version || 'api'\n const max = v.status?.length || 0\n let frag = 1\n while (items[specKey]) {\n if (frag <= max) {\n // More than one spec for this version\n specKey = `${v.version}${v.status?.substr(0, frag)}`\n } else {\n specKey = `${v.version}${v.status}${frag}`\n }\n frag++\n }\n return specKey\n }\n\n if (versions.supported_versions) {\n for (const v of versions.supported_versions) {\n // Tell TypeScript these are all defined because IApiVersion definition is lax\n if (v.status && v.version && v.swagger_url) {\n if (include(v)) {\n const spec: SpecItem = {\n key: uniqueId(v),\n status: v.status,\n version: v.version,\n isDefault: v.status === 'current',\n specURL: v.swagger_url,\n }\n if (fetcher) {\n spec.api = await fetcher(spec)\n }\n items[spec.key] = spec\n }\n }\n }\n }\n return items\n}\n\n/**\n * Payload returned by the Looker /versions endpoint\n */\nexport interface ILookerVersions {\n /** This Looker version */\n looker_release_version: string\n /** The current/default API version */\n current_version: ISpecItem\n /** All API versions */\n supported_versions: ISpecItem[]\n /** API server url */\n api_server_url: string\n /** Web server url */\n web_server_url: string\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n\n/**\n * Api Specification with on-demand determination of values\n */\nexport interface IApiSpecLink {\n /** Name of the specification */\n name: string\n /** API version */\n version: string\n /** API version status */\n status: string\n /** Location of the specification */\n url: string\n /** Parsed content. Will be loaded on demand but is assigned to an empty object by default. */\n api: IApiModel\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\nexport type SpecLinks = IApiSpecLink[]\n\n/**\n * Defaults the mime formats for producing and consuming\n */\nexport const defaultMimeFormats: MimeFormats = {\n produces: [appJson],\n consumes: [appJson],\n}\n/**\n * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#style-values\n */\ntype OpenApiParameterStyle =\n | 'matrix'\n | 'label'\n | 'form'\n | 'simple'\n | 'spaceDelimited'\n | 'pipeDelimited'\n | 'deepObject'\n | undefined\n\n/**\n * Replaces x-looker-nullable with nullable for parameters and properties in a string\n * @param {string} spec\n * @returns {Promise<string>} name of the file written\n */\nexport const swapXLookerTags = (spec: string) => {\n const swaps = [\n { pattern: /x-looker-nullable/gi, replacement: 'nullable' },\n { pattern: /x-looker-values/gi, replacement: 'enum' },\n { pattern: /x-looker-deprecated/gi, replacement: 'deprecated' },\n ]\n swaps.forEach((swap) => {\n spec = spec.replace(swap.pattern, swap.replacement)\n })\n return spec\n}\n\n/**\n * Convert OpenAPI 2 collectionFormat to OpenApi 3 style\n *\n * See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#style-values for\n * conversion guidelines\n *\n * @param collectionFormat string\n * @returns the converted style, or undefined\n */\nexport const openApiStyle = (\n collectionFormat: string\n): OpenApiParameterStyle => {\n if (!collectionFormat) return undefined\n const styles: { [key: string]: OpenApiParameterStyle } = {\n csv: 'simple',\n pipes: 'pipeDelimited',\n ssv: 'spaceDelimited',\n }\n if (collectionFormat in styles) {\n return styles[collectionFormat]\n }\n return undefined\n}\n\n/**\n * Utility function to find the named parameter for an OpenAPI endpoint\n * @param api JSON structure of OpenAPI spec\n * @param endpoint url pattern for endpoint\n * @param verb HTTP method to locate\n * @param name name of parameter to find\n * @returns the matched parameter, or undefined\n */\nconst findOpenApiParam = (\n api: any,\n endpoint: string,\n verb: string,\n name: string\n) => {\n const result = api.paths[endpoint][verb].parameters.find(\n (p: { name: string }) => p.name === name\n )\n if (!result) {\n warn(`Missing parameter: ${endpoint} ${verb} parameter ${name}`)\n }\n return result\n}\n\n/**\n * Results of the spec conversion\n */\nexport interface IConversionResults {\n /**\n * JSON.stringify of the spec\n */\n spec: string\n /**\n * List of fixes to the spec\n */\n fixes: string[]\n}\n\nexport const fixConversionObjects = (api: any, swagger: any) => {\n const paths = swagger.paths\n const fixes: string[] = []\n Object.entries(paths).forEach(([endpoint, op]) => {\n Object.entries(op as any).forEach(([httpMethod, method]) => {\n const operation = method as any\n const params = operation.parameters\n if (params) {\n Object.entries(params).forEach(([, p]) => {\n const param = p as any\n if (param.name === 'body' && param.in === 'body') {\n // Set `required` in requestBody\n if ('required' in param) {\n // explicitly setting required value\n const required = param.required\n const fix = `${endpoint}::${operation.operationId} setting requestBody.required to ${required}`\n const requestBody = api.paths[endpoint][httpMethod].requestBody\n if (!requestBody) {\n warn(\n `Failed to find \"requestBody\" in OAS for swagger \"body param\" fix: ${fix}`\n )\n } else {\n if (requestBody.required !== required) {\n fixes.push(fix)\n }\n requestBody.required = required\n }\n }\n }\n\n if (param.collectionFormat) {\n // Set style from collectionFormat if it's not set\n const format = param.collectionFormat\n const style = openApiStyle(format)\n if (style === undefined) {\n warn(\n `OAS style conversion failed: collectionFormat '${param.collectionFormat}' is unknown`\n )\n } else {\n const fix = `${endpoint}::${operation.operationId} ${param.name} '${format}' -> '${style}'`\n const newParam = findOpenApiParam(\n api,\n endpoint,\n httpMethod,\n param.name\n )\n if (newParam && newParam.style !== style) {\n newParam.style = style\n fixes.push(fix)\n }\n }\n }\n })\n }\n })\n })\n\n return { fixes, spec: JSON.stringify(api) }\n}\n\n/**\n * Returns true if this spec is a swagger specification\n * @param spec to check\n */\nexport const isSwagger = (spec: any) => spec.swagger !== undefined\n\n/**\n * Returns true spec is an OpenAPI specification\n * @param spec to check\n */\nexport const isOpenApi = (spec: any) => spec.openapi !== undefined\n\n/**\n * This is a post-fix operation for the OpenAPI converter which currently misses this type of conversion\n *\n * - Converts missing swagger collectionFormat values to OpenAPI styles\n * - Flags OAS.requestBody as required or optional\n *\n * @param openApiSpec converted OpenAPI spec\n * @param swaggerSpec original swagger spec that may contain missed conversions\n * @returns modified openApiSpec and fix log in IConversionResults\n */\nexport const fixConversion = (\n openApiSpec: string,\n swaggerSpec: string\n): IConversionResults => {\n return fixConversionObjects(JSON.parse(openApiSpec), JSON.parse(swaggerSpec))\n}\n\n/**\n * Convert a swagger structure ref to an OpenAPI structure ref\n *\n * TODO update this to the typescript that understands replaceAll\n * @param ref string reference to convert\n */\nexport const swapRef = (ref: string) =>\n ref.replace(/#\\/definitions\\//g, '#/components/schemas/')\n\n/**\n * Get the name of the structure from the reference string\n * @param ref to partse\n */\nexport const structName = (ref: string) => {\n if (!ref) return undefined\n const parts = ref.split('/')\n return parts[parts.length - 1]\n}\n\n/**\n * Moves type, format, items to schema\n * Converts collectionFormat to style\n * @param param to convert\n */\nexport const convertParam = (param: any) => {\n const schema: any = { type: param.type }\n const result = { ...param }\n delete result.type\n if (param.format) {\n schema.format = param.format\n delete result.format\n }\n if (param.collectionFormat) {\n result.style = openApiStyle(param.collectionFormat)\n delete result.collectionFormat\n }\n if (param.items) {\n schema.items = param.items\n result.explode = false\n delete result.items\n }\n result.schema = schema\n return result\n}\n\n/**\n * Convert responses for the right response formats\n * @param responses response to convert\n * @param formats mime formats\n */\nexport const convertResponses = (\n responses: ArgValues,\n formats = defaultMimeFormats\n) => {\n Object.entries(responses).forEach(([code, response]) => {\n responses[code] = {\n description: response.description,\n }\n if (response.schema) {\n const content = {}\n formats.produces.forEach(\n (format) => (content[format] = { schema: response.schema })\n )\n responses[code].content = content\n }\n })\n return responses\n}\n\n/**\n * Convert an operation\n * Assign schemas in params, create request bodies, update $refs\n * @param op operation to convert\n * @param formats mime format consumer and producer\n * @param moveKeys true to move keys for reference OAS comparison\n */\nexport const convertOp = (\n op: ArgValues,\n formats = defaultMimeFormats,\n moveKeys = false\n) => {\n // If keys need to be shuffled for file comparison reasons, uncomment this function\n const moveKey = (key: string, value?: any) => {\n if (!moveKeys || !(key in op)) return value\n if (!value) value = op[key]\n if (value) {\n delete op[key]\n op[key] = value\n }\n return value\n }\n\n let { produces, consumes } = formats\n const body = {}\n if (op.produces) {\n produces = op.produces\n delete op.produces\n }\n if (op.consumes) {\n consumes = op.consumes\n delete op.consumes\n }\n if (op.parameters) {\n // Copy parameters before rebuilding\n const params = { ...op.parameters }\n op.parameters = []\n Object.values(params).forEach((p: any) => {\n if (p.in === 'body') {\n // const struct = structName(p.schema?.$ref)\n op.requestBody = {}\n // if (struct) {\n // op.requestBody.$ref = `#/components/requestBodies/${struct}`\n // }\n if (p.schema) {\n op.requestBody.content = { [consumes[0]]: { schema: p.schema } }\n }\n op.requestBody.description = p.description\n if ('required' in p) op.requestBody.required = p.required\n // if (struct) {\n // body[struct] = { ...op.requestBody }\n // body[struct].$ref = `#/components/schema/${struct}`\n // }\n } else {\n op.parameters.push(convertParam(p))\n }\n })\n if (op.parameters.length === 0) delete op.parameters\n }\n moveKey('responses', convertResponses(op.responses, { produces, consumes }))\n moveKey('deprecated')\n const xdep = 'x-looker-deprecated'\n if (xdep in op) {\n op.deprecated = op[xdep]\n delete op[xdep]\n }\n moveKey('x-looker-status')\n moveKey('x-looker-activity-type')\n moveKey('x-looker-rate-limited')\n return { op, body }\n}\n\n/**\n * Assign schemas and request bodies\n * @param paths to process\n * @param formats mime response types\n */\nexport const convertPathsAndBodies = (\n paths: ArgValues,\n formats = defaultMimeFormats\n) => {\n const result = { paths: {}, requestBodies: {} }\n Object.entries(paths).forEach(([path, entry]) => {\n result.paths[path] = {}\n // Hack to accommodate linting limitations\n const endpoint: ArgValues = entry\n Object.entries(endpoint).forEach(([verb, op]) => {\n const ep = convertOp(op, formats)\n result.paths[path][verb] = ep.op\n Object.entries(ep.body as ArgValues).forEach(([name, body]) => {\n result.requestBodies[name] = body\n })\n })\n })\n return result\n}\n\n/**\n * Convert structure definitions\n * @param defs to convert\n */\nexport const convertDefs = (defs: ArgValues): ArgValues => {\n Object.entries(defs).forEach(([_, struct]) => {\n Object.entries(struct.properties as ArgValues).forEach(([name, prop]) => {\n if (prop.$ref) {\n // Evidently OAS only wants the ref for the property type\n struct.properties[name] = { $ref: prop.$ref }\n }\n })\n })\n return defs\n}\n\n/**\n * On-demand conversion of swagger to openAPI specification\n * @param spec to possibly convert\n * @returns OpenAPI version of the specification or throws error if not Swagger or OpenAPI\n */\nexport const upgradeSpecObject = (spec: any) => {\n if (isOpenApi(spec)) {\n return JSON.parse(swapXLookerTags(JSON.stringify(spec)))\n }\n if (!isSwagger(spec)) {\n throw new Error('Input is not a Swagger or OpenAPI specification')\n }\n const cleanup = swapRef(swapXLookerTags(JSON.stringify(spec)))\n spec = JSON.parse(cleanup)\n const consumes = spec.consumes || [appJson]\n const produces = spec.produces || [appJson]\n const formats = { produces, consumes }\n const { paths, requestBodies } = convertPathsAndBodies(spec.paths, formats)\n // TODO create a requestBodies entry for every struct used > 1x?\n // TODO reassign op.requestBody for all requestBodies entries?\n const schemas = convertDefs(spec.definitions)\n const api = {\n openapi: '3.0.0',\n info: spec.info,\n tags: spec.tags,\n paths,\n servers: [{ url: `${spec.schemes[0]}://${spec.host}${spec.basePath}` }],\n components: {\n requestBodies,\n schemas: schemas,\n },\n }\n // const result = fixConversionObjects(api, spec)\n return api\n}\n\n/**\n * Upgrade a spec to OpenAPI if it's not already an OpenAPI spec\n * @param spec to upgrade\n */\nexport const upgradeSpec = (spec: string | Record<string, unknown>) => {\n if (typeof spec === 'string') spec = JSON.parse(spec)\n return JSON.stringify(upgradeSpecObject(spec))\n}\n\n/**\n * Fetches specs via /versions payload from the API server url\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param serverUrl base url of the /versions server. Typically something like https://my.looker.com:19999 or https://my.looker.com\n */\nexport const getLookerSpecs = async (sdk: APIMethods, serverUrl: string) => {\n const versionUrl = `${serverUrl}/versions`\n const versions = await sdk.ok(sdk.get<ILookerVersions, Error>(versionUrl))\n return versions\n}\n\n// TODO this work was duplicated in API Explorer. Need to merge and use one version.\n/**\n * Convert a Looker versions payload into API specification links\n * @param versions\n * @param include lambda that returns true to include a spec item in the list\n */\nexport const getSpecLinks = (\n versions: ILookerVersions,\n include = (spec: ISpecItem) => spec.version > '2.99'\n) => {\n const prefix = `Release ${versions.looker_release_version} API `\n const deriveSpec = (spec: ISpecItem): IApiSpecLink => {\n const status =\n spec.swagger_url === versions.current_version.swagger_url\n ? 'current'\n : spec.status\n return {\n name: `${prefix}${spec.version}`,\n version: spec.version,\n status,\n url: spec.swagger_url,\n api: {} as IApiModel,\n }\n }\n const specs = versions.supported_versions\n .filter((v) => include(v))\n .map((v) => deriveSpec(v))\n return specs\n}\n\n/**\n * Fetch and parse API specifications from the established links\n * @param sdk APIMethods implementation that supports authenticating a request\n * @param links list of specifications to load\n */\nexport const loadSpecs = async (sdk: APIMethods, links: SpecLinks) => {\n for (const spec of links) {\n if (isEmpty(spec.api)) {\n // Not parsed yet\n const content = await sdk.ok<string, Error>(sdk.get(spec.url))\n const json = typeof content === 'string' ? JSON.parse(content) : content\n spec.api = ApiModel.fromJson(upgradeSpecObject(json))\n }\n }\n return links\n}\n"],"mappings":"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"}
|