diff --git a/package-lock.json b/package-lock.json
index 730f3a47d..e3f830953 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
"@nextcloud/notify_push": "^1.4.0",
"@nextcloud/password-confirmation": "^6.1.0",
"@nextcloud/router": "^3.2.0",
+ "@nextcloud/viewer": "^2.0.0-beta.19",
"@nextcloud/vue": "^9.13.1",
"@vueuse/components": "^15.0.0",
"@vueuse/core": "^15.0.0",
@@ -2306,7 +2307,6 @@
"cpu": [
"ppc64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2323,7 +2323,6 @@
"cpu": [
"arm"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2340,7 +2339,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2357,7 +2355,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2374,7 +2371,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2391,7 +2387,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2408,7 +2403,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2425,7 +2419,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2442,7 +2435,6 @@
"cpu": [
"arm"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2459,7 +2451,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2476,7 +2467,6 @@
"cpu": [
"ia32"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2493,7 +2483,6 @@
"cpu": [
"loong64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2510,7 +2499,6 @@
"cpu": [
"mips64el"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2527,7 +2515,6 @@
"cpu": [
"ppc64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2544,7 +2531,6 @@
"cpu": [
"riscv64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2561,7 +2547,6 @@
"cpu": [
"s390x"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2578,7 +2563,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2595,7 +2579,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2612,7 +2595,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2629,7 +2611,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2646,7 +2627,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2663,7 +2643,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2680,7 +2659,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2697,7 +2675,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2714,7 +2691,6 @@
"cpu": [
"ia32"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2731,7 +2707,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3264,6 +3239,19 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -4579,11 +4567,41 @@
"license": "MIT",
"peer": true
},
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.6.0.tgz",
+ "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit/context": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz",
+ "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^1.6.2 || ^2.1.0"
+ }
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz",
+ "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.5.0"
+ }
+ },
"node_modules/@mdi/js": {
"version": "7.4.47",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz",
"integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ=="
},
+ "node_modules/@mdi/svg": {
+ "version": "7.4.47",
+ "resolved": "https://registry.npmjs.org/@mdi/svg/-/svg-7.4.47.tgz",
+ "integrity": "sha512-WQ2gDll12T9WD34fdRFgQVgO8bag3gavrAgJ0frN4phlwdJARpE6gO1YvLEMJR0KKgoc+/Ea/A0Pp11I00xBvw==",
+ "license": "Apache-2.0"
+ },
"node_modules/@nextcloud/auth": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.6.0.tgz",
@@ -4797,6 +4815,24 @@
"node": "^24.0.0 || >=26.0.0"
}
},
+ "node_modules/@nextcloud/image-editor": {
+ "version": "1.0.0-beta.8",
+ "resolved": "https://registry.npmjs.org/@nextcloud/image-editor/-/image-editor-1.0.0-beta.8.tgz",
+ "integrity": "sha512-dIi1smQuk+wLgoYjvvWJh9lO8OQZPIkl8oV4fEfMyQ9F/vlUcqQM+qyDmKReMHWolfMer5w/sgn8QhBPpdseqQ==",
+ "license": "AGPL-3.0-or-later",
+ "dependencies": {
+ "@nextcloud/l10n": "^3.4.0",
+ "konva": "~10.3.2"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || ^24.0.0"
+ },
+ "peerDependencies": {
+ "@nextcloud/dialogs": "^7.0.0 || ^8.0.0",
+ "@nextcloud/vue": "^9.0.0",
+ "vue": "^3.5.0"
+ }
+ },
"node_modules/@nextcloud/initial-state": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-3.0.0.tgz",
@@ -4944,6 +4980,41 @@
"node": "^20.0.0 || ^22.0.0 || ^24.0.0"
}
},
+ "node_modules/@nextcloud/viewer": {
+ "version": "2.0.0-beta.20",
+ "resolved": "https://registry.npmjs.org/@nextcloud/viewer/-/viewer-2.0.0-beta.20.tgz",
+ "integrity": "sha512-+FjXfQ48ZvAZUY+L+fY/J+2gIqSRQmxjElMsEjOJzvp1sEI/Yd8jCjTgKjz4pIBgNBFbFhb7QR5+2S3g+vqGDw==",
+ "license": "AGPL-3.0-or-later",
+ "dependencies": {
+ "@mdi/svg": "^7.4.47",
+ "@nextcloud/auth": "^2.6.0",
+ "@nextcloud/image-editor": "^1.0.0-beta.6",
+ "@nextcloud/logger": "^3.0.3",
+ "@nextcloud/vue": "^9.13.0",
+ "@videojs/html": "^10.0.1",
+ "debounce": "^3.0.0",
+ "dompurify": "^3.4.14",
+ "opensheetmusicdisplay": "^2.1.3",
+ "vue": "^3.5.0",
+ "vue-material-design-icons": "^5.3.1",
+ "webdav": "^5.10.0"
+ },
+ "engines": {
+ "node": "^24.0.0 || >=26.0.0"
+ },
+ "peerDependencies": {
+ "@nextcloud/axios": "^2.5.2",
+ "@nextcloud/capabilities": "^1.2.1",
+ "@nextcloud/dialogs": "^7.5.0",
+ "@nextcloud/event-bus": "^3.3.3",
+ "@nextcloud/files": "^4.0.0",
+ "@nextcloud/initial-state": "^3.0.0",
+ "@nextcloud/l10n": "^3.4.1",
+ "@nextcloud/paths": "^3.1.0",
+ "@nextcloud/router": "^3.1.0",
+ "@nextcloud/sharing": "^0.4.0 || ^1.0.0-beta.2"
+ }
+ },
"node_modules/@nextcloud/vue": {
"version": "9.13.1",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.13.1.tgz",
@@ -5932,6 +6003,27 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/@svta/cml-error-codes": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@svta/cml-error-codes/-/cml-error-codes-0.1.2.tgz",
+ "integrity": "sha512-q1xL8W9JR0Yj7h2kAyRWqb7iT7UlOb/rXMDSVpY5EcXUR5w0zHfl22YG4+dYVqtV9XpoIxhp+nXSqZkTo3TSTg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "@svta/cml-utils": "^1.6.2"
+ }
+ },
+ "node_modules/@svta/cml-utils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@svta/cml-utils/-/cml-utils-1.7.0.tgz",
+ "integrity": "sha512-NNa9v5CxrmULRAu5zx1ENHVwF4xKfclEdm+OmaIZDwoTNLVpf7JGgwbxkYsbRQYPCZrQTTLlR4sVjwgS6gcmug==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=20"
+ }
+ },
"node_modules/@tokenizer/token": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
@@ -6324,6 +6416,12 @@
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
"license": "MIT"
},
+ "node_modules/@types/vexflow": {
+ "version": "1.2.42",
+ "resolved": "https://registry.npmjs.org/@types/vexflow/-/vexflow-1.2.42.tgz",
+ "integrity": "sha512-bj3If1sm1FYJN0tJMV2BJNrwoeQ6xfrTt+rbmFvUytyxUhklLlW79MR4uwQ+upzrNJLVy012TnC7oZqSpEglSw==",
+ "license": "MIT"
+ },
"node_modules/@types/web-bluetooth": {
"version": "0.0.21",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
@@ -6715,6 +6813,184 @@
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
},
+ "node_modules/@videojs/core": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/core/-/core-10.3.0.tgz",
+ "integrity": "sha512-JiH3Z8tjxAZdt5s+hSztgtTVMU2lI02in1cFdn2nm1n+LxbvWwwdjsRbUZSJsk1bURBNNiLctn9W7DK59JIdEQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@videojs/media": "10.3.0",
+ "@videojs/store": "10.3.0",
+ "@videojs/utils": "10.3.0",
+ "video.js": "10.3.0"
+ }
+ },
+ "node_modules/@videojs/element": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/element/-/element-10.3.0.tgz",
+ "integrity": "sha512-xDX521q/S37QEDXtGfTPtmqQQWAN1IDZ72h34AdEh0M2oThK1uvfthsOzVWnwxNoceRlpQ1cyyfRvZwwCf03mg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@lit/context": "^1.1.0",
+ "@videojs/utils": "10.3.0"
+ }
+ },
+ "node_modules/@videojs/html": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/html/-/html-10.3.0.tgz",
+ "integrity": "sha512-wfhbEaCJMSOU5bwNN2iYuXIb9Nq7QEpKVcBEq50S/OCv24lTk6DxVbfCAnZroJGFxopBs7Fykl5jMP8ZcdVlZA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@videojs/core": "10.3.0",
+ "@videojs/element": "10.3.0",
+ "@videojs/media": "10.3.0",
+ "@videojs/native-hls-video": "10.3.0",
+ "@videojs/spf": "10.3.0",
+ "@videojs/store": "10.3.0",
+ "@videojs/utils": "10.3.0"
+ },
+ "peerDependencies": {
+ "@videojs/cloudflare-video": "10.3.0",
+ "@videojs/dailymotion-video": "10.3.0",
+ "@videojs/dash-video": "10.3.0",
+ "@videojs/google-analytics": "10.3.0",
+ "@videojs/google-cast": "10.3.0",
+ "@videojs/hlsjs-video": "10.3.0",
+ "@videojs/mixcloud-audio": "10.3.0",
+ "@videojs/mux-audio": "10.3.0",
+ "@videojs/mux-data": "10.3.0",
+ "@videojs/mux-video": "10.3.0",
+ "@videojs/playerjs-video": "10.3.0",
+ "@videojs/shaka-video": "10.3.0",
+ "@videojs/soundcloud-audio": "10.3.0",
+ "@videojs/spotify-audio": "10.3.0",
+ "@videojs/tiktok-video": "10.3.0",
+ "@videojs/twitch-video": "10.3.0",
+ "@videojs/vimeo-video": "10.3.0",
+ "@videojs/wistia-video": "10.3.0",
+ "@videojs/youtube-video": "10.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@videojs/cloudflare-video": {
+ "optional": true
+ },
+ "@videojs/dailymotion-video": {
+ "optional": true
+ },
+ "@videojs/dash-video": {
+ "optional": true
+ },
+ "@videojs/google-analytics": {
+ "optional": true
+ },
+ "@videojs/google-cast": {
+ "optional": true
+ },
+ "@videojs/hlsjs-video": {
+ "optional": true
+ },
+ "@videojs/mixcloud-audio": {
+ "optional": true
+ },
+ "@videojs/mux-audio": {
+ "optional": true
+ },
+ "@videojs/mux-data": {
+ "optional": true
+ },
+ "@videojs/mux-video": {
+ "optional": true
+ },
+ "@videojs/playerjs-video": {
+ "optional": true
+ },
+ "@videojs/shaka-video": {
+ "optional": true
+ },
+ "@videojs/soundcloud-audio": {
+ "optional": true
+ },
+ "@videojs/spotify-audio": {
+ "optional": true
+ },
+ "@videojs/tiktok-video": {
+ "optional": true
+ },
+ "@videojs/twitch-video": {
+ "optional": true
+ },
+ "@videojs/vimeo-video": {
+ "optional": true
+ },
+ "@videojs/wistia-video": {
+ "optional": true
+ },
+ "@videojs/youtube-video": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@videojs/media": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/media/-/media-10.3.0.tgz",
+ "integrity": "sha512-xZ/33XPTLcQwIDW3b0GSASGYDzXwrqWZjlYdfn3dh/344/7G80wjwDkbgech8+LnL9yEAHGRQ9u+Wue4c/pQZw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@videojs/utils": "10.3.0"
+ }
+ },
+ "node_modules/@videojs/native-hls-video": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/native-hls-video/-/native-hls-video-10.3.0.tgz",
+ "integrity": "sha512-5UYFBXcnpSwxBfZ2WkTCH+ehftRHCTa301y3Ks+tCiKTT1LjrTlsrqwHqrLTuKVGhaHHDXTBP8FybmgHa1xxag==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@videojs/media": "10.3.0",
+ "@videojs/spf": "10.3.0",
+ "@videojs/utils": "10.3.0"
+ }
+ },
+ "node_modules/@videojs/spf": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/spf/-/spf-10.3.0.tgz",
+ "integrity": "sha512-/Rde9nglitWTl5JXGUEy+P1kDv+Dth216pnWJRGhDbliYYIX/YD+dQDLKummw6IAus1I+N+X2OODK3+0L18GFw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@svta/cml-error-codes": "^0.1.1",
+ "@svta/cml-utils": "^1.6.1",
+ "@videojs/media": "10.3.0",
+ "@videojs/utils": "10.3.0",
+ "signal-polyfill": "^0.2.2"
+ }
+ },
+ "node_modules/@videojs/store": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/store/-/store-10.3.0.tgz",
+ "integrity": "sha512-mcQuqXgFV9KoGDADHwUgsvqf6k1+5H65oz/g/+JCwen7RCBt0RQmLjTxQ5Q2n+V4OqnhF40mVlEWHN0gvhLjjw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@videojs/utils": "10.3.0",
+ "react-compiler-runtime": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@videojs/element": "10.3.0",
+ "react": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@videojs/element": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@videojs/utils": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@videojs/utils/-/utils-10.3.0.tgz",
+ "integrity": "sha512-BvkO1yfy/dhesnNAbFJ9yDcmFOvbQ7ZbBszJqwt73eJJVQFTdFtxpPiVQmxlolA9ifNJvHaLrh9TkUUyig3sZQ==",
+ "license": "Apache-2.0"
+ },
"node_modules/@vue-macros/common": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz",
@@ -8406,7 +8682,7 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -8451,6 +8727,16 @@
"tweetnacl": "^0.14.3"
}
},
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
"node_modules/birpc": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
@@ -8460,11 +8746,18 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/bit-twiddle": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz",
+ "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"buffer": "^5.5.0",
@@ -8476,7 +8769,7 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -9161,7 +9454,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true,
+ "devOptional": true,
"license": "ISC"
},
"node_modules/chroma-js": {
@@ -9820,7 +10113,6 @@
},
"node_modules/core-util-is": {
"version": "1.0.2",
- "dev": true,
"license": "MIT"
},
"node_modules/cosmiconfig": {
@@ -10529,6 +10821,22 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/dedent": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
@@ -10583,6 +10891,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/deep-is": {
"version": "0.1.3",
"dev": true,
@@ -10798,10 +11116,8 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "dev": true,
"license": "Apache-2.0",
"optional": true,
- "peer": true,
"engines": {
"node": ">=8"
}
@@ -11378,7 +11694,7 @@
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
+ "devOptional": true,
"dependencies": {
"once": "^1.4.0"
}
@@ -11427,7 +11743,7 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
+ "devOptional": true,
"engines": {
"node": ">=6"
}
@@ -12263,6 +12579,16 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "license": "(MIT OR WTFPL)",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/expect": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
@@ -12279,6 +12605,13 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
"node_modules/express": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
@@ -12552,6 +12885,13 @@
"flat-cache": "^6.1.23"
}
},
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/filing-cabinet": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.2.0.tgz",
@@ -12961,7 +13301,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/fs-extra": {
@@ -13144,13 +13484,39 @@
"url": "https://github.com/fisker/git-hooks-list?sponsor=1"
}
},
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/gl": {
+ "version": "9.0.0-rc.10",
+ "resolved": "https://registry.npmjs.org/gl/-/gl-9.0.0-rc.10.tgz",
+ "integrity": "sha512-G6lYaWoan0d2d8UO0UmaSS8zqyyZwYt6q2dFVJ2hD62sRWUwkMIH+Jp7gEoQesLlo28Nzelh+GIYz1qOUa5WmQ==",
+ "hasInstallScript": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "bit-twiddle": "^1.0.2",
+ "glsl-tokenizer": "^2.1.5",
+ "nan": "^2.26.2",
+ "node-gyp": "^12.2.0",
+ "prebuild-install": "^7.1.3"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
@@ -13297,6 +13663,16 @@
"license": "MIT",
"peer": true
},
+ "node_modules/glsl-tokenizer": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
+ "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "through2": "^0.6.3"
+ }
+ },
"node_modules/gonzales-pe": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
@@ -13795,7 +14171,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -13820,6 +14196,12 @@
"node": ">= 4"
}
},
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "license": "MIT"
+ },
"node_modules/immutable": {
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
@@ -13899,12 +14281,11 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ini": {
"version": "1.3.8",
- "dev": true,
+ "devOptional": true,
"license": "ISC"
},
"node_modules/inline-style-parser": {
@@ -14611,9 +14992,7 @@
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "peer": true
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"node_modules/isexe": {
"version": "2.0.0",
@@ -16645,6 +17024,42 @@
"verror": "1.10.0"
}
},
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "dependencies": {
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/jszip/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/jszip/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/keyv": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz",
@@ -16683,6 +17098,38 @@
"license": "MIT",
"peer": true
},
+ "node_modules/konva": {
+ "version": "10.3.3",
+ "resolved": "https://registry.npmjs.org/konva/-/konva-10.3.3.tgz",
+ "integrity": "sha512-j3Rrn504bYFwJ0zV0ZbSOQRsM9KMBLOpEq6xZuyIjbaKeFbBXwgiM5SA4IDq4nwM1l49GVKs66Mo+sl7+4G7PQ==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/lavrton"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/konva"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/lavrton"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "canvas": "^3.0.0",
+ "skia-canvas": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ },
+ "skia-canvas": {
+ "optional": true
+ }
+ }
+ },
"node_modules/launch-editor": {
"version": "2.14.2",
"resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.2.tgz",
@@ -16722,6 +17169,15 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
"node_modules/lines-and-columns": {
"version": "1.1.6",
"dev": true,
@@ -17177,6 +17633,19 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/loglevel": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
+ "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/loglevel"
+ }
+ },
"node_modules/long": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
@@ -18206,6 +18675,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -18237,7 +18719,7 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
+ "devOptional": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -18308,17 +18790,30 @@
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
"integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "dev": true,
+ "devOptional": true,
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/mlly": {
@@ -18434,7 +18929,6 @@
"version": "2.28.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz",
"integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==",
- "dev": true,
"license": "MIT",
"optional": true
},
@@ -18456,6 +18950,13 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/natural-compare": {
"version": "1.4.0",
"dev": true,
@@ -18492,6 +18993,19 @@
"resolved": "https://registry.npmjs.org/nested-property/-/nested-property-4.0.0.tgz",
"integrity": "sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA=="
},
+ "node_modules/node-abi": {
+ "version": "3.101.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.101.0.tgz",
+ "integrity": "sha512-bkb/RkuWCE64eWu1PCh3Fu2pGc9mKRs+kOE+FU2bGHRYlQa86/D321DSATV54AsCQMKz3/xSt9sRgraZTpqdhQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/node-addon-api": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
@@ -18540,6 +19054,83 @@
}
}
},
+ "node_modules/node-gyp": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz",
+ "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "nopt": "^9.0.0",
+ "proc-log": "^6.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.5.4",
+ "tinyglobby": "^0.2.12",
+ "undici": "^6.25.0",
+ "which": "^6.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/abbrev": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
+ "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/node-gyp/node_modules/nopt": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "abbrev": "^4.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "isexe": "^4.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -18781,7 +19372,7 @@
},
"node_modules/once": {
"version": "1.4.0",
- "dev": true,
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
@@ -18823,6 +19414,22 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/opensheetmusicdisplay": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/opensheetmusicdisplay/-/opensheetmusicdisplay-2.2.1.tgz",
+ "integrity": "sha512-2DqI2lQKKzDDoIe7yD8yNyWTofSdRbFZYTD3nGRzEo1XmTK2DJWcUXLRXZ2E5xzOt7Pd+RmSGL1quFQZRCqDMw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/vexflow": "^1.2.38",
+ "jszip": "3.10.1",
+ "loglevel": "^1.8.0",
+ "typescript-collections": "^1.3.3",
+ "vexflow": "1.2.93"
+ },
+ "optionalDependencies": {
+ "gl": "^9.0.0-rc.10"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
@@ -18940,9 +19547,7 @@
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
- "dev": true,
- "peer": true
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"node_modules/parent-module": {
"version": "1.0.1",
@@ -19711,6 +20316,34 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/precinct": {
"version": "12.2.0",
"resolved": "https://registry.npmjs.org/precinct/-/precinct-12.2.0.tgz",
@@ -19822,6 +20455,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/proc-log": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
+ "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
+ "license": "ISC",
+ "optional": true,
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
"node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -19834,9 +20477,7 @@
"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==",
- "dev": true,
- "peer": true
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/prompts": {
"version": "2.4.2",
@@ -19953,7 +20594,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
+ "devOptional": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
@@ -20172,6 +20813,41 @@
"node": ">= 0.10"
}
},
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "optional": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz",
+ "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-compiler-runtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-1.0.0.tgz",
+ "integrity": "sha512-rRfjYv66HlG8896yPUDONgKzG5BxZD1nV9U6rkm+7VCuvQc903C4MjcoZR4zPw53IKSOX9wMQVpA1IAbRtzQ7w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental"
+ }
+ },
"node_modules/react-is": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
@@ -20182,7 +20858,7 @@
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
+ "devOptional": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -20726,7 +21402,6 @@
},
"node_modules/safe-buffer": {
"version": "5.1.2",
- "dev": true,
"license": "MIT"
},
"node_modules/safer-buffer": {
@@ -21150,9 +21825,7 @@
"node_modules/setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true,
- "peer": true
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"node_modules/setprototypeof": {
"version": "1.2.0",
@@ -21341,6 +22014,12 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
+ "node_modules/signal-polyfill": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/signal-polyfill/-/signal-polyfill-0.2.2.tgz",
+ "integrity": "sha512-p63Y4Er5/eMQ9RHg0M0Y64NlsQKpiu6MDdhBXpyywRuWiPywhJTpKJ1iB5K2hJEbFZ0BnDS7ZkJ+0AfTuL37Rg==",
+ "license": "Apache-2.0"
+ },
"node_modules/simple-bin-help": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/simple-bin-help/-/simple-bin-help-1.8.0.tgz",
@@ -21351,6 +22030,53 @@
"node": ">=14.16"
}
},
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@@ -21711,7 +22437,7 @@
"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==",
- "dev": true,
+ "devOptional": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
@@ -21720,7 +22446,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -21854,7 +22580,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
+ "devOptional": true,
"engines": {
"node": ">=0.10.0"
}
@@ -22787,11 +23513,28 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/tar": {
+ "version": "7.5.22",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz",
+ "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==",
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tar-fs": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz",
"integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"chownr": "^1.1.1",
@@ -22804,7 +23547,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"bl": "^4.0.3",
@@ -22830,6 +23573,16 @@
"streamx": "^2.15.0"
}
},
+ "node_modules/tar/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/teex": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
@@ -22952,6 +23705,44 @@
"integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
"dev": true
},
+ "node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/through2/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@@ -23408,7 +24199,7 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
@@ -23550,6 +24341,12 @@
"node": ">=14.17"
}
},
+ "node_modules/typescript-collections": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/typescript-collections/-/typescript-collections-1.3.3.tgz",
+ "integrity": "sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ==",
+ "license": "MIT"
+ },
"node_modules/typescript-eslint": {
"version": "8.71.1",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.71.1.tgz",
@@ -23602,7 +24399,7 @@
"version": "6.29.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.29.1.tgz",
"integrity": "sha512-EvRlUt/QqAEvXdQeRMYUfwOQsfzpDztykrG2owGEE/rBOBoYv9uF39ZzsNDh4lTFHhTr2XOZjKkYgueD12ZmGA==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=18.17"
@@ -23942,7 +24739,6 @@
},
"node_modules/util-deprecate": {
"version": "1.0.2",
- "dev": true,
"license": "MIT"
},
"node_modules/v8-to-istanbul": {
@@ -23985,6 +24781,12 @@
"extsprintf": "^1.2.0"
}
},
+ "node_modules/vexflow": {
+ "version": "1.2.93",
+ "resolved": "https://registry.npmjs.org/vexflow/-/vexflow-1.2.93.tgz",
+ "integrity": "sha512-LwHQDCc257Lwju35BhyZuPYcVWu0hIUqEdM7j9+B+bq91bSelssnAG5JR8odTUtgGuwwvGwLhXw37wtmHNCS6Q==",
+ "license": "MIT"
+ },
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -24013,6 +24815,12 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/video.js": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/video.js/-/video.js-10.3.0.tgz",
+ "integrity": "sha512-IzlvcWxJ9ox1gHkYma9FsVdWf7jmWFpyFjvISJQW6wA7tsT7IcpxK8T1aFZebGCezyWxG2c5xTyuOzHIfwQPFQ==",
+ "license": "Apache-2.0"
+ },
"node_modules/vm-browserify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -24980,7 +25788,7 @@
},
"node_modules/wrappy": {
"version": "1.0.2",
- "dev": true,
+ "devOptional": true,
"license": "ISC"
},
"node_modules/write-file-atomic": {
@@ -25066,8 +25874,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "peer": true,
+ "devOptional": true,
"engines": {
"node": ">=0.4"
}
@@ -25081,6 +25888,16 @@
"node": ">=10"
}
},
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
diff --git a/package.json b/package.json
index aa7dbb901..5baf4ee22 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"@nextcloud/notify_push": "^1.4.0",
"@nextcloud/password-confirmation": "^6.1.0",
"@nextcloud/router": "^3.2.0",
+ "@nextcloud/viewer": "^2.0.0-beta.19",
"@nextcloud/vue": "^9.13.1",
"@vueuse/components": "^15.0.0",
"@vueuse/core": "^15.0.0",
diff --git a/src/components/card/AttachmentList.spec.js b/src/components/card/AttachmentList.spec.js
new file mode 100644
index 000000000..2f9fdd064
--- /dev/null
+++ b/src/components/card/AttachmentList.spec.js
@@ -0,0 +1,145 @@
+/**
+ * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import { afterEach, beforeEach, describe, expect, it, jest } from '@jest/globals'
+import { getClient, getRootPath, resultToNode } from '@nextcloud/files/dav'
+import { generateUrl } from '@nextcloud/router'
+import { canView, getViewer } from '@nextcloud/viewer'
+import AttachmentList from './AttachmentList.vue'
+import logger from '../../logger.js'
+
+jest.mock('@nextcloud/auth', () => ({ getCurrentUser: jest.fn() }), { virtual: true })
+jest.mock('@nextcloud/axios', () => ({}), { virtual: true })
+// The component calls the global `t` at import time, right after importing the dialogs
+jest.mock('@nextcloud/dialogs', () => {
+ global.t = (app, text) => text
+ return {
+ getFilePickerBuilder: () => {
+ const builder = {
+ setMultiSelect: () => builder,
+ setType: () => builder,
+ allowDirectories: () => builder,
+ build: () => ({}),
+ }
+ return builder
+ },
+ }
+}, { virtual: true })
+jest.mock('@nextcloud/files', () => ({ formatFileSize: jest.fn() }), { virtual: true })
+jest.mock('@nextcloud/files/dav', () => ({
+ getClient: jest.fn(),
+ getDefaultPropfind: jest.fn(() => ''),
+ getRootPath: jest.fn(() => '/files/alice'),
+ resultToNode: jest.fn(),
+}), { virtual: true })
+jest.mock('@nextcloud/initial-state', () => ({ loadState: jest.fn(() => -1) }), { virtual: true })
+jest.mock('@nextcloud/router', () => ({
+ generateOcsUrl: jest.fn(),
+ generateRemoteUrl: jest.fn(),
+ generateUrl: jest.fn((url) => `/index.php${url}`),
+}), { virtual: true })
+jest.mock('@nextcloud/viewer', () => ({ canView: jest.fn(), getViewer: jest.fn() }), { virtual: true })
+jest.mock('@nextcloud/vue', () => ({}), { virtual: true })
+jest.mock('pinia', () => ({ mapActions: () => ({}), mapState: () => ({}) }))
+jest.mock('../AttachmentDragAndDrop.vue', () => ({}))
+jest.mock('../../logger.js', () => ({ __esModule: true, default: { error: jest.fn() } }))
+jest.mock('../../mixins/attachmentUpload.js', () => ({}))
+jest.mock('../../mixins/relativeDate.js', () => ({}))
+jest.mock('../../stores/attachment.js', () => ({}))
+jest.mock('../../stores/board.js', () => ({}))
+jest.mock('../../stores/settings.js', () => ({}))
+
+const originalWindow = global.window
+const originalDocument = global.document
+
+let session
+let sidebar
+let stat
+
+const attachment = {
+ id: 3,
+ cardId: 20,
+ extendedData: { fileid: 42, path: '/Deck/photo.jpg', mimetype: 'image/jpeg' },
+}
+
+function context(cardDetailsInModal = false) {
+ return {
+ cardDetailsInModal,
+ fetchAttachmentNode(item) {
+ return AttachmentList.methods.fetchAttachmentNode.call(this, item)
+ },
+ }
+}
+
+beforeEach(() => {
+ jest.clearAllMocks()
+ global.window = { location: '' }
+ sidebar = { style: { display: '' } }
+ global.document = { querySelector: jest.fn(() => sidebar) }
+
+ session = new EventTarget()
+ getViewer.mockReturnValue({ open: jest.fn().mockResolvedValue(session) })
+ stat = jest.fn().mockResolvedValue({ data: { filename: '/files/alice/Deck/photo.jpg' } })
+ getClient.mockReturnValue({ stat })
+ resultToNode.mockImplementation(() => ({ fileid: 42, mime: 'image/jpeg' }))
+})
+
+afterEach(() => {
+ global.window = originalWindow
+ global.document = originalDocument
+})
+
+describe('opening attachments', () => {
+ it('opens a viewable file attachment in the viewer', async () => {
+ canView.mockReturnValue(true)
+
+ await AttachmentList.methods.showViewer.call(context(), attachment)
+
+ expect(getRootPath).toHaveBeenCalled()
+ expect(stat).toHaveBeenCalledWith('/files/alice/Deck/photo.jpg', { details: true, data: '' })
+ const node = resultToNode.mock.results[0].value
+ expect(canView).toHaveBeenCalledWith(node)
+ expect(getViewer().open).toHaveBeenCalledWith([node], node)
+ expect(global.window.location).toBe('')
+ })
+
+ it('hides the card sidebar while the viewer is open from the modal', async () => {
+ canView.mockReturnValue(true)
+
+ await AttachmentList.methods.showViewer.call(context(true), attachment)
+ expect(sidebar.style.display).toBe('none')
+
+ session.dispatchEvent(new Event('close'))
+ expect(sidebar.style.display).toBe('')
+ })
+
+ it('navigates to the file when the viewer cannot open it', async () => {
+ canView.mockReturnValue(false)
+
+ await AttachmentList.methods.showViewer.call(context(), attachment)
+
+ expect(getViewer().open).not.toHaveBeenCalled()
+ expect(generateUrl).toHaveBeenCalledWith('/f/42')
+ expect(global.window.location).toBe('/index.php/f/42')
+ })
+
+ it('navigates to the file when it cannot be loaded', async () => {
+ const error = new Error('Not found')
+ stat.mockRejectedValue(error)
+
+ await AttachmentList.methods.showViewer.call(context(), attachment)
+
+ expect(logger.error).toHaveBeenCalledWith(expect.any(String), { error })
+ expect(canView).not.toHaveBeenCalled()
+ expect(global.window.location).toBe('/index.php/f/42')
+ })
+
+ it('downloads attachments that are not files', async () => {
+ await AttachmentList.methods.showViewer.call(context(), { id: 3, cardId: 20, extendedData: {} })
+
+ expect(stat).not.toHaveBeenCalled()
+ expect(global.window.location).toBe('/index.php/apps/deck/cards/20/attachment/3')
+ })
+})
diff --git a/src/components/card/AttachmentList.vue b/src/components/card/AttachmentList.vue
index e0e8181f5..6809ac8fe 100644
--- a/src/components/card/AttachmentList.vue
+++ b/src/components/card/AttachmentList.vue
@@ -95,8 +95,10 @@ import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { getFilePickerBuilder } from '@nextcloud/dialogs'
import { formatFileSize } from '@nextcloud/files'
+import { getClient, getDefaultPropfind, getRootPath, resultToNode } from '@nextcloud/files/dav'
import { loadState } from '@nextcloud/initial-state'
import { generateOcsUrl, generateRemoteUrl, generateUrl } from '@nextcloud/router'
+import { canView, getViewer } from '@nextcloud/viewer'
import { NcActionButton, NcActionLink, NcActions, NcButton } from '@nextcloud/vue'
import { mapActions, mapState } from 'pinia'
import AttachmentDragAndDrop from '../AttachmentDragAndDrop.vue'
@@ -279,20 +281,37 @@ export default {
this.$refs.localAttachments.click()
},
- showViewer(attachment) {
- if (attachment.extendedData.fileid && window.OCA.Viewer.availableHandlers.map((handler) => handler.mimes).flat().includes(attachment.extendedData.mimetype)) {
- // Hide the sidebar if opening card in modal to avoid wrong sidebar position calculating in Viewer app
- const sidebar = document.querySelector('aside.app-sidebar')
- if (sidebar && this.cardDetailsInModal) {
- sidebar.style.display = 'none'
+ async fetchAttachmentNode(attachment) {
+ const result = await getClient().stat(getRootPath() + attachment.extendedData.path, {
+ details: true,
+ data: getDefaultPropfind(),
+ })
+ return resultToNode(result.data)
+ },
+
+ async showViewer(attachment) {
+ if (attachment.extendedData.fileid) {
+ let node = null
+ try {
+ node = await this.fetchAttachmentNode(attachment)
+ } catch (error) {
+ logger.error('Could not load the attachment file to open it in the viewer', { error })
}
- const onClose = () => {
- if (sidebar && sidebar.style.display === 'none') {
- sidebar.style.display = ''
+
+ if (node && canView(node)) {
+ // Hide the sidebar if opening card in modal to avoid wrong sidebar position calculating in Viewer app
+ const sidebar = document.querySelector('aside.app-sidebar')
+ if (sidebar && this.cardDetailsInModal) {
+ sidebar.style.display = 'none'
}
+ const session = await getViewer().open([node], node)
+ session.addEventListener('close', () => {
+ if (sidebar && sidebar.style.display === 'none') {
+ sidebar.style.display = ''
+ }
+ }, { once: true })
+ return
}
- window.OCA.Viewer.open({ path: attachment.extendedData.path, onClose })
- return
}
if (attachment.extendedData.fileid) {