@metaobjectsdev/runtime-ts 1.0.4 → 1.0.5-rc.2
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.
|
@@ -21,6 +21,15 @@ export interface M2mRouteOptions {
|
|
|
21
21
|
targetPkColumn?: string;
|
|
22
22
|
/** Undirected self-join: union both junction FK columns on read. */
|
|
23
23
|
symmetric: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The target is a TPH subtype: `targetTable` is its discriminator base's table, and
|
|
26
|
+
* stage 2 keeps only rows whose discriminator `column` (physical name) equals `value`.
|
|
27
|
+
* Absent → every related row is returned, behaviour unchanged.
|
|
28
|
+
*/
|
|
29
|
+
targetDiscriminator?: {
|
|
30
|
+
column: string;
|
|
31
|
+
value: string;
|
|
32
|
+
};
|
|
24
33
|
/** Fastify route-level hooks (auth, etc.). */
|
|
25
34
|
routeOptions?: RouteShorthandOptions;
|
|
26
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount-m2m.d.ts","sourceRoot":"","sources":["../../src/drizzle-fastify/mount-m2m.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mount-m2m.d.ts","sourceRoot":"","sources":["../../src/drizzle-fastify/mount-m2m.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAMtE,KAAK,UAAU,GAAG,GAAG,CAAC;AAEtB,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,EAAE,EAAE,UAAU,CAAC;IACf,wDAAwD;IACxD,aAAa,EAAE,QAAQ,CAAC;IACxB,kDAAkD;IAClD,WAAW,EAAE,QAAQ,CAAC;IACtB,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,8CAA8C;IAC9C,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAuDzD"}
|
|
@@ -18,7 +18,12 @@
|
|
|
18
18
|
// the source side (via @sourceRefField) → sourceColumn/targetColumn.
|
|
19
19
|
// 3. Symmetric self-join: junction WHERE sourceCol = :id OR targetCol = :id;
|
|
20
20
|
// per row the related id is whichever column is NOT the source id.
|
|
21
|
-
|
|
21
|
+
//
|
|
22
|
+
// A target that is a TPH SUBTYPE lives in its discriminator base's table, and the
|
|
23
|
+
// junction FK can only point at that base table — so it can hold the id of a row of
|
|
24
|
+
// another subtype. `targetDiscriminator` ANDs the subtype predicate into stage 2 so
|
|
25
|
+
// only rows of the declared target come back.
|
|
26
|
+
import { and, eq, or, inArray } from "drizzle-orm";
|
|
22
27
|
import { coerceIdForColumn } from "./util.js";
|
|
23
28
|
export function mountM2mRoute(opts) {
|
|
24
29
|
const targetPk = opts.targetPkColumn ?? "id";
|
|
@@ -64,10 +69,12 @@ export function mountM2mRoute(opts) {
|
|
|
64
69
|
return [];
|
|
65
70
|
// Stage 2 — load the target rows.
|
|
66
71
|
const pkCol = columnRef(opts.targetTable, targetPk);
|
|
72
|
+
const byPk = inArray(pkCol, [...relatedIds]);
|
|
73
|
+
const disc = opts.targetDiscriminator;
|
|
67
74
|
return await opts.db
|
|
68
75
|
.select()
|
|
69
76
|
.from(opts.targetTable)
|
|
70
|
-
.where(
|
|
77
|
+
.where(disc ? and(byPk, eq(columnRef(opts.targetTable, disc.column), disc.value)) : byPk);
|
|
71
78
|
});
|
|
72
79
|
}
|
|
73
80
|
function addId(set, v) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount-m2m.js","sourceRoot":"","sources":["../../src/drizzle-fastify/mount-m2m.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wDAAwD;AACxD,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,0CAA0C;AAC1C,EAAE;AACF,kDAAkD;AAClD,+EAA+E;AAC/E,oDAAoD;AACpD,+EAA+E;AAC/E,0EAA0E;AAC1E,+EAA+E;AAC/E,wEAAwE;
|
|
1
|
+
{"version":3,"file":"mount-m2m.js","sourceRoot":"","sources":["../../src/drizzle-fastify/mount-m2m.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/runtime-ts",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5-rc.2",
|
|
4
4
|
"description": "Node-side runtime helpers for MetaObjects: Fastify route builders, Drizzle filter/sort integration, Kysely drivers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"access": "public"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@metaobjectsdev/metadata": "1.0.
|
|
68
|
-
"@metaobjectsdev/render": "1.0.
|
|
67
|
+
"@metaobjectsdev/metadata": "1.0.5-rc.2",
|
|
68
|
+
"@metaobjectsdev/render": "1.0.5-rc.2",
|
|
69
69
|
"qs": "^6.13.0"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
@@ -18,9 +18,14 @@
|
|
|
18
18
|
// the source side (via @sourceRefField) → sourceColumn/targetColumn.
|
|
19
19
|
// 3. Symmetric self-join: junction WHERE sourceCol = :id OR targetCol = :id;
|
|
20
20
|
// per row the related id is whichever column is NOT the source id.
|
|
21
|
+
//
|
|
22
|
+
// A target that is a TPH SUBTYPE lives in its discriminator base's table, and the
|
|
23
|
+
// junction FK can only point at that base table — so it can hold the id of a row of
|
|
24
|
+
// another subtype. `targetDiscriminator` ANDs the subtype predicate into stage 2 so
|
|
25
|
+
// only rows of the declared target come back.
|
|
21
26
|
|
|
22
27
|
import type { FastifyInstance, RouteShorthandOptions } from "fastify";
|
|
23
|
-
import { eq, or, inArray } from "drizzle-orm";
|
|
28
|
+
import { and, eq, or, inArray } from "drizzle-orm";
|
|
24
29
|
import { coerceIdForColumn } from "./util.js";
|
|
25
30
|
|
|
26
31
|
// Loose Drizzle types — the helper works across libsql / better-sqlite3 / pg.
|
|
@@ -49,6 +54,12 @@ export interface M2mRouteOptions {
|
|
|
49
54
|
targetPkColumn?: string;
|
|
50
55
|
/** Undirected self-join: union both junction FK columns on read. */
|
|
51
56
|
symmetric: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* The target is a TPH subtype: `targetTable` is its discriminator base's table, and
|
|
59
|
+
* stage 2 keeps only rows whose discriminator `column` (physical name) equals `value`.
|
|
60
|
+
* Absent → every related row is returned, behaviour unchanged.
|
|
61
|
+
*/
|
|
62
|
+
targetDiscriminator?: { column: string; value: string };
|
|
52
63
|
/** Fastify route-level hooks (auth, etc.). */
|
|
53
64
|
routeOptions?: RouteShorthandOptions;
|
|
54
65
|
}
|
|
@@ -101,10 +112,12 @@ export function mountM2mRoute(opts: M2mRouteOptions): void {
|
|
|
101
112
|
|
|
102
113
|
// Stage 2 — load the target rows.
|
|
103
114
|
const pkCol = columnRef(opts.targetTable, targetPk);
|
|
115
|
+
const byPk = inArray(pkCol, [...relatedIds]);
|
|
116
|
+
const disc = opts.targetDiscriminator;
|
|
104
117
|
return await opts.db
|
|
105
118
|
.select()
|
|
106
119
|
.from(opts.targetTable)
|
|
107
|
-
.where(
|
|
120
|
+
.where(disc ? and(byPk, eq(columnRef(opts.targetTable, disc.column), disc.value)) : byPk);
|
|
108
121
|
});
|
|
109
122
|
}
|
|
110
123
|
|