@prisma-next/targets-postgres 0.1.0-pr.38.2 → 0.1.0-pr.39.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/exports/control.d.ts +10 -2
- package/dist/exports/control.js +343 -0
- package/dist/exports/control.js.map +1 -1
- package/package.json +8 -5
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 {
|
|
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:
|
|
14
|
+
declare const postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails>;
|
|
7
15
|
|
|
8
16
|
export { postgresTargetDescriptor as default };
|
package/dist/exports/control.js
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.1.0-pr.39.2",
|
|
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/
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/contract": "0.1.0-pr.
|
|
12
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/family-sql": "0.1.0-pr.39.2",
|
|
10
|
+
"@prisma-next/cli": "0.1.0-pr.39.2",
|
|
11
|
+
"@prisma-next/contract": "0.1.0-pr.39.2",
|
|
12
|
+
"@prisma-next/sql-contract": "0.1.0-pr.39.2",
|
|
13
|
+
"@prisma-next/sql-schema-ir": "0.1.0-pr.39.2",
|
|
14
|
+
"@prisma-next/core-control-plane": "0.1.0-pr.39.2",
|
|
15
|
+
"@prisma-next/core-execution-plane": "0.1.0-pr.39.2"
|
|
13
16
|
},
|
|
14
17
|
"devDependencies": {
|
|
15
18
|
"tsup": "^8.3.0",
|