diff --git a/docs/core/api/useDLE.md b/docs/core/api/useDLE.md index 14fd3408d548..ef700f9dfe22 100644 --- a/docs/core/api/useDLE.md +++ b/docs/core/api/useDLE.md @@ -10,6 +10,7 @@ import PkgTabs from '@site/src/components/PkgTabs'; import GenericsTabs from '@site/src/components/GenericsTabs'; import ConditionalDependencies from '../shared/\_conditional_dependencies.mdx'; import TypeScriptEditor from '@site/src/components/TypeScriptEditor'; +import StackBlitz from '@site/src/components/StackBlitz'; useDLE() - [D]ata [L]oading [E]rror React State @@ -309,3 +310,13 @@ export default function ArticleList({ page }: { page: string }) { ``` + +### Github Reactions + +`useDLE()` allows us to declaratively fetch reactions on any issue page the moment we navigate to it. This allows +us to not block the issues page from showing if the reactions are not completed loading. + +It's usually better to wrap cases like this in new [Suspense Boundaries](../getting-started/data-dependency.md#boundaries). +However, our component library `ant design` does not allow this. + + diff --git a/docs/core/api/useFetch.md b/docs/core/api/useFetch.md index c758ec88f248..69838fd33c42 100644 --- a/docs/core/api/useFetch.md +++ b/docs/core/api/useFetch.md @@ -4,7 +4,6 @@ title: useFetch() import GenericsTabs from '@site/src/components/GenericsTabs'; import ConditionalDependencies from '../shared/\_conditional_dependencies.mdx'; -import StackBlitz from '@site/src/components/StackBlitz'; useFetch() - Declarative fetch triggers for React @@ -78,15 +77,3 @@ function useFetch< ``` - -## Examples - -### Github Reactions - -`useFetch()` allows us to declaratively fetch reactions on any issue page the moment we navigate to it. This allows -us to not block the issues page from showing if the reactions are not completed loading. - -It's usually better to wrap cases like this in new [Suspense Boundaries](../getting-started/data-dependency.md#boundaries). -However, our component library `ant design` does not allow this. - - diff --git a/examples/coin-app/package.json b/examples/coin-app/package.json index 0be31a752540..2e3491997d17 100644 --- a/examples/coin-app/package.json +++ b/examples/coin-app/package.json @@ -29,6 +29,7 @@ "@linaria/core": "*", "@linaria/react": "*", "@linaria/shaker": "*", + "@types/d3": "^7", "@types/react": "*", "@types/react-dom": "*", "react-refresh": "*", @@ -45,6 +46,7 @@ "@data-client/react": "^0.11.0", "@data-client/redux": "^0.11.0", "@data-client/rest": "^0.11.0", + "d3": "^7.9.0", "history": "*", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/coin-app/src/pages/AssetDetail/AssetChart.tsx b/examples/coin-app/src/pages/AssetDetail/AssetChart.tsx new file mode 100644 index 000000000000..bee28b5207f3 --- /dev/null +++ b/examples/coin-app/src/pages/AssetDetail/AssetChart.tsx @@ -0,0 +1,18 @@ +import { useDLE } from '@data-client/react'; +import { useMemo } from 'react'; +import { getCandles } from 'resources/Candles'; + +import { formatPrice } from '../../components/formatPrice'; + +export default function AssetChart({ product_id }: Props) { + const { data: candles, loading } = useDLE(getCandles, { product_id }); + // Don't block page from loading + // TODO: put correct height item here + if (loading || !candles) return  ; + + return  ; +} + +interface Props { + product_id: string; +} diff --git a/examples/coin-app/src/pages/AssetDetail/index.tsx b/examples/coin-app/src/pages/AssetDetail/index.tsx index 782138ade755..2f384c62e00d 100644 --- a/examples/coin-app/src/pages/AssetDetail/index.tsx +++ b/examples/coin-app/src/pages/AssetDetail/index.tsx @@ -1,6 +1,7 @@ import { useSuspense } from '@data-client/react'; import { CurrencyResource } from 'resources/Currency'; +import AssetChart from './AssetChart'; import AssetPrice from './AssetPrice'; import Stats from './Stats'; @@ -11,6 +12,7 @@ export default function AssetDetail({ id }: { id: string }) {

{currency.name}

+ ); } diff --git a/examples/coin-app/src/resources/Candles.ts b/examples/coin-app/src/resources/Candles.ts new file mode 100644 index 000000000000..dbb0d419d461 --- /dev/null +++ b/examples/coin-app/src/resources/Candles.ts @@ -0,0 +1,26 @@ +import { RestEndpoint } from '@data-client/rest'; + +// docs: https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getproductcandles +export const getCandles = new RestEndpoint({ + urlPrefix: 'https://api.exchange.coinbase.com', + path: '/products/:product_id/candles', + searchParams: {} as { + granularity?: 60 | 300 | 900 | 3600 | 21600 | 86400; + start?: string | number; + end?: string | number; + }, + process(value: CandleTuple[]) { + return value.map(candle => ({ + timestamp: candle[0], + price_open: candle[3], + })); + }, +}); + +type CandleTuple = [ + timestamp: number, + price_low: number, + price_high: number, + price_open: number, + price_close: number, +]; diff --git a/examples/coin-app/src/resources/Product.ts b/examples/coin-app/src/resources/Product.ts index fd9bb199a5d5..e63d3fc5cce9 100644 --- a/examples/coin-app/src/resources/Product.ts +++ b/examples/coin-app/src/resources/Product.ts @@ -43,12 +43,9 @@ export const queryProduct = new schema.Query( product => product.quote_currency === quote_currency, ); - sorted = sorted.sort((a, b) => { + return sorted.sort((a, b) => { return b.stats.volume_30day - a.stats.volume_30day; }); - const btc = sorted.find(product => product.base_currency === 'BTC'); - if (btc) sorted.unshift(btc); - return sorted; }, ); diff --git a/examples/coin-app/src/routing/routes.tsx b/examples/coin-app/src/routing/routes.tsx index ec16c5871267..13c755691c35 100644 --- a/examples/coin-app/src/routing/routes.tsx +++ b/examples/coin-app/src/routing/routes.tsx @@ -1,5 +1,6 @@ import { Route } from '@anansi/router'; import { Controller } from '@data-client/react'; +import { getCandles } from 'resources/Candles'; import { CurrencyResource } from 'resources/Currency'; import { StatsResource } from 'resources/Stats'; import { getTicker } from 'resources/Ticker'; @@ -22,6 +23,7 @@ export const routes: Route[] = [ component: lazyPage('AssetDetail'), async resolveData(controller, { id }) { const product_id = `${id}-USD`; + controller.fetchIfStale(getCandles, { product_id }); await Promise.allSettled([ controller.fetchIfStale(getTicker, { product_id }), controller.fetchIfStale(CurrencyResource.get, { id }), diff --git a/examples/github-app/src/pages/IssueDetail/index.tsx b/examples/github-app/src/pages/IssueDetail/index.tsx index 59fd9e25032e..aa2d41bcfb6f 100644 --- a/examples/github-app/src/pages/IssueDetail/index.tsx +++ b/examples/github-app/src/pages/IssueDetail/index.tsx @@ -1,5 +1,5 @@ import { Link } from '@anansi/router'; -import { useSuspense, useFetch, useCache } from '@data-client/react'; +import { useSuspense, useCache, useDLE } from '@data-client/react'; import { Card, Avatar, Popover } from 'antd'; import { Tag } from 'antd'; import Boundary from 'Boundary'; @@ -25,9 +25,10 @@ const { Meta } = Card; function IssueDetail({ number, repo, owner }: Props) { const params = { number, repo, owner }; - useFetch(ReactionResource.getList, params); + const { + data: { results: reactions }, + } = useDLE(ReactionResource.getList, params); const issue = useSuspense(IssueResource.get, params); - const { results: reactions } = useCache(ReactionResource.getList, params); const currentUser = useCache(UserResource.current); const actions: JSX.Element[] = useMemo(() => { diff --git a/website/sidebars-endpoint.json b/website/sidebars-endpoint.json index ef2e2f3fa6a4..cadea4d0a40f 100644 --- a/website/sidebars-endpoint.json +++ b/website/sidebars-endpoint.json @@ -37,7 +37,7 @@ }, { "type": "doc", - "id": "api/Invalidate" + "id": "api/Query" }, { "type": "doc", @@ -45,7 +45,7 @@ }, { "type": "doc", - "id": "api/Query" + "id": "api/Invalidate" }, { "type": "doc", diff --git a/website/static/_headers b/website/static/_headers new file mode 100644 index 000000000000..3895e305491f --- /dev/null +++ b/website/static/_headers @@ -0,0 +1,10 @@ +# Cloudflare headers - https://developers.cloudflare.com/pages/configuration/headers/ +/img/client-logo.svg + Cross-Origin-Resource-Policy: cross-origin + Access-Control-Allow-Origin: * + Cross-Origin-Embedder-Policy: credentialless + +/img/cancel.svg + Cross-Origin-Resource-Policy: cross-origin + Access-Control-Allow-Origin: * + Cross-Origin-Embedder-Policy: credentialless \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ac9e7726ec32..d0fc7f448396 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6639,14 +6639,176 @@ __metadata: languageName: node linkType: hard -"@types/d3-scale-chromatic@npm:^3.0.0": +"@types/d3-array@npm:*": + version: 3.2.1 + resolution: "@types/d3-array@npm:3.2.1" + checksum: 10c0/38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca + languageName: node + linkType: hard + +"@types/d3-axis@npm:*": + version: 3.0.6 + resolution: "@types/d3-axis@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/d756d42360261f44d8eefd0950c5bb0a4f67a46dd92069da3f723ac36a1e8cb2b9ce6347d836ef19d5b8aef725dbcf8fdbbd6cfbff676ca4b0642df2f78b599a + languageName: node + linkType: hard + +"@types/d3-brush@npm:*": + version: 3.0.6 + resolution: "@types/d3-brush@npm:3.0.6" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/fd6e2ac7657a354f269f6b9c58451ffae9d01b89ccb1eb6367fd36d635d2f1990967215ab498e0c0679ff269429c57fad6a2958b68f4d45bc9f81d81672edc01 + languageName: node + linkType: hard + +"@types/d3-chord@npm:*": + version: 3.0.6 + resolution: "@types/d3-chord@npm:3.0.6" + checksum: 10c0/c5a25eb5389db01e63faec0c5c2ec7cc41c494e9b3201630b494c4e862a60f1aa83fabbc33a829e7e1403941e3c30d206c741559b14406ac2a4239cfdf4b4c17 + languageName: node + linkType: hard + +"@types/d3-color@npm:*": + version: 3.1.3 + resolution: "@types/d3-color@npm:3.1.3" + checksum: 10c0/65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae + languageName: node + linkType: hard + +"@types/d3-contour@npm:*": + version: 3.0.6 + resolution: "@types/d3-contour@npm:3.0.6" + dependencies: + "@types/d3-array": "npm:*" + "@types/geojson": "npm:*" + checksum: 10c0/e7d83e94719af4576ceb5ac7f277c5806f83ba6c3631744ae391cffc3641f09dfa279470b83053cd0b2acd6784e8749c71141d05bdffa63ca58ffb5b31a0f27c + languageName: node + linkType: hard + +"@types/d3-delaunay@npm:*": + version: 6.0.4 + resolution: "@types/d3-delaunay@npm:6.0.4" + checksum: 10c0/d154a8864f08c4ea23ecb9bdabcef1c406a25baa8895f0cb08a0ed2799de0d360e597552532ce7086ff0cdffa8f3563f9109d18f0191459d32bb620a36939123 + languageName: node + linkType: hard + +"@types/d3-dispatch@npm:*": + version: 3.0.6 + resolution: "@types/d3-dispatch@npm:3.0.6" + checksum: 10c0/405eb7d0ec139fbf72fa6a43b0f3ca8a1f913bb2cb38f607827e63fca8d4393f021f32f3b96b33c93ddbd37789453a0b3624f14f504add5308fd9aec8a46dda0 + languageName: node + linkType: hard + +"@types/d3-drag@npm:*": + version: 3.0.7 + resolution: "@types/d3-drag@npm:3.0.7" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d + languageName: node + linkType: hard + +"@types/d3-dsv@npm:*": + version: 3.0.7 + resolution: "@types/d3-dsv@npm:3.0.7" + checksum: 10c0/c0f01da862465594c8a28278b51c850af3b4239cc22b14fd1a19d7a98f93d94efa477bf59d8071beb285dca45bf614630811451e18e7c52add3a0abfee0a1871 + languageName: node + linkType: hard + +"@types/d3-ease@npm:*": + version: 3.0.2 + resolution: "@types/d3-ease@npm:3.0.2" + checksum: 10c0/aff5a1e572a937ee9bff6465225d7ba27d5e0c976bd9eacdac2e6f10700a7cb0c9ea2597aff6b43a6ed850a3210030870238894a77ec73e309b4a9d0333f099c + languageName: node + linkType: hard + +"@types/d3-fetch@npm:*": + version: 3.0.7 + resolution: "@types/d3-fetch@npm:3.0.7" + dependencies: + "@types/d3-dsv": "npm:*" + checksum: 10c0/3d147efa52a26da1a5d40d4d73e6cebaaa964463c378068062999b93ea3731b27cc429104c21ecbba98c6090e58ef13429db6399238c5e3500162fb3015697a0 + languageName: node + linkType: hard + +"@types/d3-force@npm:*": + version: 3.0.9 + resolution: "@types/d3-force@npm:3.0.9" + checksum: 10c0/6d791a48ea570daaada6df93af8c877d58e6b940b3ab4515cde08ed6ed1d4e8e59fd8407efe37a1b3f5fe95867fe83a2974c4314a7924dc19860a5e955c26211 + languageName: node + linkType: hard + +"@types/d3-format@npm:*": + version: 3.0.4 + resolution: "@types/d3-format@npm:3.0.4" + checksum: 10c0/3ac1600bf9061a59a228998f7cd3f29e85cbf522997671ba18d4d84d10a2a1aff4f95aceb143fa9960501c3ec351e113fc75884e6a504ace44dc1744083035ee + languageName: node + linkType: hard + +"@types/d3-geo@npm:*": + version: 3.1.0 + resolution: "@types/d3-geo@npm:3.1.0" + dependencies: + "@types/geojson": "npm:*" + checksum: 10c0/3745a93439038bb5b0b38facf435f7079812921d46406f5d38deaee59e90084ff742443c7ea0a8446df81a0d81eaf622fe7068cf4117a544bd4aa3b2dc182f88 + languageName: node + linkType: hard + +"@types/d3-hierarchy@npm:*": + version: 3.1.7 + resolution: "@types/d3-hierarchy@npm:3.1.7" + checksum: 10c0/873711737d6b8e7b6f1dda0bcd21294a48f75024909ae510c5d2c21fad2e72032e0958def4d9f68319d3aaac298ad09c49807f8bfc87a145a82693b5208613c7 + languageName: node + linkType: hard + +"@types/d3-interpolate@npm:*": + version: 3.0.4 + resolution: "@types/d3-interpolate@npm:3.0.4" + dependencies: + "@types/d3-color": "npm:*" + checksum: 10c0/066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4 + languageName: node + linkType: hard + +"@types/d3-path@npm:*": + version: 3.1.0 + resolution: "@types/d3-path@npm:3.1.0" + checksum: 10c0/85e8b3aa968a60a5b33198ade06ae7ffedcf9a22d86f24859ff58e014b053ccb7141ec163b78d547bc8215bb12bb54171c666057ab6156912814005b686afb31 + languageName: node + linkType: hard + +"@types/d3-polygon@npm:*": + version: 3.0.2 + resolution: "@types/d3-polygon@npm:3.0.2" + checksum: 10c0/f46307bb32b6c2aef8c7624500e0f9b518de8f227ccc10170b869dc43e4c542560f6c8d62e9f087fac45e198d6e4b623e579c0422e34c85baf56717456d3f439 + languageName: node + linkType: hard + +"@types/d3-quadtree@npm:*": + version: 3.0.6 + resolution: "@types/d3-quadtree@npm:3.0.6" + checksum: 10c0/7eaa0a4d404adc856971c9285e1c4ab17e9135ea669d847d6db7e0066126a28ac751864e7ce99c65d526e130f56754a2e437a1617877098b3bdcc3ef23a23616 + languageName: node + linkType: hard + +"@types/d3-random@npm:*": + version: 3.0.3 + resolution: "@types/d3-random@npm:3.0.3" + checksum: 10c0/5f4fea40080cd6d4adfee05183d00374e73a10c530276a6455348983dda341003a251def28565a27c25d9cf5296a33e870e397c9d91ff83fb7495a21c96b6882 + languageName: node + linkType: hard + +"@types/d3-scale-chromatic@npm:*, @types/d3-scale-chromatic@npm:^3.0.0": version: 3.0.3 resolution: "@types/d3-scale-chromatic@npm:3.0.3" checksum: 10c0/2f48c6f370edba485b57b73573884ded71914222a4580140ff87ee96e1d55ccd05b1d457f726e234a31269b803270ac95d5554229ab6c43c7e4a9894e20dd490 languageName: node linkType: hard -"@types/d3-scale@npm:^4.0.3": +"@types/d3-scale@npm:*, @types/d3-scale@npm:^4.0.3": version: 4.0.8 resolution: "@types/d3-scale@npm:4.0.8" dependencies: @@ -6655,6 +6817,29 @@ __metadata: languageName: node linkType: hard +"@types/d3-selection@npm:*": + version: 3.0.10 + resolution: "@types/d3-selection@npm:3.0.10" + checksum: 10c0/de1f99ab186a08999bf394a645fd76911add1b02316270d4c07616c8383903a2b068d7e02b73b6a99a1f26bb49a2e99ef4b55a5d2ddfa165f6f3c53144897920 + languageName: node + linkType: hard + +"@types/d3-shape@npm:*": + version: 3.1.6 + resolution: "@types/d3-shape@npm:3.1.6" + dependencies: + "@types/d3-path": "npm:*" + checksum: 10c0/0625715925d3c7ed3d44ce998b42c993f063c31605b6e4a8046c4be0fe724e2d214fc83e86d04f429a30a6e1f439053e92b0d9e59e1180c3a5327b4a6e79fa0a + languageName: node + linkType: hard + +"@types/d3-time-format@npm:*": + version: 4.0.3 + resolution: "@types/d3-time-format@npm:4.0.3" + checksum: 10c0/9ef5e8e2b96b94799b821eed5d61a3d432c7903247966d8ad951b8ce5797fe46554b425cb7888fa5bf604b4663c369d7628c0328ffe80892156671c58d1a7f90 + languageName: node + linkType: hard + "@types/d3-time@npm:*": version: 3.0.3 resolution: "@types/d3-time@npm:3.0.3" @@ -6662,6 +6847,70 @@ __metadata: languageName: node linkType: hard +"@types/d3-timer@npm:*": + version: 3.0.2 + resolution: "@types/d3-timer@npm:3.0.2" + checksum: 10c0/c644dd9571fcc62b1aa12c03bcad40571553020feeb5811f1d8a937ac1e65b8a04b759b4873aef610e28b8714ac71c9885a4d6c127a048d95118f7e5b506d9e1 + languageName: node + linkType: hard + +"@types/d3-transition@npm:*": + version: 3.0.8 + resolution: "@types/d3-transition@npm:3.0.8" + dependencies: + "@types/d3-selection": "npm:*" + checksum: 10c0/feba7845bd1e1d49e38b0d55562e01e90bfbcf0a56fbe0de4279c12e43a687032d22ed559629c0412145d25d61e4e53ddfef34c89c6bf043d48b6c2cd3a929dc + languageName: node + linkType: hard + +"@types/d3-zoom@npm:*": + version: 3.0.8 + resolution: "@types/d3-zoom@npm:3.0.8" + dependencies: + "@types/d3-interpolate": "npm:*" + "@types/d3-selection": "npm:*" + checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 + languageName: node + linkType: hard + +"@types/d3@npm:^7": + version: 7.4.3 + resolution: "@types/d3@npm:7.4.3" + dependencies: + "@types/d3-array": "npm:*" + "@types/d3-axis": "npm:*" + "@types/d3-brush": "npm:*" + "@types/d3-chord": "npm:*" + "@types/d3-color": "npm:*" + "@types/d3-contour": "npm:*" + "@types/d3-delaunay": "npm:*" + "@types/d3-dispatch": "npm:*" + "@types/d3-drag": "npm:*" + "@types/d3-dsv": "npm:*" + "@types/d3-ease": "npm:*" + "@types/d3-fetch": "npm:*" + "@types/d3-force": "npm:*" + "@types/d3-format": "npm:*" + "@types/d3-geo": "npm:*" + "@types/d3-hierarchy": "npm:*" + "@types/d3-interpolate": "npm:*" + "@types/d3-path": "npm:*" + "@types/d3-polygon": "npm:*" + "@types/d3-quadtree": "npm:*" + "@types/d3-random": "npm:*" + "@types/d3-scale": "npm:*" + "@types/d3-scale-chromatic": "npm:*" + "@types/d3-selection": "npm:*" + "@types/d3-shape": "npm:*" + "@types/d3-time": "npm:*" + "@types/d3-time-format": "npm:*" + "@types/d3-timer": "npm:*" + "@types/d3-transition": "npm:*" + "@types/d3-zoom": "npm:*" + checksum: 10c0/a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 + languageName: node + linkType: hard + "@types/debug@npm:^4.0.0": version: 4.1.8 resolution: "@types/debug@npm:4.1.8" @@ -6752,6 +7001,13 @@ __metadata: languageName: node linkType: hard +"@types/geojson@npm:*": + version: 7946.0.14 + resolution: "@types/geojson@npm:7946.0.14" + checksum: 10c0/54f3997708fa2970c03eeb31f7e4540a0eb6387b15e9f8a60513a1409c23cafec8d618525404573468b59c6fecbfd053724b3327f7fca416729c26271d799f55 + languageName: node + linkType: hard + "@types/glob@npm:^7.1.1": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -10371,8 +10627,10 @@ __metadata: "@linaria/core": "npm:*" "@linaria/react": "npm:*" "@linaria/shaker": "npm:*" + "@types/d3": "npm:^7" "@types/react": "npm:*" "@types/react-dom": "npm:*" + d3: "npm:^7.9.0" history: "npm:*" react: "npm:^18.2.0" react-dom: "npm:^18.2.0" @@ -12035,6 +12293,44 @@ __metadata: languageName: node linkType: hard +"d3@npm:^7.9.0": + version: 7.9.0 + resolution: "d3@npm:7.9.0" + dependencies: + d3-array: "npm:3" + d3-axis: "npm:3" + d3-brush: "npm:3" + d3-chord: "npm:3" + d3-color: "npm:3" + d3-contour: "npm:4" + d3-delaunay: "npm:6" + d3-dispatch: "npm:3" + d3-drag: "npm:3" + d3-dsv: "npm:3" + d3-ease: "npm:3" + d3-fetch: "npm:3" + d3-force: "npm:3" + d3-format: "npm:3" + d3-geo: "npm:3" + d3-hierarchy: "npm:3" + d3-interpolate: "npm:3" + d3-path: "npm:3" + d3-polygon: "npm:3" + d3-quadtree: "npm:3" + d3-random: "npm:3" + d3-scale: "npm:4" + d3-scale-chromatic: "npm:3" + d3-selection: "npm:3" + d3-shape: "npm:3" + d3-time: "npm:3" + d3-time-format: "npm:4" + d3-timer: "npm:3" + d3-transition: "npm:3" + d3-zoom: "npm:3" + checksum: 10c0/3dd9c08c73cfaa69c70c49e603c85e049c3904664d9c79a1a52a0f52795828a1ff23592dc9a7b2257e711d68a615472a13103c212032f38e016d609796e087e8 + languageName: node + linkType: hard + "dagre-d3-es@npm:7.0.10": version: 7.0.10 resolution: "dagre-d3-es@npm:7.0.10"