From 68371e972e120eda0b2bc4ac38637f5f71ff61b5 Mon Sep 17 00:00:00 2001 From: Kyriakos Barbounakis Date: Mon, 24 Aug 2026 11:16:25 +0300 Subject: [PATCH 1/3] use to return an array of primitive values as JSON --- package-lock.json | 337 +++++++++++------------- package.json | 6 +- spec/QueryExpression.selectJson.spec.js | 47 ++++ src/SqliteFormatter.js | 28 +- 4 files changed, 226 insertions(+), 192 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7772fb6..729e346 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,11 +27,11 @@ "@babel/register": "^7.25.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-commonjs": "^22.0.0", - "@themost/common": "^2.12.0", - "@themost/data": "^2.23.0", + "@themost/common": "^2.12.3", + "@themost/data": "^2.24.0", "@themost/json-logger": "^1.1.0", "@themost/peers": "^1.0.2", - "@themost/query": "^2.14.7", + "@themost/query": "^2.15.1", "@themost/xml": "^2.5.2", "@types/better-sqlite3": "^7.6.13", "@types/jasmine": "^6.0.0", @@ -57,19 +57,6 @@ "@themost/query": "^2" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/cli": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.9.tgz", @@ -129,13 +116,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -144,9 +131,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", - "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -154,22 +141,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -244,14 +231,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -260,17 +247,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", @@ -299,14 +275,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -415,9 +391,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -439,29 +415,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -558,9 +534,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -568,9 +544,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -578,9 +554,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -603,27 +579,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -2019,33 +1995,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -2053,14 +2029,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2308,9 +2284,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -3106,16 +3082,25 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3127,15 +3112,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -3303,9 +3279,9 @@ } }, "node_modules/@themost/common": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@themost/common/-/common-2.12.0.tgz", - "integrity": "sha512-yyTF5VHf13bTnIb6XU3/LOd4oxXRgtwr0X87sqHrNv2etY2jJ9agBOXbSu9zUkgFA2lAoAPo6S94gG02g/Qo7w==", + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/@themost/common/-/common-2.12.3.tgz", + "integrity": "sha512-SvSocH1iD+4Lh51/sHQ6NUzDY6pS57GnsYcjkfiWSQZrKujyRTFLYk98uAFPS6tzvB97IQldAUQUhCoHRRWW6Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3316,32 +3292,16 @@ "events": "^3.2.0", "hashmap": "^2.3.0", "lodash": "^4.17.21", - "sprintf-js": "^1.1.2", - "symbol": "^0.3.1", - "uuid": "^10.0.0" + "sprintf-js": "^1.1.2" }, "engines": { - "node": ">=12.22.12" - } - }, - "node_modules/@themost/common/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=14.21.3" } }, "node_modules/@themost/data": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@themost/data/-/data-2.23.0.tgz", - "integrity": "sha512-bUzLVDNqP/vsM0GR1if+jt4OIf25arhuA0w2CVA9SxLsvrchLNp821RgfUW+a3oBPm5hPu2lE7Sa3dtGDvMhqQ==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/@themost/data/-/data-2.24.0.tgz", + "integrity": "sha512-nMt556y9YYBRDCRI/7ogaRLKYyA2M7Bc2ERU4uaOwj/T01kO8uw2aXoetS/AhEyizfKPPU817fziKtqknG399Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3357,38 +3317,30 @@ "q": "^1.4.1", "rxjs": "^7.8.2", "sprintf-js": "^1.1.2", - "symbol": "^0.3.1", - "uuid": "^10.0.0" + "symbol": "^0.3.1" }, "engines": { "node": ">=14.21.3" }, "peerDependencies": { - "@themost/common": "^2.10.4", + "@themost/common": "^2", "@themost/query": ">=2.14.1", "@themost/xml": "^2" } }, - "node_modules/@themost/data/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@themost/events": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@themost/events/-/events-1.5.0.tgz", "integrity": "sha512-R+q764cVNDPW4CYKr6Le1LCty1YYieKHbh9mJwv3gDo9fG2wtoN23T85ABnsQpTOkkJOsxk0+Tl3tPM3dblEjQ==", "license": "BSD-3-Clause" }, + "node_modules/@themost/json": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@themost/json/-/json-1.1.0.tgz", + "integrity": "sha512-Svk4cxzi2PMTGd04G01TqEXeB9n4MaT7z1GmDDZPshpl3rbyJY7LBjdLIR6M/13WHPKEtu4X8gdrtorrRO80DA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@themost/json-logger": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@themost/json-logger/-/json-logger-1.1.0.tgz", @@ -3415,16 +3367,17 @@ "dev": true }, "node_modules/@themost/query": { - "version": "2.14.7", - "resolved": "https://registry.npmjs.org/@themost/query/-/query-2.14.7.tgz", - "integrity": "sha512-VpW6ad64IRVHk+wY+FINbppblushOGIOb9TCwcNfr930o82IjTMhbOkGnIM2hx3x68T3iWoK0YiGaZxegAfWkg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/@themost/query/-/query-2.15.1.tgz", + "integrity": "sha512-6yZOS6+UPYTUCYtO71TXxmvRX590zIfqJXPDC2127JEpaxkgGSSn8soNdSIklxrqoo1LvWgTq96BckRbHpWspQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@themost/events": "^1.0.5", + "@themost/events": "^1.5.0", + "@themost/json": "^1.1.0", "async": "^3.2.3", "esprima": "^4.0.0", - "lodash": "^4.17.21", + "lodash": "^4.18.1", "sprintf-js": "^1.1.2" }, "engines": { @@ -3739,9 +3692,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -4265,9 +4218,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -7936,10 +7889,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/package.json b/package.json index 74037d3..3f32ca7 100644 --- a/package.json +++ b/package.json @@ -48,11 +48,11 @@ "@babel/register": "^7.25.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-commonjs": "^22.0.0", - "@themost/common": "^2.12.0", - "@themost/data": "^2.23.0", + "@themost/common": "^2.12.3", + "@themost/data": "^2.24.0", "@themost/json-logger": "^1.1.0", "@themost/peers": "^1.0.2", - "@themost/query": "^2.14.7", + "@themost/query": "^2.15.1", "@themost/xml": "^2.5.2", "@types/better-sqlite3": "^7.6.13", "@types/jasmine": "^6.0.0", diff --git a/spec/QueryExpression.selectJson.spec.js b/spec/QueryExpression.selectJson.spec.js index 03d44c1..bcf4765 100644 --- a/spec/QueryExpression.selectJson.spec.js +++ b/spec/QueryExpression.selectJson.spec.js @@ -364,6 +364,53 @@ describe('SqlFormatter', () => { }); }); + it('should use jsonArray and format query expressions', async () => { + await app.executeInTestTranscaction(async (context) => { + const People = new QueryEntity('PersonData'); + const Products = new QueryEntity('ProductData'); + const Orders = new QueryEntity('OrderData'); + const query = new QueryExpression().select( + 'id', + 'familyName', + 'givenName', + 'jobTitle', + 'email', + new QueryField({ + products: { + $jsonGroupArray: [ + new QueryExpression().select( + new QueryField({ + $value: { + $concat: [ + new QueryField('name').from(Products), + ' (', + new QueryField('model').from(Products), + ')' + ] + } + }), + ).from(Products).join(Orders).with( + new QueryExpression().where( + new QueryField('orderedItem').from(Orders) + ).equal( + new QueryField('id').from(Products) + ) + ).where( + new QueryField('customer').from(Orders) + ).equal( + new QueryField('id').from(People) + ) + ] + } + }) + ).from(People).where('email').equal('eric.thomas@example.com'); + const [item] = await context.db.executeAsync(query, []); + expect(item).toBeTruthy(); + expect(item.products).toBeTruthy(); + expect(Array.isArray(item.products)).toEqual(true); + }); + }); + it('should use jsonObject in ad-hoc queries', async () => { await app.executeInTestTranscaction(async (context) => { const {viewAdapter: Orders} = context.model('Order'); diff --git a/src/SqliteFormatter.js b/src/SqliteFormatter.js index ed17013..6d73e24 100644 --- a/src/SqliteFormatter.js +++ b/src/SqliteFormatter.js @@ -1,7 +1,7 @@ // MOST Web Framework Codename Zero Gravity Copyright (c) 2017-2022, THEMOST LP import { sprintf } from 'sprintf-js'; -import { SqlFormatter, QueryField } from '@themost/query'; +import {SqlFormatter, QueryField} from '@themost/query'; import { isObjectDeep } from './isObjectDeep'; const REGEXP_SINGLE_QUOTE=/\\'/g; const SINGLE_QUOTE_ESCAPE ='\'\''; @@ -403,9 +403,33 @@ class SqliteFormatter extends SqlFormatter { } /** - * @param {{ $jsonGet: Array<*> }} expr + * @param {{ $jsonGet: Array<*> } || { $select: * }} expr */ $jsonGroupArray(expr) { + if (expr instanceof QueryField) { + return `json_group_array(${this.escape(expr)})`; + } + if (expr && expr.$select) { + // noinspection JSUnresolvedReference + if (typeof this.$query !== 'function') { + throw new Error('Invalid query expression. The given expression is a select expression but the current formatter does not support formatting inner select expressions. Please provide a valid query formatter that supports inner select expressions.'); + } + // get select fields + const [key] = Object.keys(expr.$select); + const select = expr.$select[key]; + if (!Array.isArray(select) || select.length === 0) { + throw new Error('Invalid json group array expression. Expected an array of select fields'); + } + select[0] = { + $value: { + $jsonGroupArray: [ + select[0] + ] + } + } + // noinspection JSUnresolvedReference + return `${this.$query(expr)}`; + } const [key] = Object.keys(expr); if (key !== '$jsonObject') { throw new Error('Invalid json group array expression. Expected a json object expression'); From 7b5b815ed6436e21bd838105ca37965e0863b444 Mon Sep 17 00:00:00 2001 From: Kyriakos Barbounakis Date: Mon, 24 Aug 2026 11:54:37 +0300 Subject: [PATCH 2/3] test json group array --- spec/QueryExpression.selectJson.spec.js | 15 +++------------ src/SqliteFormatter.js | 1 + 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/spec/QueryExpression.selectJson.spec.js b/spec/QueryExpression.selectJson.spec.js index bcf4765..738a37f 100644 --- a/spec/QueryExpression.selectJson.spec.js +++ b/spec/QueryExpression.selectJson.spec.js @@ -379,16 +379,7 @@ describe('SqlFormatter', () => { products: { $jsonGroupArray: [ new QueryExpression().select( - new QueryField({ - $value: { - $concat: [ - new QueryField('name').from(Products), - ' (', - new QueryField('model').from(Products), - ')' - ] - } - }), + new QueryField('name').from(Products) ).from(Products).join(Orders).with( new QueryExpression().where( new QueryField('orderedItem').from(Orders) @@ -732,7 +723,7 @@ describe('SqlFormatter', () => { } }) ).from(People).where('email').equal(context.user.name); - const [item] = await context.db.executeAsync(query); + const [item] = await context.db.executeAsync(query, []); expect(item).toBeTruthy(); }); @@ -754,7 +745,7 @@ describe('SqlFormatter', () => { } }) ).from(People).where('email').equal(context.user.name); - const [item] = await context.db.executeAsync(query); + const [item] = await context.db.executeAsync(query, []); expect(item).toBeTruthy(); expect(Array.isArray(item.tags)).toBeTruthy(); expect(item.tags).toEqual([ 'user', 'customer', 'admin' ]); diff --git a/src/SqliteFormatter.js b/src/SqliteFormatter.js index 6d73e24..0938ab8 100644 --- a/src/SqliteFormatter.js +++ b/src/SqliteFormatter.js @@ -420,6 +420,7 @@ class SqliteFormatter extends SqlFormatter { if (!Array.isArray(select) || select.length === 0) { throw new Error('Invalid json group array expression. Expected an array of select fields'); } + // wrap the first select field with json_group_array function select[0] = { $value: { $jsonGroupArray: [ From 529f28a4e80bafc69a88a84922cfba413eeab315 Mon Sep 17 00:00:00 2001 From: Kyriakos Barbounakis Date: Mon, 24 Aug 2026 12:38:36 +0300 Subject: [PATCH 3/3] format query field-like expressions --- package-lock.json | 4 ++-- package.json | 2 +- src/SqliteFormatter.js | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 729e346..203dcf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@themost/sqlite", - "version": "3.11.0", + "version": "3.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@themost/sqlite", - "version": "3.11.0", + "version": "3.11.1", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { diff --git a/package.json b/package.json index 3f32ca7..1275f57 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@themost/sqlite", - "version": "3.11.0", + "version": "3.11.1", "description": "MOST Web Framework SQLite Adapter", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/SqliteFormatter.js b/src/SqliteFormatter.js index 0938ab8..856ce06 100644 --- a/src/SqliteFormatter.js +++ b/src/SqliteFormatter.js @@ -409,6 +409,10 @@ class SqliteFormatter extends SqlFormatter { if (expr instanceof QueryField) { return `json_group_array(${this.escape(expr)})`; } + // noinspection JSUnresolvedReference + if (expr && expr.$name) { + return `json_agg(${this.escape(expr)})`; + } if (expr && expr.$select) { // noinspection JSUnresolvedReference if (typeof this.$query !== 'function') {