@prisma-next/targets-postgres 0.1.0-pr.38.2 → 0.1.0-pr.39.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.
package/README.md CHANGED
@@ -17,6 +17,7 @@ Provides the Postgres target descriptor (`TargetDescriptor`) for CLI config. The
17
17
  - **Target Descriptor Export**: Exports the Postgres `TargetDescriptor` for use in CLI configuration files
18
18
  - **Manifest Loading**: Loads the Postgres target manifest from `packs/manifest.json` with capabilities and type information
19
19
  - **Multi-Plane Support**: Provides both migration-plane (CLI) and runtime-plane entry points for the Postgres target
20
+ - **Planner Factory**: Implements the SQL family `SqlControlTargetDescriptor` extension so callers can request a Postgres-specific `MigrationPlanner`
20
21
 
21
22
  This package spans multiple planes:
22
23
  - **Migration plane** (`src/exports/cli.ts`): CLI entry point that exports `TargetDescriptor` for config files
@@ -34,6 +35,11 @@ import postgres from '@prisma-next/targets-postgres/control';
34
35
  // - id: 'postgres'
35
36
  // - family: 'sql'
36
37
  // - manifest: ExtensionPackManifest
38
+
39
+ // When paired with the SQL family, targets can expose planners
40
+ const family = sqlFamilyDescriptor.create({ target: postgres, adapter, driver, extensions: [] });
41
+ const planner = postgres.createPlanner(family);
42
+ const planResult = planner.plan({ contract, schema, policy });
37
43
  ```
38
44
 
39
45
  ### Runtime Plane
@@ -1,8 +1,16 @@
1
- import { ControlTargetDescriptor, ControlTargetInstance } from '@prisma-next/core-control-plane/types';
1
+ import { SqlControlTargetDescriptor } from '@prisma-next/family-sql/control';
2
+
3
+ type OperationClass = 'extension' | 'table' | 'unique' | 'index' | 'foreignKey';
4
+ interface PostgresPlanTargetDetails {
5
+ readonly schema: string;
6
+ readonly objectType: OperationClass;
7
+ readonly name: string;
8
+ readonly table?: string;
9
+ }
2
10
 
3
11
  /**
4
12
  * Postgres target descriptor for CLI config.
5
13
  */
6
- declare const postgresTargetDescriptor: ControlTargetDescriptor<'sql', 'postgres', ControlTargetInstance<'sql', 'postgres'>>;
14
+ declare const postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails>;
7
15
 
8
16
  export { postgresTargetDescriptor as default };
@@ -3,6 +3,346 @@ import { readFileSync } from "fs";
3
3
  import { dirname, join } from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  import { type } from "arktype";
6
+
7
+ // src/core/migrations/planner.ts
8
+ import {
9
+ createMigrationPlan,
10
+ plannerFailure,
11
+ plannerSuccess
12
+ } from "@prisma-next/family-sql/control";
13
+ var DEFAULT_PLANNER_CONFIG = {
14
+ defaultSchema: "public"
15
+ };
16
+ var PG_EXTENSION_SQL = {
17
+ pgvector: "CREATE EXTENSION IF NOT EXISTS vector"
18
+ };
19
+ function createPostgresMigrationPlanner(config = {}) {
20
+ return new PostgresMigrationPlanner({
21
+ ...DEFAULT_PLANNER_CONFIG,
22
+ ...config
23
+ });
24
+ }
25
+ var PostgresMigrationPlanner = class {
26
+ constructor(config) {
27
+ this.config = config;
28
+ }
29
+ plan(options) {
30
+ const schemaName = options.schemaName ?? this.config.defaultSchema;
31
+ const policyResult = this.ensureAdditivePolicy(options.policy);
32
+ if (policyResult) {
33
+ return policyResult;
34
+ }
35
+ const existingTables = Object.keys(options.schema.tables);
36
+ if (existingTables.length > 0) {
37
+ const firstExistingTable = existingTables[0] ?? "";
38
+ return plannerFailure([
39
+ {
40
+ kind: "unsupportedOperation",
41
+ summary: "The Postgres migration planner currently supports only empty databases",
42
+ why: "Remove existing tables or use a future planner mode that handles subsets/supersets.",
43
+ ...firstExistingTable ? { location: { table: firstExistingTable } } : {}
44
+ }
45
+ ]);
46
+ }
47
+ const operations = [];
48
+ operations.push(
49
+ ...this.buildExtensionOperations(options.contract, schemaName),
50
+ ...this.buildTableOperations(options.contract.storage.tables, schemaName),
51
+ ...this.buildUniqueOperations(options.contract.storage.tables, schemaName),
52
+ ...this.buildIndexOperations(options.contract.storage.tables, schemaName),
53
+ ...this.buildForeignKeyOperations(options.contract.storage.tables, schemaName)
54
+ );
55
+ const plan = createMigrationPlan({
56
+ targetId: "postgres",
57
+ policy: options.policy,
58
+ contract: {
59
+ coreHash: options.contract.coreHash,
60
+ ...options.contract.profileHash ? { profileHash: options.contract.profileHash } : {}
61
+ },
62
+ operations
63
+ });
64
+ return plannerSuccess(plan);
65
+ }
66
+ ensureAdditivePolicy(policy) {
67
+ if (!policy.allowedOperationClasses.includes("additive")) {
68
+ return plannerFailure([
69
+ {
70
+ kind: "unsupportedOperation",
71
+ summary: "Init planner requires additive operations be allowed",
72
+ why: 'The init planner only emits additive operations. Update the policy to include "additive".'
73
+ }
74
+ ]);
75
+ }
76
+ return null;
77
+ }
78
+ buildExtensionOperations(contract, schema) {
79
+ const extensions = contract.extensions ?? {};
80
+ const operations = [];
81
+ for (const extensionName of Object.keys(extensions)) {
82
+ const sql = PG_EXTENSION_SQL[extensionName];
83
+ if (!sql) {
84
+ continue;
85
+ }
86
+ const details = this.buildTargetDetails("extension", extensionName, schema);
87
+ operations.push({
88
+ id: `extension.${extensionName}`,
89
+ label: `Enable extension "${extensionName}"`,
90
+ summary: `Ensures the ${extensionName} extension is available`,
91
+ operationClass: "additive",
92
+ target: { id: "postgres", details },
93
+ precheck: [
94
+ {
95
+ description: `verify extension "${extensionName}" is not already enabled`,
96
+ sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${escapeLiteral(
97
+ this.extensionDatabaseName(extensionName)
98
+ )}')`
99
+ }
100
+ ],
101
+ execute: [
102
+ {
103
+ description: `create extension "${extensionName}"`,
104
+ sql
105
+ }
106
+ ],
107
+ postcheck: [
108
+ {
109
+ description: `confirm extension "${extensionName}" is enabled`,
110
+ sql: `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${escapeLiteral(
111
+ this.extensionDatabaseName(extensionName)
112
+ )}')`
113
+ }
114
+ ]
115
+ });
116
+ }
117
+ return operations;
118
+ }
119
+ extensionDatabaseName(extensionName) {
120
+ if (extensionName === "pgvector") {
121
+ return "vector";
122
+ }
123
+ return extensionName;
124
+ }
125
+ buildTableOperations(tables, schema) {
126
+ const operations = [];
127
+ for (const tableName of Object.keys(tables).sort()) {
128
+ const table = tables[tableName];
129
+ const qualified = qualifyTableName(schema, tableName);
130
+ operations.push({
131
+ id: `table.${tableName}`,
132
+ label: `Create table ${tableName}`,
133
+ summary: `Creates table ${tableName} with required columns`,
134
+ operationClass: "additive",
135
+ target: {
136
+ id: "postgres",
137
+ details: this.buildTargetDetails("table", tableName, schema)
138
+ },
139
+ precheck: [
140
+ {
141
+ description: `ensure table "${tableName}" does not exist`,
142
+ sql: `SELECT to_regclass(${toRegclassLiteral(schema, tableName)}) IS NULL`
143
+ }
144
+ ],
145
+ execute: [
146
+ {
147
+ description: `create table "${tableName}"`,
148
+ sql: buildCreateTableSql(qualified, table)
149
+ }
150
+ ],
151
+ postcheck: [
152
+ {
153
+ description: `verify table "${tableName}" exists`,
154
+ sql: `SELECT to_regclass(${toRegclassLiteral(schema, tableName)}) IS NOT NULL`
155
+ }
156
+ ]
157
+ });
158
+ }
159
+ return operations;
160
+ }
161
+ buildUniqueOperations(tables, schema) {
162
+ const operations = [];
163
+ for (const tableName of Object.keys(tables).sort()) {
164
+ const table = tables[tableName];
165
+ if (!table) {
166
+ continue;
167
+ }
168
+ for (const unique of table.uniques) {
169
+ const constraintName = unique.name ?? `${tableName}_${unique.columns.join("_")}_key`;
170
+ operations.push({
171
+ id: `unique.${tableName}.${constraintName}`,
172
+ label: `Add unique constraint ${constraintName} on ${tableName}`,
173
+ summary: `Adds unique constraint ${constraintName} on ${tableName}`,
174
+ operationClass: "additive",
175
+ target: {
176
+ id: "postgres",
177
+ details: this.buildTargetDetails("unique", constraintName, schema, tableName)
178
+ },
179
+ precheck: [
180
+ {
181
+ description: `ensure unique constraint "${constraintName}" is missing`,
182
+ sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(
183
+ constraintName
184
+ )}')`
185
+ }
186
+ ],
187
+ execute: [
188
+ {
189
+ description: `add unique constraint "${constraintName}"`,
190
+ sql: `ALTER TABLE ${qualifyTableName(schema, tableName)}
191
+ ADD CONSTRAINT ${quoteIdentifier(constraintName)}
192
+ UNIQUE (${unique.columns.map(quoteIdentifier).join(", ")})`
193
+ }
194
+ ],
195
+ postcheck: [
196
+ {
197
+ description: `verify unique constraint "${constraintName}" exists`,
198
+ sql: `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(
199
+ constraintName
200
+ )}')`
201
+ }
202
+ ]
203
+ });
204
+ }
205
+ }
206
+ return operations;
207
+ }
208
+ buildIndexOperations(tables, schema) {
209
+ const operations = [];
210
+ for (const tableName of Object.keys(tables).sort()) {
211
+ const table = tables[tableName];
212
+ if (!table) {
213
+ continue;
214
+ }
215
+ for (const index of table.indexes) {
216
+ const indexName = index.name ?? `${tableName}_${index.columns.join("_")}_idx`;
217
+ operations.push({
218
+ id: `index.${tableName}.${indexName}`,
219
+ label: `Create index ${indexName} on ${tableName}`,
220
+ summary: `Creates index ${indexName} on ${tableName}`,
221
+ operationClass: "additive",
222
+ target: {
223
+ id: "postgres",
224
+ details: this.buildTargetDetails("index", indexName, schema, tableName)
225
+ },
226
+ precheck: [
227
+ {
228
+ description: `ensure index "${indexName}" is missing`,
229
+ sql: `SELECT to_regclass(${toRegclassLiteral(schema, indexName)}) IS NULL`
230
+ }
231
+ ],
232
+ execute: [
233
+ {
234
+ description: `create index "${indexName}"`,
235
+ sql: `CREATE INDEX ${quoteIdentifier(indexName)} ON ${qualifyTableName(
236
+ schema,
237
+ tableName
238
+ )} (${index.columns.map(quoteIdentifier).join(", ")})`
239
+ }
240
+ ],
241
+ postcheck: [
242
+ {
243
+ description: `verify index "${indexName}" exists`,
244
+ sql: `SELECT to_regclass(${toRegclassLiteral(schema, indexName)}) IS NOT NULL`
245
+ }
246
+ ]
247
+ });
248
+ }
249
+ }
250
+ return operations;
251
+ }
252
+ buildForeignKeyOperations(tables, schema) {
253
+ const operations = [];
254
+ for (const tableName of Object.keys(tables).sort()) {
255
+ const table = tables[tableName];
256
+ if (!table) {
257
+ continue;
258
+ }
259
+ for (const foreignKey of table.foreignKeys) {
260
+ const fkName = foreignKey.name ?? `${tableName}_${foreignKey.columns.join("_")}_fkey`;
261
+ operations.push({
262
+ id: `foreignKey.${tableName}.${fkName}`,
263
+ label: `Add foreign key ${fkName} on ${tableName}`,
264
+ summary: `Adds foreign key ${fkName} referencing ${foreignKey.references.table}`,
265
+ operationClass: "additive",
266
+ target: {
267
+ id: "postgres",
268
+ details: this.buildTargetDetails("foreignKey", fkName, schema, tableName)
269
+ },
270
+ precheck: [
271
+ {
272
+ description: `ensure foreign key "${fkName}" is missing`,
273
+ sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(
274
+ fkName
275
+ )}')`
276
+ }
277
+ ],
278
+ execute: [
279
+ {
280
+ description: `add foreign key "${fkName}"`,
281
+ sql: `ALTER TABLE ${qualifyTableName(schema, tableName)}
282
+ ADD CONSTRAINT ${quoteIdentifier(fkName)}
283
+ FOREIGN KEY (${foreignKey.columns.map(quoteIdentifier).join(", ")})
284
+ REFERENCES ${qualifyTableName(schema, foreignKey.references.table)} (${foreignKey.references.columns.map(quoteIdentifier).join(", ")})`
285
+ }
286
+ ],
287
+ postcheck: [
288
+ {
289
+ description: `verify foreign key "${fkName}" exists`,
290
+ sql: `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(
291
+ fkName
292
+ )}')`
293
+ }
294
+ ]
295
+ });
296
+ }
297
+ }
298
+ return operations;
299
+ }
300
+ buildTargetDetails(objectType, name, schema, table) {
301
+ return {
302
+ schema,
303
+ objectType,
304
+ name,
305
+ ...table ? { table } : {}
306
+ };
307
+ }
308
+ };
309
+ function buildCreateTableSql(qualifiedTableName, table) {
310
+ const columnDefinitions = Object.entries(table.columns).map(
311
+ ([columnName, column]) => {
312
+ const parts = [
313
+ quoteIdentifier(columnName),
314
+ column.nativeType,
315
+ column.nullable ? "" : "NOT NULL"
316
+ ].filter(Boolean);
317
+ return parts.join(" ");
318
+ }
319
+ );
320
+ const constraintDefinitions = [];
321
+ if (table.primaryKey) {
322
+ constraintDefinitions.push(
323
+ `PRIMARY KEY (${table.primaryKey.columns.map(quoteIdentifier).join(", ")})`
324
+ );
325
+ }
326
+ const allDefinitions = [...columnDefinitions, ...constraintDefinitions];
327
+ return `CREATE TABLE ${qualifiedTableName} (
328
+ ${allDefinitions.join(",\n ")}
329
+ )`;
330
+ }
331
+ function qualifyTableName(schema, table) {
332
+ return `${quoteIdentifier(schema)}.${quoteIdentifier(table)}`;
333
+ }
334
+ function toRegclassLiteral(schema, name) {
335
+ const regclass = `${quoteIdentifier(schema)}.${quoteIdentifier(name)}`;
336
+ return `'${escapeLiteral(regclass)}'`;
337
+ }
338
+ function quoteIdentifier(identifier) {
339
+ return `"${identifier.replace(/"/g, '""')}"`;
340
+ }
341
+ function escapeLiteral(value) {
342
+ return value.replace(/'/g, "''");
343
+ }
344
+
345
+ // src/exports/control.ts
6
346
  var __filename = fileURLToPath(import.meta.url);
7
347
  var __dirname = dirname(__filename);
8
348
  var TypesImportSpecSchema = type({
@@ -46,6 +386,9 @@ var postgresTargetDescriptor = {
46
386
  familyId: "sql",
47
387
  targetId: "postgres"
48
388
  };
389
+ },
390
+ createPlanner() {
391
+ return createPostgresMigrationPlanner();
49
392
  }
50
393
  };
51
394
  var control_default = postgresTargetDescriptor;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/control.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ExtensionPackManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type {\n ControlTargetDescriptor,\n ControlTargetInstance,\n} from '@prisma-next/core-control-plane/types';\nimport { type } from 'arktype';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst TypesImportSpecSchema = type({\n package: 'string',\n named: 'string',\n alias: 'string',\n});\n\nconst ExtensionPackManifestSchema = type({\n id: 'string',\n version: 'string',\n 'targets?': type({ '[string]': type({ 'minVersion?': 'string' }) }),\n 'capabilities?': 'Record<string, unknown>',\n 'types?': type({\n 'codecTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'operationTypes?': type({\n import: TypesImportSpecSchema,\n }),\n }),\n 'operations?': 'unknown[]',\n});\n\n/**\n * Loads the target manifest from packs/manifest.json.\n */\nfunction loadTargetManifest(): ExtensionPackManifest {\n const manifestPath = join(__dirname, '../../packs/manifest.json');\n const manifestJson = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n\n const result = ExtensionPackManifestSchema(manifestJson);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid target manifest structure at ${manifestPath}: ${messages}`);\n }\n\n return result as ExtensionPackManifest;\n}\n\n/**\n * Postgres target descriptor for CLI config.\n */\nconst postgresTargetDescriptor: ControlTargetDescriptor<\n 'sql',\n 'postgres',\n ControlTargetInstance<'sql', 'postgres'>\n> = {\n kind: 'target',\n familyId: 'sql',\n targetId: 'postgres',\n id: 'postgres',\n manifest: loadTargetManifest(),\n create(): ControlTargetInstance<'sql', 'postgres'> {\n return {\n familyId: 'sql',\n targetId: 'postgres',\n };\n },\n};\n\nexport default postgresTargetDescriptor;\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAM9B,SAAS,YAAY;AAErB,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAEpC,IAAM,wBAAwB,KAAK;AAAA,EACjC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AACT,CAAC;AAED,IAAM,8BAA8B,KAAK;AAAA,EACvC,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,YAAY,KAAK,EAAE,YAAY,KAAK,EAAE,eAAe,SAAS,CAAC,EAAE,CAAC;AAAA,EAClE,iBAAiB;AAAA,EACjB,UAAU,KAAK;AAAA,IACb,eAAe,KAAK;AAAA,MAClB,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,mBAAmB,KAAK;AAAA,MACtB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AAAA,EACD,eAAe;AACjB,CAAC;AAKD,SAAS,qBAA4C;AACnD,QAAM,eAAe,KAAK,WAAW,2BAA2B;AAChE,QAAM,eAAe,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAEnE,QAAM,SAAS,4BAA4B,YAAY;AACvD,MAAI,kBAAkB,KAAK,QAAQ;AACjC,UAAM,WAAW,OAAO,IAAI,CAAC,MAA2B,EAAE,OAAO,EAAE,KAAK,IAAI;AAC5E,UAAM,IAAI,MAAM,wCAAwC,YAAY,KAAK,QAAQ,EAAE;AAAA,EACrF;AAEA,SAAO;AACT;AAKA,IAAM,2BAIF;AAAA,EACF,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,UAAU,mBAAmB;AAAA,EAC7B,SAAmD;AACjD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/exports/control.ts","../../src/core/migrations/planner.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ExtensionPackManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { ControlTargetInstance } from '@prisma-next/core-control-plane/types';\nimport type { SqlControlTargetDescriptor } from '@prisma-next/family-sql/control';\nimport { type } from 'arktype';\nimport type { PostgresPlanTargetDetails } from '../core/migrations/planner';\nimport { createPostgresMigrationPlanner } from '../core/migrations/planner';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst TypesImportSpecSchema = type({\n package: 'string',\n named: 'string',\n alias: 'string',\n});\n\nconst ExtensionPackManifestSchema = type({\n id: 'string',\n version: 'string',\n 'targets?': type({ '[string]': type({ 'minVersion?': 'string' }) }),\n 'capabilities?': 'Record<string, unknown>',\n 'types?': type({\n 'codecTypes?': type({\n import: TypesImportSpecSchema,\n }),\n 'operationTypes?': type({\n import: TypesImportSpecSchema,\n }),\n }),\n 'operations?': 'unknown[]',\n});\n\n/**\n * Loads the target manifest from packs/manifest.json.\n */\nfunction loadTargetManifest(): ExtensionPackManifest {\n const manifestPath = join(__dirname, '../../packs/manifest.json');\n const manifestJson = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n\n const result = ExtensionPackManifestSchema(manifestJson);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid target manifest structure at ${manifestPath}: ${messages}`);\n }\n\n return result as ExtensionPackManifest;\n}\n\n/**\n * Postgres target descriptor for CLI config.\n */\nconst postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails> =\n {\n kind: 'target',\n familyId: 'sql',\n targetId: 'postgres',\n id: 'postgres',\n manifest: loadTargetManifest(),\n create(): ControlTargetInstance<'sql', 'postgres'> {\n return {\n familyId: 'sql',\n targetId: 'postgres',\n };\n },\n createPlanner() {\n return createPostgresMigrationPlanner();\n },\n };\n\nexport default postgresTargetDescriptor;\n","import type {\n MigrationPlanner,\n MigrationPlannerPlanOptions,\n MigrationPlanOperation,\n MigrationPolicy,\n} from '@prisma-next/family-sql/control';\nimport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n} from '@prisma-next/family-sql/control';\nimport type {\n SqlContract,\n SqlStorage,\n StorageColumn,\n StorageTable,\n} from '@prisma-next/sql-contract/types';\n\ntype OperationClass = 'extension' | 'table' | 'unique' | 'index' | 'foreignKey';\n\nexport interface PostgresPlanTargetDetails {\n readonly schema: string;\n readonly objectType: OperationClass;\n readonly name: string;\n readonly table?: string;\n}\n\ninterface PlannerConfig {\n readonly defaultSchema: string;\n}\n\nconst DEFAULT_PLANNER_CONFIG: PlannerConfig = {\n defaultSchema: 'public',\n};\n\nconst PG_EXTENSION_SQL: Record<string, string> = {\n pgvector: 'CREATE EXTENSION IF NOT EXISTS vector',\n};\n\nexport function createPostgresMigrationPlanner(\n config: Partial<PlannerConfig> = {},\n): MigrationPlanner<PostgresPlanTargetDetails> {\n return new PostgresMigrationPlanner({\n ...DEFAULT_PLANNER_CONFIG,\n ...config,\n });\n}\n\nclass PostgresMigrationPlanner implements MigrationPlanner<PostgresPlanTargetDetails> {\n constructor(private readonly config: PlannerConfig) {}\n\n plan(options: MigrationPlannerPlanOptions) {\n const schemaName = options.schemaName ?? this.config.defaultSchema;\n const policyResult = this.ensureAdditivePolicy(options.policy);\n if (policyResult) {\n return policyResult;\n }\n\n const existingTables = Object.keys(options.schema.tables);\n if (existingTables.length > 0) {\n const firstExistingTable = existingTables[0] ?? '';\n return plannerFailure([\n {\n kind: 'unsupportedOperation',\n summary: 'The Postgres migration planner currently supports only empty databases',\n why: 'Remove existing tables or use a future planner mode that handles subsets/supersets.',\n ...(firstExistingTable ? { location: { table: firstExistingTable } } : {}),\n },\n ]);\n }\n\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n\n operations.push(\n ...this.buildExtensionOperations(options.contract, schemaName),\n ...this.buildTableOperations(options.contract.storage.tables, schemaName),\n ...this.buildUniqueOperations(options.contract.storage.tables, schemaName),\n ...this.buildIndexOperations(options.contract.storage.tables, schemaName),\n ...this.buildForeignKeyOperations(options.contract.storage.tables, schemaName),\n );\n\n const plan = createMigrationPlan<PostgresPlanTargetDetails>({\n targetId: 'postgres',\n policy: options.policy,\n contract: {\n coreHash: options.contract.coreHash,\n ...(options.contract.profileHash ? { profileHash: options.contract.profileHash } : {}),\n },\n operations,\n });\n\n return plannerSuccess(plan);\n }\n\n private ensureAdditivePolicy(policy: MigrationPolicy) {\n if (!policy.allowedOperationClasses.includes('additive')) {\n return plannerFailure([\n {\n kind: 'unsupportedOperation',\n summary: 'Init planner requires additive operations be allowed',\n why: 'The init planner only emits additive operations. Update the policy to include \"additive\".',\n },\n ]);\n }\n return null;\n }\n\n private buildExtensionOperations(\n contract: SqlContract<SqlStorage>,\n schema: string,\n ): readonly MigrationPlanOperation<PostgresPlanTargetDetails>[] {\n const extensions = contract.extensions ?? {};\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n\n for (const extensionName of Object.keys(extensions)) {\n const sql = PG_EXTENSION_SQL[extensionName];\n if (!sql) {\n continue;\n }\n const details = this.buildTargetDetails('extension', extensionName, schema);\n operations.push({\n id: `extension.${extensionName}`,\n label: `Enable extension \"${extensionName}\"`,\n summary: `Ensures the ${extensionName} extension is available`,\n operationClass: 'additive',\n target: { id: 'postgres', details },\n precheck: [\n {\n description: `verify extension \"${extensionName}\" is not already enabled`,\n sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${escapeLiteral(\n this.extensionDatabaseName(extensionName),\n )}')`,\n },\n ],\n execute: [\n {\n description: `create extension \"${extensionName}\"`,\n sql,\n },\n ],\n postcheck: [\n {\n description: `confirm extension \"${extensionName}\" is enabled`,\n sql: `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${escapeLiteral(\n this.extensionDatabaseName(extensionName),\n )}')`,\n },\n ],\n });\n }\n\n return operations;\n }\n\n private extensionDatabaseName(extensionName: string): string {\n if (extensionName === 'pgvector') {\n return 'vector';\n }\n return extensionName;\n }\n\n private buildTableOperations(\n tables: SqlContract<SqlStorage>['storage']['tables'],\n schema: string,\n ): readonly MigrationPlanOperation<PostgresPlanTargetDetails>[] {\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n for (const tableName of Object.keys(tables).sort()) {\n const table = tables[tableName] as StorageTable;\n const qualified = qualifyTableName(schema, tableName);\n operations.push({\n id: `table.${tableName}`,\n label: `Create table ${tableName}`,\n summary: `Creates table ${tableName} with required columns`,\n operationClass: 'additive',\n target: {\n id: 'postgres',\n details: this.buildTargetDetails('table', tableName, schema),\n },\n precheck: [\n {\n description: `ensure table \"${tableName}\" does not exist`,\n sql: `SELECT to_regclass(${toRegclassLiteral(schema, tableName)}) IS NULL`,\n },\n ],\n execute: [\n {\n description: `create table \"${tableName}\"`,\n sql: buildCreateTableSql(qualified, table),\n },\n ],\n postcheck: [\n {\n description: `verify table \"${tableName}\" exists`,\n sql: `SELECT to_regclass(${toRegclassLiteral(schema, tableName)}) IS NOT NULL`,\n },\n ],\n });\n }\n return operations;\n }\n\n private buildUniqueOperations(\n tables: SqlContract<SqlStorage>['storage']['tables'],\n schema: string,\n ): readonly MigrationPlanOperation<PostgresPlanTargetDetails>[] {\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n for (const tableName of Object.keys(tables).sort()) {\n const table = tables[tableName];\n if (!table) {\n continue;\n }\n for (const unique of table.uniques) {\n const constraintName = unique.name ?? `${tableName}_${unique.columns.join('_')}_key`;\n operations.push({\n id: `unique.${tableName}.${constraintName}`,\n label: `Add unique constraint ${constraintName} on ${tableName}`,\n summary: `Adds unique constraint ${constraintName} on ${tableName}`,\n operationClass: 'additive',\n target: {\n id: 'postgres',\n details: this.buildTargetDetails('unique', constraintName, schema, tableName),\n },\n precheck: [\n {\n description: `ensure unique constraint \"${constraintName}\" is missing`,\n sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(\n constraintName,\n )}')`,\n },\n ],\n execute: [\n {\n description: `add unique constraint \"${constraintName}\"`,\n sql: `ALTER TABLE ${qualifyTableName(schema, tableName)}\nADD CONSTRAINT ${quoteIdentifier(constraintName)}\nUNIQUE (${unique.columns.map(quoteIdentifier).join(', ')})`,\n },\n ],\n postcheck: [\n {\n description: `verify unique constraint \"${constraintName}\" exists`,\n sql: `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(\n constraintName,\n )}')`,\n },\n ],\n });\n }\n }\n return operations;\n }\n\n private buildIndexOperations(\n tables: SqlContract<SqlStorage>['storage']['tables'],\n schema: string,\n ): readonly MigrationPlanOperation<PostgresPlanTargetDetails>[] {\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n for (const tableName of Object.keys(tables).sort()) {\n const table = tables[tableName];\n if (!table) {\n continue;\n }\n for (const index of table.indexes) {\n const indexName = index.name ?? `${tableName}_${index.columns.join('_')}_idx`;\n operations.push({\n id: `index.${tableName}.${indexName}`,\n label: `Create index ${indexName} on ${tableName}`,\n summary: `Creates index ${indexName} on ${tableName}`,\n operationClass: 'additive',\n target: {\n id: 'postgres',\n details: this.buildTargetDetails('index', indexName, schema, tableName),\n },\n precheck: [\n {\n description: `ensure index \"${indexName}\" is missing`,\n sql: `SELECT to_regclass(${toRegclassLiteral(schema, indexName)}) IS NULL`,\n },\n ],\n execute: [\n {\n description: `create index \"${indexName}\"`,\n sql: `CREATE INDEX ${quoteIdentifier(indexName)} ON ${qualifyTableName(\n schema,\n tableName,\n )} (${index.columns.map(quoteIdentifier).join(', ')})`,\n },\n ],\n postcheck: [\n {\n description: `verify index \"${indexName}\" exists`,\n sql: `SELECT to_regclass(${toRegclassLiteral(schema, indexName)}) IS NOT NULL`,\n },\n ],\n });\n }\n }\n return operations;\n }\n\n private buildForeignKeyOperations(\n tables: SqlContract<SqlStorage>['storage']['tables'],\n schema: string,\n ): readonly MigrationPlanOperation<PostgresPlanTargetDetails>[] {\n const operations: MigrationPlanOperation<PostgresPlanTargetDetails>[] = [];\n for (const tableName of Object.keys(tables).sort()) {\n const table = tables[tableName];\n if (!table) {\n continue;\n }\n for (const foreignKey of table.foreignKeys) {\n const fkName = foreignKey.name ?? `${tableName}_${foreignKey.columns.join('_')}_fkey`;\n operations.push({\n id: `foreignKey.${tableName}.${fkName}`,\n label: `Add foreign key ${fkName} on ${tableName}`,\n summary: `Adds foreign key ${fkName} referencing ${foreignKey.references.table}`,\n operationClass: 'additive',\n target: {\n id: 'postgres',\n details: this.buildTargetDetails('foreignKey', fkName, schema, tableName),\n },\n precheck: [\n {\n description: `ensure foreign key \"${fkName}\" is missing`,\n sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(\n fkName,\n )}')`,\n },\n ],\n execute: [\n {\n description: `add foreign key \"${fkName}\"`,\n sql: `ALTER TABLE ${qualifyTableName(schema, tableName)}\nADD CONSTRAINT ${quoteIdentifier(fkName)}\nFOREIGN KEY (${foreignKey.columns.map(quoteIdentifier).join(', ')})\nREFERENCES ${qualifyTableName(schema, foreignKey.references.table)} (${foreignKey.references.columns\n .map(quoteIdentifier)\n .join(', ')})`,\n },\n ],\n postcheck: [\n {\n description: `verify foreign key \"${fkName}\" exists`,\n sql: `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapeLiteral(\n fkName,\n )}')`,\n },\n ],\n });\n }\n }\n return operations;\n }\n\n private buildTargetDetails(\n objectType: OperationClass,\n name: string,\n schema: string,\n table?: string,\n ): PostgresPlanTargetDetails {\n return {\n schema,\n objectType,\n name,\n ...(table ? { table } : {}),\n };\n }\n}\n\nfunction buildCreateTableSql(qualifiedTableName: string, table: StorageTable): string {\n const columnDefinitions = Object.entries(table.columns).map(\n ([columnName, column]: [string, StorageColumn]) => {\n const parts = [\n quoteIdentifier(columnName),\n column.nativeType,\n column.nullable ? '' : 'NOT NULL',\n ].filter(Boolean);\n return parts.join(' ');\n },\n );\n\n const constraintDefinitions: string[] = [];\n if (table.primaryKey) {\n constraintDefinitions.push(\n `PRIMARY KEY (${table.primaryKey.columns.map(quoteIdentifier).join(', ')})`,\n );\n }\n\n const allDefinitions = [...columnDefinitions, ...constraintDefinitions];\n return `CREATE TABLE ${qualifiedTableName} (\\n ${allDefinitions.join(',\\n ')}\\n)`;\n}\n\nfunction qualifyTableName(schema: string, table: string): string {\n return `${quoteIdentifier(schema)}.${quoteIdentifier(table)}`;\n}\n\nfunction toRegclassLiteral(schema: string, name: string): string {\n const regclass = `${quoteIdentifier(schema)}.${quoteIdentifier(name)}`;\n return `'${escapeLiteral(regclass)}'`;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction escapeLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,15 +1,18 @@
1
1
  {
2
2
  "name": "@prisma-next/targets-postgres",
3
- "version": "0.1.0-pr.38.2",
3
+ "version": "0.1.0-pr.39.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Postgres target pack for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.0.0",
9
- "@prisma-next/cli": "0.1.0-pr.38.2",
10
- "@prisma-next/core-control-plane": "0.1.0-pr.38.2",
11
- "@prisma-next/contract": "0.1.0-pr.38.2",
12
- "@prisma-next/core-execution-plane": "0.1.0-pr.38.2"
9
+ "@prisma-next/cli": "0.1.0-pr.39.1",
10
+ "@prisma-next/family-sql": "0.1.0-pr.39.1",
11
+ "@prisma-next/contract": "0.1.0-pr.39.1",
12
+ "@prisma-next/sql-contract": "0.1.0-pr.39.1",
13
+ "@prisma-next/sql-schema-ir": "0.1.0-pr.39.1",
14
+ "@prisma-next/core-control-plane": "0.1.0-pr.39.1",
15
+ "@prisma-next/core-execution-plane": "0.1.0-pr.39.1"
13
16
  },
14
17
  "devDependencies": {
15
18
  "tsup": "^8.3.0",