@paperclipai/db 0.2.2
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/dist/backup.d.ts +2 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +298 -0
- package/dist/backup.js.map +1 -0
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +546 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +2 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +19 -0
- package/dist/migrate.js.map +1 -0
- package/dist/schema/activity_log.d.ts +197 -0
- package/dist/schema/activity_log.d.ts.map +1 -0
- package/dist/schema/activity_log.js +22 -0
- package/dist/schema/activity_log.js.map +1 -0
- package/dist/schema/agent_api_keys.d.ts +144 -0
- package/dist/schema/agent_api_keys.d.ts.map +1 -0
- package/dist/schema/agent_api_keys.js +17 -0
- package/dist/schema/agent_api_keys.js.map +1 -0
- package/dist/schema/agent_config_revisions.d.ts +201 -0
- package/dist/schema/agent_config_revisions.d.ts.map +1 -0
- package/dist/schema/agent_config_revisions.js +20 -0
- package/dist/schema/agent_config_revisions.js.map +1 -0
- package/dist/schema/agent_runtime_state.d.ts +248 -0
- package/dist/schema/agent_runtime_state.d.ts.map +1 -0
- package/dist/schema/agent_runtime_state.js +23 -0
- package/dist/schema/agent_runtime_state.js.map +1 -0
- package/dist/schema/agent_task_sessions.d.ts +197 -0
- package/dist/schema/agent_task_sessions.d.ts.map +1 -0
- package/dist/schema/agent_task_sessions.js +22 -0
- package/dist/schema/agent_task_sessions.js.map +1 -0
- package/dist/schema/agent_wakeup_requests.d.ts +333 -0
- package/dist/schema/agent_wakeup_requests.d.ts.map +1 -0
- package/dist/schema/agent_wakeup_requests.js +29 -0
- package/dist/schema/agent_wakeup_requests.js.map +1 -0
- package/dist/schema/agents.d.ts +339 -0
- package/dist/schema/agents.d.ts.map +1 -0
- package/dist/schema/agents.js +27 -0
- package/dist/schema/agents.js.map +1 -0
- package/dist/schema/approval_comments.d.ts +144 -0
- package/dist/schema/approval_comments.d.ts.map +1 -0
- package/dist/schema/approval_comments.js +19 -0
- package/dist/schema/approval_comments.js.map +1 -0
- package/dist/schema/approvals.d.ts +214 -0
- package/dist/schema/approvals.d.ts.map +1 -0
- package/dist/schema/approvals.js +20 -0
- package/dist/schema/approvals.js.map +1 -0
- package/dist/schema/assets.d.ts +212 -0
- package/dist/schema/assets.d.ts.map +1 -0
- package/dist/schema/assets.js +22 -0
- package/dist/schema/assets.js.map +1 -0
- package/dist/schema/auth.d.ts +607 -0
- package/dist/schema/auth.d.ts.map +1 -0
- package/dist/schema/auth.js +44 -0
- package/dist/schema/auth.js.map +1 -0
- package/dist/schema/companies.d.ts +212 -0
- package/dist/schema/companies.d.ts.map +1 -0
- package/dist/schema/companies.js +20 -0
- package/dist/schema/companies.js.map +1 -0
- package/dist/schema/company_memberships.d.ts +144 -0
- package/dist/schema/company_memberships.d.ts.map +1 -0
- package/dist/schema/company_memberships.js +17 -0
- package/dist/schema/company_memberships.js.map +1 -0
- package/dist/schema/company_secret_versions.d.ts +163 -0
- package/dist/schema/company_secret_versions.d.ts.map +1 -0
- package/dist/schema/company_secret_versions.js +19 -0
- package/dist/schema/company_secret_versions.js.map +1 -0
- package/dist/schema/company_secrets.d.ts +195 -0
- package/dist/schema/company_secrets.d.ts.map +1 -0
- package/dist/schema/company_secrets.js +21 -0
- package/dist/schema/company_secrets.js.map +1 -0
- package/dist/schema/cost_events.d.ts +246 -0
- package/dist/schema/cost_events.d.ts.map +1 -0
- package/dist/schema/cost_events.js +26 -0
- package/dist/schema/cost_events.js.map +1 -0
- package/dist/schema/goals.d.ts +178 -0
- package/dist/schema/goals.d.ts.map +1 -0
- package/dist/schema/goals.js +18 -0
- package/dist/schema/goals.js.map +1 -0
- package/dist/schema/heartbeat_run_events.d.ts +214 -0
- package/dist/schema/heartbeat_run_events.d.ts.map +1 -0
- package/dist/schema/heartbeat_run_events.js +23 -0
- package/dist/schema/heartbeat_run_events.js.map +1 -0
- package/dist/schema/heartbeat_runs.d.ts +490 -0
- package/dist/schema/heartbeat_runs.d.ts.map +1 -0
- package/dist/schema/heartbeat_runs.js +37 -0
- package/dist/schema/heartbeat_runs.js.map +1 -0
- package/dist/schema/index.d.ts +33 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +33 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/instance_user_roles.d.ts +93 -0
- package/dist/schema/instance_user_roles.d.ts.map +1 -0
- package/dist/schema/instance_user_roles.js +12 -0
- package/dist/schema/instance_user_roles.js.map +1 -0
- package/dist/schema/invites.d.ts +214 -0
- package/dist/schema/invites.d.ts.map +1 -0
- package/dist/schema/invites.js +20 -0
- package/dist/schema/invites.js.map +1 -0
- package/dist/schema/issue_approvals.d.ts +110 -0
- package/dist/schema/issue_approvals.d.ts.map +1 -0
- package/dist/schema/issue_approvals.js +19 -0
- package/dist/schema/issue_approvals.js.map +1 -0
- package/dist/schema/issue_attachments.d.ts +127 -0
- package/dist/schema/issue_attachments.d.ts.map +1 -0
- package/dist/schema/issue_attachments.js +19 -0
- package/dist/schema/issue_attachments.js.map +1 -0
- package/dist/schema/issue_comments.d.ts +144 -0
- package/dist/schema/issue_comments.d.ts.map +1 -0
- package/dist/schema/issue_comments.js +18 -0
- package/dist/schema/issue_comments.js.map +1 -0
- package/dist/schema/issue_labels.d.ts +76 -0
- package/dist/schema/issue_labels.d.ts.map +1 -0
- package/dist/schema/issue_labels.js +16 -0
- package/dist/schema/issue_labels.js.map +1 -0
- package/dist/schema/issues.d.ts +486 -0
- package/dist/schema/issues.d.ts.map +1 -0
- package/dist/schema/issues.js +44 -0
- package/dist/schema/issues.js.map +1 -0
- package/dist/schema/join_requests.d.ts +384 -0
- package/dist/schema/join_requests.d.ts.map +1 -0
- package/dist/schema/join_requests.js +32 -0
- package/dist/schema/join_requests.js.map +1 -0
- package/dist/schema/labels.d.ts +110 -0
- package/dist/schema/labels.d.ts.map +1 -0
- package/dist/schema/labels.js +14 -0
- package/dist/schema/labels.js.map +1 -0
- package/dist/schema/principal_permission_grants.d.ts +163 -0
- package/dist/schema/principal_permission_grants.d.ts.map +1 -0
- package/dist/schema/principal_permission_grants.js +17 -0
- package/dist/schema/principal_permission_grants.js.map +1 -0
- package/dist/schema/project_goals.d.ts +93 -0
- package/dist/schema/project_goals.d.ts.map +1 -0
- package/dist/schema/project_goals.js +17 -0
- package/dist/schema/project_goals.js.map +1 -0
- package/dist/schema/project_workspaces.d.ts +197 -0
- package/dist/schema/project_workspaces.d.ts.map +1 -0
- package/dist/schema/project_workspaces.js +20 -0
- package/dist/schema/project_workspaces.js.map +1 -0
- package/dist/schema/projects.d.ts +212 -0
- package/dist/schema/projects.d.ts.map +1 -0
- package/dist/schema/projects.js +21 -0
- package/dist/schema/projects.js.map +1 -0
- package/dist/seed.d.ts +2 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +91 -0
- package/dist/seed.js.map +1 -0
- package/package.json +42 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { drizzle as drizzlePg } from "drizzle-orm/postgres-js";
|
|
3
|
+
import { migrate as migratePg } from "drizzle-orm/postgres-js/migrator";
|
|
4
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
5
|
+
import postgres from "postgres";
|
|
6
|
+
import * as schema from "./schema/index.js";
|
|
7
|
+
const MIGRATIONS_FOLDER = new URL("./migrations", import.meta.url).pathname;
|
|
8
|
+
const DRIZZLE_MIGRATIONS_TABLE = "__drizzle_migrations";
|
|
9
|
+
const MIGRATIONS_JOURNAL_JSON = new URL("./migrations/meta/_journal.json", import.meta.url).pathname;
|
|
10
|
+
function isSafeIdentifier(value) {
|
|
11
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
12
|
+
}
|
|
13
|
+
function quoteIdentifier(value) {
|
|
14
|
+
if (!isSafeIdentifier(value))
|
|
15
|
+
throw new Error(`Unsafe SQL identifier: ${value}`);
|
|
16
|
+
return `"${value.replaceAll("\"", "\"\"")}"`;
|
|
17
|
+
}
|
|
18
|
+
function quoteLiteral(value) {
|
|
19
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
20
|
+
}
|
|
21
|
+
function splitMigrationStatements(content) {
|
|
22
|
+
return content
|
|
23
|
+
.split("--> statement-breakpoint")
|
|
24
|
+
.map((statement) => statement.trim())
|
|
25
|
+
.filter((statement) => statement.length > 0);
|
|
26
|
+
}
|
|
27
|
+
export function createDb(url) {
|
|
28
|
+
const sql = postgres(url);
|
|
29
|
+
return drizzlePg(sql, { schema });
|
|
30
|
+
}
|
|
31
|
+
async function listMigrationFiles() {
|
|
32
|
+
const entries = await readdir(MIGRATIONS_FOLDER, { withFileTypes: true });
|
|
33
|
+
return entries
|
|
34
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".sql"))
|
|
35
|
+
.map((entry) => entry.name)
|
|
36
|
+
.sort((a, b) => a.localeCompare(b));
|
|
37
|
+
}
|
|
38
|
+
async function listJournalMigrationEntries() {
|
|
39
|
+
try {
|
|
40
|
+
const raw = await readFile(MIGRATIONS_JOURNAL_JSON, "utf8");
|
|
41
|
+
const parsed = JSON.parse(raw);
|
|
42
|
+
if (!Array.isArray(parsed.entries))
|
|
43
|
+
return [];
|
|
44
|
+
return parsed.entries
|
|
45
|
+
.map((entry, entryIndex) => {
|
|
46
|
+
if (typeof entry?.tag !== "string")
|
|
47
|
+
return null;
|
|
48
|
+
if (typeof entry?.when !== "number" || !Number.isFinite(entry.when))
|
|
49
|
+
return null;
|
|
50
|
+
const order = Number.isInteger(entry.idx) ? Number(entry.idx) : entryIndex;
|
|
51
|
+
return { fileName: `${entry.tag}.sql`, folderMillis: entry.when, order };
|
|
52
|
+
})
|
|
53
|
+
.filter((entry) => entry !== null);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function listJournalMigrationFiles() {
|
|
60
|
+
const entries = await listJournalMigrationEntries();
|
|
61
|
+
return entries.map((entry) => entry.fileName);
|
|
62
|
+
}
|
|
63
|
+
async function readMigrationFileContent(migrationFile) {
|
|
64
|
+
return readFile(new URL(`./migrations/${migrationFile}`, import.meta.url), "utf8");
|
|
65
|
+
}
|
|
66
|
+
async function orderMigrationsByJournal(migrationFiles) {
|
|
67
|
+
const journalEntries = await listJournalMigrationEntries();
|
|
68
|
+
const orderByFileName = new Map(journalEntries.map((entry) => [entry.fileName, entry.order]));
|
|
69
|
+
return [...migrationFiles].sort((left, right) => {
|
|
70
|
+
const leftOrder = orderByFileName.get(left);
|
|
71
|
+
const rightOrder = orderByFileName.get(right);
|
|
72
|
+
if (leftOrder === undefined && rightOrder === undefined)
|
|
73
|
+
return left.localeCompare(right);
|
|
74
|
+
if (leftOrder === undefined)
|
|
75
|
+
return 1;
|
|
76
|
+
if (rightOrder === undefined)
|
|
77
|
+
return -1;
|
|
78
|
+
if (leftOrder === rightOrder)
|
|
79
|
+
return left.localeCompare(right);
|
|
80
|
+
return leftOrder - rightOrder;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async function runInTransaction(sql, action) {
|
|
84
|
+
await sql.unsafe("BEGIN");
|
|
85
|
+
try {
|
|
86
|
+
await action();
|
|
87
|
+
await sql.unsafe("COMMIT");
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
try {
|
|
91
|
+
await sql.unsafe("ROLLBACK");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore rollback failures and surface the original error.
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function latestMigrationCreatedAt(sql, qualifiedTable) {
|
|
100
|
+
const rows = await sql.unsafe(`SELECT created_at FROM ${qualifiedTable} ORDER BY created_at DESC NULLS LAST LIMIT 1`);
|
|
101
|
+
const value = Number(rows[0]?.created_at ?? Number.NaN);
|
|
102
|
+
return Number.isFinite(value) ? value : null;
|
|
103
|
+
}
|
|
104
|
+
function normalizeFolderMillis(value) {
|
|
105
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
|
|
106
|
+
return Math.trunc(value);
|
|
107
|
+
}
|
|
108
|
+
return Date.now();
|
|
109
|
+
}
|
|
110
|
+
async function ensureMigrationJournalTable(sql) {
|
|
111
|
+
let migrationTableSchema = await discoverMigrationTableSchema(sql);
|
|
112
|
+
if (!migrationTableSchema) {
|
|
113
|
+
const drizzleSchema = quoteIdentifier("drizzle");
|
|
114
|
+
const migrationTable = quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE);
|
|
115
|
+
await sql.unsafe(`CREATE SCHEMA IF NOT EXISTS ${drizzleSchema}`);
|
|
116
|
+
await sql.unsafe(`CREATE TABLE IF NOT EXISTS ${drizzleSchema}.${migrationTable} (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at bigint)`);
|
|
117
|
+
migrationTableSchema = (await discoverMigrationTableSchema(sql)) ?? "drizzle";
|
|
118
|
+
}
|
|
119
|
+
const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);
|
|
120
|
+
return { migrationTableSchema, columnNames };
|
|
121
|
+
}
|
|
122
|
+
async function migrationHistoryEntryExists(sql, qualifiedTable, columnNames, migrationFile, hash) {
|
|
123
|
+
const predicates = [];
|
|
124
|
+
if (columnNames.has("hash"))
|
|
125
|
+
predicates.push(`hash = ${quoteLiteral(hash)}`);
|
|
126
|
+
if (columnNames.has("name"))
|
|
127
|
+
predicates.push(`name = ${quoteLiteral(migrationFile)}`);
|
|
128
|
+
if (predicates.length === 0)
|
|
129
|
+
return false;
|
|
130
|
+
const rows = await sql.unsafe(`SELECT 1 AS one FROM ${qualifiedTable} WHERE ${predicates.join(" OR ")} LIMIT 1`);
|
|
131
|
+
return rows.length > 0;
|
|
132
|
+
}
|
|
133
|
+
async function recordMigrationHistoryEntry(sql, qualifiedTable, columnNames, migrationFile, hash, folderMillis) {
|
|
134
|
+
const insertColumns = [];
|
|
135
|
+
const insertValues = [];
|
|
136
|
+
if (columnNames.has("hash")) {
|
|
137
|
+
insertColumns.push(quoteIdentifier("hash"));
|
|
138
|
+
insertValues.push(quoteLiteral(hash));
|
|
139
|
+
}
|
|
140
|
+
if (columnNames.has("name")) {
|
|
141
|
+
insertColumns.push(quoteIdentifier("name"));
|
|
142
|
+
insertValues.push(quoteLiteral(migrationFile));
|
|
143
|
+
}
|
|
144
|
+
if (columnNames.has("created_at")) {
|
|
145
|
+
const latestCreatedAt = await latestMigrationCreatedAt(sql, qualifiedTable);
|
|
146
|
+
const createdAt = latestCreatedAt === null
|
|
147
|
+
? normalizeFolderMillis(folderMillis)
|
|
148
|
+
: Math.max(latestCreatedAt + 1, normalizeFolderMillis(folderMillis));
|
|
149
|
+
insertColumns.push(quoteIdentifier("created_at"));
|
|
150
|
+
insertValues.push(quoteLiteral(String(createdAt)));
|
|
151
|
+
}
|
|
152
|
+
if (insertColumns.length === 0)
|
|
153
|
+
return;
|
|
154
|
+
await sql.unsafe(`INSERT INTO ${qualifiedTable} (${insertColumns.join(", ")}) VALUES (${insertValues.join(", ")})`);
|
|
155
|
+
}
|
|
156
|
+
async function applyPendingMigrationsManually(url, pendingMigrations) {
|
|
157
|
+
if (pendingMigrations.length === 0)
|
|
158
|
+
return;
|
|
159
|
+
const orderedPendingMigrations = await orderMigrationsByJournal(pendingMigrations);
|
|
160
|
+
const journalEntries = await listJournalMigrationEntries();
|
|
161
|
+
const folderMillisByFileName = new Map(journalEntries.map((entry) => [entry.fileName, normalizeFolderMillis(entry.folderMillis)]));
|
|
162
|
+
const sql = postgres(url, { max: 1 });
|
|
163
|
+
try {
|
|
164
|
+
const { migrationTableSchema, columnNames } = await ensureMigrationJournalTable(sql);
|
|
165
|
+
const qualifiedTable = `${quoteIdentifier(migrationTableSchema)}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;
|
|
166
|
+
for (const migrationFile of orderedPendingMigrations) {
|
|
167
|
+
const migrationContent = await readMigrationFileContent(migrationFile);
|
|
168
|
+
const hash = createHash("sha256").update(migrationContent).digest("hex");
|
|
169
|
+
const existingEntry = await migrationHistoryEntryExists(sql, qualifiedTable, columnNames, migrationFile, hash);
|
|
170
|
+
if (existingEntry)
|
|
171
|
+
continue;
|
|
172
|
+
await runInTransaction(sql, async () => {
|
|
173
|
+
for (const statement of splitMigrationStatements(migrationContent)) {
|
|
174
|
+
await sql.unsafe(statement);
|
|
175
|
+
}
|
|
176
|
+
await recordMigrationHistoryEntry(sql, qualifiedTable, columnNames, migrationFile, hash, folderMillisByFileName.get(migrationFile) ?? Date.now());
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
await sql.end();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function mapHashesToMigrationFiles(migrationFiles) {
|
|
185
|
+
const mapped = new Map();
|
|
186
|
+
await Promise.all(migrationFiles.map(async (migrationFile) => {
|
|
187
|
+
const content = await readMigrationFileContent(migrationFile);
|
|
188
|
+
const hash = createHash("sha256").update(content).digest("hex");
|
|
189
|
+
mapped.set(hash, migrationFile);
|
|
190
|
+
}));
|
|
191
|
+
return mapped;
|
|
192
|
+
}
|
|
193
|
+
async function getMigrationTableColumnNames(sql, migrationTableSchema) {
|
|
194
|
+
const columns = await sql.unsafe(`
|
|
195
|
+
SELECT column_name
|
|
196
|
+
FROM information_schema.columns
|
|
197
|
+
WHERE table_schema = ${quoteLiteral(migrationTableSchema)}
|
|
198
|
+
AND table_name = ${quoteLiteral(DRIZZLE_MIGRATIONS_TABLE)}
|
|
199
|
+
`);
|
|
200
|
+
return new Set(columns.map((column) => column.column_name));
|
|
201
|
+
}
|
|
202
|
+
async function tableExists(sql, tableName) {
|
|
203
|
+
const rows = await sql `
|
|
204
|
+
SELECT EXISTS (
|
|
205
|
+
SELECT 1
|
|
206
|
+
FROM information_schema.tables
|
|
207
|
+
WHERE table_schema = 'public'
|
|
208
|
+
AND table_name = ${tableName}
|
|
209
|
+
) AS exists
|
|
210
|
+
`;
|
|
211
|
+
return rows[0]?.exists ?? false;
|
|
212
|
+
}
|
|
213
|
+
async function columnExists(sql, tableName, columnName) {
|
|
214
|
+
const rows = await sql `
|
|
215
|
+
SELECT EXISTS (
|
|
216
|
+
SELECT 1
|
|
217
|
+
FROM information_schema.columns
|
|
218
|
+
WHERE table_schema = 'public'
|
|
219
|
+
AND table_name = ${tableName}
|
|
220
|
+
AND column_name = ${columnName}
|
|
221
|
+
) AS exists
|
|
222
|
+
`;
|
|
223
|
+
return rows[0]?.exists ?? false;
|
|
224
|
+
}
|
|
225
|
+
async function indexExists(sql, indexName) {
|
|
226
|
+
const rows = await sql `
|
|
227
|
+
SELECT EXISTS (
|
|
228
|
+
SELECT 1
|
|
229
|
+
FROM pg_class c
|
|
230
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
231
|
+
WHERE n.nspname = 'public'
|
|
232
|
+
AND c.relkind = 'i'
|
|
233
|
+
AND c.relname = ${indexName}
|
|
234
|
+
) AS exists
|
|
235
|
+
`;
|
|
236
|
+
return rows[0]?.exists ?? false;
|
|
237
|
+
}
|
|
238
|
+
async function constraintExists(sql, constraintName) {
|
|
239
|
+
const rows = await sql `
|
|
240
|
+
SELECT EXISTS (
|
|
241
|
+
SELECT 1
|
|
242
|
+
FROM pg_constraint c
|
|
243
|
+
JOIN pg_namespace n ON n.oid = c.connamespace
|
|
244
|
+
WHERE n.nspname = 'public'
|
|
245
|
+
AND c.conname = ${constraintName}
|
|
246
|
+
) AS exists
|
|
247
|
+
`;
|
|
248
|
+
return rows[0]?.exists ?? false;
|
|
249
|
+
}
|
|
250
|
+
async function migrationStatementAlreadyApplied(sql, statement) {
|
|
251
|
+
const normalized = statement.replace(/\s+/g, " ").trim();
|
|
252
|
+
const createTableMatch = normalized.match(/^CREATE TABLE(?: IF NOT EXISTS)? "([^"]+)"/i);
|
|
253
|
+
if (createTableMatch) {
|
|
254
|
+
return tableExists(sql, createTableMatch[1]);
|
|
255
|
+
}
|
|
256
|
+
const addColumnMatch = normalized.match(/^ALTER TABLE "([^"]+)" ADD COLUMN(?: IF NOT EXISTS)? "([^"]+)"/i);
|
|
257
|
+
if (addColumnMatch) {
|
|
258
|
+
return columnExists(sql, addColumnMatch[1], addColumnMatch[2]);
|
|
259
|
+
}
|
|
260
|
+
const createIndexMatch = normalized.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)? "([^"]+)"/i);
|
|
261
|
+
if (createIndexMatch) {
|
|
262
|
+
return indexExists(sql, createIndexMatch[1]);
|
|
263
|
+
}
|
|
264
|
+
const addConstraintMatch = normalized.match(/^ALTER TABLE "([^"]+)" ADD CONSTRAINT "([^"]+)"/i);
|
|
265
|
+
if (addConstraintMatch) {
|
|
266
|
+
return constraintExists(sql, addConstraintMatch[2]);
|
|
267
|
+
}
|
|
268
|
+
// If we cannot reason about a statement safely, require manual migration.
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
async function migrationContentAlreadyApplied(sql, migrationContent) {
|
|
272
|
+
const statements = splitMigrationStatements(migrationContent);
|
|
273
|
+
if (statements.length === 0)
|
|
274
|
+
return false;
|
|
275
|
+
for (const statement of statements) {
|
|
276
|
+
const applied = await migrationStatementAlreadyApplied(sql, statement);
|
|
277
|
+
if (!applied)
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
async function loadAppliedMigrations(sql, migrationTableSchema, availableMigrations) {
|
|
283
|
+
const quotedSchema = quoteIdentifier(migrationTableSchema);
|
|
284
|
+
const qualifiedTable = `${quotedSchema}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;
|
|
285
|
+
const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);
|
|
286
|
+
if (columnNames.has("name")) {
|
|
287
|
+
const rows = await sql.unsafe(`SELECT name FROM ${qualifiedTable} ORDER BY id`);
|
|
288
|
+
return rows.map((row) => row.name).filter((name) => Boolean(name));
|
|
289
|
+
}
|
|
290
|
+
if (columnNames.has("hash")) {
|
|
291
|
+
const rows = await sql.unsafe(`SELECT hash FROM ${qualifiedTable} ORDER BY id`);
|
|
292
|
+
const hashesToMigrationFiles = await mapHashesToMigrationFiles(availableMigrations);
|
|
293
|
+
const appliedFromHashes = rows
|
|
294
|
+
.map((row) => hashesToMigrationFiles.get(row.hash))
|
|
295
|
+
.filter((name) => Boolean(name));
|
|
296
|
+
if (appliedFromHashes.length > 0) {
|
|
297
|
+
// Best-effort: when all hashes resolve, this is authoritative.
|
|
298
|
+
if (appliedFromHashes.length === rows.length)
|
|
299
|
+
return appliedFromHashes;
|
|
300
|
+
// Partial hash resolution can happen when files have changed; return what we can trust.
|
|
301
|
+
return appliedFromHashes;
|
|
302
|
+
}
|
|
303
|
+
// Fallback only when hashes are unavailable/unresolved.
|
|
304
|
+
if (columnNames.has("created_at")) {
|
|
305
|
+
const journalEntries = await listJournalMigrationEntries();
|
|
306
|
+
if (journalEntries.length > 0) {
|
|
307
|
+
const lastDbRows = await sql.unsafe(`SELECT created_at FROM ${qualifiedTable} ORDER BY created_at DESC LIMIT 1`);
|
|
308
|
+
const lastCreatedAt = Number(lastDbRows[0]?.created_at ?? -1);
|
|
309
|
+
if (Number.isFinite(lastCreatedAt) && lastCreatedAt >= 0) {
|
|
310
|
+
return journalEntries
|
|
311
|
+
.filter((entry) => availableMigrations.includes(entry.fileName))
|
|
312
|
+
.filter((entry) => entry.folderMillis <= lastCreatedAt)
|
|
313
|
+
.map((entry) => entry.fileName)
|
|
314
|
+
.slice(0, rows.length);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const rows = await sql.unsafe(`SELECT id FROM ${qualifiedTable} ORDER BY id`);
|
|
320
|
+
const journalMigrationFiles = await listJournalMigrationFiles();
|
|
321
|
+
const appliedFromIds = rows
|
|
322
|
+
.map((row) => journalMigrationFiles[row.id - 1])
|
|
323
|
+
.filter((name) => Boolean(name));
|
|
324
|
+
if (appliedFromIds.length > 0)
|
|
325
|
+
return appliedFromIds;
|
|
326
|
+
return availableMigrations.slice(0, Math.max(0, rows.length));
|
|
327
|
+
}
|
|
328
|
+
export async function reconcilePendingMigrationHistory(url) {
|
|
329
|
+
const state = await inspectMigrations(url);
|
|
330
|
+
if (state.status !== "needsMigrations" || state.reason !== "pending-migrations") {
|
|
331
|
+
return { repairedMigrations: [], remainingMigrations: [] };
|
|
332
|
+
}
|
|
333
|
+
const sql = postgres(url, { max: 1 });
|
|
334
|
+
const repairedMigrations = [];
|
|
335
|
+
try {
|
|
336
|
+
const journalEntries = await listJournalMigrationEntries();
|
|
337
|
+
const folderMillisByFile = new Map(journalEntries.map((entry) => [entry.fileName, entry.folderMillis]));
|
|
338
|
+
const migrationTableSchema = await discoverMigrationTableSchema(sql);
|
|
339
|
+
if (!migrationTableSchema) {
|
|
340
|
+
return { repairedMigrations, remainingMigrations: state.pendingMigrations };
|
|
341
|
+
}
|
|
342
|
+
const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);
|
|
343
|
+
const qualifiedTable = `${quoteIdentifier(migrationTableSchema)}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;
|
|
344
|
+
for (const migrationFile of state.pendingMigrations) {
|
|
345
|
+
const migrationContent = await readMigrationFileContent(migrationFile);
|
|
346
|
+
const alreadyApplied = await migrationContentAlreadyApplied(sql, migrationContent);
|
|
347
|
+
if (!alreadyApplied)
|
|
348
|
+
break;
|
|
349
|
+
const hash = createHash("sha256").update(migrationContent).digest("hex");
|
|
350
|
+
const folderMillis = folderMillisByFile.get(migrationFile) ?? Date.now();
|
|
351
|
+
const existingByHash = columnNames.has("hash")
|
|
352
|
+
? await sql.unsafe(`SELECT created_at FROM ${qualifiedTable} WHERE hash = ${quoteLiteral(hash)} ORDER BY created_at DESC LIMIT 1`)
|
|
353
|
+
: [];
|
|
354
|
+
const existingByName = columnNames.has("name")
|
|
355
|
+
? await sql.unsafe(`SELECT created_at FROM ${qualifiedTable} WHERE name = ${quoteLiteral(migrationFile)} ORDER BY created_at DESC LIMIT 1`)
|
|
356
|
+
: [];
|
|
357
|
+
if (existingByHash.length > 0 || existingByName.length > 0) {
|
|
358
|
+
if (columnNames.has("created_at")) {
|
|
359
|
+
const existingHashCreatedAt = Number(existingByHash[0]?.created_at ?? -1);
|
|
360
|
+
if (existingByHash.length > 0 && Number.isFinite(existingHashCreatedAt) && existingHashCreatedAt < folderMillis) {
|
|
361
|
+
await sql.unsafe(`UPDATE ${qualifiedTable} SET created_at = ${quoteLiteral(String(folderMillis))} WHERE hash = ${quoteLiteral(hash)} AND created_at < ${quoteLiteral(String(folderMillis))}`);
|
|
362
|
+
}
|
|
363
|
+
const existingNameCreatedAt = Number(existingByName[0]?.created_at ?? -1);
|
|
364
|
+
if (existingByName.length > 0 && Number.isFinite(existingNameCreatedAt) && existingNameCreatedAt < folderMillis) {
|
|
365
|
+
await sql.unsafe(`UPDATE ${qualifiedTable} SET created_at = ${quoteLiteral(String(folderMillis))} WHERE name = ${quoteLiteral(migrationFile)} AND created_at < ${quoteLiteral(String(folderMillis))}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
repairedMigrations.push(migrationFile);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const insertColumns = [];
|
|
372
|
+
const insertValues = [];
|
|
373
|
+
if (columnNames.has("hash")) {
|
|
374
|
+
insertColumns.push(quoteIdentifier("hash"));
|
|
375
|
+
insertValues.push(quoteLiteral(hash));
|
|
376
|
+
}
|
|
377
|
+
if (columnNames.has("name")) {
|
|
378
|
+
insertColumns.push(quoteIdentifier("name"));
|
|
379
|
+
insertValues.push(quoteLiteral(migrationFile));
|
|
380
|
+
}
|
|
381
|
+
if (columnNames.has("created_at")) {
|
|
382
|
+
insertColumns.push(quoteIdentifier("created_at"));
|
|
383
|
+
insertValues.push(quoteLiteral(String(folderMillis)));
|
|
384
|
+
}
|
|
385
|
+
if (insertColumns.length === 0)
|
|
386
|
+
break;
|
|
387
|
+
await sql.unsafe(`INSERT INTO ${qualifiedTable} (${insertColumns.join(", ")}) VALUES (${insertValues.join(", ")})`);
|
|
388
|
+
repairedMigrations.push(migrationFile);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
finally {
|
|
392
|
+
await sql.end();
|
|
393
|
+
}
|
|
394
|
+
const refreshed = await inspectMigrations(url);
|
|
395
|
+
return {
|
|
396
|
+
repairedMigrations,
|
|
397
|
+
remainingMigrations: refreshed.status === "needsMigrations" ? refreshed.pendingMigrations : [],
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
async function discoverMigrationTableSchema(sql) {
|
|
401
|
+
const rows = await sql `
|
|
402
|
+
SELECT n.nspname AS "schemaName"
|
|
403
|
+
FROM pg_class c
|
|
404
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
405
|
+
WHERE c.relname = ${DRIZZLE_MIGRATIONS_TABLE} AND c.relkind = 'r'
|
|
406
|
+
`;
|
|
407
|
+
if (rows.length === 0)
|
|
408
|
+
return null;
|
|
409
|
+
const drizzleSchema = rows.find(({ schemaName }) => schemaName === "drizzle");
|
|
410
|
+
if (drizzleSchema)
|
|
411
|
+
return drizzleSchema.schemaName;
|
|
412
|
+
const publicSchema = rows.find(({ schemaName }) => schemaName === "public");
|
|
413
|
+
if (publicSchema)
|
|
414
|
+
return publicSchema.schemaName;
|
|
415
|
+
return rows[0]?.schemaName ?? null;
|
|
416
|
+
}
|
|
417
|
+
export async function inspectMigrations(url) {
|
|
418
|
+
const sql = postgres(url, { max: 1 });
|
|
419
|
+
try {
|
|
420
|
+
const availableMigrations = await listMigrationFiles();
|
|
421
|
+
const tableCountResult = await sql `
|
|
422
|
+
select count(*)::int as count
|
|
423
|
+
from information_schema.tables
|
|
424
|
+
where table_schema = 'public'
|
|
425
|
+
and table_type = 'BASE TABLE'
|
|
426
|
+
`;
|
|
427
|
+
const tableCount = tableCountResult[0]?.count ?? 0;
|
|
428
|
+
const migrationTableSchema = await discoverMigrationTableSchema(sql);
|
|
429
|
+
if (!migrationTableSchema) {
|
|
430
|
+
if (tableCount > 0) {
|
|
431
|
+
return {
|
|
432
|
+
status: "needsMigrations",
|
|
433
|
+
tableCount,
|
|
434
|
+
availableMigrations,
|
|
435
|
+
appliedMigrations: [],
|
|
436
|
+
pendingMigrations: availableMigrations,
|
|
437
|
+
reason: "no-migration-journal-non-empty-db",
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
return {
|
|
441
|
+
status: "needsMigrations",
|
|
442
|
+
tableCount,
|
|
443
|
+
availableMigrations,
|
|
444
|
+
appliedMigrations: [],
|
|
445
|
+
pendingMigrations: availableMigrations,
|
|
446
|
+
reason: "no-migration-journal-empty-db",
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
const appliedMigrations = await loadAppliedMigrations(sql, migrationTableSchema, availableMigrations);
|
|
450
|
+
const pendingMigrations = availableMigrations.filter((name) => !appliedMigrations.includes(name));
|
|
451
|
+
if (pendingMigrations.length === 0) {
|
|
452
|
+
return {
|
|
453
|
+
status: "upToDate",
|
|
454
|
+
tableCount,
|
|
455
|
+
availableMigrations,
|
|
456
|
+
appliedMigrations,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
status: "needsMigrations",
|
|
461
|
+
tableCount,
|
|
462
|
+
availableMigrations,
|
|
463
|
+
appliedMigrations,
|
|
464
|
+
pendingMigrations,
|
|
465
|
+
reason: "pending-migrations",
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
await sql.end();
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
export async function applyPendingMigrations(url) {
|
|
473
|
+
const initialState = await inspectMigrations(url);
|
|
474
|
+
if (initialState.status === "upToDate")
|
|
475
|
+
return;
|
|
476
|
+
const sql = postgres(url, { max: 1 });
|
|
477
|
+
try {
|
|
478
|
+
const db = drizzlePg(sql);
|
|
479
|
+
await migratePg(db, { migrationsFolder: MIGRATIONS_FOLDER });
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
await sql.end();
|
|
483
|
+
}
|
|
484
|
+
let state = await inspectMigrations(url);
|
|
485
|
+
if (state.status === "upToDate")
|
|
486
|
+
return;
|
|
487
|
+
const repair = await reconcilePendingMigrationHistory(url);
|
|
488
|
+
if (repair.repairedMigrations.length > 0) {
|
|
489
|
+
state = await inspectMigrations(url);
|
|
490
|
+
if (state.status === "upToDate")
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
if (state.status !== "needsMigrations" || state.reason !== "pending-migrations") {
|
|
494
|
+
throw new Error("Migrations are still pending after attempted apply; run inspectMigrations for details.");
|
|
495
|
+
}
|
|
496
|
+
await applyPendingMigrationsManually(url, state.pendingMigrations);
|
|
497
|
+
const finalState = await inspectMigrations(url);
|
|
498
|
+
if (finalState.status !== "upToDate") {
|
|
499
|
+
throw new Error(`Failed to apply pending migrations: ${finalState.pendingMigrations.join(", ")}`);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
export async function migratePostgresIfEmpty(url) {
|
|
503
|
+
const sql = postgres(url, { max: 1 });
|
|
504
|
+
try {
|
|
505
|
+
const migrationTableSchema = await discoverMigrationTableSchema(sql);
|
|
506
|
+
const tableCountResult = await sql `
|
|
507
|
+
select count(*)::int as count
|
|
508
|
+
from information_schema.tables
|
|
509
|
+
where table_schema = 'public'
|
|
510
|
+
and table_type = 'BASE TABLE'
|
|
511
|
+
`;
|
|
512
|
+
const tableCount = tableCountResult[0]?.count ?? 0;
|
|
513
|
+
if (migrationTableSchema) {
|
|
514
|
+
return { migrated: false, reason: "already-migrated", tableCount };
|
|
515
|
+
}
|
|
516
|
+
if (tableCount > 0) {
|
|
517
|
+
return { migrated: false, reason: "not-empty-no-migration-journal", tableCount };
|
|
518
|
+
}
|
|
519
|
+
const db = drizzlePg(sql);
|
|
520
|
+
const migrationsFolder = new URL("./migrations", import.meta.url).pathname;
|
|
521
|
+
await migratePg(db, { migrationsFolder });
|
|
522
|
+
return { migrated: true, reason: "migrated-empty-db", tableCount: 0 };
|
|
523
|
+
}
|
|
524
|
+
finally {
|
|
525
|
+
await sql.end();
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
export async function ensurePostgresDatabase(url, databaseName) {
|
|
529
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(databaseName)) {
|
|
530
|
+
throw new Error(`Unsafe database name: ${databaseName}`);
|
|
531
|
+
}
|
|
532
|
+
const sql = postgres(url, { max: 1 });
|
|
533
|
+
try {
|
|
534
|
+
const existing = await sql `
|
|
535
|
+
select 1 as one from pg_database where datname = ${databaseName} limit 1
|
|
536
|
+
`;
|
|
537
|
+
if (existing.length > 0)
|
|
538
|
+
return "exists";
|
|
539
|
+
await sql.unsafe(`create database "${databaseName}"`);
|
|
540
|
+
return "created";
|
|
541
|
+
}
|
|
542
|
+
finally {
|
|
543
|
+
await sql.end();
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createDb, ensurePostgresDatabase, inspectMigrations, applyPendingMigrations, reconcilePendingMigrationHistory, type MigrationState, type MigrationHistoryReconcileResult, migratePostgresIfEmpty, type MigrationBootstrapResult, type Db, } from "./client.js";
|
|
2
|
+
export * from "./schema/index.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAChC,KAAK,cAAc,EACnB,KAAK,+BAA+B,EACpC,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,EAAE,GACR,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAGhC,sBAAsB,GAGvB,MAAM,aAAa,CAAC;AACrB,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":""}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { applyPendingMigrations, inspectMigrations } from "./client.js";
|
|
2
|
+
const url = process.env.DATABASE_URL;
|
|
3
|
+
if (!url) {
|
|
4
|
+
throw new Error("DATABASE_URL is required for db:migrate");
|
|
5
|
+
}
|
|
6
|
+
const before = await inspectMigrations(url);
|
|
7
|
+
if (before.status === "upToDate") {
|
|
8
|
+
console.log("No pending migrations");
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
console.log(`Applying ${before.pendingMigrations.length} pending migration(s)...`);
|
|
12
|
+
await applyPendingMigrations(url);
|
|
13
|
+
const after = await inspectMigrations(url);
|
|
14
|
+
if (after.status !== "upToDate") {
|
|
15
|
+
throw new Error(`Migrations incomplete: ${after.pendingMigrations.join(", ")}`);
|
|
16
|
+
}
|
|
17
|
+
console.log("Migrations complete");
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAErC,IAAI,CAAC,GAAG,EAAE,CAAC;IACT,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACvC,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,iBAAiB,CAAC,MAAM,0BAA0B,CAAC,CAAC;IACnF,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC"}
|