@wxn0brp/vql 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 +21 -0
- package/README.md +95 -0
- package/dist/apiAbstract.d.ts +17 -0
- package/dist/apiAbstract.js +25 -0
- package/dist/apiAbstract.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -0
- package/dist/cpu/relation.d.ts +3 -0
- package/dist/cpu/relation.js +38 -0
- package/dist/cpu/relation.js.map +1 -0
- package/dist/cpu/request.d.ts +3 -0
- package/dist/cpu/request.js +66 -0
- package/dist/cpu/request.js.map +1 -0
- package/dist/cpu/string/index.d.ts +8 -0
- package/dist/cpu/string/index.js +55 -0
- package/dist/cpu/string/index.js.map +1 -0
- package/dist/cpu/string/json5.d.ts +2 -0
- package/dist/cpu/string/json5.js +9 -0
- package/dist/cpu/string/json5.js.map +1 -0
- package/dist/cpu/string/middle.d.ts +3 -0
- package/dist/cpu/string/middle.js +42 -0
- package/dist/cpu/string/middle.js.map +1 -0
- package/dist/cpu/string/simple.d.ts +2 -0
- package/dist/cpu/string/simple.js +152 -0
- package/dist/cpu/string/simple.js.map +1 -0
- package/dist/cpu/string/utils.d.ts +17 -0
- package/dist/cpu/string/utils.js +70 -0
- package/dist/cpu/string/utils.js.map +1 -0
- package/dist/cpu/string/yaml.d.ts +2 -0
- package/dist/cpu/string/yaml.js +20 -0
- package/dist/cpu/string/yaml.js.map +1 -0
- package/dist/cpu/utils.d.ts +1 -0
- package/dist/cpu/utils.js +15 -0
- package/dist/cpu/utils.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -0
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.js +3 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/relation.d.ts +3 -0
- package/dist/permissions/relation.js +53 -0
- package/dist/permissions/relation.js.map +1 -0
- package/dist/permissions/request.d.ts +18 -0
- package/dist/permissions/request.js +130 -0
- package/dist/permissions/request.js.map +1 -0
- package/dist/permissions/utils.d.ts +5 -0
- package/dist/permissions/utils.js +23 -0
- package/dist/permissions/utils.js.map +1 -0
- package/dist/processor.d.ts +11 -0
- package/dist/processor.js +44 -0
- package/dist/processor.js.map +1 -0
- package/dist/sheet/index.d.ts +2 -0
- package/dist/sheet/index.js +65 -0
- package/dist/sheet/index.js.map +1 -0
- package/dist/sheet/load.d.ts +3 -0
- package/dist/sheet/load.js +23 -0
- package/dist/sheet/load.js.map +1 -0
- package/dist/tests/customExe.d.ts +6 -0
- package/dist/tests/customExe.js +27 -0
- package/dist/tests/customExe.js.map +1 -0
- package/dist/tests/db.d.ts +1 -0
- package/dist/tests/db.js +33 -0
- package/dist/tests/db.js.map +1 -0
- package/dist/tests/index.d.ts +1 -0
- package/dist/tests/index.js +104 -0
- package/dist/tests/index.js.map +1 -0
- package/dist/types/perm.d.ts +7 -0
- package/dist/types/perm.js +9 -0
- package/dist/types/perm.js.map +1 -0
- package/dist/types/vql.d.ts +118 -0
- package/dist/types/vql.js +2 -0
- package/dist/types/vql.js.map +1 -0
- package/dist/valid.d.ts +17 -0
- package/dist/valid.js +51 -0
- package/dist/valid.js.map +1 -0
- package/package.json +33 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 wxn0brP
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# VQL (Valthera Query Language)
|
|
2
|
+
|
|
3
|
+
VQL is a query language and processing framework designed for managing and interacting with databases using ValtheraDB. It provides a robust permission system, query execution, and a GUI for managing ACL rules and database structures.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Query Execution**: Supports CRUD operations and advanced query capabilities.
|
|
8
|
+
- **Permission Management**: Fine-grained access control using Gate Warden.
|
|
9
|
+
- **GUI**: A web-based interface for managing ACL rules and database structures.
|
|
10
|
+
- **Extensibility**: Easily extendable with pre-defined sheets and custom configurations.
|
|
11
|
+
|
|
12
|
+
## Example Usage
|
|
13
|
+
|
|
14
|
+
Here is an example of how to use the `VQLProcessor` to execute a query:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import VQLProcessor from "@wxn0brp/vql";
|
|
18
|
+
import { Valthera } from "@wxn0brp/db";
|
|
19
|
+
import { GateWarden } from "@wxn0brp/gate-warden";
|
|
20
|
+
|
|
21
|
+
// Initialize database instances
|
|
22
|
+
const dbInstances = {
|
|
23
|
+
myDatabase: new Valthera("path/to/database"),
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Initialize Gate Warden
|
|
27
|
+
const gw = new GateWarden("path/to/gate-warden/database");
|
|
28
|
+
|
|
29
|
+
// Create a VQLProcessor instance
|
|
30
|
+
const processor = new VQLProcessor(dbInstances, gw);
|
|
31
|
+
|
|
32
|
+
// Define a query
|
|
33
|
+
const query = {
|
|
34
|
+
db: "myDatabase",
|
|
35
|
+
d: {
|
|
36
|
+
find: {
|
|
37
|
+
collection: "users",
|
|
38
|
+
search: { age: { $gt: 18 } },
|
|
39
|
+
fields: { name: 1, age: 1 },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Or you can use a string query like:
|
|
45
|
+
// string
|
|
46
|
+
const VQLS = `
|
|
47
|
+
myDatabase users
|
|
48
|
+
s.age.$gt = 18
|
|
49
|
+
f.name = 1
|
|
50
|
+
f.age = 1
|
|
51
|
+
`
|
|
52
|
+
// Or (use backticks like json)
|
|
53
|
+
const VQLB = `
|
|
54
|
+
myDatabase users
|
|
55
|
+
{
|
|
56
|
+
collection: "users",
|
|
57
|
+
search: { age: { $gt: 18 } },
|
|
58
|
+
fields: { name: 1, age: 1 },
|
|
59
|
+
}
|
|
60
|
+
`
|
|
61
|
+
// Or (use markup like yaml)
|
|
62
|
+
const VQLM = `
|
|
63
|
+
myDatabase users
|
|
64
|
+
collection: users
|
|
65
|
+
search:
|
|
66
|
+
age:
|
|
67
|
+
$gt: 18
|
|
68
|
+
fields:
|
|
69
|
+
name: 1
|
|
70
|
+
age: 1
|
|
71
|
+
`
|
|
72
|
+
|
|
73
|
+
// Execute the query
|
|
74
|
+
(async () => {
|
|
75
|
+
try {
|
|
76
|
+
const result = await processor.execute(query, { id: "user123" });
|
|
77
|
+
console.log("Query Result:", result);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error("Error executing query:", error);
|
|
80
|
+
}
|
|
81
|
+
})();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for details.
|
|
87
|
+
|
|
88
|
+
## Contributing
|
|
89
|
+
|
|
90
|
+
Contributions are welcome! Please open an issue or submit a pull request for any improvements or bug fixes.
|
|
91
|
+
|
|
92
|
+
## Powered by
|
|
93
|
+
|
|
94
|
+
- [ValtheraDB](https://github.com/wxn0brP/ValtheraDB)
|
|
95
|
+
- [Gate Warden](https://github.com/wxn0brP/gate-warden)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ValtheraCompatible } from "@wxn0brp/db";
|
|
2
|
+
type ResolverFn<TArgs extends any[] = any[], TReturn = any> = (...args: TArgs) => Promise<TReturn>;
|
|
3
|
+
export interface ValtheraResolver {
|
|
4
|
+
getCollections?: ResolverFn<[], string[]>;
|
|
5
|
+
issetCollection?: ResolverFn<[string], boolean>;
|
|
6
|
+
checkCollection?: ResolverFn<[string], boolean>;
|
|
7
|
+
add?: ResolverFn<[string, any], any>;
|
|
8
|
+
find?: ResolverFn<[string, any], any[]>;
|
|
9
|
+
findOne?: ResolverFn<[string, any], any | null>;
|
|
10
|
+
update?: ResolverFn<[string, any, any], boolean>;
|
|
11
|
+
updateOne?: ResolverFn<[string, any, any], boolean>;
|
|
12
|
+
remove?: ResolverFn<[string, any], boolean>;
|
|
13
|
+
removeOne?: ResolverFn<[string, any], boolean>;
|
|
14
|
+
removeCollection?: ResolverFn<[string], boolean>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createValtheraAdapter(resolver: ValtheraResolver): ValtheraCompatible;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function createValtheraAdapter(resolver) {
|
|
2
|
+
const safe = (fn) => {
|
|
3
|
+
if (!fn)
|
|
4
|
+
throw new Error("Unimplemented method");
|
|
5
|
+
return fn;
|
|
6
|
+
};
|
|
7
|
+
return {
|
|
8
|
+
getCollections: () => safe(resolver.getCollections)(),
|
|
9
|
+
issetCollection: (c) => safe(resolver.issetCollection)(c),
|
|
10
|
+
checkCollection: (c) => safe(resolver.checkCollection)(c),
|
|
11
|
+
add: (col, data) => safe(resolver.add)(col, data),
|
|
12
|
+
find: (col, search) => safe(resolver.find)(col, search),
|
|
13
|
+
findOne: (col, search) => safe(resolver.findOne)(col, search),
|
|
14
|
+
update: (col, search, up) => safe(resolver.update)(col, search, up),
|
|
15
|
+
updateOne: (col, search, up) => safe(resolver.updateOne)(col, search, up),
|
|
16
|
+
remove: (col, search) => safe(resolver.remove)(col, search),
|
|
17
|
+
removeOne: (col, search) => safe(resolver.removeOne)(col, search),
|
|
18
|
+
removeCollection: (col) => safe(resolver.removeCollection)(col),
|
|
19
|
+
c: null,
|
|
20
|
+
findStream: null,
|
|
21
|
+
transaction: null,
|
|
22
|
+
updateOneOrAdd: null
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=apiAbstract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiAbstract.js","sourceRoot":"","sources":["../src/apiAbstract.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,qBAAqB,CAAC,QAA0B;IAC5D,MAAM,IAAI,GAAG,CAAI,EAAM,EAAK,EAAE;QAC1B,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACjD,OAAO,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAe,CAAC,EAAE;QACtD,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC;QAC1D,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC;QAE1D,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAI,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;QAClD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAK,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;QACxD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;QAE9D,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAO,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QACpE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAU,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QAE1E,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAO,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;QAC5D,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAU,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;QAElE,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAiB,CAAC,CAAC,GAAG,CAAC;QAEhE,CAAC,EAAE,IAAI;QACP,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,IAAI;KACvB,CAAC;AACN,CAAC"}
|
package/dist/config.d.ts
ADDED
package/dist/config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,kBAAkB,EAAE,KAAK;IACzB,SAAS,EAAE,IAAI;CAClB,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { checkRelationPermission } from "../permissions/index.js";
|
|
2
|
+
import { parseSelect } from "./utils.js";
|
|
3
|
+
import { VQLConfig } from "../config.js";
|
|
4
|
+
function standardizeRelationRequest(req) {
|
|
5
|
+
req.select = parseSelect(req.select || []);
|
|
6
|
+
}
|
|
7
|
+
function checkDBsExist(cpu, req) {
|
|
8
|
+
const db = req.path[0];
|
|
9
|
+
if (!db || !cpu.dbInstances[db]) {
|
|
10
|
+
return { err: true, msg: `Invalid query - db "${db}" not found`, c: 400 };
|
|
11
|
+
}
|
|
12
|
+
if (req.relations) {
|
|
13
|
+
for (const relation of Object.values(req.relations)) {
|
|
14
|
+
const res = checkDBsExist(cpu, relation);
|
|
15
|
+
if (res.err)
|
|
16
|
+
return res;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { err: false };
|
|
20
|
+
}
|
|
21
|
+
export async function executeRelation(cpu, query, user) {
|
|
22
|
+
const checkDb = checkDBsExist(cpu, query.r);
|
|
23
|
+
if (checkDb.err)
|
|
24
|
+
return checkDb;
|
|
25
|
+
if (!VQLConfig.noCheckPermissions && !await checkRelationPermission(cpu.gw, user, query)) {
|
|
26
|
+
return { err: true, msg: "Permission denied", c: 403 };
|
|
27
|
+
}
|
|
28
|
+
const req = query.r;
|
|
29
|
+
standardizeRelationRequest(req);
|
|
30
|
+
const { path, search, relations, select } = req;
|
|
31
|
+
if (req.many) {
|
|
32
|
+
return await cpu.relation.find(path, search, relations, select, req.options);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return await cpu.relation.findOne(path, search, relations, select);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/cpu/relation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,SAAS,0BAA0B,CAAC,GAAgD;IAChF,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CAAC,GAAiB,EAAE,GAAgD;IACtF,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvB,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,GAAG,CAAC,GAAG;gBAAE,OAAO,GAAG,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAiB,EAAE,KAAoB,EAAE,IAAS;IACpF,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC;IAEhC,IAAI,CAAC,SAAS,CAAC,kBAAkB,IAAI,CAAC,MAAM,uBAAuB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IACpB,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEhD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACJ,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { VQLConfig } from "../config.js";
|
|
2
|
+
import { checkRequestPermission } from "../permissions/index.js";
|
|
3
|
+
import { parseSelect } from "./utils.js";
|
|
4
|
+
export async function executeQuery(cpu, query, user) {
|
|
5
|
+
if (!query.db || !cpu.dbInstances[query.db])
|
|
6
|
+
return { err: true, msg: `Invalid query - db "${query.db || "undefined"}" not found`, c: 400 };
|
|
7
|
+
const db = cpu.dbInstances[query.db];
|
|
8
|
+
const operation = Object.keys(query.d)[0];
|
|
9
|
+
if (!VQLConfig.noCheckPermissions && !await checkRequestPermission(cpu.gw, user, query)) {
|
|
10
|
+
return { err: true, msg: "Permission denied", c: 403 };
|
|
11
|
+
}
|
|
12
|
+
if (operation === "find") {
|
|
13
|
+
const params = query.d[operation];
|
|
14
|
+
const select = parseSelect(params.fields || params.select || {});
|
|
15
|
+
return db.find(params.collection, params.search, {}, {}, { select });
|
|
16
|
+
}
|
|
17
|
+
else if (operation === "findOne" || operation === "f") {
|
|
18
|
+
const params = query.d[operation];
|
|
19
|
+
const select = parseSelect(params.fields || params.select || {});
|
|
20
|
+
return db.findOne(params.collection, params.search, {}, { select });
|
|
21
|
+
}
|
|
22
|
+
else if (operation === "add") {
|
|
23
|
+
const params = query.d[operation];
|
|
24
|
+
return db.add(params.collection, params.data);
|
|
25
|
+
}
|
|
26
|
+
else if (operation === "update") {
|
|
27
|
+
const params = query.d[operation];
|
|
28
|
+
return db.update(params.collection, params.search, params.updater);
|
|
29
|
+
}
|
|
30
|
+
else if (operation === "updateOne") {
|
|
31
|
+
const params = query.d[operation];
|
|
32
|
+
return db.updateOne(params.collection, params.search, params.updater);
|
|
33
|
+
}
|
|
34
|
+
else if (operation === "remove") {
|
|
35
|
+
const params = query.d[operation];
|
|
36
|
+
return db.remove(params.collection, params.search);
|
|
37
|
+
}
|
|
38
|
+
else if (operation === "removeOne") {
|
|
39
|
+
const params = query.d[operation];
|
|
40
|
+
return db.removeOne(params.collection, params.search);
|
|
41
|
+
}
|
|
42
|
+
else if (operation === "updateOneOrAdd") {
|
|
43
|
+
const params = query.d[operation];
|
|
44
|
+
return db.updateOneOrAdd(params.collection, params.search, params.updater, params.add_arg || {}, {}, params.id_gen ?? true);
|
|
45
|
+
}
|
|
46
|
+
else if (operation === "removeCollection") {
|
|
47
|
+
const params = query.d[operation];
|
|
48
|
+
return db.removeCollection(params.collection);
|
|
49
|
+
}
|
|
50
|
+
else if (operation === "checkCollection") {
|
|
51
|
+
const params = query.d[operation];
|
|
52
|
+
return db.checkCollection(params.collection);
|
|
53
|
+
}
|
|
54
|
+
else if (operation === "issetCollection") {
|
|
55
|
+
const params = query.d[operation];
|
|
56
|
+
return db.issetCollection(params.collection);
|
|
57
|
+
}
|
|
58
|
+
else if (operation === "getCollections") {
|
|
59
|
+
return db.getCollections();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const n = operation;
|
|
63
|
+
throw new Error("Unknown operation " + n);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/cpu/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { VQL } from "../../types/vql.js";
|
|
2
|
+
export type VQLParserMode = "VQLS" | "VQLM" | "VQLB" | "VQLR";
|
|
3
|
+
export declare function guessParser(query: string): {
|
|
4
|
+
mode: VQLParserMode;
|
|
5
|
+
query: string;
|
|
6
|
+
};
|
|
7
|
+
declare function parseStringQuery(query: string): VQL;
|
|
8
|
+
export { parseStringQuery };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { parseVQLB } from "./json5.js";
|
|
2
|
+
import { parseVQLS } from "./simple.js";
|
|
3
|
+
import { parseVQLM } from "./yaml.js";
|
|
4
|
+
function get3rdAnd4thWord(query) {
|
|
5
|
+
let words = [];
|
|
6
|
+
let word = "";
|
|
7
|
+
let i = 0;
|
|
8
|
+
while (i < query.length && words.length < 4) {
|
|
9
|
+
const c = query[i++];
|
|
10
|
+
if (" \t\n\r".includes(c)) {
|
|
11
|
+
if (word)
|
|
12
|
+
words.push(word);
|
|
13
|
+
word = "";
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
word += c;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (word && words.length < 4)
|
|
20
|
+
words.push(word);
|
|
21
|
+
return words[2] + (words[3] ? " " + words[3] : "");
|
|
22
|
+
}
|
|
23
|
+
export function guessParser(query) {
|
|
24
|
+
query = query.trimStart();
|
|
25
|
+
if (query[0] === "#") {
|
|
26
|
+
return {
|
|
27
|
+
mode: "VQL" + query[1].toUpperCase(),
|
|
28
|
+
query: query.slice(2)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const _34word = get3rdAnd4thWord(query);
|
|
32
|
+
let mode = "VQLS";
|
|
33
|
+
if (_34word.includes("{"))
|
|
34
|
+
mode = "VQLB";
|
|
35
|
+
else if (_34word.includes(":"))
|
|
36
|
+
mode = "VQLM";
|
|
37
|
+
return {
|
|
38
|
+
mode,
|
|
39
|
+
query
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function parseStringQuery(query) {
|
|
43
|
+
const { mode, query: queryRaw } = guessParser(query);
|
|
44
|
+
if (mode === "VQLB") {
|
|
45
|
+
return parseVQLB(queryRaw);
|
|
46
|
+
}
|
|
47
|
+
else if (mode === "VQLM") {
|
|
48
|
+
return parseVQLM(queryRaw);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return parseVQLS(queryRaw);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export { parseStringQuery };
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cpu/string/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAInC,SAAS,gBAAgB,CAAC,KAAa;IACnC,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,GAAG,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACJ,IAAI,IAAI,CAAC,CAAC;QACd,CAAC;IACL,CAAC;IAED,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/C,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IAIrC,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAC1B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO;YACH,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAS;YAC3C,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACxB,CAAA;IACL,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,IAAI,GAAkB,MAAM,CAAC;IACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,GAAG,MAAM,CAAC;SACpC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,GAAG,MAAM,CAAC;IAE9C,OAAO;QACH,IAAI;QACJ,KAAK;KACR,CAAA;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACnC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAErD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACJ,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;AACL,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import JSON5 from "json5";
|
|
2
|
+
import { extractMeta } from "./utils.js";
|
|
3
|
+
import { processVQL_MB } from "./middle.js";
|
|
4
|
+
export function parseVQLB(query) {
|
|
5
|
+
const { db, op, collection, body } = extractMeta(query);
|
|
6
|
+
const parsed = JSON5.parse(body);
|
|
7
|
+
return processVQL_MB(db, op, collection, parsed);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=json5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json5.js","sourceRoot":"","sources":["../../../src/cpu/string/json5.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { VQL } from "../../types/vql.js";
|
|
2
|
+
export declare function processVQL_MB(db: string, op: string, collection: string, parsed: Record<string, any>): VQL;
|
|
3
|
+
export declare function convertSearchObjToSearchArray(obj: Record<string, any>, parentKeys?: string[]): string[][];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function processVQL_MB(db, op, collection, parsed) {
|
|
2
|
+
return "relations" in parsed ?
|
|
3
|
+
processRelation_MB(db, collection, parsed) :
|
|
4
|
+
processQuery_MB(db, op, collection, parsed);
|
|
5
|
+
}
|
|
6
|
+
export function convertSearchObjToSearchArray(obj, parentKeys = []) {
|
|
7
|
+
return Object.entries(obj).reduce((acc, [key, value]) => {
|
|
8
|
+
const currentPath = [...parentKeys, key];
|
|
9
|
+
if (!value) {
|
|
10
|
+
return acc;
|
|
11
|
+
}
|
|
12
|
+
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
13
|
+
return [...acc, ...convertSearchObjToSearchArray(value, currentPath)];
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return [...acc, currentPath];
|
|
17
|
+
}
|
|
18
|
+
}, []);
|
|
19
|
+
}
|
|
20
|
+
function processRelation_MB(db, collection, parsed) {
|
|
21
|
+
if ("select" in parsed && typeof parsed.select === "object" && !Array.isArray(parsed.select)) {
|
|
22
|
+
parsed.select = convertSearchObjToSearchArray(parsed.select);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
r: {
|
|
26
|
+
path: [parsed.db || db, parsed.c || collection],
|
|
27
|
+
...parsed
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function processQuery_MB(db, op, collection, parsed) {
|
|
32
|
+
return {
|
|
33
|
+
db,
|
|
34
|
+
d: {
|
|
35
|
+
[op]: {
|
|
36
|
+
collection,
|
|
37
|
+
...parsed
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=middle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middle.js","sourceRoot":"","sources":["../../../src/cpu/string/middle.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,EAAU,EAAE,UAAkB,EAAE,MAA2B;IACjG,OAAO,WAAW,IAAI,MAAM,CAAC,CAAC;QAC1B,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAGD,MAAM,UAAU,6BAA6B,CAAC,GAAwB,EAAE,aAAuB,EAAE;IAC7F,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpD,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;QAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,GAAG,CAAC;QACf,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,6BAA6B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,EAAE,WAAW,CAAC,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAU,EAAE,UAAkB,EAAE,MAA2B;IACnF,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3F,MAAM,CAAC,MAAM,GAAG,6BAA6B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,OAAO;QACH,CAAC,EAAE;YACC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC;YAC/C,GAAG,MAAM;SACZ;KACG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,EAAU,EAAE,UAAkB,EAAE,MAA2B;IAC5F,OAAO;QACH,EAAE;QACF,CAAC,EAAE;YACC,CAAC,EAAE,CAAC,EAAE;gBACF,UAAU;gBACV,GAAG,MAAM;aACZ;SACJ;KACG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { extractMeta } from "./utils.js";
|
|
2
|
+
import JSON5 from "json5";
|
|
3
|
+
import { convertSearchObjToSearchArray } from "./middle.js";
|
|
4
|
+
const aliases = {
|
|
5
|
+
s: "search",
|
|
6
|
+
f: "fields",
|
|
7
|
+
o: "options",
|
|
8
|
+
r: "relations",
|
|
9
|
+
d: "data",
|
|
10
|
+
e: "select",
|
|
11
|
+
u: "updater",
|
|
12
|
+
};
|
|
13
|
+
function parseArgs(input) {
|
|
14
|
+
const result = {};
|
|
15
|
+
const tokens = [];
|
|
16
|
+
let current = "";
|
|
17
|
+
let inQuotes = false;
|
|
18
|
+
let escape = false;
|
|
19
|
+
for (let i = 0; i < input.length; i++) {
|
|
20
|
+
const char = input[i];
|
|
21
|
+
if (escape) {
|
|
22
|
+
current += char;
|
|
23
|
+
escape = false;
|
|
24
|
+
}
|
|
25
|
+
else if (char === "\\") {
|
|
26
|
+
escape = true;
|
|
27
|
+
}
|
|
28
|
+
else if (char === "\"") {
|
|
29
|
+
inQuotes = !inQuotes;
|
|
30
|
+
}
|
|
31
|
+
else if (!inQuotes && (char === " " || char === "=")) {
|
|
32
|
+
if (current !== "") {
|
|
33
|
+
tokens.push(current);
|
|
34
|
+
current = "";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
current += char;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (current !== "") {
|
|
42
|
+
tokens.push(current);
|
|
43
|
+
}
|
|
44
|
+
for (let i = 0; i < tokens.length; i += 2) {
|
|
45
|
+
const key = tokens[i];
|
|
46
|
+
let value = tokens[i + 1] ?? true;
|
|
47
|
+
if (typeof value === "string") {
|
|
48
|
+
const trimmed = value.trim();
|
|
49
|
+
if (trimmed === "") {
|
|
50
|
+
value = true;
|
|
51
|
+
}
|
|
52
|
+
else if (/^".*"$/.test(trimmed)) {
|
|
53
|
+
value = trimmed.slice(1, -1);
|
|
54
|
+
}
|
|
55
|
+
else if (trimmed.toLowerCase() === "true") {
|
|
56
|
+
value = true;
|
|
57
|
+
}
|
|
58
|
+
else if (trimmed.toLowerCase() === "false") {
|
|
59
|
+
value = false;
|
|
60
|
+
}
|
|
61
|
+
else if (!isNaN(Number(trimmed))) {
|
|
62
|
+
value = Number(trimmed);
|
|
63
|
+
}
|
|
64
|
+
else if ((trimmed.startsWith("{") && trimmed.endsWith("}")) || (trimmed.startsWith("[") && trimmed.endsWith("]"))) {
|
|
65
|
+
try {
|
|
66
|
+
value = JSON5.parse(trimmed);
|
|
67
|
+
}
|
|
68
|
+
catch { }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
result[key] = value;
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
function buildVQL(db, op, collection, query) {
|
|
76
|
+
const hasRelations = "relations" in query;
|
|
77
|
+
if (hasRelations) {
|
|
78
|
+
const relations = {};
|
|
79
|
+
for (const key in query.relations) {
|
|
80
|
+
const value = query.relations[key];
|
|
81
|
+
relations[key] = {
|
|
82
|
+
path: [value.db || db, value.c || key],
|
|
83
|
+
...value
|
|
84
|
+
};
|
|
85
|
+
delete relations[key].db;
|
|
86
|
+
delete relations[key].c;
|
|
87
|
+
}
|
|
88
|
+
if ("select" in query) {
|
|
89
|
+
query.select = convertSearchObjToSearchArray(query.select);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
r: {
|
|
93
|
+
path: [db, collection],
|
|
94
|
+
...query,
|
|
95
|
+
relations,
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
if (query.fields && !query.select) {
|
|
101
|
+
query.select = query.fields;
|
|
102
|
+
delete query.fields;
|
|
103
|
+
}
|
|
104
|
+
if ("select" in query) {
|
|
105
|
+
query.select = [...new Set(convertSearchObjToSearchArray(query.select).map(k => k[0]).flat())];
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
db,
|
|
109
|
+
d: {
|
|
110
|
+
[op]: {
|
|
111
|
+
collection,
|
|
112
|
+
...query,
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function parseVQLS(query) {
|
|
119
|
+
const { db, op, collection, body } = extractMeta(query);
|
|
120
|
+
const parsed = parseArgs(body);
|
|
121
|
+
for (const keysRaw of Object.keys(parsed)) {
|
|
122
|
+
const keys = keysRaw.split(".");
|
|
123
|
+
if (keys.length === 1) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
let obj = parsed;
|
|
127
|
+
for (let i = 0; i < keys.length; i++) {
|
|
128
|
+
const key = keys[i];
|
|
129
|
+
if (i < keys.length - 1) {
|
|
130
|
+
if (!(key in obj)) {
|
|
131
|
+
obj[key] = {};
|
|
132
|
+
}
|
|
133
|
+
obj = obj[key];
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
obj[key] = parsed[keysRaw];
|
|
137
|
+
delete parsed[keysRaw];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const key in aliases) {
|
|
142
|
+
if (key in parsed) {
|
|
143
|
+
parsed[aliases[key]] = parsed[key];
|
|
144
|
+
delete parsed[key];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if ((op === "find" || op === "findOne") && !("search" in parsed)) {
|
|
148
|
+
parsed.search = {};
|
|
149
|
+
}
|
|
150
|
+
return buildVQL(db, op, collection, parsed);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=simple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple.js","sourceRoot":"","sources":["../../../src/cpu/string/simple.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts metadata from a query string, including database name, operation,
|
|
3
|
+
* collection name, and the query body.
|
|
4
|
+
*
|
|
5
|
+
* @param input The input string to extract the information from.
|
|
6
|
+
* @returns An object with the following properties:
|
|
7
|
+
* - `db`: The database name.
|
|
8
|
+
* - `op`: The operation to perform, such as "find", "findOne", "add", "update", or "remove".
|
|
9
|
+
* - `collection`: The collection name.
|
|
10
|
+
* - `body`: The query body.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractMeta(input: string): {
|
|
13
|
+
db: string;
|
|
14
|
+
op: string;
|
|
15
|
+
collection: string;
|
|
16
|
+
body: string;
|
|
17
|
+
};
|