UNPKG

drizzle-erd

Version:

Entity-relationship diagram (ERD) generator for Drizzle.

178 lines (170 loc) 5.69 kB
"use strict"; 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