diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs index 80126c5d1044..850883e4424e 100644 --- a/.pnpmfile.cjs +++ b/.pnpmfile.cjs @@ -14,7 +14,7 @@ const approvedList = new Map([ 'wyvern-js', ['git+https://github.com/ProjectOpenSea/wyvern-js.git#v3.2.1', 'github:ProjectOpenSea/wyvern-js#semver:^3.2.1'], ], - ['wyvern-schemas', 'git+https://github.com/ProjectOpenSea/wyvern-schemas.git#v0.11.1'], + ['wyvern-schemas', 'git+https://github.com/ProjectOpenSea/wyvern-schemas.git#v0.13.1'], ['bignumber.js', 'git+https://github.com/frozeman/bignumber.js-nolookahead.git'], /* cspell:disable-next-line */ ['html-parse-stringify2', 'github:locize/html-parse-stringify2'], diff --git a/packages/mask/package.json b/packages/mask/package.json index d49f6010dc94..e4b374dd868c 100644 --- a/packages/mask/package.json +++ b/packages/mask/package.json @@ -30,9 +30,9 @@ "@masknet/shared-base": "workspace:*", "@masknet/theme": "workspace:*", "@masknet/web3-contracts": "workspace:*", + "@masknet/web3-providers": "workspace:*", "@masknet/web3-shared-base": "workspace:*", "@masknet/web3-shared-evm": "workspace:*", - "@masknet/web3-providers": "workspace:*", "@msgpack/msgpack": "^2.7.1", "@servie/events": "^3.0.0", "@sinonjs/text-encoding": "^0.7.1", @@ -90,7 +90,7 @@ "lodash-es": "npm:lodash@^4.17.11", "millify": "^4.0.0", "next-tick": "^1.0.0", - "opensea-js": "^1.1.11", + "opensea-js": "^1.2.7", "promievent": "^0.1.4", "protobufjs": "^6.11.2", "react-draggable": "^4.4.4", diff --git a/packages/mask/shared-ui/locales/en-US.json b/packages/mask/shared-ui/locales/en-US.json index f9e57bf4c010..9bc57b145055 100644 --- a/packages/mask/shared-ui/locales/en-US.json +++ b/packages/mask/shared-ui/locales/en-US.json @@ -578,6 +578,7 @@ "plugin_collectible_you": "You", "plugin_collectible_done": "Done", "plugin_collectible_retry": "Retry", + "plugin_collectible_get_more_token": "Get more {{token}}", "plugin_collectible_sell": "Sell", "plugin_collectible_checkout": "Checkout", "plugin_collectible_place_bid": "Place Bid", diff --git a/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutDialog.tsx b/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutDialog.tsx index 170d8ad16dcb..7d364fd1400b 100644 --- a/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutDialog.tsx +++ b/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutDialog.tsx @@ -12,7 +12,7 @@ import { } from '@mui/material' import { makeStyles } from '@masknet/theme' import { Trans } from 'react-i18next' -import { useAccount } from '@masknet/web3-shared-evm' +import { EthereumTokenType, useAccount, useFungibleTokenWatched } from '@masknet/web3-shared-evm' import { InjectedDialog } from '../../../components/shared/InjectedDialog' import { UnreviewedWarning } from './UnreviewedWarning' import { useI18N } from '../../../utils' @@ -24,6 +24,8 @@ import { PluginTraderMessages } from '../../Trader/messages' import { CheckoutOrder } from './CheckoutOrder' import type { useAsset } from '../../EVM/hooks/useAsset' import type { useAssetOrder } from '../hooks/useAssetOrder' +import type { Coin } from '../../Trader/types' +import { isGreaterThan } from '@masknet/web3-shared-base' const useStyles = makeStyles()((theme) => { return { @@ -62,16 +64,18 @@ export interface CheckoutDialogProps { export function CheckoutDialog(props: CheckoutDialogProps) { const { asset, open, onClose, order } = props - const isAuction = asset?.value?.is_auction ?? false const isVerified = asset?.value?.is_verified ?? false const { t } = useI18N() const { classes } = useStyles() - const account = useAccount() const [unreviewedChecked, setUnreviewedChecked] = useState(false) const [ToS_Checked, setToS_Checked] = useState(false) - + const [insufficientBalance, setInsufficientBalance] = useState(false) + const { token, balance } = useFungibleTokenWatched({ + type: EthereumTokenType.Native, + address: order.value?.paymentTokenContract?.address ?? '', + }) const onCheckout = useCallback(async () => { if (!asset?.value) return if (!asset.value.token_id || !asset.value.token_address) return @@ -84,13 +88,33 @@ export function CheckoutDialog(props: CheckoutDialogProps) { }) }, [asset?.value, account, order?.value]) - const { openDialog: openSwapDialog } = useRemoteControlledDialog(PluginTraderMessages.swapDialogUpdated) + const { setDialog: openSwapDialog } = useRemoteControlledDialog(PluginTraderMessages.swapDialogUpdated) + + const onConvertClick = useCallback(() => { + if (!token?.value) return + openSwapDialog({ + open: true, + traderProps: { + coin: { + id: token.value.address, + name: token.value.name ?? '', + symbol: token.value.symbol ?? '', + contract_address: token.value.address, + decimals: token.value.decimals, + } as Coin, + }, + }) + }, [token.value, openSwapDialog]) const validationMessage = useMemo(() => { + if (isGreaterThan(order?.value?.basePrice ?? 0, balance.value ?? 0)) { + setInsufficientBalance(true) + return t('plugin_collectible_insufficient_balance') + } if (!isVerified && !unreviewedChecked) return t('plugin_collectible_ensure_unreviewed_item') if (!isVerified && !ToS_Checked) return t('plugin_collectible_check_tos_document') return '' - }, [isVerified, unreviewedChecked, ToS_Checked]) + }, [isVerified, unreviewedChecked, ToS_Checked, order.value]) return ( @@ -172,13 +196,15 @@ export function CheckoutDialog(props: CheckoutDialogProps) { completeOnClick={onClose} failedOnClick="use executor" /> - {asset?.value?.isOrderWeth ? ( + {asset?.value?.isOrderWeth || insufficientBalance ? ( - {t('plugin_collectible_convert_eth')} + onClick={onConvertClick}> + {insufficientBalance + ? t('plugin_collectible_get_more_token', { token: token.value?.symbol }) + : t('plugin_collectible_convert_eth')} ) : null} diff --git a/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutOrder.tsx b/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutOrder.tsx index a23213fb1ec7..fbbc1e5565e3 100644 --- a/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutOrder.tsx +++ b/packages/mask/src/plugins/Collectible/SNSAdaptor/CheckoutOrder.tsx @@ -1,11 +1,12 @@ import { Table, TableHead, TableBody, TableRow, TableCell, Typography, Link } from '@mui/material' import { makeStyles } from '@masknet/theme' import { Image } from '../../../components/shared/Image' -import { useChainId } from '@masknet/web3-shared-evm' +import { ERC20TokenDetailed, useChainId, formatBalance } from '@masknet/web3-shared-evm' import { resolveAssetLinkOnOpenSea } from '../pipes' import { useI18N } from '../../../utils' import type { useAsset } from '../../EVM/hooks/useAsset' import type { useAssetOrder } from '../hooks/useAssetOrder' +import type { Order } from 'opensea-js/lib/types' const useStyles = makeStyles()((theme) => ({ itemInfo: { @@ -24,14 +25,23 @@ export interface CheckoutOrderProps { export function CheckoutOrder(props: CheckoutOrderProps) { const { t } = useI18N() - const { asset } = props - const order = asset?.value?.desktopOrder + const { asset, assetOrder } = props + const order = assetOrder?.value ?? asset?.value?.desktopOrder const { classes } = useStyles() const chainId = useChainId() - if (!asset?.value) return null if (!order) return null + const price = (order as Order).currentPrice ?? asset.value.current_price + const getPrice = () => { + if (!price) return 'error' + const decimal = asset.value?.response_.collection.payment_tokens.find((item: ERC20TokenDetailed) => { + return item.symbol === asset.value?.current_symbol + })?.decimals + if (!decimal) return 'error' + return formatBalance(price, decimal) ?? 'error' + } + return ( @@ -67,7 +77,7 @@ export function CheckoutOrder(props: CheckoutOrderProps) { - {asset.value.current_price} {asset.value.current_symbol} + {getPrice()} {asset.value.current_symbol} @@ -77,7 +87,7 @@ export function CheckoutOrder(props: CheckoutOrderProps) { - {asset.value.current_price} {asset.value.current_symbol} + {getPrice()} {asset.value.current_symbol} diff --git a/packages/mask/src/plugins/Collectible/SNSAdaptor/MakeOfferDialog.tsx b/packages/mask/src/plugins/Collectible/SNSAdaptor/MakeOfferDialog.tsx index bb554596441c..d7ecbf427a74 100644 --- a/packages/mask/src/plugins/Collectible/SNSAdaptor/MakeOfferDialog.tsx +++ b/packages/mask/src/plugins/Collectible/SNSAdaptor/MakeOfferDialog.tsx @@ -91,6 +91,7 @@ export function MakeOfferDialog(props: MakeOfferDialogProps) { const [expirationDateTime, setExpirationDateTime] = useState(new Date()) const [unreviewedChecked, setUnreviewedChecked] = useState(false) const [ToS_Checked, setToS_Checked] = useState(false) + const [insufficientBalance, setInsufficientBalance] = useState(false) const { amount, token, balance, setAmount, setToken } = useFungibleTokenWatched(selectedPaymentToken) @@ -137,10 +138,14 @@ export function MakeOfferDialog(props: MakeOfferDialogProps) { }, [open]) const validationMessage = useMemo(() => { + setInsufficientBalance(false) const amount_ = rightShift(amount, token.value?.decimals) const balance_ = new BigNumber(balance.value ?? '0') if (amount_.isNaN() || amount_.isZero()) return t('plugin_collectible_enter_a_price') - if (balance_.isZero() || amount_.isGreaterThan(balance_)) return t('plugin_collectible_insufficient_balance') + if (balance_.isZero() || amount_.isGreaterThan(balance_)) { + setInsufficientBalance(true) + return t('plugin_collectible_insufficient_balance') + } if (!isAuction && expirationDateTime.getTime() - Date.now() <= 0) return t('plugin_collectible_invalid_expiration_date') if (!isVerified && !unreviewedChecked) return t('plugin_collectible_ensure_unreviewed_item') @@ -260,13 +265,16 @@ export function MakeOfferDialog(props: MakeOfferDialogProps) { completeOnClick={onClose} failedOnClick="use executor" /> - {(isAuction ? asset.value?.isCollectionWeth : asset.value?.isOrderWeth) ? ( + {(isAuction ? asset.value?.isCollectionWeth : asset.value?.isOrderWeth) || + insufficientBalance ? ( - Convert ETH + {insufficientBalance + ? t('plugin_collectible_get_more_token', { token: token.value?.symbol }) + : t('plugin_collectible_convert_eth')} ) : null} diff --git a/packages/mask/src/plugins/Collectible/hooks/useAssetOrder.ts b/packages/mask/src/plugins/Collectible/hooks/useAssetOrder.ts index a46564562eab..1b4f2ca7f4b4 100644 --- a/packages/mask/src/plugins/Collectible/hooks/useAssetOrder.ts +++ b/packages/mask/src/plugins/Collectible/hooks/useAssetOrder.ts @@ -1,12 +1,12 @@ import { unreachable } from '@dimensiondev/kit' import { getOrderUnitPrice } from '@masknet/web3-providers' -import { ONE } from '@masknet/web3-shared-base' +import { ZERO } from '@masknet/web3-shared-base' import { NonFungibleAssetProvider } from '@masknet/web3-shared-evm' import { head } from 'lodash-unified' import type { Order } from 'opensea-js/lib/types' import { useAsyncRetry } from 'react-use' import { PluginCollectibleRPC } from '../messages' -import type { CollectibleToken } from '../types' +import type { AssetOrder, CollectibleToken } from '../types' export function useAssetOrder(provider: NonFungibleAssetProvider, token?: CollectibleToken) { return useAsyncRetry(async () => { @@ -14,15 +14,19 @@ export function useAssetOrder(provider: NonFungibleAssetProvider, token?: Collec switch (provider) { case NonFungibleAssetProvider.OPENSEA: const openSeaResponse = await PluginCollectibleRPC.getAssetFromSDK(token.contractAddress, token.tokenId) - const getPrice = (order: Order) => - getOrderUnitPrice( - order.currentPrice?.toFixed(), - order.paymentTokenContract?.decimals ?? 0, - order.quantity.toFixed(), - ) ?? ONE + const getPrice = (order: Order | AssetOrder) => { + const _order = order as AssetOrder + return ( + getOrderUnitPrice( + _order.currentPrice, + _order.paymentTokenContract?.decimals, + _order.quantity, + ) ?? ZERO + ) + } + const sellOrders = openSeaResponse.sellOrders ?? [] const desktopOrder = head(sellOrders.sort((a, b) => getPrice(a).toNumber() - getPrice(b).toNumber())) - return desktopOrder case NonFungibleAssetProvider.RARIBLE: return diff --git a/packages/mask/src/plugins/Collectible/types/opensea.ts b/packages/mask/src/plugins/Collectible/types/opensea.ts index a0af4e48e4de..b6f6046f7f0b 100644 --- a/packages/mask/src/plugins/Collectible/types/opensea.ts +++ b/packages/mask/src/plugins/Collectible/types/opensea.ts @@ -189,6 +189,8 @@ export interface AssetOrder { expiration_time: number order_hash: string base_price?: string + currentPrice?: string + paymentTokenContract?: OpenSeaFungibleToken } export interface OpenSeaResponse extends Asset { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3de41c5ae0ec..539976b191ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -369,7 +369,7 @@ importers: lodash-es: npm:lodash@^4.17.11 millify: ^4.0.0 next-tick: ^1.0.0 - opensea-js: ^1.1.11 + opensea-js: ^1.2.7 promievent: ^0.1.4 protobufjs: ^6.11.2 react-devtools-core: ^4.22.1 @@ -496,7 +496,7 @@ importers: lodash-es: /lodash/4.17.21 millify: 4.0.0 next-tick: 1.1.0 - opensea-js: 1.1.11 + opensea-js: 1.2.7 promievent: 0.1.5 protobufjs: 6.11.2 react-draggable: 4.4.4_757a802188413a36d4f24237d13b8e90 @@ -998,7 +998,7 @@ packages: bintrees: 1.0.2 bn.js: 4.12.0 compare-versions: 3.6.0 - ethereumjs-abi: 0.6.8 + ethereumjs-abi: 0.6.6 ethereumjs-blockstream: 2.0.7 ethereumjs-util: 5.2.1 find-versions: 2.0.0 @@ -9407,7 +9407,7 @@ packages: resolution: {integrity: sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=} deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 dependencies: - follow-redirects: 1.14.6 + follow-redirects: 1.14.5 is-buffer: 1.1.6 transitivePeerDependencies: - debug @@ -11499,7 +11499,7 @@ packages: /core-js/1.2.7: resolution: {integrity: sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=} - deprecated: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. + deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. dev: false /core-js/2.6.12: @@ -13455,11 +13455,11 @@ packages: resolution: {integrity: sha512-5qwJ5n3YhjSpE6O/WEBXCAb2nagUgyagJ6C0lGUBWC4LjKp/rRzD+pwtDJ6KCiITFEAoX4eIrWOjRy0Sylq5Hg==} dev: false - /ethereumjs-abi/0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + /ethereumjs-abi/0.6.6: + resolution: {integrity: sha512-w8KubDsA/+OAuqtIR9RGsMcoZ5nhM8vxwjJAJvEIY+clhxA3BHoLG3+ClYQaQhD0n3mlDt3U5rBrmSVJvI3c8A==} dependencies: bn.js: 4.12.0 - ethereumjs-util: 6.2.1 + ethereumjs-util: 5.2.1 dev: false /ethereumjs-account/2.0.5: @@ -13539,7 +13539,7 @@ packages: elliptic: 6.5.4 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 - rlp: 2.2.6 + rlp: 2.2.7 safe-buffer: 5.2.1 dev: false @@ -14067,11 +14067,11 @@ packages: /fbemitter/2.1.1: resolution: {integrity: sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=} dependencies: - fbjs: 0.8.17 + fbjs: 0.8.18 dev: false - /fbjs/0.8.17: - resolution: {integrity: sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=} + /fbjs/0.8.18: + resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==} dependencies: core-js: 1.2.7 isomorphic-fetch: 2.2.1 @@ -14079,7 +14079,7 @@ packages: object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 0.7.28 + ua-parser-js: 0.7.31 dev: false /fetch-ponyfill/4.1.0: @@ -14143,11 +14143,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /filter-obj/1.1.0: - resolution: {integrity: sha1-mzERErxsYSehbgFsbF1/GeCAXFs=} - engines: {node: '>=0.10.0'} - dev: false - /finalhandler/1.1.2: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} @@ -14302,16 +14297,6 @@ packages: debug: optional: true - /follow-redirects/1.14.6: - resolution: {integrity: sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -16362,7 +16347,7 @@ packages: /isomorphic-unfetch/2.1.1: resolution: {integrity: sha512-nd8AULy4i2rA8dv0nOBT9xieIegd3xi7NDxTQ9+iNXDTyaG6VbUYW3F+TdMRqxqXhDFWM2k7fttKx9W2Wd8JpQ==} dependencies: - node-fetch: 2.6.1 + node-fetch: 2.6.6 unfetch: 3.1.2 dev: false @@ -18485,7 +18470,6 @@ packages: engines: {node: 4.x || >=6.0.0} dependencies: whatwg-url: 5.0.0 - dev: true /node-forge/0.10.0: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} @@ -18847,8 +18831,8 @@ packages: is-wsl: 2.2.0 dev: true - /opensea-js/1.1.11: - resolution: {integrity: sha512-XKB4iFEWfK2bU5ne2ewvpaotjI2iPj/L7PRQ0j9GFTX5EBy6/A4Sy8B+lfeKSgOsy1GEmyM1DsvekfVqND/2ig==} + /opensea-js/1.2.7: + resolution: {integrity: sha512-s/ixGOIOpvqKiau3lSdUJF/osKVYh9yVZBpOslsk5bgRlbkJkBrfqCh0/2GH11EvX/wRYSaL70IYKvYew7g2pg==} dependencies: bignumber.js: 4.1.0 ethereumjs-abi: github.com/ProjectWyvern/ethereumjs-abi/3d2d89641a6ad5984929b6ca4b646452ec74f73d @@ -18857,7 +18841,7 @@ packages: isomorphic-unfetch: 2.1.1 json-loader: 0.5.7 lodash: 4.17.21 - query-string: 6.14.1 + query-string: 6.13.5 web3: 0.20.7 webpack: 3.12.0 wyvern-js: github.com/ProjectOpenSea/wyvern-js/fabb7660f23f2252c141077e32193d281036299e @@ -19857,16 +19841,6 @@ packages: strict-uri-encode: 2.0.0 dev: false - /query-string/6.14.1: - resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} - engines: {node: '>=6'} - dependencies: - decode-uri-component: 0.2.0 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - dev: false - /querystring-es3/0.2.1: resolution: {integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=} engines: {node: '>=0.4.x'} @@ -20962,13 +20936,6 @@ packages: hash-base: 3.1.0 inherits: 2.0.4 - /rlp/2.2.6: - resolution: {integrity: sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==} - hasBin: true - dependencies: - bn.js: 4.12.0 - dev: false - /rlp/2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -22779,7 +22746,6 @@ packages: /tr46/0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - dev: true /tr46/2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} @@ -23239,8 +23205,8 @@ packages: resolution: {integrity: sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=} dev: false - /ua-parser-js/0.7.28: - resolution: {integrity: sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==} + /ua-parser-js/0.7.31: + resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: false /uglify-js/2.8.29: @@ -24210,7 +24176,6 @@ packages: /webidl-conversions/3.0.1: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - dev: true /webidl-conversions/5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} @@ -24630,7 +24595,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true /whatwg-url/8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}