evaengine 0.11.1 → 1.0.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/.ai/analysis.md +657 -0
- package/.ai/architecture/runtime.md +504 -0
- package/.ai/contracts/public-api.md +447 -0
- package/.ai/external-project-guide.md +248 -0
- package/.ai/vision.md +314 -0
- package/README.md +51 -62
- package/bin/engine +15 -21
- package/index.js +2 -18
- package/package.json +60 -64
- package/src/index.js +57 -0
- package/bin/engine-babel +0 -38
- package/lib/commands/index.js +0 -25
- package/lib/commands/index.js.map +0 -1
- package/lib/commands/interface.js +0 -51
- package/lib/commands/interface.js.map +0 -1
- package/lib/commands/make_entity.js +0 -549
- package/lib/commands/make_entity.js.map +0 -1
- package/lib/commands/tramp.js +0 -53
- package/lib/commands/tramp.js.map +0 -1
- package/lib/config/index.js +0 -98
- package/lib/config/index.js.map +0 -1
- package/lib/di.js +0 -99
- package/lib/di.js.map +0 -1
- package/lib/engine.js +0 -558
- package/lib/engine.js.map +0 -1
- package/lib/entities/index.js +0 -283
- package/lib/entities/index.js.map +0 -1
- package/lib/exceptions/index.js +0 -522
- package/lib/exceptions/index.js.map +0 -1
- package/lib/index.js +0 -105
- package/lib/index.js.map +0 -1
- package/lib/middlewares/auth.js +0 -97
- package/lib/middlewares/auth.js.map +0 -1
- package/lib/middlewares/auth_kong.js +0 -48
- package/lib/middlewares/auth_kong.js.map +0 -1
- package/lib/middlewares/debug.js +0 -68
- package/lib/middlewares/debug.js.map +0 -1
- package/lib/middlewares/index.js +0 -45
- package/lib/middlewares/index.js.map +0 -1
- package/lib/middlewares/providers.js +0 -102
- package/lib/middlewares/providers.js.map +0 -1
- package/lib/middlewares/session.js +0 -76
- package/lib/middlewares/session.js.map +0 -1
- package/lib/middlewares/trace.js +0 -241
- package/lib/middlewares/trace.js.map +0 -1
- package/lib/middlewares/validator.js +0 -71
- package/lib/middlewares/validator.js.map +0 -1
- package/lib/middlewares/view_cache.js +0 -160
- package/lib/middlewares/view_cache.js.map +0 -1
- package/lib/services/cache.js +0 -234
- package/lib/services/cache.js.map +0 -1
- package/lib/services/config.js +0 -140
- package/lib/services/config.js.map +0 -1
- package/lib/services/env.js +0 -40
- package/lib/services/env.js.map +0 -1
- package/lib/services/event_manager.js +0 -110
- package/lib/services/event_manager.js.map +0 -1
- package/lib/services/http_client.js +0 -178
- package/lib/services/http_client.js.map +0 -1
- package/lib/services/index.js +0 -70
- package/lib/services/index.js.map +0 -1
- package/lib/services/interface.js +0 -12
- package/lib/services/interface.js.map +0 -1
- package/lib/services/joi.js +0 -28
- package/lib/services/joi.js.map +0 -1
- package/lib/services/jwt_token.js +0 -120
- package/lib/services/jwt_token.js.map +0 -1
- package/lib/services/jwt_token_kong.js +0 -111
- package/lib/services/jwt_token_kong.js.map +0 -1
- package/lib/services/logger.js +0 -172
- package/lib/services/logger.js.map +0 -1
- package/lib/services/namespace.js +0 -188
- package/lib/services/namespace.js.map +0 -1
- package/lib/services/now.js +0 -69
- package/lib/services/now.js.map +0 -1
- package/lib/services/providers.js +0 -195
- package/lib/services/providers.js.map +0 -1
- package/lib/services/redis.js +0 -77
- package/lib/services/redis.js.map +0 -1
- package/lib/services/rest_client.js +0 -136
- package/lib/services/rest_client.js.map +0 -1
- package/lib/swagger/index.js +0 -684
- package/lib/swagger/index.js.map +0 -1
- package/lib/utils/api_scaffold.js +0 -253
- package/lib/utils/api_scaffold.js.map +0 -1
- package/lib/utils/case_converter.js +0 -48
- package/lib/utils/case_converter.js.map +0 -1
- package/lib/utils/crc32.js +0 -22
- package/lib/utils/crc32.js.map +0 -1
- package/lib/utils/datetime.js +0 -21
- package/lib/utils/datetime.js.map +0 -1
- package/lib/utils/host.js +0 -48
- package/lib/utils/host.js.map +0 -1
- package/lib/utils/index.js +0 -61
- package/lib/utils/index.js.map +0 -1
- package/lib/utils/pagination.js +0 -269
- package/lib/utils/pagination.js.map +0 -1
- package/lib/utils/random.js +0 -33
- package/lib/utils/random.js.map +0 -1
- package/lib/utils/smart_query.js +0 -342
- package/lib/utils/smart_query.js.map +0 -1
- package/lib/utils/test.js +0 -62
- package/lib/utils/test.js.map +0 -1
- package/lib/utils/wrapper.js +0 -9
- package/lib/utils/wrapper.js.map +0 -1
|
@@ -1,549 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.MakeGraphql = exports.MakeEntity = exports.MakeDbView = undefined;
|
|
7
|
-
|
|
8
|
-
var _lodash = require('lodash');
|
|
9
|
-
|
|
10
|
-
var _lodash2 = _interopRequireDefault(_lodash);
|
|
11
|
-
|
|
12
|
-
var _sequelize = require('sequelize');
|
|
13
|
-
|
|
14
|
-
var _sequelize2 = _interopRequireDefault(_sequelize);
|
|
15
|
-
|
|
16
|
-
var _fs = require('fs');
|
|
17
|
-
|
|
18
|
-
var _fs2 = _interopRequireDefault(_fs);
|
|
19
|
-
|
|
20
|
-
var _mkdirp = require('mkdirp');
|
|
21
|
-
|
|
22
|
-
var _mkdirp2 = _interopRequireDefault(_mkdirp);
|
|
23
|
-
|
|
24
|
-
var _interface = require('./interface');
|
|
25
|
-
|
|
26
|
-
var _interface2 = _interopRequireDefault(_interface);
|
|
27
|
-
|
|
28
|
-
var _di = require('../di');
|
|
29
|
-
|
|
30
|
-
var _di2 = _interopRequireDefault(_di);
|
|
31
|
-
|
|
32
|
-
var _entities = require('../entities');
|
|
33
|
-
|
|
34
|
-
var _entities2 = _interopRequireDefault(_entities);
|
|
35
|
-
|
|
36
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
|
-
|
|
38
|
-
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
|
39
|
-
|
|
40
|
-
let MakeDbView = exports.MakeDbView = class MakeDbView extends _interface2.default {
|
|
41
|
-
static getName() {
|
|
42
|
-
return 'make:dbview';
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
static getDescription() {
|
|
46
|
-
return 'Generate db views';
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
static getSpec() {
|
|
50
|
-
return {
|
|
51
|
-
entity_path: {
|
|
52
|
-
required: false,
|
|
53
|
-
description: 'Entity path'
|
|
54
|
-
},
|
|
55
|
-
dir: {
|
|
56
|
-
required: false,
|
|
57
|
-
description: 'Where view.sql to be generated'
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
getSql(tableName, attributes) {
|
|
63
|
-
const attrs = attributes.map(attr => {
|
|
64
|
-
const { fieldName } = attr;
|
|
65
|
-
if (fieldName.endsWith('At')) {
|
|
66
|
-
return ` FROM_UNIXTIME(IF(${fieldName} > 0, ${fieldName}, NULL)) AS ${fieldName}`;
|
|
67
|
-
}
|
|
68
|
-
return ` \`${fieldName}\` AS \`${fieldName}\``;
|
|
69
|
-
});
|
|
70
|
-
return `DROP VIEW IF EXISTS view_${tableName};
|
|
71
|
-
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW view_${tableName}
|
|
72
|
-
AS SELECT
|
|
73
|
-
${attrs.join(',\n ')}
|
|
74
|
-
FROM ${tableName};
|
|
75
|
-
|
|
76
|
-
`;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
run() {
|
|
80
|
-
var _this = this;
|
|
81
|
-
|
|
82
|
-
return _asyncToGenerator(function* () {
|
|
83
|
-
const logger = _di2.default.get('logger');
|
|
84
|
-
const { dir, entity_path: entityPath = `${process.cwd()}/build/entities` } = _this.getArgv();
|
|
85
|
-
const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/sql`;
|
|
86
|
-
const file = [path, 'views.sql'].join('/');
|
|
87
|
-
logger.info('Scan entity files under %s', entityPath);
|
|
88
|
-
const entities = new _entities2.default(entityPath);
|
|
89
|
-
|
|
90
|
-
logger.info('Start generate db views to %s', file);
|
|
91
|
-
_mkdirp2.default.sync(path);
|
|
92
|
-
const models = Object.values(entities.getInstance().models);
|
|
93
|
-
const sql = [];
|
|
94
|
-
models.forEach(function (model) {
|
|
95
|
-
logger.info(`Creating ${model.getTableName()} view`);
|
|
96
|
-
sql.push(_this.getSql(model.getTableName(), Object.values(model.attributes)));
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
_fs2.default.writeFileSync(file, sql.join(''));
|
|
100
|
-
logger.info('Views created');
|
|
101
|
-
})();
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
let MakeEntity = exports.MakeEntity = class MakeEntity extends _interface2.default {
|
|
105
|
-
static getName() {
|
|
106
|
-
return 'make:entity';
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
static getDescription() {
|
|
110
|
-
return 'Generate entities';
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
static getSpec() {
|
|
114
|
-
return {
|
|
115
|
-
timestamp: {
|
|
116
|
-
required: false,
|
|
117
|
-
description: 'Sequelize timestamp enabled'
|
|
118
|
-
},
|
|
119
|
-
dir: {
|
|
120
|
-
required: false,
|
|
121
|
-
description: 'Where entity files to be generated'
|
|
122
|
-
},
|
|
123
|
-
prefix: {
|
|
124
|
-
required: false,
|
|
125
|
-
description: 'Table prefix'
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
static typeMapping(_type) {
|
|
131
|
-
const type = _type.toLowerCase();
|
|
132
|
-
if (type === 'tinyint(1)' || type === 'boolean' || type === 'bit(1)') {
|
|
133
|
-
return 'DataTypes.BOOLEAN';
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (type.match(/^(smallint|mediumint|tinyint|int)/)) {
|
|
137
|
-
const length = type.match(/\(\d+\)/) || '';
|
|
138
|
-
return `DataTypes.INTEGER${length}`;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (type.startsWith('bigint')) {
|
|
142
|
-
return 'DataTypes.BIGINT';
|
|
143
|
-
}
|
|
144
|
-
if (type.startsWith('enum')) {
|
|
145
|
-
return type.replace('enum', 'DataTypes.ENUM').replace(/,/g, ', ');
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (type.match(/^string|varchar|varying|nvarchar/)) {
|
|
149
|
-
const length = type.match(/\(\d+\)/) || '';
|
|
150
|
-
return length ? `DataTypes.STRING${length}` : 'DataTypes.STRING';
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (type.startsWith('char')) {
|
|
154
|
-
const length = type.match(/\(\d+\)/) || '';
|
|
155
|
-
return `DataTypes.CHAR${length}`;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (type.match(/text|ntext$/)) {
|
|
159
|
-
return 'DataTypes.TEXT';
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (type.startsWith('year')) {
|
|
163
|
-
return 'DataTypes.INTEGER(4)';
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
if (type.startsWith('datetime')) {
|
|
167
|
-
return 'DataTypes.DATE';
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (type.startsWith('date')) {
|
|
171
|
-
return 'DataTypes.DATEONLY';
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (type.startsWith('time')) {
|
|
175
|
-
return 'DataTypes.TIME';
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (type.match(/^(float8|double precision)/)) {
|
|
179
|
-
return 'DataTypes.DOUBLE';
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (type.match(/^(float|float4)/)) {
|
|
183
|
-
return 'DataTypes.FLOAT';
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (type.startsWith('decimal')) {
|
|
187
|
-
const [, length, bits] = /\((\d+),(\d+)\)/g.exec(type) || [];
|
|
188
|
-
return length ? `DataTypes.DECIMAL(${length}, ${bits})` : 'DataTypes.DECIMAL';
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (type.match(/^uuid|uniqueidentifier/)) {
|
|
192
|
-
return 'DataTypes.UUIDV4';
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (type.startsWith('jsonb')) {
|
|
196
|
-
return 'DataTypes.JSONB';
|
|
197
|
-
}
|
|
198
|
-
if (type.startsWith('json')) {
|
|
199
|
-
return 'DataTypes.JSON';
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (type.startsWith('geometry')) {
|
|
203
|
-
return 'DataTypes.GEOMETRY';
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return type;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
static typeAdditional(_type, sequlizeType, rawColumn) {
|
|
210
|
-
const type = _type.toLowerCase();
|
|
211
|
-
let finalType = sequlizeType;
|
|
212
|
-
|
|
213
|
-
if (type.match(/unsigned/)) {
|
|
214
|
-
finalType += '.UNSIGNED';
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (type.match(/zerofill/)) {
|
|
218
|
-
finalType += '.ZEROFILL';
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (rawColumn.Collation === 'utf8_bin') {
|
|
222
|
-
finalType += '.BINARY';
|
|
223
|
-
}
|
|
224
|
-
return finalType;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
static getIndexes(tableName, sequelize) {
|
|
228
|
-
return _asyncToGenerator(function* () {
|
|
229
|
-
let rawIndexes = yield sequelize.query(`SHOW INDEX FROM ${tableName}`, {
|
|
230
|
-
type: sequelize.QueryTypes.SELECT,
|
|
231
|
-
raw: true
|
|
232
|
-
});
|
|
233
|
-
if (!rawIndexes) {
|
|
234
|
-
return [];
|
|
235
|
-
}
|
|
236
|
-
rawIndexes = _lodash2.default.groupBy(rawIndexes, 'Key_name');
|
|
237
|
-
return Object.entries(rawIndexes).filter(function ([key]) {
|
|
238
|
-
return key !== 'PRIMARY';
|
|
239
|
-
}).map(function ([name, columns]) {
|
|
240
|
-
const index = columns[0].Non_unique !== 1 ? { name, unique: true } : { name };
|
|
241
|
-
index.fields = columns.map(function (c) {
|
|
242
|
-
return c.Column_name;
|
|
243
|
-
});
|
|
244
|
-
return index;
|
|
245
|
-
});
|
|
246
|
-
})();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
run() {
|
|
250
|
-
var _this2 = this;
|
|
251
|
-
|
|
252
|
-
return _asyncToGenerator(function* () {
|
|
253
|
-
const config = _di2.default.get('config').get();
|
|
254
|
-
const logger = _di2.default.get('logger');
|
|
255
|
-
const sequelize = new _sequelize2.default(config.db.database, null, null, Object.assign({}, config.sequelize, config.db, { logging: logger.getInstance().verbose }));
|
|
256
|
-
const query = sequelize.getQueryInterface();
|
|
257
|
-
|
|
258
|
-
let tables = yield query.showAllTables();
|
|
259
|
-
const views = yield sequelize.query(`SHOW FULL TABLES IN ${config.db.database} WHERE TABLE_TYPE LIKE 'VIEW'`, {
|
|
260
|
-
type: sequelize.QueryTypes.SELECT,
|
|
261
|
-
raw: true
|
|
262
|
-
});
|
|
263
|
-
if (views) {
|
|
264
|
-
const viewNames = views.map(function (v) {
|
|
265
|
-
return Object.values(v)[0];
|
|
266
|
-
});
|
|
267
|
-
tables = tables.filter(function (t) {
|
|
268
|
-
return !viewNames.includes(t);
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
const { dir, timestamp = true, prefix } = _this2.getArgv();
|
|
272
|
-
if (prefix) {
|
|
273
|
-
tables = tables.filter(function (t) {
|
|
274
|
-
return t.startsWith(prefix);
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/src/entities`;
|
|
279
|
-
const schemaPath = `${path}/schemas`;
|
|
280
|
-
const entityTemplate = _fs2.default.readFileSync(`${__dirname}/../../template/entity.ejs`, 'utf8');
|
|
281
|
-
const schemaTemplate = _fs2.default.readFileSync(`${__dirname}/../../template/schema.ejs`, 'utf8');
|
|
282
|
-
_mkdirp2.default.sync(path);
|
|
283
|
-
_mkdirp2.default.sync(schemaPath);
|
|
284
|
-
|
|
285
|
-
logger.info('Start generate DB schemas to dir %s', path);
|
|
286
|
-
|
|
287
|
-
const tableHandler = (() => {
|
|
288
|
-
var _ref = _asyncToGenerator(function* (table) {
|
|
289
|
-
const columns = yield query.describeTable(table);
|
|
290
|
-
const rawColumns = yield sequelize.query(`SHOW FULL COLUMNS FROM ${table}`, {
|
|
291
|
-
type: sequelize.QueryTypes.SELECT,
|
|
292
|
-
raw: true
|
|
293
|
-
});
|
|
294
|
-
Object.values(rawColumns).forEach(function (rawColumn) {
|
|
295
|
-
const columnName = rawColumn.Field;
|
|
296
|
-
columns[columnName].type = MakeEntity.typeAdditional(columns[columnName].type, MakeEntity.typeMapping(columns[columnName].type), rawColumn);
|
|
297
|
-
columns[columnName].unique = rawColumn.Key === 'UNI';
|
|
298
|
-
columns[columnName].comment = rawColumn.Comment;
|
|
299
|
-
columns[columnName].autoIncrement = rawColumn.Extra.startsWith('auto_increment') === true;
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
const indexes = yield MakeEntity.getIndexes(table, sequelize);
|
|
303
|
-
const entityFile = `${path}/${table}.js`;
|
|
304
|
-
const schemaFile = `${schemaPath}/${table}.js`;
|
|
305
|
-
try {
|
|
306
|
-
_fs2.default.accessSync(entityFile);
|
|
307
|
-
logger.info('Entity file %s generate skipped, already exists by %s', table, entityFile);
|
|
308
|
-
} catch (e) {
|
|
309
|
-
_fs2.default.writeFileSync(entityFile, _lodash2.default.template(entityTemplate)({ table }));
|
|
310
|
-
logger.info('Entity file %s generated as %s', table, entityFile);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
try {
|
|
314
|
-
_fs2.default.accessSync(schemaFile);
|
|
315
|
-
logger.info('Schema file %s generate override, already exists by %s', table, schemaFile);
|
|
316
|
-
} catch (e) {
|
|
317
|
-
logger.info('Schema file %s generated as %s', table, schemaFile);
|
|
318
|
-
}
|
|
319
|
-
_fs2.default.writeFileSync(schemaFile, _lodash2.default.template(schemaTemplate)({
|
|
320
|
-
columns,
|
|
321
|
-
table,
|
|
322
|
-
indexes,
|
|
323
|
-
timestamp: parseInt(timestamp, 10) > 0
|
|
324
|
-
}));
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
return function tableHandler(_x) {
|
|
328
|
-
return _ref.apply(this, arguments);
|
|
329
|
-
};
|
|
330
|
-
})();
|
|
331
|
-
|
|
332
|
-
//Skip sequelize migrate table
|
|
333
|
-
yield Promise.all(Object.values(tables).filter(function (t) {
|
|
334
|
-
return !['sequelizemeta', 'tramp_migrations'].includes(t);
|
|
335
|
-
}).map(tableHandler));
|
|
336
|
-
logger.info('All DB schemas generated');
|
|
337
|
-
})();
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
let MakeGraphql = exports.MakeGraphql = class MakeGraphql extends _interface2.default {
|
|
341
|
-
static getName() {
|
|
342
|
-
return 'make:graphql';
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
static getDescription() {
|
|
346
|
-
return 'Generate graphql schema';
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
static getSpec() {
|
|
350
|
-
return {
|
|
351
|
-
dir: {
|
|
352
|
-
required: false,
|
|
353
|
-
description: 'Where entity files to be generated'
|
|
354
|
-
},
|
|
355
|
-
prefix: {
|
|
356
|
-
required: false,
|
|
357
|
-
description: 'Table prefix'
|
|
358
|
-
},
|
|
359
|
-
mapping: {
|
|
360
|
-
required: false,
|
|
361
|
-
description: 'Mapping file path'
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
static typeMapping(_type) {
|
|
367
|
-
const type = _type.toLowerCase();
|
|
368
|
-
if (type === 'tinyint(1)' || type === 'boolean' || type === 'bit(1)') {
|
|
369
|
-
return 'Boolean';
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
if (type.match(/^(smallint|mediumint|tinyint|int)/)) {
|
|
373
|
-
return 'Int';
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
if (type.startsWith('bigint')) {
|
|
377
|
-
return 'Int';
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
if (type.startsWith('enum')) {
|
|
381
|
-
return 'Enum';
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
if (type.match(/^string|varchar|varying|nvarchar/)) {
|
|
385
|
-
return 'String';
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
if (type.startsWith('char')) {
|
|
389
|
-
return 'String';
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
if (type.match(/text|ntext$/)) {
|
|
393
|
-
return 'String';
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
if (type.startsWith('year')) {
|
|
397
|
-
return 'Int';
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
if (type.startsWith('datetime')) {
|
|
401
|
-
return 'String';
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
if (type.startsWith('date')) {
|
|
405
|
-
return 'String';
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (type.startsWith('time')) {
|
|
409
|
-
return 'String';
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
if (type.match(/^(float8|double precision)/)) {
|
|
413
|
-
return 'Float';
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
if (type.match(/^(float|float4)/)) {
|
|
417
|
-
return 'Float';
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
if (type.startsWith('decimal')) {
|
|
421
|
-
return 'Float';
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (type.match(/^uuid|uniqueidentifier/)) {
|
|
425
|
-
return 'String';
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
if (type.startsWith('jsonb')) {
|
|
429
|
-
return 'JSON';
|
|
430
|
-
}
|
|
431
|
-
if (type.startsWith('json')) {
|
|
432
|
-
return 'JSON';
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
if (type.startsWith('geometry')) {
|
|
436
|
-
return 'String';
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
return type;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
getEnums(_type, columnName, tableName) {
|
|
443
|
-
const type = _type.toLowerCase();
|
|
444
|
-
const values = type.slice(5, -1).split(',').map(v => v.slice(1, -1));
|
|
445
|
-
return {
|
|
446
|
-
name: `ENUM_${tableName}_${columnName}`,
|
|
447
|
-
values
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
run() {
|
|
452
|
-
var _this3 = this;
|
|
453
|
-
|
|
454
|
-
return _asyncToGenerator(function* () {
|
|
455
|
-
const config = _di2.default.get('config').get();
|
|
456
|
-
const logger = _di2.default.get('logger');
|
|
457
|
-
const sequelize = new _sequelize2.default(config.db.database, null, null, Object.assign({}, config.sequelize, config.db, { logging: logger.getInstance().verbose }));
|
|
458
|
-
const query = sequelize.getQueryInterface();
|
|
459
|
-
|
|
460
|
-
let tables = yield query.showAllTables();
|
|
461
|
-
const views = yield sequelize.query(`SHOW FULL TABLES IN ${config.db.database} WHERE TABLE_TYPE LIKE 'VIEW'`, {
|
|
462
|
-
type: sequelize.QueryTypes.SELECT,
|
|
463
|
-
raw: true
|
|
464
|
-
});
|
|
465
|
-
if (views) {
|
|
466
|
-
const viewNames = views.map(function (v) {
|
|
467
|
-
return Object.values(v)[0];
|
|
468
|
-
});
|
|
469
|
-
tables = tables.filter(function (t) {
|
|
470
|
-
return !viewNames.includes(t);
|
|
471
|
-
});
|
|
472
|
-
}
|
|
473
|
-
const {
|
|
474
|
-
dir, prefix, mapping
|
|
475
|
-
} = _this3.getArgv();
|
|
476
|
-
if (prefix) {
|
|
477
|
-
tables = tables.filter(function (t) {
|
|
478
|
-
return t.startsWith(prefix);
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/src/graphql`;
|
|
483
|
-
const schemaPath = `${path}/entities`;
|
|
484
|
-
const schemaTemplate = _fs2.default.readFileSync(`${__dirname}/../../template/graphql.ejs`, 'utf8');
|
|
485
|
-
const mappingFile = mapping ? `${process.cwd()}/${mapping}` : `${process.cwd()}/src/graphql/mapping.json`;
|
|
486
|
-
const mappingContent = JSON.parse(_fs2.default.readFileSync(mappingFile, 'utf8'));
|
|
487
|
-
const getMappedTableName = function (tableName) {
|
|
488
|
-
return mappingContent[tableName] ? mappingContent[tableName] : tableName;
|
|
489
|
-
};
|
|
490
|
-
_mkdirp2.default.sync(path);
|
|
491
|
-
_mkdirp2.default.sync(schemaPath);
|
|
492
|
-
|
|
493
|
-
logger.info('Start generate GraphQL schemas to dir %s', path);
|
|
494
|
-
|
|
495
|
-
const tableHandler = (() => {
|
|
496
|
-
var _ref2 = _asyncToGenerator(function* (tableName) {
|
|
497
|
-
const enums = [];
|
|
498
|
-
const columns = yield query.describeTable(tableName);
|
|
499
|
-
const rawColumns = yield sequelize.query(`SHOW FULL COLUMNS FROM ${tableName}`, {
|
|
500
|
-
type: sequelize.QueryTypes.SELECT,
|
|
501
|
-
raw: true
|
|
502
|
-
});
|
|
503
|
-
const mappedTableName = getMappedTableName(tableName);
|
|
504
|
-
Object.values(rawColumns).forEach(function (rawColumn) {
|
|
505
|
-
const columnName = rawColumn.Field;
|
|
506
|
-
let type = MakeGraphql.typeMapping(columns[columnName].type, mappedTableName);
|
|
507
|
-
if (type === 'Enum') {
|
|
508
|
-
const enumObj = _this3.getEnums(columns[columnName].type, columnName, mappedTableName);
|
|
509
|
-
type = enumObj.name;
|
|
510
|
-
enums.push(enumObj);
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
columns[columnName].type = type;
|
|
514
|
-
columns[columnName].unique = rawColumn.Key === 'UNI';
|
|
515
|
-
columns[columnName].comment = rawColumn.Comment;
|
|
516
|
-
columns[columnName].autoIncrement = rawColumn.Extra.startsWith('auto_increment') === true;
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
const indexes = yield MakeEntity.getIndexes(tableName, sequelize);
|
|
520
|
-
const schemaFile = `${schemaPath}/${tableName}.graphqls`;
|
|
521
|
-
try {
|
|
522
|
-
_fs2.default.accessSync(schemaFile);
|
|
523
|
-
logger.info('Graphql schema file %s generate override, already exists by %s', tableName, schemaFile);
|
|
524
|
-
} catch (e) {
|
|
525
|
-
logger.info('Graphql schema file %s generated as %s', tableName, schemaFile);
|
|
526
|
-
}
|
|
527
|
-
_fs2.default.writeFileSync(schemaFile, _lodash2.default.template(schemaTemplate)({
|
|
528
|
-
tableName,
|
|
529
|
-
mappedTableName,
|
|
530
|
-
columns,
|
|
531
|
-
indexes,
|
|
532
|
-
enums
|
|
533
|
-
}));
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
return function tableHandler(_x2) {
|
|
537
|
-
return _ref2.apply(this, arguments);
|
|
538
|
-
};
|
|
539
|
-
})();
|
|
540
|
-
|
|
541
|
-
//Skip sequelize migrate table
|
|
542
|
-
yield Promise.all(Object.values(tables).filter(function (t) {
|
|
543
|
-
return !['sequelizemeta', 'tramp_migrations'].includes(t);
|
|
544
|
-
}).map(tableHandler));
|
|
545
|
-
logger.info('All DB schemas generated');
|
|
546
|
-
})();
|
|
547
|
-
}
|
|
548
|
-
};
|
|
549
|
-
//# sourceMappingURL=make_entity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/make_entity.js"],"names":["MakeDbView","Command","getName","getDescription","getSpec","entity_path","required","description","dir","getSql","tableName","attributes","attrs","map","attr","fieldName","endsWith","join","run","logger","DI","get","entityPath","process","cwd","getArgv","path","file","info","entities","Entities","mkdirp","sync","models","Object","values","getInstance","sql","forEach","model","getTableName","push","fs","writeFileSync","MakeEntity","timestamp","prefix","typeMapping","_type","type","toLowerCase","match","length","startsWith","replace","bits","exec","typeAdditional","sequlizeType","rawColumn","finalType","Collation","getIndexes","sequelize","rawIndexes","query","QueryTypes","SELECT","raw","_","groupBy","entries","filter","key","name","columns","index","Non_unique","unique","fields","c","Column_name","config","Sequelize","db","database","assign","logging","verbose","getQueryInterface","tables","showAllTables","views","viewNames","v","includes","t","schemaPath","entityTemplate","readFileSync","__dirname","schemaTemplate","tableHandler","table","describeTable","rawColumns","columnName","Field","Key","comment","Comment","autoIncrement","Extra","indexes","entityFile","schemaFile","accessSync","e","template","parseInt","Promise","all","MakeGraphql","mapping","getEnums","slice","split","mappingFile","mappingContent","JSON","parse","getMappedTableName","enums","mappedTableName","enumObj"],"mappings":"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","file":"make_entity.js","sourcesContent":["import _ from 'lodash';\nimport Sequelize from 'sequelize';\nimport fs from 'fs';\nimport mkdirp from 'mkdirp';\nimport Command from './interface';\nimport DI from '../di';\nimport Entities from '../entities';\n\n\nexport class MakeDbView extends Command {\n static getName() {\n return 'make:dbview';\n }\n\n static getDescription() {\n return 'Generate db views';\n }\n\n static getSpec() {\n return {\n entity_path: {\n required: false,\n description: 'Entity path'\n },\n dir: {\n required: false,\n description: 'Where view.sql to be generated'\n }\n };\n }\n\n getSql(tableName, attributes) {\n const attrs = attributes.map((attr) => {\n const { fieldName } = attr;\n if (fieldName.endsWith('At')) {\n return ` FROM_UNIXTIME(IF(${fieldName} > 0, ${fieldName}, NULL)) AS ${fieldName}`;\n }\n return ` \\`${fieldName}\\` AS \\`${fieldName}\\``;\n });\n return `DROP VIEW IF EXISTS view_${tableName};\nCREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW view_${tableName}\n AS SELECT\n ${attrs.join(',\\n ')}\n FROM ${tableName};\n\n`;\n }\n\n async run() {\n const logger = DI.get('logger');\n const { dir, entity_path: entityPath = `${process.cwd()}/build/entities` } = this.getArgv();\n const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/sql`;\n const file = [path, 'views.sql'].join('/');\n logger.info('Scan entity files under %s', entityPath);\n const entities = new Entities(entityPath);\n\n logger.info('Start generate db views to %s', file);\n mkdirp.sync(path);\n const models = Object.values(entities.getInstance().models);\n const sql = [];\n models.forEach((model) => {\n logger.info(`Creating ${model.getTableName()} view`);\n sql.push(this.getSql(model.getTableName(), Object.values(model.attributes)));\n });\n\n fs.writeFileSync(file, sql.join(''));\n logger.info('Views created');\n }\n}\n\nexport class MakeEntity extends Command {\n static getName() {\n return 'make:entity';\n }\n\n static getDescription() {\n return 'Generate entities';\n }\n\n static getSpec() {\n return {\n timestamp: {\n required: false,\n description: 'Sequelize timestamp enabled'\n },\n dir: {\n required: false,\n description: 'Where entity files to be generated'\n },\n prefix: {\n required: false,\n description: 'Table prefix'\n }\n };\n }\n\n static typeMapping(_type) {\n const type = _type.toLowerCase();\n if (type === 'tinyint(1)' || type === 'boolean' || type === 'bit(1)') {\n return 'DataTypes.BOOLEAN';\n }\n\n if (type.match(/^(smallint|mediumint|tinyint|int)/)) {\n const length = type.match(/\\(\\d+\\)/) || '';\n return `DataTypes.INTEGER${length}`;\n }\n\n if (type.startsWith('bigint')) {\n return 'DataTypes.BIGINT';\n }\n if (type.startsWith('enum')) {\n return type.replace('enum', 'DataTypes.ENUM').replace(/,/g, ', ');\n }\n\n if (type.match(/^string|varchar|varying|nvarchar/)) {\n const length = type.match(/\\(\\d+\\)/) || '';\n return length ? `DataTypes.STRING${length}` : 'DataTypes.STRING';\n }\n\n if (type.startsWith('char')) {\n const length = type.match(/\\(\\d+\\)/) || '';\n return `DataTypes.CHAR${length}`;\n }\n\n if (type.match(/text|ntext$/)) {\n return 'DataTypes.TEXT';\n }\n\n if (type.startsWith('year')) {\n return 'DataTypes.INTEGER(4)';\n }\n\n if (type.startsWith('datetime')) {\n return 'DataTypes.DATE';\n }\n\n if (type.startsWith('date')) {\n return 'DataTypes.DATEONLY';\n }\n\n if (type.startsWith('time')) {\n return 'DataTypes.TIME';\n }\n\n if (type.match(/^(float8|double precision)/)) {\n return 'DataTypes.DOUBLE';\n }\n\n if (type.match(/^(float|float4)/)) {\n return 'DataTypes.FLOAT';\n }\n\n if (type.startsWith('decimal')) {\n const [, length, bits] = /\\((\\d+),(\\d+)\\)/g.exec(type) || [];\n return length ? `DataTypes.DECIMAL(${length}, ${bits})` : 'DataTypes.DECIMAL';\n }\n\n if (type.match(/^uuid|uniqueidentifier/)) {\n return 'DataTypes.UUIDV4';\n }\n\n if (type.startsWith('jsonb')) {\n return 'DataTypes.JSONB';\n }\n if (type.startsWith('json')) {\n return 'DataTypes.JSON';\n }\n\n if (type.startsWith('geometry')) {\n return 'DataTypes.GEOMETRY';\n }\n\n return type;\n }\n\n static typeAdditional(_type, sequlizeType, rawColumn) {\n const type = _type.toLowerCase();\n let finalType = sequlizeType;\n\n if (type.match(/unsigned/)) {\n finalType += '.UNSIGNED';\n }\n\n if (type.match(/zerofill/)) {\n finalType += '.ZEROFILL';\n }\n\n if (rawColumn.Collation === 'utf8_bin') {\n finalType += '.BINARY';\n }\n return finalType;\n }\n\n static async getIndexes(tableName, sequelize) {\n let rawIndexes = await sequelize.query(\n `SHOW INDEX FROM ${tableName}`,\n {\n type: sequelize.QueryTypes.SELECT,\n raw: true\n }\n );\n if (!rawIndexes) {\n return [];\n }\n rawIndexes = _.groupBy(rawIndexes, 'Key_name');\n return Object.entries(rawIndexes).filter(([key]) => key !== 'PRIMARY').map(([name, columns]) => {\n const index = columns[0].Non_unique !== 1 ? { name, unique: true } : { name };\n index.fields = columns.map(c => c.Column_name);\n return index;\n });\n }\n\n async run() {\n const config = DI.get('config').get();\n const logger = DI.get('logger');\n const sequelize = new Sequelize(\n config.db.database,\n null,\n null,\n Object.assign({}, config.sequelize, config.db, { logging: logger.getInstance().verbose })\n );\n const query = sequelize.getQueryInterface();\n\n let tables = await query.showAllTables();\n const views = await sequelize.query(`SHOW FULL TABLES IN ${config.db.database} WHERE TABLE_TYPE LIKE 'VIEW'`, {\n type: sequelize.QueryTypes.SELECT,\n raw: true\n });\n if (views) {\n const viewNames = views.map(v => Object.values(v)[0]);\n tables = tables.filter(t => !viewNames.includes(t));\n }\n const { dir, timestamp = true, prefix } = this.getArgv();\n if (prefix) {\n tables = tables.filter(t => t.startsWith(prefix));\n }\n\n const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/src/entities`;\n const schemaPath = `${path}/schemas`;\n const entityTemplate = fs.readFileSync(`${__dirname}/../../template/entity.ejs`, 'utf8');\n const schemaTemplate = fs.readFileSync(`${__dirname}/../../template/schema.ejs`, 'utf8');\n mkdirp.sync(path);\n mkdirp.sync(schemaPath);\n\n logger.info('Start generate DB schemas to dir %s', path);\n\n const tableHandler = async (table) => {\n const columns = await query.describeTable(table);\n const rawColumns = await sequelize.query(`SHOW FULL COLUMNS FROM ${table}`, {\n type: sequelize.QueryTypes.SELECT,\n raw: true\n });\n Object.values(rawColumns).forEach((rawColumn) => {\n const columnName = rawColumn.Field;\n columns[columnName].type = MakeEntity.typeAdditional(\n columns[columnName].type,\n MakeEntity.typeMapping(columns[columnName].type),\n rawColumn\n );\n columns[columnName].unique = rawColumn.Key === 'UNI';\n columns[columnName].comment = rawColumn.Comment;\n columns[columnName].autoIncrement = rawColumn.Extra.startsWith('auto_increment') === true;\n });\n\n const indexes = await MakeEntity.getIndexes(table, sequelize);\n const entityFile = `${path}/${table}.js`;\n const schemaFile = `${schemaPath}/${table}.js`;\n try {\n fs.accessSync(entityFile);\n logger.info('Entity file %s generate skipped, already exists by %s', table, entityFile);\n } catch (e) {\n fs.writeFileSync(entityFile, _.template(entityTemplate)({ table }));\n logger.info('Entity file %s generated as %s', table, entityFile);\n }\n\n try {\n fs.accessSync(schemaFile);\n logger.info('Schema file %s generate override, already exists by %s', table, schemaFile);\n } catch (e) {\n logger.info('Schema file %s generated as %s', table, schemaFile);\n }\n fs.writeFileSync(schemaFile, _.template(schemaTemplate)({\n columns,\n table,\n indexes,\n timestamp: parseInt(timestamp, 10) > 0\n }));\n };\n\n //Skip sequelize migrate table\n await Promise.all(Object.values(tables).filter(t => !['sequelizemeta', 'tramp_migrations'].includes(t)).map(tableHandler));\n logger.info('All DB schemas generated');\n }\n}\n\nexport class MakeGraphql extends Command {\n static getName() {\n return 'make:graphql';\n }\n\n static getDescription() {\n return 'Generate graphql schema';\n }\n\n static getSpec() {\n return {\n dir: {\n required: false,\n description: 'Where entity files to be generated'\n },\n prefix: {\n required: false,\n description: 'Table prefix'\n },\n mapping: {\n required: false,\n description: 'Mapping file path'\n }\n };\n }\n\n static typeMapping(_type) {\n const type = _type.toLowerCase();\n if (type === 'tinyint(1)' || type === 'boolean' || type === 'bit(1)') {\n return 'Boolean';\n }\n\n if (type.match(/^(smallint|mediumint|tinyint|int)/)) {\n return 'Int';\n }\n\n if (type.startsWith('bigint')) {\n return 'Int';\n }\n\n if (type.startsWith('enum')) {\n return 'Enum';\n }\n\n if (type.match(/^string|varchar|varying|nvarchar/)) {\n return 'String';\n }\n\n if (type.startsWith('char')) {\n return 'String';\n }\n\n if (type.match(/text|ntext$/)) {\n return 'String';\n }\n\n if (type.startsWith('year')) {\n return 'Int';\n }\n\n if (type.startsWith('datetime')) {\n return 'String';\n }\n\n if (type.startsWith('date')) {\n return 'String';\n }\n\n if (type.startsWith('time')) {\n return 'String';\n }\n\n if (type.match(/^(float8|double precision)/)) {\n return 'Float';\n }\n\n if (type.match(/^(float|float4)/)) {\n return 'Float';\n }\n\n if (type.startsWith('decimal')) {\n return 'Float';\n }\n\n if (type.match(/^uuid|uniqueidentifier/)) {\n return 'String';\n }\n\n if (type.startsWith('jsonb')) {\n return 'JSON';\n }\n if (type.startsWith('json')) {\n return 'JSON';\n }\n\n if (type.startsWith('geometry')) {\n return 'String';\n }\n\n return type;\n }\n\n getEnums(_type, columnName, tableName) {\n const type = _type.toLowerCase();\n const values = type.slice(5, -1).split(',').map(v => v.slice(1, -1));\n return {\n name: `ENUM_${tableName}_${columnName}`,\n values\n };\n }\n\n async run() {\n const config = DI.get('config').get();\n const logger = DI.get('logger');\n const sequelize = new Sequelize(\n config.db.database,\n null,\n null,\n Object.assign({}, config.sequelize, config.db, { logging: logger.getInstance().verbose })\n );\n const query = sequelize.getQueryInterface();\n\n let tables = await query.showAllTables();\n const views = await sequelize.query(`SHOW FULL TABLES IN ${config.db.database} WHERE TABLE_TYPE LIKE 'VIEW'`, {\n type: sequelize.QueryTypes.SELECT,\n raw: true\n });\n if (views) {\n const viewNames = views.map(v => Object.values(v)[0]);\n tables = tables.filter(t => !viewNames.includes(t));\n }\n const {\n dir, prefix, mapping\n } = this.getArgv();\n if (prefix) {\n tables = tables.filter(t => t.startsWith(prefix));\n }\n\n const path = dir ? `${process.cwd()}/${dir}` : `${process.cwd()}/src/graphql`;\n const schemaPath = `${path}/entities`;\n const schemaTemplate = fs.readFileSync(`${__dirname}/../../template/graphql.ejs`, 'utf8');\n const mappingFile = mapping ? `${process.cwd()}/${mapping}` : `${process.cwd()}/src/graphql/mapping.json`;\n const mappingContent = JSON.parse(fs.readFileSync(mappingFile, 'utf8'));\n const getMappedTableName = tableName =>\n (mappingContent[tableName] ? mappingContent[tableName] : tableName);\n mkdirp.sync(path);\n mkdirp.sync(schemaPath);\n\n logger.info('Start generate GraphQL schemas to dir %s', path);\n\n const tableHandler = async (tableName) => {\n const enums = [];\n const columns = await query.describeTable(tableName);\n const rawColumns = await sequelize.query(`SHOW FULL COLUMNS FROM ${tableName}`, {\n type: sequelize.QueryTypes.SELECT,\n raw: true\n });\n const mappedTableName = getMappedTableName(tableName);\n Object.values(rawColumns).forEach((rawColumn) => {\n const columnName = rawColumn.Field;\n let type = MakeGraphql.typeMapping(columns[columnName].type, mappedTableName);\n if (type === 'Enum') {\n const enumObj = this.getEnums(columns[columnName].type, columnName, mappedTableName);\n type = enumObj.name;\n enums.push(enumObj);\n }\n\n columns[columnName].type = type;\n columns[columnName].unique = rawColumn.Key === 'UNI';\n columns[columnName].comment = rawColumn.Comment;\n columns[columnName].autoIncrement = rawColumn.Extra.startsWith('auto_increment') === true;\n });\n\n const indexes = await MakeEntity.getIndexes(tableName, sequelize);\n const schemaFile = `${schemaPath}/${tableName}.graphqls`;\n try {\n fs.accessSync(schemaFile);\n logger.info('Graphql schema file %s generate override, already exists by %s', tableName, schemaFile);\n } catch (e) {\n logger.info('Graphql schema file %s generated as %s', tableName, schemaFile);\n }\n fs.writeFileSync(schemaFile, _.template(schemaTemplate)({\n tableName,\n mappedTableName,\n columns,\n indexes,\n enums\n }));\n };\n\n //Skip sequelize migrate table\n await Promise.all(Object.values(tables).filter(t => !['sequelizemeta', 'tramp_migrations'].includes(t)).map(tableHandler));\n logger.info('All DB schemas generated');\n }\n}\n"]}
|
package/lib/commands/tramp.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = undefined;
|
|
7
|
-
|
|
8
|
-
var _interface = require('./interface');
|
|
9
|
-
|
|
10
|
-
var _interface2 = _interopRequireDefault(_interface);
|
|
11
|
-
|
|
12
|
-
var _di = require('../di');
|
|
13
|
-
|
|
14
|
-
var _di2 = _interopRequireDefault(_di);
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
|
19
|
-
|
|
20
|
-
let TrampConfig = class TrampConfig extends _interface2.default {
|
|
21
|
-
static getName() {
|
|
22
|
-
return 'tramp:dump-config';
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
static getDescription() {
|
|
26
|
-
return 'Print tramp cli required config json';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
static getSpec() {
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
run() {
|
|
34
|
-
return _asyncToGenerator(function* () {
|
|
35
|
-
const config = _di2.default.get('config');
|
|
36
|
-
const dbConfig = config.get('db');
|
|
37
|
-
// eslint-disable-next-line no-console
|
|
38
|
-
console.log(JSON.stringify({
|
|
39
|
-
connection: {
|
|
40
|
-
host: dbConfig.replication.write.host,
|
|
41
|
-
user: dbConfig.replication.write.username,
|
|
42
|
-
password: dbConfig.replication.write.password,
|
|
43
|
-
database: dbConfig.database,
|
|
44
|
-
port: dbConfig.port
|
|
45
|
-
},
|
|
46
|
-
editor: config.get('dev.editor') || 'webstorm',
|
|
47
|
-
paths: dbConfig.migrationPaths
|
|
48
|
-
}));
|
|
49
|
-
})();
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
exports.default = TrampConfig;
|
|
53
|
-
//# sourceMappingURL=tramp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/tramp.js"],"names":["TrampConfig","Command","getName","getDescription","getSpec","run","config","DI","get","dbConfig","console","log","JSON","stringify","connection","host","replication","write","user","username","password","database","port","editor","paths","migrationPaths"],"mappings":";;;;;;;AAAA;;;;AACA;;;;;;;;IAEqBA,W,GAAN,MAAMA,WAAN,SAA0BC,mBAA1B,CAAkC;AAC/C,SAAOC,OAAP,GAAiB;AACf,WAAO,mBAAP;AACD;;AAED,SAAOC,cAAP,GAAwB;AACtB,WAAO,sCAAP;AACD;;AAED,SAAOC,OAAP,GAAiB;AACf,WAAO,EAAP;AACD;;AAEKC,KAAN,GAAY;AAAA;AACV,YAAMC,SAASC,aAAGC,GAAH,CAAO,QAAP,CAAf;AACA,YAAMC,WAAWH,OAAOE,GAAP,CAAW,IAAX,CAAjB;AACA;AACAE,cAAQC,GAAR,CAAYC,KAAKC,SAAL,CAAe;AACzBC,oBAAY;AACVC,gBAAMN,SAASO,WAAT,CAAqBC,KAArB,CAA2BF,IADvB;AAEVG,gBAAMT,SAASO,WAAT,CAAqBC,KAArB,CAA2BE,QAFvB;AAGVC,oBAAUX,SAASO,WAAT,CAAqBC,KAArB,CAA2BG,QAH3B;AAIVC,oBAAUZ,SAASY,QAJT;AAKVC,gBAAMb,SAASa;AALL,SADa;AAQzBC,gBAAQjB,OAAOE,GAAP,CAAW,YAAX,KAA4B,UARX;AASzBgB,eAAOf,SAASgB;AATS,OAAf,CAAZ;AAJU;AAeX;AA5B8C,C;kBAA5BzB,W","file":"tramp.js","sourcesContent":["import Command from './interface';\nimport DI from '../di';\n\nexport default class TrampConfig extends Command {\n static getName() {\n return 'tramp:dump-config';\n }\n\n static getDescription() {\n return 'Print tramp cli required config json';\n }\n\n static getSpec() {\n return {};\n }\n\n async run() {\n const config = DI.get('config');\n const dbConfig = config.get('db');\n // eslint-disable-next-line no-console\n console.log(JSON.stringify({\n connection: {\n host: dbConfig.replication.write.host,\n user: dbConfig.replication.write.username,\n password: dbConfig.replication.write.password,\n database: dbConfig.database,\n port: dbConfig.port\n },\n editor: config.get('dev.editor') || 'webstorm',\n paths: dbConfig.migrationPaths\n }));\n }\n}\n\n"]}
|