@abloatai/transaction 0.58.0 → 0.59.1

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.
Files changed (59) hide show
  1. package/dist/client/ablo.d.ts +3 -4
  2. package/dist/client/ablo.d.ts.map +1 -1
  3. package/dist/client/ablo.js.map +1 -1
  4. package/dist/client/surface.d.ts +15 -0
  5. package/dist/client/surface.d.ts.map +1 -0
  6. package/dist/client/surface.js +29 -0
  7. package/dist/client/surface.js.map +1 -0
  8. package/dist/pricing.d.ts +7 -1
  9. package/dist/pricing.d.ts.map +1 -1
  10. package/dist/pricing.js +16 -2
  11. package/dist/pricing.js.map +1 -1
  12. package/dist/schema/ddl.d.ts.map +1 -1
  13. package/dist/schema/ddl.js +1 -1
  14. package/dist/schema/ddl.js.map +1 -1
  15. package/dist/schema/deployment/backfill.d.ts +44 -0
  16. package/dist/schema/deployment/backfill.d.ts.map +1 -0
  17. package/dist/schema/deployment/backfill.js +57 -0
  18. package/dist/schema/deployment/backfill.js.map +1 -0
  19. package/dist/schema/deployment/contracts.d.ts +526 -0
  20. package/dist/schema/deployment/contracts.d.ts.map +1 -0
  21. package/dist/schema/deployment/contracts.js +77 -0
  22. package/dist/schema/deployment/contracts.js.map +1 -0
  23. package/dist/schema/deployment/fingerprint.d.ts +3 -0
  24. package/dist/schema/deployment/fingerprint.d.ts.map +1 -0
  25. package/dist/schema/deployment/fingerprint.js +18 -0
  26. package/dist/schema/deployment/fingerprint.js.map +1 -0
  27. package/dist/schema/deployment/index.d.ts +18 -0
  28. package/dist/schema/deployment/index.d.ts.map +1 -0
  29. package/dist/schema/deployment/index.js +120 -0
  30. package/dist/schema/deployment/index.js.map +1 -0
  31. package/dist/schema/deployment/postgresCatalog.d.ts +39 -0
  32. package/dist/schema/deployment/postgresCatalog.d.ts.map +1 -0
  33. package/dist/schema/deployment/postgresCatalog.js +86 -0
  34. package/dist/schema/deployment/postgresCatalog.js.map +1 -0
  35. package/dist/schema/deployment/reconcile.d.ts +20 -0
  36. package/dist/schema/deployment/reconcile.d.ts.map +1 -0
  37. package/dist/schema/deployment/reconcile.js +318 -0
  38. package/dist/schema/deployment/reconcile.js.map +1 -0
  39. package/dist/schema/deployment/sequence.d.ts +4 -0
  40. package/dist/schema/deployment/sequence.d.ts.map +1 -0
  41. package/dist/schema/deployment/sequence.js +71 -0
  42. package/dist/schema/deployment/sequence.js.map +1 -0
  43. package/dist/schema/index.d.ts +1 -0
  44. package/dist/schema/index.d.ts.map +1 -1
  45. package/dist/schema/index.js +4 -0
  46. package/dist/schema/index.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/client/ablo.ts +2 -2
  49. package/src/client/surface.ts +50 -0
  50. package/src/pricing.ts +16 -2
  51. package/src/schema/ddl.ts +3 -1
  52. package/src/schema/deployment/backfill.ts +88 -0
  53. package/src/schema/deployment/contracts.ts +119 -0
  54. package/src/schema/deployment/fingerprint.ts +13 -0
  55. package/src/schema/deployment/index.ts +132 -0
  56. package/src/schema/deployment/postgresCatalog.ts +131 -0
  57. package/src/schema/deployment/reconcile.ts +335 -0
  58. package/src/schema/deployment/sequence.ts +85 -0
  59. package/src/schema/index.ts +5 -0
@@ -0,0 +1,18 @@
1
+ import type { DeploymentApplyResult, DeploymentObservation, DeploymentStep, SchemaDeploymentPlan } from './contracts.js';
2
+ export * from './contracts.js';
3
+ export { deploymentFingerprint } from './fingerprint.js';
4
+ export { reconcileClientToActive, reconcileDeploymentManifest, reconcilePolicyIntent, reconcileSchemaToDatabase, reconcileSourceToActive, reconcileSourceToActiveResult } from './reconcile.js';
5
+ export { sequenceDeployment } from './sequence.js';
6
+ export * from './backfill.js';
7
+ export * from './postgresCatalog.js';
8
+ /** The one pure reconciliation skeleton every lifecycle surface projects. */
9
+ export declare function buildSchemaDeploymentPlan(observation: DeploymentObservation, now?: string): SchemaDeploymentPlan;
10
+ export interface SchemaDeploymentLifecycleEffects {
11
+ readonly observe: () => Promise<DeploymentObservation>;
12
+ readonly approve?: (plan: SchemaDeploymentPlan) => Promise<boolean>;
13
+ readonly apply?: (step: DeploymentStep, plan: SchemaDeploymentPlan) => Promise<void>;
14
+ readonly record?: (result: Omit<DeploymentApplyResult, 'recorded'>) => Promise<void>;
15
+ }
16
+ /** One observe → reconcile → sequence → approve → apply → verify → record path. */
17
+ export declare function runSchemaDeploymentLifecycle(effects: SchemaDeploymentLifecycleEffects, mode?: 'plan' | 'apply'): Promise<SchemaDeploymentPlan | DeploymentApplyResult>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/deployment/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAqB,qBAAqB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAK5I,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAChM,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AA8BrC,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,qBAAqB,EAAE,GAAG,SAA2B,GAAG,oBAAoB,CAoElI;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAED,mFAAmF;AACnF,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,gCAAgC,EAAE,IAAI,GAAE,MAAM,GAAG,OAAgB,GAAG,OAAO,CAAC,oBAAoB,GAAG,qBAAqB,CAAC,CAYpL"}
@@ -0,0 +1,120 @@
1
+ import { deploymentFingerprint } from './fingerprint.js';
2
+ import { reconcileDeploymentManifest, reconcilePolicyIntent, reconcileSchemaToDatabase, reconcileSourceToActiveResult } from './reconcile.js';
3
+ import { sequenceDeployment } from './sequence.js';
4
+ export * from './contracts.js';
5
+ export { deploymentFingerprint } from './fingerprint.js';
6
+ export { reconcileClientToActive, reconcileDeploymentManifest, reconcilePolicyIntent, reconcileSchemaToDatabase, reconcileSourceToActive, reconcileSourceToActiveResult } from './reconcile.js';
7
+ export { sequenceDeployment } from './sequence.js';
8
+ export * from './backfill.js';
9
+ export * from './postgresCatalog.js';
10
+ function physicalEvidenceKey(finding) {
11
+ return JSON.stringify([
12
+ finding.code,
13
+ finding.category,
14
+ finding.severity,
15
+ finding.phase,
16
+ finding.owner,
17
+ finding.model,
18
+ finding.field,
19
+ finding.column,
20
+ finding.from,
21
+ finding.to,
22
+ finding.message,
23
+ finding.action,
24
+ ]);
25
+ }
26
+ function physicalResourceKey(finding) {
27
+ return JSON.stringify([finding.model, finding.column, finding.field]);
28
+ }
29
+ function planStates(observation) {
30
+ const { schema: _sourceSchema, ...source } = observation.source;
31
+ const active = observation.active ? (({ schema: _activeSchema, ...state }) => state)(observation.active) : null;
32
+ const database = observation.database ? (({ tables: _tables, ...state }) => state)(observation.database) : null;
33
+ return { source, active, database };
34
+ }
35
+ /** The one pure reconciliation skeleton every lifecycle surface projects. */
36
+ export function buildSchemaDeploymentPlan(observation, now = new Date().toISOString()) {
37
+ const sourceToActive = reconcileSourceToActiveResult(observation.active?.schema ?? null, observation.source.schema, observation.intent?.renames, observation.intent?.backfills, observation.database);
38
+ const provision = reconcileSourceToActiveResult(null, observation.source.schema).operations;
39
+ const sourceToDatabase = reconcileSchemaToDatabase(observation.source.schema, observation.database, 'source_to_database');
40
+ const sourcePhysicalEvidence = new Set(sourceToDatabase.map(physicalEvidenceKey));
41
+ const sourcePhysicalResources = new Set(sourceToDatabase.map(physicalResourceKey));
42
+ const activeDatabaseFindings = observation.active
43
+ ? reconcileSchemaToDatabase(observation.active.schema, observation.database, 'active_to_database')
44
+ : [];
45
+ const candidateAlignedActiveFindings = [];
46
+ const activeToDatabase = activeDatabaseFindings.filter((finding) => {
47
+ if (sourcePhysicalEvidence.has(physicalEvidenceKey(finding)))
48
+ return false;
49
+ if (!sourcePhysicalResources.has(physicalResourceKey(finding))) {
50
+ candidateAlignedActiveFindings.push(finding);
51
+ return false;
52
+ }
53
+ return true;
54
+ });
55
+ const candidateAlignmentEvidence = candidateAlignedActiveFindings.length === 0 ? [] : [{
56
+ id: 'active_to_database:candidate_alignment_verified',
57
+ code: 'candidate_alignment_verified',
58
+ category: 'observation',
59
+ severity: 'info',
60
+ direction: 'active_to_database',
61
+ phase: 'verify',
62
+ owner: observation.database?.ownership === 'ablo' ? 'ablo' : 'application_migration',
63
+ from: { activePhysicalDifferences: candidateAlignedActiveFindings.length },
64
+ to: 'source_database_alignment',
65
+ message: `PostgreSQL differs from the active artifact at ${candidateAlignedActiveFindings.length} physical contract location(s), and the candidate source already matches those locations.`,
66
+ action: 'Treat these differences as completed expand work; review the remaining source-to-active compatibility findings before activation.',
67
+ }];
68
+ const findings = [
69
+ ...reconcilePolicyIntent(observation.source.schema),
70
+ ...reconcileDeploymentManifest(observation.intent?.manifest),
71
+ ...sourceToActive.findings,
72
+ ...sourceToDatabase,
73
+ ...activeToDatabase,
74
+ ...candidateAlignmentEvidence,
75
+ ...(observation.supplementalFindings ?? []),
76
+ ];
77
+ const unique = [...new Map(findings.map((finding) => [finding.id, finding])).values()].map((finding) => observation.intent?.acceptDestructive && finding.category === 'destructive_contract' &&
78
+ finding.code !== 'mixed_expand_contract' && finding.code !== 'contract_approval_required' && finding.code !== 'lifecycle_dependency_unsatisfied'
79
+ ? { ...finding, severity: 'warning', action: `${finding.action} Destructive intent was explicitly accepted for this reviewed plan.` }
80
+ : finding);
81
+ const steps = sequenceDeployment(unique);
82
+ const blocking = unique.some(({ severity }) => severity === 'blocker' || severity === 'error');
83
+ const meaningful = unique.some(({ category }) => category !== 'advisory');
84
+ const states = planStates(observation);
85
+ const destructive = unique.some(({ category }) => category === 'destructive_contract');
86
+ const rollbackTarget = observation.active && !destructive ? { schemaId: observation.active.schemaId, version: observation.active.version, hash: observation.active.hash, strategy: 'reactivate_artifact' } : null;
87
+ const fingerprint = deploymentFingerprint({
88
+ target: observation.target,
89
+ states: {
90
+ source: { hash: states.source.hash },
91
+ active: states.active ? { schemaId: states.active.schemaId, version: states.active.version, hash: states.active.hash } : null,
92
+ database: states.database ? { subject: states.database.subject, fingerprint: states.database.fingerprint, ownership: states.database.ownership } : null,
93
+ },
94
+ intent: observation.intent ?? {}, findings: unique, steps, operations: { sourceToActive: sourceToActive.operations, provision },
95
+ });
96
+ return { id: 'ablo-schema-deployment-plan-v1', mode: 'plan', createdAt: now, fingerprint, target: observation.target, states, findings: unique, steps, operations: { sourceToActive: sourceToActive.operations, provision }, outcome: blocking ? 'blocked' : meaningful ? 'ready' : 'aligned', rollbackTarget, recovery: rollbackTarget ? 'rollback' : 'forward_only' };
97
+ }
98
+ /** One observe → reconcile → sequence → approve → apply → verify → record path. */
99
+ export async function runSchemaDeploymentLifecycle(effects, mode = 'plan') {
100
+ const plan = buildSchemaDeploymentPlan(await effects.observe());
101
+ if (mode === 'plan')
102
+ return plan;
103
+ if (plan.outcome === 'blocked')
104
+ throw new Error(`schema deployment plan ${plan.fingerprint} is blocked`);
105
+ if (!effects.apply)
106
+ throw new Error('schema deployment apply effect is not configured');
107
+ if (effects.approve && !(await effects.approve(plan)))
108
+ throw new Error('schema deployment was not approved');
109
+ const appliedStepIds = [];
110
+ for (const step of plan.steps)
111
+ if (step.executableByAblo && step.status === 'ready') {
112
+ await effects.apply(step, plan);
113
+ appliedStepIds.push(step.id);
114
+ }
115
+ const verification = buildSchemaDeploymentPlan(await effects.observe());
116
+ const unrecorded = { plan, appliedStepIds, verification };
117
+ await effects.record?.(unrecorded);
118
+ return { ...unrecorded, recorded: effects.record !== undefined };
119
+ }
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/deployment/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { DatabaseTableSnapshot } from './contracts.js';
2
+ export interface PostgresColumnCatalogRow {
3
+ tableName: string;
4
+ columnName: string;
5
+ dataType: string;
6
+ nullable: boolean;
7
+ defaultValue: string | null;
8
+ primary: boolean;
9
+ uniqueColumn: boolean;
10
+ rowLevelSecurity: boolean;
11
+ forceRowLevelSecurity: boolean;
12
+ replicaIdentity: string;
13
+ publicationMember: boolean;
14
+ }
15
+ export interface PostgresIndexCatalogRow {
16
+ tableName: string;
17
+ indexName: string;
18
+ columns: string[];
19
+ uniqueIndex: boolean;
20
+ valid: boolean;
21
+ ready: boolean;
22
+ predicate: string | null;
23
+ }
24
+ export interface PostgresForeignKeyCatalogRow {
25
+ tableName: string;
26
+ constraintName: string;
27
+ columns: string[];
28
+ referencedSchema: string;
29
+ referencedTable: string;
30
+ referencedColumns: string[];
31
+ validated: boolean;
32
+ }
33
+ export declare const POSTGRES_COLUMN_CATALOG_SQL = "\n SELECT c.relname AS \"tableName\", a.attname AS \"columnName\",\n format_type(a.atttypid, a.atttypmod) AS \"dataType\", NOT a.attnotnull AS nullable,\n pg_get_expr(d.adbin, d.adrelid) AS \"defaultValue\",\n EXISTS (SELECT 1 FROM pg_constraint k WHERE k.conrelid = c.oid AND k.contype = 'p' AND cardinality(k.conkey) = 1 AND a.attnum = ANY(k.conkey)) AS primary,\n EXISTS (SELECT 1 FROM pg_constraint k WHERE k.conrelid = c.oid AND k.contype IN ('p','u') AND cardinality(k.conkey) = 1 AND a.attnum = ANY(k.conkey)) AS \"uniqueColumn\",\n c.relrowsecurity AS \"rowLevelSecurity\", c.relforcerowsecurity AS \"forceRowLevelSecurity\",\n c.relreplident::text AS \"replicaIdentity\",\n EXISTS (SELECT 1 FROM pg_publication_tables p WHERE p.schemaname = n.nspname AND p.tablename = c.relname) AS \"publicationMember\"\n FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace\n JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped\n LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum\n WHERE n.nspname = $1 AND c.relkind IN ('r','p') ORDER BY c.relname, a.attnum\n";
34
+ export declare const POSTGRES_INDEX_CATALOG_SQL = "\n SELECT t.relname AS \"tableName\", i.relname AS \"indexName\",\n ARRAY(SELECT a.attname FROM unnest(ix.indkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = keys.attnum ORDER BY keys.ord) AS columns,\n ix.indisunique AS \"uniqueIndex\", ix.indisvalid AS valid, ix.indisready AS ready,\n pg_get_expr(ix.indpred, ix.indrelid) AS predicate\n FROM pg_index ix JOIN pg_class t ON t.oid = ix.indrelid JOIN pg_class i ON i.oid = ix.indexrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace WHERE n.nspname = $1 ORDER BY t.relname, i.relname\n";
35
+ export declare const POSTGRES_FOREIGN_KEY_CATALOG_SQL = "\n SELECT t.relname AS \"tableName\", c.conname AS \"constraintName\",\n ARRAY(SELECT a.attname FROM unnest(c.conkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = keys.attnum ORDER BY keys.ord) AS columns,\n rn.nspname AS \"referencedSchema\", rt.relname AS \"referencedTable\",\n ARRAY(SELECT a.attname FROM unnest(c.confkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = c.confrelid AND a.attnum = keys.attnum ORDER BY keys.ord) AS \"referencedColumns\",\n c.convalidated AS validated\n FROM pg_constraint c JOIN pg_class t ON t.oid = c.conrelid JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_class rt ON rt.oid = c.confrelid JOIN pg_namespace rn ON rn.oid = rt.relnamespace\n WHERE c.contype = 'f' AND n.nspname = $1 ORDER BY t.relname, c.conname\n";
36
+ export declare function quotePostgresIdentifier(value: string): string;
37
+ export declare function postgresNullCountSql(appSchema: string, table: string, column: string): string;
38
+ export declare function foldPostgresCatalog(appSchema: string, columns: readonly PostgresColumnCatalogRow[], indexes: readonly PostgresIndexCatalogRow[], foreignKeys: readonly PostgresForeignKeyCatalogRow[]): Record<string, DatabaseTableSnapshot>;
39
+ //# sourceMappingURL=postgresCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresCatalog.d.ts","sourceRoot":"","sources":["../../../src/schema/deployment/postgresCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,2BAA2B,snCAavC,CAAC;AAEF,eAAO,MAAM,0BAA0B,ylBAOtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,w1BAS5C,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,SAAS,wBAAwB,EAAE,EAC5C,OAAO,EAAE,SAAS,uBAAuB,EAAE,EAC3C,WAAW,EAAE,SAAS,4BAA4B,EAAE,GACnD,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA6CvC"}
@@ -0,0 +1,86 @@
1
+ export const POSTGRES_COLUMN_CATALOG_SQL = `
2
+ SELECT c.relname AS "tableName", a.attname AS "columnName",
3
+ format_type(a.atttypid, a.atttypmod) AS "dataType", NOT a.attnotnull AS nullable,
4
+ pg_get_expr(d.adbin, d.adrelid) AS "defaultValue",
5
+ EXISTS (SELECT 1 FROM pg_constraint k WHERE k.conrelid = c.oid AND k.contype = 'p' AND cardinality(k.conkey) = 1 AND a.attnum = ANY(k.conkey)) AS primary,
6
+ EXISTS (SELECT 1 FROM pg_constraint k WHERE k.conrelid = c.oid AND k.contype IN ('p','u') AND cardinality(k.conkey) = 1 AND a.attnum = ANY(k.conkey)) AS "uniqueColumn",
7
+ c.relrowsecurity AS "rowLevelSecurity", c.relforcerowsecurity AS "forceRowLevelSecurity",
8
+ c.relreplident::text AS "replicaIdentity",
9
+ EXISTS (SELECT 1 FROM pg_publication_tables p WHERE p.schemaname = n.nspname AND p.tablename = c.relname) AS "publicationMember"
10
+ FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
11
+ JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped
12
+ LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum
13
+ WHERE n.nspname = $1 AND c.relkind IN ('r','p') ORDER BY c.relname, a.attnum
14
+ `;
15
+ export const POSTGRES_INDEX_CATALOG_SQL = `
16
+ SELECT t.relname AS "tableName", i.relname AS "indexName",
17
+ ARRAY(SELECT a.attname FROM unnest(ix.indkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = keys.attnum ORDER BY keys.ord) AS columns,
18
+ ix.indisunique AS "uniqueIndex", ix.indisvalid AS valid, ix.indisready AS ready,
19
+ pg_get_expr(ix.indpred, ix.indrelid) AS predicate
20
+ FROM pg_index ix JOIN pg_class t ON t.oid = ix.indrelid JOIN pg_class i ON i.oid = ix.indexrelid
21
+ JOIN pg_namespace n ON n.oid = t.relnamespace WHERE n.nspname = $1 ORDER BY t.relname, i.relname
22
+ `;
23
+ export const POSTGRES_FOREIGN_KEY_CATALOG_SQL = `
24
+ SELECT t.relname AS "tableName", c.conname AS "constraintName",
25
+ ARRAY(SELECT a.attname FROM unnest(c.conkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = keys.attnum ORDER BY keys.ord) AS columns,
26
+ rn.nspname AS "referencedSchema", rt.relname AS "referencedTable",
27
+ ARRAY(SELECT a.attname FROM unnest(c.confkey) WITH ORDINALITY keys(attnum, ord) JOIN pg_attribute a ON a.attrelid = c.confrelid AND a.attnum = keys.attnum ORDER BY keys.ord) AS "referencedColumns",
28
+ c.convalidated AS validated
29
+ FROM pg_constraint c JOIN pg_class t ON t.oid = c.conrelid JOIN pg_namespace n ON n.oid = t.relnamespace
30
+ JOIN pg_class rt ON rt.oid = c.confrelid JOIN pg_namespace rn ON rn.oid = rt.relnamespace
31
+ WHERE c.contype = 'f' AND n.nspname = $1 ORDER BY t.relname, c.conname
32
+ `;
33
+ export function quotePostgresIdentifier(value) {
34
+ return `"${value.replace(/"/g, '""')}"`;
35
+ }
36
+ export function postgresNullCountSql(appSchema, table, column) {
37
+ const qualified = `${quotePostgresIdentifier(appSchema)}.${quotePostgresIdentifier(table)}`;
38
+ return `SELECT count(*)::int AS n FROM (SELECT 1 FROM ${qualified} WHERE ${quotePostgresIdentifier(column)} IS NULL LIMIT 501) unstamped`;
39
+ }
40
+ export function foldPostgresCatalog(appSchema, columns, indexes, foreignKeys) {
41
+ const tables = {};
42
+ for (const row of columns) {
43
+ const table = tables[row.tableName] ?? {
44
+ schema: appSchema,
45
+ name: row.tableName,
46
+ columns: {},
47
+ indexes: [],
48
+ foreignKeys: [],
49
+ rowLevelSecurity: row.rowLevelSecurity,
50
+ forceRowLevelSecurity: row.forceRowLevelSecurity,
51
+ replicaIdentity: row.replicaIdentity,
52
+ publicationMember: row.publicationMember,
53
+ };
54
+ table.columns[row.columnName] = {
55
+ name: row.columnName,
56
+ dataType: row.dataType,
57
+ nullable: row.nullable,
58
+ default: row.defaultValue,
59
+ primary: row.primary,
60
+ unique: row.uniqueColumn,
61
+ };
62
+ tables[row.tableName] = table;
63
+ }
64
+ for (const row of indexes) {
65
+ tables[row.tableName]?.indexes?.push({
66
+ name: row.indexName,
67
+ columns: row.columns,
68
+ unique: row.uniqueIndex,
69
+ valid: row.valid,
70
+ ready: row.ready,
71
+ predicate: row.predicate,
72
+ });
73
+ }
74
+ for (const row of foreignKeys) {
75
+ tables[row.tableName]?.foreignKeys?.push({
76
+ name: row.constraintName,
77
+ columns: row.columns,
78
+ referencedSchema: row.referencedSchema,
79
+ referencedTable: row.referencedTable,
80
+ referencedColumns: row.referencedColumns,
81
+ validated: row.validated,
82
+ });
83
+ }
84
+ return tables;
85
+ }
86
+ //# sourceMappingURL=postgresCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresCatalog.js","sourceRoot":"","sources":["../../../src/schema/deployment/postgresCatalog.ts"],"names":[],"mappings":"AAoCA,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;CAa1C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;CAOzC,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;CAS/C,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,KAAa,EAAE,MAAc;IACnF,MAAM,SAAS,GAAG,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5F,OAAO,iDAAiD,SAAS,UAAU,uBAAuB,CAAC,MAAM,CAAC,+BAA+B,CAAC;AAC5I,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,OAA4C,EAC5C,OAA2C,EAC3C,WAAoD;IAEpD,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YACrC,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,GAAG,CAAC,SAAS;YACnB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;SACzC,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG;YAC9B,IAAI,EAAE,GAAG,CAAC,UAAU;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,YAAY;SACzB,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC;YACnC,IAAI,EAAE,GAAG,CAAC,SAAS;YACnB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,WAAW;YACvB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC;YACvC,IAAI,EAAE,GAAG,CAAC,cAAc;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type BackfillValue, type MigrationStep, type RenameHints } from '../diff.js';
2
+ import type { SchemaJSON } from '../serialize.js';
3
+ import type { DatabaseSnapshot, DeploymentFinding, DeploymentManifest } from './contracts.js';
4
+ export declare function reconcileSourceToActive(active: SchemaJSON | null, source: SchemaJSON, hints?: RenameHints, backfills?: readonly BackfillValue[], database?: DatabaseSnapshot | null): readonly DeploymentFinding[];
5
+ export declare function reconcileSourceToActiveResult(active: SchemaJSON | null, source: SchemaJSON, hints?: RenameHints, backfills?: readonly BackfillValue[], database?: DatabaseSnapshot | null): {
6
+ operations: readonly MigrationStep[];
7
+ findings: readonly DeploymentFinding[];
8
+ };
9
+ export declare function reconcilePolicyIntent(source: SchemaJSON): readonly DeploymentFinding[];
10
+ export declare function reconcileSchemaToDatabase(schema: SchemaJSON, database: DatabaseSnapshot | null, direction: 'source_to_database' | 'active_to_database'): readonly DeploymentFinding[];
11
+ /** Client-runtime projection of the same compatibility finding contract. */
12
+ export declare function reconcileClientToActive(changed: readonly string[], unpushed: readonly string[], serverLabel: string, fieldDifferences?: readonly {
13
+ model: string;
14
+ field: string;
15
+ direction: 'client_only' | 'active_only' | 'changed';
16
+ detail: string;
17
+ }[]): readonly DeploymentFinding[];
18
+ /** Turns an explicit lifecycle manifest into the same findings consumed by every surface. */
19
+ export declare function reconcileDeploymentManifest(manifest: DeploymentManifest | undefined): readonly DeploymentFinding[];
20
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../src/schema/deployment/reconcile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqD,KAAK,aAAa,EAAwB,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/J,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAuB,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2FnH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,MAAM,EAAE,UAAU,EAClB,KAAK,GAAE,WAAgB,EACvB,SAAS,GAAE,SAAS,aAAa,EAAO,EACxC,QAAQ,GAAE,gBAAgB,GAAG,IAAW,GACvC,SAAS,iBAAiB,EAAE,CAE9B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,MAAM,EAAE,UAAU,EAClB,KAAK,GAAE,WAAgB,EACvB,SAAS,GAAE,SAAS,aAAa,EAAO,EACxC,QAAQ,GAAE,gBAAgB,GAAG,IAAW,GACvC;IAAE,UAAU,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAiFlF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,iBAAiB,EAAE,CAKtF;AAiED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EAAE,SAAS,EAAE,oBAAoB,GAAG,oBAAoB,GAAG,SAAS,iBAAiB,EAAE,CAGrL;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,GAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,aAAa,GAAG,aAAa,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAO,GACvI,SAAS,iBAAiB,EAAE,CAsB9B;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS,iBAAiB,EAAE,CAiClH"}