pipework 0.14.1 → 0.16.0
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/CHANGELOG.md +15 -0
- package/REFERENCE.md +159 -2
- package/dist/REFERENCE.md +159 -2
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +12 -10
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/core/config/base-dir.d.ts +6 -0
- package/dist/core/config/base-dir.d.ts.map +1 -0
- package/dist/core/config/base-dir.js +21 -0
- package/dist/core/config/base-dir.js.map +1 -0
- package/dist/core/config/discover.d.ts.map +1 -1
- package/dist/core/config/discover.js +2 -15
- package/dist/core/config/discover.js.map +1 -1
- package/dist/core/config/env-types.d.ts +70 -0
- package/dist/core/config/env-types.d.ts.map +1 -1
- package/dist/core/config/env.d.ts.map +1 -1
- package/dist/core/config/env.js +10 -6
- package/dist/core/config/env.js.map +1 -1
- package/dist/core/config/import-config.d.ts +3 -0
- package/dist/core/config/import-config.d.ts.map +1 -0
- package/dist/core/config/import-config.js +34 -0
- package/dist/core/config/import-config.js.map +1 -0
- package/dist/core/config/load.d.ts +4 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +14 -5
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/resolve.d.ts.map +1 -1
- package/dist/core/config/resolve.js +23 -1
- package/dist/core/config/resolve.js.map +1 -1
- package/dist/core/pipework.d.ts +19 -0
- package/dist/core/pipework.d.ts.map +1 -1
- package/dist/core/pipework.js +25 -0
- package/dist/core/pipework.js.map +1 -1
- package/dist/core/validation/queue-tables.d.ts +8 -0
- package/dist/core/validation/queue-tables.d.ts.map +1 -0
- package/dist/core/validation/queue-tables.js +53 -0
- package/dist/core/validation/queue-tables.js.map +1 -0
- package/dist/core/validation/rls-role.d.ts +16 -0
- package/dist/core/validation/rls-role.d.ts.map +1 -0
- package/dist/core/validation/rls-role.js +54 -0
- package/dist/core/validation/rls-role.js.map +1 -0
- package/dist/core/validation/startup.d.ts +2 -0
- package/dist/core/validation/startup.d.ts.map +1 -1
- package/dist/core/validation/startup.js +6 -0
- package/dist/core/validation/startup.js.map +1 -1
- package/dist/data/db/pool.d.ts +9 -0
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +7 -0
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/migrate/applied.d.ts +21 -7
- package/dist/data/migrate/applied.d.ts.map +1 -1
- package/dist/data/migrate/applied.js +14 -14
- package/dist/data/migrate/applied.js.map +1 -1
- package/dist/data/migrate/apply.d.ts.map +1 -1
- package/dist/data/migrate/apply.js +37 -7
- package/dist/data/migrate/apply.js.map +1 -1
- package/dist/data/migrate/check.d.ts +9 -6
- package/dist/data/migrate/check.d.ts.map +1 -1
- package/dist/data/migrate/check.js +16 -7
- package/dist/data/migrate/check.js.map +1 -1
- package/dist/data/migrate/generate.d.ts +1 -1
- package/dist/data/migrate/generate.d.ts.map +1 -1
- package/dist/data/migrate/generate.js +15 -8
- package/dist/data/migrate/generate.js.map +1 -1
- package/dist/data/migrate/index.d.ts +1 -1
- package/dist/data/migrate/index.d.ts.map +1 -1
- package/dist/data/migrate/index.js +1 -1
- package/dist/data/migrate/index.js.map +1 -1
- package/dist/data/migrate/run.js +2 -2
- package/dist/data/migrate/run.js.map +1 -1
- package/dist/lint/resolver.d.ts.map +1 -1
- package/dist/lint/resolver.js +2 -11
- package/dist/lint/resolver.js.map +1 -1
- package/dist/test/setup.d.ts.map +1 -1
- package/dist/test/setup.js +33 -0
- package/dist/test/setup.js.map +1 -1
- package/dist/test/vitest-workspace.d.ts.map +1 -1
- package/dist/test/vitest-workspace.js +2 -11
- package/dist/test/vitest-workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function rlsRoleMessage(database, probe) {
|
|
2
|
+
const flag = probe.superuser ? 'SUPERUSER' : 'BYPASSRLS';
|
|
3
|
+
return (`database "${database}" has rls configured, but its runtime role "${probe.role}" is ${flag} — ` +
|
|
4
|
+
`row-level security policies never apply to it, so tenant isolation is inert. ` +
|
|
5
|
+
`Provision a non-BYPASSRLS, non-superuser application role and point the runtime connection at it ` +
|
|
6
|
+
`(appUrl/appTestUrl, or the url/testUrl var this connection resolved from).`);
|
|
7
|
+
}
|
|
8
|
+
/** The connection whose role actually executes queries under the harness: transaction isolation collapses every role onto the resolved `url` connection; database/container isolation resolves roles normally (`appUrl ?? url`). */
|
|
9
|
+
export function rlsProbeTarget(db, strategy) {
|
|
10
|
+
return strategy === 'transaction' ? db.url : (db.appUrl ?? db.url);
|
|
11
|
+
}
|
|
12
|
+
/** Role flags for `current_user` at `url`. Short-lived probe connection, mirroring validateConnectivity. */
|
|
13
|
+
export async function probeRlsRole(url, timeoutMs = 5000) {
|
|
14
|
+
const { default: postgres } = await import('postgres');
|
|
15
|
+
const sql = postgres(url, {
|
|
16
|
+
max: 1,
|
|
17
|
+
idle_timeout: 1,
|
|
18
|
+
connect_timeout: Math.ceil(timeoutMs / 1000),
|
|
19
|
+
onnotice: () => { },
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
const rows = await sql `SELECT current_user AS role, rolsuper, rolbypassrls FROM pg_roles WHERE rolname = current_user`;
|
|
23
|
+
const row = rows[0];
|
|
24
|
+
if (row === undefined) {
|
|
25
|
+
throw new Error('current_user not found in pg_roles');
|
|
26
|
+
}
|
|
27
|
+
return { role: row.role, superuser: row.rolsuper, bypassRls: row.rolbypassrls };
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await sql.end({ timeout: 1 });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Startup-validation leg: for each database with `rls` configured, the runtime connection's role (`appUrl ?? url`) must not bypass RLS. */
|
|
34
|
+
export async function validateRlsRoles(databases, timeoutMs = 5000) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
const checks = [...databases.entries()]
|
|
37
|
+
.filter(([, db]) => db.rls !== undefined)
|
|
38
|
+
.map(async ([name, db]) => {
|
|
39
|
+
let probe;
|
|
40
|
+
try {
|
|
41
|
+
probe = await probeRlsRole(db.appUrl ?? db.url, timeoutMs);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// An unreachable database is validateConnectivity's finding.
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (probe.superuser || probe.bypassRls) {
|
|
48
|
+
issues.push({ phase: 'database', message: rlsRoleMessage(name, probe) });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
await Promise.all(checks);
|
|
52
|
+
return issues;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=rls-role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rls-role.js","sourceRoot":"","sources":["../../../src/core/validation/rls-role.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,KAAmB;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;IACxD,OAAO,CACL,aAAa,QAAQ,+CAA+C,KAAK,CAAC,IAAI,QAAQ,IAAI,KAAK;QAC/F,+EAA+E;QAC/E,mGAAmG;QACnG,4EAA4E,CAC7E,CAAA;AACH,CAAC;AAED,oOAAoO;AACpO,MAAM,UAAU,cAAc,CAAC,EAAoB,EAAE,QAA2B;IAC9E,OAAO,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC;AAED,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,SAAS,GAAG,IAAI;IAC9D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE;QACxB,GAAG,EAAE,CAAC;QACN,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC5C,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAA,gGAAgG,CAAA;QACtH,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAA2E,CAAA;QAC7F,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,CAAA;IACjF,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,4IAA4I;AAC5I,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAgD,EAChD,SAAS,GAAG,IAAI;IAEhB,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC;SACxC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,KAAmB,CAAA;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;YAC7D,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -6,6 +6,8 @@ export interface ValidationContext {
|
|
|
6
6
|
readonly surfaces?: SurfaceMap | undefined;
|
|
7
7
|
readonly defaultDbAvailable?: boolean | undefined;
|
|
8
8
|
readonly databases?: ReadonlyMap<string, ResolvedDatabase> | undefined;
|
|
9
|
+
/** The database queue migrations are emitted into — queue-table existence is checked there. Undefined skips the check (genuinely ambiguous multi-DB configs fail earlier, at generate). */
|
|
10
|
+
readonly defaultDatabase?: ResolvedDatabase | undefined;
|
|
9
11
|
readonly connectivityCheck?: boolean | undefined;
|
|
10
12
|
}
|
|
11
13
|
export declare function validateStartup(ctx: ValidationContext): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../../src/core/validation/startup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../../src/core/validation/startup.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAA;IACtE,2LAA2L;IAC3L,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAA;IACvD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjD;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B3E"}
|
|
@@ -2,6 +2,8 @@ import { StartupValidationError } from './types.js';
|
|
|
2
2
|
import { validateDomainIntegrity } from './domain.js';
|
|
3
3
|
import { collectSurfaceIssues } from './surfaces.js';
|
|
4
4
|
import { validateConnectivity } from './connectivity.js';
|
|
5
|
+
import { validateQueueTables } from './queue-tables.js';
|
|
6
|
+
import { validateRlsRoles } from './rls-role.js';
|
|
5
7
|
import { definitions } from '../../data/domain/define.js';
|
|
6
8
|
export async function validateStartup(ctx) {
|
|
7
9
|
const issues = [];
|
|
@@ -11,6 +13,10 @@ export async function validateStartup(ctx) {
|
|
|
11
13
|
}
|
|
12
14
|
if (ctx.connectivityCheck !== false && ctx.databases !== undefined) {
|
|
13
15
|
issues.push(...await validateConnectivity(ctx.databases));
|
|
16
|
+
issues.push(...await validateRlsRoles(ctx.databases));
|
|
17
|
+
}
|
|
18
|
+
if (ctx.connectivityCheck !== false && ctx.defaultDatabase !== undefined) {
|
|
19
|
+
issues.push(...await validateQueueTables(ctx.defaultDatabase));
|
|
14
20
|
}
|
|
15
21
|
if (issues.length > 0) {
|
|
16
22
|
throw new StartupValidationError(issues);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/core/validation/startup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/core/validation/startup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAezD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAsB;IAC1D,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAE/E,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,GAAG,oBAAoB,CACrB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,mBAAmB,EACvB,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAC/D,CACF,CAAA;IACH,CAAC;IAED,IAAI,GAAG,CAAC,iBAAiB,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,GAAG,CAAC,iBAAiB,KAAK,KAAK,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
|
package/dist/data/db/pool.d.ts
CHANGED
|
@@ -4,16 +4,25 @@ import type { ResolvedDatabase } from '../../core/config/load.js';
|
|
|
4
4
|
import type { ResolvedObservability } from '../../core/config/load.js';
|
|
5
5
|
/** Which database role a pooled connection authenticates as. `owner` runs migrations/bootstrap and owns tables (bypasses RLS); `app` is the non-owner, non-BYPASSRLS runtime role that RLS policies enforce against. */
|
|
6
6
|
export type ConnectionRole = 'owner' | 'app';
|
|
7
|
+
/** A standalone pooled connection: the raw postgres.js client, its drizzle handle, and a `close()` that ends the pool. */
|
|
7
8
|
export interface ManagedConnection {
|
|
8
9
|
readonly name: string;
|
|
9
10
|
readonly client: postgres.Sql;
|
|
10
11
|
readonly drizzle: PostgresJsDatabase;
|
|
11
12
|
close(): Promise<void>;
|
|
12
13
|
}
|
|
14
|
+
/** Options for `tap()` — pool size (default 1) and idle timeout in seconds. */
|
|
13
15
|
export interface ConnectOptions {
|
|
14
16
|
readonly max?: number;
|
|
15
17
|
readonly idleTimeout?: number;
|
|
16
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Opens a standalone managed connection outside the manifold's pools — the
|
|
21
|
+
* sanctioned door for contexts where `pipe()` structurally cannot resolve:
|
|
22
|
+
* `worker_threads`, detached monitors, one-off scripts. Callers own the
|
|
23
|
+
* lifecycle: always `await conn.close()`.
|
|
24
|
+
*/
|
|
17
25
|
export declare function tap(url: string, options?: ConnectOptions): ManagedConnection;
|
|
26
|
+
/** Builds the pooled connection for one resolved database — used by the manifold's pool manager; consumers outside a managed context use `tap()` or `pool.getOrCreate()`. */
|
|
18
27
|
export declare function createManagedConnection(config: ResolvedDatabase, onClose: () => void, observability?: ResolvedObservability): ManagedConnection;
|
|
19
28
|
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/data/db/pool.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGtE,wNAAwN;AACxN,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAiB5E;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,IAAI,EACnB,aAAa,CAAC,EAAE,qBAAqB,GACpC,iBAAiB,CAoBnB"}
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/data/db/pool.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGtE,wNAAwN;AACxN,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,CAAA;AAE5C,0HAA0H;AAC1H,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAiB5E;AAED,6KAA6K;AAC7K,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,IAAI,EACnB,aAAa,CAAC,EAAE,qBAAqB,GACpC,iBAAiB,CAoBnB"}
|
package/dist/data/db/pool.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import postgres from 'postgres';
|
|
2
2
|
import { drizzle } from '../query/postgres-js/index.js';
|
|
3
3
|
import { createDebugFn } from './instrumentation.js';
|
|
4
|
+
/**
|
|
5
|
+
* Opens a standalone managed connection outside the manifold's pools — the
|
|
6
|
+
* sanctioned door for contexts where `pipe()` structurally cannot resolve:
|
|
7
|
+
* `worker_threads`, detached monitors, one-off scripts. Callers own the
|
|
8
|
+
* lifecycle: always `await conn.close()`.
|
|
9
|
+
*/
|
|
4
10
|
export function tap(url, options) {
|
|
5
11
|
const client = postgres(url, {
|
|
6
12
|
max: options?.max ?? 1,
|
|
@@ -17,6 +23,7 @@ export function tap(url, options) {
|
|
|
17
23
|
},
|
|
18
24
|
};
|
|
19
25
|
}
|
|
26
|
+
/** Builds the pooled connection for one resolved database — used by the manifold's pool manager; consumers outside a managed context use `tap()` or `pool.getOrCreate()`. */
|
|
20
27
|
export function createManagedConnection(config, onClose, observability) {
|
|
21
28
|
const debug = observability ? createDebugFn(observability) : undefined;
|
|
22
29
|
const client = postgres(config.url, {
|
package/dist/data/db/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/data/db/pool.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,OAAO,EAA2B,MAAM,+BAA+B,CAAA;AAGhF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/data/db/pool.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,OAAO,EAA2B,MAAM,+BAA+B,CAAA;AAGhF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAmBpD;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,OAAwB;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC3B,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrF,CAAC,CAAA;IAEF,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE1B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,OAAO,EAAE,EAAE;QACX,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC;AAED,6KAA6K;AAC7K,MAAM,UAAU,uBAAuB,CACrC,MAAwB,EACxB,OAAmB,EACnB,aAAqC;IAErC,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE;QAClC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;QACpB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;QACrC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAA;IAEF,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE1B,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM;QACN,OAAO,EAAE,EAAE;QACX,KAAK,CAAC,KAAK;YACT,OAAO,EAAE,CAAA;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import type { DB } from '../db/index.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* What the tracker table says has been applied, in whichever vocabulary the
|
|
4
|
+
* table currently speaks:
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
6
|
+
* - `tags`: the upgraded shape — applied = the exact set of recorded migration
|
|
7
|
+
* tags (see `applyMigrations`, which owns the membership semantics and the
|
|
8
|
+
* legacy-table upgrade).
|
|
9
|
+
* - `legacy-threshold`: a not-yet-upgraded table (no `tag` column) can only
|
|
10
|
+
* express the old high-water mark, `max(created_at)`. It is read for exactly
|
|
11
|
+
* one purpose: scoping the pre-apply SAFETY check to pending migrations, so
|
|
12
|
+
* a fully-current database with a destructive op in its applied history can
|
|
13
|
+
* still run a clean no-op `migrate`. `applyMigrations` upgrades the table on
|
|
14
|
+
* its next run, after which this variant never appears again.
|
|
15
|
+
*
|
|
16
|
+
* `null` — the table does not exist; nothing has been applied.
|
|
10
17
|
*/
|
|
11
|
-
export
|
|
18
|
+
export type AppliedState = {
|
|
19
|
+
kind: 'tags';
|
|
20
|
+
tags: ReadonlySet<string>;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'legacy-threshold';
|
|
23
|
+
threshold: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function readAppliedState(db: DB, migrationsTable: string): Promise<AppliedState | null>;
|
|
12
26
|
//# sourceMappingURL=applied.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applied.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/applied.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGxC
|
|
1
|
+
{"version":3,"file":"applied.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/applied.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGxC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsBpG"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { sql } from '../query/index.js';
|
|
2
2
|
import { quoteIdentifier } from '../db/identifiers.js';
|
|
3
|
-
|
|
4
|
-
* Reads the `created_at` timestamp of the most recently applied migration.
|
|
5
|
-
*
|
|
6
|
-
* Returns -1 when the migration table does not exist or is empty — i.e. nothing
|
|
7
|
-
* has been applied yet, so every journal entry is pending. The migration table
|
|
8
|
-
* is keyed by `created_at` (the journal entry's `when` timestamp), and
|
|
9
|
-
* `applyMigrations` applies entries strictly in `when` order, so the maximum
|
|
10
|
-
* `created_at` is the high-water mark of applied history.
|
|
11
|
-
*/
|
|
12
|
-
export async function readAppliedThrough(db, migrationsTable) {
|
|
3
|
+
export async function readAppliedState(db, migrationsTable) {
|
|
13
4
|
const quoted = quoteIdentifier(migrationsTable, 'migration table');
|
|
14
5
|
const [reg] = await db.execute(sql `SELECT to_regclass(${quoted}) AS reg`);
|
|
15
6
|
if (reg === undefined || reg['reg'] === null)
|
|
16
|
-
return
|
|
17
|
-
const [
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
return null;
|
|
8
|
+
const [tagColumn] = await db.execute(sql `SELECT 1 AS present FROM pg_attribute
|
|
9
|
+
WHERE attrelid = to_regclass(${quoted}) AND attname = 'tag' AND NOT attisdropped`);
|
|
10
|
+
if (tagColumn === undefined) {
|
|
11
|
+
const [row] = await db.execute(sql.raw(`SELECT max(created_at) AS last_applied FROM ${quoted}`));
|
|
12
|
+
const lastApplied = row?.['last_applied'];
|
|
13
|
+
return {
|
|
14
|
+
kind: 'legacy-threshold',
|
|
15
|
+
threshold: lastApplied === null || lastApplied === undefined ? -1 : Number(lastApplied),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const rows = await db.execute(sql.raw(`SELECT tag FROM ${quoted} WHERE tag IS NOT NULL`));
|
|
19
|
+
return { kind: 'tags', tags: new Set(rows.map((row) => String(row['tag']))) };
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=applied.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applied.js","sourceRoot":"","sources":["../../../src/data/migrate/applied.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"applied.js","sourceRoot":"","sources":["../../../src/data/migrate/applied.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAsBtD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAM,EAAE,eAAuB;IACpE,MAAM,MAAM,GAAG,eAAe,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAA;IAElE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,sBAAsB,MAAM,UAAU,CAAC,CAAA;IACzE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEzD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAClC,GAAG,CAAA;uCACgC,MAAM,4CAA4C,CACtF,CAAA;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC,CAAA;QAChG,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,CAAA;QACzC,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;SACxF,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,MAAM,wBAAwB,CAAC,CAAC,CAAA;IACzF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AASD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AASD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA2F5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,EAAE,CA4CjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDrD;AA4CD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -9,31 +9,61 @@ export async function applyMigrations(options) {
|
|
|
9
9
|
return 0;
|
|
10
10
|
const client = postgres(options.connectionUrl, { max: 1, onnotice: () => { } });
|
|
11
11
|
try {
|
|
12
|
+
const table = quoteIdent(options.migrationsTable);
|
|
13
|
+
// "Applied" is MEMBERSHIP — this exact migration (by tag, verified by
|
|
14
|
+
// content hash) has a tracker row — never a timestamp high-water mark.
|
|
15
|
+
// A threshold silently skips any unapplied migration dated earlier than
|
|
16
|
+
// the newest applied one: a branch merged late, or a second manifold
|
|
17
|
+
// sharing this tracker table whose whole journal predates the first
|
|
18
|
+
// manifold's newest entry (a real production incident for both).
|
|
12
19
|
await client.unsafe(`
|
|
13
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
20
|
+
CREATE TABLE IF NOT EXISTS ${table} (
|
|
14
21
|
id SERIAL PRIMARY KEY,
|
|
15
22
|
hash text NOT NULL,
|
|
16
|
-
created_at bigint
|
|
23
|
+
created_at bigint,
|
|
24
|
+
tag text
|
|
17
25
|
)
|
|
18
26
|
`);
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
// Deployed databases predate the tag column: add it, then recover each
|
|
28
|
+
// legacy row's identity by matching its recorded content hash against the
|
|
29
|
+
// journal's files (min(id) claims one row per tag, so a duplicated hash
|
|
30
|
+
// can't double-claim). Rows matching no current journal entry keep a NULL
|
|
31
|
+
// tag and never participate in membership.
|
|
32
|
+
await client.unsafe(`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS tag text`);
|
|
33
|
+
for (const migration of migrations) {
|
|
34
|
+
await client.unsafe(`UPDATE ${table} SET tag = $1
|
|
35
|
+
WHERE id = (SELECT min(id) FROM ${table} WHERE hash = $2 AND tag IS NULL)`, [migration.tag, migration.hash]);
|
|
36
|
+
}
|
|
37
|
+
await client.unsafe(`CREATE UNIQUE INDEX IF NOT EXISTS ${quoteIdent(`${options.migrationsTable}_tag_key`)} ON ${table} (tag)`);
|
|
38
|
+
const rows = await client.unsafe(`SELECT tag, hash FROM ${table} WHERE tag IS NOT NULL`);
|
|
39
|
+
const appliedHashByTag = new Map(rows.map((row) => [row.tag, row.hash]));
|
|
21
40
|
let applied = 0;
|
|
22
41
|
for (const migration of migrations) {
|
|
23
|
-
|
|
42
|
+
const appliedHash = appliedHashByTag.get(migration.tag);
|
|
43
|
+
if (appliedHash !== undefined) {
|
|
44
|
+
if (appliedHash !== migration.hash) {
|
|
45
|
+
throw new Error(`Migration "${migration.tag}" is recorded as applied in ${options.migrationsTable}, but its ` +
|
|
46
|
+
`file content has changed (recorded sha256 ${appliedHash.slice(0, 12)}…, file is now ` +
|
|
47
|
+
`${migration.hash.slice(0, 12)}…). Applied migrations are immutable history — put schema ` +
|
|
48
|
+
`changes in a NEW migration (\`pipework generate\`) instead of editing an applied one. If two ` +
|
|
49
|
+
`manifolds share this database and both declare a migration tagged "${migration.tag}", that is ` +
|
|
50
|
+
`a schema-level collision no tracker can reconcile — give them separate databases or distinct ` +
|
|
51
|
+
`migrationTable names.`);
|
|
52
|
+
}
|
|
24
53
|
continue;
|
|
54
|
+
}
|
|
25
55
|
if (migration.noTransaction) {
|
|
26
56
|
for (const stmt of migration.statements) {
|
|
27
57
|
await client.unsafe(stmt);
|
|
28
58
|
}
|
|
29
|
-
await client.unsafe(`INSERT INTO ${
|
|
59
|
+
await client.unsafe(`INSERT INTO ${table} ("hash", "created_at", "tag") VALUES ($1, $2, $3)`, [migration.hash, migration.folderMillis, migration.tag]);
|
|
30
60
|
}
|
|
31
61
|
else {
|
|
32
62
|
await client.begin(async (tx) => {
|
|
33
63
|
for (const stmt of migration.statements) {
|
|
34
64
|
await tx.unsafe(stmt);
|
|
35
65
|
}
|
|
36
|
-
await tx.unsafe(`INSERT INTO ${
|
|
66
|
+
await tx.unsafe(`INSERT INTO ${table} ("hash", "created_at", "tag") VALUES ($1, $2, $3)`, [migration.hash, migration.folderMillis, migration.tag]);
|
|
37
67
|
});
|
|
38
68
|
}
|
|
39
69
|
applied++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,qBAAqB,GAAG,4BAA4B,CAAA;AAC1D,MAAM,oBAAoB,GAAG,0BAA0B,CAAA;AA8BvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAqB;IACzD,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAErC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC;mCACW,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/data/migrate/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,qBAAqB,GAAG,4BAA4B,CAAA;AAC1D,MAAM,oBAAoB,GAAG,0BAA0B,CAAA;AA8BvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAqB;IACzD,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAErC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QAEjD,sEAAsE;QACtE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,MAAM,CAAC,MAAM,CAAC;mCACW,KAAK;;;;;;KAMnC,CAAC,CAAA;QACF,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,2CAA2C;QAC3C,MAAM,MAAM,CAAC,MAAM,CAAC,eAAe,KAAK,oCAAoC,CAAC,CAAA;QAC7E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,CAAC,MAAM,CACjB,UAAU,KAAK;2CACoB,KAAK,mCAAmC,EAC3E,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAChC,CAAA;QACH,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,CACjB,qCAAqC,UAAU,CAAC,GAAG,OAAO,CAAC,eAAe,UAAU,CAAC,OAAO,KAAK,QAAQ,CAC1G,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAC9B,yBAAyB,KAAK,wBAAwB,CACvD,CAAA;QACD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEzE,IAAI,OAAO,GAAG,CAAC,CAAA;QAEf,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,WAAW,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,CAAC,GAAG,+BAA+B,OAAO,CAAC,eAAe,YAAY;wBAC3F,6CAA6C,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB;wBACtF,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,4DAA4D;wBAC1F,+FAA+F;wBAC/F,sEAAsE,SAAS,CAAC,GAAG,aAAa;wBAChG,+FAA+F;wBAC/F,uBAAuB,CAC1B,CAAA;gBACH,CAAC;gBACD,SAAQ;YACV,CAAC;YAED,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;oBACxC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC3B,CAAC;gBACD,MAAM,MAAM,CAAC,MAAM,CACjB,eAAe,KAAK,oDAAoD,EACxE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CACxD,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC9B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;wBACxC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBACvB,CAAC;oBACD,MAAM,EAAE,CAAC,MAAM,CACb,eAAe,KAAK,oDAAoD,EACxE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CACxD,CAAA;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,gBAAgB,qBAAqB,CAAA;IACpE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,iCAAiC,WAAW,OAAO;YACnD,qDAAqD,CACtD,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAE5D,CAAA;IAED,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC,GAAG,MAAM,CAAA;QAC/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACzC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;QAEzD,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACvC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACpC,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QAEvC,UAAU,CAAC,IAAI,CAAC;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAChF,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,UAAU;YACV,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,IAAI,OAAO,GAAG,EAAE,CAAA;IAEhB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9D,OAAO,GAAG,EAAE,CAAA;IACd,CAAC,CAAA;IAED,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QAElB,4EAA4E;QAC5E,8DAA8D;QAC9D,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;YACvC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,oBAAoB;gBAAE,KAAK,EAAE,CAAA;YAC9D,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,+DAA+D;QAC/D,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACnC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAC5B,CAAC,GAAG,GAAG,CAAA;YACP,SAAQ;QACV,CAAC;QAED,0EAA0E;QAC1E,oCAAoC;QACpC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAClC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;gBAC9C,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;gBAC1D,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBAC5B,CAAC,GAAG,GAAG,CAAA;gBACP,SAAQ;YACV,CAAC;QACH,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAA;YACP,CAAC,IAAI,CAAC,CAAA;YACN,SAAQ;QACV,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;QACb,CAAC,IAAI,CAAC,CAAA;IACR,CAAC;IAED,KAAK,EAAE,CAAA;IACP,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,KAAa;IACjD,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvB,CAAC,IAAI,CAAC,CAAA;gBACN,SAAQ;YACV,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QACD,CAAC,IAAI,CAAC,CAAA;IACR,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAA;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,KAAa;IAChD,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IACjB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACjB,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5E,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,CAAC,IAAI,CAAC,CAAA;IACR,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAA;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAA;AACrE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MigrationHazard, type Severity } from './safety.js';
|
|
2
|
+
import type { AppliedState } from './applied.js';
|
|
2
3
|
export interface MigrationCheckResult {
|
|
3
4
|
safe: boolean;
|
|
4
5
|
hasDestructive: boolean;
|
|
@@ -11,13 +12,15 @@ export interface MigrationCheckResult {
|
|
|
11
12
|
/**
|
|
12
13
|
* Scans pending migrations for destructive and locking operations.
|
|
13
14
|
*
|
|
14
|
-
* `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* `applied` is what the tracker table records as already applied (see
|
|
16
|
+
* `readAppliedState`); applied entries are skipped — their hazards are
|
|
17
|
+
* history, not a decision the operator still gets to make. Membership is by
|
|
18
|
+
* tag on an upgraded tracker, or by the old `when`-timestamp high-water mark
|
|
19
|
+
* on a tracker `applyMigrations` has not upgraded yet. Omitting `applied`
|
|
20
|
+
* (or passing null — no tracker table) scans every entry, the correct
|
|
21
|
+
* behaviour when nothing is known to be applied.
|
|
19
22
|
*/
|
|
20
|
-
export declare function checkMigrations(migrationsFolder: string,
|
|
23
|
+
export declare function checkMigrations(migrationsFolder: string, applied?: AppliedState | null): MigrationCheckResult;
|
|
21
24
|
export declare function formatCheckResult(result: MigrationCheckResult): string;
|
|
22
25
|
export type { MigrationHazard, Severity };
|
|
23
26
|
//# sourceMappingURL=check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;IACb,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,EAAE,CAAA;CAC5D;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,oBAAoB,CAuC7G;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAyBtE;AAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -4,13 +4,15 @@ import { analyzeSQL, formatHazards } from './safety.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Scans pending migrations for destructive and locking operations.
|
|
6
6
|
*
|
|
7
|
-
* `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* `applied` is what the tracker table records as already applied (see
|
|
8
|
+
* `readAppliedState`); applied entries are skipped — their hazards are
|
|
9
|
+
* history, not a decision the operator still gets to make. Membership is by
|
|
10
|
+
* tag on an upgraded tracker, or by the old `when`-timestamp high-water mark
|
|
11
|
+
* on a tracker `applyMigrations` has not upgraded yet. Omitting `applied`
|
|
12
|
+
* (or passing null — no tracker table) scans every entry, the correct
|
|
13
|
+
* behaviour when nothing is known to be applied.
|
|
12
14
|
*/
|
|
13
|
-
export function checkMigrations(migrationsFolder,
|
|
15
|
+
export function checkMigrations(migrationsFolder, applied) {
|
|
14
16
|
const journalPath = join(migrationsFolder, 'meta', '_journal.json');
|
|
15
17
|
if (!existsSync(journalPath)) {
|
|
16
18
|
return { safe: true, hasDestructive: false, hasLocking: false, fileHazards: [] };
|
|
@@ -19,8 +21,15 @@ export function checkMigrations(migrationsFolder, appliedThrough = -1) {
|
|
|
19
21
|
const fileHazards = [];
|
|
20
22
|
let hasDestructive = false;
|
|
21
23
|
let hasLocking = false;
|
|
24
|
+
const isApplied = (entry) => {
|
|
25
|
+
if (applied === undefined || applied === null)
|
|
26
|
+
return false;
|
|
27
|
+
if (applied.kind === 'tags')
|
|
28
|
+
return applied.tags.has(entry.tag);
|
|
29
|
+
return entry.when <= applied.threshold;
|
|
30
|
+
};
|
|
22
31
|
for (const entry of journal.entries) {
|
|
23
|
-
if (entry
|
|
32
|
+
if (isApplied(entry))
|
|
24
33
|
continue;
|
|
25
34
|
const sqlPath = join(migrationsFolder, `${entry.tag}.sql`);
|
|
26
35
|
if (!existsSync(sqlPath))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/data/migrate/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@ export interface GenerateResult {
|
|
|
5
5
|
snapshotFile: string;
|
|
6
6
|
statements: number;
|
|
7
7
|
}
|
|
8
|
-
export declare function generateForDatabase(dbConfig: ResolvedDatabase,
|
|
8
|
+
export declare function generateForDatabase(dbConfig: ResolvedDatabase, migrationName?: string, internalDefinitions?: () => Promise<Record<string, unknown>>): Promise<GenerateResult>;
|
|
9
9
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAkBjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB;AAgBD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAkBjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB;AAgBD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC3D,OAAO,CAAC,cAAc,CAAC,CA2GzB"}
|
|
@@ -10,7 +10,7 @@ import { buildSnapshot, EMPTY_SNAPSHOT } from './snapshot.js';
|
|
|
10
10
|
import { diffSnapshots, diffOpTableName } from './diff.js';
|
|
11
11
|
import { emitSQL } from './sql-emit.js';
|
|
12
12
|
import { PARTITIONED_TRACE_TABLE_NAMES } from '../../trace/partition/tables.js';
|
|
13
|
-
export async function generateForDatabase(dbConfig,
|
|
13
|
+
export async function generateForDatabase(dbConfig, migrationName, internalDefinitions) {
|
|
14
14
|
if (dbConfig.schema === undefined) {
|
|
15
15
|
throw new ConfigError(`Database "${dbConfig.name}" has no schema path configured.`, `Add a schema path to your database config:\n\n` +
|
|
16
16
|
` databases: {\n` +
|
|
@@ -31,12 +31,14 @@ export async function generateForDatabase(dbConfig, cwd, migrationName, internal
|
|
|
31
31
|
` },\n` +
|
|
32
32
|
` }\n`);
|
|
33
33
|
}
|
|
34
|
-
const schemaFiles = await resolveSchemaFiles(dbConfig.schema,
|
|
34
|
+
const schemaFiles = await resolveSchemaFiles(dbConfig.schema, dbConfig.baseDir);
|
|
35
35
|
if (schemaFiles.length === 0) {
|
|
36
36
|
const patterns = Array.isArray(dbConfig.schema) ? dbConfig.schema.join(', ') : dbConfig.schema;
|
|
37
37
|
throw new ConfigError(`No schema files found for database "${dbConfig.name}".`, `Pattern(s): ${patterns}\n\n Check the "schema" path in your database config.`);
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
// ResolvedDatabase.migrations is absolute (resolved against baseDir at
|
|
40
|
+
// config-load time) — cwd plays no part.
|
|
41
|
+
const migrationsDir = dbConfig.migrations;
|
|
40
42
|
const metaDir = join(migrationsDir, 'meta');
|
|
41
43
|
mkdirSync(metaDir, { recursive: true });
|
|
42
44
|
const imports = {};
|
|
@@ -47,8 +49,13 @@ export async function generateForDatabase(dbConfig, cwd, migrationName, internal
|
|
|
47
49
|
imports[key] = value;
|
|
48
50
|
}
|
|
49
51
|
}
|
|
52
|
+
// A thunk, invoked only AFTER the schema-file import loop: queue tables
|
|
53
|
+
// register at createQueue() time, and a queue module reached only by the
|
|
54
|
+
// schema glob registers during the loop above. Materializing the internal
|
|
55
|
+
// definitions before the imports (as the CLI once did) silently dropped
|
|
56
|
+
// those queues from the migration (D2, subseam audit 2026-07-16).
|
|
50
57
|
if (internalDefinitions !== undefined) {
|
|
51
|
-
for (const [key, value] of Object.entries(internalDefinitions)) {
|
|
58
|
+
for (const [key, value] of Object.entries(await internalDefinitions())) {
|
|
52
59
|
imports[key] = value;
|
|
53
60
|
}
|
|
54
61
|
}
|
|
@@ -133,18 +140,18 @@ function formatTag(idx, name) {
|
|
|
133
140
|
}
|
|
134
141
|
return prefix;
|
|
135
142
|
}
|
|
136
|
-
async function resolveSchemaFiles(schema,
|
|
143
|
+
async function resolveSchemaFiles(schema, baseDir) {
|
|
137
144
|
const patterns = Array.isArray(schema) ? schema : [schema];
|
|
138
145
|
const files = [];
|
|
139
146
|
for (const pattern of patterns) {
|
|
140
|
-
const abs = resolve(
|
|
147
|
+
const abs = resolve(baseDir, pattern);
|
|
141
148
|
if (!pattern.includes('*')) {
|
|
142
149
|
if (existsSync(abs))
|
|
143
150
|
files.push(abs);
|
|
144
151
|
}
|
|
145
152
|
else {
|
|
146
|
-
for await (const match of glob(pattern, { cwd })) {
|
|
147
|
-
files.push(resolve(
|
|
153
|
+
for await (const match of glob(pattern, { cwd: baseDir })) {
|
|
154
|
+
files.push(resolve(baseDir, match));
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/data/migrate/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AA+B/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAA0B,EAC1B,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/data/migrate/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { migrateAll, migrateOne, UnsafeMigrationError, type MigrateResult, type MigrateOptions } from './run.js';
|
|
2
2
|
export { checkMigrations, formatCheckResult, type MigrationCheckResult, type MigrationHazard, type Severity } from './check.js';
|
|
3
|
-
export {
|
|
3
|
+
export { readAppliedState, type AppliedState } from './applied.js';
|
|
4
4
|
export { analyzeSQL } from './safety.js';
|
|
5
5
|
export { generateForDatabase, type GenerateResult } from './generate.js';
|
|
6
6
|
export { postProcessMigration } from './post-process.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC/H,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/migrate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAChH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC/H,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA"}
|