@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.
Files changed (83) hide show
  1. package/dist/{authoring-CGe-7Yr9.mjs → authoring-34L18kA1.mjs} +3 -3
  2. package/dist/{authoring-CGe-7Yr9.mjs.map → authoring-34L18kA1.mjs.map} +1 -1
  3. package/dist/{codec-ids-CI144z7g.d.mts → codec-ids-CGmnXDxH.d.mts} +3 -2
  4. package/dist/codec-ids-CGmnXDxH.d.mts.map +1 -0
  5. package/dist/{codec-ids-B10ZZHzw.mjs → codec-ids-D3G8K0YM.mjs} +3 -2
  6. package/dist/codec-ids-D3G8K0YM.mjs.map +1 -0
  7. package/dist/codec-ids.d.mts +2 -2
  8. package/dist/codec-ids.mjs +2 -2
  9. package/dist/{codec-types-CTfT4U4O.d.mts → codec-types-CTlPXzZ9.d.mts} +2 -2
  10. package/dist/{codec-types-CTfT4U4O.d.mts.map → codec-types-CTlPXzZ9.d.mts.map} +1 -1
  11. package/dist/codec-types.d.mts +1 -1
  12. package/dist/{codecs-D7W9O0Xx.d.mts → codecs-B-76qSBx.d.mts} +35 -6
  13. package/dist/codecs-B-76qSBx.d.mts.map +1 -0
  14. package/dist/{codecs-DRbb26Or.mjs → codecs-TCsGgW-Y.mjs} +77 -5
  15. package/dist/codecs-TCsGgW-Y.mjs.map +1 -0
  16. package/dist/codecs.d.mts +2 -2
  17. package/dist/codecs.mjs +2 -2
  18. package/dist/contract-free.mjs +3 -3
  19. package/dist/{control-policy-DaLdbcYE.mjs → control-policy-42vVVpTL.mjs} +4 -4
  20. package/dist/{control-policy-DaLdbcYE.mjs.map → control-policy-42vVVpTL.mjs.map} +1 -1
  21. package/dist/control.d.mts.map +1 -1
  22. package/dist/control.mjs +63 -13
  23. package/dist/control.mjs.map +1 -1
  24. package/dist/{ddl-GTTOvjx_.mjs → ddl-DHXKzQ99.mjs} +3 -3
  25. package/dist/{ddl-GTTOvjx_.mjs.map → ddl-DHXKzQ99.mjs.map} +1 -1
  26. package/dist/default-normalizer-B9ZUiyUE.mjs +264 -0
  27. package/dist/default-normalizer-B9ZUiyUE.mjs.map +1 -0
  28. package/dist/default-normalizer.d.mts +14 -1
  29. package/dist/default-normalizer.d.mts.map +1 -1
  30. package/dist/default-normalizer.mjs +2 -248
  31. package/dist/{descriptor-meta-Bxw2GNog.mjs → descriptor-meta-qubYaxQA.mjs} +9 -4
  32. package/dist/descriptor-meta-qubYaxQA.mjs.map +1 -0
  33. package/dist/{diff-database-schema-oY3brcLj.mjs → diff-database-schema-CrYO0j4_.mjs} +9 -6
  34. package/dist/diff-database-schema-CrYO0j4_.mjs.map +1 -0
  35. package/dist/diff-database-schema.d.mts.map +1 -1
  36. package/dist/diff-database-schema.mjs +1 -1
  37. package/dist/issue-planner.mjs +1 -1
  38. package/dist/migration.mjs +2 -2
  39. package/dist/{op-factory-call-tBcLo_B8.mjs → op-factory-call-rCP7TXTh.mjs} +3 -3
  40. package/dist/{op-factory-call-tBcLo_B8.mjs.map → op-factory-call-rCP7TXTh.mjs.map} +1 -1
  41. package/dist/op-factory-call.mjs +1 -1
  42. package/dist/pack.d.mts +15 -2
  43. package/dist/pack.d.mts.map +1 -1
  44. package/dist/pack.mjs +1 -1
  45. package/dist/{planner-BWmH0NqM.mjs → planner-Bj7MTEeR.mjs} +7 -7
  46. package/dist/{planner-BWmH0NqM.mjs.map → planner-Bj7MTEeR.mjs.map} +1 -1
  47. package/dist/{planner-produced-postgres-migration-BV3WLLXl.mjs → planner-produced-postgres-migration-iHdZVN5i.mjs} +2 -2
  48. package/dist/{planner-produced-postgres-migration-BV3WLLXl.mjs.map → planner-produced-postgres-migration-iHdZVN5i.mjs.map} +1 -1
  49. package/dist/planner-produced-postgres-migration.mjs +1 -1
  50. package/dist/{planner-sql-checks-zqNfs2XZ.mjs → planner-sql-checks-BuB877wH.mjs} +2 -2
  51. package/dist/{planner-sql-checks-zqNfs2XZ.mjs.map → planner-sql-checks-BuB877wH.mjs.map} +1 -1
  52. package/dist/planner-sql-checks.mjs +1 -1
  53. package/dist/planner.mjs +2 -2
  54. package/dist/{postgres-contract-view-CWsxTdoA.mjs → postgres-contract-view-DebHMqGR.mjs} +4 -4
  55. package/dist/{postgres-contract-view-CWsxTdoA.mjs.map → postgres-contract-view-DebHMqGR.mjs.map} +1 -1
  56. package/dist/{postgres-migration-1_ZoswMV.mjs → postgres-migration-fxgsblW1.mjs} +4 -4
  57. package/dist/{postgres-migration-1_ZoswMV.mjs.map → postgres-migration-fxgsblW1.mjs.map} +1 -1
  58. package/dist/{postgres-schema-Cm4DtiGA.mjs → postgres-schema-CewLYHB7.mjs} +2 -2
  59. package/dist/{postgres-schema-Cm4DtiGA.mjs.map → postgres-schema-CewLYHB7.mjs.map} +1 -1
  60. package/dist/{resolve-ddl-schema-XyBaaenM.mjs → resolve-ddl-schema-D0wi_P9Q.mjs} +2 -2
  61. package/dist/{resolve-ddl-schema-XyBaaenM.mjs.map → resolve-ddl-schema-D0wi_P9Q.mjs.map} +1 -1
  62. package/dist/runtime.mjs +1 -1
  63. package/dist/schema-ir-annotations.mjs +1 -1
  64. package/dist/types.mjs +1 -1
  65. package/package.json +20 -20
  66. package/src/core/codec-helpers.ts +53 -1
  67. package/src/core/codec-ids.ts +1 -0
  68. package/src/core/codecs.ts +56 -3
  69. package/src/core/default-normalizer.ts +22 -0
  70. package/src/core/descriptor-meta.ts +2 -0
  71. package/src/core/index-types.ts +15 -0
  72. package/src/core/migrations/diff-database-schema.ts +3 -0
  73. package/src/core/psl-infer/infer-psl-contract.ts +130 -12
  74. package/src/exports/codecs.ts +2 -0
  75. package/src/exports/control.ts +2 -0
  76. package/src/exports/default-normalizer.ts +1 -1
  77. package/dist/codec-ids-B10ZZHzw.mjs.map +0 -1
  78. package/dist/codec-ids-CI144z7g.d.mts.map +0 -1
  79. package/dist/codecs-D7W9O0Xx.d.mts.map +0 -1
  80. package/dist/codecs-DRbb26Or.mjs.map +0 -1
  81. package/dist/default-normalizer.mjs.map +0 -1
  82. package/dist/descriptor-meta-Bxw2GNog.mjs.map +0 -1
  83. package/dist/diff-database-schema-oY3brcLj.mjs.map +0 -1
package/dist/control.mjs CHANGED
@@ -1,10 +1,11 @@
1
- import { t as postgresTargetDescriptorMeta } from "./descriptor-meta-Bxw2GNog.mjs";
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-oY3brcLj.mjs";
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-CWsxTdoA.mjs";
7
- import { t as createPostgresMigrationPlanner } from "./planner-BWmH0NqM.mjs";
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 comment = table.primaryKey ? void 0 : "// WARNING: This table has no primary key in the database";
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 !== void 0) {
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
  },