@wxn0brp/db-string-query 0.0.7 → 0.0.9

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.
Files changed (91) hide show
  1. package/.github/workflows/build.yml +18 -0
  2. package/CHANGELOG.md +44 -0
  3. package/bun.lock +118 -0
  4. package/dist/sql/handle/collection.d.ts +4 -0
  5. package/dist/sql/handle/collection.js +26 -0
  6. package/dist/sql/handle/delete.d.ts +1 -0
  7. package/dist/sql/handle/delete.js +11 -0
  8. package/dist/sql/handle/insert.d.ts +1 -0
  9. package/dist/sql/handle/insert.js +52 -0
  10. package/dist/sql/handle/select.d.ts +7 -0
  11. package/dist/sql/handle/select.js +55 -0
  12. package/dist/sql/handle/update.d.ts +1 -0
  13. package/dist/sql/handle/update.js +12 -0
  14. package/dist/sql/index.d.ts +2 -2
  15. package/dist/sql/index.js +10 -4
  16. package/dist/sql/utils/join.util.d.ts +10 -0
  17. package/dist/sql/utils/join.util.js +55 -0
  18. package/dist/sql/where.js +54 -17
  19. package/dist/types.d.ts +5 -1
  20. package/package.json +41 -39
  21. package/src/sql/handle/collection.ts +28 -0
  22. package/src/sql/handle/delete.ts +12 -0
  23. package/src/sql/handle/insert.ts +50 -0
  24. package/src/sql/handle/select.ts +68 -0
  25. package/src/sql/handle/update.ts +13 -0
  26. package/src/sql/index.ts +12 -13
  27. package/src/sql/utils/join.util.ts +73 -0
  28. package/src/sql/where.ts +53 -17
  29. package/src/types.ts +9 -1
  30. package/suglite.json +2 -2
  31. package/test/js.test.ts +103 -0
  32. package/test/sql/delete.test.ts +95 -0
  33. package/test/sql/index.test.ts +17 -0
  34. package/test/sql/insert.test.ts +95 -0
  35. package/test/sql/select.test.ts +92 -0
  36. package/test/sql/update.test.ts +85 -0
  37. package/test/sql/utils/join.test.ts +42 -0
  38. package/test/tsconfig.json +19 -0
  39. package/tsconfig.json +7 -3
  40. package/typedocs-generated/.nojekyll +1 -0
  41. package/typedocs-generated/404.html +76 -0
  42. package/typedocs-generated/assets/hierarchy.js +1 -0
  43. package/typedocs-generated/assets/highlight.css +78 -0
  44. package/typedocs-generated/assets/icons.js +18 -0
  45. package/typedocs-generated/assets/icons.svg +1 -0
  46. package/typedocs-generated/assets/main.js +60 -0
  47. package/typedocs-generated/assets/navigation.js +1 -0
  48. package/typedocs-generated/assets/search.js +1 -0
  49. package/typedocs-generated/assets/style.css +1633 -0
  50. package/typedocs-generated/classes/js.default.html +3 -0
  51. package/typedocs-generated/classes/sql_index.default.html +3 -0
  52. package/typedocs-generated/classes/sql_utils_join.util.JoinToRelationsEngine.html +3 -0
  53. package/typedocs-generated/functions/sql_handle_collection.handleCreate.html +1 -0
  54. package/typedocs-generated/functions/sql_handle_collection.handleDrop.html +1 -0
  55. package/typedocs-generated/functions/sql_handle_collection.handleExists.html +1 -0
  56. package/typedocs-generated/functions/sql_handle_collection.handleGet.html +1 -0
  57. package/typedocs-generated/functions/sql_handle_delete.handleDelete.html +1 -0
  58. package/typedocs-generated/functions/sql_handle_insert.handleInsert.html +1 -0
  59. package/typedocs-generated/functions/sql_handle_select.handleSelect.html +1 -0
  60. package/typedocs-generated/functions/sql_handle_select.parseJoinClauses.html +1 -0
  61. package/typedocs-generated/functions/sql_handle_select.parseSelectClause.html +1 -0
  62. package/typedocs-generated/functions/sql_handle_update.handleUpdate.html +1 -0
  63. package/typedocs-generated/functions/sql_utils.parseReturn.html +1 -0
  64. package/typedocs-generated/functions/sql_utils.parseSet.html +1 -0
  65. package/typedocs-generated/functions/sql_where.parseWhere.html +1 -0
  66. package/typedocs-generated/hierarchy.html +1 -0
  67. package/typedocs-generated/index.html +35 -0
  68. package/typedocs-generated/interfaces/types.Opts.html +3 -0
  69. package/typedocs-generated/interfaces/types.ValtheraParser.html +2 -0
  70. package/typedocs-generated/interfaces/types.ValtheraQuery.html +3 -0
  71. package/typedocs-generated/media/LICENSE +21 -0
  72. package/typedocs-generated/modules/.html +1 -0
  73. package/typedocs-generated/modules/index.html +1 -0
  74. package/typedocs-generated/modules/js.html +1 -0
  75. package/typedocs-generated/modules/sql_handle_collection.html +1 -0
  76. package/typedocs-generated/modules/sql_handle_delete.html +1 -0
  77. package/typedocs-generated/modules/sql_handle_insert.html +1 -0
  78. package/typedocs-generated/modules/sql_handle_select.html +1 -0
  79. package/typedocs-generated/modules/sql_handle_update.html +1 -0
  80. package/typedocs-generated/modules/sql_index.html +1 -0
  81. package/typedocs-generated/modules/sql_utils.html +1 -0
  82. package/typedocs-generated/modules/sql_utils_join.util.html +1 -0
  83. package/typedocs-generated/modules/sql_where.html +1 -0
  84. package/typedocs-generated/modules/types.html +1 -0
  85. package/typedocs-generated/modules.html +1 -0
  86. package/typedocs-generated/types/sql_utils_join.util.JoinClause.html +1 -0
  87. package/typedocs-generated/variables/.ValtheraDbParsers.html +1 -0
  88. package/typedocs-generated/variables/.ValtheraDbRelations.html +1 -0
  89. package/dist/sql/handle.d.ts +0 -12
  90. package/dist/sql/handle.js +0 -119
  91. package/src/sql/handle.ts +0 -129
@@ -14,8 +14,26 @@ concurrency:
14
14
  cancel-in-progress: true
15
15
 
16
16
  jobs:
17
+ test:
18
+ runs-on: ubuntu-latest
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@v6
23
+
24
+ - uses: oven-sh/setup-bun@v2
25
+ with:
26
+ bun-version: latest
27
+
28
+ - name: Install dependencies
29
+ run: bun install
30
+
31
+ - name: Run unit tests
32
+ run: bun test
33
+
17
34
  deploy:
18
35
  runs-on: ubuntu-latest
36
+ needs: test
19
37
  permissions:
20
38
  contents: write
21
39
  id-token: write
package/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
1
+ # Changelog
2
+
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
+
5
+ ### [0.0.9](https://github.com/wxn0brP/ValtheraDB-string-query/compare/v0.0.8...v0.0.9) (2025-11-30)
6
+
7
+
8
+ ### Features
9
+
10
+ * join support [#1](https://github.com/wxn0brP/ValtheraDB-string-query/issues/1) ([9628a84](https://github.com/wxn0brP/ValtheraDB-string-query/commit/9628a84ece45a5c221eaa58c29672943dd7cf9b8))
11
+ * join support [#2](https://github.com/wxn0brP/ValtheraDB-string-query/issues/2) ([a3ea7e5](https://github.com/wxn0brP/ValtheraDB-string-query/commit/a3ea7e5b78302c25e2339700f849a57f7704ca22))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * sql ; support ([647faf3](https://github.com/wxn0brP/ValtheraDB-string-query/commit/647faf3fb9c0a5c61d8e9d800d2b96a051ab50ce))
17
+
18
+ ### 0.0.8 (2025-11-16)
19
+
20
+
21
+ ### Features
22
+
23
+ * build workflow ([83e8e5e](https://github.com/wxn0brP/ValtheraDB-string-query/commit/83e8e5eed7ae027513248c2cb0e831fb2165312b))
24
+ * enhance sql engine and reorganize exports ([4afda95](https://github.com/wxn0brP/ValtheraDB-string-query/commit/4afda953b38eeb02644220a2eda548fdc824b249))
25
+ * exports ([c7354ec](https://github.com/wxn0brP/ValtheraDB-string-query/commit/c7354ec62bd443596d3edcefc9b8729a47f286be))
26
+ * imports ([0155739](https://github.com/wxn0brP/ValtheraDB-string-query/commit/01557398c8c77b9a66419ef40d7991d192e4636a))
27
+ * improve DROP command syntax handling ([ef9d942](https://github.com/wxn0brP/ValtheraDB-string-query/commit/ef9d9428918c8df7f42d1947b74ae523bed28a94))
28
+ * readme & small changes ([0df2679](https://github.com/wxn0brP/ValtheraDB-string-query/commit/0df2679c120daadd293a338e0c59ea8fa7cd88bf))
29
+ * simplify build and deploy workflow by using external template ([f8acd94](https://github.com/wxn0brP/ValtheraDB-string-query/commit/f8acd9429b25453262b1cd711b37524d139a56f1))
30
+ * **sql:** add collection handling methods for GET, CREATE, DROP, and EXISTS ([ea8b601](https://github.com/wxn0brP/ValtheraDB-string-query/commit/ea8b601a0c134f4309f5374be07819bbaf25c552))
31
+ * **sql:** check if where is null or "1" ([92008aa](https://github.com/wxn0brP/ValtheraDB-string-query/commit/92008aa0ecd42317f39fc8807b978dcb721f248a))
32
+ * **sql:** enhance query handling for CREATE, DROP, and EXISTS commands ([ad20f37](https://github.com/wxn0brP/ValtheraDB-string-query/commit/ad20f37676483bf4ffea65e49797aa5c08fd3d5a))
33
+ * types ([ed925aa](https://github.com/wxn0brP/ValtheraDB-string-query/commit/ed925aa5c195e323560fa25c47ee5f6e81a03fc3))
34
+ * types ([de6a23a](https://github.com/wxn0brP/ValtheraDB-string-query/commit/de6a23a2fe2037689ccaeab97ccad2c0c1d9e654))
35
+ * unit tests ([a88da49](https://github.com/wxn0brP/ValtheraDB-string-query/commit/a88da49b1f5277169cf198a824a9d9dc2038a96a))
36
+ * update parser to new db ([d61300a](https://github.com/wxn0brP/ValtheraDB-string-query/commit/d61300a0acdead9e8887e96cedd082ca68f87c5c))
37
+
38
+
39
+ ### Bug Fixes
40
+
41
+ * **sql:** ensure collection ([af3df0d](https://github.com/wxn0brP/ValtheraDB-string-query/commit/af3df0df7ae484b7bc9e7586887f002fc4677c3e))
42
+ * **sql:** improve regex for CREATE TABLE/COLLECTION command validation ([446ba29](https://github.com/wxn0brP/ValtheraDB-string-query/commit/446ba29e802fdd195d13e8b1fe91b0890aa67dc3))
43
+ * **sql:** insert ([97d393a](https://github.com/wxn0brP/ValtheraDB-string-query/commit/97d393a75b2bfa67aabe3aea60ef2e2e3378b5e5))
44
+ * where ([6e77c15](https://github.com/wxn0brP/ValtheraDB-string-query/commit/6e77c15c486fd9477d5579ba00ca5000785d868a))
package/bun.lock ADDED
@@ -0,0 +1,118 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "configVersion": 1,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "@wxn0brp/db-string-query",
7
+ "devDependencies": {
8
+ "@types/bun": "*",
9
+ "@types/node": "*",
10
+ "@wxn0brp/db-core": "^0.2.7",
11
+ "json5": "^2.2.3",
12
+ "tsc-alias": "*",
13
+ "typescript": "*",
14
+ },
15
+ "peerDependencies": {
16
+ "@wxn0brp/db-core": ">=0.2.7",
17
+ "json5": "^2.2.3",
18
+ },
19
+ "optionalPeers": [
20
+ "@wxn0brp/db-core",
21
+ "json5",
22
+ ],
23
+ },
24
+ },
25
+ "packages": {
26
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
27
+
28
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
29
+
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=="],
31
+
32
+ "@types/bun": ["@types/bun@1.3.3", "", { "dependencies": { "bun-types": "1.3.3" } }, "sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g=="],
33
+
34
+ "@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
35
+
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=="],
39
+
40
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
41
+
42
+ "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
43
+
44
+ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
45
+
46
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
47
+
48
+ "bun-types": ["bun-types@1.3.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ=="],
49
+
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=="],
51
+
52
+ "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
53
+
54
+ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
55
+
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=="],
57
+
58
+ "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
59
+
60
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
61
+
62
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
63
+
64
+ "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="],
65
+
66
+ "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
67
+
68
+ "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
69
+
70
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
71
+
72
+ "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
73
+
74
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
75
+
76
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
77
+
78
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
79
+
80
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
81
+
82
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
83
+
84
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
85
+
86
+ "mylas": ["mylas@2.1.14", "", {}, "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog=="],
87
+
88
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
89
+
90
+ "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
91
+
92
+ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
93
+
94
+ "plimit-lit": ["plimit-lit@1.6.1", "", { "dependencies": { "queue-lit": "^1.5.1" } }, "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA=="],
95
+
96
+ "queue-lit": ["queue-lit@1.5.2", "", {}, "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw=="],
97
+
98
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
99
+
100
+ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
101
+
102
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
103
+
104
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
105
+
106
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
107
+
108
+ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
109
+
110
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
111
+
112
+ "tsc-alias": ["tsc-alias@1.8.16", "", { "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "get-tsconfig": "^4.10.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" }, "bin": { "tsc-alias": "dist/bin/index.js" } }, "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g=="],
113
+
114
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
115
+
116
+ "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
117
+ }
118
+ }
@@ -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
@@ -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, handleDelete, handleDrop, handleExists, handleGet, handleInsert, handleSelect, handleUpdate } from "./handle.js";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDSCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE1BQU0sU0FBUztJQUNYLEtBQUssQ0FBQyxLQUFhO1FBQ2YsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXZDLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxhQUFhO2FBQ1IsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEIsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMzQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDTCxDQUFDO0NBQ0o7QUFFRCxlQUFlLFNBQVMsQ0FBQyJ9
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,55 @@
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
+ // Check if one of the fields is already known as a foreign key
13
+ const leftFull = `${leftTable}.${leftField}`;
14
+ const rightFull = `${rightTable}.${rightField}`;
15
+ if (knownFks.has(leftFull))
16
+ return { pk: right, fk: left };
17
+ else if (knownFks.has(rightFull))
18
+ return { pk: left, fk: right };
19
+ // If either of the above conditions are met, use a heuristic: set pk to the field named "id" or "_id"
20
+ if (leftField === "id" || leftField === "_id") {
21
+ return { pk: left, fk: right };
22
+ }
23
+ else if (rightField === "id" || rightField === "_id") {
24
+ return { pk: right, fk: left };
25
+ }
26
+ if (leftTable === mainTable)
27
+ return { pk: left, fk: right };
28
+ else if (rightTable === mainTable)
29
+ return { pk: right, fk: left };
30
+ // If still unsure, throw an error
31
+ throw new Error(`Cannot determine pk/fk from condition: "${left} = ${right}"`);
32
+ }
33
+ buildRelations(joinClauses, mainTable) {
34
+ const relations = {};
35
+ const knownFks = new Set(this.knownForeignKeys);
36
+ for (const [alias, condition] of Object.entries(joinClauses)) {
37
+ const [left, right] = condition.split(/\s*=\s*/);
38
+ const { pk, fk } = this.identifyPkFk(left, right, mainTable, knownFks);
39
+ const [pkTable, pkField] = pk.split(".");
40
+ const [fkTable, fkField] = fk.split(".");
41
+ knownFks.add(`${fkTable}.${fkField}`);
42
+ const dbKey = this.tableDbMap?.[fkTable] || this.defaultDbKey;
43
+ relations[alias] = {
44
+ type: "1n",
45
+ path: [dbKey, fkTable],
46
+ pk: pkField,
47
+ fk: fkField,
48
+ as: alias,
49
+ };
50
+ }
51
+ this.knownForeignKeys = knownFks;
52
+ return relations;
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NxbC91dGlscy9qb2luLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLHFCQUFxQjtJQUlsQjtJQUNBO0lBSkosZ0JBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbEQsWUFDWSxZQUFvQixFQUNwQixVQUFtQztRQURuQyxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUF5QjtJQUMzQyxDQUFDO0lBRUcsWUFBWSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxRQUFxQjtRQUN0RixNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxELCtEQUErRDtRQUMvRCxNQUFNLFFBQVEsR0FBRyxHQUFHLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVoRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3RCLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM5QixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQzVCLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUVuQyxzR0FBc0c7UUFDdEcsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckQsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQ3ZCLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUM5QixJQUFJLFVBQVUsS0FBSyxTQUFTO1lBQzdCLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUVuQyxrQ0FBa0M7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVNLGNBQWMsQ0FDakIsV0FBdUIsRUFDdkIsU0FBaUI7UUFFakIsTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVoRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVqRCxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFdkUsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7WUFFOUQsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUNmLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7Z0JBQ3RCLEVBQUUsRUFBRSxPQUFPO2dCQUNYLEVBQUUsRUFBRSxPQUFPO2dCQUNYLEVBQUUsRUFBRSxLQUFLO2FBQ1osQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1FBRWpDLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7Q0FDSiJ9