sequelize-automate
Version:
Automatically generate bare sequelize models from your database.
90 lines (77 loc) • 2.4 kB
JavaScript
const { parse } = require('@babel/parser');
const { default: generate } = require('@babel/generator');
const t = require('@babel/types');
const { default: traverse } = require('@babel/traverse');
const fs = require('fs');
const { join } = require('path');
const { bigCamelCase } = require('../util/wordCase');
const {
generateOptions,
processAttributesProperties,
processOptionsProperties,
} = require('./common/index');
/**
* Generate codes
* @param {object} definition
* @param {object} options
*/
function generateCode(definition, options) {
const file = options.isEgg ? './template/egg/user.text' : './template/javascript/user.text';
const source = fs
.readFileSync(join(__dirname, file))
.toString();
const ast = parse(source, {
strictMode: true,
});
traverse(ast, {
VariableDeclarator: (path) => {
const { node } = path;
if (t.isIdentifier(node.id, { name: 'attributes' })) {
const properties = processAttributesProperties(definition.attributes);
node.init = t.objectExpression(properties);
}
if (t.isIdentifier(node.id, { name: 'options' })) {
const properties = processOptionsProperties(
node.init.properties,
definition,
);
node.init = t.objectExpression(properties);
}
if (t.isIdentifier(node.id, { name: 'UserModel' })) {
node.id = t.identifier(bigCamelCase(definition.modelName));
}
},
CallExpression: (path) => {
const { node } = path;
if (
t.isMemberExpression(node.callee)
&& t.isIdentifier(node.callee.property, { name: 'define' })
) {
node.arguments[0] = t.stringLiteral(definition.modelName);
}
},
ReturnStatement: (path) => {
const { node } = path;
if (t.isIdentifier(node.argument, { name: 'UserModel' })) {
node.argument = t.identifier(bigCamelCase(definition.modelName));
}
},
});
const { code } = generate(ast, generateOptions);
return code;
}
function process(definitions, options) {
const modelCodes = definitions.map((definition) => {
const { modelFileName } = definition;
const fileType = 'model';
const file = `${modelFileName}.js`;
const code = generateCode(definition, options);
return {
file,
code,
fileType,
};
});
return modelCodes;
}
module.exports = process;