@generazioneai/genquery 0.1.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/LICENSE +28 -0
- package/README.md +218 -0
- package/dist/adapters/base.d.ts +32 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +3 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/typeorm/adapter.d.ts +35 -0
- package/dist/adapters/typeorm/adapter.d.ts.map +1 -0
- package/dist/adapters/typeorm/adapter.js +111 -0
- package/dist/adapters/typeorm/adapter.js.map +1 -0
- package/dist/adapters/typeorm/aliases.d.ts +25 -0
- package/dist/adapters/typeorm/aliases.d.ts.map +1 -0
- package/dist/adapters/typeorm/aliases.js +47 -0
- package/dist/adapters/typeorm/aliases.js.map +1 -0
- package/dist/adapters/typeorm/create.d.ts +29 -0
- package/dist/adapters/typeorm/create.d.ts.map +1 -0
- package/dist/adapters/typeorm/create.js +29 -0
- package/dist/adapters/typeorm/create.js.map +1 -0
- package/dist/adapters/typeorm/escape.d.ts +5 -0
- package/dist/adapters/typeorm/escape.d.ts.map +1 -0
- package/dist/adapters/typeorm/escape.js +13 -0
- package/dist/adapters/typeorm/escape.js.map +1 -0
- package/dist/adapters/typeorm/index.d.ts +4 -0
- package/dist/adapters/typeorm/index.d.ts.map +1 -0
- package/dist/adapters/typeorm/index.js +10 -0
- package/dist/adapters/typeorm/index.js.map +1 -0
- package/dist/adapters/typeorm/joins.d.ts +29 -0
- package/dist/adapters/typeorm/joins.d.ts.map +1 -0
- package/dist/adapters/typeorm/joins.js +91 -0
- package/dist/adapters/typeorm/joins.js.map +1 -0
- package/dist/adapters/typeorm/params.d.ts +8 -0
- package/dist/adapters/typeorm/params.d.ts.map +1 -0
- package/dist/adapters/typeorm/params.js +15 -0
- package/dist/adapters/typeorm/params.js.map +1 -0
- package/dist/adapters/typeorm/schema-from-typeorm.d.ts +50 -0
- package/dist/adapters/typeorm/schema-from-typeorm.d.ts.map +1 -0
- package/dist/adapters/typeorm/schema-from-typeorm.js +170 -0
- package/dist/adapters/typeorm/schema-from-typeorm.js.map +1 -0
- package/dist/adapters/typeorm/where.d.ts +26 -0
- package/dist/adapters/typeorm/where.d.ts.map +1 -0
- package/dist/adapters/typeorm/where.js +297 -0
- package/dist/adapters/typeorm/where.js.map +1 -0
- package/dist/datetime.d.ts +4 -0
- package/dist/datetime.d.ts.map +1 -0
- package/dist/datetime.js +86 -0
- package/dist/datetime.js.map +1 -0
- package/dist/engine.d.ts +52 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +52 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/parsed.d.ts +127 -0
- package/dist/parsed.d.ts.map +1 -0
- package/dist/parsed.js +8 -0
- package/dist/parsed.js.map +1 -0
- package/dist/parser.d.ts +5 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +404 -0
- package/dist/parser.js.map +1 -0
- package/dist/schema.d.ts +57 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +36 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +180 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +70 -0
- package/spec.md +221 -0
package/dist/parsed.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalized, validated form of a GenQuery. Adapters operate on these types,
|
|
3
|
+
* which means each adapter only sees one canonical shape per concept (no more
|
|
4
|
+
* "string or object" unions).
|
|
5
|
+
*/
|
|
6
|
+
import type { NumericOp, SortOrder, StringSearchMode } from "./types";
|
|
7
|
+
export interface ParsedStringSearch {
|
|
8
|
+
mode: StringSearchMode;
|
|
9
|
+
contained: boolean;
|
|
10
|
+
caseSensitive: boolean;
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedNumberSearch {
|
|
14
|
+
op: NumericOp;
|
|
15
|
+
value: number;
|
|
16
|
+
}
|
|
17
|
+
export type ParsedDateSearch = {
|
|
18
|
+
kind: "exact";
|
|
19
|
+
value: Date;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "range";
|
|
22
|
+
before?: Date;
|
|
23
|
+
after?: Date;
|
|
24
|
+
};
|
|
25
|
+
export interface ParsedBoolSearch {
|
|
26
|
+
value: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface ParsedEnumSearch {
|
|
29
|
+
value: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ParsedNullCheck {
|
|
32
|
+
/** `true` → IS NULL, `false` → IS NOT NULL. */
|
|
33
|
+
isNull: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ParsedEmptyCheck {
|
|
36
|
+
/** `true` → IS NULL OR = '', `false` → IS NOT NULL AND <> ''. String-only. */
|
|
37
|
+
isEmpty: boolean;
|
|
38
|
+
}
|
|
39
|
+
export type RelationOp = "some" | "every" | "none";
|
|
40
|
+
export type ParsedFieldCondition = {
|
|
41
|
+
kind: "string";
|
|
42
|
+
field: string;
|
|
43
|
+
search: ParsedStringSearch;
|
|
44
|
+
} | {
|
|
45
|
+
kind: "number";
|
|
46
|
+
field: string;
|
|
47
|
+
search: ParsedNumberSearch;
|
|
48
|
+
} | {
|
|
49
|
+
kind: "bool";
|
|
50
|
+
field: string;
|
|
51
|
+
search: ParsedBoolSearch;
|
|
52
|
+
} | {
|
|
53
|
+
kind: "date";
|
|
54
|
+
field: string;
|
|
55
|
+
search: ParsedDateSearch;
|
|
56
|
+
} | {
|
|
57
|
+
kind: "enum";
|
|
58
|
+
field: string;
|
|
59
|
+
search: ParsedEnumSearch;
|
|
60
|
+
} | {
|
|
61
|
+
kind: "null";
|
|
62
|
+
field: string;
|
|
63
|
+
check: ParsedNullCheck;
|
|
64
|
+
} | {
|
|
65
|
+
kind: "empty";
|
|
66
|
+
field: string;
|
|
67
|
+
check: ParsedEmptyCheck;
|
|
68
|
+
} | {
|
|
69
|
+
kind: "relation";
|
|
70
|
+
field: string;
|
|
71
|
+
targetEntity: string;
|
|
72
|
+
op: RelationOp;
|
|
73
|
+
nested: ParsedSearchBy;
|
|
74
|
+
};
|
|
75
|
+
export interface ParsedSearchBy {
|
|
76
|
+
/** Conditions joined by AND. */
|
|
77
|
+
conditions: ParsedFieldCondition[];
|
|
78
|
+
/**
|
|
79
|
+
* Each element is itself a full searchBy; elements are OR-ed together, and
|
|
80
|
+
* the resulting OR group is AND-ed with `conditions`.
|
|
81
|
+
*/
|
|
82
|
+
or: ParsedSearchBy[];
|
|
83
|
+
}
|
|
84
|
+
export interface ParsedOrderBy {
|
|
85
|
+
field: string;
|
|
86
|
+
order: SortOrder;
|
|
87
|
+
}
|
|
88
|
+
export type ParsedSelect = {
|
|
89
|
+
kind: "all";
|
|
90
|
+
} | {
|
|
91
|
+
kind: "none";
|
|
92
|
+
} | {
|
|
93
|
+
kind: "fields";
|
|
94
|
+
fields: string[];
|
|
95
|
+
};
|
|
96
|
+
export type ParsedIncludeRelation = {
|
|
97
|
+
kind: "all";
|
|
98
|
+
} | {
|
|
99
|
+
kind: "fields";
|
|
100
|
+
fields: string[];
|
|
101
|
+
};
|
|
102
|
+
export type ParsedInclude = {
|
|
103
|
+
kind: "none";
|
|
104
|
+
} | {
|
|
105
|
+
kind: "all";
|
|
106
|
+
} | {
|
|
107
|
+
kind: "map";
|
|
108
|
+
relations: Record<string, ParsedIncludeRelation>;
|
|
109
|
+
};
|
|
110
|
+
export type ParsedPagination = {
|
|
111
|
+
kind: "all";
|
|
112
|
+
} | {
|
|
113
|
+
kind: "first";
|
|
114
|
+
} | {
|
|
115
|
+
kind: "page";
|
|
116
|
+
page: number;
|
|
117
|
+
perPage: number;
|
|
118
|
+
};
|
|
119
|
+
export interface ParsedQuery {
|
|
120
|
+
rootEntity: string;
|
|
121
|
+
orderBy?: ParsedOrderBy;
|
|
122
|
+
searchBy?: ParsedSearchBy;
|
|
123
|
+
include: ParsedInclude;
|
|
124
|
+
select: ParsedSelect;
|
|
125
|
+
pagination: ParsedPagination;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=parsed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsed.d.ts","sourceRoot":"","sources":["../src/parsed.ts"],"names":[],"mappings":"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"}
|
package/dist/parsed.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Normalized, validated form of a GenQuery. Adapters operate on these types,
|
|
4
|
+
* which means each adapter only sees one canonical shape per concept (no more
|
|
5
|
+
* "string or object" unions).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=parsed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsed.js","sourceRoot":"","sources":["../src/parsed.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Schema } from "./schema";
|
|
2
|
+
import type { GenQueryInput } from "./types";
|
|
3
|
+
import type { ParsedQuery } from "./parsed";
|
|
4
|
+
export declare function parseQuery(input: GenQueryInput, schema: Schema, rootEntity: string): ParsedQuery;
|
|
5
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,aAAa,EAMd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAUV,WAAW,EAIZ,MAAM,UAAU,CAAC;AA+hBlB,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW,CAwCb"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseQuery = parseQuery;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
const datetime_1 = require("./datetime");
|
|
6
|
+
const schema_1 = require("./schema");
|
|
7
|
+
const STRING_MODES = [
|
|
8
|
+
"splitword",
|
|
9
|
+
"exact",
|
|
10
|
+
"nativeregex",
|
|
11
|
+
];
|
|
12
|
+
const NUMERIC_OPS = [">", "<", ">=", "<=", "=="];
|
|
13
|
+
const PRESENCE_CHECK_KEYS = ["isNull", "isEmpty"];
|
|
14
|
+
/**
|
|
15
|
+
* Detect a presence-check wrapper: a plain object whose keys are all drawn
|
|
16
|
+
* from `PRESENCE_CHECK_KEYS`. Returns `false` for objects mixing presence
|
|
17
|
+
* keys with other keys so per-type parsers can report a more specific error.
|
|
18
|
+
*/
|
|
19
|
+
function isPresenceCheckObject(v) {
|
|
20
|
+
if (!isPlainObject(v))
|
|
21
|
+
return false;
|
|
22
|
+
const keys = Object.keys(v);
|
|
23
|
+
if (keys.length === 0)
|
|
24
|
+
return false;
|
|
25
|
+
return keys.every((k) => PRESENCE_CHECK_KEYS.includes(k));
|
|
26
|
+
}
|
|
27
|
+
function parsePresenceCheck(raw, path) {
|
|
28
|
+
const out = {};
|
|
29
|
+
for (const key of PRESENCE_CHECK_KEYS) {
|
|
30
|
+
const v = raw[key];
|
|
31
|
+
if (v === undefined)
|
|
32
|
+
continue;
|
|
33
|
+
if (typeof v !== "boolean") {
|
|
34
|
+
throw new errors_1.QueryValidationError(`Presence check: '${key}' must be a boolean`, `${path}.${key}`);
|
|
35
|
+
}
|
|
36
|
+
if (key === "isNull")
|
|
37
|
+
out.null = { isNull: v };
|
|
38
|
+
else
|
|
39
|
+
out.empty = { isEmpty: v };
|
|
40
|
+
}
|
|
41
|
+
// isPresenceCheckObject guarantees at least one key, so `out` is non-empty.
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
function isPlainObject(v) {
|
|
45
|
+
return (v !== null &&
|
|
46
|
+
typeof v === "object" &&
|
|
47
|
+
!Array.isArray(v) &&
|
|
48
|
+
!(v instanceof Date));
|
|
49
|
+
}
|
|
50
|
+
function parseStringSearch(raw, path) {
|
|
51
|
+
if (typeof raw === "string") {
|
|
52
|
+
return {
|
|
53
|
+
mode: "splitword",
|
|
54
|
+
contained: false,
|
|
55
|
+
caseSensitive: false,
|
|
56
|
+
value: raw,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (!isPlainObject(raw)) {
|
|
60
|
+
throw new errors_1.QueryValidationError("Expected string or string-search object", path);
|
|
61
|
+
}
|
|
62
|
+
const value = raw.value;
|
|
63
|
+
if (typeof value !== "string") {
|
|
64
|
+
throw new errors_1.QueryValidationError("String search: 'value' must be a string", `${path}.value`);
|
|
65
|
+
}
|
|
66
|
+
let mode = "splitword";
|
|
67
|
+
if (raw.mode !== undefined) {
|
|
68
|
+
if (typeof raw.mode !== "string" || !STRING_MODES.includes(raw.mode)) {
|
|
69
|
+
throw new errors_1.QueryValidationError(`String search: 'mode' must be one of ${STRING_MODES.join(", ")}`, `${path}.mode`);
|
|
70
|
+
}
|
|
71
|
+
mode = raw.mode;
|
|
72
|
+
}
|
|
73
|
+
else if (typeof raw.type === "string") {
|
|
74
|
+
// The spec example uses `type: "exact"` instead of `mode`. Accept both.
|
|
75
|
+
if (!STRING_MODES.includes(raw.type)) {
|
|
76
|
+
throw new errors_1.QueryValidationError(`String search: 'type' must be one of ${STRING_MODES.join(", ")}`, `${path}.type`);
|
|
77
|
+
}
|
|
78
|
+
mode = raw.type;
|
|
79
|
+
}
|
|
80
|
+
const contained = raw.contained === undefined ? false : Boolean(raw.contained);
|
|
81
|
+
const caseSensitive = raw.caseSensitive === undefined ? false : Boolean(raw.caseSensitive);
|
|
82
|
+
return { mode, contained, caseSensitive, value };
|
|
83
|
+
}
|
|
84
|
+
function parseNumberSearch(raw, path) {
|
|
85
|
+
if (typeof raw === "number") {
|
|
86
|
+
return { op: "==", value: raw };
|
|
87
|
+
}
|
|
88
|
+
if (!isPlainObject(raw)) {
|
|
89
|
+
throw new errors_1.QueryValidationError("Expected number or numeric-comparison object", path);
|
|
90
|
+
}
|
|
91
|
+
const value = raw.value;
|
|
92
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
93
|
+
throw new errors_1.QueryValidationError("Numeric comparison: 'value' must be a finite number", `${path}.value`);
|
|
94
|
+
}
|
|
95
|
+
if (raw.type !== undefined) {
|
|
96
|
+
throw new errors_1.QueryValidationError("Numeric comparison: 'type' is not a valid key. Use 'operation' instead.", `${path}.type`);
|
|
97
|
+
}
|
|
98
|
+
let op = "==";
|
|
99
|
+
if (raw.operation !== undefined) {
|
|
100
|
+
if (typeof raw.operation !== "string" ||
|
|
101
|
+
!NUMERIC_OPS.includes(raw.operation)) {
|
|
102
|
+
throw new errors_1.QueryValidationError(`Numeric comparison: 'operation' must be one of ${NUMERIC_OPS.join(", ")}`, `${path}.operation`);
|
|
103
|
+
}
|
|
104
|
+
op = raw.operation;
|
|
105
|
+
}
|
|
106
|
+
return { op, value };
|
|
107
|
+
}
|
|
108
|
+
function isDateRange(v) {
|
|
109
|
+
if (!isPlainObject(v))
|
|
110
|
+
return false;
|
|
111
|
+
const keys = Object.keys(v);
|
|
112
|
+
if (keys.length === 0)
|
|
113
|
+
return false;
|
|
114
|
+
return keys.every((k) => k === "before" || k === "after");
|
|
115
|
+
}
|
|
116
|
+
function parseDateSearch(raw, path) {
|
|
117
|
+
if (isDateRange(raw)) {
|
|
118
|
+
const out = { kind: "range" };
|
|
119
|
+
if (raw.before !== undefined) {
|
|
120
|
+
out.before = (0, datetime_1.parseDateTime)(raw.before, `${path}.before`);
|
|
121
|
+
}
|
|
122
|
+
if (raw.after !== undefined) {
|
|
123
|
+
out.after = (0, datetime_1.parseDateTime)(raw.after, `${path}.after`);
|
|
124
|
+
}
|
|
125
|
+
if (out.before === undefined && out.after === undefined) {
|
|
126
|
+
throw new errors_1.QueryValidationError("Date range must contain at least one of 'before' or 'after'", path);
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
if ((0, datetime_1.looksLikeDateTime)(raw)) {
|
|
131
|
+
return { kind: "exact", value: (0, datetime_1.parseDateTime)(raw, path) };
|
|
132
|
+
}
|
|
133
|
+
throw new errors_1.QueryValidationError("Expected ISO datetime, datetime object, or { before, after } range", path);
|
|
134
|
+
}
|
|
135
|
+
const RELATION_OPS = ["some", "every", "none"];
|
|
136
|
+
/**
|
|
137
|
+
* Detect the explicit-wrapper form for a relation filter and split it into one
|
|
138
|
+
* entry per cardinality op. Returns `null` if the value is a plain SearchBy
|
|
139
|
+
* (implicit `some`). Throws if the wrapper contains unknown keys.
|
|
140
|
+
*/
|
|
141
|
+
function parseRelationWrapper(value) {
|
|
142
|
+
if (!isPlainObject(value))
|
|
143
|
+
return null;
|
|
144
|
+
const keys = Object.keys(value);
|
|
145
|
+
const hasOp = keys.some((k) => RELATION_OPS.includes(k));
|
|
146
|
+
if (!hasOp)
|
|
147
|
+
return null;
|
|
148
|
+
const unknown = keys.find((k) => !RELATION_OPS.includes(k));
|
|
149
|
+
if (unknown !== undefined) {
|
|
150
|
+
throw new errors_1.QueryValidationError(`Unknown relation filter operator '${unknown}'. Expected 'some', 'every', or 'none'.`, unknown);
|
|
151
|
+
}
|
|
152
|
+
const result = [];
|
|
153
|
+
for (const op of RELATION_OPS) {
|
|
154
|
+
const nestedValue = value[op];
|
|
155
|
+
if (nestedValue !== undefined)
|
|
156
|
+
result.push({ op, nestedValue });
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
function parseSearchBy(raw, schema, entityName, path) {
|
|
161
|
+
if (!isPlainObject(raw)) {
|
|
162
|
+
throw new errors_1.QueryValidationError("searchBy must be an object", path);
|
|
163
|
+
}
|
|
164
|
+
const entity = (0, schema_1.getEntity)(schema, entityName);
|
|
165
|
+
const conditions = [];
|
|
166
|
+
const or = [];
|
|
167
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
168
|
+
const fieldPath = `${path}.${key}`;
|
|
169
|
+
if (key === "OR") {
|
|
170
|
+
if (!Array.isArray(value)) {
|
|
171
|
+
throw new errors_1.QueryValidationError("OR must be an array", fieldPath);
|
|
172
|
+
}
|
|
173
|
+
value.forEach((item, idx) => {
|
|
174
|
+
or.push(parseSearchBy(item, schema, entityName, `${fieldPath}[${idx}]`));
|
|
175
|
+
});
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const fieldDef = entity.fields[key];
|
|
179
|
+
const relationDef = entity.relations?.[key];
|
|
180
|
+
if (fieldDef) {
|
|
181
|
+
conditions.push(...parseLeafConditions(key, fieldDef, value, fieldPath));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (relationDef) {
|
|
185
|
+
const wrapperOps = parseRelationWrapper(value);
|
|
186
|
+
if (wrapperOps) {
|
|
187
|
+
for (const { op, nestedValue } of wrapperOps) {
|
|
188
|
+
conditions.push({
|
|
189
|
+
kind: "relation",
|
|
190
|
+
field: key,
|
|
191
|
+
targetEntity: relationDef.target,
|
|
192
|
+
op,
|
|
193
|
+
nested: parseSearchBy(nestedValue, schema, relationDef.target, `${fieldPath}.${op}`),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
conditions.push({
|
|
199
|
+
kind: "relation",
|
|
200
|
+
field: key,
|
|
201
|
+
targetEntity: relationDef.target,
|
|
202
|
+
op: "some",
|
|
203
|
+
nested: parseSearchBy(value, schema, relationDef.target, fieldPath),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
throw new errors_1.QueryValidationError(`Unknown field or relation '${key}' on entity '${entityName}'`, fieldPath);
|
|
209
|
+
}
|
|
210
|
+
return { conditions, or };
|
|
211
|
+
}
|
|
212
|
+
function parseLeafConditions(field, def, value, path) {
|
|
213
|
+
// Presence check (`isNull` on any primitive, `isEmpty` on strings only).
|
|
214
|
+
// Detect before per-type parsing so e.g. `{ isNull: true }` on a string
|
|
215
|
+
// field doesn't get rejected as a malformed StringSearchObjectInput.
|
|
216
|
+
// Both keys may coexist and AND together (the parsed output is one
|
|
217
|
+
// condition per key, and conditions naturally AND).
|
|
218
|
+
if (isPresenceCheckObject(value)) {
|
|
219
|
+
const parsed = parsePresenceCheck(value, path);
|
|
220
|
+
if (parsed.null && !def.nullable) {
|
|
221
|
+
throw new errors_1.QueryValidationError(`isNull is only valid on nullable fields; field '${field}' is not nullable`, path);
|
|
222
|
+
}
|
|
223
|
+
if (parsed.empty && def.type !== "string") {
|
|
224
|
+
throw new errors_1.QueryValidationError(`isEmpty is only valid on string fields; field '${field}' is ${def.type}`, path);
|
|
225
|
+
}
|
|
226
|
+
const out = [];
|
|
227
|
+
if (parsed.null)
|
|
228
|
+
out.push({ kind: "null", field, check: parsed.null });
|
|
229
|
+
if (parsed.empty)
|
|
230
|
+
out.push({ kind: "empty", field, check: parsed.empty });
|
|
231
|
+
return out;
|
|
232
|
+
}
|
|
233
|
+
return [parseLeafConditionTyped(field, def, value, path)];
|
|
234
|
+
}
|
|
235
|
+
function parseLeafConditionTyped(field, def, value, path) {
|
|
236
|
+
switch (def.type) {
|
|
237
|
+
case "string":
|
|
238
|
+
return {
|
|
239
|
+
kind: "string",
|
|
240
|
+
field,
|
|
241
|
+
search: parseStringSearch(value, path),
|
|
242
|
+
};
|
|
243
|
+
case "number":
|
|
244
|
+
return {
|
|
245
|
+
kind: "number",
|
|
246
|
+
field,
|
|
247
|
+
search: parseNumberSearch(value, path),
|
|
248
|
+
};
|
|
249
|
+
case "boolean":
|
|
250
|
+
if (typeof value !== "boolean") {
|
|
251
|
+
throw new errors_1.QueryValidationError(`Field '${field}' is boolean; expected true or false`, path);
|
|
252
|
+
}
|
|
253
|
+
return { kind: "bool", field, search: { value } };
|
|
254
|
+
case "date":
|
|
255
|
+
return {
|
|
256
|
+
kind: "date",
|
|
257
|
+
field,
|
|
258
|
+
search: parseDateSearch(value, path),
|
|
259
|
+
};
|
|
260
|
+
case "enum": {
|
|
261
|
+
if (typeof value !== "string") {
|
|
262
|
+
throw new errors_1.QueryValidationError(`Field '${field}' is enum; expected a string`, path);
|
|
263
|
+
}
|
|
264
|
+
if (!def.values.includes(value)) {
|
|
265
|
+
throw new errors_1.QueryValidationError(`Field '${field}' must be one of: ${def.values.join(", ")}`, path);
|
|
266
|
+
}
|
|
267
|
+
return { kind: "enum", field, search: { value } };
|
|
268
|
+
}
|
|
269
|
+
default:
|
|
270
|
+
throw new errors_1.QueryValidationError(`Unsupported field type '${def.type}'`, path);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function parseOrderBy(raw, entity, path) {
|
|
274
|
+
if (typeof raw === "string") {
|
|
275
|
+
if (!entity.fields[raw]) {
|
|
276
|
+
throw new errors_1.QueryValidationError(`orderBy field '${raw}' is not a known field of '${entity.name}'`, path);
|
|
277
|
+
}
|
|
278
|
+
return { field: raw, order: "desc" };
|
|
279
|
+
}
|
|
280
|
+
if (!isPlainObject(raw)) {
|
|
281
|
+
throw new errors_1.QueryValidationError("orderBy must be a string or object", path);
|
|
282
|
+
}
|
|
283
|
+
const field = raw.field;
|
|
284
|
+
if (typeof field !== "string") {
|
|
285
|
+
throw new errors_1.QueryValidationError("orderBy.field is required and must be a string", `${path}.field`);
|
|
286
|
+
}
|
|
287
|
+
if (!entity.fields[field]) {
|
|
288
|
+
throw new errors_1.QueryValidationError(`orderBy field '${field}' is not a known field of '${entity.name}'`, `${path}.field`);
|
|
289
|
+
}
|
|
290
|
+
const order = raw.order ?? "desc";
|
|
291
|
+
if (order !== "asc" && order !== "desc") {
|
|
292
|
+
throw new errors_1.QueryValidationError(`orderBy.order must be 'asc' or 'desc'`, `${path}.order`);
|
|
293
|
+
}
|
|
294
|
+
return { field, order };
|
|
295
|
+
}
|
|
296
|
+
function parseSelect(raw, entity, path) {
|
|
297
|
+
if (raw === "all")
|
|
298
|
+
return { kind: "all" };
|
|
299
|
+
if (raw === "none")
|
|
300
|
+
return { kind: "none" };
|
|
301
|
+
if (!isPlainObject(raw)) {
|
|
302
|
+
throw new errors_1.QueryValidationError("select must be 'all', 'none', or an object", path);
|
|
303
|
+
}
|
|
304
|
+
const fields = [];
|
|
305
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
306
|
+
if (v !== true)
|
|
307
|
+
continue;
|
|
308
|
+
if (!entity.fields[k]) {
|
|
309
|
+
throw new errors_1.QueryValidationError(`select: '${k}' is not a known field of '${entity.name}'`, `${path}.${k}`);
|
|
310
|
+
}
|
|
311
|
+
fields.push(k);
|
|
312
|
+
}
|
|
313
|
+
return { kind: "fields", fields };
|
|
314
|
+
}
|
|
315
|
+
function parseInclude(raw, entity, schema, path) {
|
|
316
|
+
if (raw === "none")
|
|
317
|
+
return { kind: "none" };
|
|
318
|
+
if (raw === "all")
|
|
319
|
+
return { kind: "all" };
|
|
320
|
+
if (!isPlainObject(raw)) {
|
|
321
|
+
throw new errors_1.QueryValidationError("include must be 'all', 'none', or an object", path);
|
|
322
|
+
}
|
|
323
|
+
const relations = {};
|
|
324
|
+
for (const [relName, spec] of Object.entries(raw)) {
|
|
325
|
+
const relDef = entity.relations?.[relName];
|
|
326
|
+
if (!relDef) {
|
|
327
|
+
throw new errors_1.QueryValidationError(`include: '${relName}' is not a known relation of '${entity.name}'`, `${path}.${relName}`);
|
|
328
|
+
}
|
|
329
|
+
if (spec === "all") {
|
|
330
|
+
relations[relName] = { kind: "all" };
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (!isPlainObject(spec)) {
|
|
334
|
+
throw new errors_1.QueryValidationError(`include.${relName} must be 'all' or an object`, `${path}.${relName}`);
|
|
335
|
+
}
|
|
336
|
+
const targetEntity = (0, schema_1.getEntity)(schema, relDef.target);
|
|
337
|
+
const fields = [];
|
|
338
|
+
for (const [k, v] of Object.entries(spec)) {
|
|
339
|
+
if (v !== true)
|
|
340
|
+
continue;
|
|
341
|
+
if (!targetEntity.fields[k]) {
|
|
342
|
+
throw new errors_1.QueryValidationError(`include.${relName}.${k} is not a known field of '${targetEntity.name}'`, `${path}.${relName}.${k}`);
|
|
343
|
+
}
|
|
344
|
+
fields.push(k);
|
|
345
|
+
}
|
|
346
|
+
relations[relName] = { kind: "fields", fields };
|
|
347
|
+
}
|
|
348
|
+
return { kind: "map", relations };
|
|
349
|
+
}
|
|
350
|
+
function parsePagination(raw, path) {
|
|
351
|
+
if (raw === "all")
|
|
352
|
+
return { kind: "all" };
|
|
353
|
+
if (raw === "first")
|
|
354
|
+
return { kind: "first" };
|
|
355
|
+
if (!isPlainObject(raw)) {
|
|
356
|
+
throw new errors_1.QueryValidationError("pagination must be 'all', 'first', or an object", path);
|
|
357
|
+
}
|
|
358
|
+
const pageRaw = raw.page;
|
|
359
|
+
const perPageRaw = raw.perPage;
|
|
360
|
+
const page = pageRaw === undefined ? 0 : Number(pageRaw);
|
|
361
|
+
const perPage = perPageRaw === undefined ? 20 : Number(perPageRaw);
|
|
362
|
+
if (!Number.isInteger(page) || page < 0) {
|
|
363
|
+
throw new errors_1.QueryValidationError("pagination.page must be a non-negative integer", `${path}.page`);
|
|
364
|
+
}
|
|
365
|
+
if (!Number.isInteger(perPage) || perPage <= 0) {
|
|
366
|
+
throw new errors_1.QueryValidationError("pagination.perPage must be a positive integer", `${path}.perPage`);
|
|
367
|
+
}
|
|
368
|
+
return { kind: "page", page, perPage };
|
|
369
|
+
}
|
|
370
|
+
// Avoid leaning on a circular type import in parseLeafCondition's signature.
|
|
371
|
+
// (The helper above is intentionally typed loosely; this re-export is the
|
|
372
|
+
// public signature.)
|
|
373
|
+
function parseQuery(input, schema, rootEntity) {
|
|
374
|
+
if (input === null ||
|
|
375
|
+
typeof input !== "object" ||
|
|
376
|
+
Array.isArray(input) ||
|
|
377
|
+
input instanceof Date) {
|
|
378
|
+
throw new errors_1.QueryValidationError("query must be an object", "");
|
|
379
|
+
}
|
|
380
|
+
const entity = (0, schema_1.getEntity)(schema, rootEntity);
|
|
381
|
+
const parsed = {
|
|
382
|
+
rootEntity,
|
|
383
|
+
include: { kind: "none" },
|
|
384
|
+
select: { kind: "all" },
|
|
385
|
+
pagination: { kind: "all" },
|
|
386
|
+
};
|
|
387
|
+
if (input.orderBy !== undefined) {
|
|
388
|
+
parsed.orderBy = parseOrderBy(input.orderBy, entity, "orderBy");
|
|
389
|
+
}
|
|
390
|
+
if (input.searchBy !== undefined) {
|
|
391
|
+
parsed.searchBy = parseSearchBy(input.searchBy, schema, rootEntity, "searchBy");
|
|
392
|
+
}
|
|
393
|
+
if (input.include !== undefined) {
|
|
394
|
+
parsed.include = parseInclude(input.include, entity, schema, "include");
|
|
395
|
+
}
|
|
396
|
+
if (input.select !== undefined) {
|
|
397
|
+
parsed.select = parseSelect(input.select, entity, "select");
|
|
398
|
+
}
|
|
399
|
+
if (input.pagination !== undefined) {
|
|
400
|
+
parsed.pagination = parsePagination(input.pagination, "pagination");
|
|
401
|
+
}
|
|
402
|
+
return parsed;
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema describes what fields and relations exist on each entity, so the
|
|
3
|
+
* parser can validate queries and the adapter can produce correct joins and
|
|
4
|
+
* conditions. The schema is intentionally ORM-agnostic.
|
|
5
|
+
*/
|
|
6
|
+
export type FieldType = "string" | "number" | "boolean" | "date" | "enum";
|
|
7
|
+
interface BaseFieldDefinition {
|
|
8
|
+
/**
|
|
9
|
+
* Override the database column name. Defaults to the field key.
|
|
10
|
+
* Adapters may ignore this if they rely on ORM metadata (TypeORM uses the
|
|
11
|
+
* entity's own column mapping).
|
|
12
|
+
*/
|
|
13
|
+
column?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Whether the column accepts NULL. Defaults to `false`. The parser uses this
|
|
16
|
+
* to reject `{ isNull }` presence checks on non-nullable fields. With
|
|
17
|
+
* `schemaFromTypeORM`, this is auto-populated from `ColumnMetadata.isNullable`.
|
|
18
|
+
*/
|
|
19
|
+
nullable?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type FieldDefinition = (BaseFieldDefinition & {
|
|
22
|
+
type: "string" | "number" | "boolean" | "date";
|
|
23
|
+
}) | EnumFieldDefinition;
|
|
24
|
+
export interface EnumFieldDefinition extends BaseFieldDefinition {
|
|
25
|
+
type: "enum";
|
|
26
|
+
/** Allowed enum values. The parser rejects anything not in this list. */
|
|
27
|
+
values: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
export interface RelationDefinition {
|
|
30
|
+
/** Name of the related entity in the schema's `entities` map. */
|
|
31
|
+
target: string;
|
|
32
|
+
/** Cardinality. Currently informational; defaults to "many". */
|
|
33
|
+
kind?: "one" | "many";
|
|
34
|
+
}
|
|
35
|
+
export interface EntityDefinition {
|
|
36
|
+
/** Logical name of the entity (matches the key in `Schema.entities`). */
|
|
37
|
+
name: string;
|
|
38
|
+
fields: Record<string, FieldDefinition>;
|
|
39
|
+
relations?: Record<string, RelationDefinition>;
|
|
40
|
+
/**
|
|
41
|
+
* Primary key field name. Used to give relations a stable identity in
|
|
42
|
+
* adapter output. Defaults to "id".
|
|
43
|
+
*/
|
|
44
|
+
primaryKey?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface Schema {
|
|
47
|
+
entities: Record<string, EntityDefinition>;
|
|
48
|
+
}
|
|
49
|
+
export declare class SchemaError extends Error {
|
|
50
|
+
constructor(message: string);
|
|
51
|
+
}
|
|
52
|
+
export declare function getEntity(schema: Schema, name: string): EntityDefinition;
|
|
53
|
+
export declare function getField(schema: Schema, entityName: string, field: string): FieldDefinition | undefined;
|
|
54
|
+
export declare function getRelation(schema: Schema, entityName: string, field: string): RelationDefinition | undefined;
|
|
55
|
+
export declare function primaryKeyOf(entity: EntityDefinition): string;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1E,UAAU,mBAAmB;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GACvB,CAAC,mBAAmB,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC,GAC1E,mBAAmB,CAAC;AAExB,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAMxE;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,eAAe,GAAG,SAAS,CAE7B;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,kBAAkB,GAAG,SAAS,CAEhC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAE7D"}
|