@prisma-next/target-postgres 0.15.0-dev.17 → 0.15.0-dev.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{authoring-CGe-7Yr9.mjs → authoring-34L18kA1.mjs} +3 -3
- package/dist/{authoring-CGe-7Yr9.mjs.map → authoring-34L18kA1.mjs.map} +1 -1
- package/dist/{codec-ids-CI144z7g.d.mts → codec-ids-CGmnXDxH.d.mts} +3 -2
- package/dist/codec-ids-CGmnXDxH.d.mts.map +1 -0
- package/dist/{codec-ids-B10ZZHzw.mjs → codec-ids-D3G8K0YM.mjs} +3 -2
- package/dist/codec-ids-D3G8K0YM.mjs.map +1 -0
- package/dist/codec-ids.d.mts +2 -2
- package/dist/codec-ids.mjs +2 -2
- package/dist/{codec-types-CTfT4U4O.d.mts → codec-types-CTlPXzZ9.d.mts} +2 -2
- package/dist/{codec-types-CTfT4U4O.d.mts.map → codec-types-CTlPXzZ9.d.mts.map} +1 -1
- package/dist/codec-types.d.mts +1 -1
- package/dist/{codecs-D7W9O0Xx.d.mts → codecs-B-76qSBx.d.mts} +35 -6
- package/dist/codecs-B-76qSBx.d.mts.map +1 -0
- package/dist/{codecs-DRbb26Or.mjs → codecs-TCsGgW-Y.mjs} +77 -5
- package/dist/codecs-TCsGgW-Y.mjs.map +1 -0
- package/dist/codecs.d.mts +2 -2
- package/dist/codecs.mjs +2 -2
- package/dist/contract-free.mjs +3 -3
- package/dist/{control-policy-DaLdbcYE.mjs → control-policy-42vVVpTL.mjs} +4 -4
- package/dist/{control-policy-DaLdbcYE.mjs.map → control-policy-42vVVpTL.mjs.map} +1 -1
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +63 -13
- package/dist/control.mjs.map +1 -1
- package/dist/{ddl-GTTOvjx_.mjs → ddl-DHXKzQ99.mjs} +3 -3
- package/dist/{ddl-GTTOvjx_.mjs.map → ddl-DHXKzQ99.mjs.map} +1 -1
- package/dist/default-normalizer-B9ZUiyUE.mjs +264 -0
- package/dist/default-normalizer-B9ZUiyUE.mjs.map +1 -0
- package/dist/default-normalizer.d.mts +14 -1
- package/dist/default-normalizer.d.mts.map +1 -1
- package/dist/default-normalizer.mjs +2 -248
- package/dist/{descriptor-meta-Bxw2GNog.mjs → descriptor-meta-qubYaxQA.mjs} +9 -4
- package/dist/descriptor-meta-qubYaxQA.mjs.map +1 -0
- package/dist/{diff-database-schema-oY3brcLj.mjs → diff-database-schema-CrYO0j4_.mjs} +9 -6
- package/dist/diff-database-schema-CrYO0j4_.mjs.map +1 -0
- package/dist/diff-database-schema.d.mts.map +1 -1
- package/dist/diff-database-schema.mjs +1 -1
- package/dist/issue-planner.mjs +1 -1
- package/dist/migration.mjs +2 -2
- package/dist/{op-factory-call-tBcLo_B8.mjs → op-factory-call-rCP7TXTh.mjs} +3 -3
- package/dist/{op-factory-call-tBcLo_B8.mjs.map → op-factory-call-rCP7TXTh.mjs.map} +1 -1
- package/dist/op-factory-call.mjs +1 -1
- package/dist/pack.d.mts +15 -2
- package/dist/pack.d.mts.map +1 -1
- package/dist/pack.mjs +1 -1
- package/dist/{planner-BWmH0NqM.mjs → planner-Bj7MTEeR.mjs} +7 -7
- package/dist/{planner-BWmH0NqM.mjs.map → planner-Bj7MTEeR.mjs.map} +1 -1
- package/dist/{planner-produced-postgres-migration-BV3WLLXl.mjs → planner-produced-postgres-migration-iHdZVN5i.mjs} +2 -2
- package/dist/{planner-produced-postgres-migration-BV3WLLXl.mjs.map → planner-produced-postgres-migration-iHdZVN5i.mjs.map} +1 -1
- package/dist/planner-produced-postgres-migration.mjs +1 -1
- package/dist/{planner-sql-checks-zqNfs2XZ.mjs → planner-sql-checks-BuB877wH.mjs} +2 -2
- package/dist/{planner-sql-checks-zqNfs2XZ.mjs.map → planner-sql-checks-BuB877wH.mjs.map} +1 -1
- package/dist/planner-sql-checks.mjs +1 -1
- package/dist/planner.mjs +2 -2
- package/dist/{postgres-contract-view-CWsxTdoA.mjs → postgres-contract-view-DebHMqGR.mjs} +4 -4
- package/dist/{postgres-contract-view-CWsxTdoA.mjs.map → postgres-contract-view-DebHMqGR.mjs.map} +1 -1
- package/dist/{postgres-migration-1_ZoswMV.mjs → postgres-migration-fxgsblW1.mjs} +4 -4
- package/dist/{postgres-migration-1_ZoswMV.mjs.map → postgres-migration-fxgsblW1.mjs.map} +1 -1
- package/dist/{postgres-schema-Cm4DtiGA.mjs → postgres-schema-CewLYHB7.mjs} +2 -2
- package/dist/{postgres-schema-Cm4DtiGA.mjs.map → postgres-schema-CewLYHB7.mjs.map} +1 -1
- package/dist/{resolve-ddl-schema-XyBaaenM.mjs → resolve-ddl-schema-D0wi_P9Q.mjs} +2 -2
- package/dist/{resolve-ddl-schema-XyBaaenM.mjs.map → resolve-ddl-schema-D0wi_P9Q.mjs.map} +1 -1
- package/dist/runtime.mjs +1 -1
- package/dist/schema-ir-annotations.mjs +1 -1
- package/dist/types.mjs +1 -1
- package/package.json +20 -20
- package/src/core/codec-helpers.ts +53 -1
- package/src/core/codec-ids.ts +1 -0
- package/src/core/codecs.ts +56 -3
- package/src/core/default-normalizer.ts +22 -0
- package/src/core/descriptor-meta.ts +2 -0
- package/src/core/index-types.ts +15 -0
- package/src/core/migrations/diff-database-schema.ts +3 -0
- package/src/core/psl-infer/infer-psl-contract.ts +130 -12
- package/src/exports/codecs.ts +2 -0
- package/src/exports/control.ts +2 -0
- package/src/exports/default-normalizer.ts +1 -1
- package/dist/codec-ids-B10ZZHzw.mjs.map +0 -1
- package/dist/codec-ids-CI144z7g.d.mts.map +0 -1
- package/dist/codecs-D7W9O0Xx.d.mts.map +0 -1
- package/dist/codecs-DRbb26Or.mjs.map +0 -1
- package/dist/default-normalizer.mjs.map +0 -1
- package/dist/descriptor-meta-Bxw2GNog.mjs.map +0 -1
- package/dist/diff-database-schema-oY3brcLj.mjs.map +0 -1
package/dist/control.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as postgresResolveDefault } from "./default-normalizer-B9ZUiyUE.mjs";
|
|
2
|
+
import { t as postgresTargetDescriptorMeta } from "./descriptor-meta-qubYaxQA.mjs";
|
|
2
3
|
import { a as postgresDiffSubjectGranularity, i as postgresDiffSubjectEntityKind } from "./postgres-table-schema-node-D6LvInCe.mjs";
|
|
3
4
|
import { i as PostgresDatabaseSchemaNode } from "./postgres-role-schema-node-bg32e7I-.mjs";
|
|
4
|
-
import { n as diffPostgresSchema, r as contractToPostgresDatabaseSchemaNode } from "./diff-database-schema-
|
|
5
|
+
import { n as diffPostgresSchema, r as contractToPostgresDatabaseSchemaNode } from "./diff-database-schema-CrYO0j4_.mjs";
|
|
5
6
|
import { r as renderDefaultLiteral } from "./planner-ddl-builders-BKlmGDJl.mjs";
|
|
6
|
-
import { n as PostgresContractSerializer } from "./postgres-contract-view-
|
|
7
|
-
import { t as createPostgresMigrationPlanner } from "./planner-
|
|
7
|
+
import { n as PostgresContractSerializer } from "./postgres-contract-view-DebHMqGR.mjs";
|
|
8
|
+
import { t as createPostgresMigrationPlanner } from "./planner-Bj7MTEeR.mjs";
|
|
8
9
|
import { UNBOUND_NAMESPACE_ID, coordinateKey, elementCoordinates } from "@prisma-next/framework-components/ir";
|
|
9
10
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
10
11
|
import { buildNativeTypeExpander, runnerFailure, runnerSuccess } from "@prisma-next/family-sql/control";
|
|
@@ -691,6 +692,7 @@ function resolveForeignKeys(tables, owners) {
|
|
|
691
692
|
const resultTables = {};
|
|
692
693
|
const extraRelationsByTable = /* @__PURE__ */ new Map();
|
|
693
694
|
const crossSpaceFieldNamesByTable = /* @__PURE__ */ new Map();
|
|
695
|
+
const danglingForeignKeysByTable = /* @__PURE__ */ new Map();
|
|
694
696
|
for (const [tableName, table] of Object.entries(tables)) {
|
|
695
697
|
const keptForeignKeys = [];
|
|
696
698
|
for (const fk of table.foreignKeys) {
|
|
@@ -718,6 +720,16 @@ function resolveForeignKeys(tables, owners) {
|
|
|
718
720
|
}
|
|
719
721
|
}
|
|
720
722
|
if (tables[fk.referencedTable] !== void 0) keptForeignKeys.push(fk);
|
|
723
|
+
else {
|
|
724
|
+
const dangling = {
|
|
725
|
+
columns: fk.columns,
|
|
726
|
+
referencedSchema: fk.referencedSchema,
|
|
727
|
+
referencedTable: fk.referencedTable
|
|
728
|
+
};
|
|
729
|
+
const existingDangling = danglingForeignKeysByTable.get(tableName);
|
|
730
|
+
if (existingDangling) existingDangling.push(dangling);
|
|
731
|
+
else danglingForeignKeysByTable.set(tableName, [dangling]);
|
|
732
|
+
}
|
|
721
733
|
}
|
|
722
734
|
resultTables[tableName] = keptForeignKeys.length === table.foreignKeys.length ? table : new SqlTableIR({
|
|
723
735
|
...table,
|
|
@@ -727,7 +739,8 @@ function resolveForeignKeys(tables, owners) {
|
|
|
727
739
|
return {
|
|
728
740
|
tables: resultTables,
|
|
729
741
|
extraRelationsByTable,
|
|
730
|
-
crossSpaceFieldNamesByTable
|
|
742
|
+
crossSpaceFieldNamesByTable,
|
|
743
|
+
danglingForeignKeysByTable
|
|
731
744
|
};
|
|
732
745
|
}
|
|
733
746
|
/**
|
|
@@ -801,7 +814,7 @@ function inferPostgresPslContract(tree, describedContracts) {
|
|
|
801
814
|
if (contentNamespaces.size > 1) throw new Error(`contract infer: native enum adoption with content across multiple schemas is not yet supported (single-namespace PSL inference emits one \`namespace { … }\` block; multi-namespace output is a later slice). Schemas: ${[...contentNamespaces].sort().join(", ")}.`);
|
|
802
815
|
wrapNamespaceName = [...contentNamespaces][0];
|
|
803
816
|
}
|
|
804
|
-
const { tables: resolvedTables, extraRelationsByTable, crossSpaceFieldNamesByTable } = resolveForeignKeys(tables, owners);
|
|
817
|
+
const { tables: resolvedTables, extraRelationsByTable, crossSpaceFieldNamesByTable, danglingForeignKeysByTable } = resolveForeignKeys(tables, owners);
|
|
805
818
|
const schemaIR = new SqlSchemaIR({ tables: resolvedTables });
|
|
806
819
|
const enumTypeNames = new Set(enumDefinitions.keys());
|
|
807
820
|
if (wrapNamespaceName !== void 0) for (const typeName of enumDefinitions.keys()) enumTypeNames.add(`${wrapNamespaceName}.${typeName}`);
|
|
@@ -816,12 +829,13 @@ function inferPostgresPslContract(tree, describedContracts) {
|
|
|
816
829
|
...enumDefinitions.size > 0 ? { enumInfo } : {}
|
|
817
830
|
}, {
|
|
818
831
|
extraRelationsByTable,
|
|
819
|
-
crossSpaceFieldNamesByTable
|
|
832
|
+
crossSpaceFieldNamesByTable,
|
|
833
|
+
danglingForeignKeysByTable
|
|
820
834
|
}, wrapNamespaceName);
|
|
821
835
|
}
|
|
822
836
|
function buildPslDocumentAst(schemaIR, options, foreignKeyExtras, namespaceName) {
|
|
823
837
|
const { typeMap, defaultMapping, parseRawDefault: rawDefaultParser } = options;
|
|
824
|
-
const { extraRelationsByTable, crossSpaceFieldNamesByTable } = foreignKeyExtras;
|
|
838
|
+
const { extraRelationsByTable, crossSpaceFieldNamesByTable, danglingForeignKeysByTable } = foreignKeyExtras;
|
|
825
839
|
const modelNames = buildTopLevelNameMap(Object.keys(schemaIR.tables), toModelName, "model", "table");
|
|
826
840
|
const modelNameMap = new Map([...modelNames].map(([tableName, result]) => [tableName, result.name]));
|
|
827
841
|
const { enumNameMap: bareEnumNameMap, enumBlocks } = buildNativeEnumBlocks(options.enumInfo?.definitions ?? /* @__PURE__ */ new Map(), modelNames);
|
|
@@ -832,7 +846,7 @@ function buildPslDocumentAst(schemaIR, options, foreignKeyExtras, namespaceName)
|
|
|
832
846
|
const { relationsByTable } = inferRelations(schemaIR.tables, modelNameMap);
|
|
833
847
|
const namedTypes = seedNamedTypeRegistry(schemaIR, typeMap, enumNameMap, reservedNamedTypeNames);
|
|
834
848
|
const models = [];
|
|
835
|
-
for (const table of Object.values(schemaIR.tables)) models.push(buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes, defaultMapping, rawDefaultParser, [...relationsByTable.get(table.name) ?? [], ...extraRelationsByTable.get(table.name) ?? []]));
|
|
849
|
+
for (const table of Object.values(schemaIR.tables)) models.push(buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes, defaultMapping, rawDefaultParser, [...relationsByTable.get(table.name) ?? [], ...extraRelationsByTable.get(table.name) ?? []], danglingForeignKeysByTable.get(table.name) ?? []));
|
|
836
850
|
const sortedModels = topologicalSort(models, schemaIR.tables, modelNameMap);
|
|
837
851
|
const namedTypeEntries = [...namedTypes.entriesByKey.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
838
852
|
const types = namedTypeEntries.length > 0 ? {
|
|
@@ -909,7 +923,7 @@ function buildNativeEnumBlock(name, typeName, values) {
|
|
|
909
923
|
span: SYNTHETIC_SPAN
|
|
910
924
|
};
|
|
911
925
|
}
|
|
912
|
-
function buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes, defaultMapping, rawDefaultParser, relationFields) {
|
|
926
|
+
function buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes, defaultMapping, rawDefaultParser, relationFields, danglingForeignKeys) {
|
|
913
927
|
const { name: modelName, map: mapName } = toModelName(table.name);
|
|
914
928
|
const fieldNameMap = fieldNamesByTable.get(table.name);
|
|
915
929
|
const pkColumns = new Set(table.primaryKey?.columns ?? []);
|
|
@@ -939,7 +953,10 @@ function buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes,
|
|
|
939
953
|
modelAttributes.push(buildModelConstraintAttribute("index", indexFieldNames, index.name, index.type));
|
|
940
954
|
}
|
|
941
955
|
if (mapName) modelAttributes.push(buildMapAttribute("model", mapName));
|
|
942
|
-
const
|
|
956
|
+
const warnings = [];
|
|
957
|
+
if (!table.primaryKey) warnings.push("This table has no primary key in the database");
|
|
958
|
+
if (danglingForeignKeys.length > 0) warnings.push(buildDanglingForeignKeyWarning(danglingForeignKeys, fieldNamesByTable, table.name));
|
|
959
|
+
const comment = warnings.length > 0 ? `// WARNING: ${warnings.join(" ")}` : void 0;
|
|
943
960
|
return {
|
|
944
961
|
kind: "model",
|
|
945
962
|
name: modelName,
|
|
@@ -949,6 +966,20 @@ function buildModel(table, typeMap, enumNameMap, fieldNamesByTable, namedTypes,
|
|
|
949
966
|
...comment !== void 0 ? { comment } : {}
|
|
950
967
|
};
|
|
951
968
|
}
|
|
969
|
+
/**
|
|
970
|
+
* Explains a foreign key `resolveForeignKeys` dropped as dangling: the
|
|
971
|
+
* database enforces it, but its target lives outside the introspected
|
|
972
|
+
* schema, so infer has no model to point a relation at. The suggested fix
|
|
973
|
+
* targets the common cause — an unconfigured extension pack's schema
|
|
974
|
+
* (e.g. Supabase's `auth`).
|
|
975
|
+
*/
|
|
976
|
+
function buildDanglingForeignKeyWarning(danglingForeignKeys, fieldNamesByTable, tableName) {
|
|
977
|
+
return `Foreign key ${danglingForeignKeys.map((fk) => {
|
|
978
|
+
const fieldNames = fk.columns.map((columnName) => resolveColumnFieldName(fieldNamesByTable, tableName, columnName));
|
|
979
|
+
const target = fk.referencedSchema !== void 0 ? `${fk.referencedSchema}.${fk.referencedTable}` : fk.referencedTable;
|
|
980
|
+
return `"${fieldNames.join(", ")}" -> "${target}"`;
|
|
981
|
+
}).join(", ")} exists in the database, but its target schema is outside the introspected scope, so no relation field was generated. If the target schema is described by an extension pack, add it to extensionPacks and re-run infer.`;
|
|
982
|
+
}
|
|
952
983
|
function buildScalarField(column, table, typeMap, enumNameMap, fieldNameMap, namedTypes, defaultMapping, rawDefaultParser, pkColumns, isSinglePk, singlePkConstraintName, uniqueColumns) {
|
|
953
984
|
const resolvedField = fieldNameMap?.get(column.name);
|
|
954
985
|
const fieldName = resolvedField?.fieldName ?? toFieldName(column.name).name;
|
|
@@ -983,7 +1014,11 @@ function buildScalarField(column, table, typeMap, enumNameMap, fieldNameMap, nam
|
|
|
983
1014
|
const attributes = [];
|
|
984
1015
|
const isId = isSinglePk && pkColumns.has(column.name);
|
|
985
1016
|
if (isId) attributes.push(buildSimpleConstraintFieldAttribute("id", singlePkConstraintName));
|
|
986
|
-
if (column.default
|
|
1017
|
+
if (column.default === void 0 && column.resolvedDefault?.kind === "function" && column.resolvedDefault.expression === "autoincrement()") attributes.push(parseDefaultAttributeString("@default(autoincrement())"));
|
|
1018
|
+
else if (column.many === true && column.resolvedDefault?.kind === "literal") {
|
|
1019
|
+
const formatted = Array.isArray(column.resolvedDefault.value) ? formatPslListLiteralValue(column.resolvedDefault.value) : void 0;
|
|
1020
|
+
if (formatted !== void 0) attributes.push(parseDefaultAttributeString(`@default(${formatted})`));
|
|
1021
|
+
} else if (column.default !== void 0) {
|
|
987
1022
|
const parsed = parseColumnDefault(column.default, column.nativeType, rawDefaultParser);
|
|
988
1023
|
if (parsed) {
|
|
989
1024
|
const result = mapDefault(parsed, defaultMapping);
|
|
@@ -1094,6 +1129,20 @@ function escapePslString(value) {
|
|
|
1094
1129
|
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
|
|
1095
1130
|
}
|
|
1096
1131
|
/**
|
|
1132
|
+
* Formats a resolved literal-default array as PSL literal-list syntax
|
|
1133
|
+
* (`[1, 2, 3]`, `["a", "b"]`, `[]`). PSL's list-literal grammar only accepts
|
|
1134
|
+
* string/number/boolean elements, so any other element (e.g. `null`, a
|
|
1135
|
+
* nested array/object) makes the value unrepresentable and this returns
|
|
1136
|
+
* `undefined`.
|
|
1137
|
+
*/
|
|
1138
|
+
function formatPslListLiteralValue(elements) {
|
|
1139
|
+
const parts = [];
|
|
1140
|
+
for (const element of elements) if (typeof element === "string") parts.push(`"${escapePslString(element)}"`);
|
|
1141
|
+
else if (typeof element === "number" || typeof element === "boolean") parts.push(String(element));
|
|
1142
|
+
else return;
|
|
1143
|
+
return `[${parts.join(", ")}]`;
|
|
1144
|
+
}
|
|
1145
|
+
/**
|
|
1097
1146
|
* Resolves a `SqlColumnIR.default` value into a normalized {@link ColumnDefault}.
|
|
1098
1147
|
*
|
|
1099
1148
|
* `SqlSchemaIR` types the column default as `string` (a raw database default
|
|
@@ -1283,7 +1332,8 @@ const postgresTargetDescriptor = {
|
|
|
1283
1332
|
return contractToPostgresDatabaseSchemaNode(blindCast(contract), {
|
|
1284
1333
|
annotationNamespace: "pg",
|
|
1285
1334
|
...ifDefined("expandNativeType", expander),
|
|
1286
|
-
renderDefault: postgresRenderDefault
|
|
1335
|
+
renderDefault: postgresRenderDefault,
|
|
1336
|
+
resolveDefault: postgresResolveDefault
|
|
1287
1337
|
});
|
|
1288
1338
|
}
|
|
1289
1339
|
},
|