quick-erd
Version:
quick and easy text-based ERD + code generator for migration, query, typescript types and orm entity
110 lines (109 loc) • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.readErdFromStdin = readErdFromStdin;
exports.writeSrcFile = writeSrcFile;
exports.writeSrcFileIfNeeded = writeSrcFileIfNeeded;
exports.addDependencies = addDependencies;
exports.addIgnore = addIgnore;
exports.readNpmScripts = readNpmScripts;
exports.addNpmScripts = addNpmScripts;
exports.readPackageJSON = readPackageJSON;
const fs_1 = require("fs");
const path_1 = require("path");
function readErdFromStdin(cb) {
if (process.stdin.isTTY) {
console.error('Reading erd from stdin... (Please pipe erd text to stdin)');
}
let text = '';
process.stdin
.on('data', chunk => (text += chunk))
.on('end', () => {
if (!text) {
console.error('missing erd text from stdin');
process.exit(1);
}
cb(text);
});
}
const writtenFiles = new Set();
function writeSrcFile(file, code) {
if (!writtenFiles.has(file)) {
console.error('saving to', file);
writtenFiles.add(file);
}
code = code.trim() + '\n';
(0, fs_1.writeFileSync)(file, code);
}
function writeSrcFileIfNeeded(file, code) {
try {
const oldCode = (0, fs_1.readFileSync)(file).toString();
if (oldCode.trim() == code.trim())
return;
}
catch (error) {
// this is new file
}
writeSrcFile(file, code);
}
function addDependencies(name, version, mode) {
const file = 'package.json';
const pkg = readPackageJSON(file);
const field = mode === 'dev' ? 'devDependencies' : 'dependencies';
const deps = pkg[field] || {};
if (name in deps) {
return;
}
deps[name] = version;
pkg[field] = Object.fromEntries(Object.keys(deps)
.sort()
.map(name => [name, deps[name]]));
const text = JSON.stringify(pkg, null, 2);
writeSrcFile(file, text);
}
function addIgnore(file, patterns) {
let text = ((0, fs_1.existsSync)(file) && (0, fs_1.readFileSync)(file).toString()) || '';
const originalText = text;
if (text && !text.endsWith('\n')) {
text += '\n';
}
const lines = text.split('\n').map(line => line.trim());
for (const pattern of patterns) {
const hasPattern = lines.some(line => line == pattern ||
line == pattern + '/' ||
line + '/' == pattern ||
line == pattern + '*' ||
line == '*' + pattern + '*' ||
line == '*' + (0, path_1.extname)(pattern) ||
line == '*' + (0, path_1.extname)(pattern) + '*');
if (!hasPattern) {
text += pattern + '\n';
}
}
if (text != originalText) {
writeSrcFile(file, text);
}
}
function readNpmScripts() {
const file = 'package.json';
const pkg = readPackageJSON(file);
return pkg.scripts || {};
}
function addNpmScripts(scripts) {
const file = 'package.json';
const pkg = readPackageJSON(file);
const originalText = JSON.stringify(pkg, null, 2);
pkg.scripts ||= {};
for (const key in scripts) {
if (!(key in pkg.scripts)) {
pkg.scripts[key] = scripts[key];
}
}
const newText = JSON.stringify(pkg, null, 2);
if (newText != originalText) {
writeSrcFile(file, newText);
}
}
function readPackageJSON(file) {
const pkg = JSON.parse((0, fs_1.readFileSync)(file).toString());
return pkg;
}