@metaobjectsdev/runtime-ts 0.5.0-rc.1
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/LICENSE +189 -0
- package/README.md +102 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/drivers/drizzle-driver.d.ts +25 -0
- package/dist/drivers/drizzle-driver.d.ts.map +1 -0
- package/dist/drivers/drizzle-driver.js +405 -0
- package/dist/drivers/drizzle-driver.js.map +1 -0
- package/dist/drivers/in-memory-driver.d.ts +11 -0
- package/dist/drivers/in-memory-driver.d.ts.map +1 -0
- package/dist/drivers/in-memory-driver.js +232 -0
- package/dist/drivers/in-memory-driver.js.map +1 -0
- package/dist/drivers/index.d.ts +4 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +4 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/kysely-driver.d.ts +12 -0
- package/dist/drivers/kysely-driver.d.ts.map +1 -0
- package/dist/drivers/kysely-driver.js +203 -0
- package/dist/drivers/kysely-driver.js.map +1 -0
- package/dist/drizzle-fastify/filter-allowlist.d.ts +19 -0
- package/dist/drizzle-fastify/filter-allowlist.d.ts.map +1 -0
- package/dist/drizzle-fastify/filter-allowlist.js +10 -0
- package/dist/drizzle-fastify/filter-allowlist.js.map +1 -0
- package/dist/drizzle-fastify/filter-parser.d.ts +28 -0
- package/dist/drizzle-fastify/filter-parser.d.ts.map +1 -0
- package/dist/drizzle-fastify/filter-parser.js +185 -0
- package/dist/drizzle-fastify/filter-parser.js.map +1 -0
- package/dist/drizzle-fastify/index.d.ts +48 -0
- package/dist/drizzle-fastify/index.d.ts.map +1 -0
- package/dist/drizzle-fastify/index.js +181 -0
- package/dist/drizzle-fastify/index.js.map +1 -0
- package/dist/drizzle-fastify/mount-read-only.d.ts +17 -0
- package/dist/drizzle-fastify/mount-read-only.d.ts.map +1 -0
- package/dist/drizzle-fastify/mount-read-only.js +159 -0
- package/dist/drizzle-fastify/mount-read-only.js.map +1 -0
- package/dist/drizzle-fastify/util.d.ts +5 -0
- package/dist/drizzle-fastify/util.d.ts.map +1 -0
- package/dist/drizzle-fastify/util.js +12 -0
- package/dist/drizzle-fastify/util.js.map +1 -0
- package/dist/errors.d.ts +68 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +86 -0
- package/dist/errors.js.map +1 -0
- package/dist/fastify/index.d.ts +65 -0
- package/dist/fastify/index.d.ts.map +1 -0
- package/dist/fastify/index.js +118 -0
- package/dist/fastify/index.js.map +1 -0
- package/dist/identity-strategy.d.ts +10 -0
- package/dist/identity-strategy.d.ts.map +1 -0
- package/dist/identity-strategy.js +67 -0
- package/dist/identity-strategy.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/n2m-resolver.d.ts +27 -0
- package/dist/n2m-resolver.d.ts.map +1 -0
- package/dist/n2m-resolver.js +103 -0
- package/dist/n2m-resolver.js.map +1 -0
- package/dist/object-manager.d.ts +51 -0
- package/dist/object-manager.d.ts.map +1 -0
- package/dist/object-manager.js +355 -0
- package/dist/object-manager.js.map +1 -0
- package/dist/persistence-driver.d.ts +88 -0
- package/dist/persistence-driver.d.ts.map +1 -0
- package/dist/persistence-driver.js +5 -0
- package/dist/persistence-driver.js.map +1 -0
- package/dist/query-builder.d.ts +35 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +178 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/ref-codec.d.ts +8 -0
- package/dist/ref-codec.d.ts.map +1 -0
- package/dist/ref-codec.js +42 -0
- package/dist/ref-codec.js.map +1 -0
- package/dist/relation-resolver.d.ts +27 -0
- package/dist/relation-resolver.d.ts.map +1 -0
- package/dist/relation-resolver.js +136 -0
- package/dist/relation-resolver.js.map +1 -0
- package/dist/type-coercer.d.ts +5 -0
- package/dist/type-coercer.d.ts.map +1 -0
- package/dist/type-coercer.js +43 -0
- package/dist/type-coercer.js.map +1 -0
- package/dist/validator-runner.d.ts +14 -0
- package/dist/validator-runner.d.ts.map +1 -0
- package/dist/validator-runner.js +155 -0
- package/dist/validator-runner.js.map +1 -0
- package/dist/view.d.ts +19 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +60 -0
- package/dist/view.js.map +1 -0
- package/package.json +87 -0
- package/src/constants.ts +7 -0
- package/src/drivers/drizzle-driver.ts +474 -0
- package/src/drivers/in-memory-driver.ts +256 -0
- package/src/drivers/index.ts +3 -0
- package/src/drivers/kysely-driver.ts +240 -0
- package/src/drizzle-fastify/filter-allowlist.ts +31 -0
- package/src/drizzle-fastify/filter-parser.ts +229 -0
- package/src/drizzle-fastify/index.ts +225 -0
- package/src/drizzle-fastify/mount-read-only.ts +187 -0
- package/src/drizzle-fastify/util.ts +10 -0
- package/src/errors.ts +114 -0
- package/src/fastify/index.ts +181 -0
- package/src/identity-strategy.ts +92 -0
- package/src/index.ts +24 -0
- package/src/n2m-resolver.ts +152 -0
- package/src/object-manager.ts +444 -0
- package/src/persistence-driver.ts +92 -0
- package/src/query-builder.ts +224 -0
- package/src/ref-codec.ts +64 -0
- package/src/relation-resolver.ts +171 -0
- package/src/type-coercer.ts +39 -0
- package/src/validator-runner.ts +168 -0
- package/src/view.ts +82 -0
package/src/view.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { MetaData } from "@metaobjectsdev/metadata";
|
|
2
|
+
import {
|
|
3
|
+
TYPE_FIELD, TYPE_VIEW, TYPE_VALIDATOR,
|
|
4
|
+
VALIDATOR_SUBTYPE_REQUIRED,
|
|
5
|
+
FIELD_ATTR_REQUIRED,
|
|
6
|
+
} from "@metaobjectsdev/metadata";
|
|
7
|
+
import { MetadataError } from "./errors.js";
|
|
8
|
+
|
|
9
|
+
export interface FieldViewSpec {
|
|
10
|
+
fieldName: string;
|
|
11
|
+
fieldSubType: string;
|
|
12
|
+
viewName: string;
|
|
13
|
+
/** The view node's subType (e.g., "text", "number", "select"). */
|
|
14
|
+
controlType: string;
|
|
15
|
+
attrs: Record<string, unknown>;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface EntityViewSpec {
|
|
20
|
+
entityName: string;
|
|
21
|
+
viewName: string;
|
|
22
|
+
fields: FieldViewSpec[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function viewFieldNames(entity: MetaData, viewName: string): string[] {
|
|
26
|
+
const names: string[] = [];
|
|
27
|
+
for (const field of entity.ownChildren()) {
|
|
28
|
+
if (field.type !== TYPE_FIELD) continue;
|
|
29
|
+
if (field.ownChildren().some((c) => c.type === TYPE_VIEW && c.name === viewName)) {
|
|
30
|
+
names.push(field.name);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return names;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function fieldViewSpec(entity: MetaData, fieldName: string, viewName: string): FieldViewSpec | null {
|
|
37
|
+
const field = entity.ownChildren().find((c) => c.type === TYPE_FIELD && c.name === fieldName);
|
|
38
|
+
if (!field) return null;
|
|
39
|
+
const view = field.ownChildren().find((c) => c.type === TYPE_VIEW && c.name === viewName);
|
|
40
|
+
if (!view) return null;
|
|
41
|
+
|
|
42
|
+
const attrs: Record<string, unknown> = {};
|
|
43
|
+
for (const key of view.ownAttrs().keys()) {
|
|
44
|
+
attrs[key] = view.ownAttr(key);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const required = isFieldRequired(field);
|
|
48
|
+
|
|
49
|
+
const result: FieldViewSpec = {
|
|
50
|
+
fieldName: field.name,
|
|
51
|
+
fieldSubType: field.subType,
|
|
52
|
+
viewName,
|
|
53
|
+
controlType: view.subType,
|
|
54
|
+
attrs,
|
|
55
|
+
};
|
|
56
|
+
if (required) result.required = true;
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function entityViewSpec(entity: MetaData, viewName: string): EntityViewSpec {
|
|
61
|
+
const fields: FieldViewSpec[] = [];
|
|
62
|
+
for (const field of entity.ownChildren()) {
|
|
63
|
+
if (field.type !== TYPE_FIELD) continue;
|
|
64
|
+
const spec = fieldViewSpec(entity, field.name, viewName);
|
|
65
|
+
if (spec !== null) fields.push(spec);
|
|
66
|
+
}
|
|
67
|
+
if (fields.length === 0) {
|
|
68
|
+
throw new MetadataError(
|
|
69
|
+
`No fields tagged with view '${viewName}' on entity '${entity.name}'`,
|
|
70
|
+
{ entity: entity.name },
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return { entityName: entity.name, viewName, fields };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isFieldRequired(field: MetaData): boolean {
|
|
77
|
+
if (field.ownAttr(FIELD_ATTR_REQUIRED) === true) return true;
|
|
78
|
+
for (const child of field.ownChildren()) {
|
|
79
|
+
if (child.type === TYPE_VALIDATOR && child.subType === VALIDATOR_SUBTYPE_REQUIRED) return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|