optio-api 0.2.0 → 0.2.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.
|
@@ -8,6 +8,7 @@ export type ParseResult = {
|
|
|
8
8
|
};
|
|
9
9
|
export declare function parseMetadataFilterQuery(raw: unknown): ParseResult;
|
|
10
10
|
export declare function metadataFilterToMongo(filter: ProcessMetadataFilter | undefined): Record<string, unknown>;
|
|
11
|
+
export declare function isLegacyFlatFilter(filter: ProcessMetadataFilter): boolean;
|
|
11
12
|
export declare function detectLegacyMetadataParams(rawQuery: Record<string, unknown>): string[];
|
|
12
13
|
export declare function formatLegacyMetadataMessage(legacyKeys: string[]): string;
|
|
13
14
|
//# sourceMappingURL=metadata-filter-query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-filter-query.d.ts","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metadata-filter-query.d.ts","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAG3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAelE;AAMD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIzB;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAMzE;AAiDD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAItF;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAGxE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MetadataFilterQueryParamSchema } from 'optio-contracts';
|
|
1
|
+
import { MetadataFilterQueryParamSchema, } from 'optio-contracts';
|
|
2
2
|
export function parseMetadataFilterQuery(raw) {
|
|
3
3
|
if (raw === undefined || raw === null || raw === '') {
|
|
4
4
|
return { ok: true, value: undefined };
|
|
@@ -15,15 +15,81 @@ export function parseMetadataFilterQuery(raw) {
|
|
|
15
15
|
}
|
|
16
16
|
return { ok: true, value: result.data };
|
|
17
17
|
}
|
|
18
|
+
// Public entry point: dispatches between the legacy flat shape and the new
|
|
19
|
+
// predicate tree by structural inspection. Output is a MongoDB query
|
|
20
|
+
// fragment ready to merge into a `find` filter (or pass into an aggregation
|
|
21
|
+
// `$match`).
|
|
18
22
|
export function metadataFilterToMongo(filter) {
|
|
19
23
|
if (!filter)
|
|
20
24
|
return {};
|
|
25
|
+
if (isLegacyFlatFilter(filter))
|
|
26
|
+
return legacyToMongo(filter);
|
|
27
|
+
return predicateToMongo(filter);
|
|
28
|
+
}
|
|
29
|
+
// A filter is legacy iff every top-level key is a field name (not a
|
|
30
|
+
// combinator keyword) and every value is a scalar (not an operator object).
|
|
31
|
+
export function isLegacyFlatFilter(filter) {
|
|
32
|
+
for (const [k, v] of Object.entries(filter)) {
|
|
33
|
+
if (k === 'AND' || k === 'OR' || k === 'NOT')
|
|
34
|
+
return false;
|
|
35
|
+
if (v !== null && typeof v === 'object' && !Array.isArray(v))
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
function legacyToMongo(filter) {
|
|
21
41
|
const out = {};
|
|
22
42
|
for (const [k, v] of Object.entries(filter)) {
|
|
23
43
|
out[`metadata.${k}`] = v;
|
|
24
44
|
}
|
|
25
45
|
return out;
|
|
26
46
|
}
|
|
47
|
+
function predicateToMongo(p) {
|
|
48
|
+
const pp = p;
|
|
49
|
+
if (Array.isArray(pp.AND)) {
|
|
50
|
+
return { $and: pp.AND.map(predicateToMongo) };
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(pp.OR)) {
|
|
53
|
+
return { $or: pp.OR.map(predicateToMongo) };
|
|
54
|
+
}
|
|
55
|
+
if (pp.NOT !== undefined) {
|
|
56
|
+
return { $nor: [predicateToMongo(pp.NOT)] };
|
|
57
|
+
}
|
|
58
|
+
// Record of field→leaf-ops. Single-leaf nodes emit a flat object; multi-leaf
|
|
59
|
+
// nodes split into $and of single-key objects to keep translator output regular.
|
|
60
|
+
const entries = Object.entries(pp);
|
|
61
|
+
if (entries.length === 1) {
|
|
62
|
+
const [field, ops] = entries[0];
|
|
63
|
+
return { [`metadata.${field}`]: leafOpsToMongo(ops) };
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
$and: entries.map(([field, ops]) => ({
|
|
67
|
+
[`metadata.${field}`]: leafOpsToMongo(ops),
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function leafOpsToMongo(ops) {
|
|
72
|
+
const m = {};
|
|
73
|
+
if (ops.eq !== undefined)
|
|
74
|
+
m.$eq = ops.eq;
|
|
75
|
+
if (ops.ne !== undefined)
|
|
76
|
+
m.$ne = ops.ne;
|
|
77
|
+
if (ops.in !== undefined)
|
|
78
|
+
m.$in = ops.in;
|
|
79
|
+
if (ops.nin !== undefined)
|
|
80
|
+
m.$nin = ops.nin;
|
|
81
|
+
if (ops.exists !== undefined)
|
|
82
|
+
m.$exists = ops.exists;
|
|
83
|
+
if (ops.gt !== undefined)
|
|
84
|
+
m.$gt = ops.gt;
|
|
85
|
+
if (ops.gte !== undefined)
|
|
86
|
+
m.$gte = ops.gte;
|
|
87
|
+
if (ops.lt !== undefined)
|
|
88
|
+
m.$lt = ops.lt;
|
|
89
|
+
if (ops.lte !== undefined)
|
|
90
|
+
m.$lte = ops.lte;
|
|
91
|
+
return m;
|
|
92
|
+
}
|
|
27
93
|
export function detectLegacyMetadataParams(rawQuery) {
|
|
28
94
|
return Object.keys(rawQuery)
|
|
29
95
|
.filter(k => k.startsWith('metadata.'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-filter-query.js","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metadata-filter-query.js","sourceRoot":"","sources":["../src/metadata-filter-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAI/B,MAAM,iBAAiB,CAAC;AAMzB,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,8BAA8B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,wBAAwB;SACnE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,2EAA2E;AAC3E,qEAAqE;AACrE,4EAA4E;AAC5E,aAAa;AACb,MAAM,UAAU,qBAAqB,CACnC,MAAyC;IAEzC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,kBAAkB,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC,MAAiC,CAAC,CAAC;IACxF,OAAO,gBAAgB,CAAC,MAAkC,CAAC,CAAC;AAC9D,CAAC;AAED,oEAAoE;AACpE,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,MAA6B;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,CAA2B;IACnD,MAAM,EAAE,GAAG,CAA4B,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAG,EAAE,CAAC,GAAkC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAG,EAAE,CAAC,EAAiC,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAA+B,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IACD,6EAA6E;IAC7E,iFAAiF;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAA8B,CAAC;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACjC,OAAO,EAAE,CAAC,YAAY,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,YAAY,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC;SAC3C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAkB;IACxC,MAAM,CAAC,GAA4B,EAAE,CAAC;IACtC,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;QAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IACrD,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;QAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;IAC5C,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;QAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAiC;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;SACtC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAoB;IAC9D,OAAO,4DAA4D;QACjE,2DAA2D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "optio-api",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Server-side optio API with Fastify, Express, and Next.js adapters.",
|
|
6
6
|
"repository": {
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"ioredis": "^5.4.0",
|
|
50
50
|
"mongodb": "^6.12.0",
|
|
51
51
|
"zod": "^3",
|
|
52
|
-
"optio-contracts": "0.2.
|
|
52
|
+
"optio-contracts": "0.2.2"
|
|
53
53
|
},
|
|
54
54
|
"optionalDependencies": {
|
|
55
55
|
"@ts-rest/fastify": "^3.51.0"
|