everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
75 lines (73 loc) • 2.63 kB
JavaScript
import { existsSync, readFileSync } from "node:fs";
import { dirname, join } from "node:path";
//#region src/db.ts
const DEFAULT_MIGRATION_JOURNAL = {
schema: "drizzle",
table: "__drizzle_migrations"
};
const PER_PLUGIN_ISOLATION = false;
function normalizeSlug(name) {
return (name.split("/").pop() ?? name).replace(/^@/, "").replace(/[^a-zA-Z0-9_-]/g, "_").replace(/-plugin$/i, "").replace(/-/g, "_").toLowerCase();
}
function getMigrationSlug(dir) {
if (!dir) return normalizeSlug(process.env.npm_package_name ?? "unknown");
let current = dir;
for (let i = 0; i < 10; i++) {
const pkgPath = join(current, "package.json");
if (existsSync(pkgPath)) try {
return normalizeSlug(JSON.parse(readFileSync(pkgPath, "utf-8")).name ?? current);
} catch {
return normalizeSlug(current);
}
const parent = dirname(current);
if (parent === current) break;
current = parent;
}
return normalizeSlug(dir);
}
function getMigrationStorage(slug, options) {
const s = normalizeSlug(slug ?? getMigrationSlug());
if (options?.isolated ?? PER_PLUGIN_ISOLATION) return {
schema: DEFAULT_MIGRATION_JOURNAL.schema,
table: `__drizzle_migrations_${s}`,
slug: s
};
return {
schema: DEFAULT_MIGRATION_JOURNAL.schema,
table: DEFAULT_MIGRATION_JOURNAL.table,
slug: s
};
}
/**
* Format a JavaScript string array as a PostgreSQL text array literal for use
* with Drizzle's `sql` tag. Example return:
* `'{"h1","h2"}'::text[]`
*
* Usage: sql`WHERE col = ANY(${toSqlArray(values)})`
*
* Drizzle's default parameter binding does not handle array types correctly
* with the pg driver (it emits `ANY(($1))` with a single string, which
* Postgres rejects as a malformed array literal).
*/
function toSqlArray(arr) {
if (arr.length === 0) return `'{}'::text[]`;
return `'{${arr.map((v) => v.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")).map((v) => `"${v}"`).join(",")}}'::text[]`;
}
function pluginMigrationSlug(key) {
return normalizeSlug(key);
}
function getDatabaseUrlSecretName(slug) {
return `${slug.toUpperCase().replace(/-/g, "_")}_DATABASE_URL`;
}
function extractExpectedTables(migrations) {
const tables = /* @__PURE__ */ new Set();
const re = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:"([^"]+)"\.)?"([^"]+)"/gi;
for (const migration of migrations) for (const stmt of migration.sql) for (const match of stmt.matchAll(re)) {
const tableName = match[2];
if (tableName) tables.add(tableName);
}
return [...tables];
}
//#endregion
export { extractExpectedTables, getDatabaseUrlSecretName, getMigrationSlug, getMigrationStorage, pluginMigrationSlug, toSqlArray };
//# sourceMappingURL=db.mjs.map