@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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import executorC from "@wxn0brp/db/executor.js";
|
|
2
|
+
import { logLog } from "../logger.js";
|
|
3
|
+
export class CustomExecutor extends executorC {
|
|
4
|
+
name;
|
|
5
|
+
constructor(name) {
|
|
6
|
+
super();
|
|
7
|
+
this.name = name;
|
|
8
|
+
}
|
|
9
|
+
async execute() {
|
|
10
|
+
if (this.isExecuting)
|
|
11
|
+
return;
|
|
12
|
+
this.isExecuting = true;
|
|
13
|
+
while (this.quote.length > 0) {
|
|
14
|
+
let q = this.quote.shift();
|
|
15
|
+
logLog(this.name, `${q.func.name.replace("bound ", "")}: ${JSON.stringify(q.param)
|
|
16
|
+
.replaceAll(",", ", ")
|
|
17
|
+
.replaceAll("{", "{ ")
|
|
18
|
+
.replaceAll("}", " }")
|
|
19
|
+
.replaceAll(":", ": ")}`);
|
|
20
|
+
let res = await q.func(...q.param);
|
|
21
|
+
logLog(this.name, `Result: ${JSON.stringify(res)}`);
|
|
22
|
+
q.resolve(res);
|
|
23
|
+
}
|
|
24
|
+
this.isExecuting = false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=customExe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customExe.js","sourceRoot":"","sources":["../../src/tests/customExe.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,OAAO,cAAe,SAAQ,SAAS;IACtB;IAAnB,YAAmB,IAAY;QAC3B,KAAK,EAAE,CAAC;QADO,SAAI,GAAJ,IAAI,CAAQ;IAE/B,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,KAClD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;iBACtB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;iBACrB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;iBACrB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;iBACrB,UAAU,CAAC,GAAG,EAAE,IAAI,CACzB,EAAE,CAAC,CAAC;YACJ,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/tests/db.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Valthera } from "@wxn0brp/db";
|
|
2
|
+
import { UserManager, WardenManager } from "@wxn0brp/gate-warden";
|
|
3
|
+
import { rmSync } from "fs";
|
|
4
|
+
import { hashKey } from "../permissions/utils.js";
|
|
5
|
+
import { VQLConfig } from "../config.js";
|
|
6
|
+
const db = new Valthera("data/gw.db");
|
|
7
|
+
console.log("Renewing DB");
|
|
8
|
+
rmSync("./data/gw.db", { force: true, recursive: true });
|
|
9
|
+
const userMgr = new UserManager(db);
|
|
10
|
+
const pMgr = new WardenManager(db);
|
|
11
|
+
await pMgr.addRole({
|
|
12
|
+
_id: "admin",
|
|
13
|
+
name: "admin",
|
|
14
|
+
});
|
|
15
|
+
VQLConfig.hidePath = false;
|
|
16
|
+
// await pMgr.addRBACRule("admin", `["shop","products"]`, 7);
|
|
17
|
+
await pMgr.addACLRule(hashKey(["shop", "products"]), 2, "user123");
|
|
18
|
+
await pMgr.addACLRule(hashKey(["shop", "products", "name"]), 2, "user123");
|
|
19
|
+
await pMgr.addACLRule(hashKey(["shop", "products", "price"]), 2, "user123");
|
|
20
|
+
await pMgr.addACLRule(hashKey(["shop", "products", "$lat"]), 2, "user123");
|
|
21
|
+
await pMgr.addACLRule(hashKey(["shop", "products", "foo", "bar", "baz", "$buzz"]), 2, "user123");
|
|
22
|
+
await pMgr.addACLRule(hashKey(["shop", "products", "price"]), 4, "user123");
|
|
23
|
+
await pMgr.addACLRule(hashKey(["shop", "categories"]), 2, "user123");
|
|
24
|
+
await pMgr.addACLRule(hashKey(["shop", "categories", "name"]), 2, "user123");
|
|
25
|
+
await pMgr.addACLRule(hashKey(["shop", "categories", "description"]), 2, "user123");
|
|
26
|
+
await pMgr.addACLRule(hashKey(["adapter", "users"]), 2, "user123");
|
|
27
|
+
await userMgr.createUser({
|
|
28
|
+
_id: "user123",
|
|
29
|
+
roles: ["admin"],
|
|
30
|
+
attrib: {}
|
|
31
|
+
});
|
|
32
|
+
console.log("Done");
|
|
33
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/tests/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;AAEtC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC3B,MAAM,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;AAEnC,MAAM,IAAI,CAAC,OAAO,CAAC;IACf,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,OAAO;CAChB,CAAC,CAAC;AACH,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAA;AAC1B,6DAA6D;AAE7D,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAClE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACzE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1E,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACzE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5F,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1E,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACpE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,YAAY,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAC3E,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAC,YAAY,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAClF,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AAElE,MAAM,OAAO,CAAC,UAAU,CAAC;IACrB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,MAAM,EAAE,EAAE;CACb,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Valthera } from "@wxn0brp/db";
|
|
2
|
+
import { GateWarden } from '@wxn0brp/gate-warden';
|
|
3
|
+
import { configDotenv } from 'dotenv';
|
|
4
|
+
import sourceMap from 'source-map-support';
|
|
5
|
+
import { VQLConfig } from '../config.js';
|
|
6
|
+
import { VQLProcessor } from "../processor.js";
|
|
7
|
+
import { loadSheetFromFile } from "../sheet/load.js";
|
|
8
|
+
import { createValtheraAdapter } from "../apiAbstract.js";
|
|
9
|
+
configDotenv();
|
|
10
|
+
sourceMap.install();
|
|
11
|
+
const apiAdapter = createValtheraAdapter({
|
|
12
|
+
find: async (col, search) => {
|
|
13
|
+
const res = await fetch(`/api/${col}?q=` + encodeURIComponent(JSON.stringify(search)));
|
|
14
|
+
return await res.json();
|
|
15
|
+
},
|
|
16
|
+
add: async (col, data) => {
|
|
17
|
+
const res = await fetch(`/api/${col}`, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
body: JSON.stringify(data),
|
|
20
|
+
headers: { "Content-Type": "application/json" }
|
|
21
|
+
});
|
|
22
|
+
return await res.json();
|
|
23
|
+
}
|
|
24
|
+
// resztę można dorzucić później
|
|
25
|
+
});
|
|
26
|
+
const dbs = {
|
|
27
|
+
shop: new Valthera("data/shop.db", {
|
|
28
|
+
// executor: new CustomExecutor("shop")
|
|
29
|
+
}),
|
|
30
|
+
adapter: apiAdapter
|
|
31
|
+
};
|
|
32
|
+
const gwDB = new Valthera("data/gw.db", {
|
|
33
|
+
// executor: new CustomExecutor("gwDB")
|
|
34
|
+
});
|
|
35
|
+
VQLConfig.hidePath = false;
|
|
36
|
+
VQLConfig.strictACL = false;
|
|
37
|
+
VQLConfig.strictSelect = false;
|
|
38
|
+
VQLConfig.noCheckPermissions = true;
|
|
39
|
+
const sheets = loadSheetFromFile("src/tests/sheet.json");
|
|
40
|
+
const q1 = {
|
|
41
|
+
db: "shop",
|
|
42
|
+
// d: {
|
|
43
|
+
// f: {
|
|
44
|
+
// collection: "products",
|
|
45
|
+
// search: { name: "test100" },
|
|
46
|
+
// fields: { name: 1, price: 1 }
|
|
47
|
+
// }
|
|
48
|
+
// },
|
|
49
|
+
// ref: "shop",
|
|
50
|
+
// var: {
|
|
51
|
+
// name: "test100"
|
|
52
|
+
// }
|
|
53
|
+
d: {
|
|
54
|
+
checkCollection: {
|
|
55
|
+
collection: "products",
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
// r: {
|
|
59
|
+
// path: ["shop","products"],
|
|
60
|
+
// search: { name: "test100" },
|
|
61
|
+
// relations: {
|
|
62
|
+
// c: {
|
|
63
|
+
// path: ["shop", "categories"],
|
|
64
|
+
// fk: "name",
|
|
65
|
+
// pk: "category"
|
|
66
|
+
// },
|
|
67
|
+
// t: {
|
|
68
|
+
// path: ["adapter", "users"],
|
|
69
|
+
// }
|
|
70
|
+
// }
|
|
71
|
+
// }
|
|
72
|
+
// r: {
|
|
73
|
+
// path: ["shop", "products"],
|
|
74
|
+
// search: {},
|
|
75
|
+
// relations: {}
|
|
76
|
+
// }
|
|
77
|
+
};
|
|
78
|
+
const q2 = `
|
|
79
|
+
shop products! s.hai = 1 f.name = 1 f.name2 = test with space f.name3 = 6
|
|
80
|
+
`;
|
|
81
|
+
const q3 = `
|
|
82
|
+
shop products!
|
|
83
|
+
{
|
|
84
|
+
search: {
|
|
85
|
+
name: "test100"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
`;
|
|
89
|
+
const q4 = `
|
|
90
|
+
shop products!
|
|
91
|
+
search:
|
|
92
|
+
name: "test100"
|
|
93
|
+
`;
|
|
94
|
+
try {
|
|
95
|
+
const gw = new GateWarden(gwDB, 2);
|
|
96
|
+
const processor = new VQLProcessor(dbs, gw);
|
|
97
|
+
processor.preDefinedSheets = sheets;
|
|
98
|
+
const res = await processor.execute(q1, { id: "user123" });
|
|
99
|
+
console.log("Query Result:", res);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.error(e);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tests/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,YAAY,EAAE,CAAC;AACf,SAAS,CAAC,OAAO,EAAE,CAAC;AAEpB,MAAM,UAAU,GAAG,qBAAqB,CAAC;IACrC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,GAAG,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvF,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,GAAG,EAAE,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAClD,CAAC,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,gCAAgC;CACnC,CAAC,CAAC;AAGH,MAAM,GAAG,GAAG;IACR,IAAI,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE;IAC/B,uCAAuC;KAC1C,CAAC;IACF,OAAO,EAAE,UAAU;CACtB,CAAC;AACF,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE;AACpC,uCAAuC;CAC1C,CAAC,CAAC;AACH,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC3B,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC;AAC5B,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;AAC/B,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;AACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;AAEzD,MAAM,EAAE,GAAS;IACb,EAAE,EAAE,MAAM;IACV,OAAO;IACP,WAAW;IACX,kCAAkC;IAClC,uCAAuC;IACvC,wCAAwC;IACxC,QAAQ;IACR,KAAK;IACL,eAAe;IACf,SAAS;IACT,sBAAsB;IACtB,IAAI;IACJ,CAAC,EAAE;QACC,eAAe,EAAE;YACb,UAAU,EAAE,UAAU;SACzB;KACJ;IACD,OAAO;IACP,iCAAiC;IACjC,mCAAmC;IACnC,mBAAmB;IACnB,eAAe;IACf,4CAA4C;IAC5C,0BAA0B;IAC1B,6BAA6B;IAC7B,aAAa;IACb,eAAe;IACf,0CAA0C;IAC1C,YAAY;IACZ,QAAQ;IACR,IAAI;IACJ,OAAO;IACP,kCAAkC;IAClC,kBAAkB;IAClB,oBAAoB;IACpB,IAAI;CACP,CAAA;AAED,MAAM,EAAE,GAAG;;CAEV,CAAA;AAED,MAAM,EAAE,GAAG;;;;;;;CAOV,CAAA;AAED,MAAM,EAAE,GAAG;;;;CAIV,CAAA;AAED,IAAI,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export var PermCRUD;
|
|
2
|
+
(function (PermCRUD) {
|
|
3
|
+
PermCRUD[PermCRUD["CREATE"] = 1] = "CREATE";
|
|
4
|
+
PermCRUD[PermCRUD["READ"] = 2] = "READ";
|
|
5
|
+
PermCRUD[PermCRUD["UPDATE"] = 4] = "UPDATE";
|
|
6
|
+
PermCRUD[PermCRUD["DELETE"] = 8] = "DELETE";
|
|
7
|
+
PermCRUD[PermCRUD["COLLECTION"] = 16] = "COLLECTION";
|
|
8
|
+
})(PermCRUD || (PermCRUD = {}));
|
|
9
|
+
//# sourceMappingURL=perm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perm.js","sourceRoot":"","sources":["../../src/types/perm.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAChB,2CAAe,CAAA;IACf,uCAAa,CAAA;IACb,2CAAe,CAAA;IACf,2CAAe,CAAA;IACf,oDAAmB,CAAA;AACvB,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { RelationTypes, ValtheraTypes } from "@wxn0brp/db";
|
|
2
|
+
export type VQLQuery = {
|
|
3
|
+
find: VQLFind;
|
|
4
|
+
findOne: VQLFindOne;
|
|
5
|
+
f: VQLFindOne;
|
|
6
|
+
add: VQLAdd;
|
|
7
|
+
update: VQLUpdate;
|
|
8
|
+
updateOne: VQLUpdateOne;
|
|
9
|
+
remove: VQLRemove;
|
|
10
|
+
removeOne: VQLRemoveOne;
|
|
11
|
+
updateOneOrAdd: VQLUpdateOneOrAdd;
|
|
12
|
+
removeCollection: VQLCollectionOperation;
|
|
13
|
+
checkCollection: VQLCollectionOperation;
|
|
14
|
+
issetCollection: VQLCollectionOperation;
|
|
15
|
+
getCollections: {};
|
|
16
|
+
};
|
|
17
|
+
export type VQLQueryData = {
|
|
18
|
+
find: VQLFind;
|
|
19
|
+
} | {
|
|
20
|
+
findOne: VQLFindOne;
|
|
21
|
+
} | {
|
|
22
|
+
f: VQLFindOne;
|
|
23
|
+
} | {
|
|
24
|
+
add: VQLAdd;
|
|
25
|
+
} | {
|
|
26
|
+
update: VQLUpdate;
|
|
27
|
+
} | {
|
|
28
|
+
updateOne: VQLUpdateOne;
|
|
29
|
+
} | {
|
|
30
|
+
remove: VQLRemove;
|
|
31
|
+
} | {
|
|
32
|
+
removeOne: VQLRemoveOne;
|
|
33
|
+
} | {
|
|
34
|
+
updateOneOrAdd: VQLUpdateOneOrAdd;
|
|
35
|
+
} | {
|
|
36
|
+
removeCollection: VQLCollectionOperation;
|
|
37
|
+
} | {
|
|
38
|
+
checkCollection: VQLCollectionOperation;
|
|
39
|
+
} | {
|
|
40
|
+
issetCollection: VQLCollectionOperation;
|
|
41
|
+
} | {
|
|
42
|
+
getCollections: {};
|
|
43
|
+
};
|
|
44
|
+
export interface VQLRequest {
|
|
45
|
+
db: string;
|
|
46
|
+
d: VQLQueryData;
|
|
47
|
+
}
|
|
48
|
+
export interface VQLFind {
|
|
49
|
+
collection: string;
|
|
50
|
+
search?: Record<string, any>;
|
|
51
|
+
sort?: Record<string, "asc" | "desc">;
|
|
52
|
+
limit?: number;
|
|
53
|
+
fields?: VQLFields;
|
|
54
|
+
relations?: VQLRelations;
|
|
55
|
+
}
|
|
56
|
+
export interface VQLFindOne {
|
|
57
|
+
collection: string;
|
|
58
|
+
search: Record<string, any>;
|
|
59
|
+
fields?: VQLFields;
|
|
60
|
+
relations?: VQLRelations;
|
|
61
|
+
}
|
|
62
|
+
export interface VQLAdd {
|
|
63
|
+
collection: string;
|
|
64
|
+
data: Record<string, any>;
|
|
65
|
+
}
|
|
66
|
+
export interface VQLUpdate {
|
|
67
|
+
collection: string;
|
|
68
|
+
search: Record<string, any>;
|
|
69
|
+
updater: Record<string, any>;
|
|
70
|
+
}
|
|
71
|
+
export interface VQLUpdateOne {
|
|
72
|
+
collection: string;
|
|
73
|
+
search: Record<string, any>;
|
|
74
|
+
updater: Record<string, any>;
|
|
75
|
+
}
|
|
76
|
+
export interface VQLRemove {
|
|
77
|
+
collection: string;
|
|
78
|
+
search: Record<string, any>;
|
|
79
|
+
}
|
|
80
|
+
export interface VQLRemoveOne {
|
|
81
|
+
collection: string;
|
|
82
|
+
search: Record<string, any>;
|
|
83
|
+
}
|
|
84
|
+
export interface VQLUpdateOneOrAdd {
|
|
85
|
+
collection: string;
|
|
86
|
+
search: Record<string, any>;
|
|
87
|
+
updater: Record<string, any>;
|
|
88
|
+
add_arg?: Record<string, any>;
|
|
89
|
+
id_gen?: boolean;
|
|
90
|
+
}
|
|
91
|
+
export interface VQLCollectionOperation {
|
|
92
|
+
collection: string;
|
|
93
|
+
}
|
|
94
|
+
export type VQLFields = Record<string, boolean | number>;
|
|
95
|
+
export type VQLRelations = Record<string, VQLFind | VQLFindOne>;
|
|
96
|
+
export interface RelationQuery {
|
|
97
|
+
r: {
|
|
98
|
+
path: RelationTypes.Path;
|
|
99
|
+
search: ValtheraTypes.Search;
|
|
100
|
+
relations: RelationTypes.Relation;
|
|
101
|
+
many?: boolean;
|
|
102
|
+
options?: ValtheraTypes.DbFindOpts;
|
|
103
|
+
select?: RelationTypes.FieldPath[];
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export interface VQLRef {
|
|
107
|
+
ref?: string;
|
|
108
|
+
var?: {
|
|
109
|
+
[k: string]: any;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
type VQLRefRequired = VQLRef & Required<Pick<VQLRef, "ref">>;
|
|
113
|
+
type DeepPartial<T> = {
|
|
114
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
115
|
+
};
|
|
116
|
+
export type VQL = (VQLRequest | RelationQuery) & VQLRef;
|
|
117
|
+
export type VQLR = VQL | (DeepPartial<VQL> & VQLRefRequired) | VQLRefRequired;
|
|
118
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vql.js","sourceRoot":"","sources":["../../src/types/vql.ts"],"names":[],"mappings":""}
|
package/dist/valid.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Ajv from "ajv";
|
|
2
|
+
import { VQL, VQLR } from "./types/vql.js";
|
|
3
|
+
export declare const ajv: Ajv;
|
|
4
|
+
export declare function validateRaw(query: VQLR): true | {
|
|
5
|
+
err: boolean;
|
|
6
|
+
msg: string;
|
|
7
|
+
c: number;
|
|
8
|
+
why: any;
|
|
9
|
+
rawQuery: never;
|
|
10
|
+
};
|
|
11
|
+
export declare function validateVql(query: VQL): true | {
|
|
12
|
+
err: boolean;
|
|
13
|
+
msg: string;
|
|
14
|
+
c: number;
|
|
15
|
+
why: any;
|
|
16
|
+
rawQuery: never;
|
|
17
|
+
};
|
package/dist/valid.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import Ajv from "ajv";
|
|
2
|
+
import ajvFormat from "ajv-formats";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { dirname } from "path";
|
|
5
|
+
import { VQLConfig } from "./config.js";
|
|
6
|
+
const fileUrl = dirname(import.meta.url).replace("file://", "") + "/schema.json";
|
|
7
|
+
let schema = null;
|
|
8
|
+
if (!existsSync(fileUrl)) {
|
|
9
|
+
const TJS = await import("typescript-json-schema");
|
|
10
|
+
const typesFile = dirname(import.meta.url).replace("file://", "") + "/types/vql.d.ts";
|
|
11
|
+
const program = TJS.getProgramFromFiles([typesFile], {
|
|
12
|
+
required: true
|
|
13
|
+
}, "./");
|
|
14
|
+
schema = TJS.generateSchema(program, "VQLR", {
|
|
15
|
+
required: true
|
|
16
|
+
});
|
|
17
|
+
writeFileSync(fileUrl, JSON.stringify(schema));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
schema = JSON.parse(readFileSync(fileUrl, "utf-8"));
|
|
21
|
+
}
|
|
22
|
+
export const ajv = new Ajv({
|
|
23
|
+
allowUnionTypes: true,
|
|
24
|
+
strict: false
|
|
25
|
+
});
|
|
26
|
+
ajvFormat(ajv);
|
|
27
|
+
const validVQLR = ajv.compile(schema);
|
|
28
|
+
const modSchema = schema;
|
|
29
|
+
modSchema.anyOf = [
|
|
30
|
+
{
|
|
31
|
+
"$ref": "#/definitions/VQL"
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
const validVQL = ajv.compile(modSchema);
|
|
35
|
+
export function validateRaw(query) {
|
|
36
|
+
if (!validVQLR(query)) {
|
|
37
|
+
let why = validVQLR.errors;
|
|
38
|
+
why = VQLConfig.formatAjv ? ajv.errorsText(why) : why;
|
|
39
|
+
return { err: true, msg: "Invalid query raw", c: 400, why, rawQuery: query };
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
export function validateVql(query) {
|
|
44
|
+
if (!validVQL(query)) {
|
|
45
|
+
let why = validVQL.errors;
|
|
46
|
+
why = VQLConfig.formatAjv ? ajv.errorsText(why) : why;
|
|
47
|
+
return { err: true, msg: "Invalid query", c: 400, why, rawQuery: query };
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid.js","sourceRoot":"","sources":["../src/valid.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wxn0brp/vql",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"author": "wxn0brP",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc && tsc-alias",
|
|
10
|
+
"test": "node dist/tests/index.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^22.12.0",
|
|
17
|
+
"dotenv": "^16.5.0",
|
|
18
|
+
"source-map-support": "^0.5.21",
|
|
19
|
+
"tsc-alias": "^1.8.10",
|
|
20
|
+
"typescript": "^5.7.3"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@wxn0brp/db": "^0.7.1",
|
|
24
|
+
"@wxn0brp/gate-warden": "^0.1.0",
|
|
25
|
+
"@wxn0brp/wts-deep-merge": "github:wxn0brp/ts-shared#dist-deep-merge",
|
|
26
|
+
"@wxn0brp/wts-logger": "github:wxn0brp/ts-shared#dist-logger",
|
|
27
|
+
"ajv": "^8.17.1",
|
|
28
|
+
"ajv-formats": "^3.0.1",
|
|
29
|
+
"js-yaml": "^4.1.0",
|
|
30
|
+
"json5": "^2.2.3",
|
|
31
|
+
"typescript-json-schema": "^0.65.1"
|
|
32
|
+
}
|
|
33
|
+
}
|