@metaobjectsdev/runtime-ts 0.6.0 → 0.7.0-rc.10
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 +5 -3
- package/dist/hono/index.d.ts +44 -0
- package/dist/hono/index.d.ts.map +1 -0
- package/dist/hono/index.js +188 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono/mount-read-only.d.ts +18 -0
- package/dist/hono/mount-read-only.d.ts.map +1 -0
- package/dist/hono/mount-read-only.js +151 -0
- package/dist/hono/mount-read-only.js.map +1 -0
- package/dist/n2m-resolver.d.ts +4 -4
- package/dist/n2m-resolver.d.ts.map +1 -1
- package/dist/n2m-resolver.js +13 -13
- package/dist/n2m-resolver.js.map +1 -1
- package/dist/object-manager.d.ts +8 -0
- package/dist/object-manager.d.ts.map +1 -1
- package/dist/object-manager.js +23 -19
- package/dist/object-manager.js.map +1 -1
- package/dist/query-builder.d.ts +7 -7
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/query-builder.js +28 -26
- package/dist/query-builder.js.map +1 -1
- package/dist/relation-resolver.d.ts +3 -3
- package/dist/relation-resolver.d.ts.map +1 -1
- package/dist/relation-resolver.js +5 -5
- package/dist/relation-resolver.js.map +1 -1
- package/package.json +12 -2
- package/src/hono/index.ts +237 -0
- package/src/hono/mount-read-only.ts +189 -0
- package/src/n2m-resolver.ts +19 -11
- package/src/object-manager.ts +34 -19
- package/src/query-builder.ts +49 -25
- package/src/relation-resolver.ts +6 -3
package/README.md
CHANGED
|
@@ -13,13 +13,15 @@ npm install @metaobjectsdev/runtime-ts @metaobjectsdev/metadata kysely
|
|
|
13
13
|
## Usage
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import {
|
|
16
|
+
import { MetaDataLoader } from "@metaobjectsdev/metadata";
|
|
17
|
+
import { FileSource } from "@metaobjectsdev/metadata/core";
|
|
17
18
|
import { ObjectManager } from "@metaobjectsdev/runtime-ts";
|
|
18
19
|
import { kyselyDriver } from "@metaobjectsdev/runtime-ts/drivers";
|
|
19
20
|
import { Kysely } from "kysely";
|
|
20
21
|
|
|
21
|
-
const
|
|
22
|
-
|
|
22
|
+
const { root } = await new MetaDataLoader().load([
|
|
23
|
+
new FileSource("metaobjects/meta.blog.json"),
|
|
24
|
+
]);
|
|
23
25
|
|
|
24
26
|
const om = new ObjectManager({
|
|
25
27
|
metadata: root,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Hono, Context } from "hono";
|
|
2
|
+
import type { ZodTypeAny } from "zod";
|
|
3
|
+
import type { FilterAllowlist, SortAllowlist } from "../drizzle-fastify/filter-allowlist.js";
|
|
4
|
+
export type { FilterAllowlist, SortAllowlist, } from "../drizzle-fastify/filter-allowlist.js";
|
|
5
|
+
type AnyDrizzle = any;
|
|
6
|
+
type AnyTable = any;
|
|
7
|
+
type AnyHono = Hono<any, any, any>;
|
|
8
|
+
export type CrudVerb = "list" | "get" | "create" | "update" | "delete";
|
|
9
|
+
export interface CrudRoutesOptions {
|
|
10
|
+
/** Hono app instance. Bindings type is the consumer's — kept generic here. */
|
|
11
|
+
app: AnyHono;
|
|
12
|
+
/** REST resource path, e.g. "/subscribers". */
|
|
13
|
+
path: string;
|
|
14
|
+
/** User's Drizzle instance. */
|
|
15
|
+
db: AnyDrizzle;
|
|
16
|
+
/** Drizzle table const. Must expose an `id` column. */
|
|
17
|
+
table: AnyTable;
|
|
18
|
+
/** Zod schema for create payloads (typically `<Entity>InsertSchema`). */
|
|
19
|
+
insertSchema: ZodTypeAny;
|
|
20
|
+
/** Zod schema for update payloads (typically `<Entity>UpdateSchema`). */
|
|
21
|
+
updateSchema: ZodTypeAny;
|
|
22
|
+
/** Limit which verbs are mounted. Defaults to all five. */
|
|
23
|
+
expose?: readonly CrudVerb[];
|
|
24
|
+
/**
|
|
25
|
+
* HTTP method for the update verb. Defaults to "patch". Set to "put" to
|
|
26
|
+
* preserve a legacy API contract that already uses PUT for updates.
|
|
27
|
+
*/
|
|
28
|
+
updateMethod?: "patch" | "put";
|
|
29
|
+
filterAllowlist?: FilterAllowlist;
|
|
30
|
+
sortAllowlist?: SortAllowlist;
|
|
31
|
+
/** Dialect — required if filterAllowlist or sortAllowlist is set (for like/ilike dispatch). */
|
|
32
|
+
dialect?: "sqlite" | "postgres";
|
|
33
|
+
}
|
|
34
|
+
export declare function mountCrudRoutes(opts: CrudRoutesOptions): void;
|
|
35
|
+
type VerbOptions = Omit<CrudRoutesOptions, "expose">;
|
|
36
|
+
export declare function parseHonoFilterParams(c: Context): Record<string, unknown>;
|
|
37
|
+
export declare function mountListRoute(opts: VerbOptions): void;
|
|
38
|
+
export declare function mountGetRoute(opts: VerbOptions): void;
|
|
39
|
+
export declare function mountCreateRoute(opts: VerbOptions): void;
|
|
40
|
+
export declare function mountUpdateRoute(opts: VerbOptions): void;
|
|
41
|
+
export declare function mountDeleteRoute(opts: VerbOptions): void;
|
|
42
|
+
export declare function parseId(raw: string): number | string;
|
|
43
|
+
export { mountReadOnlyCrudRoutes, type MountReadOnlyOptions } from "./mount-read-only.js";
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hono/index.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAQtC,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACd,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,eAAe,EACf,aAAa,GACd,MAAM,wCAAwC,CAAC;AAShD,KAAK,UAAU,GAAG,GAAG,CAAC;AAEtB,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,KAAK,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEnC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,GAAG,EAAE,OAAO,CAAC;IACb,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,EAAE,EAAE,UAAU,CAAC;IACf,uDAAuD;IACvD,KAAK,EAAE,QAAQ,CAAC;IAChB,yEAAyE;IACzE,YAAY,EAAE,UAAU,CAAC;IACzB,yEAAyE;IACzE,YAAY,EAAE,UAAU,CAAC;IACzB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAI,aAAa,CAAC;IAChC,+FAA+F;IAC/F,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACjC;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAO7D;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAWrD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CA+CtD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAUrD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAWxD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAsBxD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAaxD;AAcD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGpD;AAED,OAAO,EAAE,uBAAuB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Drizzle-direct Hono adapter — Hono parallel of the drizzle-fastify mount
|
|
2
|
+
// helpers. Aimed at Workers / Bun / Node consumers running Hono on top of
|
|
3
|
+
// a Drizzle instance.
|
|
4
|
+
//
|
|
5
|
+
// Wire-format-identical to the Fastify flavor:
|
|
6
|
+
//
|
|
7
|
+
// GET {path} list with ?filter / ?sort / ?limit / ?offset / ?withCount=1
|
|
8
|
+
// GET {path}/:id findById, 404 if missing
|
|
9
|
+
// POST {path} create, 400 on Zod validation error, 201 on success
|
|
10
|
+
// PATCH {path}/:id update (default), 400 / 404 envelopes
|
|
11
|
+
// PUT {path}/:id update (when updateMethod === "put")
|
|
12
|
+
// DELETE {path}/:id delete, 204 on success, 404 if missing
|
|
13
|
+
//
|
|
14
|
+
// Filter / sort / withCount semantics are shared with drizzle-fastify via
|
|
15
|
+
// parseFilterParams and parseHonoFilterParams (qs.parse on the raw URL),
|
|
16
|
+
// so the two flavors emit byte-identical wire responses for the cross-port
|
|
17
|
+
// API-contract corpus.
|
|
18
|
+
import { eq, count, and } from "drizzle-orm";
|
|
19
|
+
import qs from "qs";
|
|
20
|
+
import { parseFilterParams, FilterParseError, } from "../drizzle-fastify/filter-parser.js";
|
|
21
|
+
import { isTruthyFlag } from "../drizzle-fastify/util.js";
|
|
22
|
+
const ALL_VERBS = ["list", "get", "create", "update", "delete"];
|
|
23
|
+
export function mountCrudRoutes(opts) {
|
|
24
|
+
const verbs = new Set(opts.expose ?? ALL_VERBS);
|
|
25
|
+
if (verbs.has("list"))
|
|
26
|
+
mountListRoute(opts);
|
|
27
|
+
if (verbs.has("get"))
|
|
28
|
+
mountGetRoute(opts);
|
|
29
|
+
if (verbs.has("create"))
|
|
30
|
+
mountCreateRoute(opts);
|
|
31
|
+
if (verbs.has("update"))
|
|
32
|
+
mountUpdateRoute(opts);
|
|
33
|
+
if (verbs.has("delete"))
|
|
34
|
+
mountDeleteRoute(opts);
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Hono-flavored qs.parse — analogue of Fastify's qs.parse(req.raw.url ...).
|
|
38
|
+
//
|
|
39
|
+
// Hono exposes the raw URL via c.req.url; we strip the prefix and feed the
|
|
40
|
+
// raw query string to qs so the bracketed filter notation (filter[a][eq]=...)
|
|
41
|
+
// is recognised. The plain c.req.query() helper drops bracket structure, so
|
|
42
|
+
// it can't replace this.
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function parseHonoFilterParams(c) {
|
|
45
|
+
const url = c.req.url;
|
|
46
|
+
const qIdx = url.indexOf("?");
|
|
47
|
+
const queryString = qIdx >= 0 ? url.slice(qIdx + 1) : "";
|
|
48
|
+
return qs.parse(queryString);
|
|
49
|
+
}
|
|
50
|
+
export function mountListRoute(opts) {
|
|
51
|
+
opts.app.get(opts.path, async (c) => {
|
|
52
|
+
try {
|
|
53
|
+
let q = opts.db.select().from(opts.table).$dynamic();
|
|
54
|
+
const qsParsed = parseHonoFilterParams(c);
|
|
55
|
+
const withCount = isTruthyFlag(qsParsed.withCount);
|
|
56
|
+
let where;
|
|
57
|
+
if (opts.filterAllowlist && opts.sortAllowlist) {
|
|
58
|
+
const parsed = parseFilterParams({
|
|
59
|
+
query: qsParsed,
|
|
60
|
+
table: opts.table,
|
|
61
|
+
allowlist: opts.filterAllowlist,
|
|
62
|
+
sortAllowlist: opts.sortAllowlist,
|
|
63
|
+
dialect: opts.dialect ?? "sqlite",
|
|
64
|
+
});
|
|
65
|
+
const combinedWhere = parsed.where && parsed.searchWhere
|
|
66
|
+
? and(parsed.where, parsed.searchWhere)
|
|
67
|
+
: (parsed.where ?? parsed.searchWhere);
|
|
68
|
+
if (combinedWhere) {
|
|
69
|
+
q = q.where(combinedWhere);
|
|
70
|
+
where = combinedWhere;
|
|
71
|
+
}
|
|
72
|
+
if (parsed.orderBy)
|
|
73
|
+
q = q.orderBy(...parsed.orderBy);
|
|
74
|
+
if (parsed.limit !== undefined)
|
|
75
|
+
q = q.limit(parsed.limit);
|
|
76
|
+
if (parsed.offset !== undefined)
|
|
77
|
+
q = q.offset(parsed.offset);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// No allowlists configured. Only limit/offset.
|
|
81
|
+
const flat = c.req.query();
|
|
82
|
+
if (flat.limit !== undefined)
|
|
83
|
+
q = q.limit(Number(flat.limit));
|
|
84
|
+
if (flat.offset !== undefined)
|
|
85
|
+
q = q.offset(Number(flat.offset));
|
|
86
|
+
}
|
|
87
|
+
const rows = await q.all();
|
|
88
|
+
if (!withCount)
|
|
89
|
+
return c.json(rows);
|
|
90
|
+
// Count query: same WHERE, no limit/offset/orderBy.
|
|
91
|
+
let cq = opts.db.select({ c: count() }).from(opts.table).$dynamic();
|
|
92
|
+
if (where)
|
|
93
|
+
cq = cq.where(where);
|
|
94
|
+
const countRow = (await cq.all())[0];
|
|
95
|
+
const total = countRow?.c ?? 0;
|
|
96
|
+
return c.json({ rows, total });
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (err instanceof FilterParseError) {
|
|
100
|
+
return c.json({ error: err.code, ...(err.details ?? {}) }, 400);
|
|
101
|
+
}
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
export function mountGetRoute(opts) {
|
|
107
|
+
opts.app.get(`${opts.path}/:id`, async (c) => {
|
|
108
|
+
const id = c.req.param("id") ?? "";
|
|
109
|
+
const row = await opts.db
|
|
110
|
+
.select()
|
|
111
|
+
.from(opts.table)
|
|
112
|
+
.where(eq(opts.table.id, parseId(id)))
|
|
113
|
+
.get();
|
|
114
|
+
return row ? c.json(row) : c.json({ error: "not_found" }, 404);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
export function mountCreateRoute(opts) {
|
|
118
|
+
opts.app.post(opts.path, async (c) => {
|
|
119
|
+
const body = await c.req.json().catch(() => undefined);
|
|
120
|
+
const parsed = opts.insertSchema.safeParse(body);
|
|
121
|
+
if (!parsed.success) {
|
|
122
|
+
return c.json({ error: "validation", issues: parsed.error.issues }, 400);
|
|
123
|
+
}
|
|
124
|
+
const result = await opts.db.insert(opts.table).values(parsed.data).returning();
|
|
125
|
+
const row = result[0];
|
|
126
|
+
return c.json(row, 201);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
export function mountUpdateRoute(opts) {
|
|
130
|
+
const handler = async (c) => {
|
|
131
|
+
const id = c.req.param("id") ?? "";
|
|
132
|
+
const body = await c.req.json().catch(() => undefined);
|
|
133
|
+
const parsed = opts.updateSchema.safeParse(body);
|
|
134
|
+
if (!parsed.success) {
|
|
135
|
+
return c.json({ error: "validation", issues: parsed.error.issues }, 400);
|
|
136
|
+
}
|
|
137
|
+
const result = await opts.db
|
|
138
|
+
.update(opts.table)
|
|
139
|
+
.set(parsed.data)
|
|
140
|
+
.where(eq(opts.table.id, parseId(id)))
|
|
141
|
+
.returning();
|
|
142
|
+
const row = result[0];
|
|
143
|
+
return row ? c.json(row) : c.json({ error: "not_found" }, 404);
|
|
144
|
+
};
|
|
145
|
+
const path = `${opts.path}/:id`;
|
|
146
|
+
if (opts.updateMethod === "put") {
|
|
147
|
+
opts.app.put(path, handler);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
opts.app.patch(path, handler);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export function mountDeleteRoute(opts) {
|
|
154
|
+
opts.app.delete(`${opts.path}/:id`, async (c) => {
|
|
155
|
+
const id = c.req.param("id") ?? "";
|
|
156
|
+
const result = await opts.db
|
|
157
|
+
.delete(opts.table)
|
|
158
|
+
.where(eq(opts.table.id, parseId(id)));
|
|
159
|
+
const affected = extractRowCount(result);
|
|
160
|
+
if (affected > 0) {
|
|
161
|
+
// 204 No Content — body must be empty.
|
|
162
|
+
return c.body(null, 204);
|
|
163
|
+
}
|
|
164
|
+
return c.json({ error: "not_found" }, 404);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function extractRowCount(result) {
|
|
168
|
+
if (typeof result === "number")
|
|
169
|
+
return result;
|
|
170
|
+
if (Array.isArray(result))
|
|
171
|
+
return result.length;
|
|
172
|
+
if (result && typeof result === "object") {
|
|
173
|
+
const obj = result;
|
|
174
|
+
if (typeof obj.rowsAffected === "number")
|
|
175
|
+
return obj.rowsAffected;
|
|
176
|
+
if (typeof obj.rowsAffected === "bigint")
|
|
177
|
+
return Number(obj.rowsAffected);
|
|
178
|
+
if (typeof obj.rowCount === "number")
|
|
179
|
+
return obj.rowCount;
|
|
180
|
+
}
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
export function parseId(raw) {
|
|
184
|
+
const n = Number(raw);
|
|
185
|
+
return Number.isFinite(n) && raw.trim() !== "" ? n : raw;
|
|
186
|
+
}
|
|
187
|
+
export { mountReadOnlyCrudRoutes } from "./mount-read-only.js";
|
|
188
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hono/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Hono } from "hono";
|
|
2
|
+
import type { FilterAllowlist, SortAllowlist } from "../drizzle-fastify/filter-allowlist.js";
|
|
3
|
+
type AnyView = any;
|
|
4
|
+
type AnyHono = Hono<any, any, any>;
|
|
5
|
+
export interface MountReadOnlyOptions {
|
|
6
|
+
readonly app: AnyHono;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly db: any;
|
|
9
|
+
readonly view: AnyView;
|
|
10
|
+
readonly filterAllowlist: FilterAllowlist;
|
|
11
|
+
readonly sortAllowlist: SortAllowlist;
|
|
12
|
+
readonly dialect: "postgres" | "sqlite";
|
|
13
|
+
/** Override default ID column name (defaults to "id"). */
|
|
14
|
+
readonly idColumn?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function mountReadOnlyCrudRoutes(opts: MountReadOnlyOptions): void;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=mount-read-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-read-only.d.ts","sourceRoot":"","sources":["../../src/hono/mount-read-only.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACd,MAAM,wCAAwC,CAAC;AAIhD,KAAK,OAAO,GAAG,GAAG,CAAC;AAEnB,KAAK,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AASnC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AA6CD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA0GxE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Hono read-only mount — projection (view-backed) entities. GET list +
|
|
2
|
+
// GET :id only. POST/PATCH/DELETE return 405. Mirrors the drizzle-fastify
|
|
3
|
+
// equivalent so the cross-port API contract holds for projection endpoints.
|
|
4
|
+
import { sql, eq, and, count } from "drizzle-orm";
|
|
5
|
+
import qs from "qs";
|
|
6
|
+
import { parseFilterParams, FilterParseError } from "../drizzle-fastify/filter-parser.js";
|
|
7
|
+
import { isTruthyFlag } from "../drizzle-fastify/util.js";
|
|
8
|
+
/**
|
|
9
|
+
* Drizzle v0.45 stores view config under this well-known Symbol. Mirrors
|
|
10
|
+
* the same workaround the Fastify mount uses — accessing `view._` on a
|
|
11
|
+
* proxy-wrapped view throws.
|
|
12
|
+
*/
|
|
13
|
+
const VIEW_BASE_CONFIG = Symbol.for("drizzle:ViewBaseConfig");
|
|
14
|
+
function getViewConfig(view) {
|
|
15
|
+
try {
|
|
16
|
+
const cfg = view[VIEW_BASE_CONFIG];
|
|
17
|
+
if (cfg && typeof cfg === "object")
|
|
18
|
+
return cfg;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// ignore — proxy handler may throw on unexpected shapes
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
function resolveViewName(view) {
|
|
26
|
+
const cfg = getViewConfig(view);
|
|
27
|
+
if (cfg) {
|
|
28
|
+
if (typeof cfg["name"] === "string")
|
|
29
|
+
return cfg["name"];
|
|
30
|
+
}
|
|
31
|
+
const v = view;
|
|
32
|
+
return ((typeof v["__tableName"] === "string" ? v["__tableName"] : undefined) ??
|
|
33
|
+
(typeof v["_name"] === "string" ? v["_name"] : undefined));
|
|
34
|
+
}
|
|
35
|
+
function isEmptyColumnView(view) {
|
|
36
|
+
const cfg = getViewConfig(view);
|
|
37
|
+
if (cfg) {
|
|
38
|
+
const fields = cfg["selectedFields"];
|
|
39
|
+
return fields !== undefined && Object.keys(fields).length === 0;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
function snakeToCamel(s) {
|
|
44
|
+
return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
|
|
45
|
+
}
|
|
46
|
+
function camelizeRow(row) {
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const [k, v] of Object.entries(row)) {
|
|
49
|
+
out[snakeToCamel(k)] = v;
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
export function mountReadOnlyCrudRoutes(opts) {
|
|
54
|
+
const { app, path, db, view, filterAllowlist, sortAllowlist, dialect } = opts;
|
|
55
|
+
const idCol = opts.idColumn ?? "id";
|
|
56
|
+
const viewName = resolveViewName(view);
|
|
57
|
+
const useRawSql = isEmptyColumnView(view) && !!viewName;
|
|
58
|
+
// ── List ──────────────────────────────────────────────────────────────────
|
|
59
|
+
app.get(path, async (c) => {
|
|
60
|
+
try {
|
|
61
|
+
if (useRawSql) {
|
|
62
|
+
const url = c.req.url;
|
|
63
|
+
const qIdx = url.indexOf("?");
|
|
64
|
+
const queryString = qIdx >= 0 ? url.slice(qIdx + 1) : "";
|
|
65
|
+
const parsed = qs.parse(queryString);
|
|
66
|
+
const limitVal = Math.min(1000, Math.max(1, Number(typeof parsed["limit"] === "string" ? parsed["limit"] : 1000)));
|
|
67
|
+
const offsetVal = Math.max(0, Number(typeof parsed["offset"] === "string" ? parsed["offset"] : 0));
|
|
68
|
+
const withCount = isTruthyFlag(parsed["withCount"]);
|
|
69
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamic raw result
|
|
70
|
+
const rows = (await db.all(sql.raw(`SELECT * FROM "${viewName}" LIMIT ${limitVal} OFFSET ${offsetVal}`)));
|
|
71
|
+
const camelRows = rows.map((r) => camelizeRow(r));
|
|
72
|
+
if (!withCount)
|
|
73
|
+
return c.json(camelRows);
|
|
74
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamic raw result
|
|
75
|
+
const countRows = (await db.all(sql.raw(`SELECT COUNT(*) AS c FROM "${viewName}"`)));
|
|
76
|
+
const total = Number(countRows[0]?.c ?? 0);
|
|
77
|
+
return c.json({ rows: camelRows, total });
|
|
78
|
+
}
|
|
79
|
+
const url = c.req.url;
|
|
80
|
+
const qIdx = url.indexOf("?");
|
|
81
|
+
const queryString = qIdx >= 0 ? url.slice(qIdx + 1) : "";
|
|
82
|
+
const parsed = qs.parse(queryString);
|
|
83
|
+
const withCount = isTruthyFlag(parsed["withCount"]);
|
|
84
|
+
const result = parseFilterParams({
|
|
85
|
+
query: parsed,
|
|
86
|
+
table: view,
|
|
87
|
+
allowlist: filterAllowlist,
|
|
88
|
+
sortAllowlist,
|
|
89
|
+
dialect,
|
|
90
|
+
});
|
|
91
|
+
const combinedWhere = result.where && result.searchWhere
|
|
92
|
+
? and(result.where, result.searchWhere)
|
|
93
|
+
: (result.where ?? result.searchWhere);
|
|
94
|
+
let q = db.select().from(view);
|
|
95
|
+
if (combinedWhere)
|
|
96
|
+
q = q.where(combinedWhere);
|
|
97
|
+
if (result.orderBy)
|
|
98
|
+
q = q.orderBy(...result.orderBy);
|
|
99
|
+
if (result.limit !== undefined)
|
|
100
|
+
q = q.limit(result.limit);
|
|
101
|
+
if (result.offset !== undefined)
|
|
102
|
+
q = q.offset(result.offset);
|
|
103
|
+
const rows = await q.all();
|
|
104
|
+
if (!withCount)
|
|
105
|
+
return c.json(rows);
|
|
106
|
+
let cq = db.select({ c: count() }).from(view);
|
|
107
|
+
if (combinedWhere)
|
|
108
|
+
cq = cq.where(combinedWhere);
|
|
109
|
+
const countRow = (await cq.all())[0];
|
|
110
|
+
const total = countRow?.c ?? 0;
|
|
111
|
+
return c.json({ rows, total });
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err instanceof FilterParseError) {
|
|
115
|
+
return c.json({ error: err.code, message: err.message }, 400);
|
|
116
|
+
}
|
|
117
|
+
throw err;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// ── Get by ID ─────────────────────────────────────────────────────────────
|
|
121
|
+
app.get(`${path}/:id`, async (c) => {
|
|
122
|
+
const id = c.req.param("id") ?? "";
|
|
123
|
+
if (useRawSql) {
|
|
124
|
+
const numericId = Number(id);
|
|
125
|
+
if (!Number.isFinite(numericId)) {
|
|
126
|
+
return c.json({ error: "invalid_id" }, 400);
|
|
127
|
+
}
|
|
128
|
+
// biome-ignore lint/suspicious/noExplicitAny: dynamic raw result
|
|
129
|
+
const rows = (await db.all(sql.raw(`SELECT * FROM "${viewName}" WHERE "${idCol}" = ${numericId} LIMIT 1`)));
|
|
130
|
+
const row = rows[0] ? camelizeRow(rows[0]) : undefined;
|
|
131
|
+
return row ? c.json(row) : c.json({ error: "not_found" }, 404);
|
|
132
|
+
}
|
|
133
|
+
// biome-ignore lint/suspicious/noExplicitAny: Drizzle view column ref
|
|
134
|
+
const colRef = view[idCol];
|
|
135
|
+
const row = await db
|
|
136
|
+
.select()
|
|
137
|
+
.from(view)
|
|
138
|
+
.where(colRef !== undefined ? eq(colRef, Number(id)) : undefined)
|
|
139
|
+
.get();
|
|
140
|
+
return row ? c.json(row) : c.json({ error: "not_found" }, 404);
|
|
141
|
+
});
|
|
142
|
+
// ── Mutations explicitly rejected (405) ───────────────────────────────────
|
|
143
|
+
const reject = (c) => c.json({ error: "method_not_allowed", message: `${c.req.method} is not supported on a projection (read-only).` }, 405);
|
|
144
|
+
// biome-ignore lint/suspicious/noExplicitAny: cross-version Hono typing
|
|
145
|
+
app.post(path, reject);
|
|
146
|
+
// biome-ignore lint/suspicious/noExplicitAny: cross-version Hono typing
|
|
147
|
+
app.patch(`${path}/:id`, reject);
|
|
148
|
+
// biome-ignore lint/suspicious/noExplicitAny: cross-version Hono typing
|
|
149
|
+
app.delete(`${path}/:id`, reject);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=mount-read-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount-read-only.js","sourceRoot":"","sources":["../../src/hono/mount-read-only.ts"],"names":[],"mappings":"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"}
|
package/dist/n2m-resolver.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MetaData } from "@metaobjectsdev/metadata";
|
|
1
|
+
import type { ColumnNamingStrategy, MetaData } from "@metaobjectsdev/metadata";
|
|
2
2
|
import type { SelectSpec, Row } from "./persistence-driver.js";
|
|
3
3
|
export interface N2mDescriptor {
|
|
4
4
|
/** Entity that declares the relationship (source of the lookup; its PK feeds sourceJoinField). */
|
|
@@ -21,7 +21,7 @@ export interface N2mBatchOutput {
|
|
|
21
21
|
}
|
|
22
22
|
/** Returns null if the named relationship is not N:M — caller should try resolveRelationDescriptor. */
|
|
23
23
|
export declare function resolveN2mDescriptor(sourceEntity: MetaData, relationName: string, root: MetaData): N2mDescriptor | null;
|
|
24
|
-
export declare function buildN2mLazySpecs(desc: N2mDescriptor, sourceRecord: Row, root: MetaData): N2mLazyOutput;
|
|
25
|
-
export declare function buildN2mBatchSpecs(desc: N2mDescriptor, sourceRecords: Row[], root: MetaData): N2mBatchOutput;
|
|
26
|
-
export declare function resolveJoinColumnName(joinEntity: MetaData, fieldName: string): string;
|
|
24
|
+
export declare function buildN2mLazySpecs(desc: N2mDescriptor, sourceRecord: Row, root: MetaData, strategy?: ColumnNamingStrategy): N2mLazyOutput;
|
|
25
|
+
export declare function buildN2mBatchSpecs(desc: N2mDescriptor, sourceRecords: Row[], root: MetaData, strategy?: ColumnNamingStrategy): N2mBatchOutput;
|
|
26
|
+
export declare function resolveJoinColumnName(joinEntity: MetaData, fieldName: string, strategy?: ColumnNamingStrategy): string;
|
|
27
27
|
//# sourceMappingURL=n2m-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"n2m-resolver.d.ts","sourceRoot":"","sources":["../src/n2m-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"n2m-resolver.d.ts","sourceRoot":"","sources":["../src/n2m-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAW/E,OAAO,KAAK,EAAE,UAAU,EAAkB,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,kGAAkG;IAClG,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,UAAU,CAAC;IACrB,gFAAgF;IAChF,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,UAAU,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,CAAC;IACrB,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,UAAU,GAAG,IAAI,CAAC;CACxD;AAED,uGAAuG;AACvG,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,QAAQ,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,QAAQ,GACb,aAAa,GAAG,IAAI,CA+BtB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,YAAY,EAAE,GAAG,EACjB,IAAI,EAAE,QAAQ,EACd,QAAQ,GAAE,oBAAqD,GAC9D,aAAa,CAgBf;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,GAAG,EAAE,EACpB,IAAI,EAAE,QAAQ,EACd,QAAQ,GAAE,oBAAqD,GAC9D,cAAc,CAgBhB;AAgCD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EACvC,QAAQ,GAAE,oBAAqD,GAC9D,MAAM,CAIR"}
|
package/dist/n2m-resolver.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Two-stage N:M: first query the join entity for FK pairs, then query the target entity for the rows.
|
|
2
2
|
// The relationship declares @joinEntity + @joinFields: [sourceJoinField, targetJoinField].
|
|
3
|
-
import { TYPE_OBJECT, TYPE_FIELD, TYPE_RELATIONSHIP, RELATIONSHIP_ATTR_CARDINALITY, RELATIONSHIP_ATTR_OBJECT_REF, RELATIONSHIP_ATTR_JOIN_ENTITY, RELATIONSHIP_ATTR_JOIN_FIELDS, CARDINALITY_MANY, resolveColumnName, } from "@metaobjectsdev/metadata";
|
|
3
|
+
import { TYPE_OBJECT, TYPE_FIELD, TYPE_RELATIONSHIP, RELATIONSHIP_ATTR_CARDINALITY, RELATIONSHIP_ATTR_OBJECT_REF, RELATIONSHIP_ATTR_JOIN_ENTITY, RELATIONSHIP_ATTR_JOIN_FIELDS, CARDINALITY_MANY, DEFAULT_COLUMN_NAMING_STRATEGY, resolveColumnName, } from "@metaobjectsdev/metadata";
|
|
4
4
|
import { MetadataError } from "./errors.js";
|
|
5
5
|
import { buildSelectSpec, resolvePkFields } from "./query-builder.js";
|
|
6
6
|
/** Returns null if the named relationship is not N:M — caller should try resolveRelationDescriptor. */
|
|
@@ -36,33 +36,33 @@ export function resolveN2mDescriptor(sourceEntity, relationName, root) {
|
|
|
36
36
|
}
|
|
37
37
|
return null;
|
|
38
38
|
}
|
|
39
|
-
export function buildN2mLazySpecs(desc, sourceRecord, root) {
|
|
39
|
+
export function buildN2mLazySpecs(desc, sourceRecord, root, strategy = DEFAULT_COLUMN_NAMING_STRATEGY) {
|
|
40
40
|
const joinEntity = mustGetEntity(root, desc.joinEntityName);
|
|
41
41
|
const targetEntity = mustGetEntity(root, desc.targetEntityName);
|
|
42
42
|
const sourcePkField = resolvePkFields(mustGetEntity(root, desc.sourceEntityName))[0];
|
|
43
43
|
const sourcePkValue = sourceRecord[sourcePkField];
|
|
44
|
-
const joinSpec = buildSelectSpec(joinEntity, { [desc.sourceJoinField]: sourcePkValue }, {});
|
|
44
|
+
const joinSpec = buildSelectSpec(joinEntity, { [desc.sourceJoinField]: sourcePkValue }, {}, undefined, strategy);
|
|
45
45
|
const makeTargetSpec = (joinRows) => {
|
|
46
|
-
const targetIds = collectTargetIds(joinRows, desc.targetJoinField, joinEntity);
|
|
46
|
+
const targetIds = collectTargetIds(joinRows, desc.targetJoinField, joinEntity, strategy);
|
|
47
47
|
if (targetIds.length === 0)
|
|
48
48
|
return null;
|
|
49
49
|
const targetPkField = resolvePkFields(targetEntity)[0];
|
|
50
|
-
return buildSelectSpec(targetEntity, { [targetPkField]: targetIds }, {});
|
|
50
|
+
return buildSelectSpec(targetEntity, { [targetPkField]: targetIds }, {}, undefined, strategy);
|
|
51
51
|
};
|
|
52
52
|
return { joinSpec, makeTargetSpec };
|
|
53
53
|
}
|
|
54
|
-
export function buildN2mBatchSpecs(desc, sourceRecords, root) {
|
|
54
|
+
export function buildN2mBatchSpecs(desc, sourceRecords, root, strategy = DEFAULT_COLUMN_NAMING_STRATEGY) {
|
|
55
55
|
const joinEntity = mustGetEntity(root, desc.joinEntityName);
|
|
56
56
|
const targetEntity = mustGetEntity(root, desc.targetEntityName);
|
|
57
57
|
const sourcePkField = resolvePkFields(mustGetEntity(root, desc.sourceEntityName))[0];
|
|
58
58
|
const sourceIds = collectIds(sourceRecords, sourcePkField);
|
|
59
|
-
const joinSpec = buildSelectSpec(joinEntity, { [desc.sourceJoinField]: sourceIds }, {});
|
|
59
|
+
const joinSpec = buildSelectSpec(joinEntity, { [desc.sourceJoinField]: sourceIds }, {}, undefined, strategy);
|
|
60
60
|
const makeTargetSpec = (joinRows) => {
|
|
61
|
-
const targetIds = collectTargetIds(joinRows, desc.targetJoinField, joinEntity);
|
|
61
|
+
const targetIds = collectTargetIds(joinRows, desc.targetJoinField, joinEntity, strategy);
|
|
62
62
|
if (targetIds.length === 0)
|
|
63
63
|
return null;
|
|
64
64
|
const targetPkField = resolvePkFields(targetEntity)[0];
|
|
65
|
-
return buildSelectSpec(targetEntity, { [targetPkField]: targetIds }, {});
|
|
65
|
+
return buildSelectSpec(targetEntity, { [targetPkField]: targetIds }, {}, undefined, strategy);
|
|
66
66
|
};
|
|
67
67
|
return { joinSpec, makeTargetSpec };
|
|
68
68
|
}
|
|
@@ -82,9 +82,9 @@ function collectIds(records, pkField) {
|
|
|
82
82
|
}
|
|
83
83
|
return [...seen];
|
|
84
84
|
}
|
|
85
|
-
function collectTargetIds(joinRows, targetJoinField, joinEntity) {
|
|
85
|
+
function collectTargetIds(joinRows, targetJoinField, joinEntity, strategy) {
|
|
86
86
|
// joinRows are raw column-keyed (driver hasn't been to-JS-row'd yet); resolve the metadata field name to its DB column.
|
|
87
|
-
const dbColumn = resolveJoinColumnName(joinEntity, targetJoinField);
|
|
87
|
+
const dbColumn = resolveJoinColumnName(joinEntity, targetJoinField, strategy);
|
|
88
88
|
const seen = new Set();
|
|
89
89
|
for (const r of joinRows) {
|
|
90
90
|
const v = r[dbColumn];
|
|
@@ -94,10 +94,10 @@ function collectTargetIds(joinRows, targetJoinField, joinEntity) {
|
|
|
94
94
|
}
|
|
95
95
|
return [...seen];
|
|
96
96
|
}
|
|
97
|
-
export function resolveJoinColumnName(joinEntity, fieldName) {
|
|
97
|
+
export function resolveJoinColumnName(joinEntity, fieldName, strategy = DEFAULT_COLUMN_NAMING_STRATEGY) {
|
|
98
98
|
const field = joinEntity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
|
|
99
99
|
if (!field)
|
|
100
100
|
throw new MetadataError(`Join field '${fieldName}' not on '${joinEntity.name}'`);
|
|
101
|
-
return resolveColumnName(field);
|
|
101
|
+
return resolveColumnName(field, strategy);
|
|
102
102
|
}
|
|
103
103
|
//# sourceMappingURL=n2m-resolver.js.map
|
package/dist/n2m-resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"n2m-resolver.js","sourceRoot":"","sources":["../src/n2m-resolver.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,2FAA2F;AAG3F,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAC1C,6BAA6B,EAAE,4BAA4B,EAC3D,6BAA6B,EAAE,6BAA6B,EAC5D,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAyBtE,uGAAuG;AACvG,MAAM,UAAU,oBAAoB,CAClC,YAAsB,EACtB,YAAoB,EACpB,IAAc;IAEd,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAS;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,KAAK,gBAAgB;YAAE,SAAS;QAChF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAuB,CAAC;QAC3F,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAuB,CAAC;QAC1F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClG,MAAM,IAAI,aAAa,CACrB,qBAAqB,YAAY,SAAS,YAAY,CAAC,IAAI,yEAAyE,EACpI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAC9B,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAC3G,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CAAC,kBAAkB,gBAAgB,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACvG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,aAAa,CAAC,gBAAgB,cAAc,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO;YACL,gBAAgB,EAAE,YAAY,CAAC,IAAI;YACnC,gBAAgB;YAChB,cAAc;YACd,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACtC,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAmB,EACnB,YAAiB,EACjB,IAAc;
|
|
1
|
+
{"version":3,"file":"n2m-resolver.js","sourceRoot":"","sources":["../src/n2m-resolver.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,2FAA2F;AAG3F,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAC1C,6BAA6B,EAAE,4BAA4B,EAC3D,6BAA6B,EAAE,6BAA6B,EAC5D,gBAAgB,EAChB,8BAA8B,EAC9B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAyBtE,uGAAuG;AACvG,MAAM,UAAU,oBAAoB,CAClC,YAAsB,EACtB,YAAoB,EACpB,IAAc;IAEd,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAS;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,KAAK,gBAAgB;YAAE,SAAS;QAChF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAuB,CAAC;QAC3F,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAuB,CAAC;QAC1F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClG,MAAM,IAAI,aAAa,CACrB,qBAAqB,YAAY,SAAS,YAAY,CAAC,IAAI,yEAAyE,EACpI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAC9B,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAC3G,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CAAC,kBAAkB,gBAAgB,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1G,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACvG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,aAAa,CAAC,gBAAgB,cAAc,aAAa,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO;YACL,gBAAgB,EAAE,YAAY,CAAC,IAAI;YACnC,gBAAgB;YAChB,cAAc;YACd,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACtC,eAAe,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAmB,EACnB,YAAiB,EACjB,IAAc,EACd,WAAiC,8BAA8B;IAE/D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IACtF,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,aAA+B,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEnI,MAAM,cAAc,GAAG,CAAC,QAAe,EAAqB,EAAE;QAC5D,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,aAAa,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,CAAC;QACxD,OAAO,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChG,CAAC,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAmB,EACnB,aAAoB,EACpB,IAAc,EACd,WAAiC,8BAA8B;IAE/D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,MAAM,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IACtF,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE7G,MAAM,cAAc,GAAG,CAAC,QAAe,EAAqB,EAAE;QAC5D,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,aAAa,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,CAAC;QACxD,OAAO,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChG,CAAC,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,aAAa,CAAC,IAAc,EAAE,IAAY;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,WAAW,IAAI,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,OAAc,EAAE,OAAe;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,CAAmB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAwB,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAe,EAAE,eAAuB,EAAE,UAAoB,EAAE,QAA8B;IAE9F,wHAAwH;IACxH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,UAAU,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,CAAmB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAwB,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,UAAoB,EAAE,SAAiB,EACvC,WAAiC,8BAA8B;IAE/D,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClG,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,aAAa,CAAC,eAAe,SAAS,aAAa,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7F,OAAO,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/object-manager.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import type { MetaData } from "@metaobjectsdev/metadata";
|
|
2
2
|
import type { PersistenceDriver, Row } from "./persistence-driver.js";
|
|
3
3
|
import { type Filter, type QueryOpts } from "./query-builder.js";
|
|
4
|
+
import { type ColumnNamingStrategy } from "@metaobjectsdev/metadata";
|
|
4
5
|
import { type FieldViewSpec, type EntityViewSpec } from "./view.js";
|
|
5
6
|
import type { ValidationResult } from "./validator-runner.js";
|
|
6
7
|
export interface ObjectManagerOptions {
|
|
7
8
|
metadata: MetaData;
|
|
8
9
|
driver: PersistenceDriver;
|
|
10
|
+
/**
|
|
11
|
+
* Column-naming strategy for fields with no `@column` override. Defaults to
|
|
12
|
+
* `"snake_case"`. Must agree with the codegen / migration config that
|
|
13
|
+
* created the schema (a mismatch yields columns the runtime can't address).
|
|
14
|
+
*/
|
|
15
|
+
columnNamingStrategy?: ColumnNamingStrategy;
|
|
9
16
|
}
|
|
10
17
|
export interface ReadOpts extends QueryOpts {
|
|
11
18
|
view?: string;
|
|
@@ -20,6 +27,7 @@ export interface WriteOpts {
|
|
|
20
27
|
export declare class ObjectManager {
|
|
21
28
|
private readonly metadata;
|
|
22
29
|
private readonly driver;
|
|
30
|
+
private readonly columnNamingStrategy;
|
|
23
31
|
private readonly nameMapCache;
|
|
24
32
|
constructor(opts: ObjectManagerOptions);
|
|
25
33
|
private nameMap;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-manager.d.ts","sourceRoot":"","sources":["../src/object-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAMzD,OAAO,KAAK,EACV,iBAAiB,EAAE,GAAG,EAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,MAAM,EAAE,KAAK,SAAS,EAC5B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"object-manager.d.ts","sourceRoot":"","sources":["../src/object-manager.ts"],"names":[],"mappings":"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"}
|