@wxn0brp/db-string-query 0.0.8 → 0.0.10
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/.github/workflows/build.yml +1 -1
- package/CHANGELOG.md +22 -0
- package/bun.lock +9 -6
- package/dist/sql/handle/collection.d.ts +4 -0
- package/dist/sql/handle/collection.js +26 -0
- package/dist/sql/handle/delete.d.ts +1 -0
- package/dist/sql/handle/delete.js +11 -0
- package/dist/sql/handle/insert.d.ts +1 -0
- package/dist/sql/handle/insert.js +52 -0
- package/dist/sql/handle/select.d.ts +7 -0
- package/dist/sql/handle/select.js +55 -0
- package/dist/sql/handle/update.d.ts +1 -0
- package/dist/sql/handle/update.js +12 -0
- package/dist/sql/index.d.ts +2 -2
- package/dist/sql/index.js +10 -4
- package/dist/sql/utils/join.util.d.ts +10 -0
- package/dist/sql/utils/join.util.js +52 -0
- package/dist/sql/where.js +4 -1
- package/dist/types.d.ts +5 -1
- package/package.json +7 -2
- package/src/sql/handle/collection.ts +28 -0
- package/src/sql/handle/delete.ts +12 -0
- package/src/sql/handle/insert.ts +50 -0
- package/src/sql/handle/select.ts +68 -0
- package/src/sql/handle/update.ts +13 -0
- package/src/sql/index.ts +12 -13
- package/src/sql/utils/join.util.ts +69 -0
- package/src/sql/where.ts +3 -0
- package/src/types.ts +9 -1
- package/{src/test → test}/js.test.ts +1 -1
- package/{src/test → test}/sql/delete.test.ts +2 -2
- package/test/sql/index.test.ts +17 -0
- package/{src/test → test}/sql/insert.test.ts +2 -2
- package/{src/test → test}/sql/select.test.ts +29 -8
- package/{src/test → test}/sql/update.test.ts +2 -2
- package/test/sql/utils/join.test.ts +42 -0
- package/test/tsconfig.json +19 -0
- package/tsconfig.json +7 -3
- package/typedocs-generated/404.html +76 -0
- package/typedocs-generated/assets/hierarchy.js +1 -1
- package/typedocs-generated/assets/highlight.css +1 -1
- package/typedocs-generated/assets/navigation.js +1 -1
- package/typedocs-generated/assets/search.js +1 -1
- package/typedocs-generated/assets/style.css +3 -3
- package/typedocs-generated/classes/sql_index.default.html +2 -2
- package/typedocs-generated/classes/sql_utils_join.util.JoinToRelationsEngine.html +3 -0
- package/typedocs-generated/functions/sql_handle_collection.handleCreate.html +1 -0
- package/typedocs-generated/functions/sql_handle_collection.handleDrop.html +1 -0
- package/typedocs-generated/functions/sql_handle_collection.handleExists.html +1 -0
- package/typedocs-generated/functions/sql_handle_collection.handleGet.html +1 -0
- package/typedocs-generated/functions/sql_handle_delete.handleDelete.html +1 -0
- package/typedocs-generated/functions/sql_handle_insert.handleInsert.html +1 -0
- package/typedocs-generated/functions/sql_handle_select.handleSelect.html +1 -0
- package/typedocs-generated/functions/sql_handle_select.parseJoinClauses.html +1 -0
- package/typedocs-generated/functions/sql_handle_select.parseSelectClause.html +1 -0
- package/typedocs-generated/functions/sql_handle_update.handleUpdate.html +1 -0
- package/typedocs-generated/hierarchy.html +1 -1
- package/typedocs-generated/interfaces/types.Opts.html +3 -0
- package/typedocs-generated/interfaces/types.ValtheraParser.html +2 -2
- package/typedocs-generated/modules/index.html +1 -1
- package/typedocs-generated/modules/sql_handle_collection.html +1 -0
- package/typedocs-generated/modules/sql_handle_delete.html +1 -0
- package/typedocs-generated/modules/sql_handle_insert.html +1 -0
- package/typedocs-generated/modules/sql_handle_select.html +1 -0
- package/typedocs-generated/modules/sql_handle_update.html +1 -0
- package/typedocs-generated/modules/sql_utils_join.util.html +1 -0
- package/typedocs-generated/modules/types.html +1 -1
- package/typedocs-generated/modules.html +1 -1
- package/typedocs-generated/types/sql_utils_join.util.JoinClause.html +1 -0
- package/dist/sql/handle.d.ts +0 -12
- package/dist/sql/handle.js +0 -119
- package/dist/test/js.test.d.ts +0 -1
- package/dist/test/js.test.js +0 -85
- package/dist/test/sql/delete.test.d.ts +0 -1
- package/dist/test/sql/delete.test.js +0 -79
- package/dist/test/sql/insert.test.d.ts +0 -1
- package/dist/test/sql/insert.test.js +0 -79
- package/dist/test/sql/select.test.d.ts +0 -1
- package/dist/test/sql/select.test.js +0 -59
- package/dist/test/sql/update.test.d.ts +0 -1
- package/dist/test/sql/update.test.js +0 -71
- package/src/sql/handle.ts +0 -129
- package/typedocs-generated/functions/sql_handle.handleCreate.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleDelete.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleDrop.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleExists.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleGet.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleInsert.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleSelect.html +0 -1
- package/typedocs-generated/functions/sql_handle.handleUpdate.html +0 -1
- package/typedocs-generated/functions/sql_handle.parseSelectClause.html +0 -1
- package/typedocs-generated/modules/sql_handle.html +0 -1
- package/typedocs-generated/modules/test_js.test.html +0 -1
- package/typedocs-generated/modules/test_sql_delete.test.html +0 -1
- package/typedocs-generated/modules/test_sql_insert.test.html +0 -1
- package/typedocs-generated/modules/test_sql_select.test.html +0 -1
- package/typedocs-generated/modules/test_sql_update.test.html +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.0.10](https://github.com/wxn0brP/ValtheraDB-string-query/compare/v0.0.9...v0.0.10) (2025-12-05)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* join uitl ([93b419e](https://github.com/wxn0brP/ValtheraDB-string-query/commit/93b419ef251af6284842aa3b0070d8a86b045243))
|
|
11
|
+
* parse join util ([7573fd2](https://github.com/wxn0brP/ValtheraDB-string-query/commit/7573fd200a2f1d61a55c559e9b18b27b5a75e6e1))
|
|
12
|
+
* select test ([0a81195](https://github.com/wxn0brP/ValtheraDB-string-query/commit/0a8119565f6203bcc06ce9cf49b3f16dae87efa8))
|
|
13
|
+
|
|
14
|
+
### [0.0.9](https://github.com/wxn0brP/ValtheraDB-string-query/compare/v0.0.8...v0.0.9) (2025-11-30)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* join support [#1](https://github.com/wxn0brP/ValtheraDB-string-query/issues/1) ([9628a84](https://github.com/wxn0brP/ValtheraDB-string-query/commit/9628a84ece45a5c221eaa58c29672943dd7cf9b8))
|
|
20
|
+
* join support [#2](https://github.com/wxn0brP/ValtheraDB-string-query/issues/2) ([a3ea7e5](https://github.com/wxn0brP/ValtheraDB-string-query/commit/a3ea7e5b78302c25e2339700f849a57f7704ca22))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Bug Fixes
|
|
24
|
+
|
|
25
|
+
* sql ; support ([647faf3](https://github.com/wxn0brP/ValtheraDB-string-query/commit/647faf3fb9c0a5c61d8e9d800d2b96a051ab50ce))
|
|
26
|
+
|
|
5
27
|
### 0.0.8 (2025-11-16)
|
|
6
28
|
|
|
7
29
|
|
package/bun.lock
CHANGED
|
@@ -5,16 +5,19 @@
|
|
|
5
5
|
"": {
|
|
6
6
|
"name": "@wxn0brp/db-string-query",
|
|
7
7
|
"devDependencies": {
|
|
8
|
-
"@types/bun": "
|
|
8
|
+
"@types/bun": "*",
|
|
9
9
|
"@types/node": "*",
|
|
10
|
+
"@wxn0brp/db-core": "^0.2.7",
|
|
10
11
|
"json5": "^2.2.3",
|
|
11
12
|
"tsc-alias": "*",
|
|
12
13
|
"typescript": "*",
|
|
13
14
|
},
|
|
14
15
|
"peerDependencies": {
|
|
16
|
+
"@wxn0brp/db-core": ">=0.2.7",
|
|
15
17
|
"json5": "^2.2.3",
|
|
16
18
|
},
|
|
17
19
|
"optionalPeers": [
|
|
20
|
+
"@wxn0brp/db-core",
|
|
18
21
|
"json5",
|
|
19
22
|
],
|
|
20
23
|
},
|
|
@@ -26,11 +29,13 @@
|
|
|
26
29
|
|
|
27
30
|
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
|
28
31
|
|
|
29
|
-
"@types/bun": ["@types/bun@1.3.
|
|
32
|
+
"@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="],
|
|
30
33
|
|
|
31
34
|
"@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
|
|
32
35
|
|
|
33
|
-
"@
|
|
36
|
+
"@wxn0brp/db-core": ["@wxn0brp/db-core@0.2.12", "", { "dependencies": { "@wxn0brp/event-emitter": "^0.0.3" } }, "sha512-DQuYBDnC+XdouqS6aUwPqWW/2KIB4t6YqtGg5BDo7Ti8afHSukH3tj7IneVv/Aquhc6I9C8lUQVkindPG7H2wA=="],
|
|
37
|
+
|
|
38
|
+
"@wxn0brp/event-emitter": ["@wxn0brp/event-emitter@0.0.3", "", {}, "sha512-OYkyDJphUDlWSOArLs3kdXWsacQ/1AtLNQl23ffrSoIiUPpcTxTzvlFGE3Y5M50j9lstYH4Dtvbx7edOQnK2qA=="],
|
|
34
39
|
|
|
35
40
|
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
|
36
41
|
|
|
@@ -40,14 +45,12 @@
|
|
|
40
45
|
|
|
41
46
|
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
|
42
47
|
|
|
43
|
-
"bun-types": ["bun-types@1.3.
|
|
48
|
+
"bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="],
|
|
44
49
|
|
|
45
50
|
"chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
|
|
46
51
|
|
|
47
52
|
"commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
|
|
48
53
|
|
|
49
|
-
"csstype": ["csstype@3.2.1", "", {}, "sha512-98XGutrXoh75MlgLihlNxAGbUuFQc7l1cqcnEZlLNKc0UrVdPndgmaDmYTDDh929VS/eqTZV0rozmhu2qqT1/g=="],
|
|
50
|
-
|
|
51
54
|
"dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
|
|
52
55
|
|
|
53
56
|
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function handleGet(query: string): import("../../types.js").ValtheraQuery;
|
|
2
|
+
export declare function handleCreate(query: string): import("../../types.js").ValtheraQuery;
|
|
3
|
+
export declare function handleDrop(query: string): import("../../types.js").ValtheraQuery;
|
|
4
|
+
export declare function handleExists(query: string): import("../../types.js").ValtheraQuery;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { parseReturn } from "../utils.js";
|
|
2
|
+
export function handleGet(query) {
|
|
3
|
+
if (!/^GET\s+COLLECTIONS$/i.test(query)) {
|
|
4
|
+
throw new Error("Invalid GET COLLECTIONS syntax.");
|
|
5
|
+
}
|
|
6
|
+
return parseReturn("getCollections", []);
|
|
7
|
+
}
|
|
8
|
+
export function handleCreate(query) {
|
|
9
|
+
const match = query.match(/^CREATE\s+(?:TABLE|COLLECTION)\s+(IF\s+NOT\s+EXISTS\s+)?(\w+).*/i);
|
|
10
|
+
if (!match)
|
|
11
|
+
throw new Error("Invalid CREATE TABLE/COLLECTION syntax.");
|
|
12
|
+
return parseReturn("ensureCollection", [match[2]]);
|
|
13
|
+
}
|
|
14
|
+
export function handleDrop(query) {
|
|
15
|
+
const match = query.match(/^DROP\s+(?:TABLE|COLLECTION)\s+(?:IF\s+EXISTS\s+)?(\w+)$/i);
|
|
16
|
+
if (!match)
|
|
17
|
+
throw new Error("Invalid DROP TABLE/COLLECTION syntax.");
|
|
18
|
+
return parseReturn("removeCollection", [match[1]]);
|
|
19
|
+
}
|
|
20
|
+
export function handleExists(query) {
|
|
21
|
+
const match = query.match(/^EXISTS\s+(?:TABLE|COLLECTION)\s+(\w+)$/i);
|
|
22
|
+
if (!match)
|
|
23
|
+
throw new Error("Invalid EXISTS TABLE/COLLECTION syntax.");
|
|
24
|
+
return parseReturn("issetCollection", [match[1]]);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zcWwvaGFuZGxlL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWE7SUFDbkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYTtJQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUNyQixrRUFBa0UsQ0FDckUsQ0FBQztJQUNGLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUN2RixJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUNyRSxPQUFPLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYTtJQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDdkUsT0FBTyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleDelete(query: string): import("../../types.js").ValtheraQuery;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { parseReturn } from "../../sql/utils.js";
|
|
2
|
+
import { parseWhere } from "../../sql/where.js";
|
|
3
|
+
export function handleDelete(query) {
|
|
4
|
+
const match = query.match(/DELETE FROM ([\w\/]+)(?: WHERE (.+))?/i);
|
|
5
|
+
if (!match)
|
|
6
|
+
throw new Error("Invalid DELETE syntax");
|
|
7
|
+
const collection = match[1];
|
|
8
|
+
const whereClause = match[2] ? parseWhere(match[2]) : {};
|
|
9
|
+
return parseReturn("remove", [collection, whereClause]);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC9oYW5kbGUvZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWE7SUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRXpELE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleInsert(query: string): import("../../types.js").ValtheraQuery;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { parseReturn } from "../../sql/utils.js";
|
|
2
|
+
export function handleInsert(query) {
|
|
3
|
+
const match = query.match(/INSERT INTO ([\w\/]+)\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)/i);
|
|
4
|
+
if (!match)
|
|
5
|
+
throw new Error("Invalid INSERT syntax");
|
|
6
|
+
const collection = match[1];
|
|
7
|
+
const keys = match[2].split(/\s*,\s*/);
|
|
8
|
+
function splitByCommasOutsideQuotes(str) {
|
|
9
|
+
const tokens = [];
|
|
10
|
+
let current = '';
|
|
11
|
+
let inSingleQuote = false;
|
|
12
|
+
let inDoubleQuote = false;
|
|
13
|
+
for (let i = 0; i < str.length; i++) {
|
|
14
|
+
const char = str[i];
|
|
15
|
+
if ((char === "'") && !inDoubleQuote) {
|
|
16
|
+
inSingleQuote = !inSingleQuote;
|
|
17
|
+
current += char;
|
|
18
|
+
}
|
|
19
|
+
else if (char === '"' && !inSingleQuote) {
|
|
20
|
+
inDoubleQuote = !inDoubleQuote;
|
|
21
|
+
current += char;
|
|
22
|
+
}
|
|
23
|
+
else if (char === ',' && !inSingleQuote && !inDoubleQuote) {
|
|
24
|
+
tokens.push(current);
|
|
25
|
+
current = '';
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
current += char;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
tokens.push(current);
|
|
32
|
+
return tokens;
|
|
33
|
+
}
|
|
34
|
+
const rawValues = splitByCommasOutsideQuotes(match[3]);
|
|
35
|
+
const values = rawValues.map(v => {
|
|
36
|
+
v = v.trim();
|
|
37
|
+
if (v.length >= 2) {
|
|
38
|
+
if (v[0] === "'" && v[v.length - 1] === "'") {
|
|
39
|
+
v = v.substring(1, v.length - 1);
|
|
40
|
+
}
|
|
41
|
+
else if (v[0] === '"' && v[v.length - 1] === '"') {
|
|
42
|
+
v = v.substring(1, v.length - 1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return v;
|
|
46
|
+
});
|
|
47
|
+
if (keys.length !== values.length)
|
|
48
|
+
throw new Error("Number of columns and values does not match");
|
|
49
|
+
const data = Object.fromEntries(keys.map((k, i) => [k, isNaN(values[i]) ? values[i] : Number(values[i])]));
|
|
50
|
+
return parseReturn("add", [collection, data]);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC9oYW5kbGUvaW5zZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUN6RixJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNyRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2QyxTQUFTLDBCQUEwQixDQUFDLEdBQVc7UUFDM0MsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkMsYUFBYSxHQUFHLENBQUMsYUFBYSxDQUFDO2dCQUMvQixPQUFPLElBQUksSUFBSSxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hDLGFBQWEsR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLElBQUksQ0FBQztZQUNwQixDQUFDO2lCQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQixPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLElBQUksSUFBSSxDQUFDO1lBQ3BCLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2pELENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNsRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Opts } from "../../types.js";
|
|
2
|
+
export declare function handleSelect(query: string, opts?: Opts): import("../../types.js").ValtheraQuery;
|
|
3
|
+
export declare function parseJoinClauses(joinPart: string): Record<string, string>;
|
|
4
|
+
export declare function parseSelectClause(selectClause: string): {
|
|
5
|
+
select?: string[];
|
|
6
|
+
exclude?: string[];
|
|
7
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { parseReturn } from "../../sql/utils.js";
|
|
2
|
+
import { parseWhere } from "../../sql/where.js";
|
|
3
|
+
import { JoinToRelationsEngine } from "../utils/join.util.js";
|
|
4
|
+
export function handleSelect(query, opts) {
|
|
5
|
+
let whereClauseStr;
|
|
6
|
+
let mainQueryPart = query;
|
|
7
|
+
const whereIndex = query.toUpperCase().lastIndexOf(" WHERE ");
|
|
8
|
+
if (whereIndex !== -1) {
|
|
9
|
+
whereClauseStr = query.substring(whereIndex + 7).trim();
|
|
10
|
+
mainQueryPart = query.substring(0, whereIndex);
|
|
11
|
+
}
|
|
12
|
+
const match = mainQueryPart.match(/SELECT\s+(.+?)\s+FROM\s+([\w\/]+)((?:\s+JOIN\s+.+)*)?/i);
|
|
13
|
+
if (!match)
|
|
14
|
+
throw new Error("Invalid SELECT syntax");
|
|
15
|
+
const columnsPart = match[1].trim();
|
|
16
|
+
const collection = match[2];
|
|
17
|
+
const joinPart = match[3] || "";
|
|
18
|
+
const whereClause = whereClauseStr ? parseWhere(whereClauseStr) : {};
|
|
19
|
+
const findOpts = parseSelectClause(columnsPart);
|
|
20
|
+
if (joinPart && opts?.defaultDbKey) {
|
|
21
|
+
const joinClauses = parseJoinClauses(joinPart);
|
|
22
|
+
const relationsEngine = new JoinToRelationsEngine(opts.defaultDbKey, opts.tableDbMap);
|
|
23
|
+
const relations = relationsEngine.buildRelations(joinClauses, collection);
|
|
24
|
+
const path = [opts.defaultDbKey, collection];
|
|
25
|
+
return parseReturn("relation-find", [path, whereClause, relations, findOpts]);
|
|
26
|
+
}
|
|
27
|
+
return parseReturn("find", [collection, whereClause, {}, findOpts]);
|
|
28
|
+
}
|
|
29
|
+
export function parseJoinClauses(joinPart) {
|
|
30
|
+
const joinClauses = {};
|
|
31
|
+
const joinRegex = /\s+JOIN\s+([\w\/]+)(?:\s+AS\s+)?([\w\/]+)?\s+ON\s+([^\s]+)\s*=\s*([^\s]+)/gi;
|
|
32
|
+
let match;
|
|
33
|
+
while ((match = joinRegex.exec(joinPart)) !== null) {
|
|
34
|
+
const table = match[1];
|
|
35
|
+
const alias = match[2] || table;
|
|
36
|
+
const condition = `${match[3]} = ${match[4]}`;
|
|
37
|
+
joinClauses[alias] = condition;
|
|
38
|
+
}
|
|
39
|
+
return joinClauses;
|
|
40
|
+
}
|
|
41
|
+
export function parseSelectClause(selectClause) {
|
|
42
|
+
selectClause = selectClause.trim();
|
|
43
|
+
if (selectClause === "*")
|
|
44
|
+
return {};
|
|
45
|
+
const excludeMatch = selectClause.match(/\*\s+EXCLUDE\s+(.+)/i);
|
|
46
|
+
if (excludeMatch) {
|
|
47
|
+
return {
|
|
48
|
+
exclude: excludeMatch[1].split(/\s*,\s*/),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
select: selectClause.split(/\s*,\s*/),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC9oYW5kbGUvc2VsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RCxNQUFNLFVBQVUsWUFBWSxDQUN4QixLQUFhLEVBQ2IsSUFBVztJQUVYLElBQUksY0FBa0MsQ0FBQztJQUN2QyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFMUIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BCLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztJQUM1RixJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUVyRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVyRSxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVoRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0MsT0FBTyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWdCO0lBQzdDLE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7SUFDL0MsTUFBTSxTQUFTLEdBQUcsNkVBQTZFLENBQUM7SUFDaEcsSUFBSSxLQUFLLENBQUM7SUFDVixPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUN2QixDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFlBQW9CO0lBQ2xELFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFbkMsSUFBSSxZQUFZLEtBQUssR0FBRztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXBDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNoRSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2YsT0FBTztZQUNILE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUM1QyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU87UUFDSCxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7S0FDeEMsQ0FBQztBQUNOLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function handleUpdate(query: string): import("../../types.js").ValtheraQuery;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { parseReturn, parseSet } from "../../sql/utils.js";
|
|
2
|
+
import { parseWhere } from "../../sql/where.js";
|
|
3
|
+
export function handleUpdate(query) {
|
|
4
|
+
const match = query.match(/UPDATE\s+([\w\/]+)\s+SET\s+(.+)\s+WHERE\s+(.+)/i);
|
|
5
|
+
if (!match)
|
|
6
|
+
throw new Error("Invalid UPDATE syntax");
|
|
7
|
+
const collection = match[1];
|
|
8
|
+
const setClause = parseSet(match[2]);
|
|
9
|
+
const whereClause = parseWhere(match[3]);
|
|
10
|
+
return parseReturn("update", [collection, whereClause, setClause]);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC9oYW5kbGUvdXBkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUMsS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUVyRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6QyxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyJ9
|
package/dist/sql/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ValtheraParser } from "../types.js";
|
|
1
|
+
import { Opts, ValtheraParser } from "../types.js";
|
|
2
2
|
declare class SQLParser implements ValtheraParser {
|
|
3
|
-
parse(query: string): import("../types.js").ValtheraQuery;
|
|
3
|
+
parse(query: string, opts?: Opts): import("../types.js").ValtheraQuery;
|
|
4
4
|
}
|
|
5
5
|
export default SQLParser;
|
package/dist/sql/index.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import { handleCreate,
|
|
1
|
+
import { handleCreate, handleDrop, handleExists, handleGet } from "./handle/collection.js";
|
|
2
|
+
import { handleDelete } from "./handle/delete.js";
|
|
3
|
+
import { handleInsert } from "./handle/insert.js";
|
|
4
|
+
import { handleSelect } from "./handle/select.js";
|
|
5
|
+
import { handleUpdate } from "./handle/update.js";
|
|
2
6
|
class SQLParser {
|
|
3
|
-
parse(query) {
|
|
7
|
+
parse(query, opts) {
|
|
4
8
|
query = query.replace(/\s+/g, " ").trim();
|
|
9
|
+
if (query.endsWith(";"))
|
|
10
|
+
query = query.slice(0, -1);
|
|
5
11
|
const tokens = query.split(/\s+/);
|
|
6
12
|
const method = tokens[0].toUpperCase();
|
|
7
13
|
if (method === "SELECT") {
|
|
8
|
-
return handleSelect(query);
|
|
14
|
+
return handleSelect(query, opts);
|
|
9
15
|
}
|
|
10
16
|
else if (method === "INSERT") {
|
|
11
17
|
return handleInsert(query);
|
|
@@ -35,4 +41,4 @@ class SQLParser {
|
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
export default SQLParser;
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsTUFBTSxTQUFTO0lBQ1gsS0FBSyxDQUNELEtBQWEsRUFDYixJQUFXO1FBRVgsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QyxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELGFBQWE7YUFDUixJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN4QixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQUVELGVBQWUsU0FBUyxDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RelationTypes } from "@wxn0brp/db-core";
|
|
2
|
+
export type JoinClause = Record<string, string>;
|
|
3
|
+
export declare class JoinToRelationsEngine {
|
|
4
|
+
private defaultDbKey;
|
|
5
|
+
private tableDbMap?;
|
|
6
|
+
private knownForeignKeys;
|
|
7
|
+
constructor(defaultDbKey: string, tableDbMap?: Record<string, string>);
|
|
8
|
+
private identifyPkFk;
|
|
9
|
+
buildRelations(joinClauses: JoinClause, mainTable: string): RelationTypes.Relation;
|
|
10
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class JoinToRelationsEngine {
|
|
2
|
+
defaultDbKey;
|
|
3
|
+
tableDbMap;
|
|
4
|
+
knownForeignKeys = new Set();
|
|
5
|
+
constructor(defaultDbKey, tableDbMap) {
|
|
6
|
+
this.defaultDbKey = defaultDbKey;
|
|
7
|
+
this.tableDbMap = tableDbMap;
|
|
8
|
+
}
|
|
9
|
+
identifyPkFk(left, right, mainTable, knownFks) {
|
|
10
|
+
const [leftTable, leftField] = left.split(".");
|
|
11
|
+
const [rightTable, rightField] = right.split(".");
|
|
12
|
+
if (leftTable === mainTable)
|
|
13
|
+
return { pk: left, fk: right };
|
|
14
|
+
else if (rightTable === mainTable)
|
|
15
|
+
return { pk: right, fk: left };
|
|
16
|
+
if (knownFks.has(left))
|
|
17
|
+
return { pk: right, fk: left };
|
|
18
|
+
else if (knownFks.has(right))
|
|
19
|
+
return { pk: left, fk: right };
|
|
20
|
+
// If either of the above conditions are met, use a heuristic: set pk to the field named "id" or "_id"
|
|
21
|
+
if (leftField === "id" || leftField === "_id") {
|
|
22
|
+
return { pk: left, fk: right };
|
|
23
|
+
}
|
|
24
|
+
else if (rightField === "id" || rightField === "_id") {
|
|
25
|
+
return { pk: right, fk: left };
|
|
26
|
+
}
|
|
27
|
+
// If still unsure, throw an error
|
|
28
|
+
throw new Error(`Cannot determine pk/fk from condition: "${left} = ${right}"`);
|
|
29
|
+
}
|
|
30
|
+
buildRelations(joinClauses, mainTable) {
|
|
31
|
+
const relations = {};
|
|
32
|
+
const knownFks = new Set(this.knownForeignKeys);
|
|
33
|
+
for (const [alias, condition] of Object.entries(joinClauses)) {
|
|
34
|
+
const [left, right] = condition.split(/\s*=\s*/);
|
|
35
|
+
const { pk, fk } = this.identifyPkFk(left, right, mainTable, knownFks);
|
|
36
|
+
const [pkTable, pkField] = pk.split(".");
|
|
37
|
+
const [fkTable, fkField] = fk.split(".");
|
|
38
|
+
knownFks.add(fk);
|
|
39
|
+
const dbKey = this.tableDbMap?.[fkTable] || this.defaultDbKey;
|
|
40
|
+
relations[alias] = {
|
|
41
|
+
type: "1n",
|
|
42
|
+
path: [dbKey, fkTable],
|
|
43
|
+
pk: pkField,
|
|
44
|
+
fk: fkField,
|
|
45
|
+
as: alias,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
this.knownForeignKeys = knownFks;
|
|
49
|
+
return relations;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC91dGlscy9qb2luLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLHFCQUFxQjtJQUlsQjtJQUNBO0lBSkosZ0JBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbEQsWUFDWSxZQUFvQixFQUNwQixVQUFtQztRQURuQyxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUF5QjtJQUMzQyxDQUFDO0lBRUcsWUFBWSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxRQUFxQjtRQUN0RixNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxELElBQUksU0FBUyxLQUFLLFNBQVM7WUFDdkIsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQzlCLElBQUksVUFBVSxLQUFLLFNBQVM7WUFDN0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRW5DLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzlCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDeEIsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBRW5DLHNHQUFzRztRQUN0RyxJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2FBQU0sSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU0sY0FBYyxDQUNqQixXQUF1QixFQUN2QixTQUFpQjtRQUVqQixNQUFNLFNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWhELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDM0QsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRWpELE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV2RSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXpDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7WUFFOUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUNmLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7Z0JBQ3RCLEVBQUUsRUFBRSxPQUFPO2dCQUNYLEVBQUUsRUFBRSxPQUFPO2dCQUNYLEVBQUUsRUFBRSxLQUFLO2FBQ1osQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1FBRWpDLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7Q0FDSiJ9
|
package/dist/sql/where.js
CHANGED
|
@@ -108,6 +108,9 @@ export function parseWhere(where) {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
let key = token;
|
|
111
|
+
if (key.includes(".")) {
|
|
112
|
+
key = key.split(".").pop();
|
|
113
|
+
}
|
|
111
114
|
let opToken = tokens[++i]?.trim();
|
|
112
115
|
let value = tokens[++i]?.trim();
|
|
113
116
|
if (!key || !opToken || value === undefined) {
|
|
@@ -162,4 +165,4 @@ export function parseWhere(where) {
|
|
|
162
165
|
}
|
|
163
166
|
return current;
|
|
164
167
|
}
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsL3doZXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sU0FBUyxHQUEyQjtJQUN0QyxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsS0FBSztJQUNYLFFBQVEsRUFBRSxNQUFNO0NBQ25CLENBQUM7QUFFRixTQUFTLFlBQVksQ0FBQyxNQUFtQixFQUFFLE1BQW1CO0lBQzFELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsMkNBQTJDO1lBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDSixpRkFBaUY7WUFDakYsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLGtFQUFrRTtnQkFDbEUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FB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
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ export interface ValtheraQuery {
|
|
|
2
2
|
method: string;
|
|
3
3
|
args: any[];
|
|
4
4
|
}
|
|
5
|
+
export interface Opts {
|
|
6
|
+
defaultDbKey: string;
|
|
7
|
+
tableDbMap?: Record<string, string>;
|
|
8
|
+
}
|
|
5
9
|
export interface ValtheraParser {
|
|
6
|
-
parse(query: string): ValtheraQuery;
|
|
10
|
+
parse(query: string, opts?: Opts): ValtheraQuery;
|
|
7
11
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wxn0brp/db-string-query",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"repository": {
|
|
@@ -12,18 +12,23 @@
|
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"type": "module",
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"@types/bun": "
|
|
15
|
+
"@types/bun": "*",
|
|
16
16
|
"@types/node": "*",
|
|
17
|
+
"@wxn0brp/db-core": "^0.2.7",
|
|
17
18
|
"json5": "^2.2.3",
|
|
18
19
|
"tsc-alias": "*",
|
|
19
20
|
"typescript": "*"
|
|
20
21
|
},
|
|
21
22
|
"peerDependencies": {
|
|
23
|
+
"@wxn0brp/db-core": ">=0.2.7",
|
|
22
24
|
"json5": "^2.2.3"
|
|
23
25
|
},
|
|
24
26
|
"peerDependenciesMeta": {
|
|
25
27
|
"json5": {
|
|
26
28
|
"optional": true
|
|
29
|
+
},
|
|
30
|
+
"@wxn0brp/db-core": {
|
|
31
|
+
"optional": true
|
|
27
32
|
}
|
|
28
33
|
},
|
|
29
34
|
"exports": {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { parseReturn } from "../utils";
|
|
2
|
+
|
|
3
|
+
export function handleGet(query: string) {
|
|
4
|
+
if (!/^GET\s+COLLECTIONS$/i.test(query)) {
|
|
5
|
+
throw new Error("Invalid GET COLLECTIONS syntax.");
|
|
6
|
+
}
|
|
7
|
+
return parseReturn("getCollections", []);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function handleCreate(query: string) {
|
|
11
|
+
const match = query.match(
|
|
12
|
+
/^CREATE\s+(?:TABLE|COLLECTION)\s+(IF\s+NOT\s+EXISTS\s+)?(\w+).*/i
|
|
13
|
+
);
|
|
14
|
+
if (!match) throw new Error("Invalid CREATE TABLE/COLLECTION syntax.");
|
|
15
|
+
return parseReturn("ensureCollection", [match[2]]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function handleDrop(query: string) {
|
|
19
|
+
const match = query.match(/^DROP\s+(?:TABLE|COLLECTION)\s+(?:IF\s+EXISTS\s+)?(\w+)$/i);
|
|
20
|
+
if (!match) throw new Error("Invalid DROP TABLE/COLLECTION syntax.");
|
|
21
|
+
return parseReturn("removeCollection", [match[1]]);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function handleExists(query: string) {
|
|
25
|
+
const match = query.match(/^EXISTS\s+(?:TABLE|COLLECTION)\s+(\w+)$/i);
|
|
26
|
+
if (!match) throw new Error("Invalid EXISTS TABLE/COLLECTION syntax.");
|
|
27
|
+
return parseReturn("issetCollection", [match[1]]);
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { parseReturn } from "#sql/utils";
|
|
2
|
+
import { parseWhere } from "#sql/where";
|
|
3
|
+
|
|
4
|
+
export function handleDelete(query: string) {
|
|
5
|
+
const match = query.match(/DELETE FROM ([\w\/]+)(?: WHERE (.+))?/i);
|
|
6
|
+
if (!match) throw new Error("Invalid DELETE syntax");
|
|
7
|
+
|
|
8
|
+
const collection = match[1];
|
|
9
|
+
const whereClause = match[2] ? parseWhere(match[2]) : {};
|
|
10
|
+
|
|
11
|
+
return parseReturn("remove", [collection, whereClause]);
|
|
12
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { parseReturn } from "#sql/utils";
|
|
2
|
+
|
|
3
|
+
export function handleInsert(query: string) {
|
|
4
|
+
const match = query.match(/INSERT INTO ([\w\/]+)\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)/i);
|
|
5
|
+
if (!match) throw new Error("Invalid INSERT syntax");
|
|
6
|
+
const collection = match[1];
|
|
7
|
+
const keys = match[2].split(/\s*,\s*/);
|
|
8
|
+
|
|
9
|
+
function splitByCommasOutsideQuotes(str: string): string[] {
|
|
10
|
+
const tokens: string[] = [];
|
|
11
|
+
let current = '';
|
|
12
|
+
let inSingleQuote = false;
|
|
13
|
+
let inDoubleQuote = false;
|
|
14
|
+
|
|
15
|
+
for (let i = 0; i < str.length; i++) {
|
|
16
|
+
const char = str[i];
|
|
17
|
+
if ((char === "'") && !inDoubleQuote) {
|
|
18
|
+
inSingleQuote = !inSingleQuote;
|
|
19
|
+
current += char;
|
|
20
|
+
} else if (char === '"' && !inSingleQuote) {
|
|
21
|
+
inDoubleQuote = !inDoubleQuote;
|
|
22
|
+
current += char;
|
|
23
|
+
} else if (char === ',' && !inSingleQuote && !inDoubleQuote) {
|
|
24
|
+
tokens.push(current);
|
|
25
|
+
current = '';
|
|
26
|
+
} else {
|
|
27
|
+
current += char;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
tokens.push(current);
|
|
31
|
+
return tokens;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const rawValues = splitByCommasOutsideQuotes(match[3]);
|
|
35
|
+
const values = rawValues.map(v => {
|
|
36
|
+
v = v.trim();
|
|
37
|
+
if (v.length >= 2) {
|
|
38
|
+
if (v[0] === "'" && v[v.length - 1] === "'") {
|
|
39
|
+
v = v.substring(1, v.length - 1);
|
|
40
|
+
} else if (v[0] === '"' && v[v.length - 1] === '"') {
|
|
41
|
+
v = v.substring(1, v.length - 1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return v;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
if (keys.length !== values.length) throw new Error("Number of columns and values does not match");
|
|
48
|
+
const data = Object.fromEntries(keys.map((k, i) => [k, isNaN(values[i] as any) ? values[i] : Number(values[i])]));
|
|
49
|
+
return parseReturn("add", [collection, data]);
|
|
50
|
+
}
|