diff --git a/.gitignore b/.gitignore
index 6f04459..9c7ff66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,3 +55,6 @@ pids/
# Temporary files
tmp/
temp/
+
+# Mock bridge configuration
+dev.mock-bridge.json
\ No newline at end of file
diff --git a/admin-frame/.gitignore b/admin-frame/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/admin-frame/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/admin-frame/README.md b/admin-frame/README.md
new file mode 100644
index 0000000..745827c
--- /dev/null
+++ b/admin-frame/README.md
@@ -0,0 +1,4 @@
+# Admin frame
+
+This app is intended to provide a pseudo-Shopify admin interface to wrap Shopify apps in development.
+It should house app bridge method implementations.
\ No newline at end of file
diff --git a/admin-frame/eslint.config.js b/admin-frame/eslint.config.js
new file mode 100644
index 0000000..0df2a6c
--- /dev/null
+++ b/admin-frame/eslint.config.js
@@ -0,0 +1,27 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs['recommended-latest'],
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ rules: {
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ }
+ },
+])
diff --git a/admin-frame/index.html b/admin-frame/index.html
new file mode 100644
index 0000000..b599faa
--- /dev/null
+++ b/admin-frame/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ Mock Bridge
+
+
+
+
+
+
+
diff --git a/admin-frame/package-lock.json b/admin-frame/package-lock.json
new file mode 100644
index 0000000..d92fb67
--- /dev/null
+++ b/admin-frame/package-lock.json
@@ -0,0 +1,3462 @@
+{
+ "name": "admin-frame",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "admin-frame",
+ "version": "0.0.0",
+ "dependencies": {
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1",
+ "zustand": "^5.0.8"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.36.0",
+ "@shopify/app-bridge-types": "^0.5.3",
+ "@shopify/polaris": "^13.9.5",
+ "@shopify/polaris-types": "^1.0.1",
+ "@types/node": "^24.6.0",
+ "@types/react": "^19.1.16",
+ "@types/react-dom": "^19.1.9",
+ "@vitejs/plugin-react": "^5.0.4",
+ "babel-plugin-react-compiler": "^19.1.0-rc.3",
+ "eslint": "^9.36.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.22",
+ "globals": "^16.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.45.0",
+ "vite": "npm:rolldown-vite@7.1.14"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
+ "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
+ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+ "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
+ "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.5",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz",
+ "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz",
+ "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
+ "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
+ "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.5.0",
+ "@emnapi/runtime": "^1.5.0",
+ "@tybys/wasm-util": "^0.10.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@oxc-project/runtime": {
+ "version": "0.92.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.92.0.tgz",
+ "integrity": "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.93.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.93.0.tgz",
+ "integrity": "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.41.tgz",
+ "integrity": "sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.41.tgz",
+ "integrity": "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.41.tgz",
+ "integrity": "sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.41.tgz",
+ "integrity": "sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.41.tgz",
+ "integrity": "sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.41.tgz",
+ "integrity": "sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.41.tgz",
+ "integrity": "sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.41.tgz",
+ "integrity": "sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.41.tgz",
+ "integrity": "sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.41.tgz",
+ "integrity": "sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.41.tgz",
+ "integrity": "sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.41.tgz",
+ "integrity": "sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-ia32-msvc": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.41.tgz",
+ "integrity": "sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.41.tgz",
+ "integrity": "sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.43",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz",
+ "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@shopify/app-bridge-types": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@shopify/app-bridge-types/-/app-bridge-types-0.5.3.tgz",
+ "integrity": "sha512-wj5pPqk4bQsFU6AQUo6SwyQ3zqBgodvxt7fWzRYakeHGG/YWeDv1uoNYjhSVm0jT80Wy18EObSMQTocUSgpqPA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0"
+ }
+ },
+ "node_modules/@shopify/polaris": {
+ "version": "13.9.5",
+ "resolved": "https://registry.npmjs.org/@shopify/polaris/-/polaris-13.9.5.tgz",
+ "integrity": "sha512-UN+rT2q1r/uF0Xia8MaCl2nDxatuzbjunS5WYcv4qw8VBvThTxDVURgpwOuvutSrvu138pwScOAah933vqlYkg==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "@shopify/polaris-icons": "^9.3.1",
+ "@shopify/polaris-tokens": "^9.4.2",
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "@types/react-transition-group": "^4.4.2",
+ "react-fast-compare": "^3.2.0",
+ "react-transition-group": "^4.4.2"
+ },
+ "engines": {
+ "node": ">=20.10.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@shopify/polaris-icons": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/@shopify/polaris-icons/-/polaris-icons-9.3.1.tgz",
+ "integrity": "sha512-16BIFAT93LJ8X4YRXz5cR9ZPHeErMg3DYS0gyTPNPkd0E5IBPoTxPINjn2b4Mr9Sc1x4RfI4AqPcV8ut0D1J5w==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "engines": {
+ "node": ">=20.10.0"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/@shopify/polaris-tokens": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@shopify/polaris-tokens/-/polaris-tokens-9.4.2.tgz",
+ "integrity": "sha512-WNoDWLYFj38Cj0FolbNsLaY54JbjuYoO0qsLCj6yBb3Bkg4BEdAjOHji9AktL9IZGPsNhTcMp2/8CfzKtSHg2A==",
+ "dev": true,
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "deepmerge": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=20.10.0"
+ }
+ },
+ "node_modules/@shopify/polaris-types": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@shopify/polaris-types/-/polaris-types-1.0.1.tgz",
+ "integrity": "sha512-BZs47atXnaOVqFrCfTeXc6Vz8Vk8Vpj9o3nx/lYTvy9i4pPvd4K4mRKIhjrer2NWITCMvY6+nZ6GE1I9Qfq4rQ==",
+ "dev": true
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
+ "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
+ "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.2",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
+ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.2",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz",
+ "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz",
+ "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.46.3",
+ "@typescript-eslint/type-utils": "8.46.3",
+ "@typescript-eslint/utils": "8.46.3",
+ "@typescript-eslint/visitor-keys": "8.46.3",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.46.3",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz",
+ "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.46.3",
+ "@typescript-eslint/types": "8.46.3",
+ "@typescript-eslint/typescript-estree": "8.46.3",
+ "@typescript-eslint/visitor-keys": "8.46.3",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz",
+ "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.46.3",
+ "@typescript-eslint/types": "^8.46.3",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz",
+ "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.3",
+ "@typescript-eslint/visitor-keys": "8.46.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz",
+ "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz",
+ "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.3",
+ "@typescript-eslint/typescript-estree": "8.46.3",
+ "@typescript-eslint/utils": "8.46.3",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz",
+ "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz",
+ "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.46.3",
+ "@typescript-eslint/tsconfig-utils": "8.46.3",
+ "@typescript-eslint/types": "8.46.3",
+ "@typescript-eslint/visitor-keys": "8.46.3",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz",
+ "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.46.3",
+ "@typescript-eslint/types": "8.46.3",
+ "@typescript-eslint/typescript-estree": "8.46.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz",
+ "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.46.3",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz",
+ "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.4",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.43",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.18.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+ "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/babel-plugin-react-compiler": {
+ "version": "19.1.0-rc.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.3.tgz",
+ "integrity": "sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.25",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz",
+ "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.27.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz",
+ "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.19",
+ "caniuse-lite": "^1.0.30001751",
+ "electron-to-chromium": "^1.5.238",
+ "node-releases": "^2.0.26",
+ "update-browserslist-db": "^1.1.4"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001754",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz",
+ "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.249",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz",
+ "integrity": "sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
+ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.1",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz",
+ "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+ "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.30.2",
+ "lightningcss-darwin-arm64": "1.30.2",
+ "lightningcss-darwin-x64": "1.30.2",
+ "lightningcss-freebsd-x64": "1.30.2",
+ "lightningcss-linux-arm-gnueabihf": "1.30.2",
+ "lightningcss-linux-arm64-gnu": "1.30.2",
+ "lightningcss-linux-arm64-musl": "1.30.2",
+ "lightningcss-linux-x64-gnu": "1.30.2",
+ "lightningcss-linux-x64-musl": "1.30.2",
+ "lightningcss-win32-arm64-msvc": "1.30.2",
+ "lightningcss-win32-x64-msvc": "1.30.2"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
+ "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
+ "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
+ "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
+ "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
+ "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
+ "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
+ "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
+ "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
+ "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
+ "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.2",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
+ "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
+ "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
+ "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.0"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.41.tgz",
+ "integrity": "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.93.0",
+ "@rolldown/pluginutils": "1.0.0-beta.41",
+ "ansis": "=4.2.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-beta.41",
+ "@rolldown/binding-darwin-arm64": "1.0.0-beta.41",
+ "@rolldown/binding-darwin-x64": "1.0.0-beta.41",
+ "@rolldown/binding-freebsd-x64": "1.0.0-beta.41",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-beta.41",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-beta.41",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-beta.41",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41",
+ "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41"
+ }
+ },
+ "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.41",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.41.tgz",
+ "integrity": "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.46.3",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz",
+ "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.46.3",
+ "@typescript-eslint/parser": "8.46.3",
+ "@typescript-eslint/typescript-estree": "8.46.3",
+ "@typescript-eslint/utils": "8.46.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "name": "rolldown-vite",
+ "version": "7.1.14",
+ "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.1.14.tgz",
+ "integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/runtime": "0.92.0",
+ "fdir": "^6.5.0",
+ "lightningcss": "^1.30.1",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rolldown": "1.0.0-beta.41",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "esbuild": "^0.25.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz",
+ "integrity": "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18.0.0",
+ "immer": ">=9.0.6",
+ "react": ">=18.0.0",
+ "use-sync-external-store": ">=1.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "use-sync-external-store": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/admin-frame/package.json b/admin-frame/package.json
new file mode 100644
index 0000000..84dbdcc
--- /dev/null
+++ b/admin-frame/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "admin-frame",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.1.1",
+ "react-dom": "^19.1.1",
+ "zustand": "^5.0.8"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.36.0",
+ "@shopify/app-bridge-types": "^0.5.3",
+ "@shopify/polaris": "^13.9.5",
+ "@shopify/polaris-types": "^1.0.1",
+ "@types/node": "^24.6.0",
+ "@types/react": "^19.1.16",
+ "@types/react-dom": "^19.1.9",
+ "@vitejs/plugin-react": "^5.0.4",
+ "babel-plugin-react-compiler": "^19.1.0-rc.3",
+ "eslint": "^9.36.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.22",
+ "globals": "^16.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.45.0",
+ "vite": "npm:rolldown-vite@7.1.14"
+ },
+ "overrides": {
+ "vite": "npm:rolldown-vite@7.1.14"
+ }
+}
diff --git a/admin-frame/public/vite.svg b/admin-frame/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/admin-frame/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/admin-frame/src/App.tsx b/admin-frame/src/App.tsx
new file mode 100644
index 0000000..a888d9d
--- /dev/null
+++ b/admin-frame/src/App.tsx
@@ -0,0 +1,15 @@
+import { EmbeddedApp } from "./components/EmbeddedApp"
+import { Modal } from "./components/features/Modal"
+import { Frame } from "./components/Frame"
+
+function App() {
+ return (
+
+
+
+
+
+ )
+}
+
+export default App
diff --git a/admin-frame/src/assets/react.svg b/admin-frame/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/admin-frame/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/admin-frame/src/components/EmbeddedApp.tsx b/admin-frame/src/components/EmbeddedApp.tsx
new file mode 100644
index 0000000..7bf3095
--- /dev/null
+++ b/admin-frame/src/components/EmbeddedApp.tsx
@@ -0,0 +1,18 @@
+import { useMockBridge } from "../hooks/useMockBridge";
+
+export function EmbeddedApp() {
+ const { iframeRef, iframeSrc } = useMockBridge();
+
+ if (!iframeSrc) return null;
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/admin-frame/src/components/Frame.tsx b/admin-frame/src/components/Frame.tsx
new file mode 100644
index 0000000..ac58fba
--- /dev/null
+++ b/admin-frame/src/components/Frame.tsx
@@ -0,0 +1,72 @@
+type Props = {
+ children: React.ReactNode;
+}
+
+export function Frame({ children }: Props) {
+ return (
+
+
+
Mock Bridge
+
+
+
+
+
+ Home
+ Products
+ Orders
+ Customers
+ Analytics
+ Marketing
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/admin-frame/src/components/features/Modal.tsx b/admin-frame/src/components/features/Modal.tsx
new file mode 100644
index 0000000..26f495e
--- /dev/null
+++ b/admin-frame/src/components/features/Modal.tsx
@@ -0,0 +1,54 @@
+import { useEffect, useRef } from "react";
+import { useModalFeatureStore } from "../../store/features/modal";
+
+export function Modal() {
+ const modalStates = useModalFeatureStore(state => state.modalStates);
+ const containerRef = useRef(null);
+
+ useEffect(() => {
+ const container = containerRef.current;
+ if (!container) return;
+
+ Object.entries(modalStates).forEach(([id, state]) => {
+ const modal = container.querySelector(`s-modal#${id}`) as HTMLElement;
+ const modalIsOpen = (modal.shadowRoot?.querySelector('dialog') as HTMLDialogElement)?.getAttribute('open') === '';
+
+ if (state.open && !modalIsOpen) {
+ setTimeout(() => {
+ (modal as unknown as JSX.IntrinsicElements['s-modal']).showOverlay?.();
+ }, 100);
+ } else if (!state.open && modalIsOpen) {
+ setTimeout(() => {
+ (modal as unknown as JSX.IntrinsicElements['s-modal']).hideOverlay?.();
+ }, 100);
+ }
+ });
+ }, [modalStates]);
+
+
+ return (
+
+ {Object.entries(modalStates).map(([id, state]) => (
+
+ {state.content.src && }
+ {state.html && }
+ {state.content.buttons.map(button => (
+ {
+ // ah crap, parent needs to execute action on client lol
+ }}
+ disabled={button.disabled}
+ loading={button.loading}
+ >
+ {button.label}
+
+ ))}
+
+ ))}
+
+ )
+}
\ No newline at end of file
diff --git a/admin-frame/src/hooks/useConfig.ts b/admin-frame/src/hooks/useConfig.ts
new file mode 100644
index 0000000..f9c8613
--- /dev/null
+++ b/admin-frame/src/hooks/useConfig.ts
@@ -0,0 +1,42 @@
+import { useEffect, useState } from "react";
+
+interface Config {
+ clientId: string;
+ shop: string;
+ host: string;
+ appUrl: string;
+ appPath?: string;
+}
+
+let cachedConfig: Config | null = null;
+
+export function useConfig() {
+ const [config, setConfig] = useState(cachedConfig);
+
+ useEffect(() => {
+ if (config) return;
+
+ const controller = new AbortController();
+
+ fetch('/api/config', {
+ signal: controller.signal,
+ }).then(res => res.json())
+ .then(data => {
+ if (!data) return null;
+
+ cachedConfig = data;
+ setConfig(data);
+ })
+ .catch(err => {
+ if (err.toString().includes('cleanup')) return null;
+
+ console.error('Error fetching config:', err);
+ });
+
+ return () => {
+ controller.abort('Effect cleanup');
+ }
+ }, [config]);
+
+ return config;
+}
\ No newline at end of file
diff --git a/admin-frame/src/hooks/useMockBridge.ts b/admin-frame/src/hooks/useMockBridge.ts
new file mode 100644
index 0000000..4fd793c
--- /dev/null
+++ b/admin-frame/src/hooks/useMockBridge.ts
@@ -0,0 +1,142 @@
+import { useCallback, useEffect, useRef, useState } from "react";
+import { useConfig } from "./useConfig";
+import { getFeatureStore, type FeatureActionName, type FeatureActionPayload, type FeatureName } from "../store/features";
+
+export type FeatureActionRequest<
+ F extends FeatureName = FeatureName,
+ A extends FeatureActionName = FeatureActionName,
+ P extends FeatureActionPayload = FeatureActionPayload
+> = {
+ feature: F;
+ action: A | FeatureActionName;
+ payload: P | FeatureActionPayload;
+}
+
+export function useMockBridge() {
+ const iframeRef = useRef(null);
+ const config = useConfig();
+
+ const [sessionToken, setSessionToken] = useState('');
+
+ // Signal to the iframe that it's in a mock environment
+ // Send the signal multiple times to ensure it's received before the timeout
+ const sendMockSignal = useCallback(() => {
+ if (!config) return;
+
+ const iframe = iframeRef.current;
+ if (!iframe) return;
+
+ try {
+ iframe.contentWindow?.postMessage({
+ type: 'MOCK_SHOPIFY_ENVIRONMENT',
+ mockServerUrl: location.origin,
+ shop: config.shop,
+ clientId: config.clientId,
+ }, '*');
+ } catch (e) {
+ console.warn('[MockAdmin] Could not signal mock environment:', (e as Error).message);
+ }
+ }, [config]);
+
+ const getSessionToken = useCallback(() => {
+ if (!config) return Promise.resolve('');
+
+ return fetch('/api/session-token', {
+ method: 'POST',
+ body: JSON.stringify({ shop: config.shop }),
+ }).then(res => res.json())
+ .then(data => data.token);
+ }, [config]);
+
+ useEffect(() => {
+ // Need a session token to initially load the iframe
+ getSessionToken().then(token => {
+ setSessionToken(token);
+ });
+ }, [getSessionToken]);
+
+ useEffect(() => {
+ const iframe = iframeRef.current;
+ if (!iframe) return;
+ if (!sessionToken) return;
+
+ // Note: We can't inject scripts directly due to cross-origin restrictions
+ // Instead, the embedded app should detect it's in a mock environment and load the mock App Bridge
+
+ // Handle postMessage communication with embedded app
+
+ const handleMessage = (event: MessageEvent) => {
+ if (!config) return;
+
+ // Handle App Bridge messages from the embedded app
+ if (event.data && event.data.type) {
+ // Handle session token requests
+ if (event.data.type === 'SESSION_TOKEN_REQUEST') {
+ // Generate and send back a session token
+ getSessionToken().then(token => {
+ iframeRef.current?.contentWindow?.postMessage({
+ type: 'SESSION_TOKEN_RESPONSE',
+ token: token,
+ }, '*');
+ });
+ }
+
+ // Embedded app called something, like shopify.modal.show('modal_id')
+ // Proxy the calls to their corresponding feature store
+ if (event.data.type === 'FEATURE_ACTION_REQUEST') {
+ const { feature, action, payload } = event.data as FeatureActionRequest;
+
+ const featureStore = getFeatureStore(feature);
+ const actionFn = featureStore.getState()[action];
+
+ if (actionFn) {
+ actionFn(payload);
+ } else {
+ console.warn('[MockAdmin] Unknown feature action:', action);
+ }
+
+ iframeRef.current?.contentWindow?.postMessage({
+ type: 'FEATURE_ACTION_RESPONSE',
+ action_id: event.data.action_id,
+ }, '*');
+ }
+ }
+ }
+
+ const handleIframeLoad = () => {
+ // Send signal immediately
+ sendMockSignal();
+
+ // Send signal a few more times to ensure delivery before timeout
+ setTimeout(sendMockSignal, 10);
+ setTimeout(sendMockSignal, 50);
+ setTimeout(sendMockSignal, 100);
+ }
+
+ window.addEventListener('message', handleMessage);
+
+ // Send signal immediately when iframe starts loading
+ iframeRef.current?.addEventListener('load', handleIframeLoad);
+
+ return () => {
+ window.removeEventListener('message', handleMessage);
+ iframe.removeEventListener('load', handleIframeLoad);
+ };
+ }, [config, sendMockSignal, sessionToken]);
+
+ const iframeSrc = (() => {
+ if (!config || !sessionToken) return '';
+
+ const basePath = config.appPath || '';
+ const host = btoa(config.shop);
+ const idToken = sessionToken;
+
+ return `${config.appUrl}${basePath}?host=${host}&shop=${config.shop}&embedded=1&id_token=${idToken}`;
+ })();
+
+ return {
+ iframeRef,
+ iframeSrc
+ // iframeSrc: ''
+ };
+}
\ No newline at end of file
diff --git a/admin-frame/src/main.css b/admin-frame/src/main.css
new file mode 100644
index 0000000..82e96b5
--- /dev/null
+++ b/admin-frame/src/main.css
@@ -0,0 +1,16 @@
+body {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ height: 100vh;
+ width: 100vw;
+}
+
+div#root {
+ height: 100%;
+ width: 100%;
+}
+
+* {
+ box-sizing: border-box;
+}
\ No newline at end of file
diff --git a/admin-frame/src/main.tsx b/admin-frame/src/main.tsx
new file mode 100644
index 0000000..d78961d
--- /dev/null
+++ b/admin-frame/src/main.tsx
@@ -0,0 +1,12 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import App from './App.tsx'
+
+import '@shopify/polaris/build/esm/styles.css';
+import './main.css'
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/admin-frame/src/store/features.ts b/admin-frame/src/store/features.ts
new file mode 100644
index 0000000..5b53e4b
--- /dev/null
+++ b/admin-frame/src/store/features.ts
@@ -0,0 +1,21 @@
+import { useModalFeatureStore } from "./features/modal";
+
+export const features = {
+ modal: useModalFeatureStore,
+}
+
+export type FeatureName = keyof typeof features;
+export type FeatureStore = ReturnType;
+export type FeatureActions = {
+ [K in keyof FeatureStore as FeatureStore[K] extends (...args: any[]) => any ? K : never]: FeatureStore[K];
+};
+export type FeatureActionName = keyof FeatureActions;
+export type FeatureActionPayload> = FeatureActions[A] extends (payload: infer P) => any ? P : never;
+
+export function getFeatureStore(name: F) {
+ if (!features[name]) {
+ throw new Error(`Feature ${name} not found/supported`);
+ }
+
+ return features[name];
+}
\ No newline at end of file
diff --git a/admin-frame/src/store/features/modal.ts b/admin-frame/src/store/features/modal.ts
new file mode 100644
index 0000000..47b335b
--- /dev/null
+++ b/admin-frame/src/store/features/modal.ts
@@ -0,0 +1,95 @@
+import { create } from "zustand";
+import { combine } from "zustand/middleware";
+
+export type ModalContent = {
+ id: string;
+ title: string;
+ variant?: string;
+ src: string | null;
+ buttons: Array<{
+ id: string;
+ label: string;
+ variant?: string;
+ tone?: string;
+ disabled?: boolean;
+ loading?: boolean;
+ }>;
+}
+
+type ModalFeatureState = {
+ modalStates: Record;
+}
+
+export const useModalFeatureStore = create(combine(
+ { modalStates: {} } as ModalFeatureState,
+ set => ({
+ show: (payload: { id: string }) => set(state => {
+ const modalState = state.modalStates[payload.id];
+
+ return {
+ modalStates: {
+ ...state.modalStates,
+ [payload.id]: {
+ ...modalState,
+ open: true
+ },
+ },
+ };
+ }),
+ hide: (payload: { id: string }) => set(state => {
+ const modalState = state.modalStates[payload.id];
+
+ return {
+ modalStates: {
+ ...state.modalStates,
+ [payload.id]: {
+ ...modalState,
+ open: false
+ },
+ },
+ };
+ }),
+ toggle: (payload: { id: string }) => set(state => {
+ const modalState = state.modalStates[payload.id];
+
+ return {
+ modalStates: {
+ ...state.modalStates,
+ [payload.id]: {
+ ...modalState,
+ open: !modalState?.open || false
+ },
+ },
+ };
+ }),
+ update: (payload: { id: string, heading: string, content: ModalContent }) => set(state => {
+ const modalState = state.modalStates[payload.id];
+
+ return {
+ modalStates: {
+ ...state.modalStates,
+ [payload.id]: {
+ ...modalState,
+ heading: payload.heading,
+ content: payload.content,
+ },
+ },
+ };
+ }),
+ updateHtml: (payload: { id: string, html: string }) => set(state => {
+ const modalState = state.modalStates[payload.id];
+
+ return {
+ modalStates: {
+ ...state.modalStates,
+ [payload.id]: { ...modalState, html: payload.html },
+ },
+ };
+ }),
+ })
+));
diff --git a/admin-frame/tsconfig.app.json b/admin-frame/tsconfig.app.json
new file mode 100644
index 0000000..9b7faea
--- /dev/null
+++ b/admin-frame/tsconfig.app.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["vite/client", "@shopify/polaris-types"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/admin-frame/tsconfig.json b/admin-frame/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/admin-frame/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/admin-frame/tsconfig.node.json b/admin-frame/tsconfig.node.json
new file mode 100644
index 0000000..8a67f62
--- /dev/null
+++ b/admin-frame/tsconfig.node.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2023",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/admin-frame/vite.config.ts b/admin-frame/vite.config.ts
new file mode 100644
index 0000000..59555be
--- /dev/null
+++ b/admin-frame/vite.config.ts
@@ -0,0 +1,27 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import { config } from 'dotenv';
+
+config({ path: '../.env' });
+
+const MOCK_API_PORT = process.env.SHOPIFY_PORT;
+if (!MOCK_API_PORT) throw new Error('SHOPIFY_PORT is not set');
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [
+ react({
+ babel: {
+ plugins: [['babel-plugin-react-compiler']],
+ },
+ }),
+ ],
+ server: {
+ proxy: {
+ '/api': {
+ target: `http://localhost:${process.env.SHOPIFY_PORT}`,
+ changeOrigin: true,
+ },
+ },
+ }
+})
diff --git a/app-bridge/package-lock.json b/app-bridge/package-lock.json
new file mode 100644
index 0000000..50ac367
--- /dev/null
+++ b/app-bridge/package-lock.json
@@ -0,0 +1,966 @@
+{
+ "name": "app-bridge",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "app-bridge",
+ "version": "1.0.0",
+ "license": "ISC",
+ "devDependencies": {
+ "@shopify/app-bridge-types": "^0.5.3",
+ "tsdown": "^0.16.1"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz",
+ "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz",
+ "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
+ "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.5.0",
+ "@emnapi/runtime": "^1.5.0",
+ "@tybys/wasm-util": "^0.10.1"
+ }
+ },
+ "node_modules/@oxc-project/runtime": {
+ "version": "0.96.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.96.0.tgz",
+ "integrity": "sha512-34lh4o9CcSw09Hx6fKihPu85+m+4pmDlkXwJrLvN5nMq5JrcGhhihVM415zDqT8j8IixO1PYYdQZRN4SwQCncg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.96.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.96.0.tgz",
+ "integrity": "sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@quansync/fs": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-0.1.5.tgz",
+ "integrity": "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^0.2.11"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.47.tgz",
+ "integrity": "sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.47.tgz",
+ "integrity": "sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.47.tgz",
+ "integrity": "sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.47.tgz",
+ "integrity": "sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.47.tgz",
+ "integrity": "sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.47.tgz",
+ "integrity": "sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.47.tgz",
+ "integrity": "sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.47.tgz",
+ "integrity": "sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.47.tgz",
+ "integrity": "sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.47.tgz",
+ "integrity": "sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.47.tgz",
+ "integrity": "sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.0.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.47.tgz",
+ "integrity": "sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-ia32-msvc": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.47.tgz",
+ "integrity": "sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.47.tgz",
+ "integrity": "sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz",
+ "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@shopify/app-bridge-types": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@shopify/app-bridge-types/-/app-bridge-types-0.5.3.tgz",
+ "integrity": "sha512-wj5pPqk4bQsFU6AQUo6SwyQ3zqBgodvxt7fWzRYakeHGG/YWeDv1uoNYjhSVm0jT80Wy18EObSMQTocUSgpqPA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0"
+ }
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
+ "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+ "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/ast-kit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz",
+ "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "pathe": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.7.0.tgz",
+ "integrity": "sha512-tub/wFGH49vNCm0xraykcY3TcRgX/3JsALYq/Lwrtti+bTyFHkCUAWF5wgYoie8P41wYwig2mIKiqoocr1EkEQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/diff": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz",
+ "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dts-resolver": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-2.1.2.tgz",
+ "integrity": "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/empathic": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
+ "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-beta.47",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.47.tgz",
+ "integrity": "sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.96.0",
+ "@rolldown/pluginutils": "1.0.0-beta.47"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-beta.47",
+ "@rolldown/binding-darwin-arm64": "1.0.0-beta.47",
+ "@rolldown/binding-darwin-x64": "1.0.0-beta.47",
+ "@rolldown/binding-freebsd-x64": "1.0.0-beta.47",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.47",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.47",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.47",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.47",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-beta.47",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-beta.47",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-beta.47",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.47",
+ "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.47",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.47"
+ }
+ },
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.17.4.tgz",
+ "integrity": "sha512-eWno7CR/Da2jA+5mTHxeMx78p4AmoUocEKDQT8XKwhq9Oroyf67ZfBOE82d4EvDjktiQTePpKdIKc69pND88Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.28.5",
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "ast-kit": "^2.2.0",
+ "birpc": "^2.7.0",
+ "debug": "^4.4.3",
+ "dts-resolver": "^2.1.2",
+ "get-tsconfig": "^4.13.0",
+ "magic-string": "^0.30.21"
+ },
+ "engines": {
+ "node": ">=20.18.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@ts-macro/tsc": "^0.3.6",
+ "@typescript/native-preview": ">=7.0.0-dev.20250601.1",
+ "rolldown": "^1.0.0-beta.44",
+ "typescript": "^5.0.0",
+ "vue-tsc": "~3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@ts-macro/tsc": {
+ "optional": true
+ },
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tsdown": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.16.1.tgz",
+ "integrity": "sha512-oCOj9wTDa+0XfuVpaGC3EPNjatpkKtUwelg4HfXD/vz+80wuCFC6og2QePsMRZtFM4io0zdxNxZI5yRQGpDRCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansis": "^4.2.0",
+ "cac": "^6.7.14",
+ "chokidar": "^4.0.3",
+ "debug": "^4.4.3",
+ "diff": "^8.0.2",
+ "empathic": "^2.0.0",
+ "hookable": "^5.5.3",
+ "rolldown": "1.0.0-beta.47",
+ "rolldown-plugin-dts": "^0.17.3",
+ "semver": "^7.7.3",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tree-kill": "^1.2.2",
+ "unconfig-core": "^7.4.0",
+ "unrun": "^0.2.5"
+ },
+ "bin": {
+ "tsdown": "dist/run.mjs"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@arethetypeswrong/core": "^0.18.1",
+ "@vitejs/devtools": "^0.0.0-alpha.10",
+ "publint": "^0.3.0",
+ "typescript": "^5.0.0",
+ "unplugin-lightningcss": "^0.4.0",
+ "unplugin-unused": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "publint": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "unplugin-lightningcss": {
+ "optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/unconfig-core": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.4.0.tgz",
+ "integrity": "sha512-3ew7rvES5x2LCZ/QRKV3nQQpq7eFYuszQuvZrhTHxDPKc34QFjRXI17XGiZI+WQTVIXKYeBti4v3LS39NWmhmg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^0.1.5",
+ "quansync": "^0.2.11"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unrun": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/unrun/-/unrun-0.2.6.tgz",
+ "integrity": "sha512-ZLgMe3W+Zl3mjpnCbfW0JLlGQDa7U4mJKiBlValp5isZ9WeoAVaNyziCbr5Szo4abZ6WRE3OM1MjwpfFQrE5Aw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/runtime": "^0.96.0",
+ "rolldown": "1.0.0-beta.47"
+ },
+ "bin": {
+ "unrun": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Gugustinette"
+ },
+ "peerDependencies": {
+ "synckit": "^0.11.11"
+ },
+ "peerDependenciesMeta": {
+ "synckit": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/app-bridge/package.json b/app-bridge/package.json
new file mode 100644
index 0000000..21bd930
--- /dev/null
+++ b/app-bridge/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "app-bridge",
+ "version": "1.0.0",
+ "main": "index.js",
+ "type": "module",
+ "scripts": {
+ "watch": "npm run build -- --watch",
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "tsdown src/index.ts --out-dir dist --format iife --platform browser"
+ },
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "devDependencies": {
+ "@shopify/app-bridge-types": "^0.5.3",
+ "tsdown": "^0.16.1"
+ }
+}
\ No newline at end of file
diff --git a/app-bridge/prod-app-bridge.js b/app-bridge/prod-app-bridge.js
new file mode 100644
index 0000000..49ba691
--- /dev/null
+++ b/app-bridge/prod-app-bridge.js
@@ -0,0 +1,4678 @@
+!function () {
+ var t, n, e;
+ const i = Symbol.for("RemoteUi::Retain")
+ , o = Symbol.for("RemoteUi::Release")
+ , r = Symbol.for("RemoteUi::RetainedBy");
+ class a {
+ constructor() {
+ this.memoryManaged = new Set
+ }
+ add(t) {
+ this.memoryManaged.add(t),
+ t[r].add(this),
+ t[i]()
+ }
+ release() {
+ for (const t of this.memoryManaged)
+ t[r].delete(this),
+ t[o]();
+ this.memoryManaged.clear()
+ }
+ }
+ function s(t) {
+ return !!(t && t[i] && t[o])
+ }
+ function c(t, { deep: n = !0 } = {}) {
+ return l(t, n, new Map)
+ }
+ function l(t, n, e) {
+ const o = e.get(t);
+ if (null != o)
+ return o;
+ const r = s(t);
+ if (r && t[i](),
+ e.set(t, r),
+ n) {
+ if (Array.isArray(t)) {
+ const i = t.reduce(((t, i) => l(i, n, e) || t), r);
+ return e.set(t, i),
+ i
+ }
+ if (f(t)) {
+ const i = Object.keys(t).reduce(((i, o) => l(t[o], n, e) || i), r);
+ return e.set(t, i),
+ i
+ }
+ }
+ return e.set(t, r),
+ r
+ }
+ function u(t, { deep: n = !0 } = {}) {
+ return d(t, n, new Map)
+ }
+ function d(t, n, e) {
+ const i = e.get(t);
+ if (null != i)
+ return i;
+ const r = s(t);
+ if (r && t[o](),
+ e.set(t, r),
+ n) {
+ if (Array.isArray(t)) {
+ const i = t.reduce(((t, i) => d(i, n, e) || t), r);
+ return e.set(t, i),
+ i
+ }
+ if (f(t)) {
+ const i = Object.keys(t).reduce(((i, o) => d(t[o], n, e) || i), r);
+ return e.set(t, i),
+ i
+ }
+ }
+ return r
+ }
+ function f(t) {
+ if (null == t || "object" != typeof t)
+ return !1;
+ const n = Object.getPrototypeOf(t);
+ return null == n || n === Object.prototype
+ }
+ const h = "_@f";
+ function p(t) {
+ const n = new Map
+ , e = new Map
+ , c = new Map;
+ return {
+ encode: function i(o, r = new Map) {
+ if (null == o)
+ return [o];
+ const a = r.get(o);
+ if (a)
+ return a;
+ if ("object" == typeof o) {
+ if (Array.isArray(o)) {
+ r.set(o, [void 0]);
+ const t = []
+ , n = [o.map((n => {
+ const [e, o = []] = i(n, r);
+ return t.push(...o),
+ e
+ }
+ )), t];
+ return r.set(o, n),
+ n
+ }
+ if (f(o)) {
+ r.set(o, [void 0]);
+ const t = []
+ , n = [Object.keys(o).reduce(((n, e) => {
+ const [a, s = []] = i(o[e], r);
+ return t.push(...s),
+ {
+ ...n,
+ [e]: a
+ }
+ }
+ ), {}), t];
+ return r.set(o, n),
+ n
+ }
+ }
+ if ("function" == typeof o) {
+ if (n.has(o)) {
+ const t = n.get(o)
+ , e = [{
+ [h]: t
+ }];
+ return r.set(o, e),
+ e
+ }
+ const i = t.uuid();
+ n.set(o, i),
+ e.set(i, o);
+ const a = [{
+ [h]: i
+ }];
+ return r.set(o, a),
+ a
+ }
+ const s = [o];
+ return r.set(o, s),
+ s
+ },
+ decode: l,
+ async call(t, n) {
+ const i = new a
+ , o = e.get(t);
+ if (null == o)
+ throw Error("You attempted to call a function that was already released.");
+ try {
+ const t = s(o) ? [i, ...o[r]] : [i];
+ return await o(...l(n, t))
+ } finally {
+ i.release()
+ }
+ },
+ release(t) {
+ const i = e.get(t);
+ i && (e.delete(t),
+ n.delete(i))
+ },
+ terminate() {
+ n.clear(),
+ e.clear(),
+ c.clear()
+ }
+ };
+ function l(n, e) {
+ if ("object" == typeof n) {
+ if (null == n)
+ return n;
+ if (Array.isArray(n))
+ return n.map((t => l(t, e)));
+ if (h in n) {
+ const a = n[h];
+ if (c.has(a))
+ return c.get(a);
+ let s = 0
+ , l = !1;
+ const u = () => {
+ s -= 1,
+ 0 === s && (l = !0,
+ c.delete(a),
+ t.release(a))
+ }
+ , d = () => {
+ s += 1
+ }
+ , f = new Set(e)
+ , p = (...n) => {
+ if (l)
+ throw Error("You attempted to call a function that was already released.");
+ if (!c.has(a))
+ throw Error("You attempted to call a function that was already revoked.");
+ return t.call(a, n)
+ }
+ ;
+ Object.defineProperties(p, {
+ [o]: {
+ value: u,
+ writable: !1
+ },
+ [i]: {
+ value: d,
+ writable: !1
+ },
+ [r]: {
+ value: f,
+ writable: !1
+ }
+ });
+ for (const t of f)
+ t.add(p);
+ return c.set(a, p),
+ p
+ }
+ if (f(n))
+ return Object.keys(n).reduce(((t, i) => ({
+ ...t,
+ [i]: l(n[i], e)
+ })), {})
+ }
+ return n
+ }
+ }
+ function v() {
+ return `${m()}-${m()}-${m()}-${m()}`
+ }
+ function m() {
+ return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)
+ }
+ function w(t, n) {
+ if (n)
+ for (let e in n) {
+ const i = n[e];
+ null != i && "" !== i && (t[e] = i)
+ }
+ }
+ function b(t, n) {
+ customElements.get(t) || customElements.define(t, n)
+ }
+ const y = null != (t = globalThis.HTMLElement) ? t : class {
+ }
+ ;
+ class g extends y {
+ constructor() {
+ super(),
+ this.attachShadow({
+ mode: "open"
+ }).innerHTML = ""
+ }
+ }
+ function A(t) {
+ return t.replace(/-([a-z])/gi, ((t, n) => n.toUpperCase()))
+ }
+ function E(t) {
+ try {
+ return navigator.userAgent.toLowerCase().includes(t.toLowerCase())
+ } catch (n) {
+ return !1
+ }
+ }
+ function k() {
+ return E("Unframed") && "MobileWebView" in window
+ }
+ function C() {
+ return E("Shopify Mobile")
+ }
+ function P() {
+ return E("Extensibility")
+ }
+ function L() {
+ return E("Shopify POS")
+ }
+ const T = "app-iframe"
+ , S = /frame:\/*([^/]+)\/([^/]+)(?:\/([^/]+))?(?:\/([^/]+))?$/
+ , I = (() => {
+ var t;
+ const [, n, e, i] = null != (t = window.name.match(S)) ? t : [];
+ return {
+ apiKey: n,
+ scope: e,
+ mode: i
+ }
+ }
+ )()
+ , x = window.name.startsWith(T) || "main" === I.scope
+ , M = "modal" === I.scope
+ , R = ["hmac", "locale", "protocol", "session", "id_token", "shop", "timestamp", "host", "embedded", "appLoadId", "link_source"];
+ function O(t) {
+ const n = new URL(t);
+ return R.forEach((t => n.searchParams.delete(t))),
+ n
+ }
+ const $ = ["FailedAuthentication", "InvalidAction", "InvalidActionType", "InvalidOptions", "InvalidOrigin", "InvalidPayload", "Network", "Permission", "Persistence", "UnexpectedAction", "UnsupportedOperation"];
+ function B(t, n, e) {
+ $.forEach((i => {
+ t.subscribe("Error." + i, n, e)
+ }
+ ))
+ }
+ function F() {
+ let t, n = !1;
+ const e = new Promise((n => {
+ t = n
+ }
+ ));
+ return {
+ get promise() {
+ return e
+ },
+ resolve(e) {
+ n = !0,
+ t(e)
+ },
+ get resolved() {
+ return n
+ }
+ }
+ }
+ function _() {
+ let t = Promise.resolve();
+ const n = {};
+ return {
+ get promise() {
+ return t
+ },
+ has: t => !!n[t],
+ add(e) {
+ const i = F();
+ n[e] = i,
+ t = t.then((() => i.promise))
+ },
+ resolve(t) {
+ const e = n[t];
+ e && (e.resolve(null),
+ delete n[t])
+ },
+ isResolved(t) {
+ const e = n[t];
+ return !e || e.resolved
+ }
+ }
+ }
+ function N({ keys: t, held: n, handler: e, keyEvent: i = "keydown" }) {
+ let o = [];
+ const r = i => {
+ t.flat().includes(i.key) ? (o.push(i.key),
+ (e => {
+ const i = t.every((t => o.includes(t)))
+ , r = !n || ((t, n) => n.some((n => t.getModifierState(n))))(e, n);
+ return i && r
+ }
+ )(i) && !a() && e(i)) : s()
+ }
+ , a = () => {
+ const t = document.activeElement;
+ return null != t && null != t.nodeName && ("INPUT" === t.nodeName || "SELECT" === t.nodeName || "TEXTAREA" === t.nodeName || t.hasAttribute("contenteditable"))
+ }
+ , s = () => {
+ o = []
+ }
+ ;
+ return document.addEventListener(i, r, {
+ capture: !0
+ }),
+ () => {
+ document.removeEventListener(i, r, {
+ capture: !0
+ })
+ }
+ }
+ function U() {
+ const t = window.shopify.config.host;
+ return "https://" + atob(t)
+ }
+ const D = Symbol()
+ , j = Symbol()
+ , q = Symbol()
+ , z = Symbol()
+ , V = "data-save-bar"
+ , H = "data-discard-confirmation"
+ , W = "ui-save-bar"
+ , X = "update";
+ function K(t, { onChange: n, filter: e = () => !0 }) {
+ function i() {
+ const i = nt(t).filter((t => Y(t) && e(t)));
+ let o = !1
+ , r = !1;
+ for (const t of i)
+ if (o = [].some.call(t.elements, Q),
+ o)
+ break;
+ for (const t of i)
+ if (r = t.hasAttribute(H),
+ r)
+ break;
+ const a = o ? {
+ discardConfirmation: r,
+ saveButton: {
+ onAction: () => function (t) {
+ for (const n of nt(t))
+ Y(n) && Z(n)
+ }(t)
+ },
+ discardButton: {
+ onAction: () => function (t) {
+ for (const n of nt(t))
+ Y(n) && tt(n)
+ }(t)
+ }
+ } : void 0;
+ n(a)
+ }
+ function o(t) {
+ const n = "target" in t ? t.target : t;
+ n && (n[D] || ("values" in n && (n[q] = n.values),
+ "value" in n && ("defaultValue" in n && (n.defaultValue = n.value),
+ n[j] = n.value),
+ "checked" in n && (n[z] = n.checked)))
+ }
+ function r(t) {
+ const n = t.target;
+ n && (n[D] = !0,
+ i())
+ }
+ function a(t) {
+ const n = t.target;
+ if (Y(n)) {
+ for (const t of n.elements)
+ t[D] = !1,
+ o(t);
+ i()
+ }
+ }
+ function s(t) {
+ const n = t.target;
+ if (Y(n)) {
+ for (const t of n.elements) {
+ if (q in t && "values" in t && (t.values = t[q]),
+ j in t) {
+ const n = Object.getOwnPropertyDescriptor(t.constructor.prototype, "value");
+ n && n.set ? n.set.call(t, t[j]) : t.value = t[j]
+ }
+ z in t && (t.checked = t[z]),
+ t[D] = !1,
+ o(t),
+ J(t),
+ t[D] = !1
+ }
+ i()
+ }
+ }
+ i();
+ const c = new MutationObserver((t => {
+ for (const n of t)
+ if (n.attributeName && "form" === n.target.nodeName.toLowerCase())
+ return i()
+ }
+ ));
+ return c.observe(t, {
+ subtree: !0,
+ childList: !0,
+ attributes: !0,
+ attributeFilter: [V, H]
+ }),
+ t.addEventListener("focusin", o),
+ t.addEventListener("beforeinput", o),
+ t.addEventListener("change", r),
+ t.addEventListener("input", r),
+ t.addEventListener("submit", a),
+ t.addEventListener("reset", s),
+ {
+ onChange: i,
+ unobserve: () => {
+ c.disconnect(),
+ t.removeEventListener("focusin", o),
+ t.removeEventListener("beforeinput", o),
+ t.removeEventListener("change", r),
+ t.removeEventListener("input", r),
+ t.removeEventListener("submit", a),
+ t.removeEventListener("reset", s)
+ }
+ }
+ }
+ function G(t, { onChange: n, filter: e = () => !0 }) {
+ function i() {
+ var i, o, r, a, s, c;
+ const l = Array.from(t.querySelectorAll(W)).filter((t => e(t) && t.showing))
+ , u = l.length > 0 ? l[l.length - 1] : void 0
+ , d = u ? {
+ discardConfirmation: u.discardConfirmation,
+ saveButton: {
+ loading: null == (i = u.saveButton) ? void 0 : i.loading,
+ disabled: null == (o = u.saveButton) ? void 0 : o.disabled,
+ onAction: null == (r = u.saveButton) ? void 0 : r.onAction
+ },
+ discardButton: {
+ loading: null == (a = u.discardButton) ? void 0 : a.loading,
+ disabled: null == (s = u.discardButton) ? void 0 : s.disabled,
+ onAction: null == (c = u.discardButton) ? void 0 : c.onAction
+ }
+ } : void 0;
+ n(d)
+ }
+ function o(t) {
+ var n;
+ (n = t.target) && n instanceof Element && n.nodeName.toLowerCase() === W && (t.stopPropagation(),
+ i())
+ }
+ return t.addEventListener(X, o),
+ {
+ onChange: i,
+ unobserve: () => {
+ t.removeEventListener(X, o)
+ }
+ }
+ }
+ function J(t) {
+ !("type" in t) || "radio" !== t.type && "checkbox" !== t.type || t.dispatchEvent(new Event("click", {
+ bubbles: !0
+ })),
+ t.dispatchEvent(new InputEvent("input", {
+ bubbles: !0,
+ inputType: "reset"
+ })),
+ t.dispatchEvent(new Event("change", {
+ bubbles: !0
+ }))
+ }
+ function Y(t) {
+ return !!t && t instanceof Element && "form" === t.nodeName.toLowerCase() && t.hasAttribute(V)
+ }
+ function Q(t) {
+ return !0 === t[D] && ("value" in t && t.value !== t[j] || "values" in t && t.values !== t[q] || "checked" in t && t.checked !== t[z])
+ }
+ function Z(t) {
+ if (t.requestSubmit)
+ return t.requestSubmit();
+ const n = document.createElement("input");
+ n.type = "submit",
+ n.hidden = !0,
+ t.appendChild(n),
+ n.click(),
+ t.removeChild(n)
+ }
+ function tt(t) {
+ t.reset()
+ }
+ function nt(t) {
+ const n = Array.from(t.querySelectorAll("form"));
+ return t instanceof HTMLFormElement && n.push(t),
+ n
+ }
+ class et {
+ constructor() {
+ this.listeners = new Map
+ }
+ addEventListener(t, n) {
+ this.listeners.has(t) || this.listeners.set(t, new Set),
+ this.listeners.get(t).add(n)
+ }
+ removeEventListener(t, n) {
+ this.listeners.has(t) && this.listeners.get(t).delete(n)
+ }
+ async dispatchEvent(t, n, e) {
+ if (!this.listeners.has(t))
+ return !0;
+ c(n);
+ const i = new CustomEvent(t, {
+ detail: n
+ })
+ , o = Promise.all(Array.from(this.listeners.get(t)).map((t => t(i)))).finally((() => u(n)));
+ return !1 !== (null == e ? void 0 : e.wait) && await o,
+ !i.defaultPrevented
+ }
+ }
+ const it = /\/app\-?bridge[/.-]/i
+ , ot = "https://cdn.shopify.com/shopifycloud/app-bridge.js"
+ , rt = null != (e = "object" == typeof document ? null == (n = window.document.currentScript) ? void 0 : n.src : void 0) ? e : ot
+ , at = function (t) {
+ try {
+ return new URL(t).origin
+ } catch (n) {
+ return null
+ }
+ }(rt) || ""
+ , st = {
+ apiKey: "",
+ appOrigins: [],
+ debug: {},
+ disabledFeatures: [],
+ experimentalFeatures: [],
+ locale: "en-US",
+ host: ""
+ }
+ , ct = new URL(/^https:\/\/cdn\.shopify(\.com|cdn\.net)$/.test(at) ? rt : ot).hostname;
+ function lt(t, n) {
+ var e, i;
+ switch (t) {
+ case "disabledFeatures":
+ case "experimentalFeatures":
+ case "appOrigins":
+ return null != (i = null == (e = null == n ? void 0 : n.split(",")) ? void 0 : e.map((t => t.trim()))) ? i : void 0;
+ case "debug":
+ return {
+ webVitals: null == n ? void 0 : n.includes("web-vitals")
+ };
+ default:
+ return n
+ }
+ }
+ const ut = ["apiKey", "shop"]
+ , dt = C() || L() ? /(^admin\.shopify\.com|\.myshopify\.com|\.spin\.dev|admin\.shop\.dev|localhost|\.myshopify\.io)$/ : /(^admin\.shopify\.com|\.spin\.dev|admin\.shop\.dev|localhost)$/
+ , ft = {
+ TITLE_BAR: "TITLEBAR",
+ WEBVITALS: "WEB_VITALS"
+ };
+ function ht(t, n) {
+ var e;
+ const [i, ...o] = t.split(".")
+ , r = pt(i);
+ let a = "APP::" + (null != (e = ft[r]) ? e : r);
+ for (const c of o)
+ a += "::" + pt(c);
+ const s = {
+ group: i,
+ type: a
+ };
+ return null != n && (s.payload = n),
+ s
+ }
+ function pt(t) {
+ return t.replace(/([a-z])([A-Z])/g, "$1_$2").toUpperCase()
+ }
+ const vt = Symbol();
+ function mt(t, n, e) {
+ const i = t[n];
+ return Object.defineProperty(t, n, {
+ enumerable: !0,
+ configurable: !0,
+ value: e,
+ writable: !0
+ }),
+ e[vt] = i,
+ i
+ }
+ function wt(t, n) {
+ const e = t[n][vt];
+ e && Object.defineProperty(t, n, {
+ enumerable: !0,
+ configurable: !0,
+ value: e,
+ writable: !0
+ })
+ }
+ const bt = ({ api: t, protocol: n, internalApiPromise: e }) => {
+ const i = self.fetch;
+ async function o(t, n) {
+ const e = new Headers(n.headers).get("Shopify-Challenge-Required");
+ return e && (null == t ? void 0 : t.isChallengeUrl) && await t.isChallengeUrl(e) && (null == t ? void 0 : t.startChallenge) ? {
+ verified: await t.startChallenge(e)
+ } : {
+ verified: !1
+ }
+ }
+ mt(globalThis, "fetch", (async function (r, a) {
+ var s;
+ const c = new Request(r instanceof Request ? r.clone() : r, a)
+ , { appOrigins: l = [] } = t.config
+ , u = new URL(c.url)
+ , d = u.protocol === location.protocol && (u.hostname === location.hostname || u.hostname.endsWith("." + location.hostname)) || l.includes(u.origin)
+ , f = "cdn.shopify.com" === u.hostname
+ , { adminApi: h, trustChallenge: p } = await e || {};
+ if (!d && !f && "function" == typeof (null == h ? void 0 : h.shouldIntercept) && "function" == typeof h.fetch) {
+ const t = Array.from(c.headers.entries())
+ , n = await h.shouldIntercept(c.method, c.url, t);
+ if (null == n ? void 0 : n.intercept) {
+ const n = {
+ method: c.method,
+ url: c.url,
+ headers: t,
+ body: null != (s = await c.text()) ? s : void 0
+ }
+ , e = await h.fetch(n);
+ if (!p)
+ return new Response(e.body, e);
+ const { verified: i } = await o(p, e);
+ if (i) {
+ const t = await h.fetch(n);
+ return new Response(t.body, t)
+ }
+ return new Response(e.body, e)
+ }
+ }
+ const v = d && !c.headers.has("Authorization");
+ v && c.headers.set("Authorization", "Bearer " + await t.idToken()),
+ d && !c.headers.has("X-Requested-With") && c.headers.set("X-Requested-With", "XMLHttpRequest"),
+ d && !c.headers.has("Accept-Language") && void 0 !== t.config.locale && c.headers.set("Accept-Language", t.config.locale);
+ const m = c.clone();
+ let w = await i(c);
+ w.headers.get("X-Shopify-Retry-Invalid-Session-Request") && v && (m.headers.set("Authorization", "Bearer " + await t.idToken()),
+ w = await i(m));
+ const b = w.headers.get("X-Shopify-API-Request-Failure-Reauthorize-Url");
+ if (d && b)
+ return n.send("Navigation.redirect.remote", {
+ url: new URL(b, location.href).href
+ }),
+ new Promise((() => { }
+ ));
+ if (d) {
+ const { verified: t } = await o(p, w);
+ if (t)
+ return await i(m)
+ }
+ return w
+ }
+ ))
+ }
+ , yt = ({ api: t, protocol: n, internalApiPromise: e }) => {
+ t.idToken = async function () {
+ const { idToken: t } = await e || {};
+ return t ? await t() : new Promise((t => {
+ n.subscribe("SessionToken.respond", (({ sessionToken: n }) => {
+ t(n)
+ }
+ ), {
+ once: !0
+ }),
+ n.send("SessionToken.request")
+ }
+ ))
+ }
+ }
+ , gt = Symbol();
+ class At {
+ constructor(t, n, e, i) {
+ this.action = t,
+ this.type = n,
+ this.data = e,
+ this[gt] = i
+ }
+ finish() {
+ this[gt]()
+ }
+ }
+ class Et {
+ constructor(t) {
+ this.complete = t
+ }
+ }
+ async function kt(t) {
+ try {
+ const n = "function" == typeof t ? t() : (await t)();
+ return await Promise.resolve(n)
+ } catch (n) { }
+ }
+ const Ct = ["shopify:", "app:", "extension:"]
+ , Pt = [...Ct, "https:", "http:"]
+ , Lt = ["_self", "_top", "_parent", "_blank"]
+ , Tt = ["a", "s-link", "s-button", "s-clickable"]
+ , St = Symbol("SIMULATING_CLICK");
+ function It(t, n) {
+ addEventListener("click", (function e(i) {
+ i.target === t && (removeEventListener("click", e),
+ i.defaultPrevented || n(i))
+ }
+ ))
+ }
+ function xt(t, n = !0) {
+ let e = new URL(t, location.href);
+ if (Ct.includes(e.protocol)) {
+ const t = `${e.host}${e.pathname}${e.search}`
+ , n = t.startsWith("/") ? t : "/" + t;
+ e = new URL(`${e.protocol}${n}`)
+ }
+ return n && "app:" === e.protocol && (e.host = location.host,
+ e.protocol = location.protocol),
+ e.origin === location.origin ? (e.hash = "",
+ O(e)) : e
+ }
+ function Mt(t, n, e) {
+ const i = xt(t)
+ , o = [...Tt.map((t => "ui-nav-menu > " + t)), ...Tt.map((t => t))].join(",");
+ return Array.from(document.querySelectorAll(o)).filter((t => {
+ var o, r;
+ const a = t.getAttribute("href")
+ , s = null != (o = t.getAttribute("target")) ? o : "_self"
+ , c = null != (r = t.getAttribute("rel")) ? r : "";
+ return !(!a || !Ot(i, xt(a)) || n && s !== n || e && c !== e)
+ }
+ ))[0]
+ }
+ function Rt(t) {
+ return t.replace(/\/+$/g, "")
+ }
+ function Ot(t, n) {
+ if (t.href === n.href)
+ return !0;
+ if (t.protocol !== n.protocol || t.host !== n.host || Rt(t.pathname) !== Rt(n.pathname))
+ return !1;
+ if (!t.search && !n.search)
+ return !0;
+ if (!t.search || !n.search)
+ return !1;
+ const e = new URLSearchParams(t.search)
+ , i = new URLSearchParams(n.search)
+ , o = Array.from(e.entries()).sort((([t], [n]) => t.localeCompare(n)))
+ , r = Array.from(i.entries()).sort((([t], [n]) => t.localeCompare(n)));
+ return o.length === r.length && o.every((([t, n], e) => t === r[e][0] && n === r[e][1]))
+ }
+ const $t = ({ internalApiPromise: t, saveBarManager: n, rpcEventTarget: e }) => {
+ const i = new AbortController;
+ async function o(e) {
+ var i;
+ const { navigation: o } = await t
+ , r = new URL(e.detail.destination.url, location.href)
+ , a = `${r.pathname}${r.search}`;
+ if (n.isSaveBarVisible)
+ return;
+ const s = xt(a);
+ if (Ot(s, xt(location.href)))
+ return;
+ const c = Mt(s, "_self")
+ , { pathname: l, search: u } = s;
+ c ? (c[St] = !0,
+ It(c, (t => {
+ (function (t) {
+ var n;
+ const e = t.getAttribute("href");
+ if (!e)
+ return !1;
+ const i = xt(e)
+ , o = null != (n = t.getAttribute("target")) ? n : "_self";
+ return i.origin === location.origin && "_self" === o
+ }
+ )(c) && (t.preventDefault(),
+ t.stopImmediatePropagation(),
+ kt((() => {
+ var t;
+ return null == (t = null == o ? void 0 : o.navigate) ? void 0 : t.call(o, `app:${l}${u}`)
+ }
+ )))
+ }
+ )),
+ c.click(),
+ c[St] = !1) : await (null == (i = null == o ? void 0 : o.navigate) ? void 0 : i.call(o, `app:${l}${u}`))
+ }
+ e.addEventListener("navigate", o),
+ i.signal.addEventListener("abort", (() => {
+ e.removeEventListener("navigate", o)
+ }
+ )),
+ addEventListener("beforeunload", (() => i.abort())),
+ addEventListener("click", (t => {
+ var e, i;
+ if (t.target && t.target[St])
+ return;
+ if (t.defaultPrevented)
+ return;
+ const o = function (t) {
+ if (!t)
+ return;
+ let n = t;
+ for (; n;) {
+ if (n instanceof Element && Tt.includes(n.nodeName.toLowerCase())) {
+ if (null == n.getAttribute("href")) {
+ n = n.parentNode;
+ continue
+ }
+ return n
+ }
+ n = n.parentNode
+ }
+ }(t.target)
+ , r = null == o ? void 0 : o.getAttribute("href")
+ , a = null != (e = null == o ? void 0 : o.getAttribute("target")) ? e : "_self"
+ , s = null != (i = null == o ? void 0 : o.getAttribute("rel")) ? i : void 0;
+ if (!o || !r)
+ return;
+ const { protocol: u } = xt(r);
+ return Pt.includes(u) ? n.isSaveBarVisible ? (t.preventDefault(),
+ t.stopImmediatePropagation(),
+ void l()) : void It(o, (t => {
+ c(r, a, s) && (t.preventDefault(),
+ t.stopImmediatePropagation())
+ }
+ )) : void 0
+ }
+ ), !0);
+ const r = self.open;
+ mt(self, "open", (function (t, e, i) {
+ const o = t ? xt(t).protocol : void 0;
+ if (null == t || !o || !Pt.includes(o))
+ return r.call(this, t, e, i);
+ if (n.isSaveBarVisible)
+ return l(),
+ null;
+ const a = Mt(t, null != e ? e : "_blank", i);
+ return a ? (a.click(),
+ null) : c(t, null != e ? e : "_blank", i) ? null : r.call(this, t, e, i)
+ }
+ ));
+ const a = {
+ async pushState(n) {
+ var e;
+ const { navigation: i } = await t || {};
+ if (!i || !n)
+ return;
+ const { pathname: o, search: r } = xt(n);
+ await (null == (e = null == i ? void 0 : i.navigate) ? void 0 : e.call(i, `app:${o}${r}`, {
+ history: "push"
+ }))
+ },
+ async replaceState(n) {
+ var e;
+ const { navigation: i } = await t || {};
+ if (!i || !n)
+ return;
+ const { pathname: o, search: r } = xt(n);
+ await (null == (e = null == i ? void 0 : i.navigate) ? void 0 : e.call(i, `app:${o}${r}`, {
+ history: "replace"
+ }))
+ }
+ }
+ , s = history.replaceState;
+ function c(e, i, o = "") {
+ const a = xt(e);
+ if (!Lt.includes(i) || !Pt.includes(a.protocol))
+ return !1;
+ const s = `${a.pathname}${a.search}`;
+ if ("shopify:" === a.protocol && !s.startsWith("/admin/"))
+ throw Error(`Invalid URL: expected '/admin/*', received: '${s}'.`);
+ if ("shopify:" === a.protocol && "_self" === i)
+ return console.warn("Admin page cannot be opened in the same context."),
+ !0;
+ switch (i) {
+ case "_self":
+ return r.call(this, a, i, o),
+ !0;
+ case "_top":
+ case "_parent":
+ return n.isSaveBarVisible ? (l(),
+ !0) : (kt((async () => {
+ var n;
+ const { navigation: e } = await t;
+ null == (n = null == e ? void 0 : e.navigate) || n.call(e, a.toString(), "shopify:" === a.protocol ? void 0 : "_top")
+ }
+ )),
+ !0);
+ case "_blank":
+ return !!/noopener/i.test(o) && (kt((async () => {
+ var n;
+ const { navigation: e } = await t;
+ null == (n = null == e ? void 0 : e.navigate) || n.call(e, a.toString(), i)
+ }
+ )),
+ !0)
+ }
+ return !1
+ }
+ async function l() {
+ n.isSaveBarVisible && await kt((async () => {
+ var n;
+ const { saveBar: e } = await t || {};
+ await (null == (n = null == e ? void 0 : e.leaveConfirmation) ? void 0 : n.call(e))
+ }
+ ))
+ }
+ mt(history, "pushState", (function (t, n, e) {
+ s.call(history, t, n, e),
+ a.pushState(e)
+ }
+ )),
+ mt(history, "replaceState", (function (t, n, e) {
+ s.call(history, t, n, e),
+ a.replaceState(e)
+ }
+ )),
+ addEventListener("beforeunload", (t => {
+ n.isSaveBarVisible && (t.preventDefault(),
+ t.returnValue = !0)
+ }
+ )),
+ a.replaceState(location.href)
+ }
+ , Bt = ({ protocol: t, internalApiPromise: n }) => {
+ const e = new AbortController
+ , i = self.navigation;
+ function o(n, e) {
+ if (!n)
+ return;
+ const i = O(new URL(n, location.href))
+ , o = `${i.pathname}${i.search}${i.hash}`;
+ x && t.send("Navigation.history." + e, {
+ path: o
+ })
+ }
+ if (i && "navigate" in i) {
+ i.navigate;
+ const n = mt(i, "navigate", (function (e, i) {
+ const o = s(e);
+ return o ? (t.send("Navigation.redirect.admin.path", {
+ path: o
+ }),
+ {
+ committed: new Promise((() => { }
+ )),
+ finished: new Promise((() => { }
+ ))
+ }) : n.call(this, e, i)
+ }
+ ));
+ e.signal.addEventListener("abort", (() => {
+ wt(i, "navigate")
+ }
+ ))
+ }
+ if (i && "oncurrententrychange" in i)
+ i.addEventListener("currententrychange", (t => {
+ var n, e;
+ (null == (n = t.from) ? void 0 : n.url) !== (null == (e = i.currentEntry) ? void 0 : e.url) && o(location.href, "replace")
+ }
+ ), {
+ signal: e.signal
+ });
+ else {
+ const t = history.pushState;
+ mt(history, "pushState", (function (n, e, i) {
+ const r = location.href;
+ t.call(this, n, e, i),
+ i && new URL(i, r).href !== r && o(i, "replace")
+ }
+ )),
+ e.signal.addEventListener("abort", (() => {
+ wt(history, "pushState")
+ }
+ ));
+ const n = history.replaceState;
+ mt(history, "replaceState", (function (t, e, i) {
+ const r = location.href;
+ n.call(this, t, e, i),
+ i && new URL(i, r).href !== r && o(i, "replace")
+ }
+ )),
+ e.signal.addEventListener("abort", (() => {
+ wt(history, "replaceState")
+ }
+ )),
+ addEventListener("popstate", (() => {
+ o(location.href, "replace")
+ }
+ ), {
+ signal: e.signal
+ })
+ }
+ const r = self.open;
+ mt(self, "open", (function (e, i, o) {
+ if (null == e)
+ return r.call(this, e, i, o);
+ const a = function (t) {
+ const n = new URL(t, location.href);
+ return "app:" === n.protocol ? new URL(n.href.replace(/^app:\/{0,2}/, ""), location.href).href : n.href
+ }(e);
+ if ("extension:" === new URL(a).protocol)
+ return void (async () => {
+ const { navigation: t } = await n || {};
+ if ("function" != typeof (null == t ? void 0 : t.navigate))
+ throw Error("Missing navigation API");
+ t.navigate(a)
+ }
+ )();
+ i = (i || "") + "",
+ o = (o || "") + "";
+ const c = s(a);
+ if (c)
+ return t.send("Navigation.redirect.admin.path", {
+ path: c,
+ newContext: "" === i || "_blank" === i
+ }),
+ null;
+ switch (i) {
+ case "_self":
+ break;
+ case "_top":
+ case "_parent":
+ return t.send("Navigation.redirect.remote", {
+ url: a
+ }),
+ top;
+ case "_modal":
+ throw Error("_modal is not yet implemented");
+ case "":
+ case "_blank":
+ if (!/noopener/i.test(o) && !C() && !L())
+ break;
+ return t.send("Navigation.redirect.remote", {
+ url: a,
+ newContext: !0
+ }),
+ null
+ }
+ return r.call(this, a, i, o)
+ }
+ )),
+ e.signal.addEventListener("abort", (() => {
+ wt(self, "open")
+ }
+ )),
+ addEventListener("click", (t => {
+ let n = t.target;
+ for (; n;) {
+ if (n instanceof Element && ["A", "S-LINK", "S-BUTTON", "S-CLICKABLE"].includes(n.nodeName)) {
+ const e = n.getAttribute("href");
+ if (null == e) {
+ n = n.parentNode;
+ continue
+ }
+ const i = new URL(e, location.href)
+ , o = i.protocol;
+ if ("shopify:" === o || "app:" === o || "extension:" === o) {
+ t.preventDefault();
+ const o = n.getAttribute("target") || void 0
+ , r = n.getAttribute("rel") || void 0;
+ if (navigator.userAgent.includes("Shopify Mobile/iOS") && navigator.userAgent.includes("Unframed")) {
+ const t = i.href.replace(/shopify:\/*admin/, "https://" + atob(shopify.config.host || ""));
+ return void open(t, o, r)
+ }
+ return void open(e, o, r)
+ }
+ }
+ n = n.parentNode
+ }
+ }
+ ), {
+ signal: e.signal
+ }),
+ o(location.href, "replace");
+ const a = /^shopify:\/*admin\//i;
+ function s(t) {
+ const n = O(new URL(t)).href;
+ if (a.test(n))
+ return n.replace(a, "/")
+ }
+ return () => {
+ e.abort()
+ }
+ }
+ , Ft = t => t.toString(16)
+ , _t = `${Ft(Date.now())}-${Ft(1e9 * Math.random() | 0)}-`;
+ let Nt = 0;
+ function Ut() {
+ return _t + Ft(++Nt)
+ }
+ const Dt = new Set(["product", "variant", "collection"])
+ , jt = {
+ query: "",
+ selectionIds: [],
+ action: "add",
+ multiple: !1,
+ filter: {
+ hidden: !0,
+ variants: !0,
+ draft: void 0,
+ archived: void 0,
+ query: void 0
+ }
+ };
+ var qt = (t => (t[t.ELEMENT_NODE = 1] = "ELEMENT_NODE",
+ t[t.ATTRIBUTE_NODE = 2] = "ATTRIBUTE_NODE",
+ t[t.TEXT_NODE = 3] = "TEXT_NODE",
+ t[t.COMMENT_NODE = 8] = "COMMENT_NODE",
+ t))(qt || {});
+ const zt = {
+ oneOf(t, { caseInsensitive: n = !0 } = {}) {
+ n && (t = t.map((t => t.toLowerCase())));
+ const e = new Set(t);
+ return t => (n && (t = null == t ? void 0 : t.toLowerCase()),
+ e.has(t))
+ },
+ anyString: () => t => "string" == typeof t,
+ flag: () => t => null != t && 0 === t.length
+ }
+ , Vt = {
+ anyText: {
+ type: 3
+ },
+ anyElement: {
+ type: 1
+ }
+ };
+ function Ht(t) {
+ return `<${t.localName}>`
+ }
+ function Wt(t, n) {
+ return !(n.type && n.type !== t.nodeType || n.name && n.name !== t.localName)
+ }
+ function Xt(t, n) {
+ var e;
+ if (n.type && n.type !== t.nodeType || n.name && n.name !== t.localName)
+ throw Error("Unexpected tag " + t.outerHTML);
+ const { attributes: i, children: o } = n;
+ if (i)
+ if (1 === t.nodeType)
+ n.attributes && function (t, n = {}) {
+ var e, i;
+ const o = Object.entries(n)
+ , r = new Set(t.getAttributeNames().map((t => t.toLowerCase())));
+ for (const [s, c] of o) {
+ const n = s.toLowerCase();
+ r.delete(n) ? c.value && (Kt(c.value)(null != (i = null == (e = t.getAttribute(n)) ? void 0 : e.toLowerCase()) ? i : null, n, t) || console.error(`Unexpected value for attribute "${n}" on ${Ht(t)}`)) : c.required && console.error(`Missing attribute "${n}" on ${Ht(t)}`)
+ }
+ const a = Array.from(r).filter((t => !t.startsWith("data-")));
+ 0 !== a.length && console.error(`Unexpected attributes on ${Ht(t)}: ${a}`)
+ }(t, i);
+ else if (3 === t.nodeType && (null == (e = i.data) ? void 0 : e.value) && !Kt(i.data.value)(t.data, "data", t))
+ throw Error("Unexpected text");
+ if (o)
+ for (const r of t.childNodes) {
+ if (8 === r.nodeType)
+ continue;
+ if (3 === r.nodeType && 0 === r.data.trim().length)
+ continue;
+ const n = o.find((t => Wt(r, t)));
+ if (!n)
+ throw Error(`Unexpected tag <${r.outerHTML}> in ${Ht(t)}`);
+ Xt(r, n)
+ }
+ }
+ function Kt(t) {
+ return "function" == typeof t ? t : t instanceof RegExp ? n => (t.lastIndex = 0,
+ t.test(null != n ? n : "")) : n => t === n
+ }
+ const Gt = {
+ value: zt.anyString()
+ }
+ , Jt = {
+ id: Gt,
+ name: Gt,
+ class: Gt,
+ rel: Gt,
+ onclick: Gt
+ }
+ , Yt = {
+ ...Jt,
+ type: Gt,
+ value: Gt
+ }
+ , Qt = {
+ ...Jt,
+ active: Gt,
+ href: Gt,
+ target: Gt
+ };
+ function Zt(t) {
+ const n = {
+ name: t,
+ attributes: {},
+ children: [{
+ name: "a",
+ attributes: Qt,
+ children: [Vt.anyText]
+ }, {
+ name: "s-link",
+ attributes: Qt,
+ children: [Vt.anyText]
+ }]
+ };
+ return ({ protocol: e, internalApiPromise: i }) => {
+ async function o() {
+ const { navigation: t } = await i || {};
+ return !(2 !== (null == t ? void 0 : t.version))
+ }
+ let r;
+ function a() {
+ r || (r = setTimeout(s, 0))
+ }
+ async function s() {
+ clearTimeout(r);
+ const n = Array.from(document.querySelectorAll(t)).reverse()[0]
+ , { navMenu: a } = await i || {};
+ if (n && "function" == typeof (null == a ? void 0 : a.set)) {
+ const t = n.anchors.filter((t => !n.isHomeAnchor(t))).map((t => {
+ const { pathname: n, search: e, textContent: i, rel: o } = t;
+ return {
+ label: null != i ? i : "",
+ url: new URL(n + e, location.href).toString(),
+ rel: o || void 0
+ }
+ }
+ ));
+ if (a.set(t),
+ await o())
+ return
+ }
+ const s = await c;
+ if (!s)
+ return void console.warn(t + " cannot be used in modal context");
+ const l = document.querySelectorAll("s-app-nav, ui-nav-menu");
+ l.length > 1 && console.warn(`Multiple navigation menu elements detected (${l.length} total). Only one or should be used per page. Found: ${Array.from(l).map((t => t.tagName.toLowerCase())).join(", ")}`);
+ const u = {
+ items: Array.from(document.querySelectorAll(t)).flatMap((t => t.menuItems()))
+ };
+ e.send(`Menu.${s}_Menu.UPDATE`, u),
+ r = 0
+ }
+ const c = new Promise((t => {
+ e.subscribe("getState", (({ features: n }) => {
+ const e = (null == n ? void 0 : n.Menu) || {}
+ , { Dispatch: i } = e["APP::MENU::NAVIGATION_MENU::UPDATE"] || {}
+ , { Dispatch: o } = e["APP::MENU::CHANNEL_MENU::UPDATE"] || {};
+ t(o ? "channel" : i ? "navigation" : void 0)
+ }
+ ), {
+ once: !0
+ })
+ }
+ ))
+ , l = new WeakMap;
+ function u(t, n) {
+ if (n && n.homeAnchor === t)
+ return null;
+ if (!n && t.getAttribute && "home" === t.getAttribute("rel"))
+ return null;
+ if (!l.has(t)) {
+ const n = "href" in t ? btoa(t.href) : Ut();
+ l.set(t, n)
+ }
+ return l.get(t)
+ }
+ b(t, class extends g {
+ get anchors() {
+ const t = [];
+ return Array.from(this.children).forEach((n => {
+ if ("A" === n.tagName)
+ t.push(n);
+ else if ("S-LINK" === n.tagName) {
+ const e = n
+ , i = e.getAttribute("href");
+ if (!i)
+ return;
+ const o = new URL(i, location.href)
+ , r = {
+ href: o.href,
+ pathname: o.pathname,
+ search: o.search,
+ textContent: e.textContent,
+ rel: e.getAttribute("rel"),
+ protocol: o.protocol,
+ hasAttribute: t => e.hasAttribute(t),
+ getAttribute: t => e.getAttribute(t),
+ click: () => {
+ const t = new MouseEvent("click", {
+ bubbles: !0,
+ cancelable: !0
+ });
+ e.dispatchEvent(t)
+ }
+ };
+ t.push(r)
+ }
+ }
+ )),
+ t
+ }
+ get homeAnchor() {
+ return this.anchors.find((t => ((t.rel || "") + "").includes("home")))
+ }
+ isHomeAnchor(t) {
+ return ((t.rel || "") + "").includes("home")
+ }
+ connectedCallback() {
+ this.t = new AbortController;
+ const t = {
+ signal: this.t.signal
+ };
+ kt((async () => {
+ await o() || (e.subscribe("Navigation.redirect.app", (t => this.i(t)), t),
+ addEventListener("popstate", (() => this.o()), t))
+ }
+ )),
+ addEventListener("beforeunload", (() => this.l()), t),
+ this.u = new MutationObserver((() => this.o())),
+ this.u.observe(this, {
+ childList: !0,
+ subtree: !0,
+ attributes: !0,
+ characterData: !0
+ }),
+ this.o()
+ }
+ async i(t) {
+ var n, o;
+ if (!this.t)
+ return;
+ const { pathname: r, href: a } = O(new URL(t.path, location.href));
+ if (a === O(location.href).href)
+ return;
+ const c = t => {
+ for (const [n, e] of this.h())
+ if (e.destination.path === t)
+ return n
+ }
+ , l = this.homeAnchor
+ , u = null != (o = null != (n = c(t.path)) ? n : c(r)) ? o : l;
+ if (u) {
+ let t = function (t) {
+ n = t.defaultPrevented,
+ t.preventDefault()
+ };
+ if ("http:" !== u.protocol && "https:" !== u.protocol || new URL("", u.href).href === new URL("", location.href).href)
+ return u.click(),
+ void s();
+ let n = !1;
+ if (addEventListener("click", t),
+ u.click(),
+ removeEventListener("click", t),
+ n)
+ return void s()
+ }
+ u && s();
+ const { navigation: d } = await i || {};
+ if ((null == d ? void 0 : d.navigate) && "function" == typeof d.navigate) {
+ const n = new URL(t.path, location.href);
+ d.navigate(`app:/${n.pathname}${n.search}`)
+ } else {
+ this.l();
+ const n = `${t.path}${t.path.includes("?") ? "&=" : "?="}`;
+ e.send("Navigation.redirect.app", {
+ path: n
+ })
+ }
+ }
+ o() {
+ Xt(this, n),
+ a()
+ }
+ l() {
+ var t, n;
+ null == (t = this.t) || t.abort(),
+ this.t = void 0,
+ null == (n = this.u) || n.disconnect(),
+ this.u = void 0
+ }
+ disconnectedCallback() {
+ this.l(),
+ a()
+ }
+ *h(t = !1) {
+ var n;
+ const e = this.anchors;
+ for (const i of e) {
+ const e = null != (n = i.textContent) ? n : ""
+ , o = i.pathname + i.search;
+ t === this.isHomeAnchor(i) && (yield [i, {
+ id: u(i, this),
+ destination: {
+ path: o
+ },
+ label: e,
+ redirectType: "APP::NAVIGATION::REDIRECT::APP"
+ }])
+ }
+ }
+ menuItems(t = !1) {
+ return Array.from(this.h(t)).map((([, t]) => t))
+ }
+ selectedMenuItemId() {
+ const t = this.anchors.filter((t => !this.isHomeAnchor(t)));
+ let n = t.find((t => t.hasAttribute("active")));
+ if (!n) {
+ const e = O(location.href);
+ e.hash = "",
+ n = t.find((t => t.href === e.href))
+ }
+ return n ? u(n, this) : null
+ }
+ }
+ )
+ }
+ }
+ const tn = Zt("s-app-nav")
+ , nn = {
+ breadcrumb: ':scope > s-button[slot="breadcrumb-actions"], :scope > s-link[slot="breadcrumb-actions"]',
+ primaryAction: ':scope > s-button[slot="primary-action"], :scope > s-link[slot="primary-action"]',
+ secondaryActions: ':scope > s-button[slot="secondary-actions"], :scope > s-link[slot="secondary-actions"]',
+ accessory: '[slot="accessory"]'
+ }
+ , en = Symbol("s-page-element-id");
+ function on(t = {}) {
+ var n;
+ const { hideElements: e = !1, context: i = document } = t
+ , o = i.querySelector("s-page");
+ if (!o)
+ return null;
+ const r = {
+ title: o.getAttribute("heading") || void 0
+ }
+ , a = o.querySelector(nn.breadcrumb);
+ a && (r.breadcrumb = a,
+ e && (a.style.display = "none"));
+ const s = o.querySelector(nn.primaryAction);
+ s && (r.primaryAction = s,
+ e && (s.style.display = "none"));
+ const c = Array.from(o.querySelectorAll(nn.secondaryActions));
+ c.length > 0 && (r.secondaryActions = c,
+ e && c.forEach((t => {
+ t.style.display = "none"
+ }
+ )));
+ const l = o.querySelector(nn.accessory);
+ if (l) {
+ const t = null == (n = l.textContent) ? void 0 : n.trim();
+ t && (r.accessory = {
+ type: "badge",
+ content: t,
+ tone: l.getAttribute("tone") || void 0
+ },
+ e && (l.style.display = "none"))
+ }
+ return r
+ }
+ function rn(t) {
+ var n;
+ t[en] || (t[en] = Ut());
+ const e = t[en]
+ , i = null != (n = t.textContent) ? n : ""
+ , o = t.getAttribute("icon") || void 0
+ , r = t.getAttribute("tone") || void 0;
+ return {
+ id: e,
+ label: i,
+ ...o && {
+ icon: o
+ },
+ ...r && {
+ tone: r
+ },
+ disabled: t.disabled || !1,
+ loading: t.hasAttribute("loading")
+ }
+ }
+ function an(t, n = {}) {
+ const { hideElements: e = !1, context: i = document } = n;
+ return t.map((t => {
+ if ("S-BUTTON" === t.tagName) {
+ const n = t.getAttribute("commandfor");
+ if (n) {
+ const o = i.querySelector ? i.querySelector("#" + CSS.escape(n)) : i.getElementById(n);
+ if (o && "S-MENU" === o.tagName)
+ return e && (o.style.display = "none"),
+ function (t, n) {
+ var e;
+ return n[en] || (n[en] = Ut()),
+ {
+ id: n[en],
+ label: null != (e = t.textContent) ? e : "Actions",
+ icon: t.getAttribute("icon") || void 0,
+ buttons: Array.from(n.querySelectorAll("s-button")).map((t => {
+ var n;
+ return t[en] || (t[en] = Ut()),
+ {
+ id: t[en],
+ label: null != (n = t.textContent) ? n : "",
+ icon: t.getAttribute("icon") || void 0,
+ disabled: t.disabled || !1,
+ loading: t.hasAttribute("loading")
+ }
+ }
+ ))
+ }
+ }(t, o)
+ }
+ }
+ return rn(t)
+ }
+ ))
+ }
+ function sn(t, n) {
+ return t[en] || (t[en] = n || Ut()),
+ t[en]
+ }
+ const cn = "ui-title-bar"
+ , ln = [{
+ name: "button",
+ attributes: {
+ ...Yt,
+ variant: {
+ value: zt.oneOf(["breadcrumb", "primary"])
+ },
+ tone: {
+ value: zt.oneOf(["critical", "default"])
+ },
+ disabled: {
+ value: zt.flag()
+ },
+ loading: {
+ value: zt.flag()
+ }
+ },
+ children: [Vt.anyText]
+ }, {
+ name: "a",
+ attributes: {
+ ...Qt,
+ variant: {
+ value: zt.oneOf(["breadcrumb", "primary"])
+ }
+ },
+ children: [Vt.anyText]
+ }]
+ , un = {
+ name: "section",
+ attributes: {
+ label: Gt
+ },
+ children: [{
+ name: "button",
+ attributes: Yt,
+ children: [Vt.anyText]
+ }, {
+ name: "a",
+ attributes: Qt,
+ children: [Vt.anyText]
+ }]
+ };
+ un.children.push(un);
+ const dn = {
+ name: "ui-title-bar",
+ attributes: {
+ title: Gt
+ },
+ children: [...ln, un]
+ }
+ , fn = nn.breadcrumb
+ , hn = nn.primaryAction
+ , pn = nn.secondaryActions;
+ function vn(t) {
+ var n;
+ t[en] || (t[en] = Ut());
+ const e = t[en]
+ , i = null != (n = t.textContent) ? n : ""
+ , o = t.getAttribute("icon") || void 0
+ , r = t.getAttribute("tone") || void 0;
+ return {
+ id: e,
+ label: i,
+ ...o && {
+ icon: o
+ },
+ ...r && {
+ tone: r
+ },
+ disabled: t.disabled,
+ loading: t.hasAttribute("loading")
+ }
+ }
+ function mn(t) {
+ return null != t && (wn(t) || mn(t.parentNode))
+ }
+ function wn(t) {
+ return "TITLE" === t.nodeName
+ }
+ const bn = W
+ , yn = [{
+ name: "button",
+ attributes: {
+ ...Yt,
+ variant: {
+ value: zt.oneOf(["primary"])
+ },
+ disabled: {
+ value: zt.flag()
+ },
+ loading: {
+ value: zt.flag()
+ }
+ },
+ children: [Vt.anyText]
+ }]
+ , gn = {
+ name: "ui-save-bar",
+ attributes: {
+ id: {
+ value: zt.anyString()
+ },
+ discardConfirmation: {
+ value: zt.flag()
+ }
+ },
+ children: [...yn]
+ };
+ function An(t) {
+ if (t)
+ return {
+ disabled: t.disabled,
+ loading: t.hasAttribute("loading"),
+ onAction() {
+ t.click()
+ }
+ }
+ }
+ function En(t) {
+ var n, e, i;
+ const o = null == (i = null == (e = null == (n = document.documentElement) ? void 0 : n.getElementsByTagName) ? void 0 : e.call(n, bn)) ? void 0 : i[t];
+ if (!o)
+ throw Error(`SaveBar with ID ${t} not found`);
+ return o
+ }
+ const kn = ["small", "base", "large", "max"];
+ function Cn(t, n) {
+ const e = "src" === n.contentType
+ , i = "app-window" === n.variantLock
+ , o = {
+ id: {
+ value: zt.anyString()
+ },
+ src: {
+ value: zt.anyString()
+ }
+ };
+ i || (o.variant = {
+ value: zt.oneOf(["small", "base", "large", "max"])
+ });
+ const r = {
+ name: t,
+ attributes: o,
+ children: e ? [] : [dn, gn, Vt.anyElement]
+ };
+ return ({ api: n, internalApiPromise: o, saveBarManager: a }) => {
+ const s = {
+ classic: _(),
+ max: _()
+ };
+ function c(n) {
+ var e, i, o;
+ const r = null == (o = null == (i = null == (e = document.documentElement) ? void 0 : e.getElementsByTagName) ? void 0 : i.call(e, t)) ? void 0 : o[n];
+ if (!r)
+ throw Error(`Modal with ID ${n} not found`);
+ return r
+ }
+ n.modal = {
+ show: async t => c(t).show(),
+ hide: async t => c(t).hide(),
+ toggle: async t => c(t).toggle()
+ },
+ function (t) {
+ document.addEventListener("click", (async n => {
+ const e = n.target;
+ if (!e)
+ return;
+ let i = e;
+ for (; i && i !== document.body;) {
+ const e = i.getAttribute("command")
+ , o = i.getAttribute("commandFor");
+ if (e && o) {
+ const i = document.getElementById(o);
+ if (i && i.tagName.toLowerCase() === t.toLowerCase()) {
+ switch (n.preventDefault(),
+ e.startsWith("--") ? e.slice(2) : e) {
+ case "show":
+ await i.show();
+ break;
+ case "hide":
+ await i.hide();
+ break;
+ case "toggle":
+ await i.toggle()
+ }
+ break
+ }
+ }
+ i = i.parentElement
+ }
+ }
+ ))
+ }(t),
+ b(t, class extends g {
+ constructor() {
+ super(...arguments),
+ this.p = Ut(),
+ this.v = !1,
+ this.m = !1,
+ this.A = []
+ }
+ static get observedAttributes() {
+ return i ? ["src"] : ["variant", "src"]
+ }
+ get variant() {
+ var t;
+ if (i)
+ return "app-window";
+ const n = null != (t = this.getAttribute("variant")) ? t : "";
+ return kn.includes(n) ? n : "base"
+ }
+ set variant(t) {
+ i || this.setAttribute("variant", t)
+ }
+ get content() {
+ if (!e)
+ return this.src ? void 0 : this.k
+ }
+ set content(t) {
+ var n, i, o;
+ e || t !== this.k && (null == (n = this.C) || n.unobserve(),
+ this.C = void 0,
+ null == (i = this.P) || i.unobserve(),
+ this.P = void 0,
+ null == (o = this.L) || o.unobserve(),
+ this.L = void 0,
+ this.k = t,
+ t && (this.C = function (t) {
+ function n(t) {
+ let n = t.target;
+ for (; n;) {
+ if ("A" === n.nodeName && n.hasAttribute("href")) {
+ const e = n.getAttribute("href")
+ , i = n.getAttribute("target") || void 0
+ , o = n.getAttribute("rel") || void 0;
+ if (null == e) {
+ n = n.parentNode;
+ continue
+ }
+ t.preventDefault(),
+ window.open(e, i, o);
+ break
+ }
+ n = n.parentNode
+ }
+ }
+ return t.addEventListener("click", n),
+ {
+ unobserve: () => t.removeEventListener("click", n)
+ }
+ }(t),
+ this.P = K(t, {
+ onChange: t => {
+ "max" === this.T ? a.set({
+ maxModalFromForm: t
+ }) : a.set({
+ classicModalFromForm: t
+ })
+ }
+ ,
+ filter: () => !!this.T
+ }),
+ this.L = G(this, {
+ onChange: t => {
+ "max" === this.T ? a.set({
+ maxModalFromCustomElement: t
+ }) : a.set({
+ classicModalFromCustomElement: t
+ })
+ }
+ ,
+ filter: () => !!this.T
+ })))
+ }
+ get src() {
+ var t;
+ return null != (t = this.getAttribute("src")) ? t : void 0
+ }
+ set src(t) {
+ t ? this.setAttribute("src", t) : this.removeAttribute("src")
+ }
+ get contentWindow() {
+ if (this.src)
+ return this.S
+ }
+ get S() {
+ const t = this.I;
+ if (t)
+ return function (t) {
+ var n;
+ try {
+ const e = null == (n = window.parent) ? void 0 : n.frames[t];
+ if (e.fetch)
+ return e
+ } catch (e) {
+ return
+ }
+ }(t)
+ }
+ connectedCallback() {
+ var t;
+ this.u = new MutationObserver((() => this.o())),
+ this.u.observe(this, {
+ attributes: !0,
+ childList: !0,
+ subtree: !0
+ }),
+ this.o(),
+ e || null == (t = this.querySelector("ui-title-bar")) || t.addEventListener("change", (() => this.o()))
+ }
+ disconnectedCallback() {
+ var t;
+ null == (t = this.u) || t.disconnect(),
+ this.M()
+ }
+ setAttribute(t, n) {
+ super.setAttribute(t, n),
+ this.o()
+ }
+ removeAttribute(t) {
+ super.removeAttribute(t),
+ this.o()
+ }
+ async show() {
+ var t, n, i, r;
+ if (!this.R && (await this.o(),
+ !this.R))
+ return;
+ if (this.T)
+ return;
+ const a = "max" === this.R.variant ? "max" : "classic";
+ this.T = a;
+ const c = s[a];
+ if (c.has(this.p))
+ return;
+ const l = c.promise;
+ if (c.add(this.p),
+ await l,
+ c.isResolved(this.p))
+ return;
+ this.v = !0;
+ const u = await o;
+ if (!u)
+ throw Error("Cannot show modal");
+ const d = this.O();
+ if (!(null == (t = u.modal) ? void 0 : t.show) || "function" != typeof u.modal.show)
+ throw Error("Modal API is not available");
+ if (this.I = await u.modal.show(this.p),
+ d(),
+ this.S && (this.S.shopify = window.shopify,
+ this.S.close = () => {
+ this.hide()
+ }
+ ,
+ e)) {
+ try {
+ const t = this.S.document.createElement("style");
+ t.textContent = '\n s-page s-button[slot="primary-action"],\n s-page s-button[slot="secondary-actions"] {\n display: none !important;\n }\n ',
+ this.S.document.head ? this.S.document.head.appendChild(t) : this.S.document.documentElement && this.S.document.documentElement.appendChild(t)
+ } catch (f) {
+ console.debug("Could not inject early styles to hide slots:", f)
+ }
+ setTimeout((() => {
+ var t, n, e;
+ "complete" === (null == (n = null == (t = this.S) ? void 0 : t.document) ? void 0 : n.readyState) ? this.$() : null == (e = this.S) || e.addEventListener("load", (() => {
+ this.$()
+ }
+ ), {
+ once: !0
+ })
+ }
+ ), 100)
+ }
+ this.m || (this.B(),
+ this.m = !0),
+ this.dispatchEvent(new CustomEvent("show")),
+ null == (n = this.S) || n.focus(),
+ null == (i = this.P) || i.onChange(),
+ null == (r = this.L) || r.onChange()
+ }
+ async hide() {
+ var t, n, e;
+ const i = this.T;
+ if (!i)
+ return;
+ if (s[i].resolve(this.p),
+ !this.v)
+ return;
+ this.m && (this.F(),
+ this.m = !1),
+ this._ && (this._.disconnect(),
+ this._ = void 0);
+ const r = await o;
+ (null == (t = null == r ? void 0 : r.modal) ? void 0 : t.hide) && "function" == typeof r.modal.hide && await r.modal.hide(this.p),
+ this.v = !1,
+ this.T = void 0,
+ this.I = void 0,
+ this.dispatchEvent(new CustomEvent("hide")),
+ null == (n = this.P) || n.onChange(),
+ null == (e = this.L) || e.onChange()
+ }
+ async toggle() {
+ this.R || await this.o(),
+ this.T ? await this.hide() : await this.show()
+ }
+ async o() {
+ var t;
+ if (Xt(this, r),
+ this.N(),
+ !this.R)
+ return;
+ const n = await o;
+ (null == n ? void 0 : n.modal) || location.reload(),
+ (null == (t = null == n ? void 0 : n.modal) ? void 0 : t.set) && "function" == typeof n.modal.set && await n.modal.set(this.R, this.p)
+ }
+ O() {
+ let t;
+ const n = setInterval((() => {
+ this.S && (clearInterval(n),
+ t = setTimeout((() => {
+ console.warn("The modal src is missing App Bridge CDN script tag.")
+ }
+ ), 1e4))
+ }
+ ), 100);
+ return () => {
+ clearInterval(n),
+ clearTimeout(t)
+ }
+ }
+ async B() {
+ const { content: t, S: n } = this;
+ if (!t || !n)
+ return;
+ const e = Tn();
+ Ln(document, n.document, [e]);
+ const i = function (t, n, e = "div") {
+ const i = t.querySelector("#" + n);
+ if (i)
+ return i;
+ const o = document.createElement(e);
+ return o.setAttribute("id", n),
+ t.appendChild(o),
+ o
+ }(n.document.body, "modal-content-8885451e-38a1-4196-835b-40f3efb46c4e");
+ i.replaceChildren(t);
+ const o = t.querySelector("[autofocus]");
+ o instanceof HTMLElement && setTimeout((() => {
+ o.focus()
+ }
+ ), 100)
+ }
+ F() {
+ const { content: t } = this;
+ t && this.appendChild(t)
+ }
+ N() {
+ let n, i, o = [];
+ if (!e) {
+ const e = Array.from(this.childNodes).filter((t => "ui-title-bar" !== t.nodeName.toLowerCase() && t.nodeName.toLowerCase() !== bn.toLowerCase() && t.nodeType === qt.ELEMENT_NODE));
+ e.length > 1 && console.warn(`Only one child element is allowed inside <${t}>. The rest will be ignored.`),
+ n = e.length ? e[0] : this.k,
+ this.content = n || document.createElement("div"),
+ [i] = Array.from(this.getElementsByTagName("ui-title-bar")),
+ o = i ? Array.from(null == i ? void 0 : i.getElementsByTagName("button")) : []
+ }
+ const { primaryButtonElement: r, secondaryButtonElement: a } = o.reduce(((t, n) => {
+ const e = n.getAttribute("variant");
+ return "primary" === e ? t.primaryButtonElement = n : e || (t.secondaryButtonElement = n),
+ t
+ }
+ ), {
+ primaryButtonElement: null,
+ secondaryButtonElement: null
+ })
+ , s = this.src ? new URL(this.src, location.href) : void 0;
+ if (s && s.origin !== location.origin)
+ throw Error("Invalid modal src origin");
+ var c, l;
+ this.R = {
+ title: (null == i ? void 0 : i.getAttribute("title")) || (e ? document.title : void 0) || void 0,
+ variant: (c = this.T,
+ l = this.variant,
+ c ? "max" === c ? "max" : "max" === l ? "base" : l : l),
+ src: null == s ? void 0 : s.toString(),
+ buttons: [r, a].map((t => {
+ var n, e, i;
+ if (t)
+ return {
+ id: Ut(),
+ label: null != (n = t.textContent) ? n : "",
+ variant: null != (e = t.getAttribute("variant")) ? e : void 0,
+ tone: null != (i = t.getAttribute("tone")) ? i : void 0,
+ disabled: t.disabled,
+ loading: t.hasAttribute("loading"),
+ onAction() {
+ t.click()
+ }
+ }
+ }
+ )).filter(Boolean),
+ onClose: () => this.hide()
+ }
+ }
+ async $() {
+ var t;
+ if (!(null == (t = this.S) ? void 0 : t.document))
+ return;
+ const n = async () => {
+ var t;
+ try {
+ const n = on({
+ hideElements: !1,
+ context: this.S.document
+ });
+ if (n) {
+ n.title && this.R ? this.R.title = n.title : this.R && !this.R.title && (this.R.title = document.title || void 0),
+ n.accessory && this.R && (this.R.accessory = n.accessory);
+ const t = []
+ , e = (n, e) => {
+ var i, o, r;
+ t.push({
+ id: Ut(),
+ label: null != (i = n.textContent) ? i : "",
+ variant: e,
+ icon: null != (o = n.getAttribute("icon")) ? o : void 0,
+ tone: null != (r = n.getAttribute("tone")) ? r : void 0,
+ disabled: n.disabled || !1,
+ loading: n.hasAttribute("loading"),
+ onAction: () => {
+ n.click()
+ }
+ })
+ }
+ ;
+ if (this.A = [],
+ n.primaryAction && (e(n.primaryAction, "primary"),
+ this.A.push(n.primaryAction)),
+ n.secondaryActions) {
+ const i = an(n.secondaryActions, {
+ hideElements: !1,
+ context: this.S.document
+ })
+ , o = new Map;
+ n.secondaryActions.forEach((t => {
+ const n = sn(t);
+ o.set(n, t)
+ }
+ )),
+ i.forEach((n => {
+ if ("buttons" in n)
+ t.push({
+ id: n.id,
+ variant: "secondary",
+ label: n.label,
+ icon: n.icon,
+ disabled: n.disabled,
+ actions: n.buttons.map((t => ({
+ id: t.id,
+ label: t.label,
+ disabled: t.disabled,
+ loading: t.loading,
+ icon: t.icon,
+ onAction: () => {
+ const n = Array.from(this.S.document.querySelectorAll("s-menu s-button")).find((n => sn(n) === t.id));
+ null == n || n.click()
+ }
+ })))
+ });
+ else {
+ const t = o.get(n.id);
+ t && (e(t, "secondary"),
+ this.A.push(t))
+ }
+ }
+ ))
+ }
+ t.length > 0 && this.R && (this.R.buttons = t)
+ } else
+ this.R && (this.R.title || (this.R.title = document.title || void 0));
+ if (this.R) {
+ const n = await o;
+ (null == (t = null == n ? void 0 : n.modal) ? void 0 : t.set) && "function" == typeof n.modal.set && await n.modal.set(this.R, this.p)
+ }
+ } catch (n) {
+ console.debug("Could not extract from s-page in iframe:", n)
+ }
+ }
+ ;
+ await n();
+ try {
+ const t = new MutationObserver((async () => {
+ await n()
+ }
+ ));
+ t.observe(this.S.document.body, {
+ childList: !0,
+ subtree: !0,
+ attributes: !0,
+ attributeFilter: ["heading", "variant", "tone", "disabled", "loading", "slot", "commandfor"]
+ }),
+ this._ = t
+ } catch (e) {
+ console.debug("Could not observe iframe for s-page changes:", e)
+ }
+ }
+ async M() {
+ var t;
+ this._ && (this._.disconnect(),
+ this._ = void 0);
+ const n = await o;
+ (null == (t = null == n ? void 0 : n.modal) ? void 0 : t.set) && "function" == typeof n.modal.set && await n.modal.set(null, this.p)
+ }
+ }
+ )
+ }
+ }
+ function Pn(t) {
+ return Array.from(t.styleSheets).map((t => t.ownerNode)).filter((t => !(!t || function (t) {
+ let n = t.parentNode;
+ for (; n;)
+ switch (n.nodeName.toLowerCase()) {
+ case "svg":
+ return !0;
+ case "body":
+ return !1;
+ default:
+ n = n.parentNode
+ }
+ }(t))))
+ }
+ async function Ln(t, n, e = []) {
+ const i = [...Pn(t), ...e]
+ , o = Pn(n);
+ await Promise.all(i.filter((t => !o.find((n => n.isEqualNode(t))))).map((t => {
+ const e = t.cloneNode(!0);
+ return n.head.appendChild(e),
+ new Promise((t => {
+ e.addEventListener("load", t, !0)
+ }
+ )).catch((() => { }
+ ))
+ }
+ )))
+ }
+ function Tn() {
+ const t = document.createElement("style")
+ , n = "modal-content-8885451e-38a1-4196-835b-40f3efb46c4e";
+ return t.textContent = `\n html, body {\n min-height: auto !important;\n height: auto !important;\n padding: 0 !important;\n margin: 0 !important;\n background-color: rgba(0, 0, 0, 0) !important;\n display: block !important;\n }\n body > #${n} {\n display: flex !important;\n }\n body > #${n} > * {\n width: 100%;\n }\n `,
+ t
+ }
+ function Sn(t) {
+ var n;
+ try {
+ const e = null == (n = window.parent) ? void 0 : n.frames[t];
+ if (e.fetch)
+ return e
+ } catch (e) {
+ return
+ }
+ }
+ function In(t) {
+ const n = t.nodeName.toLowerCase();
+ return "ui-modal" === n || "s-frame" === n
+ }
+ function xn(t) {
+ let n = t.parentNode;
+ for (; n;) {
+ if (In(n))
+ return n;
+ if ("body" === n.nodeName.toLowerCase())
+ break;
+ n = n.parentNode
+ }
+ }
+ const Mn = Cn("s-app-window", {
+ contentType: "src",
+ variantLock: "app-window"
+ })
+ , Rn = "APP::SCANNER::OPEN::CAMERA";
+ function On(t) {
+ const n = (null == t ? void 0 : t.Scanner) || {}
+ , { Dispatch: e } = n[Rn] || {};
+ return !!e
+ }
+ let $n = !1;
+ const Bn = [{
+ keys: ["k"],
+ held: ["Meta", "Control"]
+ }, {
+ keys: ["."],
+ held: ["Meta", "Control"]
+ }]
+ , Fn = {
+ duration: 5e3
+ }
+ , _n = Cn("ui-modal", {
+ contentType: "inline",
+ variantLock: "all"
+ })
+ , Nn = Zt("ui-nav-menu")
+ , Un = [{
+ fn: "onTTFB",
+ name: "TimeToFirstByte"
+ }, {
+ fn: "onFCP",
+ name: "FirstContentfulPaint"
+ }, {
+ fn: "onLCP",
+ name: "LargestContentfulPaint"
+ }, {
+ fn: "onCLS",
+ name: "CumulativeLayoutShift"
+ }, {
+ fn: "onFID",
+ name: "FirstInputDelay"
+ }, {
+ fn: "onINP",
+ name: "InteractionToNextPaint"
+ }]
+ , Dn = Object.assign({
+ "./app.ts": async ({ api: t, internalApiPromise: n }) => {
+ t.app = {
+ extensions: async () => {
+ const { app: t } = await n || {};
+ if (!(null == t ? void 0 : t.extensions))
+ throw Error("App API is not available");
+ return await t.extensions()
+ }
+ }
+ }
+ ,
+ "./client.ts": ({ api: t, internalApiPromise: n }) => {
+ n.then((n => {
+ var e;
+ (null == (e = null == n ? void 0 : n.client) ? void 0 : e.set) && "function" == typeof n.client.set && n.client.set(t.config)
+ }
+ )).catch()
+ }
+ ,
+ "./environment.ts": ({ api: t }) => {
+ t.environment = {
+ mobile: C(),
+ embedded: top !== self || k(),
+ pos: L()
+ }
+ }
+ ,
+ "./fetch.ts": bt,
+ "./id-token.ts": yt,
+ "./intents.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ t.intents = {
+ register(t) {
+ const e = new URLSearchParams(location.search).get("step_reference") || ""
+ , i = new AbortController;
+ return n.subscribe("AppFrame.propertiesEvent", (({ properties: i }) => {
+ const o = function (t, n, e) {
+ return new At("configure", "gid://flow/stepReference/" + t, n, (() => e.send("AppFrame.navigateBack")))
+ }(e, {
+ properties: i
+ }, n);
+ t(o)
+ }
+ ), {
+ signal: i.signal
+ }),
+ n.send("AppFrame.requestProperties"),
+ () => i.abort()
+ },
+ async invoke(t, n) {
+ var i;
+ const o = await e;
+ if (!o)
+ throw Error("Cannot invoke intent");
+ if (!(null == (i = o.intents) ? void 0 : i.invoke) || "function" != typeof o.intents.invoke)
+ throw Error("Intents are not supported");
+ return new Et(o.intents.invoke(t, n))
+ }
+ }
+ }
+ ,
+ "./internal-only.ts": ({ api: t, internalApiPromise: n }) => {
+ const e = {
+ async show(t, e) {
+ var i, o;
+ const r = await n;
+ r && r.internalModal && await (null == (o = (i = r.internalModal).show) ? void 0 : o.call(i, t, e))
+ },
+ async hide(t) {
+ var e, i;
+ const o = await n;
+ o && o.internalModal && await (null == (i = null == (e = o.internalModal) ? void 0 : e.hide) ? void 0 : i.call(e, t))
+ }
+ };
+ t._internal = {
+ modal: e
+ }
+ }
+ ,
+ "./loading.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ let i = !1;
+ t.loading = async t => {
+ const { loading: o } = await e || {};
+ (null == o ? void 0 : o.start) && (null == o ? void 0 : o.stop) ? t ? await o.start() : await o.stop() : t ? i || (n.send("Loading.start"),
+ i = !0) : i && (n.send("Loading.stop"),
+ i = !1)
+ }
+ }
+ ,
+ "./navigation.ts": t => {
+ const n = Bt(t);
+ t.internalApiPromise.then((e => {
+ const { navigation: i } = e || {};
+ if (2 === (null == i ? void 0 : i.version))
+ try {
+ n(),
+ $t(t)
+ } catch (o) {
+ console.error("Failed to set up navigation: " + o)
+ }
+ }
+ ))
+ }
+ ,
+ "./picker.ts": ({ api: t, internalApiPromise: n }) => {
+ let e;
+ t.picker = async function t(i) {
+ if (e)
+ return e.finally((() => t(i)));
+ const o = await n;
+ if (!o || "function" != typeof o.picker)
+ throw Error("Cannot show picker");
+ if (e = o.picker(i),
+ !e)
+ throw Error("Cannot show picker");
+ return e.finally((() => e = void 0)),
+ e
+ }
+ }
+ ,
+ "./pos.ts": ({ api: t, protocol: n }) => {
+ const e = new Set;
+ async function i(t, i) {
+ const o = Ut()
+ , r = new AbortController
+ , a = F();
+ n.subscribe("Cart.update", (({ data: t }) => {
+ r.abort(),
+ a.resolve(t)
+ }
+ ), {
+ signal: r.signal,
+ id: o
+ }),
+ n.send("Cart." + t, {
+ ...i,
+ id: o
+ });
+ const s = await a.promise;
+ e.forEach((t => t(s)))
+ }
+ const o = {
+ cart: {
+ async fetch() {
+ const t = Ut()
+ , e = new AbortController
+ , i = F();
+ return n.subscribe("Cart.update", (({ data: t }) => {
+ var n;
+ e.abort();
+ const { noteAttributes: o, lineItems: r, ...a } = t
+ , s = {
+ ...a,
+ properties: null != (n = null == o ? void 0 : o.reduce(((t, { name: n, value: e }) => (t[n] = e,
+ t)), {})) ? n : {},
+ lineItems: r ? r.map(((t, n) => ({
+ ...t,
+ uuid: "" + n
+ }))) : []
+ };
+ i.resolve(s)
+ }
+ ), {
+ signal: e.signal,
+ id: t
+ }),
+ n.send("Cart.fetch", {
+ id: t
+ }),
+ i.promise
+ },
+ subscribe: t => (e.add(t),
+ () => {
+ e.delete(t)
+ }
+ ),
+ async clear() {
+ await i("clear", {})
+ },
+ async setCustomer(t) {
+ await i("setCustomer", {
+ data: t
+ })
+ },
+ async removeCustomer() {
+ await i("removeCustomer", {})
+ },
+ async addAddress(t) {
+ await i("addCustomerAddress", {
+ data: t
+ })
+ },
+ async updateAddress(t, n) {
+ await i("updateCustomerAddress", {
+ index: t,
+ data: n
+ })
+ },
+ async applyCartDiscount(t, n, e) {
+ await i("setDiscount", {
+ data: {
+ type: "FixedAmount" === t ? "flat" : "percent",
+ amount: parseFloat(e) || 0,
+ discountDescription: n
+ }
+ })
+ },
+ async applyCartCodeDiscount(t) {
+ await i("setCodeDiscount", {
+ data: {
+ discountCode: t
+ }
+ })
+ },
+ async removeCartDiscount() {
+ await i("removeDiscount", {})
+ },
+ async removeAllDiscounts(t) {
+ await i("removeAllDiscounts", {
+ data: {
+ disableAutomaticDiscounts: t
+ }
+ })
+ },
+ async addCartProperties(t) {
+ await i("setProperties", {
+ data: t
+ })
+ },
+ async removeCartProperties(t) {
+ await i("removeProperties", {
+ data: t
+ })
+ },
+ async addCustomSale(t) {
+ await i("addLineItem", {
+ data: {
+ price: t.price,
+ quantity: t.quantity,
+ title: t.title,
+ taxable: t.taxable
+ }
+ })
+ },
+ async addLineItem(t, n) {
+ await i("addLineItem", {
+ data: {
+ variantId: t,
+ quantity: n
+ }
+ })
+ },
+ async updateLineItem(t, n) {
+ const e = parseInt(t);
+ await i("updateLineItem", {
+ index: e,
+ data: {
+ quantity: n
+ }
+ })
+ },
+ async removeLineItem(t) {
+ const n = parseInt(t);
+ await i("removeLineItem", {
+ index: n
+ })
+ },
+ async setLineItemDiscount(t, n, e, o) {
+ const r = parseInt(t);
+ await i("setLineItemDiscount", {
+ index: r,
+ data: {
+ type: "FixedAmount" === n ? "flat" : "percent",
+ discountDescription: e,
+ amount: parseFloat(o) || 0
+ }
+ })
+ },
+ async removeLineItemDiscount(t) {
+ const n = parseInt(t);
+ await i("removeLineItemDiscount", {
+ index: n
+ })
+ },
+ async addLineItemProperties(t, n) {
+ const e = parseInt(t);
+ await i("setLineItemProperties", {
+ index: e,
+ data: n
+ })
+ },
+ async removeLineItemProperties(t, n) {
+ const e = parseInt(t);
+ await i("removeLineItemProperties", {
+ index: e,
+ data: n
+ })
+ }
+ },
+ async close() {
+ n.send("Pos.close")
+ },
+ async device() {
+ const t = F();
+ return n.subscribe("getState", (({ pos: n }) => {
+ const e = (n || {}).device
+ , i = {
+ name: e.name,
+ serialNumber: e.serialNumber
+ };
+ t.resolve(i)
+ }
+ ), {
+ once: !0
+ }),
+ t.promise
+ },
+ async location() {
+ const t = F();
+ return n.subscribe("getState", (({ pos: n }) => {
+ const e = (n || {}).location
+ , i = {
+ id: e.id,
+ active: e.active,
+ name: e.name,
+ locationType: e.locationType,
+ address1: e.address1,
+ address2: e.address2,
+ zip: e.zip,
+ city: e.city,
+ province: e.province,
+ countryCode: e.countryCode,
+ countryName: e.countryName,
+ phone: e.phone
+ };
+ t.resolve(i)
+ }
+ ), {
+ once: !0
+ }),
+ t.promise
+ }
+ };
+ t.pos = o
+ }
+ ,
+ "./print.ts": ({ protocol: t, internalApiPromise: n }) => {
+ (C() || L()) && mt(self, "print", (function () {
+ var e;
+ const i = (null == (e = document.scrollingElement) ? void 0 : e.scrollHeight) || document.body.offsetHeight;
+ kt((async () => {
+ const { print: e } = await n || {};
+ e ? await e({
+ height: i
+ }) : t.send("Print.app", {
+ height: i
+ })
+ }
+ ))
+ }
+ ))
+ }
+ ,
+ "./resource-picker.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ let i;
+ t.resourcePicker = async function t(o) {
+ if (i)
+ return i.finally((() => t(o)));
+ const r = await e
+ , a = new Promise(((t, e) => {
+ const a = Ut()
+ , { type: s, query: c, selectionIds: l, action: u, multiple: d } = Object.assign({}, jt, o)
+ , f = Object.assign({}, jt.filter, o.filter);
+ if (!Dt.has(s))
+ return e(Error("The 'type' option for resourcePicker must be one of " + Array.from(Dt).join(", ")));
+ const h = new AbortController
+ , { signal: p } = h;
+ function v() {
+ h.abort(),
+ i = void 0
+ }
+ const { resourcePicker: m } = r || {};
+ m ? m({
+ type: s,
+ query: c,
+ selectionIds: l,
+ action: u,
+ multiple: d,
+ filter: f
+ }).then((n => {
+ t(n)
+ }
+ )).catch((t => {
+ e(Error("ResourcePicker error", {
+ cause: t
+ }))
+ }
+ )).finally((() => {
+ v()
+ }
+ )) : (n.subscribe("Resource_Picker.select", (n => {
+ v();
+ const e = n.selection;
+ Object.defineProperty(e, "selection", {
+ value: e
+ }),
+ t(e)
+ }
+ ), {
+ id: a,
+ signal: p
+ }),
+ n.subscribe("Resource_Picker.cancel", (() => {
+ v(),
+ t(void 0)
+ }
+ ), {
+ id: a,
+ signal: p
+ }),
+ B(n, (t => {
+ v(),
+ e(Error("ResourcePicker error", {
+ cause: t
+ }))
+ }
+ ), {
+ id: a,
+ signal: p
+ }),
+ n.send("Resource_Picker.open", {
+ id: a,
+ resourceType: s,
+ initialQuery: c,
+ filterQuery: null == f ? void 0 : f.query,
+ initialSelectionIds: l,
+ actionVerb: null == u ? void 0 : u.toLowerCase(),
+ selectMultiple: d,
+ showHidden: null == f ? void 0 : f.hidden,
+ showVariants: null == f ? void 0 : f.variants,
+ showDraft: !1 !== (null == f ? void 0 : f.draft),
+ showArchived: !1 !== (null == f ? void 0 : f.archived),
+ showDraftBadge: [!0, void 0].includes(null == f ? void 0 : f.draft),
+ showArchivedBadge: void 0 === (null == f ? void 0 : f.archived)
+ }))
+ }
+ ));
+ return i = a,
+ a
+ }
+ }
+ ,
+ "./reviews.ts": ({ api: t, internalApiPromise: n }) => {
+ t.reviews = {
+ request: async () => {
+ const { reviews: t } = await n || {}
+ , e = null == t ? void 0 : t.request;
+ if (!e || "function" != typeof e)
+ throw Error("Cannot request review");
+ return await e()
+ }
+ }
+ }
+ ,
+ "./s-app-nav.ts": tn,
+ "./s-app-window.ts": Mn,
+ "./save-bar.ts": ({ api: t, saveBarManager: n, internalApiPromise: e }) => {
+ x && (t.saveBar = {
+ show: async t => En(t).show(),
+ hide: async t => En(t).hide(),
+ toggle: async t => En(t).toggle(),
+ async leaveConfirmation() {
+ if (!n.isSaveBarVisible)
+ return;
+ const t = await e;
+ if (!t)
+ return;
+ const { saveBar: i } = t;
+ i && "function" == typeof i.leaveConfirmation && await i.leaveConfirmation();
+ const o = document.querySelectorAll(bn);
+ await Promise.all(Array.from(o).map((t => t.hide())));
+ const r = document.querySelectorAll("form");
+ await Promise.all(Array.from(r).filter(Y).map((t => t.reset())))
+ }
+ },
+ K(document, {
+ onChange(t) {
+ n.set({
+ mainAppFromForm: t
+ })
+ },
+ filter: t => !xn(t)
+ }),
+ G(document, {
+ onChange(t) {
+ n.set({
+ mainAppFromCustomElement: t
+ })
+ },
+ filter: t => !xn(t)
+ }),
+ b(bn, class extends g {
+ constructor() {
+ super(...arguments),
+ this.v = !1
+ }
+ static get observedAttributes() {
+ return ["discardConfirmation"]
+ }
+ get discardConfirmation() {
+ return this.hasAttribute("discardConfirmation")
+ }
+ set discardConfirmation(t) {
+ t ? this.setAttribute("discardConfirmation", "") : this.removeAttribute("discardConfirmation")
+ }
+ get showing() {
+ return this.v
+ }
+ get saveButton() {
+ return this.U
+ }
+ get discardButton() {
+ return this.D
+ }
+ connectedCallback() {
+ this.u = new MutationObserver((() => this.o())),
+ this.u.observe(this, {
+ childList: !0,
+ subtree: !0,
+ attributes: !0,
+ characterData: !0
+ }),
+ this.o()
+ }
+ disconnectedCallback() {
+ var t;
+ this.hide(),
+ null == (t = this.u) || t.disconnect()
+ }
+ setAttribute(t, n) {
+ super.setAttribute(t, n),
+ this.o()
+ }
+ removeAttribute(t) {
+ super.removeAttribute(t),
+ this.o()
+ }
+ async show() {
+ this.v || (this.v = !0,
+ this.o(),
+ this.dispatchEvent(new CustomEvent("show")))
+ }
+ async hide() {
+ this.v && (this.v = !1,
+ this.o(),
+ this.dispatchEvent(new CustomEvent("hide")))
+ }
+ async toggle() {
+ this.v ? await this.hide() : await this.show()
+ }
+ o() {
+ Xt(this, gn),
+ this.j(),
+ this.dispatchEvent(new CustomEvent(X, {
+ bubbles: !0,
+ cancelable: !0
+ }))
+ }
+ j() {
+ const t = this.querySelectorAll(":scope > [variant=primary]")
+ , n = this.querySelectorAll(":scope > :not([variant=primary])");
+ this.U = An(t[t.length - 1]),
+ this.D = An(n[n.length - 1])
+ }
+ }
+ ))
+ }
+ ,
+ "./scanner.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ t.scanner = {
+ capture: async () => {
+ const { scanner: t } = await e || {};
+ return (null == t ? void 0 : t.capture) ? t.capture() : new Promise(((t, e) => {
+ const i = Ut()
+ , o = new AbortController
+ , { signal: r } = o;
+ function a(t) {
+ o.abort(),
+ e(Error("Scanner error", {
+ cause: t
+ }))
+ }
+ function s() {
+ B(n, a, {
+ signal: r,
+ id: i
+ }),
+ n.subscribe("Scanner.capture", (({ data: n }) => {
+ o.abort(),
+ n && n.scanData ? t({
+ data: n.scanData
+ }) : e(Error("No scanner data"))
+ }
+ ), {
+ id: i,
+ signal: r
+ }),
+ n.send("Scanner.open.camera", {
+ id: i
+ })
+ }
+ n.subscribe("getState", (({ features: t }) => {
+ On(t) ? s() : function () {
+ const t = Ut()
+ , e = new AbortController;
+ o.signal.addEventListener("abort", (() => e.abort())),
+ B(n, (t => {
+ e.abort(),
+ a(t)
+ }
+ ), {
+ signal: e.signal,
+ id: t
+ }),
+ n.subscribe("Features.update", (({ features: t }) => {
+ On(t) && (e.abort(),
+ s())
+ }
+ ), {
+ signal: e.signal,
+ id: t
+ }),
+ n.send("Features.request", {
+ id: t,
+ feature: "Scanner",
+ action: Rn
+ })
+ }()
+ }
+ ), {
+ once: !0,
+ signal: r
+ })
+ }
+ ))
+ }
+ }
+ }
+ ,
+ "./scopes.ts": async ({ api: t, internalApiPromise: n }) => {
+ const e = {
+ query: async () => {
+ const { scopes: t } = await n || {};
+ if (!t || "function" != typeof t.query)
+ throw Error("Scopes API is not available");
+ return t.query()
+ }
+ ,
+ request: async t => {
+ const { scopes: e } = await n || {};
+ if (!e || "function" != typeof e.request)
+ throw Error("Scopes API is not available");
+ return e.request(t)
+ }
+ ,
+ revoke: async t => {
+ const { scopes: e } = await n || {};
+ if (!e || "function" != typeof e.revoke)
+ throw Error("Scopes API is not available");
+ return e.revoke(t)
+ }
+ };
+ t.scopes = e
+ }
+ ,
+ "./share.ts": ({ protocol: t, internalApiPromise: n }) => {
+ if (!C() && !L())
+ return;
+ const e = navigator.share;
+ mt(navigator, "share", (async function (i) {
+ if (!i)
+ return e.call(navigator, i);
+ const { share: o } = await n || {}
+ , { title: r, text: a, url: s } = i;
+ if (!o)
+ return new Promise(((n, e) => {
+ const i = Ut()
+ , o = new AbortController
+ , { signal: c } = o;
+ function l(t) {
+ o.abort(),
+ e(Error("Share error", {
+ cause: t
+ }))
+ }
+ B(t, l, {
+ signal: c,
+ id: i
+ }),
+ t.subscribe("Share.close", (t => {
+ const { success: e } = t;
+ e ? (o.abort(),
+ n()) : l("Share is dismissed")
+ }
+ ), {
+ signal: c,
+ id: i
+ }),
+ t.send("Share.show", {
+ id: i,
+ text: null != a ? a : r,
+ url: s
+ })
+ }
+ ));
+ await o({
+ text: null != a ? a : r,
+ url: s
+ })
+ }
+ ))
+ }
+ ,
+ "./shortcut.ts": ({ protocol: t, internalApiPromise: n }) => {
+ $n || ($n = !0,
+ Bn.forEach((e => {
+ N({
+ ...e,
+ handler: async () => {
+ const { shortcut: i } = await n || {};
+ i ? await i(e) : t.send("Shortcut.invoke", e)
+ }
+ })
+ }
+ )))
+ }
+ ,
+ "./sidekick.ts": ({ api: t, internalApiPromise: n, rpcEventTarget: e }) => {
+ const i = async () => {
+ const { sidekick: t } = await n || {};
+ if (!t || "function" != typeof t.isOpen)
+ throw Error("Sidekick API is not available");
+ return t.isOpen()
+ }
+ , o = async () => {
+ const { sidekick: t } = await n || {};
+ if (!t || "function" != typeof t.open)
+ throw Error("Sidekick API is not available");
+ return t.open()
+ }
+ , r = async () => {
+ const { sidekick: t } = await n || {};
+ if (!t || "function" != typeof t.close)
+ throw Error("Sidekick API is not available");
+ return t.close()
+ }
+ ;
+ n.then((t => {
+ t && t.sidekick && e.addEventListener("shopify:sidekick:visibilitychange", (t => {
+ globalThis.dispatchEvent(new CustomEvent("shopify:sidekick:visibilitychange", {
+ detail: t.detail
+ }))
+ }
+ ))
+ }
+ ));
+ const a = {
+ isOpen: i,
+ open: o,
+ close: r,
+ toggle: async () => {
+ const { sidekick: t } = await n || {};
+ if (!t || "function" != typeof t.launch)
+ throw Error("Sidekick API is not available");
+ return await i() ? r() : o()
+ }
+ ,
+ generate: async t => {
+ const { sidekick: e } = await n || {};
+ if (!e || "function" != typeof e.generate)
+ throw Error("Sidekick API is not available");
+ let i;
+ const o = new ReadableStream({
+ start(t) {
+ i = t
+ }
+ })
+ , r = await e.generate({
+ ...t,
+ onStreamEvent: n => {
+ var e;
+ "message" === n.event && i.enqueue(n.data),
+ null == (e = t.onStreamEvent) || e.call(t, n)
+ }
+ });
+ return r.done().finally((() => {
+ i.close()
+ }
+ )),
+ c(r),
+ {
+ ...r,
+ content: o
+ }
+ }
+ ,
+ launch: async t => {
+ const { sidekick: e } = await n || {};
+ if (!e || "function" != typeof e.launch)
+ throw Error("Sidekick API is not available");
+ return e.launch(t)
+ }
+ ,
+ addHint: async t => {
+ const { sidekick: e } = await n || {};
+ if (!e || "function" != typeof e.addHint)
+ throw Error("Sidekick API is not available");
+ return e.addHint(t)
+ }
+ ,
+ addSelectionNode: async t => {
+ const { sidekick: e } = await n || {};
+ if (!e || "function" != typeof e.addSelectionNode)
+ throw Error("Sidekick API is not available");
+ e.addSelectionNode(t)
+ }
+ ,
+ removeSelectionNode: async () => {
+ const { sidekick: t } = await n || {};
+ if (!t || "function" != typeof t.removeSelectionNode)
+ throw Error("Sidekick API is not available");
+ t.removeSelectionNode()
+ }
+ ,
+ registerToolHandler: t => {
+ let e, i = !1;
+ function o() {
+ i = !0,
+ null == e || e(),
+ u(e),
+ e = void 0
+ }
+ return kt((async () => {
+ const { sidekick: r } = await n || {};
+ if (!r || "function" != typeof r.registerToolHandler)
+ throw Error("Sidekick API is not available");
+ e = await r.registerToolHandler(t),
+ c(e),
+ i && o()
+ }
+ )),
+ o
+ }
+ ,
+ registerContextCallback: async t => {
+ let e, i = !1;
+ function o() {
+ i = !0,
+ null == e || e(),
+ u(e),
+ e = void 0
+ }
+ return kt((async () => {
+ const { sidekick: r } = await n || {};
+ if (!r || "function" != typeof r.registerContextCallback)
+ throw Error("Sidekick API is not available");
+ e = await r.registerContextCallback(t),
+ c(e),
+ i && o()
+ }
+ )),
+ o
+ }
+ };
+ t.sidekick = a
+ }
+ ,
+ "./support.ts": ({ api: t, internalApiPromise: n, rpcEventTarget: e }) => {
+ let i = null;
+ t.support = {
+ registerHandler: async t => {
+ const { support: e } = await n || {};
+ i = t,
+ (null == e ? void 0 : e.callbackRegistered) && "function" == typeof e.callbackRegistered && e.callbackRegistered()
+ }
+ },
+ e.addEventListener("supportRequested", (async t => {
+ await (null == i ? void 0 : i())
+ }
+ ))
+ }
+ ,
+ "./telemetry.ts": async ({ internalApiPromise: t }) => {
+ "undefined" != typeof window && window.addEventListener("_PreactCustomElement:connected", (async n => {
+ const e = n.target
+ , i = e.tagName.toLowerCase()
+ , o = function (t) {
+ const n = [];
+ for (let e = 0; e < t.attributes.length; e++) {
+ const i = t.attributes[e];
+ n.push(i.name)
+ }
+ return n
+ }(e)
+ , r = JSON.stringify(o)
+ , a = await t;
+ a && a.telemetry && "function" == typeof a.telemetry.increment && a.telemetry.increment("ui-component", {
+ component: i,
+ attributes: r
+ })
+ }
+ ))
+ }
+ ,
+ "./title-bar.ts": ({ protocol: t, internalApiPromise: n }) => {
+ let e;
+ const i = new Promise((n => {
+ t.subscribe("getState", (({ features: t }) => {
+ const e = (null == t ? void 0 : t.MarketingExternalActivityTopBar) || {}
+ , { Dispatch: i } = e["APP::MARKETINGEXTERNALACTIVITYTOPBAR::UPDATE"] || {};
+ n(i)
+ }
+ ), {
+ once: !0
+ })
+ }
+ ));
+ function o() {
+ var t;
+ if (e)
+ return null != (t = e.getAttribute("title")) ? t : document.title
+ }
+ function r(t) {
+ var n;
+ const i = document.querySelector("s-page");
+ if (i) {
+ const n = `${fn}, ${hn}, ${pn}`
+ , e = Array.from(i.querySelectorAll(n)).find((n => n[en] == t));
+ if (e)
+ return void e.click();
+ const o = Array.from(document.querySelectorAll("s-menu"));
+ for (const i of o) {
+ const n = Array.from(i.querySelectorAll("s-button")).find((n => n[en] == t));
+ if (n)
+ return void n.click()
+ }
+ }
+ const o = Array.from(null != (n = null == e ? void 0 : e.querySelectorAll("button, a")) ? n : []).find((n => n[en] == t));
+ null == o || o.click()
+ }
+ function a(t) {
+ const { id: n, label: e, icon: i, tone: o, disabled: a, loading: s } = t;
+ return {
+ label: e,
+ ...i && {
+ icon: i
+ },
+ ...o && {
+ tone: o
+ },
+ disabled: a,
+ loading: s,
+ onAction: () => null == r ? void 0 : r(n)
+ }
+ }
+ async function s() {
+ var r, s, c, l, u, d, f;
+ let h;
+ if (function () {
+ var t, n;
+ const i = null == (n = null == (t = document.documentElement) ? void 0 : t.getElementsByTagName) ? void 0 : n.call(t, cn);
+ if (i && i.length) {
+ for (const o of i)
+ if (!xn(o)) {
+ e = o;
+ break
+ }
+ } else
+ e = void 0
+ }(),
+ e) {
+ const { primaryButton: t, secondaryButtons: n, breadcrumb: i } = null != (r = e.buttons()) ? r : {};
+ h = {
+ title: o()
+ },
+ t && (h.buttons = Object.assign(null != (s = h.buttons) ? s : {}, {
+ primary: t
+ })),
+ n && (h.buttons = Object.assign(null != (c = h.buttons) ? c : {}, {
+ secondary: n
+ })),
+ i && (h.breadcrumbs = {
+ id: "breadcrumb",
+ label: i
+ })
+ } else {
+ const t = on({
+ hideElements: !0,
+ context: document
+ });
+ if (t) {
+ if (h = {
+ title: t.title || o()
+ },
+ t.breadcrumb && (t.breadcrumb[en] = "breadcrumb",
+ h.breadcrumbs = rn(t.breadcrumb)),
+ t.primaryAction) {
+ const n = rn(t.primaryAction);
+ h.buttons = Object.assign(null != (l = h.buttons) ? l : {}, {
+ primary: n
+ })
+ }
+ if (t.secondaryActions) {
+ const n = an(t.secondaryActions, {
+ hideElements: !0,
+ context: document
+ });
+ h.buttons = Object.assign(null != (u = h.buttons) ? u : {}, {
+ secondary: n
+ })
+ }
+ t.accessory && (h.accessory = t.accessory)
+ } else
+ h = {
+ title: void 0
+ }
+ }
+ if (await i)
+ t.send("MarketingExternalActivityTopBar.update", h);
+ else {
+ const { titleBar: e } = await n || {};
+ if (null == e ? void 0 : e.set) {
+ const t = {
+ title: h.title
+ };
+ h.breadcrumbs && (t.breadcrumbs = a(h.breadcrumbs)),
+ (null == (d = h.buttons) ? void 0 : d.primary) && (t.primaryAction = a(h.buttons.primary)),
+ (null == (f = h.buttons) ? void 0 : f.secondary) && (t.secondaryActions = h.buttons.secondary.map((t => "buttons" in t ? function (t) {
+ const { label: n, icon: e, disabled: i, buttons: o } = t;
+ return {
+ label: n,
+ ...e && {
+ icon: e
+ },
+ disabled: i,
+ actions: o.map(a)
+ }
+ }(t) : a(t)))),
+ e.set(t)
+ } else
+ t.send("TitleBar.update", h)
+ }
+ }
+ const c = Object.getOwnPropertyDescriptor(Document.prototype, "title");
+ Object.defineProperty(document, "title", {
+ ...c,
+ set(t) {
+ c.set.call(this, t),
+ s()
+ }
+ }),
+ new MutationObserver((t => {
+ for (let n of t) {
+ if (mn(n.target) || [].some.call(n.addedNodes, wn) || [].some.call(n.removedNodes, wn))
+ return s();
+ if ("S-PAGE" === n.target.nodeName || [].some.call(n.addedNodes, (t => "S-PAGE" === t.nodeName)) || [].some.call(n.removedNodes, (t => "S-PAGE" === t.nodeName)) || n.target instanceof Element && n.target.closest("s-page"))
+ return s()
+ }
+ }
+ )).observe(document, {
+ subtree: !0,
+ childList: !0,
+ characterData: !0,
+ attributes: !0
+ }),
+ t.subscribe("TitleBar.buttons.button.click", (t => null == r ? void 0 : r(t.id))),
+ t.subscribe("TitleBar.breadcrumbs.button.click", (t => null == r ? void 0 : r(t.id))),
+ t.subscribe("MarketingExternalActivityTopBar.buttons.button.click", (t => null == r ? void 0 : r(t.id))),
+ b(cn, class extends g {
+ static get observedAttributes() {
+ return ["title"]
+ }
+ connectedCallback() {
+ this.u = new MutationObserver((() => {
+ xn(this) || this.o(),
+ this.q()
+ }
+ )),
+ this.u.observe(this, {
+ childList: !0,
+ subtree: !0,
+ attributes: !0,
+ characterData: !0
+ }),
+ this.o()
+ }
+ V() {
+ const t = this.querySelector(":scope > [variant=breadcrumb]");
+ return t && (t[en] = "breadcrumb"),
+ t
+ }
+ q() {
+ this.dispatchEvent(new Event("change"))
+ }
+ o() {
+ Xt(this, dn),
+ s()
+ }
+ disconnectedCallback() {
+ var t;
+ this.o(),
+ null == (t = this.u) || t.disconnect()
+ }
+ attributeChangedCallback() {
+ this.o()
+ }
+ buttons() {
+ const t = this.V()
+ , n = this.querySelector(":scope > [variant=primary]")
+ , e = Array.from(this.querySelectorAll(":scope > :not([variant=primary]):not([variant=breadcrumb]), :scope > section")).map((t => "SECTION" !== t.nodeName ? vn(t) : function (t) {
+ var n;
+ t[en] || (t[en] = Ut());
+ const e = t[en]
+ , i = null != (n = t.getAttribute("label")) ? n : "Actions"
+ , o = t.getAttribute("icon") || void 0;
+ return {
+ id: e,
+ label: i,
+ ...o && {
+ icon: o
+ },
+ buttons: Array.from(t.querySelectorAll("button, a")).map(vn)
+ }
+ }(t)));
+ return {
+ ...t ? {
+ breadcrumb: t.textContent
+ } : {},
+ ...n ? {
+ primaryButton: vn(n)
+ } : {},
+ secondaryButtons: e
+ }
+ }
+ }
+ ),
+ s()
+ }
+ ,
+ "./toast.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ t.toast = {
+ show(t, i = {}) {
+ const o = Ut();
+ return kt((async () => {
+ const { toast: r } = await e || {};
+ if (null == r ? void 0 : r.show)
+ await r.show(t, {
+ ...Fn,
+ ...i,
+ id: o
+ });
+ else {
+ const e = new AbortController
+ , { action: r, duration: a, isError: s, onAction: c, onDismiss: l } = Object.assign({}, Fn, i);
+ n.subscribe("Toast.action", (() => null == c ? void 0 : c()), {
+ id: o,
+ signal: e.signal
+ }),
+ n.subscribe("Toast.clear", (() => {
+ e.abort(),
+ null == l || l()
+ }
+ ), {
+ id: o,
+ signal: e.signal
+ }),
+ n.send("Toast.show", {
+ id: o,
+ message: t,
+ isError: s,
+ duration: a,
+ action: r ? {
+ content: r
+ } : void 0
+ })
+ }
+ }
+ )),
+ o
+ },
+ hide(t) {
+ kt((async () => {
+ const { toast: i } = await e || {};
+ (null == i ? void 0 : i.hide) ? await i.hide(t) : n.send("Toast.clear", {
+ id: t
+ })
+ }
+ ))
+ }
+ }
+ }
+ ,
+ "./ui-modal.ts": _n,
+ "./ui-nav-menu.ts": Nn,
+ "./user.ts": ({ api: t, protocol: n, internalApiPromise: e }) => {
+ t.user = async function () {
+ const { user: t } = await e || {};
+ return t ? await t() : new Promise((t => {
+ n.subscribe("getState", (({ staffMember: n, pos: e }) => {
+ const i = {
+ ...n,
+ ...(e || {}).user
+ }
+ , o = {
+ id: i.id,
+ name: i.name || i.firstName,
+ firstName: i.firstName,
+ lastName: i.lastName,
+ email: i.email,
+ accountAccess: i.accountAccess,
+ accountType: i.accountType || i.userType
+ };
+ t(o)
+ }
+ ), {
+ once: !0
+ })
+ }
+ ))
+ }
+ }
+ ,
+ "./visibility.ts": ({ rpcEventTarget: t }) => {
+ const n = {
+ client: document.visibilityState,
+ host: document.visibilityState
+ };
+ t.addEventListener("visibilitychange", (t => {
+ n.host = t.detail.visibilityState,
+ globalThis.document.dispatchEvent(new Event("visibilitychange"))
+ }
+ )),
+ document.addEventListener("visibilitychange", (t => {
+ t.isTrusted && (n.client = "visible" === n.client ? "hidden" : "visible")
+ }
+ )),
+ Object.defineProperty(globalThis.document, "hidden", {
+ configurable: !0,
+ enumerable: !0,
+ get: () => "hidden" === globalThis.document.visibilityState
+ }),
+ Object.defineProperty(globalThis.document, "visibilityState", {
+ configurable: !0,
+ enumerable: !0,
+ get() {
+ const { client: t, host: e } = n;
+ return "visible" === e && "visible" === t ? "visible" : "hidden"
+ }
+ })
+ }
+ ,
+ "./web-vitals.ts": async ({ api: t, protocol: n, internalApiPromise: e, rpcEventTarget: i }) => {
+ if ("undefined" == typeof window || window.__is_web_vitals_initialized__ || L() || C() && !P())
+ return;
+ window.__is_web_vitals_initialized__ = !0;
+ let o = null;
+ t.webVitals = {
+ onReport: async t => {
+ o = t;
+ const n = await e || {};
+ n && n.telemetry && "function" == typeof n.telemetry.increment && n.telemetry.increment("web-vitals-report-listener-added")
+ }
+ };
+ const r = await Promise.resolve().then((() => Ue))
+ , { config: a } = await t || {}
+ , { webVitals: s } = await e || {}
+ , c = !!s
+ , l = {
+ reportAllChanges: c
+ };
+ let u = !0;
+ Un.forEach((({ fn: t, name: i }) => {
+ r[t]((t => async i => {
+ var o;
+ if (c && "function" == typeof (null == s ? void 0 : s.report) ? s.report({
+ id: i.id,
+ name: i.name,
+ value: i.value
+ }) : n.send("WebVitals." + t, {
+ id: i.id,
+ metricName: i.name,
+ value: i.value
+ }),
+ u && "LCP" === i.name) {
+ u = !1;
+ const { perceivedPerformance: t } = await e || {};
+ (null == t ? void 0 : t.appIsReady) && "function" == typeof t.appIsReady && t.appIsReady()
+ }
+ (null == (o = a.debug) ? void 0 : o.webVitals) && console.debug(i)
+ }
+ )(i), l)
+ }
+ )),
+ i.addEventListener("webVitalsReport", (async t => {
+ await (null == o ? void 0 : o({
+ metrics: "metrics" in t.detail && Array.isArray(t.detail.metrics) ? t.detail.metrics : []
+ }))
+ }
+ ))
+ }
+ });
+ !function () {
+ var t, n, e;
+ try {
+ if ("then" in ((null == (t = self.shopify) ? void 0 : t.ready) || {}))
+ return
+ } catch (g) { }
+ if (!function () {
+ try {
+ if (!document.currentScript)
+ return console.error('The script tag loading App Bridge has `type="module"`'),
+ !1;
+ const t = document.currentScript;
+ return t.async ? (console.error("The script tag loading App Bridge has `async`"),
+ !1) : t.defer ? (console.error("The script tag loading App Bridge has `defer`."),
+ !1) : t.src ? new URL(t.src).hostname != ct ? (console.error("The script tag loading App Bridge is not loading App Bridge from the Shopify CDN."),
+ !1) : (0 !== [...document.scripts].filter((t => function (t) {
+ return !!t.src && !t.defer && !t.async && "module" !== t.type && !t.dataset.appBridgeCompatible && /^ *(|(text|application)\/(x-)?(java|ecma)script) *$/i.test(t.type)
+ }(t))).indexOf(t) && console.warn("The script tag loading App Bridge should be the first script tag in the document. Loading other blocking scripts first can cause unexpected behavior."),
+ !0) : (console.error("The script tag loading App Bridge is not loading App Bridge from the Shopify CDN."),
+ !1)
+ } catch (t) {
+ return console.error("App Bridge failed to self-validate", t),
+ !1
+ }
+ }())
+ throw Error("Shopify’s App Bridge must be included as the first
-