prisma-ltree 0.3.0 → 0.5.0
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 +54 -28
- package/dist/{codec-types-ECy3aUGO.d.mts → codec-types-BJE-5cwk.d.mts} +5 -8
- package/dist/codec-types-BJE-5cwk.d.mts.map +1 -0
- package/dist/codec-types.d.mts +1 -1
- package/dist/column-types.d.mts.map +1 -1
- package/dist/column-types.mjs +3 -9
- package/dist/column-types.mjs.map +1 -1
- package/dist/constants-Dfknw-h5.mjs +9 -0
- package/dist/constants-Dfknw-h5.mjs.map +1 -0
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +20 -16
- package/dist/control.mjs.map +1 -1
- package/dist/{descriptor-meta-D2gu1NKP.mjs → descriptor-meta-2In8FI1I.mjs} +54 -44
- package/dist/descriptor-meta-2In8FI1I.mjs.map +1 -0
- package/dist/pack.d.mts +4 -14
- package/dist/pack.d.mts.map +1 -1
- package/dist/pack.mjs +1 -1
- package/dist/runtime.mjs +2 -1
- package/dist/runtime.mjs.map +1 -1
- package/package.json +11 -10
- package/src/contract.d.ts +139 -25
- package/src/contract.json +10 -7
- package/src/contract.ts +1 -7
- package/src/core/authoring.ts +2 -3
- package/src/core/codecs.ts +7 -21
- package/src/core/contract-space-constants.ts +0 -2
- package/src/core/data-types.ts +41 -0
- package/src/core/descriptor-meta.ts +12 -28
- package/src/exports/column-types.ts +0 -3
- package/src/exports/control.ts +0 -1
- package/src/exports/runtime.ts +1 -0
- package/dist/codec-types-ECy3aUGO.d.mts.map +0 -1
- package/dist/contract-space-constants-Da9EC668.mjs +0 -15
- package/dist/contract-space-constants-Da9EC668.mjs.map +0 -1
- package/dist/descriptor-meta-D2gu1NKP.mjs.map +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data types this extension owns.
|
|
3
|
+
*
|
|
4
|
+
* `ltree` and `ltree[]` are PostgreSQL types the target does not register.
|
|
5
|
+
* A path's canonical form is its label text. An array's canonical form is a
|
|
6
|
+
* JSON array of those texts. Both accept text the contract can already write.
|
|
7
|
+
* The texts are what a migration writes and what the catalog reports.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { DataType } from "@prisma/orm-framework/components/codec";
|
|
11
|
+
import { sqlDataType } from "@prisma/orm-family-sql/contract/data-type";
|
|
12
|
+
import { pgText } from "@prisma/orm-target-postgres/target/data-types";
|
|
13
|
+
|
|
14
|
+
export const ltreeDataType = sqlDataType("ltree/ltree", {
|
|
15
|
+
texts: [{ text: "ltree", written: true, catalog: true }],
|
|
16
|
+
casts: {
|
|
17
|
+
[pgText.id]: (value) => value,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* `sqlDataType` accepts parentheses in a type name and refuses square brackets.
|
|
23
|
+
* PostgreSQL writes this type as `ltree[]`, and `format_type` reports `ltree[]`.
|
|
24
|
+
* Declare the type first, then set that text so a migration and a catalog check use it.
|
|
25
|
+
*/
|
|
26
|
+
const ltreeArrayDeclared = sqlDataType("ltree/ltree-array", {
|
|
27
|
+
listCast: {
|
|
28
|
+
of: [pgText.id],
|
|
29
|
+
cast: (elements) => [...elements],
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const ltreeArrayDataType = {
|
|
34
|
+
...ltreeArrayDeclared,
|
|
35
|
+
sql: {
|
|
36
|
+
...ltreeArrayDeclared.sql,
|
|
37
|
+
texts: [{ text: "ltree[]", written: true as const, catalog: true as const }],
|
|
38
|
+
},
|
|
39
|
+
} as typeof ltreeArrayDeclared;
|
|
40
|
+
|
|
41
|
+
export const ltreeDataTypes: readonly DataType[] = [ltreeDataType, ltreeArrayDataType];
|
|
@@ -10,7 +10,7 @@ import type { CodecTypes } from "../types/codec-types";
|
|
|
10
10
|
import type { QueryOperationTypes } from "../types/operation-types";
|
|
11
11
|
import { ltreeAuthoringTypes } from "./authoring";
|
|
12
12
|
import { LTREE_ARRAY_CODEC_ID, LTREE_CODEC_ID } from "./constants";
|
|
13
|
-
import {
|
|
13
|
+
import { ltreeDataTypes } from "./data-types";
|
|
14
14
|
import { ltreeCodecRegistry } from "./registry";
|
|
15
15
|
|
|
16
16
|
type CodecTypesBase = Record<string, { readonly input: unknown; readonly output: unknown }>;
|
|
@@ -25,7 +25,6 @@ const LTREE_RETURN = { codecId: "pg/ltree@1", nullable: false } as const;
|
|
|
25
25
|
const INT_RETURN = { codecId: "pg/int4@1", nullable: false } as const;
|
|
26
26
|
const TEXT_RETURN = { codecId: "pg/text@1", nullable: false } as const;
|
|
27
27
|
const TEXT_CODEC_ID = "pg/text@1" as const;
|
|
28
|
-
const TEXT_ARRAY_CODEC_ID = "pg/text-array@1" as const;
|
|
29
28
|
const INT_CODEC_ID = "pg/int4@1" as const;
|
|
30
29
|
|
|
31
30
|
/**
|
|
@@ -49,7 +48,6 @@ function funcOp<C extends string>(
|
|
|
49
48
|
returns,
|
|
50
49
|
lowering: {
|
|
51
50
|
targetFamily: "sql",
|
|
52
|
-
strategy: "function",
|
|
53
51
|
template: `${fnName}(${placeholders})`,
|
|
54
52
|
},
|
|
55
53
|
});
|
|
@@ -74,7 +72,6 @@ export function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperatio
|
|
|
74
72
|
returns: BOOL_RETURN,
|
|
75
73
|
lowering: {
|
|
76
74
|
targetFamily: "sql",
|
|
77
|
-
strategy: "function",
|
|
78
75
|
template: `{{self}} ${operator} {{arg0}}`,
|
|
79
76
|
},
|
|
80
77
|
});
|
|
@@ -84,18 +81,20 @@ export function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperatio
|
|
|
84
81
|
method: string,
|
|
85
82
|
operator: string,
|
|
86
83
|
castType: string,
|
|
87
|
-
argCodecId: typeof TEXT_CODEC_ID | typeof TEXT_ARRAY_CODEC_ID,
|
|
88
84
|
self: CodecExpression<typeof LTREE_CODEC_ID, boolean, CT>,
|
|
89
85
|
arg: unknown,
|
|
86
|
+
many = false,
|
|
90
87
|
): BoolReturn => {
|
|
91
88
|
const selfCodec = codecOf(self);
|
|
92
89
|
return buildOperation({
|
|
93
90
|
method,
|
|
94
|
-
args: [
|
|
91
|
+
args: [
|
|
92
|
+
toExpr(self, selfCodec),
|
|
93
|
+
toExpr(arg, many ? { codecId: TEXT_CODEC_ID, many: true } : { codecId: TEXT_CODEC_ID }),
|
|
94
|
+
],
|
|
95
95
|
returns: BOOL_RETURN,
|
|
96
96
|
lowering: {
|
|
97
97
|
targetFamily: "sql",
|
|
98
|
-
strategy: "function",
|
|
99
98
|
template: `{{self}} ${operator} ({{arg0}})::${castType}`,
|
|
100
99
|
},
|
|
101
100
|
});
|
|
@@ -116,7 +115,7 @@ export function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperatio
|
|
|
116
115
|
method,
|
|
117
116
|
args,
|
|
118
117
|
returns: LTREE_RETURN,
|
|
119
|
-
lowering: { targetFamily: "sql",
|
|
118
|
+
lowering: { targetFamily: "sql", template },
|
|
120
119
|
});
|
|
121
120
|
|
|
122
121
|
// Tier 3 — first-match operators on an `ltree[]` receiver (ADR-003).
|
|
@@ -136,7 +135,7 @@ export function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperatio
|
|
|
136
135
|
method,
|
|
137
136
|
args: [toExpr(self, selfCodec), toExpr(arg, { codecId: argCodecId })],
|
|
138
137
|
returns: LTREE_RETURN,
|
|
139
|
-
lowering: { targetFamily: "sql",
|
|
138
|
+
lowering: { targetFamily: "sql", template },
|
|
140
139
|
});
|
|
141
140
|
};
|
|
142
141
|
|
|
@@ -151,18 +150,16 @@ export function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperatio
|
|
|
151
150
|
},
|
|
152
151
|
matchesLquery: {
|
|
153
152
|
self: { codecId: LTREE_CODEC_ID },
|
|
154
|
-
impl: (self, pattern) =>
|
|
155
|
-
patternOp("matchesLquery", "~", "lquery", TEXT_CODEC_ID, self, pattern),
|
|
153
|
+
impl: (self, pattern) => patternOp("matchesLquery", "~", "lquery", self, pattern),
|
|
156
154
|
},
|
|
157
155
|
matchesLqueryArray: {
|
|
158
156
|
self: { codecId: LTREE_CODEC_ID },
|
|
159
157
|
impl: (self, patterns) =>
|
|
160
|
-
patternOp("matchesLqueryArray", "?", "lquery[]",
|
|
158
|
+
patternOp("matchesLqueryArray", "?", "lquery[]", self, patterns, true),
|
|
161
159
|
},
|
|
162
160
|
matchesLtxtquery: {
|
|
163
161
|
self: { codecId: LTREE_CODEC_ID },
|
|
164
|
-
impl: (self, query) =>
|
|
165
|
-
patternOp("matchesLtxtquery", "@", "ltxtquery", TEXT_CODEC_ID, self, query),
|
|
162
|
+
impl: (self, query) => patternOp("matchesLtxtquery", "@", "ltxtquery", self, query),
|
|
166
163
|
},
|
|
167
164
|
nlevel: {
|
|
168
165
|
self: { codecId: LTREE_CODEC_ID },
|
|
@@ -313,6 +310,7 @@ const ltreePackMetaBase = {
|
|
|
313
310
|
authoring: {
|
|
314
311
|
type: ltreeAuthoringTypes,
|
|
315
312
|
},
|
|
313
|
+
dataTypes: ltreeDataTypes,
|
|
316
314
|
types: {
|
|
317
315
|
codecTypes: {
|
|
318
316
|
codecDescriptors: Array.from(ltreeCodecRegistry.values()),
|
|
@@ -336,20 +334,6 @@ const ltreePackMetaBase = {
|
|
|
336
334
|
alias: "LtreeQueryOperationTypes",
|
|
337
335
|
},
|
|
338
336
|
},
|
|
339
|
-
storage: [
|
|
340
|
-
{
|
|
341
|
-
typeId: LTREE_CODEC_ID,
|
|
342
|
-
familyId: "sql",
|
|
343
|
-
targetId: "postgres",
|
|
344
|
-
nativeType: LTREE_NATIVE_TYPE,
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
typeId: LTREE_ARRAY_CODEC_ID,
|
|
348
|
-
familyId: "sql",
|
|
349
|
-
targetId: "postgres",
|
|
350
|
-
nativeType: LTREE_ARRAY_NATIVE_TYPE,
|
|
351
|
-
},
|
|
352
|
-
],
|
|
353
337
|
},
|
|
354
338
|
} as const;
|
|
355
339
|
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import type { ColumnTypeDescriptor } from "@prisma/orm-framework/components/codec";
|
|
2
2
|
import { LTREE_ARRAY_CODEC_ID, LTREE_CODEC_ID } from "../core/constants";
|
|
3
|
-
import { LTREE_ARRAY_NATIVE_TYPE, LTREE_NATIVE_TYPE } from "../core/contract-space-constants";
|
|
4
3
|
|
|
5
4
|
export function ltree(): ColumnTypeDescriptor {
|
|
6
5
|
return {
|
|
7
6
|
codecId: LTREE_CODEC_ID,
|
|
8
|
-
nativeType: LTREE_NATIVE_TYPE,
|
|
9
7
|
} as const;
|
|
10
8
|
}
|
|
11
9
|
|
|
12
10
|
export function ltreeArray(): ColumnTypeDescriptor {
|
|
13
11
|
return {
|
|
14
12
|
codecId: LTREE_ARRAY_CODEC_ID,
|
|
15
|
-
nativeType: LTREE_ARRAY_NATIVE_TYPE,
|
|
16
13
|
} as const;
|
|
17
14
|
}
|
package/src/exports/control.ts
CHANGED
|
@@ -14,7 +14,6 @@ import { LTREE_SPACE_ID, LTREE_BASELINE_MIGRATION_NAME } from "../core/contract-
|
|
|
14
14
|
import { ltreePackMeta, ltreeQueryOperations } from "../core/descriptor-meta";
|
|
15
15
|
|
|
16
16
|
const ltreeControlPlaneHooks: CodecControlHooks = {
|
|
17
|
-
expandNativeType: ({ nativeType }) => nativeType,
|
|
18
17
|
resolveIdentityValue: () => null,
|
|
19
18
|
};
|
|
20
19
|
|
package/src/exports/runtime.ts
CHANGED
|
@@ -6,6 +6,7 @@ const ltreeRuntimeDescriptor: SqlRuntimeExtensionDescriptor<"postgres"> = {
|
|
|
6
6
|
kind: "extension" as const,
|
|
7
7
|
id: ltreePackMeta.id,
|
|
8
8
|
version: ltreePackMeta.version,
|
|
9
|
+
dataTypes: ltreePackMeta.dataTypes,
|
|
9
10
|
familyId: "sql" as const,
|
|
10
11
|
targetId: "postgres" as const,
|
|
11
12
|
types: {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codec-types-ECy3aUGO.d.mts","names":[],"sources":["../src/core/constants.ts","../src/core/codecs.ts","../src/types/codec-types.ts"],"mappings":";;;;;;;cAAa,cAAA;AAAA,cAEA,oBAAA;;;cCoDA,UAAA,SAAmB,SAAA,QACvB,cAAA;EAKD,MAAA,CAAO,KAAA,UAAe,IAAA,EAAM,gBAAA,GAAmB,OAAA;EAK/C,MAAA,CAAO,IAAA,UAAc,IAAA,EAAM,gBAAA,GAAmB,OAAA;EAIpD,UAAA,CAAW,KAAA,WAAgB,SAAA;EAK3B,UAAA,CAAW,IAAA,EAAM,SAAA;AAAA;AAAA,cAMN,eAAA,SAAwB,uBAAA;EAAA,UAChB,UAAA;EAAA,UAGA,cAAA,CAAe,UAAA,EAAY,cAAA,GAAiB,cAAA;EAAA,SAI7C,OAAA;EAAA,SACA,MAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA,EAAc,gBAAA;EACvB,gBAAA;EAGA,OAAA,KAAY,GAAA,EAAK,oBAAA,KAAyB,UAAA;AAAA;AAAA,cAcxC,eAAA,SAAwB,SAAA,QAC5B,oBAAA;EAKD,MAAA,CAAO,KAAA,qBAA0B,IAAA,EAAM,gBAAA,GAAmB,OAAA;EAO1D,MAAA,CAAO,IAAA,qBAAyB,IAAA,EAAM,gBAAA,GAAmB,OAAA;EAI/D,UAAA,CAAW,KAAA,sBAA2B,SAAA;EAOtC,UAAA,CAAW,IAAA,EAAM,SAAA;AAAA;AAAA,cAWN,oBAAA,SAA6B,uBAAA;EAAA,UACrB,UAAA;EAAA,UAGA,cAAA,CAAe,UAAA,EAAY,cAAA,GAAiB,cAAA;EAAA,SAI7C,OAAA;EAAA,SACA,MAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA,EAAc,gBAAA;EACvB,gBAAA;EAGA,OAAA,KAAY,GAAA,EAAK,oBAAA,KAAyB,eAAA;AAAA;AAAA,cAmB/C,kBAAA;EAAA,SACJ,KAAA,EAAK,eAAA;EAAA,SACL,UAAA,EAAU,oBAAA;AAAA;AAAA,KAGA,YAAA,GAAa,iBAAiB,QAAQ,kBAAA;;;KCrLtC,KAAA;EAAA,SAA4B,OAAO;AAAA;AAAA,KAEnC,UAAA;EAAA,SAA4C,YAAY;AAAA;AAAA,KAExD,UAAA,GAAa,YAAc"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/core/constants.ts
|
|
2
|
-
const LTREE_CODEC_ID = "pg/ltree@1";
|
|
3
|
-
const LTREE_ARRAY_CODEC_ID = "pg/ltree-array@1";
|
|
4
|
-
const LTREE_MAX_LABEL_LENGTH = 1e3;
|
|
5
|
-
const LTREE_MAX_LABELS = 65535;
|
|
6
|
-
//#endregion
|
|
7
|
-
//#region src/core/contract-space-constants.ts
|
|
8
|
-
const LTREE_SPACE_ID = "ltree";
|
|
9
|
-
const LTREE_NATIVE_TYPE = "ltree";
|
|
10
|
-
const LTREE_ARRAY_NATIVE_TYPE = "ltree[]";
|
|
11
|
-
const LTREE_BASELINE_MIGRATION_NAME = "20260619T2142_install_ltree";
|
|
12
|
-
//#endregion
|
|
13
|
-
export { LTREE_ARRAY_CODEC_ID as a, LTREE_MAX_LABEL_LENGTH as c, LTREE_SPACE_ID as i, LTREE_BASELINE_MIGRATION_NAME as n, LTREE_CODEC_ID as o, LTREE_NATIVE_TYPE as r, LTREE_MAX_LABELS as s, LTREE_ARRAY_NATIVE_TYPE as t };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=contract-space-constants-Da9EC668.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract-space-constants-Da9EC668.mjs","names":[],"sources":["../src/core/constants.ts","../src/core/contract-space-constants.ts"],"sourcesContent":["export const LTREE_CODEC_ID = \"pg/ltree@1\" as const;\n\nexport const LTREE_ARRAY_CODEC_ID = \"pg/ltree-array@1\" as const;\n\nexport const LTREE_MAX_LABEL_LENGTH = 1000;\n\nexport const LTREE_MAX_LABELS = 65535;\n","export const LTREE_SPACE_ID = \"ltree\" as const;\n\nexport const LTREE_NATIVE_TYPE = \"ltree\" as const;\n\nexport const LTREE_ARRAY_NATIVE_TYPE = \"ltree[]\" as const;\n\n/** Contract storage.types key — must be a valid identifier for contract emit. */\nexport const LTREE_ARRAY_STORAGE_TYPE = \"ltreeArray\" as const;\n\nexport const LTREE_BASELINE_MIGRATION_NAME = \"20260619T2142_install_ltree\" as const;\n\nexport const LTREE_INVARIANTS = {\n installLtree: \"ltree:install-ltree-v1\",\n} as const;\n"],"mappings":";AAAA,MAAa,iBAAiB;AAE9B,MAAa,uBAAuB;AAEpC,MAAa,yBAAyB;AAEtC,MAAa,mBAAmB;;;ACNhC,MAAa,iBAAiB;AAE9B,MAAa,oBAAoB;AAEjC,MAAa,0BAA0B;AAKvC,MAAa,gCAAgC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor-meta-D2gu1NKP.mjs","names":[],"sources":["../src/core/authoring.ts","../src/core/codecs.ts","../src/core/registry.ts","../src/core/descriptor-meta.ts"],"sourcesContent":["import type { AuthoringTypeNamespace } from \"@prisma/orm-framework/components/authoring\";\nimport { LTREE_ARRAY_CODEC_ID, LTREE_CODEC_ID } from \"./constants\";\nimport { LTREE_ARRAY_NATIVE_TYPE, LTREE_NATIVE_TYPE } from \"./contract-space-constants\";\n\nexport const ltreeAuthoringTypes = {\n ltree: {\n Ltree: {\n kind: \"typeConstructor\",\n output: {\n codecId: LTREE_CODEC_ID,\n nativeType: LTREE_NATIVE_TYPE,\n },\n },\n LtreeArray: {\n kind: \"typeConstructor\",\n output: {\n codecId: LTREE_ARRAY_CODEC_ID,\n nativeType: LTREE_ARRAY_NATIVE_TYPE,\n },\n },\n },\n} as const satisfies AuthoringTypeNamespace;\n","import type { JsonValue } from \"@prisma/orm-framework/contract/types\";\nimport {\n type CodecCallContext,\n CodecImpl,\n type CodecInstanceContext,\n type ColumnHelperFor,\n type ColumnHelperForStrict,\n column,\n voidParamsSchema,\n} from \"@prisma/orm-framework/components/codec\";\nimport type { ExtractCodecTypes, ProjectionExpr } from \"@prisma/orm-family-sql/relational-core/ast\";\nimport {\n definePostgresCodecs,\n PostgresCodecDescriptor,\n} from \"@prisma/orm-target-postgres/target/codec-descriptor\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport {\n LTREE_ARRAY_CODEC_ID,\n LTREE_CODEC_ID,\n LTREE_MAX_LABEL_LENGTH,\n LTREE_MAX_LABELS,\n} from \"./constants\";\nimport { LTREE_ARRAY_NATIVE_TYPE, LTREE_NATIVE_TYPE } from \"./contract-space-constants\";\n\nconst LABEL_PATTERN = /^[A-Za-z0-9_-]+$/;\n\nexport function assertValidLtree(value: unknown): asserts value is string {\n if (typeof value !== \"string\") {\n throw new Error(\"ltree value must be a string\");\n }\n if (value.length === 0) {\n throw new Error(\"ltree value must not be empty\");\n }\n const labels = value.split(\".\");\n if (labels.length > LTREE_MAX_LABELS) {\n throw new Error(`ltree path exceeds max labels: got ${labels.length}, max ${LTREE_MAX_LABELS}`);\n }\n for (const label of labels) {\n if (label.length === 0) {\n throw new Error(`ltree label must not be empty in path \"${value}\"`);\n }\n if (label.length > LTREE_MAX_LABEL_LENGTH) {\n throw new Error(\n `ltree label exceeds max length: got ${label.length}, max ${LTREE_MAX_LABEL_LENGTH}`,\n );\n }\n if (!LABEL_PATTERN.test(label)) {\n throw new Error(\n `ltree label \"${label}\" contains invalid characters; allowed: alphanumeric, underscore, hyphen`,\n );\n }\n }\n}\n\nexport class LtreeCodec extends CodecImpl<\n typeof LTREE_CODEC_ID,\n readonly [\"equality\", \"order\"],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n assertValidLtree(value);\n return value;\n }\n\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n\n encodeJson(value: string): JsonValue {\n assertValidLtree(value);\n return value;\n }\n\n decodeJson(json: JsonValue): string {\n assertValidLtree(json);\n return json;\n }\n}\n\nexport class LtreeDescriptor extends PostgresCodecDescriptor<void> {\n protected override nativeType(): string {\n return LTREE_NATIVE_TYPE;\n }\n protected override jsonProjection(expression: ProjectionExpr): ProjectionExpr {\n // ltree's text form is already its canonical JSON string.\n return expression;\n }\n override readonly codecId = LTREE_CODEC_ID;\n override readonly traits = [\"equality\", \"order\"] as const;\n override readonly targetTypes = [LTREE_NATIVE_TYPE] as const;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderOutputType(): string {\n return \"string\";\n }\n override factory(): (ctx: CodecInstanceContext) => LtreeCodec {\n const shared = new LtreeCodec(this);\n return () => shared;\n }\n}\n\nexport const ltreeDescriptor = new LtreeDescriptor();\n\nexport const ltree = () =>\n column(ltreeDescriptor.factory(), ltreeDescriptor.codecId, undefined, LTREE_NATIVE_TYPE);\n\nltree satisfies ColumnHelperFor<LtreeDescriptor>;\nltree satisfies ColumnHelperForStrict<LtreeDescriptor>;\n\nexport class LtreeArrayCodec extends CodecImpl<\n typeof LTREE_ARRAY_CODEC_ID,\n readonly [\"equality\"],\n readonly string[],\n readonly string[]\n> {\n async encode(value: readonly string[], _ctx: CodecCallContext): Promise<readonly string[]> {\n for (const entry of value) {\n assertValidLtree(entry);\n }\n return value;\n }\n\n async decode(wire: readonly string[], _ctx: CodecCallContext): Promise<readonly string[]> {\n return wire;\n }\n\n encodeJson(value: readonly string[]): JsonValue {\n for (const entry of value) {\n assertValidLtree(entry);\n }\n return [...value];\n }\n\n decodeJson(json: JsonValue): readonly string[] {\n if (!Array.isArray(json)) {\n return [];\n }\n return json.map((entry) => {\n assertValidLtree(entry);\n return String(entry);\n });\n }\n}\n\nexport class LtreeArrayDescriptor extends PostgresCodecDescriptor<void> {\n protected override nativeType(): string {\n return LTREE_ARRAY_NATIVE_TYPE;\n }\n protected override jsonProjection(expression: ProjectionExpr): ProjectionExpr {\n // ltree[] text form projects as a JSON string array already.\n return expression;\n }\n override readonly codecId = LTREE_ARRAY_CODEC_ID;\n override readonly traits = [\"equality\"] as const;\n override readonly targetTypes = [LTREE_ARRAY_NATIVE_TYPE] as const;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderOutputType(): string {\n return \"readonly string[]\";\n }\n override factory(): (ctx: CodecInstanceContext) => LtreeArrayCodec {\n const shared = new LtreeArrayCodec(this);\n return () => shared;\n }\n}\n\nexport const ltreeArrayDescriptor = new LtreeArrayDescriptor();\n\nexport const ltreeArray = () =>\n column(\n ltreeArrayDescriptor.factory(),\n ltreeArrayDescriptor.codecId,\n undefined,\n LTREE_ARRAY_NATIVE_TYPE,\n );\n\nltreeArray satisfies ColumnHelperFor<LtreeArrayDescriptor>;\nltreeArray satisfies ColumnHelperForStrict<LtreeArrayDescriptor>;\n\nconst codecDescriptorMap = {\n ltree: ltreeDescriptor,\n ltreeArray: ltreeArrayDescriptor,\n} as const;\n\nexport type CodecTypes = ExtractCodecTypes<typeof codecDescriptorMap>;\n\nexport const codecDescriptors = definePostgresCodecs(Object.values(codecDescriptorMap));\n","import { buildCodecDescriptorRegistry } from \"@prisma/orm-family-sql/relational-core/codec-descriptor-registry\";\nimport type { CodecDescriptorRegistry } from \"@prisma/orm-family-sql/relational-core/query-lane-context\";\nimport { codecDescriptors } from \"./codecs\";\n\nexport const ltreeCodecRegistry: CodecDescriptorRegistry =\n buildCodecDescriptorRegistry(codecDescriptors);\n","import type { AnyExpression } from \"@prisma/orm-family-sql/relational-core/ast\";\nimport {\n buildOperation,\n type CodecExpression,\n codecOf,\n type Expression,\n toExpr,\n} from \"@prisma/orm-family-sql/relational-core/expression\";\nimport type { CodecTypes } from \"../types/codec-types\";\nimport type { QueryOperationTypes } from \"../types/operation-types\";\nimport { ltreeAuthoringTypes } from \"./authoring\";\nimport { LTREE_ARRAY_CODEC_ID, LTREE_CODEC_ID } from \"./constants\";\nimport { LTREE_ARRAY_NATIVE_TYPE, LTREE_NATIVE_TYPE } from \"./contract-space-constants\";\nimport { ltreeCodecRegistry } from \"./registry\";\n\ntype CodecTypesBase = Record<string, { readonly input: unknown; readonly output: unknown }>;\n\ntype BoolReturn = Expression<{ readonly codecId: \"pg/bool@1\"; readonly nullable: false }>;\ntype LtreeReturn = Expression<{ readonly codecId: \"pg/ltree@1\"; readonly nullable: false }>;\ntype IntReturn = Expression<{ readonly codecId: \"pg/int4@1\"; readonly nullable: false }>;\ntype TextReturn = Expression<{ readonly codecId: \"pg/text@1\"; readonly nullable: false }>;\n\nconst BOOL_RETURN = { codecId: \"pg/bool@1\", nullable: false } as const;\nconst LTREE_RETURN = { codecId: \"pg/ltree@1\", nullable: false } as const;\nconst INT_RETURN = { codecId: \"pg/int4@1\", nullable: false } as const;\nconst TEXT_RETURN = { codecId: \"pg/text@1\", nullable: false } as const;\nconst TEXT_CODEC_ID = \"pg/text@1\" as const;\nconst TEXT_ARRAY_CODEC_ID = \"pg/text-array@1\" as const;\nconst INT_CODEC_ID = \"pg/int4@1\" as const;\n\n/**\n * Build a function-style operation whose SQL is `fnName(self, arg0, arg1, ...)`.\n * The template's placeholder count is derived from the actual argument list, so\n * one helper covers fixed-arity functions (`nlevel`, `subltree`), optional-arg\n * overloads (`subpath`, `index`), and the variadic `lca` (see ADR-001). `args`\n * already carries each value through `toExpr` with its codec; `args[0]` is the\n * `self` receiver.\n */\nfunction funcOp<C extends string>(\n method: string,\n fnName: string,\n returns: { readonly codecId: C; readonly nullable: false },\n args: readonly [AnyExpression, ...AnyExpression[]],\n): Expression<{ readonly codecId: C; readonly nullable: false }> {\n const placeholders = args.map((_, i) => (i === 0 ? \"{{self}}\" : `{{arg${i - 1}}}`)).join(\", \");\n return buildOperation({\n method,\n args,\n returns,\n lowering: {\n targetFamily: \"sql\",\n strategy: \"function\",\n template: `${fnName}(${placeholders})`,\n },\n });\n}\n\nexport function ltreeQueryOperations<CT extends CodecTypesBase>(): QueryOperationTypes<CT> {\n // Hierarchy operators compare two `ltree` values; the user argument shares the\n // column's `pg/ltree@1` codec. Pattern-match operators take a query/pattern\n // string (or `string[]`) that is NOT an ltree — it is bound as text and cast\n // in-template to `lquery` / `lquery[]` / `ltxtquery` (the validated-string-param\n // approach; verified executable under PGlite).\n const hierarchyOp = (\n method: string,\n operator: string,\n self: CodecExpression<typeof LTREE_CODEC_ID, boolean, CT>,\n other: CodecExpression<typeof LTREE_CODEC_ID, boolean, CT>,\n ): BoolReturn => {\n const selfCodec = codecOf(self);\n return buildOperation({\n method,\n args: [toExpr(self, selfCodec), toExpr(other, selfCodec)],\n returns: BOOL_RETURN,\n lowering: {\n targetFamily: \"sql\",\n strategy: \"function\",\n template: `{{self}} ${operator} {{arg0}}`,\n },\n });\n };\n\n const patternOp = (\n method: string,\n operator: string,\n castType: string,\n argCodecId: typeof TEXT_CODEC_ID | typeof TEXT_ARRAY_CODEC_ID,\n self: CodecExpression<typeof LTREE_CODEC_ID, boolean, CT>,\n arg: unknown,\n ): BoolReturn => {\n const selfCodec = codecOf(self);\n return buildOperation({\n method,\n args: [toExpr(self, selfCodec), toExpr(arg, { codecId: argCodecId })],\n returns: BOOL_RETURN,\n lowering: {\n targetFamily: \"sql\",\n strategy: \"function\",\n template: `{{self}} ${operator} ({{arg0}})::${castType}`,\n },\n });\n };\n\n // Concatenation operators produce a new ltree. `concat` joins two ltree paths\n // (`{{self}} || {{arg0}}`); `concatText`/`prependText` splice a text label onto\n // the right/left. The text operand binds as `pg/text@1` and is cast in-template\n // (PG resolves the `||` overload from the cast). `prependText` places `{{self}}`\n // second because the ltree receiver is the RIGHT operand of `text || ltree`;\n // `args[0]` is still `self` (the renderer binds by placeholder name, not order).\n const concatOp = (\n method: string,\n template: string,\n args: readonly [AnyExpression, ...AnyExpression[]],\n ): LtreeReturn =>\n buildOperation({\n method,\n args,\n returns: LTREE_RETURN,\n lowering: { targetFamily: \"sql\", strategy: \"function\", template },\n });\n\n // Tier 3 — first-match operators on an `ltree[]` receiver (ADR-003).\n const firstMatchOp = (\n method: string,\n operator: string,\n self: CodecExpression<typeof LTREE_ARRAY_CODEC_ID, boolean, CT>,\n arg: unknown,\n argCodecId: typeof LTREE_CODEC_ID | typeof TEXT_CODEC_ID,\n castType?: string,\n ): LtreeReturn => {\n const selfCodec = codecOf(self);\n const template = castType\n ? `{{self}} ${operator} ({{arg0}})::${castType}`\n : `{{self}} ${operator} {{arg0}}`;\n return buildOperation({\n method,\n args: [toExpr(self, selfCodec), toExpr(arg, { codecId: argCodecId })],\n returns: LTREE_RETURN,\n lowering: { targetFamily: \"sql\", strategy: \"function\", template },\n });\n };\n\n return {\n isAncestorOf: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, other) => hierarchyOp(\"isAncestorOf\", \"@>\", self, other),\n },\n isDescendantOf: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, other) => hierarchyOp(\"isDescendantOf\", \"<@\", self, other),\n },\n matchesLquery: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, pattern) =>\n patternOp(\"matchesLquery\", \"~\", \"lquery\", TEXT_CODEC_ID, self, pattern),\n },\n matchesLqueryArray: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, patterns) =>\n patternOp(\"matchesLqueryArray\", \"?\", \"lquery[]\", TEXT_ARRAY_CODEC_ID, self, patterns),\n },\n matchesLtxtquery: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, query) =>\n patternOp(\"matchesLtxtquery\", \"@\", \"ltxtquery\", TEXT_CODEC_ID, self, query),\n },\n nlevel: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self): IntReturn =>\n funcOp(\"nlevel\", \"nlevel\", INT_RETURN, [toExpr(self, codecOf(self))]),\n },\n subltree: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, start, end): LtreeReturn =>\n funcOp(\"subltree\", \"subltree\", LTREE_RETURN, [\n toExpr(self, codecOf(self)),\n toExpr(start, { codecId: INT_CODEC_ID }),\n toExpr(end, { codecId: INT_CODEC_ID }),\n ]),\n },\n // `subpath(self, offset, len?)` — `len` omitted lowers to the 2-arg overload.\n subpath: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, offset, len): LtreeReturn => {\n const head: readonly [AnyExpression, AnyExpression] = [\n toExpr(self, codecOf(self)),\n toExpr(offset, { codecId: INT_CODEC_ID }),\n ];\n return funcOp(\n \"subpath\",\n \"subpath\",\n LTREE_RETURN,\n len === undefined ? head : [...head, toExpr(len, { codecId: INT_CODEC_ID })],\n );\n },\n },\n // `index(self, other, offset?)` — `offset` omitted lowers to the 2-arg overload.\n indexOf: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, other, offset): IntReturn => {\n const selfCodec = codecOf(self);\n const head: readonly [AnyExpression, AnyExpression] = [\n toExpr(self, selfCodec),\n toExpr(other, selfCodec),\n ];\n return funcOp(\n \"indexOf\",\n \"index\",\n INT_RETURN,\n offset === undefined ? head : [...head, toExpr(offset, { codecId: INT_CODEC_ID })],\n );\n },\n },\n // `lca(self, other, ...rest)` — variadic longest-common-ancestor (ADR-001).\n // PostgreSQL has no single-arg `lca`, so `other` is required (2–8 paths).\n lca: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, other, ...rest): LtreeReturn => {\n const selfCodec = codecOf(self);\n return funcOp(\"lca\", \"lca\", LTREE_RETURN, [\n toExpr(self, selfCodec),\n toExpr(other, selfCodec),\n ...rest.map((p) => toExpr(p, selfCodec)),\n ]);\n },\n },\n // Tier 2 — concatenation (`||`).\n concat: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, other): LtreeReturn => {\n const selfCodec = codecOf(self);\n return concatOp(\"concat\", \"{{self}} || {{arg0}}\", [\n toExpr(self, selfCodec),\n toExpr(other, selfCodec),\n ]);\n },\n },\n concatText: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, label): LtreeReturn =>\n concatOp(\"concatText\", \"{{self}} || ({{arg0}})::text\", [\n toExpr(self, codecOf(self)),\n toExpr(label, { codecId: TEXT_CODEC_ID }),\n ]),\n },\n // `text || ltree` — the ltree receiver is the right operand (ADR-002).\n prependText: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self, prefix): LtreeReturn =>\n concatOp(\"prependText\", \"({{arg0}})::text || {{self}}\", [\n toExpr(self, codecOf(self)),\n toExpr(prefix, { codecId: TEXT_CODEC_ID }),\n ]),\n },\n // Tier 2 — conversion.\n toText: {\n self: { codecId: LTREE_CODEC_ID },\n impl: (self): TextReturn =>\n funcOp(\"toText\", \"ltree2text\", TEXT_RETURN, [toExpr(self, codecOf(self))]),\n },\n // `text2ltree(text)` — rooted on `pg/text@1` (the only reachable form of the\n // free-function `text2ltree`; see ADR-002). Surfaces as `.toLtree()` on text.\n toLtree: {\n self: { codecId: TEXT_CODEC_ID },\n impl: (self): LtreeReturn =>\n funcOp(\"toLtree\", \"text2ltree\", LTREE_RETURN, [toExpr(self, codecOf(self))]),\n },\n // Tier 3 — array first-match operators (ADR-003).\n firstAncestorOf: {\n self: { codecId: LTREE_ARRAY_CODEC_ID },\n impl: (self, other) => firstMatchOp(\"firstAncestorOf\", \"?@>\", self, other, LTREE_CODEC_ID),\n },\n firstDescendantOf: {\n self: { codecId: LTREE_ARRAY_CODEC_ID },\n impl: (self, other) => firstMatchOp(\"firstDescendantOf\", \"?<@\", self, other, LTREE_CODEC_ID),\n },\n firstMatchLquery: {\n self: { codecId: LTREE_ARRAY_CODEC_ID },\n impl: (self, pattern) =>\n firstMatchOp(\"firstMatchLquery\", \"?~\", self, pattern, TEXT_CODEC_ID, \"lquery\"),\n },\n firstMatchLtxtquery: {\n self: { codecId: LTREE_ARRAY_CODEC_ID },\n impl: (self, query) =>\n firstMatchOp(\"firstMatchLtxtquery\", \"?@\", self, query, TEXT_CODEC_ID, \"ltxtquery\"),\n },\n // `lca(ltree[])` — array-receiver form (ADR-001, ADR-005). Named `lcaAll`\n // because prisma-next keys operations by name only (`createOperationRegistry`\n // throws on a duplicate); `lca` is already the variadic scalar method on\n // `pg/ltree@1`. Declares `nullable: false` for parity with the Tier 3\n // first-match ops even though PG returns NULL for an empty/NULL `ltree[]`\n // (see the empty-array integration test) — a family-wide gap, not specific\n // to `lcaAll`.\n lcaAll: {\n self: { codecId: LTREE_ARRAY_CODEC_ID },\n impl: (self): LtreeReturn =>\n funcOp(\"lcaAll\", \"lca\", LTREE_RETURN, [toExpr(self, codecOf(self))]),\n },\n };\n}\n\nconst ltreePackMetaBase = {\n kind: \"extension\",\n id: \"ltree\",\n familyId: \"sql\",\n targetId: \"postgres\",\n version: \"0.1.0\",\n capabilities: {\n postgres: {\n \"ltree.path\": true,\n },\n },\n authoring: {\n type: ltreeAuthoringTypes,\n },\n types: {\n codecTypes: {\n codecDescriptors: Array.from(ltreeCodecRegistry.values()),\n import: {\n package: \"prisma-ltree/codec-types\",\n named: \"CodecTypes\",\n alias: \"LtreeTypes\",\n },\n typeImports: [\n {\n package: \"prisma-ltree/codec-types\",\n named: \"Ltree\",\n alias: \"Ltree\",\n },\n ],\n },\n queryOperationTypes: {\n import: {\n package: \"prisma-ltree/operation-types\",\n named: \"QueryOperationTypes\",\n alias: \"LtreeQueryOperationTypes\",\n },\n },\n storage: [\n {\n typeId: LTREE_CODEC_ID,\n familyId: \"sql\",\n targetId: \"postgres\",\n nativeType: LTREE_NATIVE_TYPE,\n },\n {\n typeId: LTREE_ARRAY_CODEC_ID,\n familyId: \"sql\",\n targetId: \"postgres\",\n nativeType: LTREE_ARRAY_NATIVE_TYPE,\n },\n ],\n },\n} as const;\n\nexport const ltreePackMeta: typeof ltreePackMetaBase & {\n readonly __codecTypes?: CodecTypes;\n} = ltreePackMetaBase;\n"],"mappings":"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"}
|