@take-out/postgres 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/cli.cjs +3 -0
- package/dist/cjs/build.cjs +26 -0
- package/dist/cjs/build.js +21 -0
- package/dist/cjs/build.js.map +6 -0
- package/dist/cjs/build.native.js +29 -0
- package/dist/cjs/build.native.js.map +1 -0
- package/dist/cjs/cli.cjs +156 -0
- package/dist/cjs/cli.js +128 -0
- package/dist/cjs/cli.js.map +6 -0
- package/dist/cjs/cli.native.js +164 -0
- package/dist/cjs/cli.native.js.map +1 -0
- package/dist/cjs/createServerHelpers.cjs +37 -0
- package/dist/cjs/createServerHelpers.js +28 -0
- package/dist/cjs/createServerHelpers.js.map +6 -0
- package/dist/cjs/createServerHelpers.native.js +43 -0
- package/dist/cjs/createServerHelpers.native.js.map +1 -0
- package/dist/cjs/helpers/chunkedQuery.cjs +60 -0
- package/dist/cjs/helpers/chunkedQuery.js +51 -0
- package/dist/cjs/helpers/chunkedQuery.js.map +6 -0
- package/dist/cjs/helpers/chunkedQuery.native.js +73 -0
- package/dist/cjs/helpers/chunkedQuery.native.js.map +1 -0
- package/dist/cjs/helpers/getDBClient.cjs +172 -0
- package/dist/cjs/helpers/getDBClient.js +179 -0
- package/dist/cjs/helpers/getDBClient.js.map +6 -0
- package/dist/cjs/helpers/getDBClient.native.js +189 -0
- package/dist/cjs/helpers/getDBClient.native.js.map +1 -0
- package/dist/cjs/index.cjs +59 -0
- package/dist/cjs/index.js +45 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/index.native.js +64 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/migrate.cjs +117 -0
- package/dist/cjs/migrate.js +106 -0
- package/dist/cjs/migrate.js.map +6 -0
- package/dist/cjs/migrate.native.js +185 -0
- package/dist/cjs/migrate.native.js.map +1 -0
- package/dist/cjs/scripts/build-migrations.cjs +81 -0
- package/dist/cjs/scripts/build-migrations.js +69 -0
- package/dist/cjs/scripts/build-migrations.js.map +6 -0
- package/dist/cjs/scripts/build-migrations.native.js +86 -0
- package/dist/cjs/scripts/build-migrations.native.js.map +1 -0
- package/dist/cjs/scripts/drizzle-migrations-sync.cjs +111 -0
- package/dist/cjs/scripts/drizzle-migrations-sync.js +101 -0
- package/dist/cjs/scripts/drizzle-migrations-sync.js.map +6 -0
- package/dist/cjs/scripts/drizzle-migrations-sync.native.js +209 -0
- package/dist/cjs/scripts/drizzle-migrations-sync.native.js.map +1 -0
- package/dist/cjs/scripts/migration-add.cjs +53 -0
- package/dist/cjs/scripts/migration-add.js +40 -0
- package/dist/cjs/scripts/migration-add.js.map +6 -0
- package/dist/cjs/scripts/migration-add.native.js +72 -0
- package/dist/cjs/scripts/migration-add.native.js.map +1 -0
- package/dist/cjs/scripts/pg_dump.cjs +49 -0
- package/dist/cjs/scripts/pg_dump.js +36 -0
- package/dist/cjs/scripts/pg_dump.js.map +6 -0
- package/dist/cjs/scripts/pg_dump.native.js +55 -0
- package/dist/cjs/scripts/pg_dump.native.js.map +1 -0
- package/dist/cjs/scripts/psql.cjs +50 -0
- package/dist/cjs/scripts/psql.js +37 -0
- package/dist/cjs/scripts/psql.js.map +6 -0
- package/dist/cjs/scripts/psql.native.js +56 -0
- package/dist/cjs/scripts/psql.native.js.map +1 -0
- package/dist/cjs/sql.cjs +40 -0
- package/dist/cjs/sql.js +35 -0
- package/dist/cjs/sql.js.map +6 -0
- package/dist/cjs/sql.native.js +49 -0
- package/dist/cjs/sql.native.js.map +1 -0
- package/dist/esm/build.js +5 -0
- package/dist/esm/build.js.map +6 -0
- package/dist/esm/build.mjs +3 -0
- package/dist/esm/build.mjs.map +1 -0
- package/dist/esm/build.native.js +3 -0
- package/dist/esm/build.native.js.map +1 -0
- package/dist/esm/cli.js +134 -0
- package/dist/esm/cli.js.map +6 -0
- package/dist/esm/cli.mjs +157 -0
- package/dist/esm/cli.mjs.map +1 -0
- package/dist/esm/cli.native.js +162 -0
- package/dist/esm/cli.native.js.map +1 -0
- package/dist/esm/createServerHelpers.js +13 -0
- package/dist/esm/createServerHelpers.js.map +6 -0
- package/dist/esm/createServerHelpers.mjs +14 -0
- package/dist/esm/createServerHelpers.mjs.map +1 -0
- package/dist/esm/createServerHelpers.native.js +17 -0
- package/dist/esm/createServerHelpers.native.js.map +1 -0
- package/dist/esm/helpers/chunkedQuery.js +35 -0
- package/dist/esm/helpers/chunkedQuery.js.map +6 -0
- package/dist/esm/helpers/chunkedQuery.mjs +36 -0
- package/dist/esm/helpers/chunkedQuery.mjs.map +1 -0
- package/dist/esm/helpers/chunkedQuery.native.js +46 -0
- package/dist/esm/helpers/chunkedQuery.native.js.map +1 -0
- package/dist/esm/helpers/getDBClient.js +155 -0
- package/dist/esm/helpers/getDBClient.js.map +6 -0
- package/dist/esm/helpers/getDBClient.mjs +136 -0
- package/dist/esm/helpers/getDBClient.mjs.map +1 -0
- package/dist/esm/helpers/getDBClient.native.js +150 -0
- package/dist/esm/helpers/getDBClient.native.js.map +1 -0
- package/dist/esm/index.js +29 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/index.mjs +18 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +20 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/migrate.js +91 -0
- package/dist/esm/migrate.js.map +6 -0
- package/dist/esm/migrate.mjs +94 -0
- package/dist/esm/migrate.mjs.map +1 -0
- package/dist/esm/migrate.native.js +159 -0
- package/dist/esm/migrate.native.js.map +1 -0
- package/dist/esm/scripts/build-migrations.js +46 -0
- package/dist/esm/scripts/build-migrations.js.map +6 -0
- package/dist/esm/scripts/build-migrations.mjs +47 -0
- package/dist/esm/scripts/build-migrations.mjs.map +1 -0
- package/dist/esm/scripts/build-migrations.native.js +49 -0
- package/dist/esm/scripts/build-migrations.native.js.map +1 -0
- package/dist/esm/scripts/drizzle-migrations-sync.js +87 -0
- package/dist/esm/scripts/drizzle-migrations-sync.js.map +6 -0
- package/dist/esm/scripts/drizzle-migrations-sync.mjs +88 -0
- package/dist/esm/scripts/drizzle-migrations-sync.mjs.map +1 -0
- package/dist/esm/scripts/drizzle-migrations-sync.native.js +183 -0
- package/dist/esm/scripts/drizzle-migrations-sync.native.js.map +1 -0
- package/dist/esm/scripts/migration-add.js +25 -0
- package/dist/esm/scripts/migration-add.js.map +6 -0
- package/dist/esm/scripts/migration-add.mjs +30 -0
- package/dist/esm/scripts/migration-add.mjs.map +1 -0
- package/dist/esm/scripts/migration-add.native.js +46 -0
- package/dist/esm/scripts/migration-add.native.js.map +1 -0
- package/dist/esm/scripts/pg_dump.js +20 -0
- package/dist/esm/scripts/pg_dump.js.map +6 -0
- package/dist/esm/scripts/pg_dump.mjs +26 -0
- package/dist/esm/scripts/pg_dump.mjs.map +1 -0
- package/dist/esm/scripts/pg_dump.native.js +29 -0
- package/dist/esm/scripts/pg_dump.native.js.map +1 -0
- package/dist/esm/scripts/psql.js +21 -0
- package/dist/esm/scripts/psql.js.map +6 -0
- package/dist/esm/scripts/psql.mjs +27 -0
- package/dist/esm/scripts/psql.mjs.map +1 -0
- package/dist/esm/scripts/psql.native.js +30 -0
- package/dist/esm/scripts/psql.native.js.map +1 -0
- package/dist/esm/sql.js +19 -0
- package/dist/esm/sql.js.map +6 -0
- package/dist/esm/sql.mjs +15 -0
- package/dist/esm/sql.mjs.map +1 -0
- package/dist/esm/sql.native.js +21 -0
- package/dist/esm/sql.native.js.map +1 -0
- package/package.json +67 -0
- package/src/build.ts +2 -0
- package/src/cli.ts +153 -0
- package/src/createServerHelpers.ts +20 -0
- package/src/helpers/chunkedQuery.ts +91 -0
- package/src/helpers/getDBClient.ts +264 -0
- package/src/index.ts +36 -0
- package/src/migrate.ts +192 -0
- package/src/scripts/build-migrations.ts +66 -0
- package/src/scripts/drizzle-migrations-sync.ts +179 -0
- package/src/scripts/migration-add.ts +54 -0
- package/src/scripts/pg_dump.ts +46 -0
- package/src/scripts/psql.ts +51 -0
- package/src/sql.ts +36 -0
- package/types/build.d.ts +2 -0
- package/types/build.d.ts.map +1 -0
- package/types/cli.d.ts +3 -0
- package/types/cli.d.ts.map +1 -0
- package/types/createServerHelpers.d.ts +9 -0
- package/types/createServerHelpers.d.ts.map +1 -0
- package/types/helpers/chunkedQuery.d.ts +17 -0
- package/types/helpers/chunkedQuery.d.ts.map +1 -0
- package/types/helpers/getDBClient.d.ts +11 -0
- package/types/helpers/getDBClient.d.ts.map +1 -0
- package/types/index.d.ts +10 -0
- package/types/index.d.ts.map +1 -0
- package/types/migrate.d.ts +25 -0
- package/types/migrate.d.ts.map +1 -0
- package/types/scripts/build-migrations.d.ts +8 -0
- package/types/scripts/build-migrations.d.ts.map +1 -0
- package/types/scripts/drizzle-migrations-sync.d.ts +11 -0
- package/types/scripts/drizzle-migrations-sync.d.ts.map +1 -0
- package/types/scripts/migration-add.d.ts +6 -0
- package/types/scripts/migration-add.d.ts.map +1 -0
- package/types/scripts/pg_dump.d.ts +11 -0
- package/types/scripts/pg_dump.d.ts.map +1 -0
- package/types/scripts/psql.d.ts +11 -0
- package/types/scripts/psql.d.ts.map +1 -0
- package/types/sql.d.ts +9 -0
- package/types/sql.d.ts.map +1 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/migrate.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["migrations"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { getDBClient } from "./helpers/getDBClient.mjs";
|
|
3
|
+
const isServerless = !!(process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.AWS_LAMBDA_RUNTIME_API || process.env.LAMBDA_RUNTIME_DIR || process.env.IS_SERVERLESS);
|
|
4
|
+
async function migrate(options) {
|
|
5
|
+
const {
|
|
6
|
+
connectionString,
|
|
7
|
+
migrationsGlob,
|
|
8
|
+
createDatabases = [],
|
|
9
|
+
onMigrationComplete,
|
|
10
|
+
gitSha,
|
|
11
|
+
cvrDb,
|
|
12
|
+
changeDb
|
|
13
|
+
} = options;
|
|
14
|
+
console.info(`Running migrations${gitSha ? ` for git version: ${gitSha}` : ""}`);
|
|
15
|
+
const client = await getDBClient({
|
|
16
|
+
connectionString
|
|
17
|
+
}),
|
|
18
|
+
hasDB = async name => {
|
|
19
|
+
const result = !!(await client.query(`
|
|
20
|
+
SELECT 1 FROM pg_database WHERE datname = '${name}'
|
|
21
|
+
`)).rows.length;
|
|
22
|
+
return console.info(result ? `${name} db exists` : `creating ${name} db`), result;
|
|
23
|
+
};
|
|
24
|
+
if (cvrDb || changeDb) {
|
|
25
|
+
if (!cvrDb) throw new Error("Missing cvrDb");
|
|
26
|
+
const zeroDBNames = [basename(cvrDb || ""), basename(changeDb || "")].filter(Boolean);
|
|
27
|
+
for (const name of zeroDBNames) (await hasDB(name)) || (await client.query(`CREATE DATABASE ${name};`));
|
|
28
|
+
}
|
|
29
|
+
for (const dbUrl of createDatabases) {
|
|
30
|
+
const name = basename(dbUrl);
|
|
31
|
+
(await hasDB(name)) || (await client.query(`CREATE DATABASE ${name};`));
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
await client.query("BEGIN"), await client.query(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
36
|
+
id SERIAL PRIMARY KEY,
|
|
37
|
+
name VARCHAR(255) NOT NULL,
|
|
38
|
+
run_on TIMESTAMP NOT NULL DEFAULT NOW()
|
|
39
|
+
)
|
|
40
|
+
`);
|
|
41
|
+
const appliedMigrations = await client.query("SELECT name FROM migrations"),
|
|
42
|
+
appliedMigrationNames = new Set(appliedMigrations.rows.map(row => row.name)),
|
|
43
|
+
tsMigrationsSorted = Object.entries(migrationsGlob).sort(([a], [b]) => a.localeCompare(b)).map(([file, run]) => ({
|
|
44
|
+
name: basename(file).replace(".ts", ""),
|
|
45
|
+
run
|
|
46
|
+
})).filter(({
|
|
47
|
+
name
|
|
48
|
+
}) => /^[\d]+/.test(name));
|
|
49
|
+
console.info(`Found ${tsMigrationsSorted.length} TypeScript migrations`);
|
|
50
|
+
const migrations = [...(await Promise.all(tsMigrationsSorted.map(async ({
|
|
51
|
+
name,
|
|
52
|
+
run
|
|
53
|
+
}) => {
|
|
54
|
+
if (appliedMigrationNames.has(name)) return console.info(`TypeScript migration applied already: ${name}`), null;
|
|
55
|
+
try {
|
|
56
|
+
return {
|
|
57
|
+
...(await run()),
|
|
58
|
+
name
|
|
59
|
+
};
|
|
60
|
+
} catch (error) {
|
|
61
|
+
throw console.error(`Failed to load TypeScript migration ${name}:`, error), error;
|
|
62
|
+
}
|
|
63
|
+
})).then(migrations2 => migrations2.filter(Boolean)))].sort((a, b) => a.name.localeCompare(b.name));
|
|
64
|
+
if (!migrations.length) console.info("No migrations to apply!"), await client.query("COMMIT");else {
|
|
65
|
+
for (const migration of migrations) console.info(`Migrating: ${migration.name}`), migration.up && (console.info(`Applying migration: ${migration.name}`), await migration.up(client)), await client.query("INSERT INTO migrations (name) VALUES ($1)", [migration.name]), console.info(`Successfully applied migration: ${migration.name}`);
|
|
66
|
+
await client.query("COMMIT"), console.info("Successfully committed all migrations");
|
|
67
|
+
}
|
|
68
|
+
} catch (e) {
|
|
69
|
+
console.error("Migration failed, rolling back:", e), await client.query("ROLLBACK"), console.info("Releasing client connection...");
|
|
70
|
+
try {
|
|
71
|
+
client.release(!1);
|
|
72
|
+
} catch (releaseErr) {
|
|
73
|
+
console.error("Error releasing connection after rollback:", releaseErr);
|
|
74
|
+
}
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
onMigrationComplete && (await onMigrationComplete()), console.info("Releasing client connection...");
|
|
78
|
+
try {
|
|
79
|
+
client.release(!1);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
console.error("Error releasing connection gracefully, trying to destroy:", err);
|
|
82
|
+
try {
|
|
83
|
+
client.release(!0);
|
|
84
|
+
} catch (destroyErr) {
|
|
85
|
+
console.error("Error destroying connection:", destroyErr);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
console.info("\u{1F64C} Done migrating"), exitProcess();
|
|
89
|
+
}
|
|
90
|
+
function exitProcess() {
|
|
91
|
+
typeof process > "u" || isServerless || process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
export { migrate };
|
|
94
|
+
//# sourceMappingURL=migrate.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["basename","getDBClient","isServerless","process","env","AWS_LAMBDA_FUNCTION_NAME","AWS_LAMBDA_RUNTIME_API","LAMBDA_RUNTIME_DIR","IS_SERVERLESS","migrate","options","connectionString","migrationsGlob","createDatabases","onMigrationComplete","gitSha","cvrDb","changeDb","console","info","client","hasDB","name","result","query","rows","length","Error","zeroDBNames","filter","Boolean","dbUrl","appliedMigrations","appliedMigrationNames","Set","map","row","tsMigrationsSorted","Object","entries","sort","a","b","localeCompare","file","run","replace","test","migrations","Promise","all","has","error","then","migrations2","migration","up","e","release","releaseErr","err","destroyErr","exitProcess","exit"],"sources":["../../src/migrate.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { basename } from "path";
|
|
2
|
+
import { getDBClient } from "./helpers/getDBClient.native.js";
|
|
3
|
+
var isServerless = !!(process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.AWS_LAMBDA_RUNTIME_API || process.env.LAMBDA_RUNTIME_DIR || process.env.IS_SERVERLESS);
|
|
4
|
+
async function migrate(options) {
|
|
5
|
+
var {
|
|
6
|
+
connectionString,
|
|
7
|
+
migrationsGlob,
|
|
8
|
+
createDatabases = [],
|
|
9
|
+
onMigrationComplete,
|
|
10
|
+
gitSha,
|
|
11
|
+
cvrDb,
|
|
12
|
+
changeDb
|
|
13
|
+
} = options;
|
|
14
|
+
console.info(`Running migrations${gitSha ? ` for git version: ${gitSha}` : ""}`);
|
|
15
|
+
var client = await getDBClient({
|
|
16
|
+
connectionString
|
|
17
|
+
}),
|
|
18
|
+
hasDB = async function (name2) {
|
|
19
|
+
var result = !!(await client.query(`
|
|
20
|
+
SELECT 1 FROM pg_database WHERE datname = '${name2}'
|
|
21
|
+
`)).rows.length;
|
|
22
|
+
return console.info(result ? `${name2} db exists` : `creating ${name2} db`), result;
|
|
23
|
+
};
|
|
24
|
+
if (cvrDb || changeDb) {
|
|
25
|
+
if (!cvrDb) throw new Error("Missing cvrDb");
|
|
26
|
+
var zeroDBNames = [basename(cvrDb || ""), basename(changeDb || "")].filter(Boolean),
|
|
27
|
+
_iteratorNormalCompletion = !0,
|
|
28
|
+
_didIteratorError = !1,
|
|
29
|
+
_iteratorError = void 0;
|
|
30
|
+
try {
|
|
31
|
+
for (var _iterator = zeroDBNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
32
|
+
var name = _step.value;
|
|
33
|
+
(await hasDB(name)) || (await client.query(`CREATE DATABASE ${name};`));
|
|
34
|
+
}
|
|
35
|
+
} catch (err) {
|
|
36
|
+
_didIteratorError = !0, _iteratorError = err;
|
|
37
|
+
} finally {
|
|
38
|
+
try {
|
|
39
|
+
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
40
|
+
} finally {
|
|
41
|
+
if (_didIteratorError) throw _iteratorError;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
var _iteratorNormalCompletion1 = !0,
|
|
46
|
+
_didIteratorError1 = !1,
|
|
47
|
+
_iteratorError1 = void 0;
|
|
48
|
+
try {
|
|
49
|
+
for (var _iterator1 = createDatabases[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
|
|
50
|
+
var dbUrl = _step1.value,
|
|
51
|
+
name1 = basename(dbUrl);
|
|
52
|
+
(await hasDB(name1)) || (await client.query(`CREATE DATABASE ${name1};`));
|
|
53
|
+
}
|
|
54
|
+
} catch (err) {
|
|
55
|
+
_didIteratorError1 = !0, _iteratorError1 = err;
|
|
56
|
+
} finally {
|
|
57
|
+
try {
|
|
58
|
+
!_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
|
|
59
|
+
} finally {
|
|
60
|
+
if (_didIteratorError1) throw _iteratorError1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
await client.query("BEGIN"), await client.query(`
|
|
65
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
66
|
+
id SERIAL PRIMARY KEY,
|
|
67
|
+
name VARCHAR(255) NOT NULL,
|
|
68
|
+
run_on TIMESTAMP NOT NULL DEFAULT NOW()
|
|
69
|
+
)
|
|
70
|
+
`);
|
|
71
|
+
var appliedMigrations = await client.query("SELECT name FROM migrations"),
|
|
72
|
+
appliedMigrationNames = new Set(appliedMigrations.rows.map(function (row) {
|
|
73
|
+
return row.name;
|
|
74
|
+
})),
|
|
75
|
+
tsMigrationsSorted = Object.entries(migrationsGlob).sort(function (param, param1) {
|
|
76
|
+
var [a] = param,
|
|
77
|
+
[b] = param1;
|
|
78
|
+
return a.localeCompare(b);
|
|
79
|
+
}).map(function (param) {
|
|
80
|
+
var [file, run] = param;
|
|
81
|
+
return {
|
|
82
|
+
name: basename(file).replace(".ts", ""),
|
|
83
|
+
run
|
|
84
|
+
};
|
|
85
|
+
}).filter(function (param) {
|
|
86
|
+
var {
|
|
87
|
+
name: name2
|
|
88
|
+
} = param;
|
|
89
|
+
return /^[\d]+/.test(name2);
|
|
90
|
+
});
|
|
91
|
+
console.info(`Found ${tsMigrationsSorted.length} TypeScript migrations`);
|
|
92
|
+
var tsMigrations = await Promise.all(tsMigrationsSorted.map(async function (param) {
|
|
93
|
+
var {
|
|
94
|
+
name: name2,
|
|
95
|
+
run
|
|
96
|
+
} = param;
|
|
97
|
+
if (appliedMigrationNames.has(name2)) return console.info(`TypeScript migration applied already: ${name2}`), null;
|
|
98
|
+
try {
|
|
99
|
+
var migration2 = await run();
|
|
100
|
+
return {
|
|
101
|
+
...migration2,
|
|
102
|
+
name: name2
|
|
103
|
+
};
|
|
104
|
+
} catch (error) {
|
|
105
|
+
throw console.error(`Failed to load TypeScript migration ${name2}:`, error), error;
|
|
106
|
+
}
|
|
107
|
+
})).then(function (migrations2) {
|
|
108
|
+
return migrations2.filter(Boolean);
|
|
109
|
+
}),
|
|
110
|
+
migrations = [...tsMigrations].sort(function (a, b) {
|
|
111
|
+
return a.name.localeCompare(b.name);
|
|
112
|
+
});
|
|
113
|
+
if (!migrations.length) console.info("No migrations to apply!"), await client.query("COMMIT");else {
|
|
114
|
+
var _iteratorNormalCompletion2 = !0,
|
|
115
|
+
_didIteratorError2 = !1,
|
|
116
|
+
_iteratorError2 = void 0;
|
|
117
|
+
try {
|
|
118
|
+
for (var _iterator2 = migrations[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
|
|
119
|
+
var migration = _step2.value;
|
|
120
|
+
console.info(`Migrating: ${migration.name}`), migration.up && (console.info(`Applying migration: ${migration.name}`), await migration.up(client)), await client.query("INSERT INTO migrations (name) VALUES ($1)", [migration.name]), console.info(`Successfully applied migration: ${migration.name}`);
|
|
121
|
+
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
_didIteratorError2 = !0, _iteratorError2 = err;
|
|
124
|
+
} finally {
|
|
125
|
+
try {
|
|
126
|
+
!_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
|
|
127
|
+
} finally {
|
|
128
|
+
if (_didIteratorError2) throw _iteratorError2;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await client.query("COMMIT"), console.info("Successfully committed all migrations");
|
|
132
|
+
}
|
|
133
|
+
} catch (e) {
|
|
134
|
+
console.error("Migration failed, rolling back:", e), await client.query("ROLLBACK"), console.info("Releasing client connection...");
|
|
135
|
+
try {
|
|
136
|
+
client.release(!1);
|
|
137
|
+
} catch (releaseErr) {
|
|
138
|
+
console.error("Error releasing connection after rollback:", releaseErr);
|
|
139
|
+
}
|
|
140
|
+
throw e;
|
|
141
|
+
}
|
|
142
|
+
onMigrationComplete && (await onMigrationComplete()), console.info("Releasing client connection...");
|
|
143
|
+
try {
|
|
144
|
+
client.release(!1);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
console.error("Error releasing connection gracefully, trying to destroy:", err);
|
|
147
|
+
try {
|
|
148
|
+
client.release(!0);
|
|
149
|
+
} catch (destroyErr) {
|
|
150
|
+
console.error("Error destroying connection:", destroyErr);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
console.info("\u{1F64C} Done migrating"), exitProcess();
|
|
154
|
+
}
|
|
155
|
+
function exitProcess() {
|
|
156
|
+
typeof process > "u" || isServerless || process.exit(0);
|
|
157
|
+
}
|
|
158
|
+
export { migrate };
|
|
159
|
+
//# sourceMappingURL=migrate.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["basename","getDBClient","isServerless","process","env","AWS_LAMBDA_FUNCTION_NAME","AWS_LAMBDA_RUNTIME_API","LAMBDA_RUNTIME_DIR","IS_SERVERLESS","migrate","options","connectionString","migrationsGlob","createDatabases","onMigrationComplete","gitSha","cvrDb","changeDb","console","info","client","hasDB","name2","result","query","rows","length","Error","zeroDBNames","filter","Boolean","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","name","value","err","return","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","dbUrl","name1","appliedMigrations","appliedMigrationNames","Set","map","row","tsMigrationsSorted","Object","entries","sort","param","param1","a","b","localeCompare","file","run","replace","test","tsMigrations","Promise","all","has","migration2"],"sources":["../../src/migrate.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
async function buildMigrations(options) {
|
|
4
|
+
const {
|
|
5
|
+
migrationsDir,
|
|
6
|
+
outFile = "migrate-dist.js",
|
|
7
|
+
target = "node22",
|
|
8
|
+
aliases = {}
|
|
9
|
+
} = options, { build } = await import("vite"), migrateFile = path.join(migrationsDir, "..", "migrate.ts"), result = await build({
|
|
10
|
+
configFile: !1,
|
|
11
|
+
resolve: {
|
|
12
|
+
alias: aliases
|
|
13
|
+
},
|
|
14
|
+
define: {
|
|
15
|
+
"process.env.GIT_SHA": JSON.stringify(
|
|
16
|
+
execSync("git rev-parse HEAD").toString().trim()
|
|
17
|
+
)
|
|
18
|
+
},
|
|
19
|
+
build: {
|
|
20
|
+
outDir: path.dirname(migrateFile),
|
|
21
|
+
target,
|
|
22
|
+
minify: !1,
|
|
23
|
+
emptyOutDir: !1,
|
|
24
|
+
copyPublicDir: !1,
|
|
25
|
+
lib: {
|
|
26
|
+
name: "migrate",
|
|
27
|
+
formats: ["es"],
|
|
28
|
+
entry: migrateFile
|
|
29
|
+
},
|
|
30
|
+
rollupOptions: {
|
|
31
|
+
external: (id) => id.startsWith("node:") || id === "pg" ? !0 : id.startsWith("/") ? !1 : !id.startsWith(".") && !id.startsWith("/"),
|
|
32
|
+
output: {
|
|
33
|
+
format: "es",
|
|
34
|
+
inlineDynamicImports: !0,
|
|
35
|
+
exports: "named",
|
|
36
|
+
entryFileNames: outFile
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return console.info(`\u2713 Built migration bundle: ${outFile}`), result;
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
buildMigrations
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=build-migrations.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/scripts/build-migrations.ts"],
|
|
4
|
+
"mappings": "AAAA,SAAS,gBAAgB;AACzB,OAAO,UAAU;AASjB,eAAsB,gBAAgB,SAAiC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACb,IAAI,SAEE,EAAE,MAAM,IAAI,MAAM,OAAO,MAAM,GAE/B,cAAc,KAAK,KAAK,eAAe,MAAM,YAAY,GAEzD,SAAS,MAAM,MAAM;AAAA,IACzB,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,MACN,uBAAuB,KAAK;AAAA,QAC1B,SAAS,oBAAoB,EAAE,SAAS,EAAE,KAAK;AAAA,MACjD;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,KAAK,QAAQ,WAAW;AAAA,MAChC;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,eAAe;AAAA,MACf,KAAK;AAAA,QACH,MAAM;AAAA,QACN,SAAS,CAAC,IAAI;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,eAAe;AAAA,QACb,UAAU,CAAC,OAEL,GAAG,WAAW,OAAO,KAAK,OAAO,OAAa,KAE9C,GAAG,WAAW,GAAG,IAAU,KAE3B,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,WAAW,GAAG;AAAA,QAG/C,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,sBAAsB;AAAA,UACtB,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,iBAAQ,KAAK,kCAA6B,OAAO,EAAE,GAC5C;AACT;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
async function buildMigrations(options) {
|
|
4
|
+
const {
|
|
5
|
+
migrationsDir,
|
|
6
|
+
outFile = "migrate-dist.js",
|
|
7
|
+
target = "node22",
|
|
8
|
+
aliases = {}
|
|
9
|
+
} = options,
|
|
10
|
+
{
|
|
11
|
+
build
|
|
12
|
+
} = await import("vite"),
|
|
13
|
+
migrateFile = path.join(migrationsDir, "..", "migrate.ts"),
|
|
14
|
+
result = await build({
|
|
15
|
+
configFile: !1,
|
|
16
|
+
resolve: {
|
|
17
|
+
alias: aliases
|
|
18
|
+
},
|
|
19
|
+
define: {
|
|
20
|
+
"process.env.GIT_SHA": JSON.stringify(execSync("git rev-parse HEAD").toString().trim())
|
|
21
|
+
},
|
|
22
|
+
build: {
|
|
23
|
+
outDir: path.dirname(migrateFile),
|
|
24
|
+
target,
|
|
25
|
+
minify: !1,
|
|
26
|
+
emptyOutDir: !1,
|
|
27
|
+
copyPublicDir: !1,
|
|
28
|
+
lib: {
|
|
29
|
+
name: "migrate",
|
|
30
|
+
formats: ["es"],
|
|
31
|
+
entry: migrateFile
|
|
32
|
+
},
|
|
33
|
+
rollupOptions: {
|
|
34
|
+
external: id => id.startsWith("node:") || id === "pg" ? !0 : id.startsWith("/") ? !1 : !id.startsWith(".") && !id.startsWith("/"),
|
|
35
|
+
output: {
|
|
36
|
+
format: "es",
|
|
37
|
+
inlineDynamicImports: !0,
|
|
38
|
+
exports: "named",
|
|
39
|
+
entryFileNames: outFile
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return console.info(`\u2713 Built migration bundle: ${outFile}`), result;
|
|
45
|
+
}
|
|
46
|
+
export { buildMigrations };
|
|
47
|
+
//# sourceMappingURL=build-migrations.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execSync","path","buildMigrations","options","migrationsDir","outFile","target","aliases","build","migrateFile","join","result","configFile","resolve","alias","define","JSON","stringify","toString","trim","outDir","dirname","minify","emptyOutDir","copyPublicDir","lib","name","formats","entry","rollupOptions","external","id","startsWith","output","format","inlineDynamicImports","exports","entryFileNames","console","info"],"sources":["../../../src/scripts/build-migrations.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,QAAgB;AACzB,OAAOC,IAAA,MAAU;AASjB,eAAsBC,gBAAgBC,OAAA,EAAiC;EACrE,MAAM;MACJC,aAAA;MACAC,OAAA,GAAU;MACVC,MAAA,GAAS;MACTC,OAAA,GAAU,CAAC;IACb,IAAIJ,OAAA;IAEE;MAAEK;IAAM,IAAI,MAAM,OAAO,MAAM;IAE/BC,WAAA,GAAcR,IAAA,CAAKS,IAAA,CAAKN,aAAA,EAAe,MAAM,YAAY;IAEzDO,MAAA,GAAS,MAAMH,KAAA,CAAM;MACzBI,UAAA,EAAY;MACZC,OAAA,EAAS;QACPC,KAAA,EAAOP;MACT;MACAQ,MAAA,EAAQ;QACN,uBAAuBC,IAAA,CAAKC,SAAA,CAC1BjB,QAAA,CAAS,oBAAoB,EAAEkB,QAAA,CAAS,EAAEC,IAAA,CAAK,CACjD;MACF;MACAX,KAAA,EAAO;QACLY,MAAA,EAAQnB,IAAA,CAAKoB,OAAA,CAAQZ,WAAW;QAChCH,MAAA;QACAgB,MAAA,EAAQ;QACRC,WAAA,EAAa;QACbC,aAAA,EAAe;QACfC,GAAA,EAAK;UACHC,IAAA,EAAM;UACNC,OAAA,EAAS,CAAC,IAAI;UACdC,KAAA,EAAOnB;QACT;QACAoB,aAAA,EAAe;UACbC,QAAA,EAAWC,EAAA,IAELA,EAAA,CAAGC,UAAA,CAAW,OAAO,KAAKD,EAAA,KAAO,OAAa,KAE9CA,EAAA,CAAGC,UAAA,CAAW,GAAG,IAAU,KAE3B,CAACD,EAAA,CAAGC,UAAA,CAAW,GAAG,KAAK,CAACD,EAAA,CAAGC,UAAA,CAAW,GAAG;UAG/CC,MAAA,EAAQ;YACNC,MAAA,EAAQ;YACRC,oBAAA,EAAsB;YACtBC,OAAA,EAAS;YACTC,cAAA,EAAgBhC;UAClB;QACF;MACF;IACF,CAAC;EAED,OAAAiC,OAAA,CAAQC,IAAA,CAAK,kCAA6BlC,OAAO,EAAE,GAC5CM,MAAA;AACT","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import path from "path";
|
|
3
|
+
async function buildMigrations(options) {
|
|
4
|
+
var {
|
|
5
|
+
migrationsDir,
|
|
6
|
+
outFile = "migrate-dist.js",
|
|
7
|
+
target = "node22",
|
|
8
|
+
aliases = {}
|
|
9
|
+
} = options,
|
|
10
|
+
{
|
|
11
|
+
build
|
|
12
|
+
} = await import("vite"),
|
|
13
|
+
migrateFile = path.join(migrationsDir, "..", "migrate.ts"),
|
|
14
|
+
result = await build({
|
|
15
|
+
configFile: !1,
|
|
16
|
+
resolve: {
|
|
17
|
+
alias: aliases
|
|
18
|
+
},
|
|
19
|
+
define: {
|
|
20
|
+
"process.env.GIT_SHA": JSON.stringify(execSync("git rev-parse HEAD").toString().trim())
|
|
21
|
+
},
|
|
22
|
+
build: {
|
|
23
|
+
outDir: path.dirname(migrateFile),
|
|
24
|
+
target,
|
|
25
|
+
minify: !1,
|
|
26
|
+
emptyOutDir: !1,
|
|
27
|
+
copyPublicDir: !1,
|
|
28
|
+
lib: {
|
|
29
|
+
name: "migrate",
|
|
30
|
+
formats: ["es"],
|
|
31
|
+
entry: migrateFile
|
|
32
|
+
},
|
|
33
|
+
rollupOptions: {
|
|
34
|
+
external: function (id) {
|
|
35
|
+
return id.startsWith("node:") || id === "pg" ? !0 : id.startsWith("/") ? !1 : !id.startsWith(".") && !id.startsWith("/");
|
|
36
|
+
},
|
|
37
|
+
output: {
|
|
38
|
+
format: "es",
|
|
39
|
+
inlineDynamicImports: !0,
|
|
40
|
+
exports: "named",
|
|
41
|
+
entryFileNames: outFile
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return console.info(`\u2713 Built migration bundle: ${outFile}`), result;
|
|
47
|
+
}
|
|
48
|
+
export { buildMigrations };
|
|
49
|
+
//# sourceMappingURL=build-migrations.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execSync","path","buildMigrations","options","migrationsDir","outFile","target","aliases","build","migrateFile","join","result","configFile","resolve","alias","define","JSON","stringify","toString","trim","outDir","dirname","minify","emptyOutDir","copyPublicDir","lib","name","formats","entry","rollupOptions","external","id","startsWith","output","format","inlineDynamicImports","exports","entryFileNames","console","info"],"sources":["../../../src/scripts/build-migrations.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,QAAgB;AACzB,OAAOC,IAAA,MAAU;AASjB,eAAsBC,gBAAgBC,OAAA,EAAiC;EACrE;MAAMC,aAAA;MAAAC,OAAA;MAAAC,MAAA;MAAAC,OAAA;IAAA,IAAAJ,OAAA;IAAA;MAAAK;IAAA;IAAAC,WAAA,GAAAR,IAAA,CAAAS,IAAA,CAAAN,aAAA;IAAAO,MAAA,SAAAH,KAAA;MACJI,UAAA;MACAC,OAAA;QACAC,KAAA,EAASP;MACT;MACFQ,MAAI;QAOF,qBAAY,EAAAC,IAAA,CAAAC,SAAA,CAAAjB,QAAA,uBAAAkB,QAAA,GAAAC,IAAA;MACZ;MAASX,KACP;QACFY,MAAA,EAAAnB,IAAA,CAAAoB,OAAA,CAAAZ,WAAA;QACAH,MAAQ;QACNgB,MAAA;QAA4BC,WACjB;QACXC,aAAA;QACFC,GAAA;UACAC,IAAO;UACLC,OAAQ,GACR,KACA;UACAC,KAAA,EAAAnB;QACA;QACAoB,aAAK;UACHC,QAAM,WAAAA,CAAAC,EAAA;YACN,OAASA,EAAC,CAAAC,UAAI,aAAAD,EAAA,iBAAAA,EAAA,CAAAC,UAAA,cAAAD,EAAA,CAAAC,UAAA,UAAAD,EAAA,CAAAC,UAAA;UACd;UACFC,MAAA;YACAC,MAAA,MAAe;YACbC,oBAES;YAOTC,OAAQ;YACNC,cAAQ,EAAAhC;UAAA;QACc;MACb;IACO;EAClB,OACFiC,OAAA,CAAAC,IAAA,mCAAAlC,OAAA,KAAAM,MAAA;AAAA;AACF,SAGFT,eAAQ","ignoreList":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { readdir, writeFile, stat, rename } from "node:fs/promises";
|
|
3
|
+
import { join, basename, extname } from "node:path";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
function getMigrationNumber(filename) {
|
|
6
|
+
const match = filename.match(/^(\d+)/);
|
|
7
|
+
return match && match[1] ? Number.parseInt(match[1], 10) : null;
|
|
8
|
+
}
|
|
9
|
+
async function getHighestMigrationNumber(dir) {
|
|
10
|
+
const files = await readdir(dir);
|
|
11
|
+
let highest = -1;
|
|
12
|
+
for (const file of files) {
|
|
13
|
+
const num = getMigrationNumber(file);
|
|
14
|
+
num !== null && num > highest && (highest = num);
|
|
15
|
+
}
|
|
16
|
+
return highest;
|
|
17
|
+
}
|
|
18
|
+
async function renameNewDrizzleMigrations(migrationsPath, sqlFiles) {
|
|
19
|
+
const drizzlePattern = /^(\d{4})_[a-z]+_[a-z_]+\.sql$/, files = await readdir(migrationsPath), highestNumber = await getHighestMigrationNumber(migrationsPath), newDrizzleSqlFiles = sqlFiles.filter((file) => {
|
|
20
|
+
if (!drizzlePattern.test(file)) return !1;
|
|
21
|
+
const tsFile = file.replace(".sql", ".ts");
|
|
22
|
+
return !files.includes(tsFile);
|
|
23
|
+
});
|
|
24
|
+
if (newDrizzleSqlFiles.length === 0) return sqlFiles;
|
|
25
|
+
const migrationGroups = /* @__PURE__ */ new Map();
|
|
26
|
+
for (const file of newDrizzleSqlFiles) {
|
|
27
|
+
const num = file.substring(0, 4);
|
|
28
|
+
migrationGroups.has(num) || migrationGroups.set(num, []), migrationGroups.get(num).push(file);
|
|
29
|
+
}
|
|
30
|
+
let nextNumber = highestNumber + 1;
|
|
31
|
+
const renamedFiles = [];
|
|
32
|
+
for (const [originalNum, groupFiles] of migrationGroups)
|
|
33
|
+
if (Number.parseInt(originalNum, 10) <= highestNumber) {
|
|
34
|
+
const newNumStr = nextNumber.toString().padStart(4, "0");
|
|
35
|
+
console.info(`Renumbering new drizzle migration ${originalNum} to ${newNumStr}`);
|
|
36
|
+
for (const file of groupFiles) {
|
|
37
|
+
const newName = file.replace(/^\d{4}/, newNumStr), oldPath = join(migrationsPath, file), newPath = join(migrationsPath, newName);
|
|
38
|
+
await rename(oldPath, newPath), console.info(` Renamed ${file} -> ${newName}`), renamedFiles.push(newName);
|
|
39
|
+
}
|
|
40
|
+
const metaDir = join(migrationsPath, "meta");
|
|
41
|
+
if (existsSync(metaDir)) {
|
|
42
|
+
const metaFiles = await readdir(metaDir), snapshotFile = `${originalNum}_snapshot.json`;
|
|
43
|
+
if (metaFiles.includes(snapshotFile)) {
|
|
44
|
+
const newSnapshotName = `${newNumStr}_snapshot.json`;
|
|
45
|
+
await rename(join(metaDir, snapshotFile), join(metaDir, newSnapshotName)), console.info(` Renamed meta/${snapshotFile} -> meta/${newSnapshotName}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
nextNumber++;
|
|
49
|
+
} else
|
|
50
|
+
renamedFiles.push(...groupFiles);
|
|
51
|
+
return sqlFiles.map((file) => {
|
|
52
|
+
if (newDrizzleSqlFiles.indexOf(file) !== -1) {
|
|
53
|
+
for (const renamed of renamedFiles)
|
|
54
|
+
if (renamed.includes(file.substring(5)))
|
|
55
|
+
return renamed;
|
|
56
|
+
}
|
|
57
|
+
return file;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function syncDrizzleMigrations(options) {
|
|
61
|
+
const { migrationsDir } = options;
|
|
62
|
+
let sqlFiles = (await readdir(migrationsDir)).filter((file) => extname(file) === ".sql");
|
|
63
|
+
console.info(`Found ${sqlFiles.length} SQL files to convert to migrations.`), sqlFiles = await renameNewDrizzleMigrations(migrationsDir, sqlFiles);
|
|
64
|
+
for (const sqlFile of sqlFiles) {
|
|
65
|
+
const tsFileName = `${basename(sqlFile, ".sql")}.ts`, tsFilePath = join(migrationsDir, tsFileName);
|
|
66
|
+
if (existsSync(tsFilePath)) {
|
|
67
|
+
const sqlStat = await stat(join(migrationsDir, sqlFile));
|
|
68
|
+
if ((await stat(tsFilePath)).mtimeMs > sqlStat.mtimeMs)
|
|
69
|
+
continue;
|
|
70
|
+
console.info(`Updating ${tsFileName} as SQL file has been modified.`);
|
|
71
|
+
} else
|
|
72
|
+
console.info(`Creating ${tsFileName}`);
|
|
73
|
+
const migrationContent = `import type { PoolClient } from 'pg'
|
|
74
|
+
import sql from './${sqlFile}?raw'
|
|
75
|
+
|
|
76
|
+
export async function up(client: PoolClient) {
|
|
77
|
+
await client.query(sql)
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
await writeFile(tsFilePath, migrationContent), console.info(`Successfully created ${tsFileName}`);
|
|
81
|
+
}
|
|
82
|
+
console.info("Migration sync completed.");
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
syncDrizzleMigrations
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=drizzle-migrations-sync.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/scripts/drizzle-migrations-sync.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { readdir, writeFile, stat, rename } from "node:fs/promises";
|
|
3
|
+
import { join, basename, extname } from "node:path";
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
function getMigrationNumber(filename) {
|
|
6
|
+
const match = filename.match(/^(\d+)/);
|
|
7
|
+
return match && match[1] ? Number.parseInt(match[1], 10) : null;
|
|
8
|
+
}
|
|
9
|
+
async function getHighestMigrationNumber(dir) {
|
|
10
|
+
const files = await readdir(dir);
|
|
11
|
+
let highest = -1;
|
|
12
|
+
for (const file of files) {
|
|
13
|
+
const num = getMigrationNumber(file);
|
|
14
|
+
num !== null && num > highest && (highest = num);
|
|
15
|
+
}
|
|
16
|
+
return highest;
|
|
17
|
+
}
|
|
18
|
+
async function renameNewDrizzleMigrations(migrationsPath, sqlFiles) {
|
|
19
|
+
const drizzlePattern = /^(\d{4})_[a-z]+_[a-z_]+\.sql$/,
|
|
20
|
+
files = await readdir(migrationsPath),
|
|
21
|
+
highestNumber = await getHighestMigrationNumber(migrationsPath),
|
|
22
|
+
newDrizzleSqlFiles = sqlFiles.filter(file => {
|
|
23
|
+
if (!drizzlePattern.test(file)) return !1;
|
|
24
|
+
const tsFile = file.replace(".sql", ".ts");
|
|
25
|
+
return !files.includes(tsFile);
|
|
26
|
+
});
|
|
27
|
+
if (newDrizzleSqlFiles.length === 0) return sqlFiles;
|
|
28
|
+
const migrationGroups = /* @__PURE__ */new Map();
|
|
29
|
+
for (const file of newDrizzleSqlFiles) {
|
|
30
|
+
const num = file.substring(0, 4);
|
|
31
|
+
migrationGroups.has(num) || migrationGroups.set(num, []), migrationGroups.get(num).push(file);
|
|
32
|
+
}
|
|
33
|
+
let nextNumber = highestNumber + 1;
|
|
34
|
+
const renamedFiles = [];
|
|
35
|
+
for (const [originalNum, groupFiles] of migrationGroups) if (Number.parseInt(originalNum, 10) <= highestNumber) {
|
|
36
|
+
const newNumStr = nextNumber.toString().padStart(4, "0");
|
|
37
|
+
console.info(`Renumbering new drizzle migration ${originalNum} to ${newNumStr}`);
|
|
38
|
+
for (const file of groupFiles) {
|
|
39
|
+
const newName = file.replace(/^\d{4}/, newNumStr),
|
|
40
|
+
oldPath = join(migrationsPath, file),
|
|
41
|
+
newPath = join(migrationsPath, newName);
|
|
42
|
+
await rename(oldPath, newPath), console.info(` Renamed ${file} -> ${newName}`), renamedFiles.push(newName);
|
|
43
|
+
}
|
|
44
|
+
const metaDir = join(migrationsPath, "meta");
|
|
45
|
+
if (existsSync(metaDir)) {
|
|
46
|
+
const metaFiles = await readdir(metaDir),
|
|
47
|
+
snapshotFile = `${originalNum}_snapshot.json`;
|
|
48
|
+
if (metaFiles.includes(snapshotFile)) {
|
|
49
|
+
const newSnapshotName = `${newNumStr}_snapshot.json`;
|
|
50
|
+
await rename(join(metaDir, snapshotFile), join(metaDir, newSnapshotName)), console.info(` Renamed meta/${snapshotFile} -> meta/${newSnapshotName}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
nextNumber++;
|
|
54
|
+
} else renamedFiles.push(...groupFiles);
|
|
55
|
+
return sqlFiles.map(file => {
|
|
56
|
+
if (newDrizzleSqlFiles.indexOf(file) !== -1) {
|
|
57
|
+
for (const renamed of renamedFiles) if (renamed.includes(file.substring(5))) return renamed;
|
|
58
|
+
}
|
|
59
|
+
return file;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async function syncDrizzleMigrations(options) {
|
|
63
|
+
const {
|
|
64
|
+
migrationsDir
|
|
65
|
+
} = options;
|
|
66
|
+
let sqlFiles = (await readdir(migrationsDir)).filter(file => extname(file) === ".sql");
|
|
67
|
+
console.info(`Found ${sqlFiles.length} SQL files to convert to migrations.`), sqlFiles = await renameNewDrizzleMigrations(migrationsDir, sqlFiles);
|
|
68
|
+
for (const sqlFile of sqlFiles) {
|
|
69
|
+
const tsFileName = `${basename(sqlFile, ".sql")}.ts`,
|
|
70
|
+
tsFilePath = join(migrationsDir, tsFileName);
|
|
71
|
+
if (existsSync(tsFilePath)) {
|
|
72
|
+
const sqlStat = await stat(join(migrationsDir, sqlFile));
|
|
73
|
+
if ((await stat(tsFilePath)).mtimeMs > sqlStat.mtimeMs) continue;
|
|
74
|
+
console.info(`Updating ${tsFileName} as SQL file has been modified.`);
|
|
75
|
+
} else console.info(`Creating ${tsFileName}`);
|
|
76
|
+
const migrationContent = `import type { PoolClient } from 'pg'
|
|
77
|
+
import sql from './${sqlFile}?raw'
|
|
78
|
+
|
|
79
|
+
export async function up(client: PoolClient) {
|
|
80
|
+
await client.query(sql)
|
|
81
|
+
}
|
|
82
|
+
`;
|
|
83
|
+
await writeFile(tsFilePath, migrationContent), console.info(`Successfully created ${tsFileName}`);
|
|
84
|
+
}
|
|
85
|
+
console.info("Migration sync completed.");
|
|
86
|
+
}
|
|
87
|
+
export { syncDrizzleMigrations };
|
|
88
|
+
//# sourceMappingURL=drizzle-migrations-sync.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["readdir","writeFile","stat","rename","join","basename","extname","existsSync","getMigrationNumber","filename","match","Number","parseInt","getHighestMigrationNumber","dir","files","highest","file","num","renameNewDrizzleMigrations","migrationsPath","sqlFiles","drizzlePattern","highestNumber","newDrizzleSqlFiles","filter","test","tsFile","replace","includes","length","migrationGroups","Map","substring","has","set","get","push","nextNumber","renamedFiles","originalNum","groupFiles","newNumStr","toString","padStart","console","info","newName","oldPath","newPath","metaDir","metaFiles","snapshotFile","newSnapshotName","map","indexOf","renamed","syncDrizzleMigrations","options","migrationsDir","sqlFile","tsFileName","tsFilePath","sqlStat","mtimeMs","migrationContent"],"sources":["../../../src/scripts/drizzle-migrations-sync.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|