From 76c0f798235288d6ddad7c14af0dce3cc6211e96 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 30 Sep 2026 20:05:07 +0200 Subject: [PATCH 1/2] feat: format queries with @matdata/sparql-formatter (SPARQL 1.2) Replace sparql-formatter with @matdata/sparql-formatter, which supports SPARQL 1.2 and keeps comments where they are (sparqling/sparql-formatter#30). The package is a drop-in replacement (same spfmt.format API) and ships its own types, so the local type declaration is removed. The stored formatter setting value stays "sparql-formatter"; only its label changes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01KSjgmmKydVPHYWjYDZgvQP --- .changeset/sparql-1-2-formatter.md | 8 + docs/user-guide.md | 2 +- package-lock.json | 258 +++-------------------- packages/yasgui/src/TabSettingsModal.ts | 2 +- packages/yasqe/package.json | 4 +- packages/yasqe/src/index.ts | 2 +- packages/yasqe/src/sparql-formatter.d.ts | 10 - test/run.ts | 23 ++ 8 files changed, 60 insertions(+), 249 deletions(-) create mode 100644 .changeset/sparql-1-2-formatter.md delete mode 100644 packages/yasqe/src/sparql-formatter.d.ts diff --git a/.changeset/sparql-1-2-formatter.md b/.changeset/sparql-1-2-formatter.md new file mode 100644 index 00000000..68c5ffca --- /dev/null +++ b/.changeset/sparql-1-2-formatter.md @@ -0,0 +1,8 @@ +--- +"@matdata/yasqe": minor +"@matdata/yasgui": patch +--- + +Format queries with [@matdata/sparql-formatter](https://github.com/Matdata-eu/sparql-formatter) instead of `sparql-formatter`. The new formatter supports SPARQL 1.2 (`VERSION`, triple terms `<<( ... )>>`, reified triples `<< ... ~ r >>`, reifiers and annotations `{| ... |}`, base direction and the new functions), so SPARQL 1.2 queries are now formatted instead of falling back to the legacy formatter. Comments keep their position when a query is formatted, including comments inside empty groups such as `GRAPH ?g { # comment }` ([sparqling/sparql-formatter#30](https://github.com/sparqling/sparql-formatter/issues/30)). + +The formatter setting keeps its stored value (`sparql-formatter`), so saved settings are unchanged; the option is now labelled "SPARQL 1.2 Formatter". diff --git a/docs/user-guide.md b/docs/user-guide.md index a81bbdf5..67cabdaa 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -418,7 +418,7 @@ Keep your SPARQL queries clean and readable with automatic formatting. - Format button in the editor toolbar - Keyboard shortcut: `Shift+Ctrl+F` - Choice of formatting engines: - - **sparql-formatter** (default): Standards-compliant, modern formatter + - **SPARQL 1.2 Formatter** (default): [@matdata/sparql-formatter](https://github.com/Matdata-eu/sparql-formatter), supports SPARQL 1.2 (triple terms, reifiers, annotations, `VERSION`, ...) and keeps comments where you put them - **Legacy formatter**: Original MatGUI formatter - Auto-format on query execution (configurable in Settings) diff --git a/package-lock.json b/package-lock.json index 0e073b0b..a76a1d75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1583,6 +1583,18 @@ "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", "license": "MIT" }, + "node_modules/@matdata/sparql-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@matdata/sparql-formatter/-/sparql-formatter-1.0.0.tgz", + "integrity": "sha512-fmZeNleIXeeQjhBkf61AnlwOTyvdGrnAPG2JKXi0Q5cUjr5xDyHPxjh/XW57zq6wXD4lEwJ/+qOtsShnj/LHFw==", + "license": "MIT", + "bin": { + "sparql-formatter": "dist/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@matdata/yasgui": { "resolved": "packages/yasgui", "link": true @@ -3833,12 +3845,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -3905,29 +3911,6 @@ "node": ">= 8" } }, - "node_modules/csv-write-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/csv-write-stream/-/csv-write-stream-2.0.0.tgz", - "integrity": "sha512-QTraH6FOYfM5f+YGwx71hW1nR9ZjlWri67/D4CWtiBkdce0UAa91Vc0yyHg0CjC0NeEGnvO/tBSJkA1XF9D9GQ==", - "license": "BSD-2-Clause", - "dependencies": { - "argparse": "^1.0.7", - "generate-object-property": "^1.0.0", - "ndjson": "^1.3.0" - }, - "bin": { - "csv-write": "cli.js" - } - }, - "node_modules/csv-write-stream/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -5005,15 +4988,6 @@ "node": ">=6" } }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5476,12 +5450,6 @@ "node": ">=8" } }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT" - }, "node_modules/is-subdir": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", @@ -5517,12 +5485,6 @@ "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5594,12 +5556,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -5845,55 +5801,6 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, - "node_modules/ls": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ls/-/ls-0.2.1.tgz", - "integrity": "sha512-UUnUysxEmzVNvn17J8t1EDUdTfP/o6+ASrI9D7PFTqNBZPJwP7sZ95Qzx9KTo4TkaGuGVanXemtF0F6Jv6+Ffw==", - "license": "Public Domain", - "dependencies": { - "glob": "7.0.5" - } - }, - "node_modules/ls/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/ls/node_modules/glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha512-56P1ofdOmXz0iTJ0AmrTK6CoR3Gf49Vo3SPaX85trAEhSIVsVc9oEQIkPWhcLZ/G4DZNg4wlXxG9JCz0LbaLjA==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ls/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6177,30 +6084,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, - "node_modules/ndjson": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", - "integrity": "sha512-hUPLuaziboGjNF7wHngkgVc0FOclR8dDk/HfEvTtDr/iUrqBWiRcRSTK3/nLOqKH33th714BrMmTPtObI9gZxQ==", - "license": "BSD-3-Clause", - "dependencies": { - "json-stringify-safe": "^5.0.1", - "minimist": "^1.2.0", - "split2": "^2.1.0", - "through2": "^2.0.3" - }, - "bin": { - "ndjson": "cli.js" - } - }, - "node_modules/ndjson/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -6634,12 +6517,6 @@ "node": ">= 0.6.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -7738,30 +7615,6 @@ "node": ">=0.10.0" } }, - "node_modules/sparql-formatter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sparql-formatter/-/sparql-formatter-1.0.2.tgz", - "integrity": "sha512-fQfPg2FUz9akEA/EzNGEEskQfnKVVWA36Ex/FXelKG6o4OFrzRggz3/Qp1QSvR2vgfPd5eOWXAyhv2H2o2PemQ==", - "license": "MIT", - "dependencies": { - "commander": "^8.0.0", - "csv-write-stream": "^2.0.0", - "ls": "^0.2.1" - }, - "bin": { - "sparql-formatter": "bin/sparql-formatter.js", - "sparql-formatter-test": "bin/sparql-formatter-test.js" - } - }, - "node_modules/sparql-formatter/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/spawndamnit": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", @@ -7782,19 +7635,11 @@ "node": ">=6" } }, - "node_modules/split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "license": "ISC", - "dependencies": { - "through2": "^2.0.2" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/store": { @@ -7827,15 +7672,6 @@ "node": ">=4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -7922,6 +7758,15 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8087,46 +7932,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8289,12 +8094,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -9073,15 +8872,6 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -9287,11 +9077,11 @@ "@codemirror/state": "^6.7.2", "@codemirror/view": "^6.43.10", "@lezer/highlight": "^1.2.3", + "@matdata/sparql-formatter": "^1.0.0", "@matdata/yasgui-utils": "^4.6.1", "leaflet": "^1.9.4", "lodash-es": "^4.17.15", - "query-string": "^6.10.1", - "sparql-formatter": "^1.0.2" + "query-string": "^6.10.1" }, "devDependencies": { "@types/leaflet": "^1.9.21", diff --git a/packages/yasgui/src/TabSettingsModal.ts b/packages/yasgui/src/TabSettingsModal.ts index bd1fa79a..77bb73b8 100644 --- a/packages/yasgui/src/TabSettingsModal.ts +++ b/packages/yasgui/src/TabSettingsModal.ts @@ -602,7 +602,7 @@ export default class TabSettingsModal { const sparqlFormatterOption = document.createElement("option"); sparqlFormatterOption.value = "sparql-formatter"; - sparqlFormatterOption.textContent = "SPARQL Formatter (external library)"; + sparqlFormatterOption.textContent = "SPARQL 1.2 Formatter"; formatterSelect.appendChild(sparqlFormatterOption); const legacyOption = document.createElement("option"); diff --git a/packages/yasqe/package.json b/packages/yasqe/package.json index 92061dec..cd79d515 100644 --- a/packages/yasqe/package.json +++ b/packages/yasqe/package.json @@ -45,11 +45,11 @@ "@codemirror/state": "^6.7.2", "@codemirror/view": "^6.43.10", "@lezer/highlight": "^1.2.3", + "@matdata/sparql-formatter": "^1.0.0", "@matdata/yasgui-utils": "^4.6.1", "leaflet": "^1.9.4", "lodash-es": "^4.17.15", - "query-string": "^6.10.1", - "sparql-formatter": "^1.0.2" + "query-string": "^6.10.1" }, "devDependencies": { "@types/leaflet": "^1.9.21", diff --git a/packages/yasqe/src/index.ts b/packages/yasqe/src/index.ts index 8bf71602..6c53a367 100644 --- a/packages/yasqe/src/index.ts +++ b/packages/yasqe/src/index.ts @@ -22,7 +22,7 @@ import type { ExtraKeys } from "./editor/keymap"; import type { HintFn, HintList } from "./editor/autocompletion"; import { isCompletionActive, openCompletion, hideCompletion } from "./editor/autocompletion"; import { YasqeAjaxConfig } from "./sparql"; -import { spfmt } from "sparql-formatter"; +import { spfmt } from "@matdata/sparql-formatter"; import * as L from "leaflet"; import { coordinatesToWkt, wrapWktLiteral, WktCoordinate, WktGeometryType } from "./mapWidget"; diff --git a/packages/yasqe/src/sparql-formatter.d.ts b/packages/yasqe/src/sparql-formatter.d.ts deleted file mode 100644 index 6dfeae78..00000000 --- a/packages/yasqe/src/sparql-formatter.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module "sparql-formatter" { - export interface SpfmtFormatter { - format: (sparql: string, formattingMode?: string, indentDepth?: number) => string; - parseSparql: (sparql: string) => unknown; - parseSparqlAsCompact: (sparql: string) => unknown; - formatAst: (ast: unknown, indentDepth?: number) => string; - } - - export const spfmt: SpfmtFormatter; -} diff --git a/test/run.ts b/test/run.ts index 2656fd1a..685b771a 100644 --- a/test/run.ts +++ b/test/run.ts @@ -177,6 +177,29 @@ SELECT * WHERE { expect(value.split("\n").length).to.be.greaterThan(3); }); + it("Should format SPARQL 1.2 and keep comments in place", async function () { + const value = await page.evaluate(() => { + if (window.yasqe.persistentConfig) window.yasqe.persistentConfig.formatterType = "sparql-formatter"; + window.yasqe.setValue( + `SELECT * WHERE { :a :b :c ~:r {| :source ?src |} . << :s :p :o >> :q ?x . GRAPH ?g {\n# inside the graph\n} }`, + ); + window.yasqe.formatQuery(); + return window.yasqe.getValue(); + }); + expect(value).to.equal( + [ + "SELECT *", + "WHERE {", + " :a :b :c ~ :r {| :source ?src |} .", + " << :s :p :o >> :q ?x .", + " GRAPH ?g {", + " # inside the graph", + " }", + "}", + ].join("\n"), + ); + }); + it("Should format with legacy formatter when selected", async function () { const value = await page.evaluate(() => { // Set formatter type to legacy From f1f0ccbf85668c99c5f6b39f6464e9cbe7aa9436 Mon Sep 17 00:00:00 2001 From: Mathias Vanden Auweele Date: Wed, 30 Sep 2026 21:33:51 +0200 Subject: [PATCH 2/2] chore: update to sparql-formatter v1.1.0 --- package-lock.json | 26 +++++++++++++------------- packages/yasqe/package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index a76a1d75..fccdb8ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1584,9 +1584,9 @@ "license": "MIT" }, "node_modules/@matdata/sparql-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@matdata/sparql-formatter/-/sparql-formatter-1.0.0.tgz", - "integrity": "sha512-fmZeNleIXeeQjhBkf61AnlwOTyvdGrnAPG2JKXi0Q5cUjr5xDyHPxjh/XW57zq6wXD4lEwJ/+qOtsShnj/LHFw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@matdata/sparql-formatter/-/sparql-formatter-1.1.0.tgz", + "integrity": "sha512-0sQnAbpZTS4hatmamUsNFM2AUxKTFnXiiBcYo+ULyFx5c/j+vbBOWfPJDIPG4j+/Sh+EQn5afqk6yxU1RgDX+A==", "license": "MIT", "bin": { "sparql-formatter": "dist/cli.js" @@ -7672,6 +7672,15 @@ "node": ">=4" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -7758,15 +7767,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9077,7 +9077,7 @@ "@codemirror/state": "^6.7.2", "@codemirror/view": "^6.43.10", "@lezer/highlight": "^1.2.3", - "@matdata/sparql-formatter": "^1.0.0", + "@matdata/sparql-formatter": "^1.1.0", "@matdata/yasgui-utils": "^4.6.1", "leaflet": "^1.9.4", "lodash-es": "^4.17.15", diff --git a/packages/yasqe/package.json b/packages/yasqe/package.json index cd79d515..015cb895 100644 --- a/packages/yasqe/package.json +++ b/packages/yasqe/package.json @@ -45,7 +45,7 @@ "@codemirror/state": "^6.7.2", "@codemirror/view": "^6.43.10", "@lezer/highlight": "^1.2.3", - "@matdata/sparql-formatter": "^1.0.0", + "@matdata/sparql-formatter": "^1.1.0", "@matdata/yasgui-utils": "^4.6.1", "leaflet": "^1.9.4", "lodash-es": "^4.17.15",