diff --git a/.changeset/forty-llamas-act.md b/.changeset/forty-llamas-act.md new file mode 100644 index 0000000..5ade482 --- /dev/null +++ b/.changeset/forty-llamas-act.md @@ -0,0 +1,5 @@ +--- +"@minima-global/image": patch +--- + +package release diff --git a/.gitignore b/.gitignore index 7118f71..bb35bdf 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ dist-ssr server/dist public/dist .vscode +build # Local env files .env diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..f301b3b --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + { + "associatedIndex": 4 +} + + + + + + + + + + + + + + + 1738599498285 + + + + + + \ No newline at end of file diff --git a/package.json b/package.json index 367f4fc..17ff446 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "check-format": "turbo check-format", "local-release": "changeset version && changeset publish", "ci": "turbo ci && turbo format && turbo check-format", - "test": "turbo test" + "test": "turbo test", + "private-version": "changeset version", + "private-publish": "changeset publish --access restricted" }, "workspaces": [ "tests/*", diff --git a/packages/image/CHANGELOG.md b/packages/image/CHANGELOG.md new file mode 100644 index 0000000..728af60 --- /dev/null +++ b/packages/image/CHANGELOG.md @@ -0,0 +1,7 @@ +# @minima-global/image + +## 1.2.3 + +### Patch Changes + +- da84c83: test-release diff --git a/packages/image/package-lock.json b/packages/image/package-lock.json new file mode 100644 index 0000000..b15b12c --- /dev/null +++ b/packages/image/package-lock.json @@ -0,0 +1,682 @@ +{ + "name": "@minima-global-image", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@minima-global-image", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "tslib": "^2.8.1" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-typescript": "^12.1.2", + "@types/node": "^22.13.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rollup": "^4.34.1", + "rollup-plugin-peer-deps-external": "^2.2.4", + "typescript": "^5.7.3" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "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-typescript": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", + "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.1.tgz", + "integrity": "sha512-kwctwVlswSEsr4ljpmxKrRKp1eG1v2NAhlzFzDf1x1OdYaMjBYjDCbHkzWm57ZXzTwqn8stMXgROrnMw8dJK3w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.1.tgz", + "integrity": "sha512-4H5ZtZitBPlbPsTv6HBB8zh1g5d0T8TzCmpndQdqq20Ugle/nroOyDMf9p7f88Gsu8vBLU78/cuh8FYHZqdXxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.1.tgz", + "integrity": "sha512-f2AJ7Qwx9z25hikXvg+asco8Sfuc5NCLg8rmqQBIOUoWys5sb/ZX9RkMZDPdnnDevXAMJA5AWLnRBmgdXGEUiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.1.tgz", + "integrity": "sha512-+/2JBrRfISCsWE4aEFXxd+7k9nWGXA8+wh7ZUHn/u8UDXOU9LN+QYKKhd57sIn6WRcorOnlqPMYFIwie/OHXWw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.1.tgz", + "integrity": "sha512-SUeB0pYjIXwT2vfAMQ7E4ERPq9VGRrPR7Z+S4AMssah5EHIilYqjWQoTn5dkDtuIJUSTs8H+C9dwoEcg3b0sCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.1.tgz", + "integrity": "sha512-L3T66wAZiB/ooiPbxz0s6JEX6Sr2+HfgPSK+LMuZkaGZFAFCQAHiP3dbyqovYdNaiUXcl9TlgnIbcsIicAnOZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.1.tgz", + "integrity": "sha512-UBXdQ4+ATARuFgsFrQ+tAsKvBi/Hly99aSVdeCUiHV9dRTTpMU7OrM3WXGys1l40wKVNiOl0QYY6cZQJ2xhKlQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.1.tgz", + "integrity": "sha512-m/yfZ25HGdcCSwmopEJm00GP7xAUyVcBPjttGLRAqZ60X/bB4Qn6gP7XTwCIU6bITeKmIhhwZ4AMh2XLro+4+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.1.tgz", + "integrity": "sha512-Wy+cUmFuvziNL9qWRRzboNprqSQ/n38orbjRvd6byYWridp5TJ3CD+0+HUsbcWVSNz9bxkDUkyASGP0zS7GAvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.1.tgz", + "integrity": "sha512-CQ3MAGgiFmQW5XJX5W3wnxOBxKwFlUAgSXFA2SwgVRjrIiVt5LHfcQLeNSHKq5OEZwv+VCBwlD1+YKCjDG8cpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.1.tgz", + "integrity": "sha512-rSzb1TsY4lSwH811cYC3OC2O2mzNMhM13vcnA7/0T6Mtreqr3/qs6WMDriMRs8yvHDI54qxHgOk8EV5YRAHFbw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.1.tgz", + "integrity": "sha512-fwr0n6NS0pG3QxxlqVYpfiY64Fd1Dqd8Cecje4ILAV01ROMp4aEdCj5ssHjRY3UwU7RJmeWd5fi89DBqMaTawg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.1.tgz", + "integrity": "sha512-4uJb9qz7+Z/yUp5RPxDGGGUcoh0PnKF33QyWgEZ3X/GocpWb6Mb+skDh59FEt5d8+Skxqs9mng6Swa6B2AmQZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.1.tgz", + "integrity": "sha512-QlIo8ndocWBEnfmkYqj8vVtIUpIqJjfqKggjy7IdUncnt8BGixte1wDON7NJEvLg3Kzvqxtbo8tk+U1acYEBlw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.1.tgz", + "integrity": "sha512-hzpleiKtq14GWjz3ahWvJXgU1DQC9DteiwcsY4HgqUJUGxZThlL66MotdUEK9zEo0PK/2ADeZGM9LIondE302A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.1.tgz", + "integrity": "sha512-jqtKrO715hDlvUcEsPn55tZt2TEiBvBtCMkUuU0R6fO/WPT7lO9AONjPbd8II7/asSiNVQHCMn4OLGigSuxVQA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.1.tgz", + "integrity": "sha512-RnHy7yFf2Wz8Jj1+h8klB93N0NHNHXFhNwAmiy9zJdpY7DE01VbEVtPdrK1kkILeIbHGRJjvfBDBhnxBr8kD4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.1.tgz", + "integrity": "sha512-i7aT5HdiZIcd7quhzvwQ2oAuX7zPYrYfkrd1QFfs28Po/i0q6kas/oRrzGlDhAEyug+1UfUtkWdmoVlLJj5x9Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.1.tgz", + "integrity": "sha512-k3MVFD9Oq+laHkw2N2v7ILgoa9017ZMF/inTtHzyTVZjYs9cSH18sdyAf6spBAJIGwJ5UaC7et2ZH1WCdlhkMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz", + "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/react": { + "version": "19.0.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", + "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", + "dev": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz", + "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "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 + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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 + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "dev": true, + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.1.tgz", + "integrity": "sha512-iYZ/+PcdLYSGfH3S+dGahlW/RWmsqDhLgj1BT9DH/xXJ0ggZN7xkdP9wipPNjjNLczI+fmMLmTB9pye+d2r4GQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.1", + "@rollup/rollup-android-arm64": "4.34.1", + "@rollup/rollup-darwin-arm64": "4.34.1", + "@rollup/rollup-darwin-x64": "4.34.1", + "@rollup/rollup-freebsd-arm64": "4.34.1", + "@rollup/rollup-freebsd-x64": "4.34.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.1", + "@rollup/rollup-linux-arm-musleabihf": "4.34.1", + "@rollup/rollup-linux-arm64-gnu": "4.34.1", + "@rollup/rollup-linux-arm64-musl": "4.34.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.1", + "@rollup/rollup-linux-riscv64-gnu": "4.34.1", + "@rollup/rollup-linux-s390x-gnu": "4.34.1", + "@rollup/rollup-linux-x64-gnu": "4.34.1", + "@rollup/rollup-linux-x64-musl": "4.34.1", + "@rollup/rollup-win32-arm64-msvc": "4.34.1", + "@rollup/rollup-win32-ia32-msvc": "4.34.1", + "@rollup/rollup-win32-x64-msvc": "4.34.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-peer-deps-external": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz", + "integrity": "sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==", + "dev": true, + "peerDependencies": { + "rollup": "*" + } + }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "dev": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + } + } +} diff --git a/packages/image/package.json b/packages/image/package.json new file mode 100644 index 0000000..f0c8710 --- /dev/null +++ b/packages/image/package.json @@ -0,0 +1,41 @@ +{ + "name": "@minima-global/image", + "version": "1.5.2", + "type": "module", + "main": "dist/index.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "rollup -c", + "prepublishOnly": "npm run build", + "version-pkg": "changeset version", + "publish-pkg": "changeset publish --access restricted" + }, + "author": "", + "license": "ISC", + "peerDependencies": { + "react": ">=17.0.0" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-typescript": "^12.1.2", + "@types/node": "^22.13.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rollup": "^4.34.1", + "rollup-plugin-peer-deps-external": "^2.2.4", + "typescript": "^5.7.3" + }, + "dependencies": { + "tslib": "^2.8.1" + } +} diff --git a/packages/image/rollup.config.js b/packages/image/rollup.config.js new file mode 100644 index 0000000..16a89ff --- /dev/null +++ b/packages/image/rollup.config.js @@ -0,0 +1,24 @@ +import resolve from "@rollup/plugin-node-resolve" +import commonjs from "@rollup/plugin-commonjs" +import typescript from "@rollup/plugin-typescript" +import peerDepsExternal from "rollup-plugin-peer-deps-external" +export default { + input: "src/index.ts", + output: [ + { + file: "dist/index.js", + format: "cjs", + sourcemap: true, + }, + { + file: "dist/index.esm.js", + format: "esm", + sourcemap: true, + }, + ], + plugins: [ + peerDepsExternal(), + resolve(), + commonjs(), + typescript({ tsconfig: "./tsconfig.json" })], +} diff --git a/packages/image/src/components/Image.tsx b/packages/image/src/components/Image.tsx new file mode 100644 index 0000000..4addf8a --- /dev/null +++ b/packages/image/src/components/Image.tsx @@ -0,0 +1,118 @@ +import * as React from "react" +import { useEffect, useState } from "react" +import { DEFAULT_BASE64_IMAGE, fetchIPFSImage, getBase64Image, isBase64Image, isIPFSOrIPNS, isValidUrl } from "../utils" + +interface ImageProps { + src: string + alt?: string + className?: string +} + +type ImageType = "on-chain" | "external_url" | "ipfs" | "default" + +const Image: React.FC = ({ src, className = "", alt = "Custom token image" }) => { + const [imageData, setImageData] = useState(DEFAULT_BASE64_IMAGE) + const [imageType, setImageType] = useState("default") + const [isLoading, setIsLoading] = useState(true) + + useEffect(() => { + const processImageSource = async () => { + setIsLoading(true) + if (isIPFSOrIPNS(src)) { + try { + const ipfsUrl = await fetchIPFSImage(src) + setImageType("ipfs") + setImageData(ipfsUrl) + } catch (error) { + console.error("Failed to fetch IPFS image:", error) + setImageType("default") + setImageData(DEFAULT_BASE64_IMAGE) + } + } else if (isValidUrl(src)) { + setImageType("external_url") + setImageData(src) + } else if (isBase64Image(src)) { + const completeBase64Image = getBase64Image(src) + setImageType("on-chain") + setImageData(completeBase64Image) + } else { + setImageType("default") + setImageData(DEFAULT_BASE64_IMAGE) + } + setIsLoading(false) + } + + processImageSource() + }, [src]) + + const getWrapperStyle = (): React.CSSProperties => { + const baseStyle: React.CSSProperties = { + position: "relative", + overflow: "hidden", + } + + switch (imageType) { + case "on-chain": + return { ...baseStyle, width: "50px", height: "50px" } + case "external_url": + case "ipfs": + return { ...baseStyle, width: "100%", maxWidth: "300px", height: "300px" } + default: + return { ...baseStyle, width: "100px", height: "100px" } + } + } + + const loadingStyle: React.CSSProperties = { + position: "absolute", + top: 0, + left: 0, + width: "100%", + height: "100%", + display: "flex", + alignItems: "center", + justifyContent: "center", + backgroundColor: "#f3f4f6", + animation: "pulse 1.5s infinite ease-in-out", + } + + const imageStyle: React.CSSProperties = { + width: "100%", + height: "100%", + objectFit: "contain", + padding: imageType === "on-chain" ? "4px" : "0", + } + + return ( +
+ {isLoading ? ( +
+
+
+ ) : ( + {alt} + )} + +
+ ) +} + +export default Image + diff --git a/packages/image/src/components/index.ts b/packages/image/src/components/index.ts new file mode 100644 index 0000000..4ca8649 --- /dev/null +++ b/packages/image/src/components/index.ts @@ -0,0 +1 @@ +export { default as Image } from './Image'; diff --git a/packages/image/src/index.ts b/packages/image/src/index.ts new file mode 100644 index 0000000..590a7f4 --- /dev/null +++ b/packages/image/src/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './utils'; diff --git a/packages/image/src/utils/handbook.md b/packages/image/src/utils/handbook.md new file mode 100644 index 0000000..8dbc5f1 --- /dev/null +++ b/packages/image/src/utils/handbook.md @@ -0,0 +1,77 @@ +# Image Utility Functions + +This document outlines the various utility functions available for handling images in our application. These functions are particularly useful for processing, compressing, and fetching images from various sources, including base64 encodings and IPFS/IPNS. + +## Constants + +### DEFAULT_BASE64_IMAGE +A base64 encoded SVG image used as a default "Image Not Found" placeholder. + +## Functions + +### fileToBase64(file: File): Promise +Converts a File object to a base64 string. +- **Input**: A File object +- **Output**: A Promise that resolves to a base64 encoded string + +### compressImage(base64Image: string, quality = 0.7): Promise +Compresses a base64 image, resizing if necessary to 50k. +- **Input**: + - base64Image: A base64 encoded image string + - quality: Compression quality (default: 0.7) +- **Output**: A Promise that resolves to a compressed base64 encoded image string + +### isBase64Image(url: string): string | false +Checks if a string is a base64 encoded image. +- **Input**: A string that might be a base64 encoded image +- **Output**: The cleaned base64 string if valid, false otherwise + +### getMimeType(base64String: string): string +Determines the MIME type of a base64 encoded image. +- **Input**: A base64 encoded image string +- **Output**: The MIME type of the image + +### getBase64Image(imageData: string, defaultImage?: string): string +Processes base64 image data and returns a complete data URL. +- **Input**: + - imageData: Base64 encoded image data, potentially wrapped in tags + - defaultImage: Optional default image to return if processing fails +- **Output**: A complete data URL for the image + +### isIPFSOrIPNS(uri: string): boolean +Checks if a string is an IPFS/IPNS URI or gateway URL. +- **Input**: A string to check +- **Output**: Boolean indicating if the string is an IPFS/IPNS URI or gateway URL + +### fetchIPFSImage(uri: string, defaultImage?: string): Promise +Fetches an image from IPFS/IPNS using multiple gateways. +- **Input**: + - uri: The IPFS/IPNS URI or gateway URL + - defaultImage: Optional default image to return if fetching fails +- **Output**: A Promise that resolves to the fetched image URL or the default image + +### isValidUrl(url: string): boolean +Checks if a string is a valid URL. +- **Input**: A string to check +- **Output**: Boolean indicating if the string is a valid URL + +## Usage + +These functions can be imported and used in your application to handle various image-related tasks, such as uploading, displaying, and fetching images from decentralized storage systems. + +Example: + +```typescript +import { compressImage, isIPFSOrIPNS, fetchIPFSImage } from './image-utils'; + +// Compress an image before uploading +const compressedImage = await compressImage(base64Image, 0.8); + +// Check if a URI is IPFS/IPNS +const isIPFS = isIPFSOrIPNS('ipfs://QmX...'); + +// Fetch an image from IPFS +const imageUrl = await fetchIPFSImage('ipfs://QmX...'); +``` + +Remember to handle errors and edge cases when using these functions in your application. diff --git a/packages/image/src/utils/index.ts b/packages/image/src/utils/index.ts new file mode 100644 index 0000000..90e6835 --- /dev/null +++ b/packages/image/src/utils/index.ts @@ -0,0 +1,297 @@ +/** + * Helper functions to help with compressing on-chain uploaded images + */ + +/** + * Default base64 encoded image (a simple 1x1 pixel transparent PNG) + */ +export const DEFAULT_BASE64_IMAGE = + "data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHZpZXdCb3g9IjAgMCAyMDAgMjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxyZWN0IHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZjBmMGYwIi8+CiAgPHBhdGggZD0iTTQwIDYwaDEyMHY4MEg0MFY2MHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHBhdGggZD0iTTYwIDEwMGwyMC0yMGwyMCAyMGwyMC0yMGwyMCAyMCIgc3Ryb2tlPSIjY2NjIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz4KICA8Y2lyY2xlIGN4PSIxNDAiIGN5PSI4MCIgcj0iMTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNTAiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjOTk5Ij5JbWFnZSBOb3QgRm91bmQ8L3RleHQ+Cjwvc3ZnPg==" + +/** + * Add an image file, it should give you back a base64 data type representation + * @param file + */ +export const fileToBase64 = (file: File): Promise => { + return new Promise((resolve) => { + const fileRead = new FileReader(); + fileRead.readAsDataURL(file); + fileRead.onload = async () => { + const base64 = fileRead.result as string; + resolve(base64); + }; + + fileRead.onerror = () => { + resolve( + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIEdlbmVyYXRvcjogU1ZHIFJlcG8gTWl4ZXIgVG9vbHMgLS0+Cjxzdmcgd2lkdGg9IjgwMHB4IiBoZWlnaHQ9IjgwMHB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQogICAgPGcgY29sb3I9IiMwMDAwMDAiIGZvbnQtd2VpZ2h0PSI0MDAiIGZvbnQtZmFtaWx5PSJVYnVudHUiIGxldHRlci1zcGFjaW5nPSIwIiB3b3JkLXNwYWNpbmc9IjAiIHdoaXRlLXNwYWNlPSJub3JtYWwiIGZpbGw9ImdyYXkiPg0KICAgICAgICA8cGF0aCBkPSJNOCAyYTIuODQgMi44NCAwIDAgMC0xLjEyLjIyMWMtLjM0NS4xNDEtLjY1MS4zNDgtLjkwNi42MTV2LjAwM2wtLjAwMS4wMDJjLS4yNDguMjY5LS40NC41OTItLjU3NC45Ni0uMTM3LjM2Ny0uMjAzLjc2OS0uMjAzIDEuMiAwIC40MzUuMDY1Ljg0MS4yMDMgMS4yMDkuMTM1LjM2MS4zMjcuNjguNTc0Ljk1bC4wMDEuMDAyYy4yNTQuMjY3LjU1OC40NzcuOTAxLjYyNHYuMDAzYy4zNDYuMTQxLjcyMy4yMSAxLjEyLjIxLjM5NSAwIC43Ny0uMDY5IDEuMTE3LS4yMXYtLjAwMmMuMzQzLS4xNDcuNjQ0LS4zNTcuODkyLS42MjUuMjU1LS4yNjguNDUtLjU5LjU4Ni0uOTUyLjEzOC0uMzY4LjIwNC0uNzc0LjIwNC0xLjIxaC4wMWMwLS40My0uMDY1LS44MzEtLjIwMy0xLjE5OGEyLjc3MSAyLjc3MSAwIDAgMC0uNTg1LS45NjMgMi41IDIuNSAwIDAgMC0uODk3LS42MThBMi44MzUgMi44MzUgMCAwIDAgNy45OTkgMnpNOC4wMjQgMTAuMDAyYy0yLjMxNyAwLTMuNTYxLjIxMy00LjQ4Ni45MS0uNDYyLjM1LS43NjcuODI1LS45MzkgMS4zNzgtLjE3Mi41NTMtLjIyNi45NzUtLjIyOCAxLjcxTDggMTQuMDAyaDUuNjI5Yy0uMDAxLS43MzYtLjA1Mi0xLjE1OS0uMjI1LTEuNzEyLS4xNzItLjU1My0uNDc3LTEuMDI3LS45NC0xLjM3Ni0uOTIzLS42OTctMi4xMjQtLjkxMi00LjQ0LS45MTJ6IiBzdHlsZT0ibGluZS1oZWlnaHQ6MTI1JTstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidVYnVudHUsIE5vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LXBvc2l0aW9uOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC12YXJpYW50LW51bWVyaWM6bm9ybWFsO2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtaW5kZW50OjA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWRlY29yYXRpb24tbGluZTpub25lO3RleHQtZGVjb3JhdGlvbi1zdHlsZTpzb2xpZDt0ZXh0LWRlY29yYXRpb24tY29sb3I6IzAwMDAwMDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7c2hhcGUtcGFkZGluZzowO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIgb3ZlcmZsb3c9InZpc2libGUiLz4NCiAgICA8L2c+DQo8L3N2Zz4=", + ); + }; + }); +}; + + +/** + * Add a base64 representation of an image, it should give you back a compressed image ready for on-chain upload + * @param base64Image + * @param quality https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL#quality + */ +export const compressImage = async (base64Image: string, quality = 0.7): Promise => { + // Extract the MIME type from the base64 string + const mimeType = base64Image.substring(base64Image.indexOf(":") + 1, base64Image.indexOf(";")); + + return new Promise((resolve) => { + const img = new Image(); + img.src = base64Image; + + img.onload = () => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d') as CanvasRenderingContext2D; + + const MAX_IMAGE_SIZE = 50; // for that 50K HD resolution + + let imageWidth = img.width; + let imageHeight = img.height; + + if (imageWidth > MAX_IMAGE_SIZE || imageHeight > MAX_IMAGE_SIZE) { + // Calculate the aspect ratio + const aspectRatio = imageWidth / imageHeight; + + // Calculate the new width and height + if (imageWidth > imageHeight) { + imageWidth = MAX_IMAGE_SIZE; + imageHeight = MAX_IMAGE_SIZE / aspectRatio; + } else { + imageHeight = MAX_IMAGE_SIZE; + imageWidth = MAX_IMAGE_SIZE * aspectRatio; + } + } + + canvas.width = imageWidth; + canvas.height = imageHeight; + + ctx.drawImage(img, 0, 0, imageWidth, imageHeight); + + const compressedImage = canvas.toDataURL(mimeType, quality); + + // Extract the base64 content (the part after the comma) + const pureCompressedImage = compressedImage.slice(compressedImage.indexOf(',') + 1); + + // Create an XML structure to hold the base64 image data + const xmlString = ''; + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(xmlString, 'text/xml'); + + // Insert the base64 image content into the XML structure + xmlDoc.firstElementChild!.innerHTML = pureCompressedImage; + + // Serialize the XML back into a string + const serializer = new XMLSerializer(); + const serializedXML = serializer.serializeToString(xmlDoc); + + // Resolve the promise with the serialized XML + resolve(serializedXML); + }; + + img.onerror = () => { + // In case of error, resolve with the original image URL as a fallback + resolve(base64Image); + }; + }); +}; + +/** + * + * @param url - custom token url + */ +export const isBase64Image = (url: string): string | false => { + // Remove tags if present + const cleanedUrl = url.replace(/(.*?)<\/artimage>/, "$1").trim() + + // Check if the cleaned string is base64 encoded + try { + if (btoa(atob(cleanedUrl)) === cleanedUrl) { + return cleanedUrl; + } + } catch (err) { + return false + } + + return false +} + +/** + * Determines the MIME type of a base64 encoded image. + * @param base64String The base64 encoded image data. + * @returns The MIME type of the image. + */ +function getMimeType(base64String: string): string { + try { + // Decode the first few bytes of the base64 data + const decodedData = atob(base64String.substring(0, 8)); + const uint8Array = new Uint8Array(decodedData.length); + for (let i = 0; i < decodedData.length; i++) { + uint8Array[i] = decodedData.charCodeAt(i); + } + + // Determine the image type based on the magic numbers + if (uint8Array[0] === 0xff && uint8Array[1] === 0xd8 && uint8Array[2] === 0xff) { + return "image/jpeg"; + } else if (uint8Array[0] === 0x89 && uint8Array[1] === 0x50 && uint8Array[2] === 0x4e && uint8Array[3] === 0x47) { + return "image/png"; + } else if (uint8Array[0] === 0x47 && uint8Array[1] === 0x49 && uint8Array[2] === 0x46) { + return "image/gif"; + } else if (uint8Array[0] === 0x42 && uint8Array[1] === 0x4d) { + return "image/bmp"; + } + + // Check for SVG (look for XML declaration or SVG tag) + const svgCheck = atob(base64String.substring(0, 32)); + if (svgCheck.includes(' tags. + * @param defaultImage The default image to return if processing fails. + * @returns A complete data URL for the image. + */ +export const getBase64Image = (imageData: string, defaultImage: string = DEFAULT_BASE64_IMAGE): string => { + try { + // Remove tags if present + const cleanedUrl = imageData.replace(/(.*?)<\/artimage>/, "$1").trim(); + + // Determine MIME type and construct data URL + const mimeType = getMimeType(cleanedUrl); + return `data:${mimeType};base64,${cleanedUrl}`; + } catch (err) { + console.error(`Failed to create image data`, err); + return defaultImage; + } +} + +const IPFS_GATEWAYS = [ + "https://ipfs.io/ipfs/", + "https://gateway.pinata.cloud/ipfs/", + "https://cloudflare-ipfs.com/ipfs/", + "https://gateway.ipfs.io/ipfs/", + "https://dweb.link/ipfs/", // Added more reliable gateway + "https://ipfs.fleek.co/ipfs/", // Added another reliable gateway +]; + +const IPNS_GATEWAYS = [ + "https://ipfs.io/ipns/", + "https://gateway.pinata.cloud/ipns/", + "https://cloudflare-ipfs.com/ipns/", + "https://gateway.ipfs.io/ipns/", + "https://dweb.link/ipns/", + "https://ipfs.fleek.co/ipns/", +]; + +/** + * Checks if the given string is an IPFS/IPNS URI or gateway URL + * @param uri The string to check + * @returns boolean indicating if the string is an IPFS/IPNS URI or gateway URL + */ +export const isIPFSOrIPNS = (uri: string): boolean => { + // Check if it's an IPFS/IPNS URI + if (uri.startsWith("ipfs://") || uri.startsWith("ipfs:/ipfs/") || uri.startsWith("ipns://")) { + return true + } + + // Check if it's an IPFS/IPNS gateway URL + for (const gateway of [...IPFS_GATEWAYS, ...IPNS_GATEWAYS]) { + if (uri.includes(gateway)) { + return true + } + } + + // Check for IPFS hash pattern (Qm... or bafy...) + const ipfsHashRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,})/ + if (ipfsHashRegex.test(uri)) { + return true + } + + // Check for IPNS hash pattern + const ipnsHashRegex = /^(k[1-9A-HJ-NP-Za-km-z]{58,})/ + return ipnsHashRegex.test(uri) +} + +/** + * + * @param uri the data URL + * @param defaultImage add this if you want to use your own custom default image + */ + +export const fetchIPFSImage = async (uri: string, defaultImage = DEFAULT_BASE64_IMAGE): Promise => { + try { + // Determine if this is an IPNS or IPFS resource + const isIPNS = uri.includes("ipns/") || uri.includes("/ipns/") + const gateways = isIPNS ? IPNS_GATEWAYS : IPFS_GATEWAYS + + // Clean the URI - handle both direct URIs and full gateway URLs + let cid = uri + + // Handle full gateway URLs + if (cid.includes("/ipfs/") || cid.includes("/ipns/")) { + // Extract the CID from a full gateway URL + const parts = cid.split(/\/ip[fn]s\//) + cid = parts[parts.length - 1] + } else { + // Handle direct ipfs:// or ipns:// protocol URIs + cid = cid.replace("ipfs://", "").replace("ipns://", "") + } + + // Remove any trailing parameters (like :1) + cid = cid.split(":")[0] + + // Try each gateway in order + for (const gateway of gateways) { + try { + const response = await fetch(`${gateway}${cid}`, { + // Add fetch options to handle SSL issues + mode: "cors", + credentials: "omit", + }) + + if (response.ok) { + const blob = await response.blob() + return URL.createObjectURL(blob) + } + } catch (error) { + console.warn(`Failed to fetch from ${gateway}`, error) + // Continue to next gateway instead of returning defaultImage immediately + continue + } + } + + // If we've tried all gateways and none worked, return default image + console.error(`Failed to fetch from all ${isIPNS ? "IPNS" : "IPFS"} gateways`) + return defaultImage + } catch (error) { + console.error("Error in fetchIPFSImage:", error) + return defaultImage + } +} + +/** + * Checks if the given string is a valid URL + * @param url The string to check + * @returns boolean indicating if the string is a valid URL + */ +export const isValidUrl = (url: string): boolean => { + try { + new URL(url) + return true + } catch (error) { + return false + } +} + diff --git a/packages/image/tsconfig.json b/packages/image/tsconfig.json new file mode 100644 index 0000000..6864599 --- /dev/null +++ b/packages/image/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "lib": ["dom", "esnext"], + "jsx": "react", + "declaration": true, + "declarationDir": "dist", + "strict": true, + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83eec71..8f4f3aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: packages/create-minima-app: dependencies: '@minima-global/mds': - specifier: 0.14.7 + specifier: 0.14.9 version: link:../mds '@minima-global/minima-cli': specifier: 0.1.4 @@ -112,6 +112,46 @@ importers: specifier: ^5.0.0 version: 5.6.2 + packages/image: + dependencies: + tslib: + specifier: ^2.8.1 + version: 2.8.1 + devDependencies: + '@rollup/plugin-commonjs': + specifier: ^28.0.2 + version: 28.0.2(rollup@4.34.2) + '@rollup/plugin-node-resolve': + specifier: ^16.0.0 + version: 16.0.0(rollup@4.34.2) + '@rollup/plugin-typescript': + specifier: ^12.1.2 + version: 12.1.2(rollup@4.34.2)(tslib@2.8.1)(typescript@5.7.3) + '@types/node': + specifier: ^22.13.0 + version: 22.13.1 + '@types/react': + specifier: ^19.0.8 + version: 19.0.8 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.8) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + rollup: + specifier: ^4.34.1 + version: 4.34.2 + rollup-plugin-peer-deps-external: + specifier: ^2.2.4 + version: 2.2.4(rollup@4.34.2) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + packages/mds: dependencies: happy-dom: @@ -2609,6 +2649,62 @@ packages: - supports-color dev: false + /@rollup/plugin-commonjs@28.0.2(rollup@4.34.2): + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.34.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.2(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + rollup: 4.34.2 + dev: true + + /@rollup/plugin-node-resolve@16.0.0(rollup@4.34.2): + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.34.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + rollup: 4.34.2 + dev: true + + /@rollup/plugin-typescript@12.1.2(rollup@4.34.2)(tslib@2.8.1)(typescript@5.7.3): + resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.34.2) + resolve: 1.22.8 + rollup: 4.34.2 + tslib: 2.8.1 + typescript: 5.7.3 + dev: true + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -2617,127 +2713,149 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/rollup-android-arm-eabi@4.28.0: - resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} + /@rollup/pluginutils@5.1.4(rollup@4.34.2): + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + rollup: 4.34.2 + dev: true + + /@rollup/rollup-android-arm-eabi@4.34.2: + resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.28.0: - resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} + /@rollup/rollup-android-arm64@4.34.2: + resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.28.0: - resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} + /@rollup/rollup-darwin-arm64@4.34.2: + resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.28.0: - resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} + /@rollup/rollup-darwin-x64@4.34.2: + resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-freebsd-arm64@4.28.0: - resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} + /@rollup/rollup-freebsd-arm64@4.34.2: + resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /@rollup/rollup-freebsd-x64@4.28.0: - resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} + /@rollup/rollup-freebsd-x64@4.34.2: + resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.28.0: - resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} + /@rollup/rollup-linux-arm-gnueabihf@4.34.2: + resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-musleabihf@4.28.0: - resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} + /@rollup/rollup-linux-arm-musleabihf@4.34.2: + resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.28.0: - resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} + /@rollup/rollup-linux-arm64-gnu@4.34.2: + resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.28.0: - resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} + /@rollup/rollup-linux-arm64-musl@4.34.2: + resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.28.0: - resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} + /@rollup/rollup-linux-loongarch64-gnu@4.34.2: + resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.34.2: + resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.28.0: - resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} + /@rollup/rollup-linux-riscv64-gnu@4.34.2: + resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.28.0: - resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} + /@rollup/rollup-linux-s390x-gnu@4.34.2: + resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.28.0: - resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} + /@rollup/rollup-linux-x64-gnu@4.34.2: + resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.28.0: - resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} + /@rollup/rollup-linux-x64-musl@4.34.2: + resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.28.0: - resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} + /@rollup/rollup-win32-arm64-msvc@4.34.2: + resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.28.0: - resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} + /@rollup/rollup-win32-ia32-msvc@4.34.2: + resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.28.0: - resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} + /@rollup/rollup-win32-x64-msvc@4.34.2: + resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==} cpu: [x64] os: [win32] requiresBuild: true @@ -3058,10 +3176,6 @@ packages: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -3101,6 +3215,12 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@22.13.1: + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + dependencies: + undici-types: 6.20.0 + dev: true + /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} dependencies: @@ -3128,6 +3248,10 @@ packages: '@types/node': 20.14.10 dev: true + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true @@ -3616,7 +3740,7 @@ packages: /@vitest/snapshot@1.6.0: resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.10 + magic-string: 0.30.17 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -3810,7 +3934,7 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} dependencies: - tslib: 2.6.3 + tslib: 2.8.1 dev: false /async@3.2.5: @@ -4052,7 +4176,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /camelcase-css@2.0.1: @@ -4274,6 +4398,10 @@ packages: engines: {node: '>= 12'} dev: true + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + /compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} @@ -4447,6 +4575,11 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -4531,7 +4664,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /dotenv-expand@8.0.3: @@ -4925,7 +5058,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 dev: true /esutils@2.0.3: @@ -5471,6 +5604,10 @@ packages: engines: {node: '>=12'} dev: false + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} dev: true @@ -5483,6 +5620,12 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.6 + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -5754,7 +5897,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.3 + tslib: 2.8.1 dev: true /lru-cache@10.4.3: @@ -5994,7 +6137,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /node-emoji@2.1.3: @@ -6193,7 +6336,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /parent-module@1.0.1: @@ -6230,7 +6373,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /path-exists@4.0.0: @@ -6769,31 +6912,40 @@ packages: dependencies: glob: 7.2.3 - /rollup@4.28.0: - resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} + /rollup-plugin-peer-deps-external@2.2.4(rollup@4.34.2): + resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==} + peerDependencies: + rollup: '*' + dependencies: + rollup: 4.34.2 + dev: true + + /rollup@4.34.2: + resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.0 - '@rollup/rollup-android-arm64': 4.28.0 - '@rollup/rollup-darwin-arm64': 4.28.0 - '@rollup/rollup-darwin-x64': 4.28.0 - '@rollup/rollup-freebsd-arm64': 4.28.0 - '@rollup/rollup-freebsd-x64': 4.28.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 - '@rollup/rollup-linux-arm-musleabihf': 4.28.0 - '@rollup/rollup-linux-arm64-gnu': 4.28.0 - '@rollup/rollup-linux-arm64-musl': 4.28.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 - '@rollup/rollup-linux-riscv64-gnu': 4.28.0 - '@rollup/rollup-linux-s390x-gnu': 4.28.0 - '@rollup/rollup-linux-x64-gnu': 4.28.0 - '@rollup/rollup-linux-x64-musl': 4.28.0 - '@rollup/rollup-win32-arm64-msvc': 4.28.0 - '@rollup/rollup-win32-ia32-msvc': 4.28.0 - '@rollup/rollup-win32-x64-msvc': 4.28.0 + '@rollup/rollup-android-arm-eabi': 4.34.2 + '@rollup/rollup-android-arm64': 4.34.2 + '@rollup/rollup-darwin-arm64': 4.34.2 + '@rollup/rollup-darwin-x64': 4.34.2 + '@rollup/rollup-freebsd-arm64': 4.34.2 + '@rollup/rollup-freebsd-x64': 4.34.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.2 + '@rollup/rollup-linux-arm-musleabihf': 4.34.2 + '@rollup/rollup-linux-arm64-gnu': 4.34.2 + '@rollup/rollup-linux-arm64-musl': 4.34.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2 + '@rollup/rollup-linux-riscv64-gnu': 4.34.2 + '@rollup/rollup-linux-s390x-gnu': 4.34.2 + '@rollup/rollup-linux-x64-gnu': 4.34.2 + '@rollup/rollup-linux-x64-musl': 4.34.2 + '@rollup/rollup-win32-arm64-msvc': 4.34.2 + '@rollup/rollup-win32-ia32-msvc': 4.34.2 + '@rollup/rollup-win32-x64-msvc': 4.34.2 fsevents: 2.3.3 /run-parallel@1.2.0: @@ -7271,8 +7423,8 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} /tsup@8.3.5(typescript@5.6.2): resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} @@ -7303,7 +7455,7 @@ packages: picocolors: 1.1.1 postcss-load-config: 6.0.1 resolve-from: 5.0.0 - rollup: 4.28.0 + rollup: 4.34.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.1 @@ -7444,6 +7596,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true @@ -7458,6 +7616,10 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + dev: true + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -7610,7 +7772,7 @@ packages: dependencies: esbuild: 0.21.5 postcss: 8.4.39 - rollup: 4.28.0 + rollup: 4.34.2 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7648,7 +7810,7 @@ packages: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.0 + rollup: 4.34.2 terser: 5.31.3 optionalDependencies: fsevents: 2.3.3 @@ -7697,7 +7859,7 @@ packages: '@types/node': 20.14.10 esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.28.0 + rollup: 4.34.2 optionalDependencies: fsevents: 2.3.3 dev: false diff --git a/tests/test-app-new/build/assets/index-DUKqEKPp.js b/tests/test-app-new/build/assets/index-DUKqEKPp.js deleted file mode 100644 index 493ff9f..0000000 --- a/tests/test-app-new/build/assets/index-DUKqEKPp.js +++ /dev/null @@ -1,57 +0,0 @@ -function Sg(){import.meta.url,import("_").catch(()=>1),async function*(){}().next()}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const u of a)if(u.type==="childList")for(const i of u.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function l(a){const u={};return a.integrity&&(u.integrity=a.integrity),a.referrerPolicy&&(u.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?u.credentials="include":a.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function n(a){if(a.ep)return;a.ep=!0;const u=l(a);fetch(a.href,u)}})();function yr(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var gr={exports:{}},Ti={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var C0=Symbol.for("react.transitional.element"),N0=Symbol.for("react.fragment");function pr(t,e,l){var n=null;if(l!==void 0&&(n=""+l),e.key!==void 0&&(n=""+e.key),"key"in e){l={};for(var a in e)a!=="key"&&(l[a]=e[a])}else l=e;return e=l.ref,{$$typeof:C0,type:t,key:n,ref:e!==void 0?e:null,props:l}}Ti.Fragment=N0;Ti.jsx=pr;Ti.jsxs=pr;gr.exports=Ti;var T=gr.exports;function U0(t,e){let l=t,n,a;if(e.length>0&&(typeof e[e.length-1]=="function"?(n=e.pop(),e.length>0&&(a=e[0])):a=e[0]),a){if(typeof a=="string")l+=" ".concat(a);else if(typeof a=="object")if(a.params){const u=Object.entries(a.params).filter(([i,c])=>c!==void 0).map(([i,c])=>typeof c=="object"&&c!==null?"".concat(i,":").concat(JSON.stringify(c)):"".concat(i,":").concat(c)).join(" ");l+=u?" ".concat(u):""}else{const u=Object.entries(a).filter(([i,c])=>c!==void 0).map(([i,c])=>typeof c=="object"&&c!==null?"".concat(i,":").concat(JSON.stringify(c)):"".concat(i,":").concat(c)).join(" ");l+=u?" ".concat(u):""}}return{commandString:l,callback:n}}function L0(t){return(...e)=>{const{commandString:l,callback:n}=U0(t,e);return new Promise(a=>{F("cmd",l,u=>{a(u),n&&typeof n=="function"&&n(u)})})}}var Xu,Wl=[];const U={filehost:"",mainhost:"",minidappuid:"",testhost:"",TEST_MODE:!1,logging:!1,DEBUG_HOST:null,DEBUG_PORT:0,DEBUG_MINIDAPPID:"",init:t=>{if(U.log("MDS Inited"),Go()){U.TEST_MODE=!0,U.minidappuid="0x00",U.filehost="https://".concat(U.DEBUG_HOST,":").concat(U.DEBUG_PORT,"/"),U.mainhost="http://".concat(U.DEBUG_HOST,":").concat(U.DEBUG_PORT,"/"),U.testhost="http://".concat(U.DEBUG_HOST,":").concat(U.DEBUG_PORT,"/"),Xu=t,t&&t({event:"inited",data:null});return}U.form.getParams("MDS_LOGGING")!=null&&(U.logging=!0);var e=window.location.hostname,l=Number(window.location.port);U.minidappuid=U.form.getParams("uid"),U.minidappuid==null&&(U.minidappuid=U.DEBUG_MINIDAPPID),U.minidappuid=="0x00"&&U.log("No MiniDAPP UID specified.. using test value"),U.filehost="https://"+e+":"+l+"/",U.mainhost="https://"+e+":"+l+"/mdscommand_/",U.testhost="https://"+e+":"+l+"/",U.log("MDS HOST : "+U.filehost),Xu=t,Vu(),Bs({event:"inited"})},log:t=>{console.log("Minima @ "+new Date().toLocaleString()+" : "+t)},notify:t=>{F(U.mainhost+"notify?uid="+U.minidappuid,t)},notifycancel:()=>{F("notifycancel","*")},cmd:new Proxy({},{get:(t,e)=>{if(e in t)return t[e];const l=L0(e);return t[e]=l,l}}),sql:(t,e)=>new Promise(l=>{F("sql",t,n=>{l(n),e&&e(n)})}),dapplink:(t,e)=>new Promise(l=>{F("dapplink",t,n=>{l(n),e&&e(n)})}),api:{call:(t,e,l)=>{var n=""+Math.random()*1e9,a={};a.id=n,a.callback=l,Wl.push(a);var u=t+"&request&"+n+"&"+e;F("api",u)},reply:(t,e,l,n)=>{var a=t+"&response&"+e+"&"+l;F("api",a,n)}},net:{GET:(t,e)=>{F("net",t,e)},POST:(t,e,l)=>{var n=t+"&"+e;F("netpost",n,l)}},keypair:{get:(t,e)=>new Promise(l=>{var n="get&"+t;F("keypair",n,a=>{l(a),e&&e(a)})}),set:(t,e,l)=>new Promise(n=>{var a="set&"+t+"&"+e;F("keypair",a,u=>{n(u),l&&l(u)})})},comms:{broadcast:(t,e)=>{var l="public&"+t;F("comms",l,e)},solo:(t,e)=>{var l="private&"+t;F("comms",l,e)}},file:{list:(t,e,l)=>{var n="list&"+t;F("file",n,l)},save:(t,e,l)=>{var n="save&"+t+"&"+e;F("file",n,l)},savebinary:function(t,e,l){var n="savebinary&"+t+"&"+e;F("file",n,l)},load:(t,e,l)=>{var n="load&"+t;F("file",n,l)},loadbinary(t,e,l){var n="loadbinary&"+t;F("file",n,l)},delete:(t,e,l)=>{var n="delete&"+t;F("file",n,l)},getpath:(t,e,l)=>{var n="getpath&"+t;F("file",n,l)},makedir:(t,e,l)=>{var n="makedir&"+t;F("file",n,l)},copy:(t,e,l)=>{var n="copy&"+t+"&"+e;F("file",n,l)},move:(t,e,l)=>{var n="move&"+t+"&"+e;F("file",n,l)},download:(t,e,l)=>{var n="download&"+t;F("file",n,l)},upload:(t,e,l)=>{wc(t,0,l)},listweb:(t,e,l)=>{var n="listweb&"+t;F("file",n,l)},copytoweb:(t,e,l)=>{var n="copytoweb&"+t+"&"+e;F("file",n,l)},deletefromweb:(t,e,l)=>{var n="deletefromweb&"+t;F("file",n,l)}},executeRaw:(t,e)=>new Promise(l=>{F("cmd",t,n=>{l(n),e&&e(n)})}),form:{getParams:t=>{var u,i,c;if(Go())return null;for(var e=null,l=[],n=window.location.search.substr(1).split("&"),a=0;a{var e=t;return t.startsWith("0x")&&(e=t.substring(2)),btoa((e.match(/\w{2}/g)||[]).map(function(l){return String.fromCharCode(parseInt(l,16))}).join(""))},base64ToHex:t=>{const e=atob(t);let l="";for(let n=0;n{const e=window.atob(t),l=e.length,n=new Uint8Array(l);for(let a=0;ai.json()).then(i=>{U.logging&&U.log("RESPONSE:"+JSON.stringify(i)),l&&l(i)}).catch(i=>{jc(n,e,i)});return}var u=new XMLHttpRequest;u.onreadystatechange=function(){var i=u.status;if(u.readyState==XMLHttpRequest.DONE)if(i===0||i>=200&&i<400){if(U.logging&&U.log("RESPONSE:"+u.responseText),l)try{const c=JSON.parse(u.responseText);l(c)}catch(c){console.error("Failed to parse response as JSON",c)}}else jc(n,e,u.status)},u.open("POST",n,!0),u.overrideMimeType&&u.overrideMimeType("text/plain; charset=UTF-8"),u.send(encodeURIComponent(e))}function H0(t,e,l){if(U.logging&&U.log("POST_POLL_RPC:"+t+" PARAMS:"+e),U.TEST_MODE){fetch(t).then(a=>a.json()).then(a=>{U.logging&&U.log("RESPONSE:"+JSON.stringify(a)),l&&l(a)}).catch(a=>{setTimeout(()=>{Vu()},1e4)});return}var n=new XMLHttpRequest;n.onreadystatechange=function(){var a=n.status;if(n.readyState==XMLHttpRequest.DONE)if(a===0||a>=200&&a<400){if(U.logging&&U.log("RESPONSE:"+n.responseText),l)try{const u=JSON.parse(n.responseText);l(u)}catch(u){console.error("Failed to parse response as JSON",u)}}else jc(t,e,n.status)},n.addEventListener("error",function(){U.log("Error Polling - reconnect in 10s"),setTimeout(function(){Vu()},1e4)}),n.open("POST",t,!0),n.overrideMimeType&&n.overrideMimeType("text/plain; charset=UTF-8"),n.send(encodeURIComponent(e))}function wc(t,e,l){var n=t.name,a=t.size,u=1024*1024,i=Math.ceil(a/u);if(!(e>i-1)){var c=u*e,s=c+u;s>a&&(s=a);var o=t.slice(c,s),d=new FormData;d.append("uid",U.minidappuid),d.append("filename",n),d.append("filesize",a),d.append("allchunks",i),d.append("chunknum",e),d.append("fileupload",o);var f=new XMLHttpRequest;f.open("POST","/fileuploadchunk.html"),f.onreadystatechange=function(){var r=f.status;if(f.readyState==XMLHttpRequest.DONE)if(r===0||r>=200&&r<400){if(l){var v={};v.status=!0,v.filename=n,v.size=a,v.allchunks=i,v.chunk=e+1,v.start=c,v.end=s,l(v)}l?wc(t,e+1,l):wc(t,e+1)}else{if(l){var v={};v.status=!1,v.error=f.responseText,v.filename=n,v.size=a,v.allchunks=i,v.chunk=e,v.start=c,v.end=s,l(v)}U.log("MDS FILEUPLOAD CHUNK ERROR: "+f.responseText)}},f.send(d)}}function Go(){return typeof window>"u"||U.TEST_MODE}const B0={INITED:"inited",NEWBLOCK:"NEWBLOCK",MINING:"MINING",MINIMALOG:"MINIMALOG",MAXIMA:"MAXIMA",TIMER_10SECONDS:"MDS_TIMER_10SECONDS",TIMER_1HOUR:"MDS_TIMER_1HOUR",SHUTDOWN:"MDS_SHUTDOWN",PENDING:"MDS_PENDING",NEWCOIN:"NEWCOIN",NOTIFYCOIN:"NOTIFYCOIN",NOTIFYCASCADECOIN:"NOTIFYCASCADECOIN"};var j0="Invariant failed";function ve(t,e){if(!t)throw new Error(j0)}function yn(t){const e=t.resolvedLocation,l=t.location,n=(e==null?void 0:e.pathname)!==l.pathname,a=(e==null?void 0:e.href)!==l.href,u=(e==null?void 0:e.hash)!==l.hash;return{fromLocation:e,toLocation:l,pathChanged:n,hrefChanged:a,hashChanged:u}}function oa(t){return t[t.length-1]}function w0(t){return typeof t=="function"}function la(t,e){return w0(t)?t(e):t}function qc(t,e){return e.reduce((l,n)=>(l[n]=t[n],l),{})}function Wt(t,e){if(t===e)return t;const l=e,n=Xo(t)&&Xo(l);if(n||Qu(t)&&Qu(l)){const a=n?t:Object.keys(t),u=a.length,i=n?l:Object.keys(l),c=i.length,s=n?[]:{};let o=0;for(let d=0;d"u")return!0;const l=e.prototype;return!(!Yo(l)||!l.hasOwnProperty("isPrototypeOf"))}function Yo(t){return Object.prototype.toString.call(t)==="[object Object]"}function Xo(t){return Array.isArray(t)&&t.length===Object.keys(t).length}function Vo(t,e){let l=Object.keys(t);return e&&(l=l.filter(n=>t[n]!==void 0)),l}function fa(t,e,l){var n;if(t===e)return!0;if(typeof t!=typeof e)return!1;if(Qu(t)&&Qu(e)){const a=(n=l==null?void 0:l.ignoreUndefined)!=null?n:!0,u=Vo(t,a),i=Vo(e,a);return!(l!=null&&l.partial)&&u.length!==i.length?!1:i.every(c=>fa(t[c],e[c],l))}return Array.isArray(t)&&Array.isArray(e)?t.length!==e.length?!1:!t.some((a,u)=>!fa(a,e[u],l)):!1}function Pl(t){let e,l;const n=new Promise((a,u)=>{e=a,l=u});return n.status="pending",n.resolve=a=>{n.status="resolved",n.value=a,e(a),t==null||t(a)},n.reject=a=>{n.status="rejected",l(a)},n}function Ge(t){return Oi(t.filter(e=>e!==void 0).join("/"))}function Oi(t){return t.replace(/\/{2,}/g,"/")}function js(t){return t==="/"?t:t.replace(/^\/{1,}/,"")}function Al(t){return t==="/"?t:t.replace(/\/{1,}$/,"")}function q0(t){return Al(js(t))}function G0({basepath:t,base:e,to:l,trailingSlash:n="never",caseSensitive:a}){var u,i;e=Zu(t,e,a),l=Zu(t,l,a);let c=An(e);const s=An(l);c.length>1&&((u=oa(c))==null?void 0:u.value)==="/"&&c.pop(),s.forEach((d,f)=>{d.value==="/"?f?f===s.length-1&&c.push(d):c=[d]:d.value===".."?c.pop():d.value==="."||c.push(d)}),c.length>1&&(((i=oa(c))==null?void 0:i.value)==="/"?n==="never"&&c.pop():n==="always"&&c.push({type:"pathname",value:"/"}));const o=Ge([t,...c.map(d=>d.value)]);return Oi(o)}function An(t){if(!t)return[];t=Oi(t);const e=[];if(t.slice(0,1)==="/"&&(t=t.substring(1),e.push({type:"pathname",value:"/"})),!t)return e;const l=t.split("/").filter(Boolean);return e.push(...l.map(n=>n==="$"||n==="*"?{type:"wildcard",value:n}:n.charAt(0)==="$"?{type:"param",value:n}:{type:"pathname",value:decodeURI(n)})),t.slice(-1)==="/"&&(t=t.substring(1),e.push({type:"pathname",value:"/"})),e}function cu({path:t,params:e,leaveWildcards:l,leaveParams:n,decodeCharMap:a}){const u=An(t);function i(o){const d=e[o],f=typeof d=="string";return["*","_splat"].includes(o)?f?encodeURI(d):d:f?Y0(d,a):d}const c={},s=Ge(u.map(o=>{var d;if(o.type==="wildcard"){c._splat=e._splat;const f=i("_splat");return l?"".concat(o.value).concat(f!=null?f:""):f}if(o.type==="param"){const f=o.value.substring(1);if(c[f]=e[f],n){const r=i(o.value);return"".concat(o.value).concat(r!=null?r:"")}return(d=i(f))!=null?d:"undefined"}return o.value}));return{usedParams:c,interpolatedPath:s}}function Y0(t,e){let l=encodeURIComponent(t);if(e)for(const[n,a]of e)l=l.replaceAll(n,a);return l}function su(t,e,l){const n=X0(t,e,l);if(!(l.to&&!n))return n!=null?n:{}}function Zu(t,e,l=!1){const n=l?t:t.toLowerCase(),a=l?e:e.toLowerCase();switch(!0){case n==="/":return e;case a===n:return"";case e.length{for(let o=0;o=a.length-1,v=o>=u.length-1;if(f){if(f.type==="wildcard"){const g=decodeURI(Ge(a.slice(o).map(S=>S.value)));return i["*"]=g,i._splat=g,!0}if(f.type==="pathname"){if(f.value==="/"&&!(d!=null&&d.value))return!0;if(d){if(l.caseSensitive){if(f.value!==d.value)return!1}else if(f.value.toLowerCase()!==d.value.toLowerCase())return!1}}if(!d)return!1;if(f.type==="param"){if(d.value==="/")return!1;d.value.charAt(0)!=="$"&&(i[f.value.substring(1)]=decodeURIComponent(d.value))}}if(!r&&v)return i["**"]=Ge(a.slice(o+1).map(g=>g.value)),!!l.fuzzy&&(f==null?void 0:f.value)!=="/"}return!0})()?i:void 0}function V0(t,e){let l,n,a,u="";for(l in t)if((a=t[l])!==void 0)if(Array.isArray(a))for(n=0;n{e.substring(0,1)==="?"&&(e=e.substring(1));const l=Q0(e);for(const n in l){const a=l[n];if(typeof a=="string")try{l[n]=t(a)}catch(u){}}return l}}function $0(t,e){function l(n){if(typeof n=="object"&&n!==null)try{return t(n)}catch(a){}else if(typeof n=="string"&&typeof e=="function")try{return e(n),t(n)}catch(a){}return n}return n=>{n={...n},Object.keys(n).forEach(u=>{const i=n[u];typeof i>"u"||i===void 0?delete n[u]:n[u]=l(i)});const a=V0(n).toString();return a?"?".concat(a):""}}const il="__TSR_index",Zo="popstate",Ko="beforeunload";function Sr(t){let e=t.getLocation();const l=new Set,n=i=>{e=t.getLocation(),l.forEach(c=>c({location:e,action:i}))},a=i=>{var c;(c=t.notifyOnIndexChange)==null||c?n(i):e=t.getLocation()},u=async({task:i,navigateOpts:c,...s})=>{var g,S;var o,d;if((g=c==null?void 0:c.ignoreBlocker)!=null?g:!1){i();return}const r=(S=(o=t.getBlockers)==null?void 0:o.call(t))!=null?S:[],v=s.type==="PUSH"||s.type==="REPLACE";if(typeof document<"u"&&r.length&&v)for(const M of r){const m=Da(s.path,s.state);if(await M.blockerFn({currentLocation:e,nextLocation:m,action:s.type})){(d=t.onBlocked)==null||d.call(t);return}}i()};return{get location(){return e},get length(){return t.getLength()},subscribers:l,subscribe:i=>(l.add(i),()=>{l.delete(i)}),push:(i,c,s)=>{const o=e.state[il];c=Gc(o+1,c),u({task:()=>{t.pushState(i,c),n({type:"PUSH"})},navigateOpts:s,type:"PUSH",path:i,state:c})},replace:(i,c,s)=>{const o=e.state[il];c=Gc(o,c),u({task:()=>{t.replaceState(i,c),n({type:"REPLACE"})},navigateOpts:s,type:"REPLACE",path:i,state:c})},go:(i,c)=>{u({task:()=>{t.go(i),a({type:"GO",index:i})},navigateOpts:c,type:"GO"})},back:i=>{u({task:()=>{var c;t.back((c=i==null?void 0:i.ignoreBlocker)!=null?c:!1),a({type:"BACK"})},navigateOpts:i,type:"BACK"})},forward:i=>{u({task:()=>{var c;t.forward((c=i==null?void 0:i.ignoreBlocker)!=null?c:!1),a({type:"FORWARD"})},navigateOpts:i,type:"FORWARD"})},canGoBack:()=>e.state[il]!==0,createHref:i=>t.createHref(i),block:i=>{var o;var c;if(!t.setBlockers)return()=>{};const s=(o=(c=t.getBlockers)==null?void 0:c.call(t))!=null?o:[];return t.setBlockers([...s,i]),()=>{var v;var d,f;const r=(v=(d=t.getBlockers)==null?void 0:d.call(t))!=null?v:[];(f=t.setBlockers)==null||f.call(t,r.filter(g=>g!==i))}},flush:()=>{var i;return(i=t.flush)==null?void 0:i.call(t)},destroy:()=>{var i;return(i=t.destroy)==null?void 0:i.call(t)},notify:n}}function Gc(t,e){return e||(e={}),{...e,key:ws(),[il]:t}}function k0(t){var e;const l=typeof document<"u"?window:void 0,n=l.history.pushState,a=l.history.replaceState;let u=[];const i=()=>u,c=D=>u=D,s=D=>D,o=()=>Da("".concat(l.location.pathname).concat(l.location.search).concat(l.location.hash),l.history.state);(e=l.history.state)!=null&&e.key||l.history.replaceState({[il]:0,key:ws()},"");let d=o(),f,r=!1,v=!1,g=!1,S=!1;const M=()=>d;let m,h;const y=()=>{m&&(R._ignoreSubscribers=!0,(m.isPush?l.history.pushState:l.history.replaceState)(m.state,"",m.href),R._ignoreSubscribers=!1,m=void 0,h=void 0,f=void 0)},p=(D,x,L)=>{const N=s(x);h||(f=d),d=Da(x,L),m={href:N,state:L,isPush:(m==null?void 0:m.isPush)||D==="push"},h||(h=Promise.resolve().then(()=>y()))},b=D=>{d=o(),R.notify({type:D})},A=async()=>{if(v){v=!1;return}const D=o(),x=D.state[il]-d.state[il],L=x===1,N=x===-1,H=!L&&!N||r;r=!1;const st=H?"GO":N?"BACK":"FORWARD",ot=H?{type:"GO",index:x}:{type:N?"BACK":"FORWARD"};if(g)g=!1;else{const O=i();if(typeof document<"u"&&O.length){for(const z of O)if(await z.blockerFn({currentLocation:d,nextLocation:D,action:st})){v=!0,l.history.go(1),R.notify(ot);return}}}d=o(),R.notify(ot)},E=D=>{var N;if(S){S=!1;return}let x=!1;const L=i();if(typeof document<"u"&&L.length)for(const H of L){const st=(N=H.enableBeforeUnload)!=null?N:!0;if(st===!0){x=!0;break}if(typeof st=="function"&&st()===!0){x=!0;break}}if(x)return D.preventDefault(),D.returnValue=""},R=Sr({getLocation:M,getLength:()=>l.history.length,pushState:(D,x)=>p("push",D,x),replaceState:(D,x)=>p("replace",D,x),back:D=>(D&&(g=!0),S=!0,l.history.back()),forward:D=>{D&&(g=!0),S=!0,l.history.forward()},go:D=>{r=!0,l.history.go(D)},createHref:D=>s(D),flush:y,destroy:()=>{l.history.pushState=n,l.history.replaceState=a,l.removeEventListener(Ko,E,{capture:!0}),l.removeEventListener(Zo,A)},onBlocked:()=>{f&&d!==f&&(d=f)},getBlockers:i,setBlockers:c,notifyOnIndexChange:!1});return l.addEventListener(Ko,E,{capture:!0}),l.addEventListener(Zo,A),l.history.pushState=function(...D){const x=n.apply(l.history,D);return R._ignoreSubscribers||b("PUSH"),x},l.history.replaceState=function(...D){const x=a.apply(l.history,D);return R._ignoreSubscribers||b("REPLACE"),x},R}function br(t={initialEntries:["/"]}){const e=t.initialEntries;let l=t.initialIndex?Math.min(Math.max(t.initialIndex,0),e.length-1):e.length-1;const n=e.map((u,i)=>Gc(i,void 0));return Sr({getLocation:()=>Da(e[l],n[l]),getLength:()=>e.length,pushState:(u,i)=>{l{n[l]=i,e[l]=u},back:()=>{l=Math.max(l-1,0)},forward:()=>{l=Math.min(l+1,e.length-1)},go:u=>{l=Math.min(Math.max(l+u,0),e.length-1)},createHref:u=>u})}function Da(t,e){const l=t.indexOf("#"),n=t.indexOf("?");return{href:t,pathname:t.substring(0,l>0?n>0?Math.min(l,n):l:n>0?n:t.length),hash:l>-1?t.substring(l):"",search:n>-1?t.slice(n,l===-1?void 0:l):"",state:e||{[il]:0,key:ws()}}}function ws(){return(Math.random()+1).toString(36).substring(7)}var _r={exports:{}},w={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var qs=Symbol.for("react.transitional.element"),F0=Symbol.for("react.portal"),W0=Symbol.for("react.fragment"),P0=Symbol.for("react.strict_mode"),I0=Symbol.for("react.profiler"),tv=Symbol.for("react.consumer"),ev=Symbol.for("react.context"),lv=Symbol.for("react.forward_ref"),nv=Symbol.for("react.suspense"),av=Symbol.for("react.memo"),Er=Symbol.for("react.lazy"),Jo=Symbol.iterator;function uv(t){return t===null||typeof t!="object"?null:(t=Jo&&t[Jo]||t["@@iterator"],typeof t=="function"?t:null)}var Mr={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Tr=Object.assign,Or={};function qn(t,e,l){this.props=t,this.context=e,this.refs=Or,this.updater=l||Mr}qn.prototype.isReactComponent={};qn.prototype.setState=function(t,e){if(typeof t!="object"&&typeof t!="function"&&t!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,t,e,"setState")};qn.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,"forceUpdate")};function Rr(){}Rr.prototype=qn.prototype;function Gs(t,e,l){this.props=t,this.context=e,this.refs=Or,this.updater=l||Mr}var Ys=Gs.prototype=new Rr;Ys.constructor=Gs;Tr(Ys,qn.prototype);Ys.isPureReactComponent=!0;var $o=Array.isArray,it={H:null,A:null,T:null,S:null},Ar=Object.prototype.hasOwnProperty;function Xs(t,e,l,n,a,u){return l=u.ref,{$$typeof:qs,type:t,key:e,ref:l!==void 0?l:null,props:u}}function iv(t,e){return Xs(t.type,e,void 0,void 0,void 0,t.props)}function Vs(t){return typeof t=="object"&&t!==null&&t.$$typeof===qs}function cv(t){var e={"=":"=0",":":"=2"};return"$"+t.replace(/[=:]/g,function(l){return e[l]})}var ko=/\/+/g;function $i(t,e){return typeof t=="object"&&t!==null&&t.key!=null?cv(""+t.key):e.toString(36)}function Fo(){}function sv(t){switch(t.status){case"fulfilled":return t.value;case"rejected":throw t.reason;default:switch(typeof t.status=="string"?t.then(Fo,Fo):(t.status="pending",t.then(function(e){t.status==="pending"&&(t.status="fulfilled",t.value=e)},function(e){t.status==="pending"&&(t.status="rejected",t.reason=e)})),t.status){case"fulfilled":return t.value;case"rejected":throw t.reason}}throw t}function Il(t,e,l,n,a){var u=typeof t;(u==="undefined"||u==="boolean")&&(t=null);var i=!1;if(t===null)i=!0;else switch(u){case"bigint":case"string":case"number":i=!0;break;case"object":switch(t.$$typeof){case qs:case F0:i=!0;break;case Er:return i=t._init,Il(i(t._payload),e,l,n,a)}}if(i)return a=a(t),i=n===""?"."+$i(t,0):n,$o(a)?(l="",i!=null&&(l=i.replace(ko,"$&/")+"/"),Il(a,e,l,"",function(o){return o})):a!=null&&(Vs(a)&&(a=iv(a,l+(a.key==null||t&&t.key===a.key?"":(""+a.key).replace(ko,"$&/")+"/")+i)),e.push(a)),1;i=0;var c=n===""?".":n+":";if($o(t))for(var s=0;sn?V.createElement(e,{error:n,reset:a}):t.children})}class dv extends V.Component{constructor(){super(...arguments),this.state={error:null}}static getDerivedStateFromProps(e){return{resetKey:e.getResetKey()}}static getDerivedStateFromError(e){return{error:e}}reset(){this.setState({error:null})}componentDidUpdate(e,l){l.error&&l.resetKey!==this.state.resetKey&&this.reset()}componentDidCatch(e,l){this.props.onCatch&&this.props.onCatch(e,l)}render(){return this.props.children({error:this.state.resetKey!==this.props.getResetKey()?null:this.state.error,reset:()=>{this.reset()}})}}function Ri({error:t}){const[e,l]=V.useState(!1);return T.jsxs("div",{style:{padding:".5rem",maxWidth:"100%"},children:[T.jsxs("div",{style:{display:"flex",alignItems:"center",gap:".5rem"},children:[T.jsx("strong",{style:{fontSize:"1rem"},children:"Something went wrong!"}),T.jsx("button",{style:{appearance:"none",fontSize:".6em",border:"1px solid currentColor",padding:".1rem .2rem",fontWeight:"bold",borderRadius:".25rem"},onClick:()=>l(n=>!n),children:e?"Hide Error":"Show Error"})]}),T.jsx("div",{style:{height:".25rem"}}),e?T.jsx("div",{children:T.jsx("pre",{style:{fontSize:".7em",border:"1px solid red",borderRadius:".25rem",padding:".3rem",color:"red",overflow:"auto"},children:t.message?T.jsx("code",{children:t.message}):null})}):null]})}var Dr={exports:{}},zr={},xr={exports:{}},Cr={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Dn=V;function hv(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var vv=typeof Object.is=="function"?Object.is:hv,mv=Dn.useState,yv=Dn.useEffect,gv=Dn.useLayoutEffect,pv=Dn.useDebugValue;function Sv(t,e){var l=e(),n=mv({inst:{value:l,getSnapshot:e}}),a=n[0].inst,u=n[1];return gv(function(){a.value=l,a.getSnapshot=e,ki(a)&&u({inst:a})},[t,l,e]),yv(function(){return ki(a)&&u({inst:a}),t(function(){ki(a)&&u({inst:a})})},[t]),pv(l),l}function ki(t){var e=t.getSnapshot;t=t.value;try{var l=e();return!vv(t,l)}catch(n){return!0}}function bv(t,e){return e()}var _v=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?bv:Sv;Cr.useSyncExternalStore=Dn.useSyncExternalStore!==void 0?Dn.useSyncExternalStore:_v;xr.exports=Cr;var Ev=xr.exports;/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ai=V,Mv=Ev;function Tv(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var Ov=typeof Object.is=="function"?Object.is:Tv,Rv=Mv.useSyncExternalStore,Av=Ai.useRef,Dv=Ai.useEffect,zv=Ai.useMemo,xv=Ai.useDebugValue;zr.useSyncExternalStoreWithSelector=function(t,e,l,n,a){var u=Av(null);if(u.current===null){var i={hasValue:!1,value:null};u.current=i}else i=u.current;u=zv(function(){function s(v){if(!o){if(o=!0,d=v,v=n(v),a!==void 0&&i.hasValue){var g=i.value;if(a(g,v))return f=g}return f=v}if(g=f,Ov(d,v))return g;var S=n(v);return a!==void 0&&a(g,S)?(d=v,g):(d=v,f=S)}var o=!1,d,f,r=l===void 0?null:l;return[function(){return s(e())},r===null?void 0:function(){return s(r())}]},[e,l,n,a]);var c=Rv(t,u[0],u[1]);return Dv(function(){i.hasValue=!0,i.value=c},[c]),xv(c),c};Dr.exports=zr;var Cv=Dr.exports;const gn=new WeakMap,Du=new WeakMap,Ku={current:[]};let Fi=!1,ra=0;const na=new Set,fu=new Map;function Nr(t){const e=Array.from(t).sort((l,n)=>l instanceof pn&&l.options.deps.includes(n)?1:n instanceof pn&&n.options.deps.includes(l)?-1:0);for(const l of e){if(Ku.current.includes(l))continue;Ku.current.push(l),l.recompute();const n=Du.get(l);if(n)for(const a of n){const u=gn.get(a);u&&Nr(u)}}}function Nv(t){t.listeners.forEach(e=>e({prevVal:t.prevState,currentVal:t.state}))}function Uv(t){t.listeners.forEach(e=>e({prevVal:t.prevState,currentVal:t.state}))}function Ur(t){var e;if(ra>0&&!fu.has(t)&&fu.set(t,t.prevState),na.add(t),!(ra>0)&&!Fi)try{for(Fi=!0;na.size>0;){const l=Array.from(na);na.clear();for(const n of l){const a=(e=fu.get(n))!=null?e:n.prevState;n.prevState=a,Nv(n)}for(const n of l){const a=gn.get(n);a&&(Ku.current.push(n),Nr(a))}for(const n of l){const a=gn.get(n);if(a)for(const u of a)Uv(u)}}}finally{Fi=!1,Ku.current=[],fu.clear()}}function Wi(t){ra++;try{t()}finally{if(ra--,ra===0){const e=Array.from(na)[0];e&&Ur(e)}}}class Yc{constructor(e,l){this.listeners=new Set,this.subscribe=n=>{var a,u;this.listeners.add(n);const i=(u=(a=this.options)==null?void 0:a.onSubscribe)==null?void 0:u.call(a,n,this);return()=>{this.listeners.delete(n),i==null||i()}},this.setState=n=>{var a,u,i;this.prevState=this.state,this.state=(a=this.options)!=null&&a.updateFn?this.options.updateFn(this.prevState)(n):n(this.prevState),(i=(u=this.options)==null?void 0:u.onUpdate)==null||i.call(u),Ur(this)},this.prevState=e,this.state=e,this.options=l}}class pn{constructor(e){this.listeners=new Set,this._subscriptions=[],this.lastSeenDepValues=[],this.getDepVals=()=>{var a;const l=[],n=[];for(const u of this.options.deps)l.push(u.prevState),n.push(u.state);return this.lastSeenDepValues=n,{prevDepVals:l,currDepVals:n,prevVal:(a=this.prevState)!=null?a:void 0}},this.recompute=()=>{var l,n;this.prevState=this.state;const{prevDepVals:a,currDepVals:u,prevVal:i}=this.getDepVals();this.state=this.options.fn({prevDepVals:a,currDepVals:u,prevVal:i}),(n=(l=this.options).onUpdate)==null||n.call(l)},this.checkIfRecalculationNeededDeeply=()=>{for(const u of this.options.deps)u instanceof pn&&u.checkIfRecalculationNeededDeeply();let l=!1;const n=this.lastSeenDepValues,{currDepVals:a}=this.getDepVals();for(let u=0;u(this.registerOnGraph(),this.checkIfRecalculationNeededDeeply(),()=>{this.unregisterFromGraph();for(const l of this._subscriptions)l()}),this.subscribe=l=>{var n,a;this.listeners.add(l);const u=(a=(n=this.options).onSubscribe)==null?void 0:a.call(n,l,this);return()=>{this.listeners.delete(l),u==null||u()}},this.options=e,this.state=e.fn({prevDepVals:void 0,prevVal:void 0,currDepVals:this.getDepVals().currDepVals})}registerOnGraph(e=this.options.deps){for(const l of e)if(l instanceof pn)l.registerOnGraph(),this.registerOnGraph(l.options.deps);else if(l instanceof Yc){let n=gn.get(l);n||(n=new Set,gn.set(l,n)),n.add(this);let a=Du.get(this);a||(a=new Set,Du.set(this,a)),a.add(l)}}unregisterFromGraph(e=this.options.deps){for(const l of e)if(l instanceof pn)this.unregisterFromGraph(l.options.deps);else if(l instanceof Yc){const n=gn.get(l);n&&n.delete(this);const a=Du.get(this);a&&a.delete(l)}}}function Lv(t,e=l=>l){return Cv.useSyncExternalStoreWithSelector(t.subscribe,()=>t.state,()=>t.state,e,Hv)}function Hv(t,e){if(Object.is(t,e))return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;if(t instanceof Map&&e instanceof Map){if(t.size!==e.size)return!1;for(const[n,a]of t)if(!e.has(n)||!Object.is(a,e.get(n)))return!1;return!0}if(t instanceof Set&&e instanceof Set){if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0}const l=Object.keys(t);if(l.length!==Object.keys(e).length)return!1;for(let n=0;n"u"?Pi:window.__TSR_ROUTER_CONTEXT__?window.__TSR_ROUTER_CONTEXT__:(window.__TSR_ROUTER_CONTEXT__=Pi,Pi)}function Ke(t){var l;const e=V.useContext(Lr());return(l=t==null?void 0:t.warn)==null,e}function Xt(t){const e=Ke({warn:(t==null?void 0:t.router)===void 0}),l=(t==null?void 0:t.router)||e,n=V.useRef(void 0);return Lv(l.__store,a=>{var u;if(t!=null&&t.select){if((u=t.structuralSharing)!=null?u:l.options.defaultStructuralSharing){const i=Wt(n.current,t.select(a));return n.current=i,i}return t.select(a)}return a})}const Di=V.createContext(void 0),Bv=V.createContext(void 0);function zn(t){const e=V.useContext(t.from?Bv:Di);return Xt({select:n=>{var u;const a=n.matches.find(i=>t.from?t.from===i.routeId:i.id===e);if(ve(!(((u=t.shouldThrow)==null||u)&&!a),"Could not find ".concat(t.from?'an active match from "'.concat(t.from,'"'):"a nearest match!")),a!==void 0)return t.select?t.select(a):a},structuralSharing:t.structuralSharing})}function jv(t){return zn({from:t.from,strict:t.strict,structuralSharing:t.structuralSharing,select:e=>t.select?t.select(e.loaderData):e.loaderData})}function wv(t){const{select:e,...l}=t;return zn({...l,select:n=>e?e(n.loaderDeps):n.loaderDeps})}function qv(t){return zn({from:t.from,strict:t.strict,structuralSharing:t.structuralSharing,select:e=>t.select?t.select(e.params):e.params})}function Gv(t){return zn({from:t.from,strict:t.strict,structuralSharing:t.structuralSharing,select:e=>t.select?t.select(e.search):e.search})}function Pt(t){return!!(t!=null&&t.isNotFound)}function Yv(t){const e=Xt({select:l=>"not-found-".concat(l.location.pathname,"-").concat(l.status)});return T.jsx(Qs,{getResetKey:()=>e,onCatch:(l,n)=>{var a;if(Pt(l))(a=t.onCatch)==null||a.call(t,l,n);else throw l},errorComponent:({error:l})=>{var n;if(Pt(l))return(n=t.fallback)==null?void 0:n.call(t,l);throw l},children:t.children})}function Xv(){return T.jsx("p",{children:"Not Found"})}function Vv(t){const{navigate:e}=Ke();return V.useCallback(l=>e({...l}),[e])}let Hr=class{constructor(e){this.init=l=>{var f,r;var n,a;this.originalIndex=l.originalIndex;const u=this.options,i=!(u!=null&&u.path)&&!(u!=null&&u.id);this.parentRoute=(a=(n=this.options).getParentRoute)==null?void 0:a.call(n),i?this._path=Ht:ve(this.parentRoute);let c=i?Ht:u.path;c&&c!=="/"&&(c=js(c));const s=(u==null?void 0:u.id)||c;let o=i?Ht:Ge([this.parentRoute.id===Ht?"":this.parentRoute.id,s]);c===Ht&&(c="/"),o!==Ht&&(o=Ge(["/",o]));const d=o===Ht?"/":Ge([this.parentRoute.fullPath,c]);this._path=c,this._id=o,this._fullPath=d,this._to=d,this._ssr=(r=(f=u==null?void 0:u.ssr)!=null?f:l.defaultSsr)!=null?r:!0},this.updateLoader=l=>(Object.assign(this.options,l),this),this.update=l=>(Object.assign(this.options,l),this),this.lazy=l=>(this.lazyFn=l,this),this.useMatch=l=>zn({select:l==null?void 0:l.select,from:this.id,structuralSharing:l==null?void 0:l.structuralSharing}),this.useRouteContext=l=>zn({...l,from:this.id,select:n=>l!=null&&l.select?l.select(n.context):n.context}),this.useSearch=l=>Gv({select:l==null?void 0:l.select,structuralSharing:l==null?void 0:l.structuralSharing,from:this.id}),this.useParams=l=>qv({select:l==null?void 0:l.select,structuralSharing:l==null?void 0:l.structuralSharing,from:this.id}),this.useLoaderDeps=l=>wv({...l,from:this.id}),this.useLoaderData=l=>jv({...l,from:this.id}),this.useNavigate=()=>Vv({from:this.id}),this.options=e||{},this.isRoot=!(e!=null&&e.getParentRoute),ve(!(e!=null&&e.id&&(e!=null&&e.path))),this.$$typeof=Symbol.for("react.memo")}get to(){return this._to}get id(){return this._id}get path(){return this._path}get fullPath(){return this._fullPath}get ssr(){return this._ssr}addChildren(e){return this._addFileChildren(e)}_addFileChildren(e){return Array.isArray(e)&&(this.children=e),typeof e=="object"&&e!==null&&(this.children=Object.values(e)),this}};function Qv(t){return new Hr(t)}class Zv extends Hr{constructor(e){super(e)}addChildren(e){return super.addChildren(e),this}_addFileChildren(e){return super._addFileChildren(e),this}_addFileTypes(){return this}}function Kv(t){return new Zv(t)}function Jv(t){return new $v(t,{silent:!0}).createRoute}class $v{constructor(e,l){this.path=e,this.createRoute=n=>{this.silent;const a=Qv(n);return a.isRoot=!1,a},this.silent=l==null?void 0:l.silent}}function El(t){return!!(t!=null&&t.isRedirect)}function Ii(t){return!!(t!=null&&t.isRedirect)&&t.href}function zu(t){return T.jsx(T.Fragment,{children:t.children})}function Br(t,e,l){return e.options.notFoundComponent?T.jsx(e.options.notFoundComponent,{data:l}):t.options.defaultNotFoundComponent?T.jsx(t.options.defaultNotFoundComponent,{data:l}):T.jsx(Xv,{})}const jr={},kv=jr.hasOwnProperty,wr=(t,e)=>{for(const l in t)kv.call(t,l)&&e(l,t[l])},Fv=(t,e)=>(e&&wr(e,(l,n)=>{t[l]=n}),t),Wv=(t,e)=>{const l=t.length;let n=-1;for(;++n"\\u"+("0000"+t).slice(-4),Jn=(t,e)=>{let l=t.toString(16);return e?l:l.toUpperCase()},Qa=jr.toString,Pv=Array.isArray,Iv=t=>typeof Buffer=="function"&&Buffer.isBuffer(t),tm=t=>Qa.call(t)=="[object Object]",em=t=>typeof t=="string"||Qa.call(t)=="[object String]",lm=t=>typeof t=="number"||Qa.call(t)=="[object Number]",tc=t=>typeof t=="bigint",nm=t=>typeof t=="function",am=t=>Qa.call(t)=="[object Map]",um=t=>Qa.call(t)=="[object Set]",im={"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},cm=/[\\\b\f\n\r\t]/,sm=/[0-9]/,om=/[\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/,fm=/([\uD800-\uDBFF][\uDC00-\uDFFF])|([\uD800-\uDFFF])|(['"`])|[^]/g,rm=/([\uD800-\uDBFF][\uDC00-\uDFFF])|([\uD800-\uDFFF])|(['"`])|[^ !#-&\(-\[\]-_a-~]/g,Ml=(t,e)=>{const l=()=>{o=s,++e.indentLevel,s=e.indent.repeat(e.indentLevel)},n={escapeEverything:!1,minimal:!1,isScriptContext:!1,quotes:"single",wrap:!1,es6:!1,json:!1,compact:!0,lowercaseHex:!1,numbers:"decimal",indent:" ",indentLevel:0,__inline1__:!1,__inline2__:!1},a=e&&e.json;a&&(n.quotes="double",n.wrap=!0),e=Fv(n,e),e.quotes!="single"&&e.quotes!="double"&&e.quotes!="backtick"&&(e.quotes="single");const u=e.quotes=="double"?'"':e.quotes=="backtick"?"`":"'",i=e.compact,c=e.lowercaseHex;let s=e.indent.repeat(e.indentLevel),o="";const d=e.__inline1__,f=e.__inline2__,r=i?"":"\n";let v,g=!0;const S=e.numbers=="binary",M=e.numbers=="octal",m=e.numbers=="decimal",h=e.numbers=="hexadecimal";if(a&&t&&nm(t.toJSON)&&(t=t.toJSON()),!em(t)){if(am(t))return t.size==0?"new Map()":(i||(e.__inline1__=!0,e.__inline2__=!1),"new Map("+Ml(Array.from(t),e)+")");if(um(t))return t.size==0?"new Set()":"new Set("+Ml(Array.from(t),e)+")";if(Iv(t))return t.length==0?"Buffer.from([])":"Buffer.from("+Ml(Array.from(t),e)+")";if(Pv(t))return v=[],e.wrap=!0,d&&(e.__inline1__=!1,e.__inline2__=!0),f||l(),Wv(t,p=>{g=!1,f&&(e.__inline2__=!1),v.push((i||f?"":s)+Ml(p,e))}),g?"[]":f?"["+v.join(", ")+"]":"["+r+v.join(","+r)+r+(i?"":o)+"]";if(lm(t)||tc(t)){if(a)return JSON.stringify(Number(t));let p;if(m)p=String(t);else if(h){let b=t.toString(16);c||(b=b.toUpperCase()),p="0x"+b}else S?p="0b"+t.toString(2):M&&(p="0o"+t.toString(8));return tc(t)?p+"n":p}else return tc(t)?a?JSON.stringify(Number(t)):t+"n":tm(t)?(v=[],e.wrap=!0,l(),wr(t,(p,b)=>{g=!1,v.push((i?"":s)+Ml(p,e)+":"+(i?"":" ")+Ml(b,e))}),g?"{}":"{"+r+v.join(","+r)+r+(i?"":o)+"}"):a?JSON.stringify(t)||"null":String(t)}const y=e.escapeEverything?fm:rm;return v=t.replace(y,(p,b,A,E,R,D)=>{if(b){if(e.minimal)return b;const L=b.charCodeAt(0),N=b.charCodeAt(1);if(e.es6){const H=(L-55296)*1024+N-56320+65536;return"\\u{"+Jn(H,c)+"}"}return ru(Jn(L,c))+ru(Jn(N,c))}if(A)return ru(Jn(A.charCodeAt(0),c));if(p=="\0"&&!a&&!sm.test(D.charAt(R+1)))return"\\0";if(E)return E==u||e.escapeEverything?"\\"+E:E;if(cm.test(p))return im[p];if(e.minimal&&!om.test(p))return p;const x=Jn(p.charCodeAt(0),c);return a||x.length>2?ru(x):"\\x"+("00"+x).slice(-2)}),u=="`"&&(v=v.replace(/\$\{/g,"\\${")),e.isScriptContext&&(v=v.replace(/<\/(script|style)/gi,"<\\/$1").replace(/