@prisma-next/sql-contract-ts 0.12.0-dev.57 → 0.12.0-dev.59

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.
@@ -1,4 +1,4 @@
1
- import { t as buildSqlContractFromDefinition } from "./build-contract-B1odoaHR.mjs";
1
+ import { t as buildSqlContractFromDefinition } from "./build-contract-C9dZNMRg.mjs";
2
2
  import { blindCast } from "@prisma-next/utils/casts";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  import { isColumnDefault } from "@prisma-next/contract/types";
@@ -79,6 +79,61 @@ function createFieldHelpersFromNamespace(namespace, createLeafHelper, path = [])
79
79
  return helpers;
80
80
  }
81
81
  //#endregion
82
+ //#region src/enum-type.ts
83
+ function member(name, value) {
84
+ return {
85
+ name,
86
+ value: blindCast(value ?? name)
87
+ };
88
+ }
89
+ /**
90
+ * Internal brand that identifies an EnumTypeHandle in the lowering pipeline.
91
+ * Not exported — callers only interact with `EnumTypeHandle`.
92
+ */
93
+ const ENUM_TYPE_HANDLE_BRAND = Symbol("EnumTypeHandle");
94
+ function enumType(name, codec, ...members) {
95
+ if (members.length === 0) throw new Error(`enumType("${name}"): must have at least one member.`);
96
+ const seenNames = /* @__PURE__ */ new Set();
97
+ const seenValues = /* @__PURE__ */ new Set();
98
+ for (const m of members) {
99
+ if (seenNames.has(m.name)) throw new Error(`enumType("${name}"): duplicate member name "${m.name}". Member names must be unique.`);
100
+ seenNames.add(m.name);
101
+ if (seenValues.has(m.value)) throw new Error(`enumType("${name}"): duplicate member value "${m.value}". Member values must be unique.`);
102
+ seenValues.add(m.value);
103
+ }
104
+ const values = Object.freeze(members.map((m) => m.value));
105
+ const names = Object.freeze(members.map((m) => m.name));
106
+ const enumMembers = Object.freeze(members.map((m) => ({
107
+ name: m.name,
108
+ value: m.value
109
+ })));
110
+ const membersAccessor = Object.freeze(Object.fromEntries(members.map((m) => [m.name, m.value])));
111
+ const valueSet = new Set(values);
112
+ const valueToName = new Map(members.map((m) => [m.value, m.name]));
113
+ const valueToOrdinal = new Map(values.map((v, i) => [v, i]));
114
+ return {
115
+ [ENUM_TYPE_HANDLE_BRAND]: true,
116
+ enumName: name,
117
+ codecId: codec.codecId,
118
+ nativeType: codec.nativeType,
119
+ enumMembers,
120
+ values,
121
+ names,
122
+ members: membersAccessor,
123
+ has: (v) => valueSet.has(v),
124
+ nameOf: (v) => valueToName.get(v),
125
+ ordinalOf: (v) => valueToOrdinal.get(v) ?? -1
126
+ };
127
+ }
128
+ /**
129
+ * Returns true when the value is an `EnumTypeHandle` produced by
130
+ * `enumType()`. Used in the lowering pipeline to detect enum handles
131
+ * in field state without importing the BRAND symbol at every call site.
132
+ */
133
+ function isEnumTypeHandle(value) {
134
+ return typeof value === "object" && value !== null && Reflect.get(value, ENUM_TYPE_HANDLE_BRAND) === true;
135
+ }
136
+ //#endregion
82
137
  //#region src/contract-dsl.ts
83
138
  function toColumnDefault(value) {
84
139
  if (isColumnDefault(value)) return value;
@@ -166,6 +221,11 @@ function generatedField(spec) {
166
221
  });
167
222
  }
168
223
  function namedTypeField(typeRef) {
224
+ if (isEnumTypeHandle(typeRef)) return new ScalarFieldBuilder({
225
+ kind: "scalar",
226
+ typeRef,
227
+ nullable: false
228
+ });
169
229
  return new ScalarFieldBuilder({
170
230
  kind: "scalar",
171
231
  typeRef,
@@ -677,6 +737,10 @@ function buildStorageTypeReverseLookup(storageTypes) {
677
737
  function resolveFieldDescriptor(modelName, fieldName, fieldState, storageTypes, storageTypeReverseLookup) {
678
738
  if ("descriptor" in fieldState && fieldState.descriptor) return fieldState.descriptor;
679
739
  if ("typeRef" in fieldState && fieldState.typeRef) {
740
+ if (isEnumTypeHandle(fieldState.typeRef)) return {
741
+ codecId: fieldState.typeRef.codecId,
742
+ nativeType: fieldState.typeRef.nativeType
743
+ };
680
744
  const typeRef = typeof fieldState.typeRef === "string" ? fieldState.typeRef : storageTypeReverseLookup.get(fieldState.typeRef);
681
745
  if (!typeRef) throw new Error(`Field "${modelName}.${fieldName}" references a storage type instance that is not present in definition.types`);
682
746
  const referencedType = storageTypes[typeRef];
@@ -906,13 +970,15 @@ function resolveModelNode(spec, allSpecs, storageTypes, storageTypeReverseLookup
906
970
  const descriptor = resolveFieldDescriptor(spec.modelName, fieldName, fieldState, storageTypes, storageTypeReverseLookup);
907
971
  const columnName = spec.fieldToColumn[fieldName];
908
972
  if (!columnName) throw new Error(`Column name resolution failed for "${spec.modelName}.${fieldName}"`);
973
+ const enumHandle = "typeRef" in fieldState && isEnumTypeHandle(fieldState.typeRef) ? fieldState.typeRef : void 0;
909
974
  fields.push({
910
975
  fieldName,
911
976
  columnName,
912
977
  descriptor,
913
978
  nullable: fieldState.nullable,
914
979
  ...fieldState.default ? { default: fieldState.default } : {},
915
- ...fieldState.executionDefaults ? { executionDefaults: fieldState.executionDefaults } : {}
980
+ ...fieldState.executionDefaults ? { executionDefaults: fieldState.executionDefaults } : {},
981
+ ...enumHandle !== void 0 ? { enumTypeHandle: enumHandle } : {}
916
982
  });
917
983
  }
918
984
  const { idConstraint } = spec;
@@ -1009,6 +1075,7 @@ function buildContractDefinition(definition) {
1009
1075
  ...Object.keys(collection.storageTypes).length > 0 ? { storageTypes: collection.storageTypes } : {},
1010
1076
  ...definition.namespaces ? { namespaces: definition.namespaces } : {},
1011
1077
  ...definition.createNamespace ? { createNamespace: definition.createNamespace } : {},
1078
+ ...definition.enums && Object.keys(definition.enums).length > 0 ? { enums: definition.enums } : {},
1012
1079
  models
1013
1080
  };
1014
1081
  }
@@ -1123,6 +1190,6 @@ function defineContract(definition, factory) {
1123
1190
  return buildBoundContract(definition.family, definition.target, definition);
1124
1191
  }
1125
1192
  //#endregion
1126
- export { buildBoundContract, buildSqlContractFromDefinition, defineContract, field, model, rel };
1193
+ export { buildBoundContract, buildSqlContractFromDefinition, defineContract, enumType, field, member, model, rel };
1127
1194
 
1128
1195
  //# sourceMappingURL=contract-builder.mjs.map