@dbml/core 3.7.0 → 3.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/import/index.js +4 -28
- package/lib/model_structure/tableGroup.js +9 -2
- package/lib/parse/Parser.js +27 -23
- package/lib/parse/dbml/parser.pegjs +2 -0
- package/package.json +6 -6
- package/types/import/index.d.ts +1 -1
- package/types/model_structure/tableGroup.d.ts +17 -7
- package/types/parse/Parser.d.ts +1 -1
- package/lib/connectors/ utils.js +0 -11
- package/lib/connectors/connector.js +0 -40
- package/lib/connectors/dbml.js +0 -170
- package/lib/connectors/mssqlConnector.js +0 -391
- package/lib/connectors/mysqlConnector.js +0 -490
- package/lib/connectors/postgresConnector.js +0 -400
- /package/lib/parse/{DatabaseGenerator.js → databaseGenerator.js} +0 -0
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.fetchSchemaJson = fetchSchemaJson;
|
|
8
|
-
var _promise = require("mysql2/promise");
|
|
9
|
-
var _lodash = require("lodash");
|
|
10
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
11
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
12
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
13
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
14
|
-
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 exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
|
|
15
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
16
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
17
|
-
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); }
|
|
18
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
19
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
20
|
-
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; }
|
|
21
|
-
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); } }
|
|
22
|
-
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
|
-
var NUMBER_REGEX = '^-?[0-9]+(.[0-9]+)?$';
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @param {string} connection
|
|
27
|
-
* @returns {Promise<import('mysql2').Connection>} client
|
|
28
|
-
*/
|
|
29
|
-
function connectMySQL(_x) {
|
|
30
|
-
return _connectMySQL.apply(this, arguments);
|
|
31
|
-
}
|
|
32
|
-
function _connectMySQL() {
|
|
33
|
-
_connectMySQL = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(connection) {
|
|
34
|
-
var client, _client;
|
|
35
|
-
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
36
|
-
while (1) switch (_context.prev = _context.next) {
|
|
37
|
-
case 0:
|
|
38
|
-
client = null;
|
|
39
|
-
_context.prev = 1;
|
|
40
|
-
_context.next = 4;
|
|
41
|
-
return (0, _promise.createConnection)(connection);
|
|
42
|
-
case 4:
|
|
43
|
-
client = _context.sent;
|
|
44
|
-
_context.next = 7;
|
|
45
|
-
return client.connect();
|
|
46
|
-
case 7:
|
|
47
|
-
_context.next = 9;
|
|
48
|
-
return client.query('SELECT 1');
|
|
49
|
-
case 9:
|
|
50
|
-
return _context.abrupt("return", client);
|
|
51
|
-
case 12:
|
|
52
|
-
_context.prev = 12;
|
|
53
|
-
_context.t0 = _context["catch"](1);
|
|
54
|
-
console.error('MySQL connection error:', _context.t0);
|
|
55
|
-
_context.next = 17;
|
|
56
|
-
return (_client = client) === null || _client === void 0 ? void 0 : _client.end();
|
|
57
|
-
case 17:
|
|
58
|
-
throw _context.t0;
|
|
59
|
-
case 18:
|
|
60
|
-
case "end":
|
|
61
|
-
return _context.stop();
|
|
62
|
-
}
|
|
63
|
-
}, _callee, null, [[1, 12]]);
|
|
64
|
-
}));
|
|
65
|
-
return _connectMySQL.apply(this, arguments);
|
|
66
|
-
}
|
|
67
|
-
function getEnumName(tableName, columnName) {
|
|
68
|
-
return "".concat(tableName, "_").concat(columnName, "_enum");
|
|
69
|
-
}
|
|
70
|
-
function getGenerationExpression(extraType, generationExpression) {
|
|
71
|
-
if (extraType === 'VIRTUAL GENERATED') {
|
|
72
|
-
return "GENERATED ALWAYS AS (".concat(generationExpression, ") VIRTUAL");
|
|
73
|
-
}
|
|
74
|
-
if (extraType === 'STORED GENERATED') {
|
|
75
|
-
return "GENERATED ALWAYS AS (".concat(generationExpression, ") STORED");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// for timestamp data type
|
|
79
|
-
if (extraType.includes('on update CURRENT_TIMESTAMP')) {
|
|
80
|
-
return 'on update CURRENT_TIMESTAMP';
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// others
|
|
84
|
-
return '';
|
|
85
|
-
}
|
|
86
|
-
function getDbDefault(columnDefault, defaultValueType) {
|
|
87
|
-
if (columnDefault === null) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
return {
|
|
91
|
-
value: columnDefault,
|
|
92
|
-
type: defaultValueType
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
function getFieldType(tableName, columnName, columnType, columnDataType, columnExtra, generationExpression) {
|
|
96
|
-
if (columnDataType === 'enum') {
|
|
97
|
-
// enum must have static value -> no need to check the generation expression
|
|
98
|
-
return getEnumName(tableName, columnName);
|
|
99
|
-
}
|
|
100
|
-
var fieldGenerationExpression = getGenerationExpression(columnExtra, generationExpression);
|
|
101
|
-
if (fieldGenerationExpression) {
|
|
102
|
-
return "".concat(columnType, " ").concat(fieldGenerationExpression);
|
|
103
|
-
}
|
|
104
|
-
return columnType;
|
|
105
|
-
}
|
|
106
|
-
function generateField(row) {
|
|
107
|
-
var tableName = row.tableName,
|
|
108
|
-
columnName = row.columnName,
|
|
109
|
-
columnDefault = row.columnDefault,
|
|
110
|
-
defaultValueType = row.defaultValueType,
|
|
111
|
-
columnIsNullable = row.columnIsNullable,
|
|
112
|
-
columnType = row.columnType,
|
|
113
|
-
columnDataType = row.columnDataType,
|
|
114
|
-
columnComment = row.columnComment,
|
|
115
|
-
columnExtra = row.columnExtra,
|
|
116
|
-
generationExpression = row.generationExpression;
|
|
117
|
-
var fieldType = getFieldType(tableName, columnName, columnType, columnDataType, columnExtra, generationExpression);
|
|
118
|
-
var fieldDefaultValue = getDbDefault(columnDefault, defaultValueType);
|
|
119
|
-
var isNullable = columnIsNullable === 'YES';
|
|
120
|
-
return {
|
|
121
|
-
name: columnName,
|
|
122
|
-
type: {
|
|
123
|
-
type_name: fieldType
|
|
124
|
-
},
|
|
125
|
-
dbdefault: fieldDefaultValue,
|
|
126
|
-
not_null: !isNullable,
|
|
127
|
-
increment: columnExtra === 'auto_increment',
|
|
128
|
-
note: {
|
|
129
|
-
value: columnComment || ''
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Do not get the index sub part since in DBML, it is impossible to create index on part of column.
|
|
135
|
-
function getIndexColumn(columnName, idxExpression, idxSubPart) {
|
|
136
|
-
if (idxExpression) {
|
|
137
|
-
return {
|
|
138
|
-
value: idxExpression,
|
|
139
|
-
type: 'expression'
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
if (idxSubPart) {
|
|
143
|
-
return {
|
|
144
|
-
value: "".concat(columnName, "(").concat(idxSubPart, ")"),
|
|
145
|
-
type: 'expression'
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
if (columnName) {
|
|
149
|
-
return {
|
|
150
|
-
value: columnName,
|
|
151
|
-
type: 'column'
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
function generateTablesAndFields(_x2, _x3) {
|
|
157
|
-
return _generateTablesAndFields.apply(this, arguments);
|
|
158
|
-
}
|
|
159
|
-
function _generateTablesAndFields() {
|
|
160
|
-
_generateTablesAndFields = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(client, schemaName) {
|
|
161
|
-
var query, queryResponse, _queryResponse, rows, tableMap, fieldMap;
|
|
162
|
-
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
163
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
164
|
-
case 0:
|
|
165
|
-
query = "\n select\n t.table_name as tableName,\n t.table_comment as tableComment,\n c.column_name as columnName,\n c.column_default as columnDefault,\n case\n when c.column_default is null then 'boolean'\n when c.data_type = 'enum' then 'string'\n when c.column_default regexp ? then 'number'\n when c.extra like '%DEFAULT_GENERATED%' then 'expression'\n else 'string'\n end as defaultValueType,\n c.is_nullable as columnIsNullable,\n c.data_type as columnDataType,\n c.column_type as columnType,\n c.extra as columnExtra,\n c.column_comment as columnComment,\n c.generation_expression as generationExpression\n from information_schema.tables t\n join information_schema.columns c\n on t.table_schema = c.table_schema and t.table_name = c.table_name\n where\n t.table_schema = ? and t.table_type = 'BASE TABLE'\n order by\n t.table_name, c.ordinal_position;\n ";
|
|
166
|
-
_context2.next = 3;
|
|
167
|
-
return client.query(query, [NUMBER_REGEX, schemaName]);
|
|
168
|
-
case 3:
|
|
169
|
-
queryResponse = _context2.sent;
|
|
170
|
-
_queryResponse = _slicedToArray(queryResponse, 1), rows = _queryResponse[0];
|
|
171
|
-
tableMap = {};
|
|
172
|
-
fieldMap = {};
|
|
173
|
-
rows.forEach(function (row) {
|
|
174
|
-
var tableName = row.tableName,
|
|
175
|
-
tableComment = row.tableComment;
|
|
176
|
-
var key = tableName;
|
|
177
|
-
if (!tableMap[key]) {
|
|
178
|
-
tableMap[key] = {
|
|
179
|
-
name: tableName,
|
|
180
|
-
note: {
|
|
181
|
-
value: tableComment || ''
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
if (!fieldMap[key]) {
|
|
186
|
-
fieldMap[key] = [];
|
|
187
|
-
}
|
|
188
|
-
var field = generateField(row);
|
|
189
|
-
fieldMap[key].push(field);
|
|
190
|
-
});
|
|
191
|
-
return _context2.abrupt("return", {
|
|
192
|
-
tableList: Object.values(tableMap),
|
|
193
|
-
fieldMap: fieldMap
|
|
194
|
-
});
|
|
195
|
-
case 9:
|
|
196
|
-
case "end":
|
|
197
|
-
return _context2.stop();
|
|
198
|
-
}
|
|
199
|
-
}, _callee2);
|
|
200
|
-
}));
|
|
201
|
-
return _generateTablesAndFields.apply(this, arguments);
|
|
202
|
-
}
|
|
203
|
-
function generateEnums(_x4, _x5) {
|
|
204
|
-
return _generateEnums.apply(this, arguments);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Mysql is automatically create index for primary keys, foreign keys, unique constraint. -> Ignore
|
|
208
|
-
*/
|
|
209
|
-
function _generateEnums() {
|
|
210
|
-
_generateEnums = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(client, schemaName) {
|
|
211
|
-
var query, queryResponse, _queryResponse2, rows, enumList;
|
|
212
|
-
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
213
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
214
|
-
case 0:
|
|
215
|
-
query = "\n select\n t.table_name as tableName,\n c.column_name as columnName,\n TRIM(LEADING 'enum' FROM c.column_type) AS rawValues\n from information_schema.tables t\n join information_schema.columns c\n on t.table_schema = c.table_schema and t.table_name = c.table_name\n where\n t.table_schema = ? and t.table_type = 'BASE TABLE' and c.data_type = 'enum'\n order by\n t.table_name, c.ordinal_position;\n ";
|
|
216
|
-
_context3.next = 3;
|
|
217
|
-
return client.query(query, [schemaName]);
|
|
218
|
-
case 3:
|
|
219
|
-
queryResponse = _context3.sent;
|
|
220
|
-
_queryResponse2 = _slicedToArray(queryResponse, 1), rows = _queryResponse2[0];
|
|
221
|
-
enumList = rows.map(function (row) {
|
|
222
|
-
var tableName = row.tableName,
|
|
223
|
-
columnName = row.columnName,
|
|
224
|
-
rawValues = row.rawValues;
|
|
225
|
-
|
|
226
|
-
// i.e. ('value1','value2')
|
|
227
|
-
var valueList = rawValues.slice(1, -1).split(',').map(function (value) {
|
|
228
|
-
return {
|
|
229
|
-
name: value.slice(1, -1)
|
|
230
|
-
};
|
|
231
|
-
});
|
|
232
|
-
var enumName = getEnumName(tableName, columnName);
|
|
233
|
-
return {
|
|
234
|
-
name: enumName,
|
|
235
|
-
values: valueList
|
|
236
|
-
};
|
|
237
|
-
});
|
|
238
|
-
return _context3.abrupt("return", enumList);
|
|
239
|
-
case 7:
|
|
240
|
-
case "end":
|
|
241
|
-
return _context3.stop();
|
|
242
|
-
}
|
|
243
|
-
}, _callee3);
|
|
244
|
-
}));
|
|
245
|
-
return _generateEnums.apply(this, arguments);
|
|
246
|
-
}
|
|
247
|
-
function generateIndexes(_x6, _x7) {
|
|
248
|
-
return _generateIndexes.apply(this, arguments);
|
|
249
|
-
}
|
|
250
|
-
function _generateIndexes() {
|
|
251
|
-
_generateIndexes = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(client, schemaName) {
|
|
252
|
-
var query, queryResponse, _queryResponse3, rows, tableIndexMap, indexMap;
|
|
253
|
-
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
254
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
255
|
-
case 0:
|
|
256
|
-
query = "\n with\n pk_fk_uniques as (\n select constraint_name, table_name\n from information_schema.table_constraints\n where table_schema = ?\n )\n select\n st.table_name as tableName,\n case\n when st.non_unique = 0 then true\n else false\n end as isIdxUnique,\n st.index_name as idxName,\n st.column_name as columnName,\n st.sub_part as idxSubPart,\n st.index_type as idxType,\n replace(st.expression, '`', '') as idxExpression\n from information_schema.statistics st\n where\n st.table_schema = ?\n and st.index_name not in (\n select constraint_name\n from pk_fk_uniques pfu\n where pfu.table_name = st.table_name\n )\n and st.index_type in ('BTREE', 'HASH')\n group by\n st.table_name, st.non_unique, st.index_name, st.column_name, st.sub_part, st.index_type, st.expression\n order by st.index_name;\n ";
|
|
257
|
-
_context4.next = 3;
|
|
258
|
-
return client.query(query, [schemaName, schemaName]);
|
|
259
|
-
case 3:
|
|
260
|
-
queryResponse = _context4.sent;
|
|
261
|
-
_queryResponse3 = _slicedToArray(queryResponse, 1), rows = _queryResponse3[0];
|
|
262
|
-
tableIndexMap = rows.reduce(function (acc, row) {
|
|
263
|
-
var tableName = row.tableName,
|
|
264
|
-
idxName = row.idxName,
|
|
265
|
-
idxType = row.idxType,
|
|
266
|
-
isIdxUnique = row.isIdxUnique,
|
|
267
|
-
columnName = row.columnName,
|
|
268
|
-
idxExpression = row.idxExpression,
|
|
269
|
-
idxSubPart = row.idxSubPart;
|
|
270
|
-
var key = tableName;
|
|
271
|
-
if (!acc[key]) {
|
|
272
|
-
acc[key] = {};
|
|
273
|
-
}
|
|
274
|
-
if (!acc[key][idxName]) {
|
|
275
|
-
// init first index
|
|
276
|
-
acc[key][idxName] = {
|
|
277
|
-
name: idxName,
|
|
278
|
-
type: idxType,
|
|
279
|
-
columns: [],
|
|
280
|
-
unique: !!isIdxUnique
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
var currentIndex = acc[key][idxName];
|
|
284
|
-
var column = getIndexColumn(columnName, idxExpression, idxSubPart);
|
|
285
|
-
if (column) {
|
|
286
|
-
currentIndex.columns.push(column);
|
|
287
|
-
}
|
|
288
|
-
return acc;
|
|
289
|
-
}, {});
|
|
290
|
-
indexMap = {};
|
|
291
|
-
Object.keys(tableIndexMap).forEach(function (tableName) {
|
|
292
|
-
indexMap[tableName] = (0, _lodash.flatten)(Object.values(tableIndexMap[tableName]));
|
|
293
|
-
});
|
|
294
|
-
return _context4.abrupt("return", indexMap);
|
|
295
|
-
case 9:
|
|
296
|
-
case "end":
|
|
297
|
-
return _context4.stop();
|
|
298
|
-
}
|
|
299
|
-
}, _callee4);
|
|
300
|
-
}));
|
|
301
|
-
return _generateIndexes.apply(this, arguments);
|
|
302
|
-
}
|
|
303
|
-
function generatePrimaryAndUniqueConstraint(_x8, _x9) {
|
|
304
|
-
return _generatePrimaryAndUniqueConstraint.apply(this, arguments);
|
|
305
|
-
}
|
|
306
|
-
function _generatePrimaryAndUniqueConstraint() {
|
|
307
|
-
_generatePrimaryAndUniqueConstraint = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(client, schemaName) {
|
|
308
|
-
var query, queryResponse, _queryResponse4, rows, inlineConstraintList, outOfConstraintList, compositeTableConstraintMap, compositeConstraintMap, constraintMap;
|
|
309
|
-
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
310
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
311
|
-
case 0:
|
|
312
|
-
query = "\n select\n tc.table_name as tableName,\n tc.constraint_name as constraintName,\n group_concat(kcu.column_name order by kcu.ordinal_position separator ',') as columnNames,\n count(kcu.column_name) as columnCount,\n tc.constraint_type as constraintType\n from information_schema.table_constraints tc\n join information_schema.key_column_usage kcu\n on\n tc.constraint_schema = kcu.constraint_schema\n and tc.constraint_name = kcu.constraint_name\n and tc.table_name = kcu.table_name\n where\n (tc.constraint_type = 'PRIMARY KEY' or tc.constraint_type = 'UNIQUE')\n and tc.table_schema = ?\n group by tc.table_name, tc.constraint_name, tc.constraint_type\n order by tc.table_name, tc.constraint_name;\n ";
|
|
313
|
-
_context5.next = 3;
|
|
314
|
-
return client.query(query, [schemaName]);
|
|
315
|
-
case 3:
|
|
316
|
-
queryResponse = _context5.sent;
|
|
317
|
-
_queryResponse4 = _slicedToArray(queryResponse, 1), rows = _queryResponse4[0];
|
|
318
|
-
inlineConstraintList = rows.filter(function (constraint) {
|
|
319
|
-
return constraint.columnCount === 1;
|
|
320
|
-
});
|
|
321
|
-
outOfConstraintList = rows.filter(function (constraint) {
|
|
322
|
-
return constraint.columnCount > 1;
|
|
323
|
-
});
|
|
324
|
-
compositeTableConstraintMap = outOfConstraintList.reduce(function (acc, row) {
|
|
325
|
-
var tableName = row.tableName,
|
|
326
|
-
constraintName = row.constraintName,
|
|
327
|
-
columnNames = row.columnNames,
|
|
328
|
-
constraintType = row.constraintType;
|
|
329
|
-
var key = tableName;
|
|
330
|
-
if (!acc[key]) {
|
|
331
|
-
acc[key] = {};
|
|
332
|
-
}
|
|
333
|
-
if (!acc[key][constraintName]) {
|
|
334
|
-
acc[key][constraintName] = {
|
|
335
|
-
name: constraintName
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
if (constraintType === 'PRIMARY KEY') {
|
|
339
|
-
acc[key][constraintName].primary = true;
|
|
340
|
-
}
|
|
341
|
-
if (constraintType === 'UNIQUE') {
|
|
342
|
-
acc[key][constraintName].unique = true;
|
|
343
|
-
}
|
|
344
|
-
var columnList = columnNames.split(',').map(function (col) {
|
|
345
|
-
return {
|
|
346
|
-
type: 'column',
|
|
347
|
-
value: col
|
|
348
|
-
};
|
|
349
|
-
});
|
|
350
|
-
acc[key][constraintName].columns = columnList;
|
|
351
|
-
return acc;
|
|
352
|
-
}, {});
|
|
353
|
-
compositeConstraintMap = {};
|
|
354
|
-
Object.keys(compositeTableConstraintMap).forEach(function (tableName) {
|
|
355
|
-
compositeConstraintMap[tableName] = (0, _lodash.flatten)(Object.values(compositeTableConstraintMap[tableName]));
|
|
356
|
-
});
|
|
357
|
-
constraintMap = inlineConstraintList.reduce(function (acc, row) {
|
|
358
|
-
var tableName = row.tableName,
|
|
359
|
-
columnNames = row.columnNames,
|
|
360
|
-
constraintType = row.constraintType;
|
|
361
|
-
var key = tableName;
|
|
362
|
-
if (!acc[key]) {
|
|
363
|
-
acc[key] = {};
|
|
364
|
-
}
|
|
365
|
-
var columnList = columnNames.split(',');
|
|
366
|
-
columnList.forEach(function (columnName) {
|
|
367
|
-
if (!acc[key][columnName]) {
|
|
368
|
-
acc[key][columnName] = {};
|
|
369
|
-
}
|
|
370
|
-
if (constraintType === 'PRIMARY KEY') {
|
|
371
|
-
acc[key][columnName].pk = true;
|
|
372
|
-
}
|
|
373
|
-
if (constraintType === 'UNIQUE' && !acc[key][columnName].pk) {
|
|
374
|
-
acc[key][columnName].unique = true;
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
return acc;
|
|
378
|
-
}, {});
|
|
379
|
-
return _context5.abrupt("return", {
|
|
380
|
-
compositeConstraintMap: compositeConstraintMap,
|
|
381
|
-
constraintMap: constraintMap
|
|
382
|
-
});
|
|
383
|
-
case 12:
|
|
384
|
-
case "end":
|
|
385
|
-
return _context5.stop();
|
|
386
|
-
}
|
|
387
|
-
}, _callee5);
|
|
388
|
-
}));
|
|
389
|
-
return _generatePrimaryAndUniqueConstraint.apply(this, arguments);
|
|
390
|
-
}
|
|
391
|
-
function generateForeignKeys(_x10, _x11) {
|
|
392
|
-
return _generateForeignKeys.apply(this, arguments);
|
|
393
|
-
}
|
|
394
|
-
function _generateForeignKeys() {
|
|
395
|
-
_generateForeignKeys = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(client, schemaName) {
|
|
396
|
-
var query, queryResponse, _queryResponse5, rows, foreignKeyList;
|
|
397
|
-
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
|
|
398
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
399
|
-
case 0:
|
|
400
|
-
query = "\n select\n rc.constraint_name as constraintName,\n rc.table_name as foreignTableName,\n group_concat(kcu.column_name order by kcu.ordinal_position separator ',') as foreignColumnNames,\n kcu.referenced_table_name as refTableName,\n group_concat(kcu.referenced_column_name order by kcu.ordinal_position separator ',') as refColumnNames,\n rc.update_rule as onUpdate,\n rc.delete_rule as onDelete\n from information_schema.referential_constraints rc\n join information_schema.key_column_usage kcu\n on\n rc.constraint_name = kcu.constraint_name\n and rc.table_name = kcu.table_name\n and rc.constraint_schema = kcu.table_schema\n where rc.constraint_schema = ?\n group by\n rc.constraint_name,\n rc.table_name,\n kcu.referenced_table_name,\n rc.update_rule,\n rc.delete_rule\n order by\n rc.table_name;\n ";
|
|
401
|
-
_context6.next = 3;
|
|
402
|
-
return client.query(query, [schemaName]);
|
|
403
|
-
case 3:
|
|
404
|
-
queryResponse = _context6.sent;
|
|
405
|
-
_queryResponse5 = _slicedToArray(queryResponse, 1), rows = _queryResponse5[0];
|
|
406
|
-
foreignKeyList = rows.map(function (row) {
|
|
407
|
-
var constraintName = row.constraintName,
|
|
408
|
-
onDelete = row.onDelete,
|
|
409
|
-
onUpdate = row.onUpdate,
|
|
410
|
-
foreignTableName = row.foreignTableName,
|
|
411
|
-
foreignColumnNames = row.foreignColumnNames,
|
|
412
|
-
refTableName = row.refTableName,
|
|
413
|
-
refColumnNames = row.refColumnNames;
|
|
414
|
-
var endpoint1 = {
|
|
415
|
-
tableName: foreignTableName,
|
|
416
|
-
fieldNames: foreignColumnNames.split(','),
|
|
417
|
-
relation: '*'
|
|
418
|
-
};
|
|
419
|
-
var endpoint2 = {
|
|
420
|
-
tableName: refTableName,
|
|
421
|
-
fieldNames: refColumnNames.split(','),
|
|
422
|
-
relation: '1'
|
|
423
|
-
};
|
|
424
|
-
return {
|
|
425
|
-
name: constraintName,
|
|
426
|
-
endpoints: [endpoint1, endpoint2],
|
|
427
|
-
onDelete: onDelete === 'NO ACTION' ? null : onDelete,
|
|
428
|
-
onUpdate: onUpdate === 'NO ACTION' ? null : onUpdate
|
|
429
|
-
};
|
|
430
|
-
});
|
|
431
|
-
return _context6.abrupt("return", foreignKeyList);
|
|
432
|
-
case 7:
|
|
433
|
-
case "end":
|
|
434
|
-
return _context6.stop();
|
|
435
|
-
}
|
|
436
|
-
}, _callee6);
|
|
437
|
-
}));
|
|
438
|
-
return _generateForeignKeys.apply(this, arguments);
|
|
439
|
-
}
|
|
440
|
-
function combineIndexAndCompositeConstraint(userDefinedIndexMap, compositeConstraintMap) {
|
|
441
|
-
var indexMap = Object.assign(userDefinedIndexMap, {});
|
|
442
|
-
Object.keys(compositeConstraintMap).forEach(function (tableName) {
|
|
443
|
-
var _indexMap$tableName;
|
|
444
|
-
var compositeConstraint = compositeConstraintMap[tableName];
|
|
445
|
-
if (!indexMap[tableName]) {
|
|
446
|
-
indexMap[tableName] = compositeConstraint;
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
(_indexMap$tableName = indexMap[tableName]).push.apply(_indexMap$tableName, _toConsumableArray(compositeConstraint));
|
|
450
|
-
});
|
|
451
|
-
return indexMap;
|
|
452
|
-
}
|
|
453
|
-
function fetchSchemaJson(_x12) {
|
|
454
|
-
return _fetchSchemaJson.apply(this, arguments);
|
|
455
|
-
}
|
|
456
|
-
function _fetchSchemaJson() {
|
|
457
|
-
_fetchSchemaJson = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(connection) {
|
|
458
|
-
var client, schemaName, result, _result, _result$, tableList, fieldMap, enumList, rawIndexMap, _result$2, constraintMap, compositeConstraintMap, foreignKeyList, indexMap;
|
|
459
|
-
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
|
|
460
|
-
while (1) switch (_context7.prev = _context7.next) {
|
|
461
|
-
case 0:
|
|
462
|
-
_context7.next = 2;
|
|
463
|
-
return connectMySQL(connection);
|
|
464
|
-
case 2:
|
|
465
|
-
client = _context7.sent;
|
|
466
|
-
// In MySQL, a schema is equal database
|
|
467
|
-
schemaName = client.config.database;
|
|
468
|
-
_context7.next = 6;
|
|
469
|
-
return Promise.all([generateTablesAndFields(client, schemaName), generateEnums(client, schemaName), generateIndexes(client, schemaName), generatePrimaryAndUniqueConstraint(client, schemaName), generateForeignKeys(client, schemaName)]);
|
|
470
|
-
case 6:
|
|
471
|
-
result = _context7.sent;
|
|
472
|
-
client.end();
|
|
473
|
-
_result = _slicedToArray(result, 5), _result$ = _result[0], tableList = _result$.tableList, fieldMap = _result$.fieldMap, enumList = _result[1], rawIndexMap = _result[2], _result$2 = _result[3], constraintMap = _result$2.constraintMap, compositeConstraintMap = _result$2.compositeConstraintMap, foreignKeyList = _result[4]; // combine normal index and composite key
|
|
474
|
-
indexMap = combineIndexAndCompositeConstraint(rawIndexMap, compositeConstraintMap);
|
|
475
|
-
return _context7.abrupt("return", {
|
|
476
|
-
tables: tableList,
|
|
477
|
-
fields: fieldMap,
|
|
478
|
-
refs: foreignKeyList,
|
|
479
|
-
enums: enumList,
|
|
480
|
-
indexes: indexMap,
|
|
481
|
-
tableConstraints: constraintMap
|
|
482
|
-
});
|
|
483
|
-
case 11:
|
|
484
|
-
case "end":
|
|
485
|
-
return _context7.stop();
|
|
486
|
-
}
|
|
487
|
-
}, _callee7);
|
|
488
|
-
}));
|
|
489
|
-
return _fetchSchemaJson.apply(this, arguments);
|
|
490
|
-
}
|