drizzle-erd
Version:
Entity-relationship diagram (ERD) generator for Drizzle.
178 lines (170 loc) • 5.69 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
generateErd: () => generateErd
});
module.exports = __toCommonJS(src_exports);
// src/utils/logger.ts
var Logger = class {
logStyle;
constructor(logStyle) {
this.logStyle = logStyle ?? "Default";
}
setLogStyle(logStyle) {
this.logStyle = logStyle;
}
createOutput(message, data) {
const output = [`[drizzle-erd]: ${message}`];
if (!data) return output;
if (data instanceof Error) {
output.push(data);
}
try {
output.push(JSON.stringify(data, null, 2));
} catch (_) {
output.push(data);
}
return output;
}
debug(message, data) {
if (this.logStyle === "Verbose") {
const output = this.createOutput(message, data);
console.debug(...output);
}
}
log(message, data) {
if (this.logStyle !== "Silent") {
const output = this.createOutput(message, data);
console.debug(...output);
}
}
error(message, data) {
if (this.logStyle !== "Silent") {
const output = this.createOutput(message, data);
console.error(...output);
}
}
};
var logger = new Logger("Default");
// src/infer.ts
var import_util = __toESM(require("util"), 1);
// src/utils/assert.ts
var AssertionError = class _AssertionError extends Error {
constructor(message) {
super(message);
if (Error.captureStackTrace) {
Error.captureStackTrace(this, _AssertionError);
} else {
this.stack = new Error(message).stack;
}
this.name = "AssertionError";
}
};
function assert(condition, message) {
if (!condition) {
throw new AssertionError(message);
}
}
// src/infer.ts
var onlyOne = (value, array) => array.filter((v) => v === value).length === 1;
var inferSchemaVariant = (schema) => {
const objectDump = import_util.default.inspect(schema, { depth: Infinity, getters: true });
const containsPgTable = objectDump.includes("PgTable");
const containsMySqlTable = objectDump.includes("MySqlTable");
const containsSQLiteTable = objectDump.includes("SQLiteTable");
const containsResults = [
containsPgTable,
containsMySqlTable,
containsSQLiteTable
];
assert(
containsResults.some((v) => !!v),
"Could not find any tables with a supported type (PG / MySQL / SQLite)"
);
assert(
onlyOne(true, containsResults),
"Seems to contain multiple table types (PG / MySQL / SQLite)"
);
if (containsPgTable) return "Postgres";
if (containsMySqlTable) return "MySQL";
if (containsSQLiteTable) return "SQLite";
throw new Error("Unable to determine schema type (PG / MySQL / SQLite)");
};
// src/dbml.ts
var import_drizzle_dbml_generator = require("@rorz/drizzle-dbml-generator");
var generateDbml = (schema, variant, relationMethod) => {
let relational = false;
if (relationMethod === "Explicit") relational = true;
switch (variant) {
case "Postgres":
return (0, import_drizzle_dbml_generator.pgGenerate)({ schema, relational });
case "MySQL":
return (0, import_drizzle_dbml_generator.mysqlGenerate)({ schema, relational });
case "SQLite":
return (0, import_drizzle_dbml_generator.sqliteGenerate)({ schema, relational });
}
};
// src/svg.ts
var import_dbml_renderer = require("@rorz/dbml-renderer");
var generateSvg = (dbml) => {
const svg = (0, import_dbml_renderer.run)(dbml, "svg");
return svg;
};
// src/generate.ts
var generateErd = async ({
schema,
relationMethod = "ForeignKey",
logStyle = "Default"
}) => {
logger.setLogStyle(logStyle);
try {
const schemaVariant = inferSchemaVariant(schema);
logger.debug("\u26AA\uFE0F Generating DBML");
const dbml = generateDbml(schema, schemaVariant, relationMethod);
logger.debug("\u{1F7E2} Generated DBML");
logger.debug("\u26AA\uFE0F Generating SVG");
const svg = generateSvg(dbml);
logger.debug("\u{1F7E2} Generated SVG");
logger.debug("\u2705 ERD generated successfully");
return { dbml, svg };
} catch (error) {
logger.error(
"\u{1F534} Generating ERD failed with error:",
error instanceof Error ? error : { error: "UNKNOWN" }
);
throw error;
}
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
generateErd
});
//# sourceMappingURL=index.cjs.map