@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.
- package/dist/{build-contract-B1odoaHR.mjs → build-contract-C9dZNMRg.mjs} +57 -11
- package/dist/build-contract-C9dZNMRg.mjs.map +1 -0
- package/dist/config-types.mjs +1 -1
- package/dist/config-types.mjs.map +1 -1
- package/dist/contract-builder.d.mts +118 -2
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +70 -3
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +13 -13
- package/src/build-contract.ts +82 -6
- package/src/contract-builder.ts +4 -0
- package/src/contract-definition.ts +9 -0
- package/src/contract-dsl.ts +19 -1
- package/src/contract-lowering.ts +17 -0
- package/src/enum-type.ts +236 -0
- package/src/exports/contract-builder.ts +2 -0
- package/dist/build-contract-B1odoaHR.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as buildSqlContractFromDefinition } from "./build-contract-
|
|
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
|