diff --git a/package-lock.json b/package-lock.json index ade38fa2e73..a2fa34bf0ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,6 +72,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, "node_modules/@asamuzakjp/css-color": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", @@ -5780,6 +5798,545 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jimp/bmp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", + "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", + "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/core/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/@jimp/core/node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/@jimp/core/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", + "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.13" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", + "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", + "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "jpeg-js": "^0.4.2" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", + "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", + "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", + "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", + "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", + "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", + "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", + "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", + "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", + "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", + "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", + "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", + "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", + "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", + "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", + "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", + "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", + "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", + "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", + "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", + "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", + "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", + "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.13", + "@jimp/plugin-blur": "^0.16.13", + "@jimp/plugin-circle": "^0.16.13", + "@jimp/plugin-color": "^0.16.13", + "@jimp/plugin-contain": "^0.16.13", + "@jimp/plugin-cover": "^0.16.13", + "@jimp/plugin-crop": "^0.16.13", + "@jimp/plugin-displace": "^0.16.13", + "@jimp/plugin-dither": "^0.16.13", + "@jimp/plugin-fisheye": "^0.16.13", + "@jimp/plugin-flip": "^0.16.13", + "@jimp/plugin-gaussian": "^0.16.13", + "@jimp/plugin-invert": "^0.16.13", + "@jimp/plugin-mask": "^0.16.13", + "@jimp/plugin-normalize": "^0.16.13", + "@jimp/plugin-print": "^0.16.13", + "@jimp/plugin-resize": "^0.16.13", + "@jimp/plugin-rotate": "^0.16.13", + "@jimp/plugin-scale": "^0.16.13", + "@jimp/plugin-shadow": "^0.16.13", + "@jimp/plugin-threshold": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", + "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", + "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", + "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.13", + "@jimp/gif": "^0.16.13", + "@jimp/jpeg": "^0.16.13", + "@jimp/png": "^0.16.13", + "@jimp/tiff": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", + "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, "node_modules/@jitsi/sdp-interop": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/@jitsi/sdp-interop/-/sdp-interop-0.1.14.tgz", @@ -5802,6 +6359,7 @@ "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", @@ -5812,6 +6370,7 @@ "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -5844,6 +6403,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -5853,6 +6413,7 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -5863,6 +6424,7 @@ "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -5873,6 +6435,7 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -7729,6 +8292,176 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -11706,6 +12439,29 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@tapjs/processinfo": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", @@ -11936,26 +12692,6 @@ "node": ">=10" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -12055,6 +12791,13 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true, + "license": "MIT" + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -12230,6 +12973,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, "license": "MIT" }, "node_modules/@types/async": { @@ -12358,6 +13102,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -12368,6 +13113,7 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -12378,6 +13124,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, "license": "MIT" }, "node_modules/@types/express": { @@ -12739,7 +13486,7 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -12755,6 +13502,13 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", @@ -12849,8 +13603,8 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", @@ -13375,6 +14129,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", @@ -13385,24 +14140,28 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", @@ -13414,12 +14173,14 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13432,6 +14193,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -13441,6 +14203,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -13450,12 +14213,14 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13472,6 +14237,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13485,6 +14251,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13497,6 +14264,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13511,6 +14279,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", @@ -13589,12 +14358,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/abab": { @@ -13615,6 +14386,19 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -13643,6 +14427,7 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -13689,6 +14474,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -13762,6 +14548,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -13778,6 +14565,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -13795,6 +14583,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -13876,6 +14665,13 @@ "dev": true, "license": "MIT" }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "dev": true, + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -14168,6 +14964,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -14537,6 +15334,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -15273,6 +16080,13 @@ "dev": true, "license": "MIT" }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -16119,6 +16933,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/centra": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz", + "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6" + } + }, "node_modules/chai": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", @@ -16288,6 +17112,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -16677,6 +17502,16 @@ "dev": true, "license": "ISC" }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -17422,6 +18257,16 @@ "node": ">=8" } }, + "node_modules/css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/css-loader": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", @@ -18275,6 +19120,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -18419,6 +19265,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, "license": "MIT" }, "node_modules/dom-converter": { @@ -18692,6 +19539,22 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -18757,6 +19620,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -20039,6 +20903,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -20085,6 +20950,16 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -20141,6 +21016,12 @@ "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", "license": "BSD-3-Clause" }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==", + "dev": true + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -20514,6 +21395,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, "funding": [ { "type": "github", @@ -20752,6 +21634,39 @@ "node": ">=6" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -22032,6 +22947,13 @@ "node": ">=6" } }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -22331,6 +23253,17 @@ "node": ">= 4.0.0" } }, + "node_modules/gifwrap": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", + "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, "node_modules/git-log-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", @@ -22488,6 +23421,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/global": { @@ -22681,20 +23615,6 @@ "dev": true, "license": "MIT" }, - "node_modules/graphql": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", - "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", - "deprecated": "No longer supported; please update to a newer version. Details: https://github.com/graphql/graphql-js#version-support", - "license": "MIT", - "peer": true, - "dependencies": { - "iterall": "^1.2.2" - }, - "engines": { - "node": ">= 6.x" - } - }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", @@ -23522,6 +24442,13 @@ "postcss": "^8.1.0" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -23595,6 +24522,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "dev": true, + "license": "MIT" + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -24538,6 +25482,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -24679,6 +25630,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -25197,13 +26158,6 @@ "node": ">= 4" } }, - "node_modules/iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", - "license": "MIT", - "peer": true - }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -25238,6 +26192,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, "node_modules/java-properties": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", @@ -26893,6 +27872,27 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jimp": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", + "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.1", + "@jimp/plugins": "^0.16.1", + "@jimp/types": "^0.16.1", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/js-base64": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", @@ -27127,6 +28127,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify": { @@ -27207,6 +28208,16 @@ ], "license": "MIT" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -27725,6 +28736,50 @@ "uc.micro": "^1.0.1" } }, + "node_modules/load-bmfont": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz", + "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^3.7.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/load-bmfont/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-bmfont/node_modules/phin": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz", + "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "centra": "^2.7.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -27779,6 +28834,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -28086,6 +29142,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -28934,6 +29991,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -30009,40 +31067,6 @@ "node": ">=0.10.0" } }, - "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", - "license": "MIT", - "peer": true, - "dependencies": { - "dompurify": "3.2.7", - "marked": "14.0.0" - } - }, - "node_modules/monaco-editor/node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true, - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/monaco-editor/node_modules/marked": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", - "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", - "license": "MIT", - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -30118,6 +31142,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, "license": "MIT" }, "node_modules/nerf-dart": { @@ -34342,6 +35367,45 @@ "node": ">=6" } }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/parse-bmfont-xml/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/parse-color": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", @@ -34592,6 +35656,20 @@ "dev": true, "license": "MIT" }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -34604,6 +35682,14 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "license": "MIT" }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -34662,6 +35748,19 @@ "node": ">= 6" } }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, "node_modules/pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", @@ -35282,6 +36381,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -35297,6 +36409,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", @@ -35311,6 +36424,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -35923,6 +37037,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -35931,20 +37046,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, "node_modules/react-draggable": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.2.tgz", @@ -36015,24 +37116,6 @@ } } }, - "node_modules/react-intl-redux": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-intl-redux/-/react-intl-redux-2.4.1.tgz", - "integrity": "sha512-EYTNmHJTnTam4phQj1nTdJvcdVjz+F56nLl6JtpqWsKzG5ZnQh/hoqLLJUjP0dgeNKSESIcjhYsTyBWDUwjo0A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.9", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@babel/runtime": "^7.17.9", - "prop-types": "^15.8.1", - "react": "^16.12.0 || ^17.0.2 || ^18.0.0", - "react-intl": "^2.2.2 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "react-redux": "^5.0.1 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/react-intl/node_modules/@formatjs/ecma402-abstract": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", @@ -36087,6 +37170,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, "license": "MIT" }, "node_modules/react-lifecycles-compat": { @@ -36632,6 +37716,40 @@ "node": ">= 6" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", + "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -36682,16 +37800,6 @@ "esprima": "~4.0.0" } }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, "node_modules/redux-mock-store": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.5.tgz", @@ -37102,6 +38210,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -37365,6 +38474,22 @@ "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.53" } }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/rrweb-cssom": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", @@ -37542,6 +38667,7 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -37551,6 +38677,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -38792,6 +39919,13 @@ "npm": ">= 3.0.0" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, "node_modules/socket.io-client": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", @@ -38959,6 +40093,14 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, "node_modules/spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", @@ -39644,6 +40786,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -39680,6 +40847,16 @@ "node": ">=8" } }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", @@ -39768,6 +40945,24 @@ ], "license": "MIT" }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", @@ -41043,6 +42238,7 @@ "version": "5.44.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -41061,6 +42257,7 @@ "version": "5.3.16", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -41095,6 +42292,7 @@ "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -41105,6 +42303,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -41119,6 +42318,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -41128,6 +42328,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -41143,12 +42344,14 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, "license": "MIT" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -41243,6 +42446,13 @@ "node": ">=0.10.0" } }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==", + "dev": true, + "license": "MIT" + }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", @@ -41256,6 +42466,13 @@ "dev": true, "license": "MIT" }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyexec": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", @@ -41426,6 +42643,24 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -42410,7 +43645,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -42818,6 +44053,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -43087,6 +44333,16 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^1.0.5" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -43471,6 +44727,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -43520,6 +44777,7 @@ "version": "5.104.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -43788,6 +45046,34 @@ "node": ">=6" } }, + "node_modules/webpack-pwa-manifest": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/webpack-pwa-manifest/-/webpack-pwa-manifest-4.3.0.tgz", + "integrity": "sha512-3hK8Qg58SyLCUIz4PBYnfUPM6iJ5K88h8Uhc3MxmlJcVtDF/11aBBdUTdQkqc9bo6Cb8Q1v2xdsB2XO6pzTbiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "1.0.1", + "jimp": "0.16.1", + "mime": "2.4.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/webpack-pwa-manifest/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -43809,6 +45095,7 @@ "version": "5.18.4", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -43822,12 +45109,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, "license": "MIT" }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -43841,6 +45130,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -43850,6 +45140,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -43863,6 +45154,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -44140,6 +45432,345 @@ "dev": true, "license": "MIT" }, + "node_modules/workbox-background-sync": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.4.0.tgz", + "integrity": "sha512-8CB9OxKAgKZKyNMwfGZ1XESx89GryWTfI+V5yEj8sHjFH8MFelUwYXEyldEK6M6oKMmn807GoJFUEA1sC4XS9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.4.0.tgz", + "integrity": "sha512-+eZQwoktlvo62cI0b+QBr40v5XjighxPq3Fzo9AWMiAosmpG5gxRHgTbGGhaJv/q/MFVxwFNGh/UwHZ/8K88lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-build": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.4.0.tgz", + "integrity": "sha512-Ntk1pWb0caOFIvwz/hfgrov/OJ45wPEhI5PbTywQcYjyZiVhT3UrwwUPl6TRYbTm4moaFYithYnl1lvZ8UjxcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^11.0.1", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.79.2", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.4.0", + "workbox-broadcast-update": "7.4.0", + "workbox-cacheable-response": "7.4.0", + "workbox-core": "7.4.0", + "workbox-expiration": "7.4.0", + "workbox-google-analytics": "7.4.0", + "workbox-navigation-preload": "7.4.0", + "workbox-precaching": "7.4.0", + "workbox-range-requests": "7.4.0", + "workbox-recipes": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0", + "workbox-streams": "7.4.0", + "workbox-sw": "7.4.0", + "workbox-window": "7.4.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/workbox-build/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/workbox-build/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.4.0.tgz", + "integrity": "sha512-0Fb8795zg/x23ISFkAc7lbWes6vbw34DGFIMw31cwuHPgDEC/5EYm6m/ZkylLX0EnEbbOyOCLjKgFS/Z5g0HeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-core": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.0.tgz", + "integrity": "sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.4.0.tgz", + "integrity": "sha512-V50p4BxYhtA80eOvulu8xVfPBgZbkxJ1Jr8UUn0rvqjGhLDqKNtfrDfjJKnLz2U8fO2xGQJTx/SKXNTzHOjnHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.4.0.tgz", + "integrity": "sha512-MVPXQslRF6YHkzGoFw1A4GIB8GrKym/A5+jYDUSL+AeJw4ytQGrozYdiZqUW1TPQHW8isBCBtyFJergUXyNoWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-background-sync": "7.4.0", + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.4.0.tgz", + "integrity": "sha512-etzftSgdQfjMcfPgbfaZCfM2QuR1P+4o8uCA2s4rf3chtKTq/Om7g/qvEOcZkG6v7JZOSOxVYQiOu6PbAZgU6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.4.0.tgz", + "integrity": "sha512-VQs37T6jDqf1rTxUJZXRl3yjZMf5JX/vDPhmx2CPgDDKXATzEoqyRqhYnRoxl6Kr0rqaQlp32i9rtG5zTzIlNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.4.0.tgz", + "integrity": "sha512-3Vq854ZNuP6Y0KZOQWLaLC9FfM7ZaE+iuQl4VhADXybwzr4z/sMmnLgTeUZLq5PaDlcJBxYXQ3U91V7dwAIfvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.4.0.tgz", + "integrity": "sha512-kOkWvsAn4H8GvAkwfJTbwINdv4voFoiE9hbezgB1sb/0NLyTG4rE7l6LvS8lLk5QIRIto+DjXLuAuG3Vmt3cxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "7.4.0", + "workbox-core": "7.4.0", + "workbox-expiration": "7.4.0", + "workbox-precaching": "7.4.0", + "workbox-routing": "7.4.0", + "workbox-strategies": "7.4.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.4.0.tgz", + "integrity": "sha512-C/ooj5uBWYAhAqwmU8HYQJdOjjDKBp9MzTQ+otpMmd+q0eF59K+NuXUek34wbL0RFrIXe/KKT+tUWcZcBqxbHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.4.0.tgz", + "integrity": "sha512-T4hVqIi5A4mHi92+5EppMX3cLaVywDp8nsyUgJhOZxcfSV/eQofcOA6/EMo5rnTNmNTpw0rUgjAI6LaVullPpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.4.0.tgz", + "integrity": "sha512-QHPBQrey7hQbnTs5GrEVoWz7RhHJXnPT+12qqWM378orDMo5VMJLCkCM1cnCk+8Eq92lccx/VgRZ7WAzZWbSLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.4.0", + "workbox-routing": "7.4.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.4.0.tgz", + "integrity": "sha512-ltU+Kr3qWR6BtbdlMnCjobZKzeV1hN+S6UvDywBrwM19TTyqA03X66dzw1tEIdJvQ4lYKkBFox6IAEhoSEZ8Xw==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-7.4.0.tgz", + "integrity": "sha512-NRgx4lYe4JP5I8qqiROmngbc38WyyN3BZh48lUir2XYJ63EuHWN0KpDxgcYQ/fJtQQIBoswwUPmpqwQmaupnxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "7.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.91.0" + } + }, + "node_modules/workbox-window": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.0.tgz", + "integrity": "sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.4.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -44274,6 +45905,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==", + "dev": true, + "license": "MIT" + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -44630,6 +46268,7 @@ "jest-junit": "7.0.0", "mkdirp": "1.0.4", "opal-loader": "^0.0.1", + "process": "^0.11.10", "raf": "3.4.1", "react-test-renderer": "18.3.1", "redux-mock-store": "1.5.5", @@ -44647,6 +46286,8 @@ "webpack": "5.104.1", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", + "webpack-pwa-manifest": "^4.3.0", + "workbox-webpack-plugin": "^7.4.0", "yauzl": "^3.2.0" }, "peerDependencies": { diff --git a/packages/scratch-gui/package.json b/packages/scratch-gui/package.json index a55aaf962d5..9f5cdfc0217 100644 --- a/packages/scratch-gui/package.json +++ b/packages/scratch-gui/package.json @@ -169,6 +169,7 @@ "jest-junit": "7.0.0", "mkdirp": "1.0.4", "opal-loader": "^0.0.1", + "process": "^0.11.10", "raf": "3.4.1", "react-test-renderer": "18.3.1", "redux-mock-store": "1.5.5", @@ -186,6 +187,8 @@ "webpack": "5.104.1", "webpack-cli": "5.1.4", "webpack-dev-server": "5.2.3", + "webpack-pwa-manifest": "^4.3.0", + "workbox-webpack-plugin": "^7.4.0", "yauzl": "^3.2.0" }, "jest": { diff --git a/packages/scratch-gui/src/components/coming-soon/aww-cat.png b/packages/scratch-gui/src/components/coming-soon/aww-cat.png deleted file mode 100644 index bddfb8de9ee..00000000000 Binary files a/packages/scratch-gui/src/components/coming-soon/aww-cat.png and /dev/null differ diff --git a/packages/scratch-gui/src/components/coming-soon/coming-soon.jsx b/packages/scratch-gui/src/components/coming-soon/coming-soon.jsx index 6865a79c91c..9b5332be01e 100644 --- a/packages/scratch-gui/src/components/coming-soon/coming-soon.jsx +++ b/packages/scratch-gui/src/components/coming-soon/coming-soon.jsx @@ -8,8 +8,8 @@ import ReactTooltip from 'react-tooltip'; import styles from './coming-soon.css'; -import awwCatIcon from './aww-cat.png'; -import coolCatIcon from './cool-cat.png'; +import iconHatti from './icon-hatti.png'; +import icon2Hatti from './icon2-hatti.png'; const messages = defineMessages({ message1: { @@ -50,7 +50,7 @@ class ComingSoonContent extends React.Component { } getRandomMessage () { // randomly chooses a messages from `messages` to display in the tooltip. - const images = [awwCatIcon, coolCatIcon]; + const images = [iconHatti, icon2Hatti]; const messageNumber = Math.floor(Math.random() * Object.keys(messages).length) + 1; const imageNumber = Math.floor(Math.random() * Object.keys(images).length); return ( diff --git a/packages/scratch-gui/src/components/coming-soon/cool-cat.png b/packages/scratch-gui/src/components/coming-soon/cool-cat.png deleted file mode 100644 index 15b2151e35b..00000000000 Binary files a/packages/scratch-gui/src/components/coming-soon/cool-cat.png and /dev/null differ diff --git a/packages/scratch-gui/src/components/coming-soon/icon-hatti.png b/packages/scratch-gui/src/components/coming-soon/icon-hatti.png new file mode 100644 index 00000000000..eb16edb3311 Binary files /dev/null and b/packages/scratch-gui/src/components/coming-soon/icon-hatti.png differ diff --git a/packages/scratch-gui/src/components/coming-soon/icon2-hatti.png b/packages/scratch-gui/src/components/coming-soon/icon2-hatti.png new file mode 100644 index 00000000000..64e1c373899 Binary files /dev/null and b/packages/scratch-gui/src/components/coming-soon/icon2-hatti.png differ diff --git a/packages/scratch-gui/src/lib/default-project/0fb9be3e8397c983338cb71dc84d0b25.svg b/packages/scratch-gui/src/lib/default-project/0fb9be3e8397c983338cb71dc84d0b25.svg deleted file mode 100644 index 5ff997fd111..00000000000 --- a/packages/scratch-gui/src/lib/default-project/0fb9be3e8397c983338cb71dc84d0b25.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - costume2.1 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-gui/src/lib/default-project/7499cf6ec438d0c7af6f896bc6adc294.svg b/packages/scratch-gui/src/lib/default-project/7499cf6ec438d0c7af6f896bc6adc294.svg new file mode 100644 index 00000000000..544af6b966a --- /dev/null +++ b/packages/scratch-gui/src/lib/default-project/7499cf6ec438d0c7af6f896bc6adc294.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/scratch-gui/src/lib/default-project/83c36d806dc92327b9e7049a565c6bff.wav b/packages/scratch-gui/src/lib/default-project/83c36d806dc92327b9e7049a565c6bff.wav deleted file mode 100755 index 45742d5ef6f..00000000000 Binary files a/packages/scratch-gui/src/lib/default-project/83c36d806dc92327b9e7049a565c6bff.wav and /dev/null differ diff --git a/packages/scratch-gui/src/lib/default-project/bcf454acf82e4504149f7ffe07081dbc.svg b/packages/scratch-gui/src/lib/default-project/bcf454acf82e4504149f7ffe07081dbc.svg deleted file mode 100644 index 03df23e29ad..00000000000 --- a/packages/scratch-gui/src/lib/default-project/bcf454acf82e4504149f7ffe07081dbc.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - costume1.1 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/scratch-gui/src/lib/default-project/cf51a0c4088942d95bcc20af13202710.wav b/packages/scratch-gui/src/lib/default-project/cf51a0c4088942d95bcc20af13202710.wav new file mode 100644 index 00000000000..a07a948fda5 Binary files /dev/null and b/packages/scratch-gui/src/lib/default-project/cf51a0c4088942d95bcc20af13202710.wav differ diff --git a/packages/scratch-gui/src/lib/default-project/index.ts b/packages/scratch-gui/src/lib/default-project/index.ts index 74784e664fa..485fb155df1 100644 --- a/packages/scratch-gui/src/lib/default-project/index.ts +++ b/packages/scratch-gui/src/lib/default-project/index.ts @@ -3,10 +3,9 @@ import {TranslatorFunction} from '../../gui-config'; import popWav from '!arraybuffer-loader!./83a9787d4cb6f3b7632b4ddfebf74367.wav?'; -import meowWav from '!arraybuffer-loader!./83c36d806dc92327b9e7049a565c6bff.wav?'; +import hattiMeowWav from '!arraybuffer-loader!./cf51a0c4088942d95bcc20af13202710.wav?'; import backdrop from '!raw-loader!./cd21514d0531fdffb22204e0ec5ed84a.svg?'; -import costume1 from '!raw-loader!./bcf454acf82e4504149f7ffe07081dbc.svg?'; -import costume2 from '!raw-loader!./0fb9be3e8397c983338cb71dc84d0b25.svg?'; +import hattiCostume from '!raw-loader!./7499cf6ec438d0c7af6f896bc6adc294.svg?'; declare function require(path: 'fastestsmallesttextencoderdecoder'): { TextEncoder: typeof TextEncoder }; @@ -35,26 +34,21 @@ const defaultProject = (translator?: TranslatorFunction) => { dataFormat: 'WAV', data: new Uint8Array(popWav) }, { - id: '83c36d806dc92327b9e7049a565c6bff', + id: 'cf51a0c4088942d95bcc20af13202710', assetType: 'Sound', dataFormat: 'WAV', - data: new Uint8Array(meowWav) + data: new Uint8Array(hattiMeowWav) }, { id: 'cd21514d0531fdffb22204e0ec5ed84a', assetType: 'ImageVector', dataFormat: 'SVG', data: encoder.encode(backdrop) }, { - id: 'bcf454acf82e4504149f7ffe07081dbc', + id: '7499cf6ec438d0c7af6f896bc6adc294', assetType: 'ImageVector', dataFormat: 'SVG', - data: encoder.encode(costume1) - }, { - id: '0fb9be3e8397c983338cb71dc84d0b25', - assetType: 'ImageVector', - dataFormat: 'SVG', - data: encoder.encode(costume2) + data: encoder.encode(hattiCostume) }]; }; -export default defaultProject; +export default defaultProject; \ No newline at end of file diff --git a/packages/scratch-gui/src/lib/default-project/project-data.ts b/packages/scratch-gui/src/lib/default-project/project-data.ts index 2effe2ed24e..d587ece3845 100644 --- a/packages/scratch-gui/src/lib/default-project/project-data.ts +++ b/packages/scratch-gui/src/lib/default-project/project-data.ts @@ -62,33 +62,24 @@ const projectData = (translateFunction?: TranslatorFunction): object => { currentCostume: 0, costumes: [ { - assetId: 'bcf454acf82e4504149f7ffe07081dbc', + assetId: '7499cf6ec438d0c7af6f896bc6adc294', name: translator(messages.costume, {index: 1}), bitmapResolution: 1, - md5ext: 'bcf454acf82e4504149f7ffe07081dbc.svg', + md5ext: '7499cf6ec438d0c7af6f896bc6adc294.svg', dataFormat: 'svg', - rotationCenterX: 48, - rotationCenterY: 50 - }, - { - assetId: '0fb9be3e8397c983338cb71dc84d0b25', - name: translator(messages.costume, {index: 2}), - bitmapResolution: 1, - md5ext: '0fb9be3e8397c983338cb71dc84d0b25.svg', - dataFormat: 'svg', - rotationCenterX: 46, - rotationCenterY: 53 + rotationCenterX: 87, + rotationCenterY: 39 } ], sounds: [ { - assetId: '83c36d806dc92327b9e7049a565c6bff', + assetId: 'cf51a0c4088942d95bcc20af13202710', name: translator(messages.meow), dataFormat: 'wav', format: '', - rate: 22050, - sampleCount: 18688, - md5ext: '83c36d806dc92327b9e7049a565c6bff.wav' + rate: 44100, + sampleCount: 26048, + md5ext: 'cf51a0c4088942d95bcc20af13202710.wav' } ], volume: 100, diff --git a/packages/scratch-gui/src/lib/make-toolbox-xml.js b/packages/scratch-gui/src/lib/make-toolbox-xml.js index 74faccf99c6..ef14a26aeb0 100644 --- a/packages/scratch-gui/src/lib/make-toolbox-xml.js +++ b/packages/scratch-gui/src/lib/make-toolbox-xml.js @@ -1,11 +1,15 @@ import ScratchBlocks from 'scratch-blocks'; import {defaultColors} from './settings/color-mode'; +import {CATEGORY_BLOCKS, parseHexFormatToSelectedBlocks} from './block-utils'; const categorySeparator = ''; const blockSeparator = ''; // At default scale, about 28px - +// Calculate total number of default blocks once at module load time +// Add 2 for variables_ and myBlocks_ which are not in CATEGORY_BLOCKS +const TOTAL_DEFAULT_BLOCKS = Object.values(CATEGORY_BLOCKS).reduce((total, blocks) => total + blocks.length, 0) + 2; + const motion = function (isInitialSetup, isStage, targetId, colors) { const stageSelected = ScratchBlocks.ScratchMsgs.translate( 'MOTION_STAGE_SELECTED', @@ -741,6 +745,141 @@ const myBlocks = function (isInitialSetup, isStage, targetId, colors) { const xmlOpen = ''; const xmlClose = ''; +/** + * Parses the only_blocks parameter and returns allowed block patterns + * @param {?string} onlyBlocks - The only_blocks URL parameter value + * @returns {Array.} - Array of allowed block patterns + */ +const parseOnlyBlocks = function (onlyBlocks) { + if (!onlyBlocks) return []; + + // Check if hex format (starts with '0') + if (onlyBlocks.startsWith('0') && onlyBlocks.length > 1) { + // Parse hex format and convert to allowed patterns + const selectedBlocks = parseHexFormatToSelectedBlocks(onlyBlocks); + const allowedPatterns = []; + + Object.keys(selectedBlocks).forEach(categoryId => { + const blocksInCategory = selectedBlocks[categoryId] || []; + allowedPatterns.push(...blocksInCategory); + }); + + return allowedPatterns; + } + + // Support both comma (,) and period (.) as separators (legacy format) + return onlyBlocks.split(/[,.]/) + .map(pattern => pattern.trim()) + .filter(pattern => pattern.length > 0); +}; + +/** + * Checks if a block type should be included based on only_blocks patterns + * @param {string} blockType - The block type to check + * @param {Array.} allowedPatterns - Array of allowed patterns + * @returns {boolean} - Whether the block should be included + */ +const shouldIncludeBlock = function (blockType, allowedPatterns) { + if (!allowedPatterns || allowedPatterns.length === 0) return true; + + return allowedPatterns.some(pattern => { + // Check if pattern is a category prefix (ends with underscore) + if (pattern.endsWith('_')) { + return blockType.startsWith(pattern); + } + // Otherwise, require exact match + return blockType === pattern; + }); +}; + +/** + * Hides a category completely when no blocks are selected + * @param {string} categoryXML - The XML string for a category (unused) + * @returns {string} - Empty string to hide the category + */ + +const filterAllBlocks = function (_categoryXML) { + // When no blocks are selected, return empty string to hide the entire category + return ''; +}; + +/** + * Filters block XML content based on only_blocks patterns + * @param {string} categoryXML - The category XML containing blocks + * @param {Array.} allowedPatterns - Array of allowed patterns + * @returns {string} - Filtered category XML + */ + +const filterBlocks = function (categoryXML, allowedPatterns) { + if (!allowedPatterns || allowedPatterns.length === 0) return categoryXML; + + // Extract both block and separator elements while preserving order + // Improved regex for better inline/normal block syntax matching + const inlineBlock = ']*type="[^"]+"[^>]*\\/>'; + const normalBlock = ']*type="[^"]+"[^>]*>[\\s\\S]*?<\\/block>'; + const separator = ']*\\/>'; + const elementRegex = new RegExp(`(?:${inlineBlock}|${normalBlock}|${separator})`, 'g'); + const elements = categoryXML.match(elementRegex) || []; + + const filteredElements = []; + + for (const element of elements) { + if (element.includes(' 0 && consolidatedElements[0].includes(' 0 && consolidatedElements[consolidatedElements.length - 1].includes(']*>/)[0]; + const categoryFooter = ''; + const blockContent = consolidatedElements.join('\n '); + + // Only add category separator if the original XML had separators + const hasSeparators = consolidatedElements.some(el => el.includes(' { const index = categoriesXML.findIndex(categoryInfo => categoryInfo.id === categoryId); @@ -776,32 +921,77 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ } // return `undefined` }; - const motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId, colors.motion); - const looksXML = moveCategory('looks') || + + // Generate categories and apply filtering (except for variables, myBlocks, and extensions) + let motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId, colors.motion); + let looksXML = moveCategory('looks') || looks(isInitialSetup, isStage, targetId, costumeName, backdropName, colors.looks); - const soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); - const eventsXML = moveCategory('event') || events(isInitialSetup, isStage, targetId, colors.event); - const controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId, colors.control); - const sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId, colors.sensing); - const operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId, colors.operators); + let soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName, colors.sounds); + let eventsXML = moveCategory('events') || events(isInitialSetup, isStage, targetId, colors.event); + let controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId, colors.control); + let sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId, colors.sensing); + let operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId, colors.operators); + + // Variables and myBlocks are always included (exception categories) const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId, colors.data); const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId, colors.more); - const everything = [ - xmlOpen, - motionXML, gap, - looksXML, gap, - soundXML, gap, - eventsXML, gap, - controlXML, gap, - sensingXML, gap, - operatorsXML, gap, - variablesXML, gap, - myBlocksXML - ]; + // Check if this is the default all blocks state (no filtering intended) + const isDefaultAllBlocks = allowedPatterns.length >= TOTAL_DEFAULT_BLOCKS; + // Apply filtering to core categories if only_blocks parameter is provided and not default all blocks + if (isOnlyBlocksSpecified && !isDefaultAllBlocks) { + // Special case: when allowedPatterns is empty, hide all blocks + if (allowedPatterns.length === 0) { + motionXML = filterAllBlocks(motionXML); + looksXML = filterAllBlocks(looksXML); + soundXML = filterAllBlocks(soundXML); + eventsXML = filterAllBlocks(eventsXML); + controlXML = filterAllBlocks(controlXML); + sensingXML = filterAllBlocks(sensingXML); + operatorsXML = filterAllBlocks(operatorsXML); + } else { + motionXML = filterBlocks(motionXML, allowedPatterns); + looksXML = filterBlocks(looksXML, allowedPatterns); + soundXML = filterBlocks(soundXML, allowedPatterns); + eventsXML = filterBlocks(eventsXML, allowedPatterns); + controlXML = filterBlocks(controlXML, allowedPatterns); + sensingXML = filterBlocks(sensingXML, allowedPatterns); + operatorsXML = filterBlocks(operatorsXML, allowedPatterns); + } + } + + // Build the final XML, only including non-empty categories + const everything = [xmlOpen]; + + // Helper function to add category if it has content + const addCategoryIfNotEmpty = categoryXML => { + if (categoryXML && categoryXML.trim() !== '') { + everything.push(categoryXML, gap); + } + }; + + // Add core categories (only if they have blocks after filtering) + addCategoryIfNotEmpty(motionXML); + addCategoryIfNotEmpty(looksXML); + addCategoryIfNotEmpty(soundXML); + addCategoryIfNotEmpty(eventsXML); + addCategoryIfNotEmpty(controlXML); + addCategoryIfNotEmpty(sensingXML); + addCategoryIfNotEmpty(operatorsXML); + + // Variables and myBlocks are always included (exception categories) + addCategoryIfNotEmpty(variablesXML); + addCategoryIfNotEmpty(myBlocksXML); + + // Extension categories are always included (exception categories) for (const extensionCategory of categoriesXML) { - everything.push(gap, extensionCategory.xml); + addCategoryIfNotEmpty(extensionCategory.xml); + } + + // Remove the last gap if it exists + if (everything.length > 1 && everything[everything.length - 1] === gap[0]) { + everything.pop(); } everything.push(xmlClose); @@ -809,3 +999,4 @@ const makeToolboxXML = function (isInitialSetup, isStage = true, targetId, categ }; export default makeToolboxXML; +export {filterBlocks}; diff --git a/packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js b/packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js deleted file mode 100644 index d3b3bc94b10..00000000000 --- a/packages/scratch-gui/src/lib/settings/color-mode/default/__mocks__/index.js +++ /dev/null @@ -1,18 +0,0 @@ -const blockColors = { - motion: { - primary: '#111111', - secondary: '#222222', - tertiary: '#333333' - }, - pen: { - primary: '#121212', - secondary: '#232323', - tertiary: '#343434' - }, - text: '#444444', - workspace: '#555555' -}; - -export { - blockColors -}; diff --git a/packages/scratch-gui/src/locales/en.js b/packages/scratch-gui/src/locales/en.js new file mode 100644 index 00000000000..92b4c92750f --- /dev/null +++ b/packages/scratch-gui/src/locales/en.js @@ -0,0 +1,212 @@ +export default { + "gui.smalruby3.crashMessage.description": "We are so sorry, but it looks like Smalruby has crashed. This bug has been automatically reported to the Smalruby Team. Please refresh your page to try again.", + "gui.smalruby3.gui.defaultProjectTitle": "Smalruby Project", + "gui.smalruby3.gui.rubyTab": "Ruby", + "gui.smalruby3.previewInfo.betawelcome": "Welcome to the Smalruby 3.0 Beta", + "gui.smalruby3.previewInfo.label": "Try Smalruby 3.0", + "gui.smalruby3.previewInfo.invitation": "We're working on the next generation of Smalruby. We're excited for you to try it!", + "gui.smalruby3.previewInfo.welcome": "Welcome to the Smalruby 3.0 Preview", + 'gui.smalruby3.menuBar.downloadRubyCodeToComputer': 'Save Ruby to your computer', + "gui.menuBar.meshV2": "Mesh", + "gui.smalruby3.menuBar.generateRubyFromCode": "Generate Ruby from Code", + "gui.smalruby3.unsupportedBrowser.notRecommended": "We are very sorry, but it looks like you are using a browser version that Smalruby 3.0 does not support. We recommend updating to the latest version of a supported browser such as Google Chrome, Mozilla Firefox, Microsoft Edge, or Apple Safari. ", + "gui.smalruby3.unsupportedBrowser.description": "We're very sorry, but Smalruby 3.0 does not support Internet Explorer, Vivaldi, Opera or Silk. We recommend trying a newer browser such as Google Chrome, Mozilla Firefox, or Microsoft Edge.", + "gui.smalruby3.unsupportedBrowser.previewfaq": "Smalruby is based Scratch 3.0. So to learn more, go to the {previewFaqLink}.", + "gui.smalruby3.webglModal.description": "Unfortunately it looks like your browser or computer {webGlLink}. This technology is needed for Smalruby 3.0 to run.", + "gui.smalruby3.alerts.convertRubyToBlocksError": "Could not convert Ruby to Code. Please fix Ruby!", + "gui.smalruby3.telemetryOptIn.label": "Report statistics to improve Smalruby", + "gui.smalruby3.telemetryOptIn.body1": "The Smalruby Team is always looking to better understand how Smalruby is used around the world. To help support this effort, you can allow Smalruby to automatically send usage information to the Smalruby Team.", + "gui.smalruby3.telemetryOptIn.body2": "The information we collect includes language selection, blocks usage, and some events like saving, loading, and uploading a project. We DO NOT collect any personal information.", + "gui.telemetryOptIn.buttonTextNo": "No, thanks", + "gui.extensionLibrary.showAllExtensions": "Show all extensions", + 'gui.smalruby3.rubyToBlocksConverter.couldNotConvertPrimitive': '"{ SOURCE }" could not be converted the block.', + 'gui.smalruby3.rubyToBlocksConverter.wrongInstruction': '"{ SOURCE }" is the wrong instruction.', + "gui.smalruby3.telemetryOptIn.buttonTextYes": "Yes, I'd like to help improve Smalruby", + 'gui.smalruby3.extension.mesh.name': 'Mesh', + 'gui.smalruby3.extension.mesh.description': 'Allowing users to interact over a computer network.', + 'mesh.categoryName': 'Mesh', + 'mesh.sensorValue': '[NAME] sensor value', + 'mesh.hostPeripheralName': 'Become Mesh Host [{ MESH_ID }]', + 'mesh.clientPeripheralName': 'Join Mesh [{ MESH_ID }]', + 'mesh.registeredHost': 'Registered Host Mesh [{ MESH_ID }]', + 'mesh.joinedMesh': 'Joined Mesh [{ MESH_ID }]', + 'mesh.notConnectedMenu': '! Disconnected', + 'mesh.registeredHostMenu': '✔【{ MESH_ID }】 ⏳️{ EXPIRES_AT }', + 'mesh.joinedMeshMenu': '✔【{ MESH_ID }】 ⏳️{ EXPIRES_AT }', + 'gui.smalruby3.extension.mesh.connectingMessage': 'Connecting', + 'gui.smalruby3.extension.meshV2.name': 'Mesh V2', + 'mesh.notConnected': 'Not connected (Mesh)', + 'mesh.domain': 'Domain: {domain}', + 'mesh.domainNotSet': 'Not set', + 'mesh.domainModalTitle': 'Mesh V2 Domain Settings', + 'mesh.domainPlaceholder': 'Enter domain name...', + 'mesh.domainSaveButton': 'Save', + 'mesh.domainCancelButton': 'Cancel', + 'mesh.domainConnectedAlert': 'Mesh V2 is connected. To change the domain, please disconnect first.', + 'mesh.domainInvalidError': 'Domain name contains invalid characters.', + 'mesh.domainTooLongError': 'Domain name is too long (max 256 characters).', + 'mesh.domainDescription': 'If the host is not displayed, please set the domain. The zip code of a facility such as a school is ideal.', + 'mesh.domainExampleTitle': 'Example', + 'mesh.domainExample': '100-0014', + 'gui.smalruby3.extension.smalrubotS1.name': 'Smalrubot S1', + 'gui.smalruby3.extension.smalrubotS1.description': 'Control the Smalrubot S1.', + 'gui.smalruby3.extension.smalrubotS1.connectingMessage': 'Connecting the Smalrubot S1', + 'smalrubotS1.categoryName': 'Smalrubot S1', + 'smalrubotS1.action': '[ACTION] (M1, M2)', + 'smalrubotS1.actionAndStopAfter': '[ACTION] for [SECS] seconds (M1, M2)', + 'smalrubotS1.bendArm': 'bend arm (D10) [DEGREE] degrees in [SECS] seconds', + 'smalrubotS1.getSensorValue': '[POSITION] sensor value', + 'smalrubotS1.turnLedOn': 'turn [POSITION] LED on (left:A0, right:A1)', + 'smalrubotS1.turnLedOff': 'turn [POSITION] LED off (left:A0, right:A1)', + 'smalrubotS1.getMotorSpeed': '[POSITION] DC motor speed (%) (left:M1, right:M2)', + 'smalrubotS1.setMotorSpeed': 'set [POSITION] DC motor speed [SPEED] (%) (left:M1, right:M2)', + 'smalrubotS1.setArmCalibration': 'Adjust arm (D10) [DEGREE] degrees', + 'smalrubotS1.actionMenu.forward': 'forward', + 'smalrubotS1.actionMenu.backward': 'backward', + 'smalrubotS1.actionMenu.turnLeft': 'turn left', + 'smalrubotS1.actionMenu.turnRight': 'turn right', + 'smalrubotS1.positionsMenu.left': 'left', + 'smalrubotS1.positionsMenu.right': 'right', + 'smalrubotS1.sensorPositionsMenu.left': 'left (A4)', + 'smalrubotS1.sensorPositionsMenu.right': 'right (A5)', + 'smalrubotS1.sensorPositionsMenu.touch': 'touch (A2)', + 'smalrubotS1.sensorPositionsMenu.light': 'light (A6)', + 'smalrubotS1.sensorPositionsMenu.sound': 'sound (A7)', + 'gui.smalruby3.blockDisplayModal.title': 'Block Display Settings', + 'gui.smalruby3.blockDisplayModal.selectAll': 'Select All', + 'gui.smalruby3.blockDisplayModal.selectNone': 'Select None', + 'gui.smalruby3.blockDisplayModal.alwaysVisible': 'Always visible', + 'gui.smalruby3.blockDisplayModal.extensions': 'Extensions', + 'gui.smalruby3.blockDisplayModal.categoriesTitle': 'Categories:', + 'gui.smalruby3.blockDisplayModal.alwaysVisibleTitle': 'Always Visible:', + 'gui.smalruby3.blockDisplayModal.blocksSubtitle': ' Blocks', + 'gui.menuBar.blockDisplay': 'Block Display...', + "gui.menuBar.learn": "Learn", + 'gui.menuBar.koshienEntryForm': 'Entry Form', + + // Block Display Modal - Block Messages + // Motion blocks + 'gui.smalruby3.blockDisplayModal.motion_movesteps': 'move (10) steps', + 'gui.smalruby3.blockDisplayModal.motion_turnright': 'turn ↻ (15) degrees', + 'gui.smalruby3.blockDisplayModal.motion_turnleft': 'turn ↺ (15) degrees', + 'gui.smalruby3.blockDisplayModal.motion_goto': 'go to (random position ▼)', + 'gui.smalruby3.blockDisplayModal.motion_gotoxy': 'go to x: (0) y: (0)', + 'gui.smalruby3.blockDisplayModal.motion_glideto': 'glide (1) secs to (random position ▼)', + 'gui.smalruby3.blockDisplayModal.motion_glidesecstoxy': 'glide (1) secs to x: (0) y: (0)', + 'gui.smalruby3.blockDisplayModal.motion_pointindirection': 'point in direction (90)', + 'gui.smalruby3.blockDisplayModal.motion_pointtowards': 'point towards (mouse-pointer ▼)', + 'gui.smalruby3.blockDisplayModal.motion_changexby': 'change x by (10)', + 'gui.smalruby3.blockDisplayModal.motion_setx': 'set x to (0)', + 'gui.smalruby3.blockDisplayModal.motion_changeyby': 'change y by (10)', + 'gui.smalruby3.blockDisplayModal.motion_sety': 'set y to (0)', + 'gui.smalruby3.blockDisplayModal.motion_ifonedgebounce': 'if on edge, bounce', + 'gui.smalruby3.blockDisplayModal.motion_setrotationstyle': 'set rotation style [left-right ▼]', + + // Looks blocks + 'gui.smalruby3.blockDisplayModal.looks_sayforsecs': 'say (Hello!) for (2) seconds', + 'gui.smalruby3.blockDisplayModal.looks_say': 'say (Hello!)', + 'gui.smalruby3.blockDisplayModal.looks_thinkforsecs': 'think (Hmm...) for (2) seconds', + 'gui.smalruby3.blockDisplayModal.looks_think': 'think (Hmm...)', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdropto': 'switch backdrop to (backdrop1 ▼)', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdroptoandwait': '[Stage] switch backdrop to (backdrop1 ▼) and wait', + 'gui.smalruby3.blockDisplayModal.looks_nextbackdrop': 'next backdrop', + 'gui.smalruby3.blockDisplayModal.looks_switchcostumeto': 'switch costume to (costume1 ▼)', + 'gui.smalruby3.blockDisplayModal.looks_nextcostume': 'next costume', + 'gui.smalruby3.blockDisplayModal.looks_changesizeby': 'change size by (10)', + 'gui.smalruby3.blockDisplayModal.looks_setsizeto': 'set size to (100) %', + 'gui.smalruby3.blockDisplayModal.looks_changeeffectby': 'change [color ▼] effect by (25)', + 'gui.smalruby3.blockDisplayModal.looks_seteffectto': 'set [color ▼] effect to (0)', + 'gui.smalruby3.blockDisplayModal.looks_cleargraphiceffects': 'clear graphic effects', + 'gui.smalruby3.blockDisplayModal.looks_show': 'show', + 'gui.smalruby3.blockDisplayModal.looks_hide': 'hide', + 'gui.smalruby3.blockDisplayModal.looks_gotofrontback': 'go to [front ▼] layer', + 'gui.smalruby3.blockDisplayModal.looks_goforwardbackwardlayers': 'go [forward ▼] (1) layers', + 'gui.smalruby3.blockDisplayModal.looks_costumenumbername': 'costume [number ▼]', + 'gui.smalruby3.blockDisplayModal.looks_backdropnumbername': 'backdrop [number ▼]', + 'gui.smalruby3.blockDisplayModal.looks_size': 'size', + + // Sound blocks + 'gui.smalruby3.blockDisplayModal.sound_playuntildone': 'play sound (Meow ▼) until done', + 'gui.smalruby3.blockDisplayModal.sound_play': 'start sound (Meow ▼)', + 'gui.smalruby3.blockDisplayModal.sound_stopallsounds': 'stop all sounds', + 'gui.smalruby3.blockDisplayModal.sound_changeeffectby': 'change [pitch ▼] effect by (10)', + 'gui.smalruby3.blockDisplayModal.sound_seteffectto': 'set [pitch ▼] effect to (100)', + 'gui.smalruby3.blockDisplayModal.sound_cleareffects': 'clear sound effects', + 'gui.smalruby3.blockDisplayModal.sound_changevolumeby': 'change volume by (-10)', + 'gui.smalruby3.blockDisplayModal.sound_setvolumeto': 'set volume to (100) %', + + // Event blocks + 'gui.smalruby3.blockDisplayModal.event_whenflagclicked': 'when 🏁 clicked', + 'gui.smalruby3.blockDisplayModal.event_whenkeypressed': 'when [space ▼] key pressed', + 'gui.smalruby3.blockDisplayModal.event_whenthisspriteclicked': 'when this sprite clicked', + 'gui.smalruby3.blockDisplayModal.event_whenbackdropswitchesto': 'when backdrop switches to [backdrop1 ▼]', + 'gui.smalruby3.blockDisplayModal.event_whengreaterthan': 'when [loudness ▼] > (10)', + 'gui.smalruby3.blockDisplayModal.event_whenbroadcastreceived': 'when I receive [message1 ▼]', + 'gui.smalruby3.blockDisplayModal.event_broadcast': 'broadcast (message1 ▼)', + 'gui.smalruby3.blockDisplayModal.event_broadcastandwait': 'broadcast (message1 ▼) and wait', + + // Control blocks + 'gui.smalruby3.blockDisplayModal.control_wait': 'wait (1) seconds', + 'gui.smalruby3.blockDisplayModal.control_repeat': 'repeat (10)', + 'gui.smalruby3.blockDisplayModal.control_forever': 'forever', + 'gui.smalruby3.blockDisplayModal.control_if': 'if 〈 〉 then', + 'gui.smalruby3.blockDisplayModal.control_if_else': 'if 〈 〉 then', + 'gui.smalruby3.blockDisplayModal.control_wait_until': 'wait until 〈 〉', + 'gui.smalruby3.blockDisplayModal.control_repeat_until': 'repeat until 〈 〉', + 'gui.smalruby3.blockDisplayModal.control_stop': 'stop [all ▼]', + 'gui.smalruby3.blockDisplayModal.control_start_as_clone': 'when I start as a clone', + 'gui.smalruby3.blockDisplayModal.control_create_clone_of': 'create clone of (myself ▼)', + 'gui.smalruby3.blockDisplayModal.control_delete_this_clone': 'delete this clone', + + // Sensing blocks + 'gui.smalruby3.blockDisplayModal.sensing_touchingobject': 'touching (mouse-pointer ▼)?', + 'gui.smalruby3.blockDisplayModal.sensing_touchingcolor': 'touching color 🎨?', + 'gui.smalruby3.blockDisplayModal.sensing_coloristouchingcolor': 'color 🎨 is touching 🎨?', + 'gui.smalruby3.blockDisplayModal.sensing_distanceto': 'distance to (mouse-pointer ▼)', + 'gui.smalruby3.blockDisplayModal.sensing_askandwait': 'ask (What\'s your name?) and wait', + 'gui.smalruby3.blockDisplayModal.sensing_answer': 'answer', + 'gui.smalruby3.blockDisplayModal.sensing_keypressed': 'key (space ▼) pressed?', + 'gui.smalruby3.blockDisplayModal.sensing_mousedown': 'mouse down?', + 'gui.smalruby3.blockDisplayModal.sensing_mousex': 'mouse x', + 'gui.smalruby3.blockDisplayModal.sensing_mousey': 'mouse y', + 'gui.smalruby3.blockDisplayModal.sensing_setdragmode': 'set drag mode [draggable ▼]', + 'gui.smalruby3.blockDisplayModal.sensing_loudness': 'loudness', + 'gui.smalruby3.blockDisplayModal.sensing_timer': 'timer', + 'gui.smalruby3.blockDisplayModal.sensing_resettimer': 'reset timer', + 'gui.smalruby3.blockDisplayModal.sensing_of': '[backdrop # ▼] of (Stage ▼)', + 'gui.smalruby3.blockDisplayModal.sensing_current': 'current [year ▼]', + 'gui.smalruby3.blockDisplayModal.sensing_dayssince2000': 'days since 2000', + 'gui.smalruby3.blockDisplayModal.sensing_username': 'username', + + // Operator blocks + 'gui.smalruby3.blockDisplayModal.operator_add': '( ) + ( )', + 'gui.smalruby3.blockDisplayModal.operator_subtract': '( ) - ( )', + 'gui.smalruby3.blockDisplayModal.operator_multiply': '( ) * ( )', + 'gui.smalruby3.blockDisplayModal.operator_divide': '( ) / ( )', + 'gui.smalruby3.blockDisplayModal.operator_random': 'pick random (1) to (10)', + 'gui.smalruby3.blockDisplayModal.operator_gt': '( ) > (50)', + 'gui.smalruby3.blockDisplayModal.operator_lt': '( ) < (50)', + 'gui.smalruby3.blockDisplayModal.operator_equals': '( ) = (50)', + 'gui.smalruby3.blockDisplayModal.operator_and': '〈 〉 and 〈 〉', + 'gui.smalruby3.blockDisplayModal.operator_or': '〈 〉 or 〈 〉', + 'gui.smalruby3.blockDisplayModal.operator_not': 'not 〈 〉', + 'gui.smalruby3.blockDisplayModal.operator_join': 'join (apple) (banana)', + 'gui.smalruby3.blockDisplayModal.operator_letter_of': 'letter (1) of (apple)', + 'gui.smalruby3.blockDisplayModal.operator_length': 'length of (apple)', + 'gui.smalruby3.blockDisplayModal.operator_contains': '(apple) contains (a)?', + 'gui.smalruby3.blockDisplayModal.operator_mod': '( ) mod ( )', + 'gui.smalruby3.blockDisplayModal.operator_round': 'round ( )', + 'gui.smalruby3.blockDisplayModal.operator_mathop': '[abs ▼] of ( )', + + // URL Loader messages + 'gui.urlLoader.loadError': 'The project URL that was entered failed to load.', + 'gui.urlLoader.invalidUrl': 'Please enter a valid Scratch project URL or Google Drive URL.', + 'gui.urlLoader.title': 'Load from URL', + 'gui.urlLoader.urlPlaceholder': 'Enter project URL...', + 'gui.urlLoader.openButton': 'Open', + 'gui.urlLoader.cancelButton': 'Cancel', + 'gui.urlLoader.urlExamplesTitle': 'URL Examples', + 'gui.urlLoader.urlExampleScratch': 'https://scratch.mit.edu/projects/{project_id}/', + 'gui.urlLoader.urlExampleGoogleDrive': 'https://drive.google.com/file/d/{file_id}/view?usp=drive_link', + 'gui.modal.stop': 'Stop' +}; diff --git a/packages/scratch-gui/src/locales/index.js b/packages/scratch-gui/src/locales/index.js new file mode 100644 index 00000000000..56dd87451ae --- /dev/null +++ b/packages/scratch-gui/src/locales/index.js @@ -0,0 +1,18 @@ +import messages from 'scratch-l10n/locales/editor-msgs'; +import en from './en'; +import ja from './ja'; +import jaHira from './ja-Hira'; + +const langs = { + "en": en, + "ja": ja, + "ja-Hira": jaHira +}; + +Object.keys(langs).forEach(lang => { + if (messages[lang]) { + Object.assign(messages[lang], langs[lang]); + } +}); + +export default messages; diff --git a/packages/scratch-gui/src/locales/ja-Hira.js b/packages/scratch-gui/src/locales/ja-Hira.js new file mode 100644 index 00000000000..0628ae61881 --- /dev/null +++ b/packages/scratch-gui/src/locales/ja-Hira.js @@ -0,0 +1,226 @@ +export default { + 'gui.modal.reload': 'さいよみこみ', + 'gui.menuBar.meshV2': 'メッシュ', + 'gui.menuBar.loadFromUrl': 'Scratchからよみこむ', + 'gui.urlLoader.loadError': 'プロジェクトURLのよみこみにしっぱいしました。', + 'gui.urlLoader.invalidUrl': 'ゆうこうなScratchプロジェクトURLをにゅうりょくしてください。', + 'gui.urlLoader.title': 'Scratchからよみこむ', + 'gui.urlLoader.urlPlaceholder': 'プロジェクトのURLをにゅうりょく...', + 'gui.urlLoader.openButton': 'ひらく', + 'gui.urlLoader.cancelButton': 'キャンセル', + 'gui.urlLoader.urlExamplesTitle': 'URLのれい', + 'gui.urlLoader.urlExampleScratch': 'https://scratch.mit.edu/projects/1234567/', + 'gui.menuBar.seeProjectPage': 'プロジェクトページをみる', + 'gui.loader.creating': 'プロジェクトをさくせいちゅう...', + 'gui.smalruby3.crashMessage.description': 'もうしわけありません。スモウルビーがクラッシュしたようです。このバグはじどうてきにスモウルビーチームにほうこくされました。ページをさいよみこみしてください。', + 'gui.smalruby3.gui.defaultProjectTitle': 'スモウルビーのプロジェクト', + 'gui.smalruby3.gui.rubyTab': 'ルビー', + 'gui.smalruby3.previewInfo.betawelcome': 'スモウルビー3.0 ベータばんにようこそ!', + 'gui.smalruby3.previewInfo.label': 'スモウルビー3.0をためしてみる', + 'gui.smalruby3.previewInfo.invitation': 'わたしたちはじせだいのスモウルビーをかいはつちゅうです。おためしください!', + 'gui.smalruby3.previewInfo.welcome': 'スモウルビー3.0 プレビューばんにようこそ!', + 'gui.smalruby3.menuBar.downloadRubyCodeToComputer': 'コンピュータにルビーをほぞんする', + 'gui.smalruby3.menuBar.generateRubyFromCode': 'コードからルビーにへんかんします', + 'gui.smalruby3.unsupportedBrowser.notRecommended': 'もうしわけありません。スモウルビー3.0はおつかいのバージョンのブラウザをサポートしていません。グーグル クローム、モジラ ファイアーフォックス、マイクロソフト エッジ、アップル サファリのようなサポートしているさいしんのバージョンにアップデートすることをおすすめします。', + 'gui.smalruby3.unsupportedBrowser.description': 'もうしわけありません。スモウルビー3.0はインターネットエクスプローラ、ビヴァルディ、オペラ、シルクをサポートしていません。グーグル クローム、モジラ ファイアーフォックス、マイクロソフト エッジのようなあたらしいブラウザのりようをおすすめします。', + 'gui.smalruby3.unsupportedBrowser.previewfaq': 'スモウルビーは スクラッチ 3.0をベースにかいはつしていますので、くわしくしりたいばあいは スクラッチ の {previewFaqLink} をごらんください。', + 'gui.smalruby3.webglModal.description': 'ざんねんながら、ブラウザーやコンピューターが{webGlLink}ようです。このぎじゅつはスモウルビー3.0のじっこうにひっすです。', + 'gui.smalruby3.alerts.convertRubyToBlocksError': 'ルビーからコードにへんかんできませんでした。ルビーをなおしてください!', + 'gui.smalruby3.telemetryOptIn.label': 'スモウルビーをかいぜんするためのりようじょうきょうのほうこく', + 'gui.smalruby3.telemetryOptIn.body1': 'スモウルビーのかいはつしゃはせかいじゅうでスモウルビーがどのようにつかわれているのかをりかいしたいとかんがえています。そのてだすけのために、みなさんのスモウルビーのりようじょうきょうをスモウルビーのかいはつしゃにていきょうしていただけないでしょうか。', + 'gui.smalruby3.telemetryOptIn.body2': 'ていきょうしていただくじょうほうにはどのげんごをせんたくしたか、どのブロックをつかったか、ほぞん・よみこみ・プロジェクトのアップロードなどのイベントをふくみます。ただし、ユーザめいなどのこじんてきなじょうほうはいっさいふくみません。', + 'gui.telemetryOptIn.buttonTextNo': 'いいえ、けっこうです。', + 'gui.smalruby3.rubyToBlocksConverter.couldNotConvertPrimitive': '「{ SOURCE }」はブロックにへんかんできません。', + 'gui.smalruby3.rubyToBlocksConverter.wrongInstruction': '「{ SOURCE }」はめいれいがまちがっています。', + 'gui.smalruby3.telemetryOptIn.buttonTextYes': 'はい、スモウルビーのかいぜんにきょうりょくします。', + 'gui.smalruby3.extension.mesh.name': 'メッシュ', + 'gui.smalruby3.extension.mesh.description': 'ネットワークじょうでユーザーかんのやりとりを おこなう。', + 'gui.smalruby3.extension.mesh.connectingMessage': 'メッシュのネットワークにせつぞくしています', + 'mesh.categoryName': 'メッシュ', + 'mesh.sensorValue': '[NAME] センサーのあたい', + 'mesh.hostPeripheralName': 'メッシュのホストになる 【{ MESH_ID }】', + 'mesh.clientPeripheralName': 'メッシュにさんかする 【{ MESH_ID }】', + 'gui.smalruby3.extension.meshV2.name': 'メッシュ V2', + 'mesh.notConnected': 'メッシュにせつぞくしていません', + 'mesh.registeredHost': 'ホストとしてメッシュにとうろくしました 【{ MESH_ID }】', + 'mesh.joinedMesh': 'メッシュにさんかしました 【{ MESH_ID }】', + 'mesh.notConnectedMenu': '!せつぞくしていません', + 'mesh.registeredHostMenu': '✔【{ MESH_ID }】 ⏳️{ EXPIRES_AT }まで', + 'mesh.joinedMeshMenu': '✔【{ MESH_ID }】 ⏳️{ EXPIRES_AT }まで', + 'mesh.domain': 'ドメイン: {domain}', + 'mesh.domainNotSet': 'みせってい', + 'mesh.domainModalTitle': 'meshV2 ドメインせってい', + 'mesh.domainPlaceholder': 'ドメインめいをにゅうりょく...', + 'mesh.domainSaveButton': 'ほぞん', + 'mesh.domainCancelButton': 'キャンセル', + 'mesh.domainConnectedAlert': 'meshV2がせつぞくちゅうです。ドメインをへんかんするには、まずせつぞくをきってください。', + 'mesh.domainInvalidError': 'ドメインめいに つかえない もじが ふくまれています。', + 'mesh.domainTooLongError': 'ドメインめいが ながすぎます(さいだい256もじ)。', + 'mesh.domainDescription': 'ホストが ひょうじされない ばあいは ドメインを せっていしてください。がっこうなどの しせつの ゆうびんばんごうが さいてきです。', + 'mesh.domainExampleTitle': 'れい', + 'mesh.domainExample': '100-0014', + 'gui.smalruby3.extension.smalrubotS1.name': 'スモウルボットS1 (エス1)', + 'gui.smalruby3.extension.smalrubotS1.description': 'スモウルボットS1 (エス1) をせいぎょする。', + 'gui.smalruby3.extension.smalrubotS1.connectingMessage': 'スモウルボットS1 (エス1) にせつぞくしています。', + 'smalrubotS1.categoryName': 'スモウルボットS1 (エス1)', + 'smalrubotS1.action': '[ACTION] (M1, M2)', + 'smalrubotS1.actionAndStopAfter': '[SECS] びょう [ACTION] (M1, M2)', + 'smalrubotS1.bendArm': '[SECS] びょうでアーム (D10) を [DEGREE] どにまげる', + 'smalrubotS1.getSensorValue': '[POSITION] のセンサー', + 'smalrubotS1.turnLedOn': '[POSITION] のLED (エルイーディー) をオンにする (ひだり:A0, みぎ:A1)', + 'smalrubotS1.turnLedOff': '[POSITION] のLED (エルイーディー) をオフにする (ひだり:A0, みぎ:A1)', + 'smalrubotS1.getMotorSpeed': '[POSITION] DC (ディーシー) モーターのそくど (%) (ひだり:M1, みぎ:M2)', + 'smalrubotS1.setMotorSpeed': '[POSITION] DC (ディーシー) モーターのそくどを [SPEED] (%) にする (ひだり:M1, みぎ:M2)', + 'smalrubotS1.setArmCalibration': 'アーム (D10) を [DEGREE] どちょうせいする', + 'smalrubotS1.actionMenu.forward': 'すすめる', + 'smalrubotS1.actionMenu.backward': 'バックさせる', + 'smalrubotS1.actionMenu.turnLeft': 'ひだりにまげる', + 'smalrubotS1.actionMenu.turnRight': 'みぎにまげる', + 'smalrubotS1.positionsMenu.left': 'ひだり', + 'smalrubotS1.positionsMenu.right': 'みぎ', + 'smalrubotS1.sensorPositionsMenu.left': 'ひだり (A4)', + 'smalrubotS1.sensorPositionsMenu.right': 'みぎ (A5)', + 'smalrubotS1.sensorPositionsMenu.touch': 'タッチ (A2)', + 'smalrubotS1.sensorPositionsMenu.light': 'ひかり (A6)', + 'smalrubotS1.sensorPositionsMenu.sound': 'おと (A7)', + 'gui.smalruby3.blockDisplayModal.title': 'ブロックひょうじせってい', + 'gui.smalruby3.blockDisplayModal.selectAll': 'すべてせんたく', + 'gui.smalruby3.blockDisplayModal.selectNone': 'すべてせんたくかいじょ', + 'gui.smalruby3.blockDisplayModal.alwaysVisible': 'つねにひょうじ', + 'gui.smalruby3.blockDisplayModal.extensions': 'かくちょうきのう', + 'gui.smalruby3.blockDisplayModal.categoriesTitle': 'カテゴリ:', + 'gui.smalruby3.blockDisplayModal.alwaysVisibleTitle': 'つねにひょうじ:', + 'gui.smalruby3.blockDisplayModal.blocksSubtitle': 'ブロック', + 'gui.smalruby3.blockDisplayModal.copyUrl': 'URLのこぴー', + 'gui.smalruby3.blockDisplayModal.saveToFile': 'ふぁいるにせってい', + 'gui.menuBar.blockDisplay': 'ブロックひょうじ...', + 'gui.menuBar.learn': 'まなぶ', + 'gui.menuBar.koshienEntryForm': 'さんかもうしこみ', + + // Block Display Modal - Block Messages (Hiragana) + // Motion blocks + 'gui.smalruby3.blockDisplayModal.motion_movesteps': '(10) ほうごかす', + 'gui.smalruby3.blockDisplayModal.motion_turnright': '↻ (15) どまわす', + 'gui.smalruby3.blockDisplayModal.motion_turnleft': '↺ (15) どまわす', + 'gui.smalruby3.blockDisplayModal.motion_goto': '(どこかのばしょ▼) へいく', + 'gui.smalruby3.blockDisplayModal.motion_gotoxy': 'xざひょうを (0) 、yざひょうを (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_glideto': '(1) びょうで (どこかのばしょ▼) へすべるようにいどうする', + 'gui.smalruby3.blockDisplayModal.motion_glidesecstoxy': '(1) びょうでxざひょうを (0) 、yざひょうを (0) へすべるようにいどうする', + 'gui.smalruby3.blockDisplayModal.motion_pointindirection': '(90) どにむける', + 'gui.smalruby3.blockDisplayModal.motion_pointtowards': '(マウスのポインター▼) へむける', + 'gui.smalruby3.blockDisplayModal.motion_changexby': 'xざひょうを (10) ずつかえる', + 'gui.smalruby3.blockDisplayModal.motion_setx': 'xざひょうを (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_changeyby': 'yざひょうを (10) ずつかえる', + 'gui.smalruby3.blockDisplayModal.motion_sety': 'yざひょうを (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_ifonedgebounce': 'もしはしについたら、はねかえる', + 'gui.smalruby3.blockDisplayModal.motion_setrotationstyle': 'かいてんほうほうを [ひだりみぎのみ▼] にする', + + // Looks blocks + 'gui.smalruby3.blockDisplayModal.looks_sayforsecs': '(こんにちは) と (2) びょういう', + 'gui.smalruby3.blockDisplayModal.looks_say': '(こんにちは) という', + 'gui.smalruby3.blockDisplayModal.looks_thinkforsecs': '(うーん...) と (2) びょうかんがえる', + 'gui.smalruby3.blockDisplayModal.looks_think': '(うーん...) とかんがえる', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdropto': 'はいけいを (はいけい1) にする', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdroptoandwait': '【すてーじ】はいけいを (はいけい1) にしてまつ', + 'gui.smalruby3.blockDisplayModal.looks_nextbackdrop': 'つぎのはいけいにする', + 'gui.smalruby3.blockDisplayModal.looks_switchcostumeto': 'コスチュームを (コスチューム1▼) にする', + 'gui.smalruby3.blockDisplayModal.looks_nextcostume': 'つぎのコスチュームにする', + 'gui.smalruby3.blockDisplayModal.looks_changesizeby': 'おおきさを (10) ずつかえる', + 'gui.smalruby3.blockDisplayModal.looks_setsizeto': 'おおきさを (100) %にする', + 'gui.smalruby3.blockDisplayModal.looks_changeeffectby': '[いろ▼] のこうかを (25) ずつかえる', + 'gui.smalruby3.blockDisplayModal.looks_seteffectto': '[いろ▼] のこうかを (0) にする', + 'gui.smalruby3.blockDisplayModal.looks_cleargraphiceffects': 'がぞうこうかをなくす', + 'gui.smalruby3.blockDisplayModal.looks_show': 'ひょうじする', + 'gui.smalruby3.blockDisplayModal.looks_hide': 'かくす', + 'gui.smalruby3.blockDisplayModal.looks_gotofrontback': '[さいぜんめん▼] へいどうする', + 'gui.smalruby3.blockDisplayModal.looks_goforwardbackwardlayers': '(1) そう [てまえにだす▼]', + 'gui.smalruby3.blockDisplayModal.looks_costumenumbername': 'コスチュームの [ばんごう▼]', + 'gui.smalruby3.blockDisplayModal.looks_backdropnumbername': 'はいけいの [ばんごう▼]', + 'gui.smalruby3.blockDisplayModal.looks_size': 'おおきさ', + + // Sound blocks + 'gui.smalruby3.blockDisplayModal.sound_playuntildone': 'おわるまで (Meow▼) のおとをならす', + 'gui.smalruby3.blockDisplayModal.sound_play': '(Meow▼) のおとをならす', + 'gui.smalruby3.blockDisplayModal.sound_stopallsounds': 'すべてのおとをとめる', + 'gui.smalruby3.blockDisplayModal.sound_changeeffectby': '[ピッチ▼] のこうかを (10) ずつかえる', + 'gui.smalruby3.blockDisplayModal.sound_seteffectto': '[ピッチ▼] のこうかを (100) にする', + 'gui.smalruby3.blockDisplayModal.sound_cleareffects': 'おとのこうかをなくす', + 'gui.smalruby3.blockDisplayModal.sound_changevolumeby': 'おんりょうを (-10) ずつかえる', + 'gui.smalruby3.blockDisplayModal.sound_setvolumeto': 'おんりょうを (100) %にする', + + // Event blocks + 'gui.smalruby3.blockDisplayModal.event_whenflagclicked': '🏁 がおされたとき', + 'gui.smalruby3.blockDisplayModal.event_whenkeypressed': '[スペース▼] キーがおされたとき', + 'gui.smalruby3.blockDisplayModal.event_whenthisspriteclicked': 'このスプライトがおされたとき', + 'gui.smalruby3.blockDisplayModal.event_whenbackdropswitchesto': 'はいけいが [はいけい1] になったとき', + 'gui.smalruby3.blockDisplayModal.event_whengreaterthan': '[おんりょう▼] > (10) のとき', + 'gui.smalruby3.blockDisplayModal.event_whenbroadcastreceived': '[メッセージ1▼] をうけとったとき', + 'gui.smalruby3.blockDisplayModal.event_broadcast': '(メッセージ1▼) をおくる', + 'gui.smalruby3.blockDisplayModal.event_broadcastandwait': '(メッセージ1▼) をおくってまつ', + + // Control blocks + 'gui.smalruby3.blockDisplayModal.control_wait': '(1) びょうまつ', + 'gui.smalruby3.blockDisplayModal.control_repeat': '(10) かいくりかえす', + 'gui.smalruby3.blockDisplayModal.control_forever': 'ずっと', + 'gui.smalruby3.blockDisplayModal.control_if': 'もし 〔 〕 なら', + 'gui.smalruby3.blockDisplayModal.control_if_else': 'もし 〔 〕 なら', + 'gui.smalruby3.blockDisplayModal.control_wait_until': '〔 〕 までまつ', + 'gui.smalruby3.blockDisplayModal.control_repeat_until': '〔 〕 までくりかえす', + 'gui.smalruby3.blockDisplayModal.control_stop': 'すべてをとめる', + 'gui.smalruby3.blockDisplayModal.control_start_as_clone': 'クローンされたとき', + 'gui.smalruby3.blockDisplayModal.control_create_clone_of': '(じぶんじしん▼) のクローンをつくる', + 'gui.smalruby3.blockDisplayModal.control_delete_this_clone': 'このクローンをさくじょする', + + // Sensing blocks + 'gui.smalruby3.blockDisplayModal.sensing_touchingobject': '(マウスのポインター▼) にさわった', + 'gui.smalruby3.blockDisplayModal.sensing_touchingcolor': 'いろ 🎨 にさわった', + 'gui.smalruby3.blockDisplayModal.sensing_coloristouchingcolor': 'いろ 🎨 がいろ 🎨 にさわった', + 'gui.smalruby3.blockDisplayModal.sensing_distanceto': '(マウスのポインター▼) までのきょり', + 'gui.smalruby3.blockDisplayModal.sensing_askandwait': '(あなたのなまえはなんですか?) ときいてまつ', + 'gui.smalruby3.blockDisplayModal.sensing_answer': 'こたえ', + 'gui.smalruby3.blockDisplayModal.sensing_keypressed': '(スペース▼) キーがおされた', + 'gui.smalruby3.blockDisplayModal.sensing_mousedown': 'マウスがおされた', + 'gui.smalruby3.blockDisplayModal.sensing_mousex': 'マウスのxざひょう', + 'gui.smalruby3.blockDisplayModal.sensing_mousey': 'マウスのyざひょう', + 'gui.smalruby3.blockDisplayModal.sensing_setdragmode': 'ドラッグモードを [できる▼] にする', + 'gui.smalruby3.blockDisplayModal.sensing_loudness': 'おとのおおきさ', + 'gui.smalruby3.blockDisplayModal.sensing_timer': 'タイマー', + 'gui.smalruby3.blockDisplayModal.sensing_resettimer': 'タイマーをリセット', + 'gui.smalruby3.blockDisplayModal.sensing_of': '(ステージ▼) の [はいけい#▼]', + 'gui.smalruby3.blockDisplayModal.sensing_current': 'げんざいの [ねん▼]', + 'gui.smalruby3.blockDisplayModal.sensing_dayssince2000': '2000ねんからのにっすう', + 'gui.smalruby3.blockDisplayModal.sensing_username': 'ユーザーめい', + + // Operator blocks + 'gui.smalruby3.blockDisplayModal.operator_add': '( ) + ( )', + 'gui.smalruby3.blockDisplayModal.operator_subtract': '( ) - ( )', + 'gui.smalruby3.blockDisplayModal.operator_multiply': '( ) × ( )', + 'gui.smalruby3.blockDisplayModal.operator_divide': '( ) ÷ ( )', + 'gui.smalruby3.blockDisplayModal.operator_random': '(1) から (10) までのらんすう', + 'gui.smalruby3.blockDisplayModal.operator_gt': '( ) > (50)', + 'gui.smalruby3.blockDisplayModal.operator_lt': '( ) < (50)', + 'gui.smalruby3.blockDisplayModal.operator_equals': '( ) = (50)', + 'gui.smalruby3.blockDisplayModal.operator_and': '〔 〕 かつ 〔 〕', + 'gui.smalruby3.blockDisplayModal.operator_or': '〔 〕 または 〔 〕', + 'gui.smalruby3.blockDisplayModal.operator_not': '〔 〕 ではない', + 'gui.smalruby3.blockDisplayModal.operator_join': '(りんご) と (バナナ) をつなげる', + 'gui.smalruby3.blockDisplayModal.operator_letter_of': '(りんご) の (1) ばんめのもじ', + 'gui.smalruby3.blockDisplayModal.operator_length': '(りんご) のながさ', + 'gui.smalruby3.blockDisplayModal.operator_contains': '(りんご) に (り) がふくまれる', + 'gui.smalruby3.blockDisplayModal.operator_mod': '( ) を ( ) でわったあまり', + 'gui.smalruby3.blockDisplayModal.operator_round': '( ) をししゃごにゅう', + 'gui.smalruby3.blockDisplayModal.operator_mathop': '( ) の [ぜったいち▼]', + 'gui.extensionLibrary.showAllExtensions': 'すべてのかくちょうきのうをひょうじ', + + // MicroBit More - Tilt gesture labels (override to match microbit extension) + 'mbitMore.gesturesMenu.tiltUp': 'うえにかたむいた', + 'mbitMore.gesturesMenu.tiltDown': 'したにかたむいた', + 'mbitMore.gesturesMenu.tiltLeft': 'ひだりにかたむいた', + 'mbitMore.gesturesMenu.tiltRight': 'みぎにかたむいた', + 'gui.connection.updatePeripheral.doNotDisconnect': 'アップデートちゅうはmicro:bitをはずさないでください。', + 'gui.connection.scanning.updatePeripheralPrompt': 'micro:bitをさいしんのファームウェアにアップデートしてください。', + 'gui.connection.updatePeripheral.microbitMoreUpdateSuccessful': 'MicrobitMoreのアップデートにせいこうしました!', + 'gui.connection.updatePeripheral.microbitMoreTiltToLightUp': 'micro:bitをかたむけて25このLEDをすべててんとうさせるとかんりょうです。', + 'gui.connection.scanning.updatePeripheralButton': 'アップデート', + 'gui.connection.auto-scanning.updatePeripheralButton': 'アップデート' +}; diff --git a/packages/scratch-gui/src/locales/ja.js b/packages/scratch-gui/src/locales/ja.js new file mode 100644 index 00000000000..c84548fff25 --- /dev/null +++ b/packages/scratch-gui/src/locales/ja.js @@ -0,0 +1,263 @@ +export default { + 'gui.modal.reload': '再読み込み', + 'gui.modal.stop': '中止', + 'gui.menuBar.loadFromUrl': 'Scratchから読み込む', + 'gui.menuBar.meshV2': 'メッシュ', + 'gui.menuBar.loadFromGoogleDrive': 'Google ドライブから読み込む', + 'gui.menuBar.saveToGoogleDrive': 'Googleドライブにコピーを保存...', + 'gui.menuBar.saveDirectlyToGoogleDrive': 'Googleドライブに直ちに保存', + 'gui.menuBar.savingToGoogleDrive': 'プロジェクトを保存中...', + 'gui.menuBar.savedToGoogleDrive': 'プロジェクトが保存されました。', + 'gui.menuBar.saveDirectlyButton': '直ちに保存', + 'gui.menuBar.authExpired': '認証が期限切れです。クリックして保存してください。', + 'gui.menuBar.koshien': 'スモウルビー甲子園', + 'gui.menuBar.koshienMenu': 'スモウルビー甲子園', + 'gui.menuBar.saveAI': 'AIを保存', + 'gui.menuBar.saveAIAs': 'AIに名前をつけて保存...', + 'gui.menuBar.testAI': 'AIを試す', + 'gui.menuBar.koshienEntryForm': '参加申し込み', + 'gui.menuBar.aiSaving': 'ルビーを保存中...', + 'gui.menuBar.aiSaved': 'ルビーが保存されました。', + 'gui.koshienTestModal.title': 'スモウルビー甲子園のAIを試す', + 'gui.googleDriveLoader.loadError': 'Google ドライブからプロジェクトの読み込みに失敗しました。', + 'gui.googleDriveLoader.authError': 'Google ドライブ의 認証に失敗しました。もう一度お試しください。', + 'gui.googleDriveLoader.configError': 'Google ドライブが設定されていません。管理者に連絡してください。', + 'gui.googleDriveLoader.pickerTitle': 'Google ドライブから Scratch 3.0 プロジェクト (.sb3) を選択', + 'gui.googleDriveSaver.uploadError': 'Google ドライブへのプロジェクトのアップロードに失敗しました。', + 'gui.googleDriveSaver.authError': 'Google ドライブの認証に失敗しました。もう一度お試しください。', + 'gui.googleDriveSaver.configError': 'Google ドライブが設定されていません。管理者に連絡してください。', + 'gui.googleDriveSaver.uploadSuccess': 'プロジェクトを Google ドライブに正常にアップロードしました!', + 'gui.googleDriveSaveDialog.title': 'Googleドライブにコピーを保存', + 'gui.googleDriveSaveDialog.filenameLabel': '名前を付けて保存:', + 'gui.googleDriveSaveDialog.whereLabel': 'フォルダ:', + 'gui.googleDriveSaveDialog.myDrive': 'マイドライブ', + 'gui.googleDriveSaveDialog.selectFolder': 'フォルダを選択する...', + 'gui.googleDriveSaveDialog.selectedFolder': '選択: {folderName}', + 'gui.googleDriveSaveDialog.cancel': 'キャンセル', + 'gui.googleDriveSaveDialog.reset': 'リセット', + 'gui.googleDriveSaveDialog.save': '保存', + 'gui.googleDriveSaveDialog.filenameRequired': 'ファイル名を入力してください。', + 'gui.googleDriveSaveDialog.folderPickerTitle': 'Google ドライブでフォルダを選択', + 'gui.googleDriveSaveDialog.folderPickerError': 'フォルダピッカーの表示に失敗しました。もう一度お試しください。', + 'gui.urlLoader.loadError': 'プロジェクトURLの読み込みに失敗しました。', + 'gui.urlLoader.invalidUrl': '有効なScratchプロジェクトURLまたはGoogle DriveのURLを入力してください。', + 'gui.urlLoader.title': 'Scratchから読み込む', + 'gui.urlLoader.urlPlaceholder': 'プロジェクトのURLを入力...', + 'gui.urlLoader.openButton': '開く', + 'gui.urlLoader.cancelButton': 'キャンセル', + 'gui.urlLoader.urlExamplesTitle': 'URLの例', + 'gui.urlLoader.urlExampleScratch': 'https://scratch.mit.edu/projects/1234567/', + 'gui.menuBar.seeProjectPage': 'プロジェクトページを見る', + 'gui.loader.creating': 'プロジェクトを作成中...', + 'gui.smalruby3.crashMessage.description': '申し訳ありません。スモウルビーがクラッシュしたようです。このバグは自動的にスモウルビーチームに報告されました。ページを再読み込みしてください。', + 'gui.smalruby3.gui.defaultProjectTitle': 'スモウルビーのプロジェクト', + 'gui.smalruby3.gui.rubyTab': 'ルビー', + 'gui.smalruby3.previewInfo.betawelcome': 'スモウルビー3.0 ベータ版にようこそ!', + 'gui.smalruby3.previewInfo.label': 'スモウルビー3.0を試してみる', + 'gui.smalruby3.previewInfo.invitation': '私たちは次世代のスモウルビーを開発中です。お試しください!', + 'gui.smalruby3.previewInfo.welcome': 'スモウルビー3.0 プレビュー版にようこそ!', + 'gui.smalruby3.menuBar.downloadRubyCodeToComputer': 'コンピュータにルビーを保存する', + 'gui.smalruby3.menuBar.generateRubyFromCode': 'コードからルビーに変換します', + 'gui.smalruby3.unsupportedBrowser.notRecommended': '申し訳ありません。スモウルビー3.0はお使いのバージョンのブラウザをサポートしていません。Google Chrome、Mozilla Firefox、Microsoft Edge、Apple Safariのようなサポートしている最新のバージョンにアップデートすることをお勧めします。', + 'gui.smalruby3.unsupportedBrowser.description': '申し訳ありません。スモウルビー3.0はInternet Explorer、Vivaldi、Opera、Silkをサポートしていません。Google Chrome、Mozilla Firefox、Microsoft Edgeのような新しいブラウザの利用をお勧めします。', + 'gui.smalruby3.unsupportedBrowser.previewfaq': 'スモウルビーは Scratch 3.0をベースに開発していますので、詳しく知りたい場合は Scratch の {previewFaqLink} をご覧ください。', + 'gui.smalruby3.webglModal.description': '残念ながら、ブラウザーやコンピューターが{webGlLink}ようです。この技術はスモウルビー3.0の実行に必須です。', + 'gui.smalruby3.alerts.convertRubyToBlocksError': 'ルビーからコードに変換できませんでした。ルビーを修正してください!', + 'gui.smalruby3.telemetryOptIn.label': 'スモウルビーを改善するための利用状況の報告', + 'gui.smalruby3.telemetryOptIn.body1': 'スモウルビーの開発者は世界中でスモウルビーがどのように使われているのかを理解したいと考えています。その手助けのために、みなさんのスモウルビーの利用状況をスモウルビーの開発者に提供していただけないでしょうか。', + 'gui.smalruby3.telemetryOptIn.body2': '提供していただく情報にはどの言語を選択したか、どのブロックを使ったか、保存・読み込み・プロジェクトのアップロードなどのイベントを含みます。ただし、ユーザ名などの個人的な情報は一切含みません。', + 'gui.telemetryOptIn.buttonTextNo': 'いいえ、結構です。', + 'gui.smalruby3.rubyToBlocksConverter.couldNotConvertPrimitive': '「{ SOURCE }」はブロックに変換できません。', + 'gui.smalruby3.rubyToBlocksConverter.wrongInstruction': '「{ SOURCE }」は命令がまちがっています。', + 'gui.smalruby3.telemetryOptIn.buttonTextYes': 'はい、スモウルビーの改善に協力します。', + 'gui.smalruby3.extension.mesh.name': 'メッシュ', + 'gui.smalruby3.extension.mesh.description': 'ネットワーク上でユーザー間のやりとりを行う。', + 'mesh.categoryName': 'メッシュ', + 'mesh.sensorValue': '[NAME] センサーの値', + 'mesh.hostPeripheralName': 'メッシュのホストになる 【{ MESH_ID }】', + 'mesh.clientPeripheralName': 'メッシュに参加する 【{ MESH_ID }】', + 'gui.smalruby3.extension.mesh.connectingMessage': 'メッシュのネットワークに接続しています', + 'gui.smalruby3.extension.meshV2.name': 'メッシュ V2', + 'mesh.notConnected': 'メッシュに接続していません', + 'mesh.registeredHost': 'ホストとしてメッシュに登録しました 【{ MESH_ID }】', + 'mesh.joinedMesh': 'メッシュに参加しました 【{ MESH_ID }】', + 'mesh.notConnectedMenu': '!未接続', + 'mesh.registeredHostMenu': '✔【{MESH_ID}】 ⏳️{EXPIRES_AT}まで', + 'mesh.joinedMeshMenu': '✔【{MESH_ID}】 ⏳️{EXPIRES_AT}まで', + 'mesh.domain': 'ドメイン: {domain}', + 'mesh.domainNotSet': '未設定', + 'mesh.domainModalTitle': 'meshV2 ドメイン設定', + 'mesh.domainPlaceholder': 'ドメイン名を入力...', + 'mesh.domainSaveButton': '保存', + 'mesh.domainCancelButton': 'キャンセル', + 'mesh.domainConnectedAlert': 'meshV2が接続中です。ドメインを変更するには、まず切断してください。', + 'mesh.domainInvalidError': 'ドメイン名に使用できない文字が含まれています。', + 'mesh.domainTooLongError': 'ドメイン名が長すぎます(最大256文字)。', + 'mesh.domainDescription': 'ホストが表示されない場合はドメインを設定してください。学校などの施設の郵便番号が最適です。', + 'mesh.domainExampleTitle': '例', + 'mesh.domainExample': '100-0014', + 'gui.smalruby3.extension.smalrubotS1.name': 'スモウルボットS1', + 'gui.smalruby3.extension.smalrubotS1.description': 'スモウルボットS1を制御する。', + 'gui.smalruby3.extension.smalrubotS1.connectingMessage': 'スモウルボットS1に接続しています。', + 'smalrubotS1.categoryName': 'スモウルボットS1', + 'smalrubotS1.action': '[ACTION] (M1, M2)', + 'smalrubotS1.actionAndStopAfter': '[SECS] 秒 [ACTION] (M1, M2)', + 'smalrubotS1.bendArm': '[SECS] 秒でアーム (D10) を [DEGREE] 度に曲げる', + 'smalrubotS1.getSensorValue': '[POSITION] のセンサー', + 'smalrubotS1.turnLedOn': '[POSITION] のLEDをオンにする (左:A0, 右:A1)', + 'smalrubotS1.turnLedOff': '[POSITION] のLEDをオフにする (左:A0, 右:A1)', + 'smalrubotS1.getMotorSpeed': '[POSITION] DCモーターの速度 (%) (左:M1, 右:M2)', + 'smalrubotS1.setMotorSpeed': '[POSITION] DCモーターの速度を [SPEED] (%) にする (左:M1, 右:M2)', + 'smalrubotS1.setArmCalibration': 'アーム (D10) を [DEGREE] 度調整する', + 'smalrubotS1.actionMenu.forward': '進める', + 'smalrubotS1.actionMenu.backward': 'バックさせる', + 'smalrubotS1.actionMenu.turnLeft': '左に曲げる', + 'smalrubotS1.actionMenu.turnRight': '右に曲げる', + 'smalrubotS1.actionMenu.stop': '止める', + 'smalrubotS1.positionsMenu.left': '左', + 'smalrubotS1.positionsMenu.right': '右', + 'smalrubotS1.sensorPositionsMenu.left': '左 (A4)', + 'smalruby3.sensorPositionsMenu.right': '右 (A5)', + 'smalrubotS1.sensorPositionsMenu.touch': 'タッチ (A2)', + 'smalrubotS1.sensorPositionsMenu.light': '光 (A6)', + 'smalrubotS1.sensorPositionsMenu.sound': '音 (A7)', + 'gui.smalruby3.blockDisplayModal.title': 'ブロック表示設定', + 'gui.smalruby3.blockDisplayModal.selectAll': 'すべて選択', + 'gui.smalruby3.blockDisplayModal.selectNone': 'すべて選択解除', + 'gui.smalruby3.blockDisplayModal.alwaysVisible': '常に表示', + 'gui.smalruby3.blockDisplayModal.extensions': '拡張機能', + 'gui.smalruby3.blockDisplayModal.categoriesTitle': 'カテゴリ:', + 'gui.smalruby3.blockDisplayModal.alwaysVisibleTitle': '常に表示:', + 'gui.smalruby3.blockDisplayModal.blocksSubtitle': 'ブロック', + 'gui.smalruby3.blockDisplayModal.copyUrl': 'URLのコピー', + 'gui.smalruby3.blockDisplayModal.saveToFile': 'ファイルに設定', + 'gui.menuBar.blockDisplay': 'ブロック表示...', + 'gui.menuBar.learn': '学ぶ', + + // Block Display Modal - Block Messages + // Motion blocks + 'gui.smalruby3.blockDisplayModal.motion_movesteps': '(10) 歩動かす', + 'gui.smalruby3.blockDisplayModal.motion_turnright': '↻ (15) 度回す', + 'gui.smalruby3.blockDisplayModal.motion_turnleft': '↺ (15) 度回す', + 'gui.smalruby3.blockDisplayModal.motion_goto': '(どこかの場所▼) へ行く', + 'gui.smalruby3.blockDisplayModal.motion_gotoxy': 'x座標を (0) 、y座標を (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_glideto': '(1) 秒で (どこかの場所▼) へ滑るように移動する', + 'gui.smalruby3.blockDisplayModal.motion_glidesecstoxy': '(1) 秒でx座標を (0) 、y座標を (0) へ滑るように移動する', + 'gui.smalruby3.blockDisplayModal.motion_pointindirection': '(90) 度に向ける', + 'gui.smalruby3.blockDisplayModal.motion_pointtowards': '(マウスのポインター▼) へ向ける', + 'gui.smalruby3.blockDisplayModal.motion_changexby': 'x座標を (10) ずつ変える', + 'gui.smalruby3.blockDisplayModal.motion_setx': 'x座標を (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_changeyby': 'y座標を (10) ずつ変える', + 'gui.smalruby3.blockDisplayModal.motion_sety': 'y座標を (0) にする', + 'gui.smalruby3.blockDisplayModal.motion_ifonedgebounce': 'もし端に着いたら、跳ね返る', + 'gui.smalruby3.blockDisplayModal.motion_setrotationstyle': '回転方法を [左右のみ▼] にする', + + // Looks blocks + 'gui.smalruby3.blockDisplayModal.looks_sayforsecs': '(こんにちは) と (2) 秒言う', + 'gui.smalruby3.blockDisplayModal.looks_say': '(こんにちは) と言う', + 'gui.smalruby3.blockDisplayModal.looks_thinkforsecs': '(うーん...) と (2) 秒考える', + 'gui.smalruby3.blockDisplayModal.looks_think': '(うーん...) と考える', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdropto': '背景を (背景1) にする', + 'gui.smalruby3.blockDisplayModal.looks_switchbackdroptoandwait': '【ステージ】背景を (背景1) にして待つ', + 'gui.smalruby3.blockDisplayModal.looks_nextbackdrop': '次の背景にする', + 'gui.smalruby3.blockDisplayModal.looks_switchcostumeto': 'コスチュームを (コスチューム1▼) にする', + 'gui.smalruby3.blockDisplayModal.looks_nextcostume': '次のコスチュームにする', + 'gui.smalruby3.blockDisplayModal.looks_changesizeby': '大きさを (10) ずつ変える', + 'gui.smalruby3.blockDisplayModal.looks_setsizeto': '大きさを (100) %にする', + 'gui.smalruby3.blockDisplayModal.looks_changeeffectby': '[色▼] の効果を (25) ずつ変える', + 'gui.smalruby3.blockDisplayModal.looks_seteffectto': '[色▼] の効果を (0) にする', + 'gui.smalruby3.blockDisplayModal.looks_cleargraphiceffects': '画像効果をなくす', + 'gui.smalruby3.blockDisplayModal.looks_show': '表示する', + 'gui.smalruby3.blockDisplayModal.looks_hide': '隠す', + 'gui.smalruby3.blockDisplayModal.looks_gotofrontback': '[最前面▼] へ移動する', + 'gui.smalruby3.blockDisplayModal.looks_goforwardbackwardlayers': '(1) 層 [手前に出す▼]', + 'gui.smalruby3.blockDisplayModal.looks_costumenumbername': 'コスチュームの [番号▼]', + 'gui.smalruby3.blockDisplayModal.looks_backdropnumbername': '背景の [番号▼]', + 'gui.smalruby3.blockDisplayModal.looks_size': '大きさ', + + // Sound blocks + 'gui.smalruby3.blockDisplayModal.sound_playuntildone': '終わるまで (Meow▼) の音を鳴らす', + 'gui.smalruby3.blockDisplayModal.sound_play': '(Meow▼) の音を鳴らす', + 'gui.smalruby3.blockDisplayModal.sound_stopallsounds': 'すべての音を止める', + 'gui.smalruby3.blockDisplayModal.sound_changeeffectby': '[ピッチ▼] の効果を (10) ずつ変える', + 'gui.smalruby3.blockDisplayModal.sound_seteffectto': '[ピッチ▼] の効果を (100) にする', + 'gui.smalruby3.blockDisplayModal.sound_cleareffects': '音の効果をなくす', + 'gui.smalruby3.blockDisplayModal.sound_changevolumeby': '音量を (-10) ずつ変える', + 'gui.smalruby3.blockDisplayModal.sound_setvolumeto': '音量を (100) %にする', + + // Event blocks + 'gui.smalruby3.blockDisplayModal.event_whenflagclicked': '🏁 が押されたとき', + 'gui.smalruby3.blockDisplayModal.event_whenkeypressed': '[スペース▼] キーが押されたとき', + 'gui.smalruby3.blockDisplayModal.event_whenthisspriteclicked': 'このスプライトが押されたとき', + 'gui.smalruby3.blockDisplayModal.event_whenbackdropswitchesto': '背景が [背景1] になったとき', + 'gui.smalruby3.blockDisplayModal.event_whengreaterthan': '[音量▼] > (10) のとき', + 'gui.smalruby3.blockDisplayModal.event_whenbroadcastreceived': '[メッセージ1▼] を受け取ったとき', + 'gui.smalruby3.blockDisplayModal.event_broadcast': '(メッセージ1▼) を送る', + 'gui.smalruby3.blockDisplayModal.event_broadcastandwait': '(メッセージ1▼) を送って待つ', + + // Control blocks + 'gui.smalruby3.blockDisplayModal.control_wait': '(1) 秒待つ', + 'gui.smalruby3.blockDisplayModal.control_repeat': '(10) 回繰り返す', + 'gui.smalruby3.blockDisplayModal.control_forever': 'ずっと', + 'gui.smalruby3.blockDisplayModal.control_if': 'もし 〔 〕 なら', + 'gui.smalruby3.blockDisplayModal.control_if_else': 'もし 〔 〕 なら', + 'gui.smalruby3.blockDisplayModal.control_wait_until': '〔 〕 まで待つ', + 'gui.smalruby3.blockDisplayModal.control_repeat_until': '〔 〕 まで繰り返す', + 'gui.smalruby3.blockDisplayModal.control_stop': 'すべてを止める', + 'gui.smalruby3.blockDisplayModal.control_start_as_clone': 'クローンされたとき', + 'gui.smalruby3.blockDisplayModal.control_create_clone_of': '(自分自身▼) のクローンを作る', + 'gui.smalruby3.blockDisplayModal.control_delete_this_clone': 'このクローンを削除する', + + // Sensing blocks + 'gui.smalruby3.blockDisplayModal.sensing_touchingobject': '(マウスのポインター▼) に触れた', + 'gui.smalruby3.blockDisplayModal.sensing_touchingcolor': '色 🎨 に触れた', + 'gui.smalruby3.blockDisplayModal.sensing_coloristouchingcolor': '色 🎨 が色 🎨 に触れた', + 'gui.smalruby3.blockDisplayModal.sensing_distanceto': '(マウスのポインター▼) までの距離', + 'gui.smalruby3.blockDisplayModal.sensing_askandwait': '(あなたの名前は何ですか?) と聞いて待つ', + 'gui.smalruby3.blockDisplayModal.sensing_answer': '答え', + 'gui.smalruby3.blockDisplayModal.sensing_keypressed': '(スペース▼) キーが押された', + 'gui.smalruby3.blockDisplayModal.sensing_mousedown': 'マウスが押された', + 'gui.smalruby3.blockDisplayModal.sensing_mousex': 'マウスのx座標', + 'gui.smalruby3.blockDisplayModal.sensing_mousey': 'マウスのy座標', + 'gui.smalruby3.blockDisplayModal.sensing_setdragmode': 'ドラッグモードを [できる▼] にする', + 'gui.smalruby3.blockDisplayModal.sensing_loudness': '音の大きさ', + 'gui.smalruby3.blockDisplayModal.sensing_timer': 'タイマー', + 'gui.smalruby3.blockDisplayModal.sensing_resettimer': 'タイマーをリセット', + 'gui.smalruby3.blockDisplayModal.sensing_of': '(ステージ▼) の [背景#▼]', + 'gui.smalruby3.blockDisplayModal.sensing_current': '現在の [年▼]', + 'gui.smalruby3.blockDisplayModal.sensing_dayssince2000': '2000年からの日数', + 'gui.smalruby3.blockDisplayModal.sensing_username': 'ユーザー名', + + // Operator blocks + 'gui.smalruby3.blockDisplayModal.operator_add': '( ) + ( )', + 'gui.smalruby3.blockDisplayModal.operator_subtract': '( ) - ( )', + 'gui.smalruby3.blockDisplayModal.operator_multiply': '( ) × ( )', + 'gui.smalruby3.blockDisplayModal.operator_divide': '( ) ÷ ( )', + 'gui.smalruby3.blockDisplayModal.operator_random': '(1) から (10) までの乱数', + 'gui.smalruby3.blockDisplayModal.operator_gt': '( ) > (50)', + 'gui.smalruby3.blockDisplayModal.operator_lt': '( ) < (50)', + 'gui.smalruby3.blockDisplayModal.operator_equals': '( ) = (50)', + 'gui.smalruby3.blockDisplayModal.operator_and': '〔 〕 かつ 〔 〕', + 'gui.smalruby3.blockDisplayModal.operator_or': '〔 〕 または 〔 〕', + 'gui.smalruby3.blockDisplayModal.operator_not': '〔 〕 ではない', + 'gui.smalruby3.blockDisplayModal.operator_join': '(りんご) と (バナナ) をつなげる', + 'gui.smalruby3.blockDisplayModal.operator_letter_of': '(りんご) の (1) 番目の文字', + 'gui.smalruby3.blockDisplayModal.operator_length': '(りんご) の長さ', + 'gui.smalruby3.blockDisplayModal.operator_contains': '(りんご) に (り) が含まれる', + 'gui.smalruby3.blockDisplayModal.operator_mod': '( ) を ( ) で割った余り', + 'gui.smalruby3.blockDisplayModal.operator_round': '( ) を四捨五入', + 'gui.smalruby3.blockDisplayModal.operator_mathop': '( ) の [絶対値▼]', + 'gui.extensionLibrary.showAllExtensions': 'すべての拡張機能を表示', + + // MicroBit More - Tilt gesture labels (override to match microbit extension) + 'mbitMore.gesturesMenu.tiltUp': '上に傾いた', + 'mbitMore.gesturesMenu.tiltDown': '下に傾いた', + 'mbitMore.gesturesMenu.tiltLeft': '左に傾いた', + 'mbitMore.gesturesMenu.tiltRight': '右に傾いた', + 'gui.connection.updatePeripheral.doNotDisconnect': 'アップデート中はmicro:bitを外さないでください。', + 'gui.connection.scanning.updatePeripheralPrompt': 'micro:bitを最新のファームウェアにアップデートしてください。', + 'gui.connection.updatePeripheral.microbitMoreUpdateSuccessful': 'MicrobitMoreのアップデートに成功しました!', + 'gui.connection.updatePeripheral.microbitMoreTiltToLightUp': 'micro:bitを傾けて25個のLEDをすべて点灯させると完了です。', + 'gui.connection.scanning.updatePeripheralButton': 'アップデート', + 'gui.connection.auto-scanning.updatePeripheralButton': 'アップデート' +}; diff --git a/packages/scratch-gui/src/reducers/locales.js b/packages/scratch-gui/src/reducers/locales.js index 1ac81ba6fcc..8d9a618296a 100644 --- a/packages/scratch-gui/src/reducers/locales.js +++ b/packages/scratch-gui/src/reducers/locales.js @@ -1,5 +1,5 @@ import {isRtl} from 'scratch-l10n'; -import editorMessages from 'scratch-l10n/locales/editor-msgs'; +import editorMessages from '../locales'; const UPDATE_LOCALES = 'scratch-gui/locales/UPDATE_LOCALES'; const SELECT_LOCALE = 'scratch-gui/locales/SELECT_LOCALE'; diff --git a/packages/scratch-gui/static/pwa-icon.png b/packages/scratch-gui/static/pwa-icon.png new file mode 100644 index 00000000000..5c20f6d9129 Binary files /dev/null and b/packages/scratch-gui/static/pwa-icon.png differ diff --git a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx index e679b632906..cfa0843feb8 100644 --- a/packages/scratch-gui/test/unit/components/menu-bar.test.jsx +++ b/packages/scratch-gui/test/unit/components/menu-bar.test.jsx @@ -32,6 +32,42 @@ describe('MenuBar Component', () => { vm: new VM(), platform: { platform: PLATFORM.WEB + }, + targets: { + editingTarget: 'target-id' + }, + rubyCode: { + target: null, + code: '', + modified: false, + errors: [], + markers: [], + fontSize: 16 + }, + koshienFile: { + extensionLoadCounter: 0, + aiSaveStatus: {} + }, + googleDriveFile: { + isGoogleDriveFile: false + }, + meshV2: { + domain: null + }, + projectChanged: false, + projectTitle: 'Untitled' + }, + session: { + session: { + user: { + username: 'test-user', + membership_avatar_badge: null, + thumbnailUrl: '' + } + }, + permissions: { + educator: false, + student: false } } }); @@ -65,8 +101,7 @@ describe('MenuBar Component', () => { test('not clicking on About button does not call the handler', () => { const onClickAbout = jest.fn(); - const {container} = renderWithIntl(getComponent({onClickAbout})); - const button = container.querySelector('button'); + renderWithIntl(getComponent({onClickAbout})); expect(onClickAbout).toHaveBeenCalledTimes(0); }); diff --git a/packages/scratch-gui/test/unit/components/monitor.test.jsx b/packages/scratch-gui/test/unit/components/monitor.test.jsx index 853510adcc1..0ab84ae12af 100644 --- a/packages/scratch-gui/test/unit/components/monitor.test.jsx +++ b/packages/scratch-gui/test/unit/components/monitor.test.jsx @@ -3,8 +3,41 @@ import {render} from '@testing-library/react'; import Monitor from '../../../src/components/monitor/monitor'; import {DARK_MODE, DEFAULT_MODE} from '../../../src/lib/settings/color-mode'; -jest.mock('../../../src/lib/settings/color-mode/default'); -jest.mock('../../../src/lib/settings/color-mode/dark'); +jest.mock('../../../src/lib/settings/color-mode/default', () => ({ + blockColors: { + motion: { + primary: '#111111', + secondary: '#222222', + tertiary: '#333333' + }, + pen: { + primary: '#121212', + secondary: '#232323', + tertiary: '#343434' + }, + text: '#444444', + workspace: '#555555' + } +})); + +jest.mock('../../../src/lib/settings/color-mode/dark', () => ({ + blockColors: { + motion: { + primary: '#AAAAAA' + }, + pen: { + primary: '#FFFFFF', + secondary: '#EEEEEE', + tertiary: '#DDDDDD' + }, + text: '#BBBBBB' + }, + extensions: { + pen: { + blockIconURI: 'darkPenIcon' + } + } +})); describe('Monitor Component', () => { const noop = jest.fn(); diff --git a/packages/scratch-gui/test/unit/containers/ruby-downloader.test.jsx b/packages/scratch-gui/test/unit/containers/ruby-downloader.test.jsx index 9a3acc39f3b..6f9bcc1ee9b 100644 --- a/packages/scratch-gui/test/unit/containers/ruby-downloader.test.jsx +++ b/packages/scratch-gui/test/unit/containers/ruby-downloader.test.jsx @@ -1,9 +1,13 @@ import React from 'react'; -import {mount} from 'enzyme'; +import {render, fireEvent, waitFor} from '@testing-library/react'; import {Provider} from 'react-redux'; import configureStore from 'redux-mock-store'; import RubyDownloader from '../../../src/containers/ruby-downloader'; -import VM from 'scratch-vm'; +import _RubyGenerator from '../../../src/lib/ruby-generator'; + +jest.mock('../../../src/lib/ruby-generator', () => ({ + targetsToCode: jest.fn(() => 'mocked ruby code') +})); describe('RubyDownloader Container', () => { const mockStore = configureStore(); @@ -11,10 +15,13 @@ describe('RubyDownloader Container', () => { let vm; beforeEach(() => { - vm = new VM(); - vm.runtime.targets = [ - {id: 'stage', blocks: {}, isStage: true} - ]; + vm = { + runtime: { + targets: [ + {id: 'stage', blocks: {}, isStage: true} + ] + } + }; store = mockStore({ scratchGui: { koshienFile: { @@ -37,32 +44,27 @@ describe('RubyDownloader Container', () => { window.showSaveFilePicker = jest.fn(); }); - test('calls onSaveError when showSaveFilePicker rejects', (done) => { - const error = {name: 'AbortError', message: 'Abort'}; + test('calls onSaveError when showSaveFilePicker rejects', async () => { + const error = new Error('Abort'); + error.name = 'AbortError'; window.showSaveFilePicker.mockImplementation(() => Promise.reject(error)); - const onSaveError = (err) => { - try { - expect(err).toBe(error); - done(); - } catch (e) { - done.fail(e); - } - }; + const onSaveError = jest.fn(); - const wrapper = mount( + const {getByText} = render( {(className, downloadProject) => ( - + )} ); - // Mock saveRuby to avoid complex VM dependencies - wrapper.find('RubyDownloader').instance().saveRuby = jest.fn(() => new Blob(['test'], {type: 'text/plain'})); + fireEvent.click(getByText('Download')); - wrapper.find('#download-button').simulate('click'); + await waitFor(() => { + expect(onSaveError).toHaveBeenCalledWith(error); + }); }); -}); \ No newline at end of file +}); diff --git a/packages/scratch-gui/test/unit/empty-block-selection.test.js b/packages/scratch-gui/test/unit/empty-block-selection.test.js index e6a5ce7687f..183ad66af5b 100644 --- a/packages/scratch-gui/test/unit/empty-block-selection.test.js +++ b/packages/scratch-gui/test/unit/empty-block-selection.test.js @@ -1,13 +1,12 @@ /** - * @fileoverview Test for empty block selection filtering behavior + * @file Test for empty block selection filtering behavior */ import makeToolboxXML from '../../src/lib/make-toolbox-xml'; -import {defaultColors} from '../../src/lib/settings/themes'; +import {defaultColors} from '../../src/lib/settings/color-mode'; describe('Empty block selection filtering', () => { test('should show no blocks when empty allowed patterns are provided', () => { - const emptyPatterns = []; const targetId = 'testSprite'; const xml = makeToolboxXML(false, false, targetId, [], '', '', '', defaultColors, '', true); @@ -50,4 +49,4 @@ describe('Empty block selection filtering', () => { expect(xml).toContain('type="sensing_touchingobject"'); expect(xml).toContain('type="operator_add"'); }); -}); \ No newline at end of file +}); diff --git a/packages/scratch-gui/test/unit/util/color-modes.test.js b/packages/scratch-gui/test/unit/util/color-modes.test.js index ba0e315daa5..469b879241c 100644 --- a/packages/scratch-gui/test/unit/util/color-modes.test.js +++ b/packages/scratch-gui/test/unit/util/color-modes.test.js @@ -8,8 +8,41 @@ import { import {injectExtensionBlockMode, injectExtensionCategoryMode} from '../../../src/lib/settings/color-mode/blockHelpers'; import {detectColorMode, persistColorMode} from '../../../src/lib/settings/color-mode/persistence'; -jest.mock('../../../src/lib/settings/color-mode/default'); -jest.mock('../../../src/lib/settings/color-mode/dark'); +jest.mock('../../../src/lib/settings/color-mode/default', () => ({ + blockColors: { + motion: { + primary: '#111111', + secondary: '#222222', + tertiary: '#333333' + }, + pen: { + primary: '#121212', + secondary: '#232323', + tertiary: '#343434' + }, + text: '#444444', + workspace: '#555555' + } +})); + +jest.mock('../../../src/lib/settings/color-mode/dark', () => ({ + blockColors: { + motion: { + primary: '#AAAAAA' + }, + pen: { + primary: '#FFFFFF', + secondary: '#EEEEEE', + tertiary: '#DDDDDD' + }, + text: '#BBBBBB' + }, + extensions: { + pen: { + blockIconURI: 'darkPenIcon' + } + } +})); describe('color modes', () => { let serializeToString; diff --git a/packages/scratch-gui/webpack.config.js b/packages/scratch-gui/webpack.config.js index 478cdd4b989..b00966cbc7f 100644 --- a/packages/scratch-gui/webpack.config.js +++ b/packages/scratch-gui/webpack.config.js @@ -1,9 +1,13 @@ const path = require('path'); const webpack = require('webpack'); +const fs = require('fs'); // Plugins const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); +const WorkboxPlugin = require('workbox-webpack-plugin'); +const WebpackPwaManifest = require('webpack-pwa-manifest'); +const assetsManifest = require('./src/assetsManifest.json'); const ScratchWebpackConfigBuilder = require('scratch-webpack-configuration'); @@ -51,7 +55,8 @@ const baseConfig = new ScratchWebpackConfigBuilder( resolve: { fallback: { Buffer: require.resolve('buffer/'), - stream: require.resolve('stream-browserify') + stream: require.resolve('stream-browserify'), + process: require.resolve('process/browser') }, alias: { 'opal': path.resolve(__dirname, 'opal/opal.min.js'), @@ -59,6 +64,9 @@ const baseConfig = new ScratchWebpackConfigBuilder( } } }) + .addPlugin(new webpack.ProvidePlugin({ + process: 'process/browser' + })) .addModuleRule({ test: /\.mjs$/, include: /node_modules/, @@ -85,7 +93,15 @@ const baseConfig = new ScratchWebpackConfigBuilder( 'process.env.DEBUG': Boolean(process.env.DEBUG), 'process.env.GA_ID': `"${process.env.GA_ID || 'UA-000000-01'}"`, 'process.env.GTM_ENV_AUTH': `"${process.env.GTM_ENV_AUTH || ''}"`, - 'process.env.GTM_ID': process.env.GTM_ID ? `"${process.env.GTM_ID}"` : null + 'process.env.GTM_ID': process.env.GTM_ID ? `"${process.env.GTM_ID}"` : null, + 'process.env.GOOGLE_CLIENT_ID': `"${process.env.GOOGLE_CLIENT_ID || ''}"`, + 'process.env.GOOGLE_API_KEY': `"${process.env.GOOGLE_API_KEY || ''}"`, + 'process.env.MESH_GRAPHQL_ENDPOINT': `"${process.env.MESH_GRAPHQL_ENDPOINT || ''}"`, + 'process.env.MESH_API_KEY': `"${process.env.MESH_API_KEY || ''}"`, + 'process.env.MESH_AWS_REGION': `"${process.env.MESH_AWS_REGION || ''}"`, + 'process.env.MESH_DATA_UPDATE_INTERVAL_MS': `"${process.env.MESH_DATA_UPDATE_INTERVAL_MS || ''}"`, + 'process.env.MESH_EVENT_BATCH_INTERVAL_MS': `"${process.env.MESH_EVENT_BATCH_INTERVAL_MS || ''}"`, + 'process.env.MESH_PERIODIC_DATA_SYNC_INTERVAL_MS': `"${process.env.MESH_PERIODIC_DATA_SYNC_INTERVAL_MS || ''}"` })) .addPlugin(new CopyWebpackPlugin({ patterns: [ @@ -194,35 +210,45 @@ const buildConfig = baseConfig.clone() ...commonHtmlWebpackPluginOptions, chunks: ['gui'], template: 'src/playground/index.ejs', - title: 'Scratch 3.0 GUI' + title: 'Scratch 3.0 GUI', + originTrials: JSON.parse(fs.readFileSync('origin-trials.json')), + pwa: process.env.NODE_ENV === 'production' })) .addPlugin(new HtmlWebpackPlugin({ ...commonHtmlWebpackPluginOptions, chunks: ['guistandalone'], filename: 'standalone.html', template: 'src/playground/index.ejs', - title: 'Scratch 3.0 GUI: Standalone Mode' + title: 'Scratch 3.0 GUI: Standalone Mode', + originTrials: JSON.parse(fs.readFileSync('origin-trials.json')), + pwa: process.env.NODE_ENV === 'production' })) .addPlugin(new HtmlWebpackPlugin({ ...commonHtmlWebpackPluginOptions, chunks: ['blocksonly'], filename: 'blocks-only.html', template: 'src/playground/index.ejs', - title: 'Scratch 3.0 GUI: Blocks Only Example' + title: 'Scratch 3.0 GUI: Blocks Only Example', + originTrials: JSON.parse(fs.readFileSync('origin-trials.json')), + pwa: process.env.NODE_ENV === 'production' })) .addPlugin(new HtmlWebpackPlugin({ ...commonHtmlWebpackPluginOptions, chunks: ['compatibilitytesting'], filename: 'compatibility-testing.html', template: 'src/playground/index.ejs', - title: 'Scratch 3.0 GUI: Compatibility Testing' + title: 'Scratch 3.0 GUI: Compatibility Testing', + originTrials: JSON.parse(fs.readFileSync('origin-trials.json')), + pwa: process.env.NODE_ENV === 'production' })) .addPlugin(new HtmlWebpackPlugin({ ...commonHtmlWebpackPluginOptions, chunks: ['player'], filename: 'player.html', template: 'src/playground/index.ejs', - title: 'Scratch 3.0 GUI: Player Example' + title: 'Scratch 3.0 GUI: Player Example', + originTrials: JSON.parse(fs.readFileSync('origin-trials.json')), + pwa: process.env.NODE_ENV === 'production' })) .addPlugin(new CopyWebpackPlugin({ patterns: [ @@ -238,6 +264,42 @@ const buildConfig = baseConfig.clone() ] })); +const buildWithPwaConfig = buildConfig.clone() + .addPlugin( + new WorkboxPlugin.GenerateSW({ + disableDevLogs: !process.env.DEBUG, + clientsClaim: true, + skipWaiting: true, + additionalManifestEntries: assetsManifest, + exclude: [ + /\.DS_Store/ + ], + maximumFileSizeToCacheInBytes: 32 * 1024 * 1024 + }) + ) + .addPlugin( + new WebpackPwaManifest({ + publicPath: './', + name: 'Smalruby', + short_name: 'Smalruby', + description: 'GraphicaL User Interface for creating and running Smalruby 3.0 projects', + background_color: '#ffffff', + orientation: 'any', + crossorigin: 'use-credentials', + inject: true, + ios: { + 'apple-mobile-web-app-title': 'Smalruby', + 'apple-mobile-web-app-status-bar-style': 'default' + }, + icons: [ + { + src: path.resolve('static/pwa-icon.png'), + sizes: [96, 128, 192, 256, 384, 512] // multiple sizes + } + ] + }) + ); + // Skip building `dist/` unless explicitly requested // It roughly doubles build time and isn't needed for `scratch-gui` development // If you need non-production `dist/` for local dev, such as for `scratch-www` work, you can run something like: @@ -248,7 +310,19 @@ let config; switch (process.env.BUILD_TYPE) { case 'dist': config = distConfig.get(); break; case 'dist-standalone': config = distStandaloneConfig.get(); break; -default: config = buildConfig.get(); break; +default: config = buildWithPwaConfig.get(); break; +} + +const finalConfig = buildDist ? config : buildWithPwaConfig.get(); + +// Override devServer headers to allow Google Picker API to work +// Must be done after .get() to ensure it's not overridden by ScratchWebpackConfigBuilder +if (!buildDist && finalConfig.devServer) { + finalConfig.devServer.headers = { + ...finalConfig.devServer.headers, + 'Cross-Origin-Opener-Policy': 'unsafe-none', + 'Cross-Origin-Embedder-Policy': 'unsafe-none' + }; } -module.exports = buildDist ? config : buildConfig.get(); +module.exports = finalConfig;