@devbie/apits 0.0.0-stage → 1.0.1
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/README.md +89 -2
- package/bin/apits +4 -0
- package/dist/cjs/core/cli.d.ts +29 -0
- package/dist/cjs/core/cli.js +396 -0
- package/dist/cjs/core/generator.js +301 -0
- package/dist/cjs/core/writeRequestClient.js +93 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/types.js +90 -0
- package/dist/cjs/utils/console.js +79 -0
- package/dist/cjs/utils/getOutputPath.js +43 -0
- package/dist/cjs/utils/helpers.js +166 -0
- package/dist/cjs/utils/openApiToInterfaces.js +229 -0
- package/dist/cjs/utils/spinner.js +69 -0
- package/dist/cjs/utils/utils.d.ts +56 -0
- package/dist/cjs/utils/utils.js +355 -0
- package/dist/cjs/utils/vtilsLite.js +123 -0
- package/dist/esm/core/cli.d.mts +29 -0
- package/dist/esm/core/cli.mjs +713 -0
- package/dist/esm/core/generator.mjs +463 -0
- package/dist/esm/core/writeRequestClient.mjs +54 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/types.mjs +94 -0
- package/dist/esm/utils/console.mjs +65 -0
- package/dist/esm/utils/getOutputPath.mjs +12 -0
- package/dist/esm/utils/helpers.mjs +226 -0
- package/dist/esm/utils/openApiToInterfaces.mjs +326 -0
- package/dist/esm/utils/spinner.mjs +58 -0
- package/dist/esm/utils/utils.d.mts +56 -0
- package/dist/esm/utils/utils.mjs +545 -0
- package/dist/esm/utils/vtilsLite.mjs +142 -0
- package/package.json +68 -4
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
2
|
+
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); } }
|
|
3
|
+
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); }); }; }
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
+
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; }
|
|
7
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
8
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
9
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
10
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
13
|
+
import { RequestBodyType, RequestFormItemType, Required, ResponseBodyType } from "../types.mjs";
|
|
14
|
+
import { each, find } from "./vtilsLite.mjs";
|
|
15
|
+
import * as conso from "./console.mjs";
|
|
16
|
+
function handlePath(p) {
|
|
17
|
+
if (p === "/") return p;
|
|
18
|
+
if (p.charAt(0) !== "/") p = "/".concat(p);
|
|
19
|
+
if (p.charAt(p.length - 1) === "/") p = p.slice(0, -1);
|
|
20
|
+
return p;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Resolve a JSON `$ref` pointer (e.g. `#/components/parameters/Foo`) from the root spec. */
|
|
24
|
+
function resolveRef(ref, root) {
|
|
25
|
+
var _node;
|
|
26
|
+
if (!ref || typeof ref !== "string" || !ref.startsWith("#/") || ref.length <= 2) return null;
|
|
27
|
+
var parts = ref.slice(2).split("/").filter(Boolean);
|
|
28
|
+
var node = root;
|
|
29
|
+
var _iterator = _createForOfIteratorHelper(parts),
|
|
30
|
+
_step;
|
|
31
|
+
try {
|
|
32
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
33
|
+
var part = _step.value;
|
|
34
|
+
if (node == null) return null;
|
|
35
|
+
node = node[part];
|
|
36
|
+
}
|
|
37
|
+
} catch (err) {
|
|
38
|
+
_iterator.e(err);
|
|
39
|
+
} finally {
|
|
40
|
+
_iterator.f();
|
|
41
|
+
}
|
|
42
|
+
return (_node = node) !== null && _node !== void 0 ? _node : null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Check whether a value is a `$ref` object (vs a concrete schema). */
|
|
46
|
+
function isRef(obj) {
|
|
47
|
+
return obj != null && _typeof(obj) === "object" && "$ref" in obj;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Process the OAS3 request body directly — no intermediate Swagger 2.0
|
|
52
|
+
* `parameters[]` with `in:'body'`/`in:'formData'`.
|
|
53
|
+
*
|
|
54
|
+
* - `application/json` → `req_body_other` (JSON-stringified schema) + `req_body_type='json'`
|
|
55
|
+
* - `multipart/form-data` / `application/x-www-form-urlencoded` → expand schema
|
|
56
|
+
* properties into `req_body_form` + `req_body_type='form'`
|
|
57
|
+
* - `additionalProperties` on a form schema → `req_body_additional`
|
|
58
|
+
*/
|
|
59
|
+
function handleRequestBody(requestBody, api) {
|
|
60
|
+
if (!requestBody || _typeof(requestBody) !== "object") return;
|
|
61
|
+
var content = requestBody.content || {};
|
|
62
|
+
var jsonContent = content["application/json"];
|
|
63
|
+
if (jsonContent && jsonContent.schema) {
|
|
64
|
+
api.req_body_other = JSON.stringify(jsonContent.schema, null, 2);
|
|
65
|
+
api.req_body_type = RequestBodyType.json;
|
|
66
|
+
api.req_body_is_json_schema = true;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Form-encoded bodies: expand the schema into individual form fields so
|
|
71
|
+
// binary fields render as `file` and the request body type becomes `form`.
|
|
72
|
+
var multipartContent = content["multipart/form-data"];
|
|
73
|
+
var formContent = multipartContent || content["application/x-www-form-urlencoded"];
|
|
74
|
+
if (formContent && formContent.schema) {
|
|
75
|
+
var schema = formContent.schema;
|
|
76
|
+
// Skip $ref schemas (not resolvable in this context).
|
|
77
|
+
if (isRef(schema)) return;
|
|
78
|
+
var required = schema.required || [];
|
|
79
|
+
var props = schema.properties || {};
|
|
80
|
+
for (var _i = 0, _Object$keys = Object.keys(props); _i < _Object$keys.length; _i++) {
|
|
81
|
+
var name = _Object$keys[_i];
|
|
82
|
+
var prop = props[name] || {};
|
|
83
|
+
// Binary arrays (`type:'array', items:{format:'binary'}`) describe
|
|
84
|
+
// multi-file upload fields such as `files: File[]`. Swagger 2.0
|
|
85
|
+
// formData has no array-of-file concept, so the field is emitted
|
|
86
|
+
// as `type:'file'` with an `isArray` marker.
|
|
87
|
+
var arrayItems = Array.isArray(prop.items) ? prop.items[0] : prop.items;
|
|
88
|
+
var isFileArray = prop.type === "array" && arrayItems && arrayItems.format === "binary";
|
|
89
|
+
var isFile = prop.format === "binary" || isFileArray;
|
|
90
|
+
api.req_body_form.push(_objectSpread(_objectSpread({
|
|
91
|
+
name: name,
|
|
92
|
+
type: isFile ? RequestFormItemType.file : RequestFormItemType.text,
|
|
93
|
+
desc: prop.description || "",
|
|
94
|
+
example: "",
|
|
95
|
+
required: required.indexOf(name) > -1 ? Required.true : Required.false
|
|
96
|
+
}, isFileArray ? {
|
|
97
|
+
isArray: true
|
|
98
|
+
} : {}), Array.isArray(prop.enum) && prop.enum.length ? {
|
|
99
|
+
enum: prop.enum
|
|
100
|
+
} : {}));
|
|
101
|
+
}
|
|
102
|
+
// Dynamic upload fields declared via `additionalProperties` (e.g.
|
|
103
|
+
// evidence_0, evidence_1, ...). Their names are derived at runtime so
|
|
104
|
+
// they cannot be expanded into named form params.
|
|
105
|
+
if (schema.additionalProperties && _typeof(schema.additionalProperties) === "object") {
|
|
106
|
+
api.req_body_additional = schema.additionalProperties;
|
|
107
|
+
}
|
|
108
|
+
api.req_body_type = RequestBodyType.form;
|
|
109
|
+
api.req_body_multipart = !!multipartContent;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Process the OAS3 responses object directly — no intermediate Swagger 2.0
|
|
115
|
+
* pre-flattening of `res.content['application/json']` to `res.schema`.
|
|
116
|
+
*
|
|
117
|
+
* Reads `res.content` media types to determine whether a JSON schema exists.
|
|
118
|
+
*/
|
|
119
|
+
function handleResponse(responses) {
|
|
120
|
+
if (!responses || _typeof(responses) !== "object") return {
|
|
121
|
+
body: "",
|
|
122
|
+
hasSchema: false
|
|
123
|
+
};
|
|
124
|
+
var codes = Object.keys(responses);
|
|
125
|
+
if (codes.length === 0) return {
|
|
126
|
+
body: "",
|
|
127
|
+
hasSchema: false
|
|
128
|
+
};
|
|
129
|
+
var curCode = codes.indexOf("200") > -1 ? "200" : codes[0];
|
|
130
|
+
var res = responses[curCode];
|
|
131
|
+
if (!res || _typeof(res) !== "object") {
|
|
132
|
+
return {
|
|
133
|
+
body: "",
|
|
134
|
+
hasSchema: false
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Skip $ref responses (not resolvable in this context).
|
|
139
|
+
if (isRef(res)) return {
|
|
140
|
+
body: "",
|
|
141
|
+
hasSchema: false
|
|
142
|
+
};
|
|
143
|
+
var content = res.content;
|
|
144
|
+
if (content && _typeof(content) === "object") {
|
|
145
|
+
// Prefer application/json, then hal+json, then */*.
|
|
146
|
+
var mediaType = content["application/json"] || content["application/hal+json"] || content["*/*"];
|
|
147
|
+
if (mediaType && mediaType.schema) {
|
|
148
|
+
return {
|
|
149
|
+
body: JSON.stringify(mediaType.schema, null, 2),
|
|
150
|
+
hasSchema: true
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// No schema found — fall back to description.
|
|
156
|
+
if (res.description) return {
|
|
157
|
+
body: res.description,
|
|
158
|
+
hasSchema: false
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
body: "",
|
|
162
|
+
hasSchema: false
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Convert a single OAS3 path-item operation into an `Interface`. */
|
|
167
|
+
function handleOpenApiOperation(operation, path, method, originTags, root) {
|
|
168
|
+
var api = {
|
|
169
|
+
title: operation.summary || path,
|
|
170
|
+
path: handlePath(path),
|
|
171
|
+
method: method.toUpperCase(),
|
|
172
|
+
req_params: [],
|
|
173
|
+
req_body_form: [],
|
|
174
|
+
req_query: [],
|
|
175
|
+
req_body_type: RequestBodyType.raw,
|
|
176
|
+
req_body_is_json_schema: false,
|
|
177
|
+
req_body_other: "",
|
|
178
|
+
res_body_type: ResponseBodyType.raw,
|
|
179
|
+
res_body_is_json_schema: false,
|
|
180
|
+
res_body: ""
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// Category from tags.
|
|
184
|
+
api.catname = null;
|
|
185
|
+
if (Array.isArray(operation.tags)) {
|
|
186
|
+
var _iterator2 = _createForOfIteratorHelper(operation.tags),
|
|
187
|
+
_step2;
|
|
188
|
+
try {
|
|
189
|
+
var _loop = function _loop() {
|
|
190
|
+
var tag = _step2.value;
|
|
191
|
+
if (/v[0-9.]+/.test(tag)) return 0; // continue
|
|
192
|
+
if (originTags.length > 0 && find(originTags, function (item) {
|
|
193
|
+
return item.name === tag;
|
|
194
|
+
})) {
|
|
195
|
+
api.catname = tag;
|
|
196
|
+
return 1; // break
|
|
197
|
+
}
|
|
198
|
+
if (originTags.length === 0) {
|
|
199
|
+
api.catname = tag;
|
|
200
|
+
return 1; // break
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
_ret;
|
|
204
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
205
|
+
_ret = _loop();
|
|
206
|
+
if (_ret === 0) continue;
|
|
207
|
+
if (_ret === 1) break;
|
|
208
|
+
}
|
|
209
|
+
} catch (err) {
|
|
210
|
+
_iterator2.e(err);
|
|
211
|
+
} finally {
|
|
212
|
+
_iterator2.f();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Process OAS3 path/query/header parameters (native — no Swagger 2.0
|
|
217
|
+
// `in:'body'`/`in:'formData'` intermediates).
|
|
218
|
+
if (Array.isArray(operation.parameters)) {
|
|
219
|
+
var _iterator3 = _createForOfIteratorHelper(operation.parameters),
|
|
220
|
+
_step3;
|
|
221
|
+
try {
|
|
222
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
223
|
+
var param = _step3.value;
|
|
224
|
+
if (isRef(param)) {
|
|
225
|
+
param = resolveRef(param.$ref, root);
|
|
226
|
+
}
|
|
227
|
+
if (!param || _typeof(param) !== "object") continue;
|
|
228
|
+
var p = param;
|
|
229
|
+
var paramObj = {
|
|
230
|
+
name: p.name,
|
|
231
|
+
desc: p.description || "",
|
|
232
|
+
type: p.schema ? p.schema.type : p.type,
|
|
233
|
+
required: p.required ? Required.true : Required.false,
|
|
234
|
+
example: ""
|
|
235
|
+
};
|
|
236
|
+
switch (p.in) {
|
|
237
|
+
case "path":
|
|
238
|
+
api.req_params.push(paramObj);
|
|
239
|
+
break;
|
|
240
|
+
case "query":
|
|
241
|
+
api.req_query.push(paramObj);
|
|
242
|
+
break;
|
|
243
|
+
case "header":
|
|
244
|
+
// Headers are not consumed downstream; skip silently.
|
|
245
|
+
break;
|
|
246
|
+
default:
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
} catch (err) {
|
|
251
|
+
_iterator3.e(err);
|
|
252
|
+
} finally {
|
|
253
|
+
_iterator3.f();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Process the OAS3 request body directly.
|
|
258
|
+
var reqBody = operation.requestBody;
|
|
259
|
+
handleRequestBody(isRef(reqBody) ? undefined : reqBody, api);
|
|
260
|
+
|
|
261
|
+
// Process the OAS3 responses directly.
|
|
262
|
+
var _handleResponse = handleResponse(operation.responses),
|
|
263
|
+
resBody = _handleResponse.body,
|
|
264
|
+
hasSchema = _handleResponse.hasSchema;
|
|
265
|
+
api.res_body = resBody;
|
|
266
|
+
if (hasSchema) {
|
|
267
|
+
api.res_body_type = ResponseBodyType.json;
|
|
268
|
+
api.res_body_is_json_schema = true;
|
|
269
|
+
} else if (resBody) {
|
|
270
|
+
api.res_body_type = ResponseBodyType.raw;
|
|
271
|
+
}
|
|
272
|
+
return api;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Convert an OpenAPI 3.x document into the internal `Interface[]` format.
|
|
277
|
+
*
|
|
278
|
+
* Reads OAS3 directly — no intermediate Swagger 2.0 `openapi3Format` step,
|
|
279
|
+
* no YApi platform fields (`_id`/`project_id`/`catid`/`add_time`/`up_time`),
|
|
280
|
+
* no module-level mutable state.
|
|
281
|
+
*
|
|
282
|
+
* @param data OpenAPI 3.x document (object or JSON string)
|
|
283
|
+
*/
|
|
284
|
+
export function openApiToInterfaces(_x) {
|
|
285
|
+
return _openApiToInterfaces.apply(this, arguments);
|
|
286
|
+
}
|
|
287
|
+
function _openApiToInterfaces() {
|
|
288
|
+
_openApiToInterfaces = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(data) {
|
|
289
|
+
var doc, tags, interfaces;
|
|
290
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
291
|
+
while (1) switch (_context.prev = _context.next) {
|
|
292
|
+
case 0:
|
|
293
|
+
if (typeof data === "string" && data) {
|
|
294
|
+
try {
|
|
295
|
+
data = JSON.parse(data);
|
|
296
|
+
} catch (e) {
|
|
297
|
+
conso.error("Failed to parse JSON: ".concat(e.message));
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
doc = data;
|
|
301
|
+
tags = Array.isArray(doc.tags) ? doc.tags : [];
|
|
302
|
+
interfaces = [];
|
|
303
|
+
each(doc.paths || {}, function (pathItem, path) {
|
|
304
|
+
// `parameters` at the path-item level are common parameters, not an operation.
|
|
305
|
+
delete pathItem.parameters;
|
|
306
|
+
each(pathItem, function (operation, method) {
|
|
307
|
+
if (!operation || _typeof(operation) !== "object") return;
|
|
308
|
+
try {
|
|
309
|
+
var iface = handleOpenApiOperation(operation, path, method, tags, doc);
|
|
310
|
+
interfaces.push(iface);
|
|
311
|
+
} catch (_unused) {
|
|
312
|
+
// Skip malformed operations silently.
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
return _context.abrupt("return", {
|
|
317
|
+
interfaces: interfaces
|
|
318
|
+
});
|
|
319
|
+
case 6:
|
|
320
|
+
case "end":
|
|
321
|
+
return _context.stop();
|
|
322
|
+
}
|
|
323
|
+
}, _callee);
|
|
324
|
+
}));
|
|
325
|
+
return _openApiToInterfaces.apply(this, arguments);
|
|
326
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
4
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
|
+
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; }
|
|
6
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
7
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
8
|
+
import ora from "ora";
|
|
9
|
+
var Spin = /*#__PURE__*/function () {
|
|
10
|
+
function Spin() {
|
|
11
|
+
_classCallCheck(this, Spin);
|
|
12
|
+
_defineProperty(this, "spinnerInstance", void 0);
|
|
13
|
+
this.spinnerInstance = ora();
|
|
14
|
+
}
|
|
15
|
+
_createClass(Spin, [{
|
|
16
|
+
key: "clear",
|
|
17
|
+
value: function clear() {
|
|
18
|
+
this.spinnerInstance.clear();
|
|
19
|
+
}
|
|
20
|
+
}, {
|
|
21
|
+
key: "start",
|
|
22
|
+
value: function start(text) {
|
|
23
|
+
this.spinnerInstance.start(text);
|
|
24
|
+
}
|
|
25
|
+
}, {
|
|
26
|
+
key: "succeed",
|
|
27
|
+
value: function succeed(text) {
|
|
28
|
+
this.spinnerInstance.succeed(text);
|
|
29
|
+
}
|
|
30
|
+
}, {
|
|
31
|
+
key: "fail",
|
|
32
|
+
value: function fail(text) {
|
|
33
|
+
this.spinnerInstance.fail(text);
|
|
34
|
+
}
|
|
35
|
+
}, {
|
|
36
|
+
key: "render",
|
|
37
|
+
value: function render() {
|
|
38
|
+
this.spinnerInstance.render();
|
|
39
|
+
}
|
|
40
|
+
}, {
|
|
41
|
+
key: "frame",
|
|
42
|
+
value: function frame() {
|
|
43
|
+
this.spinnerInstance.frame();
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
key: "info",
|
|
47
|
+
value: function info(text) {
|
|
48
|
+
this.spinnerInstance.info(text);
|
|
49
|
+
}
|
|
50
|
+
}, {
|
|
51
|
+
key: "stop",
|
|
52
|
+
value: function stop() {
|
|
53
|
+
this.spinnerInstance.stop();
|
|
54
|
+
}
|
|
55
|
+
}]);
|
|
56
|
+
return Spin;
|
|
57
|
+
}();
|
|
58
|
+
export var spinnerInstance = new Spin();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Interface } from "../types.mjs";
|
|
2
|
+
import { JSONSchema4 } from "json-schema";
|
|
3
|
+
/**
|
|
4
|
+
* Process a JSON Schema in place.
|
|
5
|
+
*
|
|
6
|
+
* @param jsonSchema JSON Schema to process
|
|
7
|
+
* @returns the processed JSON Schema
|
|
8
|
+
*/
|
|
9
|
+
export declare function processJsonSchema<T extends JSONSchema4>(jsonSchema: T): T;
|
|
10
|
+
/**
|
|
11
|
+
* Pre-process a schema before compiling it to TypeScript.
|
|
12
|
+
*
|
|
13
|
+
* Handles edge cases such as empty enums and normalizes OpenAPI 3.x
|
|
14
|
+
* `nullable: true` into the JSON Schema union-null form
|
|
15
|
+
* (`type: [T, 'null']`) so json-schema-to-typescript emits `T | null`.
|
|
16
|
+
* Component schemas reach the compiler through this preprocessor instead of
|
|
17
|
+
* `processJsonSchema`, and jstt silently ignores the OpenAPI `nullable`
|
|
18
|
+
* keyword. Every node here is a fresh copy, so the source document is never
|
|
19
|
+
* mutated.
|
|
20
|
+
*
|
|
21
|
+
* @param schema input JSON Schema
|
|
22
|
+
* @returns normalized JSON Schema (fresh copy, source is not mutated)
|
|
23
|
+
*/
|
|
24
|
+
export declare function preprocessSchema(schema: JSONSchema4): JSONSchema4;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a TypeScript type definition from a JSON Schema object.
|
|
27
|
+
*
|
|
28
|
+
* @param jsonSchema JSON Schema object
|
|
29
|
+
* @param typeName type name
|
|
30
|
+
* @returns TypeScript type definition
|
|
31
|
+
*/
|
|
32
|
+
export declare function jsonSchemaToTsCode(jsonSchema: JSONSchema4, typeName: string): Promise<string>;
|
|
33
|
+
export declare function getRequestDataJsonSchema(interfaceInfo: Interface): JSONSchema4;
|
|
34
|
+
export declare function getResponseDataJsonSchema(interfaceInfo: Interface): JSONSchema4;
|
|
35
|
+
/**
|
|
36
|
+
* Format generated code with prettier.
|
|
37
|
+
*
|
|
38
|
+
* When the output file path is known, the consumer project's own prettier
|
|
39
|
+
* config is resolved from it (resolveConfig walks up from the file location),
|
|
40
|
+
* so generated code lands clean under the consumer's `prettier --check`. When
|
|
41
|
+
* the consumer has no config, pure prettier defaults are used, mirroring what
|
|
42
|
+
* the consumer's own prettier would produce. `filepath` is always set so
|
|
43
|
+
* prettier infers the parser from the extension and applies any matching
|
|
44
|
+
* `overrides` from the consumer config.
|
|
45
|
+
*
|
|
46
|
+
* @param content code to format
|
|
47
|
+
* @param filePath output file path used to resolve the consumer config
|
|
48
|
+
* @returns formatted code
|
|
49
|
+
* @see https://prettier.io/docs/en/options.html
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatContent(content: string, filePath?: string): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Generate the banner comment placed at the top of every generated file.
|
|
54
|
+
* @returns banner comment
|
|
55
|
+
*/
|
|
56
|
+
export declare function topNotesContent(): string;
|