tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
146 lines • 6.96 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const model_1 = __importDefault(require("./model"));
const modelDecorator_1 = __importDefault(require("./modelDecorator"));
const pluralize_1 = __importDefault(require("pluralize"));
const lib_1 = require("../../lib");
const snakeCaseToPascal = (data) => {
let str = data.split('_');
for (let i = 0; i < str.length; i++) {
str[i] = str[i].slice(0, 1).toUpperCase() + str[i].slice(1, str[i].length);
}
return str.join('');
};
const formatSchema = (data) => {
const formattedCode = {};
for (const field of data) {
const [key, value] = field.split(":").map((item) => item.trim());
formattedCode[key] = value;
}
return formattedCode;
};
exports.default = (cmd) => {
const { dir, cwd, type, fs, decorator, env, npm } = cmd;
if (dir == null)
throw new Error("Cannot find directory please specify the directory : '--dir=${directory}'");
try {
fs.accessSync(`${cwd}/${dir}`, fs.F_OK, {
recursive: true
});
}
catch (e) {
fs.mkdirSync(`${cwd}/${dir}`, {
recursive: true
});
}
if (decorator) {
new lib_1.DB()
.loadEnv(env)
.rawQuery('SHOW TABLES')
.then(tables => {
for (let i = 0; i < tables.length; i++) {
const table = String(Object.values(tables[i])?.shift());
const model = snakeCaseToPascal(pluralize_1.default.singular(table));
new lib_1.DB().loadEnv(env).rawQuery(`SHOW COLUMNS FROM \`${table}\``).then(raws => {
let schema = [];
for (const raw of raws) {
const schemaColumn = [
`@Column(() => `,
`new Blueprint().${/^[^()]*$/.test(raw.Type)
? raw.Type === raw.Type.includes('unsigned')
? 'int().unsigned()'
: `${raw.Type.toLocaleLowerCase()}()`
: raw.Type.toLocaleLowerCase()}`,
`${raw.Null === 'YES' ? '.null()' : '.notNull()'}`,
raw.Key === 'PRI' ? '.primary()' : raw.Key === 'UNI' ? '.unique()' : '',
raw.Default != null ? `.default('${raw.Default}')` : '',
`${raw.Extra === 'auto_increment' ? '.autoIncrement()' : ''}`,
`)`
].join('');
const detectType = (type) => {
const t = type.toLowerCase();
const typeForNumber = ['INT', 'TINYINT', 'BIGINT', 'DOUBLE', 'FLOAT'].map(r => r.toLowerCase());
const typeForDate = ['DATE', 'DATETIME', 'TIMESTAMP'].map(r => r.toLowerCase());
if (typeForNumber.some(v => t.includes(v)))
return 'number';
if (typeForDate.some(v => t.includes(v)))
return 'Date';
return 'string';
};
const publicColumn = `public ${raw.Field} !: ${detectType(raw.Type)}`;
schema.push({
schemaColumn,
publicColumn
});
}
let str = '';
for (const i in schema) {
const s = schema[i];
const isLast = +i === schema.length - 1;
str += ` ${s.schemaColumn} \n`;
str += ` ${s.publicColumn} ${isLast ? '' : '\n\n'}`;
}
const data = (0, modelDecorator_1.default)(model, npm, str);
fs.writeFile(`${cwd}/${dir}/${model}${type ?? '.ts'}`, data, (err) => {
if (err)
throw err;
console.log(`Model : '${model}' created successfully`);
});
}).catch(err => console.log(err));
}
console.log('\nGenerate Models has completed');
})
.catch(err => console.log(err));
return;
}
const generateModel = async () => {
const tables = await new lib_1.DB()
.loadEnv(env)
.rawQuery('SHOW TABLES');
for (let i = 0; i < tables.length; i++) {
const table = String(Object.values(tables[i])?.shift());
const model = snakeCaseToPascal(pluralize_1.default.singular(table));
try {
const raws = await new lib_1.DB().loadEnv(env).rawQuery(`SHOW COLUMNS FROM \`${table}\``);
let schema = [];
for (const index in raws) {
const raw = raws[index];
const str = [
`${raw.Field} : `,
`new Blueprint().${/^[^()]*$/.test(raw.Type)
? raw.Type === raw.Type.includes('unsigned')
? 'int().unsigned()'
: `${raw.Type.toLocaleLowerCase()}()`
: raw.Type.toLocaleLowerCase()}`,
`${raw.Null === 'YES' ? '.null()' : '.notNull()'}`,
raw.Key === 'PRI' ? '.primary()' : raw.Key === 'UNI' ? '.unique()' : '',
raw.Default != null ? `.default('${raw.Default}')` : '',
`${raw.Extra === 'auto_increment' ? '.autoIncrement()' : ''},`
].join('');
const isLast = Number(index) + 1 === raws.length;
schema.push(isLast ? str.replace(/,\s*$/, "") : str);
}
const formattedSchema = formatSchema(schema);
let str = "{\n";
for (const formatKey in formattedSchema) {
str += ` ${formatKey} : ${formattedSchema[formatKey]} \n`;
}
str += " }";
const data = (0, model_1.default)(model, npm, `${str}`);
fs.writeFileSync(`${cwd}/${dir}/${model}${type ?? '.ts'}`, data);
console.log(`Model : '${model}' created successfully`);
}
catch (err) {
console.log(`Model : '${model}' failed to create message: ${err.message}`);
}
}
};
generateModel()
.then(_ => console.log('\nGenerate Models has completed'))
.catch(err => console.log(err))
.finally(() => process.exit(0));
};
//# sourceMappingURL=make.js.map