From b77350e8dd747a195d94a2b133ae46656d857431 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:51:14 -0700 Subject: [PATCH 01/46] add decisions/20240313-try-w3up.md --- decisions/20240313-try-w3up.md | 142 +++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 decisions/20240313-try-w3up.md diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md new file mode 100644 index 0000000000..340d054265 --- /dev/null +++ b/decisions/20240313-try-w3up.md @@ -0,0 +1,142 @@ +# nft.storage should try w3up for web3 storage of new uploads + +Authors +- bengo@protocol.ai + +## Problem Statement + +nft.storage needs to offer web3 storage and currently does so using a homegrown solution that may be expensive to operate, maintain, and scale. + +Meanwhile the https://web3.storage team has productized a scalable web3 storage solution (named [w3up](https://github.com/web3-storage/w3up/)), and we think we may be able to deliver the same functionality that nft.storage needs for cheaper than it costs nft.storage to operate and improve the homegrown solution they use today that relies on [dagcargo](https://github.com/nftstorage/dagcargo). + +But it's not clear how much it would cost for nft.storage to adopt web3.storage and interoperate with w3up. + +If we lower the cost of adoption enough, perhaps nft.storage would be happy to ship the integration and use w3up/web3.storage as their storage/ipfs-serving/filecoin-dealmaking partner for the foreseeable future. + +If we scout out the integration a bit, in the best case we'll enable short-term adoption of the product and, no matter what, we'll learn more about how usable our tools are in this real-world integration style, and we can use that to inform product improvements that hopefully help adoption of web3.storage in medium term. + +## Goals + +* enable nft.storage to store new uploads using web3.storage +* enable nft.storage to migrate to web3.storage, have an account there we have in our CRM, access console.web3.storage, etc + +## Non-Goals + +* migrate old nft.storage uploads +* fully remove reliance on dagcargo + * however, this work may serve as useful input to that. If nft.storage can upload using w3up, then w3up can probably handle the filecoin aggregation via [w3-filecoin](https://github.com/web3-storage/specs/blob/main/w3-filecoin.md). And if we have that, it reduces reliance on dagcargo. +* anything about nft.storage read and filecoin info APIs. We only need to decide that if/when we have nft.storage uploads going through web3.storage and into filecoin deals. This decision is just to ensure we can get to that point. +* changing how nft.storage UI does uploads. e.g. it's a non-goal to have nft.storage UI upload things in a different way than it does now, which appears to be handling a POST /uploads/ http request with the file in the request body. (iiuc it looks like request body is a CAR) + +## Proposed Solution + +### convert nft.storage infra to use w3up-client as a normal customer of w3up + +> convert NFT storage infra to use w3up client to act as a normal customer of w3up and go through normal flow to add the data into w3up. + +https://github.com/w3s-project/project-tracking/issues/7 + +Rationale +* "Then all existing filecoin pipeline stuff just happens by default" +* enables proving that web3.storage's w3-filecoin service can be a long-term replacement of dagcargo for nft.storage filecoin dealmaking +* lowers cost of adoption of web3.storage by nft.storage by proving out the integration incrementally + +#### Architectural Changes + +* when nft.storage api handles request POST /upload/ (e.g. from the nft.storage ui), the uploaded file should be stored using up.web3.storage in a space associated with an web3.storage account controlled by an administrator of nft.storage + * initially, this will only happen when a feature switch is enabled + +#### Data Model Changes + +Minimal. Only new configuration. + +We'll need to decide which storage space that uploads will be added to. +To start, we'll just making everything store in a configured storage space, and the app will read that from configuration passed in environment variables, similar to env vars in [add-to-web3](https://github.com/web3-storage/add-to-web3?tab=readme-ov-file#generating-a-secret_key-and-proof). + +##### `W3_NFTSTORAGE_SPACE` Environment Variable + +configures the web3.storage space that nfts will be stored in. + +Example: `did:key:z6MkfbsERaJ7rtJQWMWtYMxNED56bhQMgrNu8CRdUjB5LfRp` + +##### `W3_NFTSTORAGE_PRINCIPAL` Environment Variable + +configures how nft.storage will authenticate to web3.storage when sending invocations to store things. e.g. it may contain an ed25519 keypair as a CID with raw multihash. + +##### `W3_NFTSTORAGE_PROOF` Environment Variable + +configures the capabilities that nft.storage has access to when interacting with web3.storage to store nfts. These capabilities will usually be UCAN delegations whose audience is the identifier of `W3_NFTSTORAGE_PRINCIPAL`. +W3_NFTSTORAGE_PROOF needs to have proof rooted in W3_NFTSTORAGE_SPACE that authorize W3_NFTSTORAGE_PRINCIPAL to store in W3_NFTSTORAGE_SPACE. + +##### `NFTSTORAGE_W3S_ALLOW_ACCOUNTS` Environment Variable + +configures feature switch for which nftstorage accounts will have new uploads stored in web3.storage. + +Format: JSON Array of Account Identifiers + +#### UI Changes + +None. But the existing UI workflow of uploading via https://nft.storage/files/ and form should behave just like they do now. But after this change, there should be a new side effect, which is that the upload should appear in the listing of uploads for the configured `W3_NFTSTORAGE_SPACE` (e.g. via w3cli `w3 ls` or in console.web3.storage). + +## Risks + +### degrading nft.storage's existing functionality + +We wouldn't want these changes to have any negative impact on users that rely on nft.storage's current setup. We only want to enable evaluation of new ways of delivering on that functionality that are seamless for end-users. + +#### Mitigation: feature switch for initial rollout + +We'll deploy this functionality to use web3.storage initially behind an opt-in feature switch. Once deployed, most uploads will not use the web3.storage functionality. Only accounts we add to a configured allow-list will get persisted to w3up. This removes risk of everyday users being impacted by bugs in the new code, while still enabling employees we allowlist to test the code in production. After testing in production, we can add more to the allowlist (e.g. perhaps nft.storage employees), or we can remove the feature switch to roll out the functionality for all users of nft.storage. + +### Are there any backwards-incompatible changes? + +No + +### Does this project have special implications for security and data privacy? + +Some minor implications. +After these changes, uploads will be shared with web3.storage in a new way. However, my understanding is that nft.storage is for public data, and this data is already shared with web3.storage through other means for the purpose of storage/serving on ipfs/filecoin. So there are no new data sharing concerns. + +### Could this change significantly increase load on any of our backend systems? + +Unlikely. As I understand it, the status quo for file uploads on nft.storage is that it is sent the full file in an http request, and then must store it. There may be a more work to do in some cases to store it (encoding/signing/invoking web3.storage), but this shouldn't be a **significant** increase in load. In the worst case, it may be 100% more cpu used for each file uploads, but we can mitigate the rollout of that via feature switch, and based on testing we can find ways of optimizing it. + +### Does this project have any dependencies? + +#### dependency on collaboration with nft.storage + +This project can't succeed without a sponsor from nft.storage and willingness to try out the proposed changes to the nft.storage codebase in a production-like environment. If we have this, we can help prove out nft.storage storing data via web3.storage and relying on web3.storage productized services for serving on ipfs and filecoin dealmaking. + +## Alternative Solutions + +I don't know of any alternate solutions I can link to that provide a path to servicing nft.storage's web3 storage needs without relying on dagcargo. If you know of some, please add them here. + +## Implementation and Rollout Plan + +Prototype Happy path +* [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage +* [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 + +Rollout +* [ ] release modified nft.storage to staging (production ok too) but with web3.storage disabled-by-default via feature switch +* [ ] configure web3.storage feature switch to be enabled on staging for a testing account +* [ ] test on nft.storage staging. make sure uploading a file via staging.nft.storage ui results in the file being stored in a web3.storage space + +Repeat +* Observe + * do we have engagement from nft.storage on this being viable? e.g. do we have them set up with a web3.storage account, payment method, etc? Does our hypothesis still make sense that by developing this, we're increasing chance of them becoming a paying customer of web3.storage? + * what comes up from demoing this to rest of team? +* Orient + * What is the web3.storage account and space that nft.storage wants to use in production? +* Decide + * should we roll back the change based on new information? + * do we have what we need to configure nft.storage production to write into a web3.storage space payed for by nft.storage designee? + * should we enable feature switch in prod allowlisting a known testing account? + * If everything is looking promising about uploads going through web3.storage. Should we figure out: + > NFT storage read and filecoin info API's need to work against both w3up and legacy systems (and know which to use in each case) + + from https://github.com/w3s-project/project-tracking/issues/7 +* Act + * P1: configure nft.storage production with a web3.storage space paid for by nft.storage + * If blocked: + * design/implement integration with nft.storage filecoin info apis From 4db52ef8f4d7852e8008307b491355f597e49a1a Mon Sep 17 00:00:00 2001 From: Benjamin Goering <171782+gobengo@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:48:42 -0700 Subject: [PATCH 02/46] Update decisions/20240313-try-w3up.md Co-authored-by: Vasco Santos --- decisions/20240313-try-w3up.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 340d054265..c0cae784b9 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -24,7 +24,7 @@ If we scout out the integration a bit, in the best case we'll enable short-term * migrate old nft.storage uploads * fully remove reliance on dagcargo - * however, this work may serve as useful input to that. If nft.storage can upload using w3up, then w3up can probably handle the filecoin aggregation via [w3-filecoin](https://github.com/web3-storage/specs/blob/main/w3-filecoin.md). And if we have that, it reduces reliance on dagcargo. + * however, this work may serve as useful input to that. If nft.storage can upload using w3up, filecoin aggregation will happen via [w3-filecoin](https://github.com/web3-storage/specs/blob/main/w3-filecoin.md). And if we have that, it reduces reliance on dagcargo. * anything about nft.storage read and filecoin info APIs. We only need to decide that if/when we have nft.storage uploads going through web3.storage and into filecoin deals. This decision is just to ensure we can get to that point. * changing how nft.storage UI does uploads. e.g. it's a non-goal to have nft.storage UI upload things in a different way than it does now, which appears to be handling a POST /uploads/ http request with the file in the request body. (iiuc it looks like request body is a CAR) From 8481203c5bbd1da8fc6986b1a5832b0bb615a16b Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:52:29 -0700 Subject: [PATCH 03/46] clarify NFTSTORAGE_W3S_ALLOW_ACCOUNTS may be removed later and is only meant to configure a temporary feature switch --- decisions/20240313-try-w3up.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 340d054265..d866e0da1e 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -72,6 +72,8 @@ W3_NFTSTORAGE_PROOF needs to have proof rooted in W3_NFTSTORAGE_SPACE that autho configures feature switch for which nftstorage accounts will have new uploads stored in web3.storage. +Note: this environment variable may not be a permanent addition to the codebase. It's only meant to be used as a feature switch that decouples enabling the new functionality from deploying the new code. After testing, we may remove or change this feature switch when it is no longer useful. + Format: JSON Array of Account Identifiers #### UI Changes @@ -132,6 +134,7 @@ Repeat * should we roll back the change based on new information? * do we have what we need to configure nft.storage production to write into a web3.storage space payed for by nft.storage designee? * should we enable feature switch in prod allowlisting a known testing account? + * if we've done that and things work well, should we remove the feature switch and enable this by default for all uploads? * If everything is looking promising about uploads going through web3.storage. Should we figure out: > NFT storage read and filecoin info API's need to work against both w3up and legacy systems (and know which to use in each case) From 5fb898a5204c6bf3b201cc9c8cc1c8e07c032f0e Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Mon, 18 Mar 2024 15:09:58 -0700 Subject: [PATCH 04/46] add packages/api/test.md so trigger api CI --- packages/api/test.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 packages/api/test.md diff --git a/packages/api/test.md b/packages/api/test.md new file mode 100644 index 0000000000..9daeafb986 --- /dev/null +++ b/packages/api/test.md @@ -0,0 +1 @@ +test From 21d602b8fec5fbedff7419ffde33b5a66252e5e3 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:24:47 -0700 Subject: [PATCH 05/46] update decisions/20240313-try-w3up.md with steps --- decisions/20240313-try-w3up.md | 81 +++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 5d01992896..82e04da0dd 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -1,6 +1,7 @@ # nft.storage should try w3up for web3 storage of new uploads Authors + - bengo@protocol.ai ## Problem Statement @@ -17,34 +18,35 @@ If we scout out the integration a bit, in the best case we'll enable short-term ## Goals -* enable nft.storage to store new uploads using web3.storage -* enable nft.storage to migrate to web3.storage, have an account there we have in our CRM, access console.web3.storage, etc +- enable nft.storage to store new uploads using web3.storage +- enable nft.storage to migrate to web3.storage, have an account there we have in our CRM, access console.web3.storage, etc ## Non-Goals -* migrate old nft.storage uploads -* fully remove reliance on dagcargo - * however, this work may serve as useful input to that. If nft.storage can upload using w3up, filecoin aggregation will happen via [w3-filecoin](https://github.com/web3-storage/specs/blob/main/w3-filecoin.md). And if we have that, it reduces reliance on dagcargo. -* anything about nft.storage read and filecoin info APIs. We only need to decide that if/when we have nft.storage uploads going through web3.storage and into filecoin deals. This decision is just to ensure we can get to that point. -* changing how nft.storage UI does uploads. e.g. it's a non-goal to have nft.storage UI upload things in a different way than it does now, which appears to be handling a POST /uploads/ http request with the file in the request body. (iiuc it looks like request body is a CAR) +- migrate old nft.storage uploads +- fully remove reliance on dagcargo + - however, this work may serve as useful input to that. If nft.storage can upload using w3up, filecoin aggregation will happen via [w3-filecoin](https://github.com/web3-storage/specs/blob/main/w3-filecoin.md). And if we have that, it reduces reliance on dagcargo. +- anything about nft.storage read and filecoin info APIs. We only need to decide that if/when we have nft.storage uploads going through web3.storage and into filecoin deals. This decision is just to ensure we can get to that point. +- changing how nft.storage UI does uploads. e.g. it's a non-goal to have nft.storage UI upload things in a different way than it does now, which appears to be handling a POST /uploads/ http request with the file in the request body. (iiuc it looks like request body is a CAR) ## Proposed Solution ### convert nft.storage infra to use w3up-client as a normal customer of w3up -> convert NFT storage infra to use w3up client to act as a normal customer of w3up and go through normal flow to add the data into w3up. +> convert NFT storage infra to use w3up client to act as a normal customer of w3up and go through normal flow to add the data into w3up. https://github.com/w3s-project/project-tracking/issues/7 Rationale -* "Then all existing filecoin pipeline stuff just happens by default" -* enables proving that web3.storage's w3-filecoin service can be a long-term replacement of dagcargo for nft.storage filecoin dealmaking -* lowers cost of adoption of web3.storage by nft.storage by proving out the integration incrementally + +- "Then all existing filecoin pipeline stuff just happens by default" +- enables proving that web3.storage's w3-filecoin service can be a long-term replacement of dagcargo for nft.storage filecoin dealmaking +- lowers cost of adoption of web3.storage by nft.storage by proving out the integration incrementally #### Architectural Changes -* when nft.storage api handles request POST /upload/ (e.g. from the nft.storage ui), the uploaded file should be stored using up.web3.storage in a space associated with an web3.storage account controlled by an administrator of nft.storage - * initially, this will only happen when a feature switch is enabled +- when nft.storage api handles request POST /upload/ (e.g. from the nft.storage ui), the uploaded file should be stored using up.web3.storage in a space associated with an web3.storage account controlled by an administrator of nft.storage + - initially, this will only happen when a feature switch is enabled #### Data Model Changes @@ -116,30 +118,37 @@ I don't know of any alternate solutions I can link to that provide a path to ser ## Implementation and Rollout Plan Prototype Happy path -* [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage -* [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 + +- [ ] @gobengo set up nft.storage localdev to be able to hack on packages/api + - [ ] debug why my mac w/ arm64 m1 can't get `npx yarn test:api` to pass +- [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime +- [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 +- [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage Rollout -* [ ] release modified nft.storage to staging (production ok too) but with web3.storage disabled-by-default via feature switch -* [ ] configure web3.storage feature switch to be enabled on staging for a testing account -* [ ] test on nft.storage staging. make sure uploading a file via staging.nft.storage ui results in the file being stored in a web3.storage space + +- [ ] release modified nft.storage to staging (production ok too) but with web3.storage disabled-by-default via feature switch +- [ ] configure web3.storage feature switch to be enabled on staging for a testing account +- [ ] test on nft.storage staging. make sure uploading a file via staging.nft.storage ui results in the file being stored in a web3.storage space Repeat -* Observe - * do we have engagement from nft.storage on this being viable? e.g. do we have them set up with a web3.storage account, payment method, etc? Does our hypothesis still make sense that by developing this, we're increasing chance of them becoming a paying customer of web3.storage? - * what comes up from demoing this to rest of team? -* Orient - * What is the web3.storage account and space that nft.storage wants to use in production? -* Decide - * should we roll back the change based on new information? - * do we have what we need to configure nft.storage production to write into a web3.storage space payed for by nft.storage designee? - * should we enable feature switch in prod allowlisting a known testing account? - * if we've done that and things work well, should we remove the feature switch and enable this by default for all uploads? - * If everything is looking promising about uploads going through web3.storage. Should we figure out: - > NFT storage read and filecoin info API's need to work against both w3up and legacy systems (and know which to use in each case) - - from https://github.com/w3s-project/project-tracking/issues/7 -* Act - * P1: configure nft.storage production with a web3.storage space paid for by nft.storage - * If blocked: - * design/implement integration with nft.storage filecoin info apis + +- Observe + - do we have engagement from nft.storage on this being viable? e.g. do we have them set up with a web3.storage account, payment method, etc? Does our hypothesis still make sense that by developing this, we're increasing chance of them becoming a paying customer of web3.storage? + - what comes up from demoing this to rest of team? +- Orient + - What is the web3.storage account and space that nft.storage wants to use in production? +- Decide + - should we roll back the change based on new information? + - do we have what we need to configure nft.storage production to write into a web3.storage space payed for by nft.storage designee? + - should we enable feature switch in prod allowlisting a known testing account? + - if we've done that and things work well, should we remove the feature switch and enable this by default for all uploads? + - If everything is looking promising about uploads going through web3.storage. Should we figure out: + + > NFT storage read and filecoin info API's need to work against both w3up and legacy systems (and know which to use in each case) + + from https://github.com/w3s-project/project-tracking/issues/7 +- Act + - P1: configure nft.storage production with a web3.storage space paid for by nft.storage + - If blocked: + - design/implement integration with nft.storage filecoin info apis From dc2bf27f8599038d886ad1d43a4795a6f4102112 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:04:05 -0700 Subject: [PATCH 06/46] mention dagcargo in try-w3up problem statement --- decisions/20240313-try-w3up.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 82e04da0dd..4954fa881e 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -6,7 +6,7 @@ Authors ## Problem Statement -nft.storage needs to offer web3 storage and currently does so using a homegrown solution that may be expensive to operate, maintain, and scale. +nft.storage needs to offer web3 storage and currently does so using a homegrown solution that may be expensive to operate, maintain, and scale. It's Filecoin aggregationa and deal-making functionality relies on [nftstorage/dagcargo](https://github.com/nftstorage/dagcargo) running off-site, which may be decommissioned as soon as 2024-03-26. Meanwhile the https://web3.storage team has productized a scalable web3 storage solution (named [w3up](https://github.com/web3-storage/w3up/)), and we think we may be able to deliver the same functionality that nft.storage needs for cheaper than it costs nft.storage to operate and improve the homegrown solution they use today that relies on [dagcargo](https://github.com/nftstorage/dagcargo). @@ -119,8 +119,7 @@ I don't know of any alternate solutions I can link to that provide a path to ser Prototype Happy path -- [ ] @gobengo set up nft.storage localdev to be able to hack on packages/api - - [ ] debug why my mac w/ arm64 m1 can't get `npx yarn test:api` to pass +- [x] @gobengo set up nft.storage localdev to be able to hack on packages/api - [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime - [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 - [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage @@ -139,6 +138,7 @@ Repeat - Orient - What is the web3.storage account and space that nft.storage wants to use in production? - Decide + - should we roll back the change based on new information? - do we have what we need to configure nft.storage production to write into a web3.storage space payed for by nft.storage designee? - should we enable feature switch in prod allowlisting a known testing account? @@ -148,6 +148,7 @@ Repeat > NFT storage read and filecoin info API's need to work against both w3up and legacy systems (and know which to use in each case) from https://github.com/w3s-project/project-tracking/issues/7 + - Act - P1: configure nft.storage production with a web3.storage space paid for by nft.storage - If blocked: From 987f940017616894edbe1cf845c4c61cbf7a6d56 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:49:32 -0700 Subject: [PATCH 07/46] add test for write to w3up, W3UP_URL env var, and placeholder http request to w3up --- decisions/20240313-try-w3up.md | 17 +++++++ packages/api/src/bindings.d.ts | 4 ++ packages/api/src/config.js | 6 +++ packages/api/src/routes/nfts-upload.js | 4 ++ packages/api/src/utils/context.js | 15 +++++- packages/api/test/nfts-upload.spec.js | 65 +++++++++++++++++++++++++- 6 files changed, 109 insertions(+), 2 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 4954fa881e..b43cd2da21 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -48,6 +48,16 @@ Rationale - when nft.storage api handles request POST /upload/ (e.g. from the nft.storage ui), the uploaded file should be stored using up.web3.storage in a space associated with an web3.storage account controlled by an administrator of nft.storage - initially, this will only happen when a feature switch is enabled +##### Open Architectural Decisions + +###### Should write to w3up happen sync or async? + +i.e. if the write to w3up fails, should the POST /uploads request that triggered it also fail ('sync'=yes)? Or should we only do the write to w3up after a successful response to POST /uploads ('async')? + +Initially, it is simplest to get something working in a sync way, so we'll do that to make sure the w3up-client creation, configuration, authorization, accounting, etc. is set up correctly. + +Once that works, we can look at deferring the write to w3up. We'd need to use some kind of job queue (e.g. [Cloudflare Queues](https://developers.cloudflare.com/queues/) or perhaps using the mysql db as a queue and nftstorage/cron as a worker). + #### Data Model Changes Minimal. Only new configuration. @@ -55,6 +65,12 @@ Minimal. Only new configuration. We'll need to decide which storage space that uploads will be added to. To start, we'll just making everything store in a configured storage space, and the app will read that from configuration passed in environment variables, similar to env vars in [add-to-web3](https://github.com/web3-storage/add-to-web3?tab=readme-ov-file#generating-a-secret_key-and-proof). +##### `W3UP_URL` Environment Variable + +configures the URL for connecting to w3up. + +optional. If not set, no URL will be passed to `@web3-storage/w3up-client` constructors. [Currently that means](https://github.com/web3-storage/w3up/blob/7a6385bef1dd424d5eb952528ae5d86a83837c80/packages/upload-client/src/service.js#L5) the default will be `up.web3.storage`. + ##### `W3_NFTSTORAGE_SPACE` Environment Variable configures the web3.storage space that nfts will be stored in. @@ -120,6 +136,7 @@ I don't know of any alternate solutions I can link to that provide a path to ser Prototype Happy path - [x] @gobengo set up nft.storage localdev to be able to hack on packages/api +- [x] nft.storage/api: can be configured with W3_URL - [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime - [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 - [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index b5d8cebf3e..e3d069670c 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -96,6 +96,9 @@ export interface ServiceConfiguration { /** Slack webhook url */ SLACK_USER_REQUEST_WEBHOOK_URL: string + + /** w3up connection URL (e.g. https://up.web3.storage) */ + W3UP_URL?: string } export interface Ucan { @@ -128,6 +131,7 @@ export interface RouteContext { r2Uploader: Uploader ucanService: Service auth?: Auth + W3UP_URL?: string } export type Handler = ( diff --git a/packages/api/src/config.js b/packages/api/src/config.js index f40b17fd37..f7ecc3d086 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -61,6 +61,8 @@ export function serviceConfigFromVariables(vars) { VERSION: vars.NFT_STORAGE_VERSION || NFT_STORAGE_VERSION, // @ts-ignore COMMITHASH: vars.NFT_STORAGE_COMMITHASH || NFT_STORAGE_COMMITHASH, + + W3UP_URL: vars.W3UP_URL, } } @@ -123,6 +125,10 @@ export function loadConfigVariables() { 'LINKDEX_URL', 'S3_ENDPOINT', 'SLACK_USER_REQUEST_WEBHOOK_URL', + 'W3UP_URL', + 'W3_NFTSTORAGE_SPACE', + 'W3_NFTSTORAGE_PRINCIPAL', + 'W3_NFTSTORAGE_PROOF', ] for (const name of optional) { diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index 9a7ac7d27e..3769406c8a 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -105,6 +105,10 @@ export async function nftUpload(event, ctx) { }) } + if (ctx.W3UP_URL) { + const w3upResponse = await fetch(ctx.W3UP_URL) + } + return new JSONResponse({ ok: true, value: toNFTResponse(upload) }) } diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index 42300ac4e1..9f0145b54a 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -62,5 +62,18 @@ export async function getContext(event, params) { }) const ucanService = await Service.fromPrivateKey(config.PRIVATE_KEY) - return { params, db, linkdexApi, s3Uploader, r2Uploader, log, ucanService } + + const w3upConfig = { + W3UP_URL: config.W3UP_URL, + } + return { + ...w3upConfig, + params, + db, + linkdexApi, + s3Uploader, + r2Uploader, + log, + ucanService, + } } diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 27f1917424..e2a4caad54 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -26,12 +26,27 @@ import { fileURLToPath } from 'node:url' import path from 'node:path' import { FormData } from 'undici' import { createCarCid } from '../src/utils/car.js' +import { createServer } from 'node:http' const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const mockW3up = createListeningMockW3up() + test.before(async (t) => { const linkdexUrl = 'http://fake.api.net' - await setupMiniflareContext(t, { overrides: { LINKDEX_URL: linkdexUrl } }) + await setupMiniflareContext(t, { + overrides: { + LINKDEX_URL: linkdexUrl, + W3UP_URL: (await mockW3up).url.toString(), + W3_NFTSTORAGE_SPACE: `did:key:zTodo`, + W3_NFTSTORAGE_PRINCIPAL: 'zTodo', + W3_NFTSTORAGE_PROOF: 'zTodo', + }, + }) +}) + +test.after(async (t) => { + ;(await mockW3up).close() }) test.serial('should upload a single file', async (t) => { @@ -63,6 +78,23 @@ test.serial('should upload a single file', async (t) => { t.is(data.deleted_at, null) }) +test.serial('should forward uploads to W3UP_URL', async (t) => { + const initialW3upRequestCount = (await mockW3up).requestCount + const client = await createClientWithUser(t) + const mf = getMiniflareContext(t) + const file = new Blob(['hello world!'], { type: 'application/text' }) + const res = await mf.dispatchFetch('http://miniflare.test/upload', { + method: 'POST', + headers: { Authorization: `Bearer ${client.token}` }, + body: file, + }) + const { ok, value } = await res.json() + t.truthy(ok, 'Server response payload has `ok` property') + const finalW3upRequestCount = (await mockW3up).requestCount + const w3upRequestCountDelta = finalW3upRequestCount - initialW3upRequestCount + t.is(w3upRequestCountDelta, 1, 'this upload sent one http request to w3up') +}) + test.serial('should upload multiple blobs', async (t) => { const client = await createClientWithUser(t) const mf = getMiniflareContext(t) @@ -907,3 +939,34 @@ function mockLinkdexResponse(mock, structure, times = 1) { ) .times(times) } + +/** + * create a mock http server, + * that can act as a stand-in for up.web3.storage (aka w3up) + */ +async function createListeningMockW3up() { + let requestCount = 0 + const server = createServer((req, res) => { + requestCount++ + res.writeHead(451) + res.write('TODO') + res.end() + }) + server.listen(0) + await new Promise((resolve, reject) => { + server.addListener('listening', () => resolve(undefined)) + }) + const serverAddress = server.address() + if (typeof serverAddress === 'string') + throw new Error('server.address() must not return a string') + const url = new URL(`http://localhost:${serverAddress?.port ?? ''}`) + return { + get requestCount() { + return requestCount + }, + close() { + server.close() + }, + url, + } +} From 1565762a2ec8cd829846afeb0531c7766d110c63 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:06:00 -0700 Subject: [PATCH 08/46] Revert "add packages/api/test.md so trigger api CI" This reverts commit 5fb898a5204c6bf3b201cc9c8cc1c8e07c032f0e. --- packages/api/test.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/api/test.md diff --git a/packages/api/test.md b/packages/api/test.md deleted file mode 100644 index 9daeafb986..0000000000 --- a/packages/api/test.md +++ /dev/null @@ -1 +0,0 @@ -test From 972a5bdb52907a36d2fb6a3477f30b12f94fe290 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:40:19 -0700 Subject: [PATCH 09/46] dont warn about missing optional env vars in CI (its too verbose) --- packages/api/src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/config.js b/packages/api/src/config.js index f7ecc3d086..1f90912bad 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -136,7 +136,7 @@ export function loadConfigVariables() { if (typeof val === 'string') { vars[name] = val } else { - if (globals.DEBUG === 'true') { + if (globals.DEBUG === 'true' && !globals.CI) { console.warn(`Missing optional config variables: ${name}`) } } From 5b8df194a6be6dad8d316f128937b431187d5617 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:51:45 -0700 Subject: [PATCH 10/46] Revert "dont warn about missing optional env vars in CI (its too verbose)" This reverts commit 972a5bdb52907a36d2fb6a3477f30b12f94fe290. --- packages/api/src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/config.js b/packages/api/src/config.js index 1f90912bad..f7ecc3d086 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -136,7 +136,7 @@ export function loadConfigVariables() { if (typeof val === 'string') { vars[name] = val } else { - if (globals.DEBUG === 'true' && !globals.CI) { + if (globals.DEBUG === 'true') { console.warn(`Missing optional config variables: ${name}`) } } From a16127bd182b7d62d24e3fac1b68e18376c37e3f Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:56:53 -0700 Subject: [PATCH 11/46] add w3up utils for parsing proof/principal --- packages/api/package.json | 4 + packages/api/src/utils/w3up.js | 72 +++++ yarn.lock | 542 ++++++++++++++++++++++++++++++++- 3 files changed, 614 insertions(+), 4 deletions(-) create mode 100644 packages/api/src/utils/w3up.js diff --git a/packages/api/package.json b/packages/api/package.json index 18a921a329..6020cdc6ee 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -27,7 +27,11 @@ "@nftstorage/ipfs-cluster": "^5.0.1", "@noble/ed25519": "^1.6.1", "@supabase/postgrest-js": "^0.34.1", + "@ucanto/core": "^9.0.1", + "@ucanto/principal": "^9.0.0", + "@web3-storage/access": "^18.2.0", "@web3-storage/car-block-validator": "^1.2.0", + "@web3-storage/w3up-client": "^12.4.1", "cardex": "^1.0.0", "ipfs-car": "^0.6.1", "it-last": "^2.0.0", diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js new file mode 100644 index 0000000000..0dd0d10b72 --- /dev/null +++ b/packages/api/src/utils/w3up.js @@ -0,0 +1,72 @@ +import * as W3UP from '@web3-storage/w3up-client' +import * as ed25519 from '@ucanto/principal/ed25519' +import { StoreMemory } from '@web3-storage/access/stores/store-memory' +import { CID } from 'multiformats/cid' +import { base64 } from 'multiformats/bases/base64' +import { identity } from 'multiformats/hashes/identity' +import { CarReader } from '@ipld/car' +import { importDAG } from '@ucanto/core/delegation' + +/** + * @param {object} env + * @param {string|undefined} [env.principal] + * @param {string|undefined} [env.proof] + */ +export async function getW3upClient({ principal, proof } = {}) { + const signer = principal ? ed25519.parse(principal) : await ed25519.generate() + const store = new StoreMemory() + const w3up = await W3UP.create({ principal: signer, store }) + if (proof) { + await w3up.addSpace(await parseW3Proof(proof)) + } + return { w3up, store, principal } +} + +/** + * @param {string} proof + */ +async function parseW3Proof(proof) { + let cid + try { + cid = CID.parse(proof, base64) + } catch (/** @type {any} */ err) { + if (err?.message?.includes('Unexpected end of data')) { + console.error( + `Error: failed to read proof. The string has been truncated.` + ) + } + throw err + } + + if (cid.multihash.code !== identity.code) { + console.error( + `Error: failed to read proof. Must be identity CID. Fetching of remote proof CARs not supported by this command yet` + ) + process.exit(1) + } + const delegation = await readProofFromBytes(cid.multihash.digest) + return delegation +} + +/** + * @param {Uint8Array} bytes Path to the proof file. + */ +export async function readProofFromBytes(bytes) { + const blocks = [] + try { + const reader = await CarReader.fromBytes(bytes) + for await (const block of reader.blocks()) { + blocks.push(block) + } + } catch (/** @type {any} */ err) { + console.error(`Error: failed to parse proof: ${err.message}`) + throw err + } + try { + // @ts-expect-error Block types are slightly different but it works + return importDAG(blocks) + } catch (/** @type {any} */ err) { + console.error(`Error: failed to import proof: ${err.message}`) + throw err + } +} diff --git a/yarn.lock b/yarn.lock index 3a5827f624..58e66d6234 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2409,6 +2409,16 @@ multiformats "^9.5.4" varint "^6.0.0" +"@ipld/car@^5.1.0", "@ipld/car@^5.1.1", "@ipld/car@^5.2.2": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@ipld/car/-/car-5.3.0.tgz#0e131ca660bdd3f1eb73517641d5c23840bf067a" + integrity sha512-OB8LVvJeVAFFGluNIkZeDZ/aGeoekFKsuIvNT9I5sJIb5WekQuW5+lekjQ7Z7mZ7DBKuke/kI4jBT1j0/akU1w== + dependencies: + "@ipld/dag-cbor" "^9.0.7" + cborg "^4.0.5" + multiformats "^13.0.0" + varint "^6.0.0" + "@ipld/dag-cbor@^6.0.13", "@ipld/dag-cbor@^6.0.3": version "6.0.15" resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz#aebe7a26c391cae98c32faedb681b1519e3d2372" @@ -2425,6 +2435,22 @@ cborg "^1.6.0" multiformats "^9.5.4" +"@ipld/dag-cbor@^9.0.0", "@ipld/dag-cbor@^9.0.5", "@ipld/dag-cbor@^9.0.6", "@ipld/dag-cbor@^9.0.7": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-9.2.0.tgz#3a3f0bee02d7e1c2f15582e896843d5b00fbba9f" + integrity sha512-N14oMy0q4gM6OuZkIpisKe0JBSjf1Jb39VI+7jMLiWX9124u1Z3Fdj/Tag1NA0cVxxqWDh0CqsjcVfOKtelPDA== + dependencies: + cborg "^4.0.0" + multiformats "^13.1.0" + +"@ipld/dag-json@^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-10.2.0.tgz#32468182ce510284aae75a07e33b3a0da284994e" + integrity sha512-O9YLUrl3d3WbVz7v1WkajFkyfOLEe2Fep+wor4fgVe0ywxzrivrj437NiPcVyB+2EDdFn/Q7tCHFf8YVhDf8ZA== + dependencies: + cborg "^4.0.0" + multiformats "^13.1.0" + "@ipld/dag-json@^8.0.4": version "8.0.11" resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-8.0.11.tgz#8d30cc2dfacb0aef04d327465d3df91e79e8b6ce" @@ -2440,6 +2466,35 @@ dependencies: multiformats "^9.5.4" +"@ipld/dag-pb@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.0.tgz#4ebec92eeb9e8f317b8ef971221c6dac7b12b302" + integrity sha512-LJU451Drqs5zjFm7jI4Hs3kHlilOqkjcSfPiQgVsZnWaYb2C7YdfhnclrVn/X+ucKejlU9BL3+gXFCZUXkMuCg== + dependencies: + multiformats "^13.1.0" + +"@ipld/dag-ucan@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ipld/dag-ucan/-/dag-ucan-3.4.0.tgz#bc955fb6506cff6a0d876476d06ca98ec8b15b4d" + integrity sha512-sW4R43w3DbEdoGWWJZCwsblwXa600HCanG9p2w1MJPVBNTNjhvqc3XI0uEqKhT2oqKWrND7uInVtcPmZme7hhA== + dependencies: + "@ipld/dag-cbor" "^9.0.0" + "@ipld/dag-json" "^10.0.0" + multiformats "^11.0.0" + +"@ipld/unixfs@^2.1.1": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ipld/unixfs/-/unixfs-2.2.0.tgz#977ba394c5051cf0f0d85ebd0797ca1ac04dfb8b" + integrity sha512-lDQ2eRhJlbFaBoO3bhOmDVCLmpOnhwtwbilqUgAAhbhoPSmLrnv7gsBuToZjXOdPaEGSL7apkmm6nFrcU6zh4Q== + dependencies: + "@ipld/dag-pb" "^4.0.0" + "@multiformats/murmur3" "^2.1.3" + "@perma/map" "^1.0.2" + actor "^2.3.1" + multiformats "^11.0.1" + protobufjs "^7.1.2" + rabin-rs "^2.1.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -3022,6 +3077,14 @@ multiformats "^9.5.4" murmurhash3js-revisited "^3.0.0" +"@multiformats/murmur3@^2.1.0", "@multiformats/murmur3@^2.1.3": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9" + integrity sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA== + dependencies: + multiformats "^13.0.0" + murmurhash3js-revisited "^3.0.0" + "@multiformats/sha3@^2.0.15": version "2.0.17" resolved "https://registry.yarnpkg.com/@multiformats/sha3/-/sha3-2.0.17.tgz#bcfd2d6d7c44a61ced79a2c4dd45acd9ebbfb8d7" @@ -3119,16 +3182,38 @@ resolved "https://registry.yarnpkg.com/@nftstorage/ipfs-cluster/-/ipfs-cluster-5.0.1.tgz#28655fd1bd35ac145b0acdd045f7db242713b3f4" integrity sha512-e5+ICMllFgMRWIojh00vk/nk6SshDKQK/LDslg2249lHuBLEeIEajxiI8eM+9+w6DO14+o12IRjhtVIRk5rRaw== +"@noble/curves@^1.2.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/ed25519@^1.5.2", "@noble/ed25519@^1.6.1": version "1.7.0" resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.0.tgz#583ac38340a479314b9e348d4572101ed9492f9d" integrity sha512-LeAxFK0+181zQOhOUuKE8Jnd3duzYhDNd3iCLxpmzA5K+e4I1FdbrK3Ot0ZHBwZMeRD/6EojyUfTbpHZ+hkQHg== +"@noble/ed25519@^1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + "@noble/hashes@1.1.2", "@noble/hashes@~1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": version "1.6.3" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" @@ -3176,6 +3261,14 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@perma/map@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@perma/map/-/map-1.0.3.tgz#c80021c9626276298c69a44dec6a4e041bbd47f3" + integrity sha512-Bf5njk0fnJGTFE2ETntq0N1oJ6YdCPIpTDn3R3KYZJQdeYSOCNL7mBrFlGnbqav8YQhJA/p81pvHINX9vAtHkQ== + dependencies: + "@multiformats/murmur3" "^2.1.0" + murmurhash3js-revisited "^3.0.0" + "@playwright/test@^1.20.1": version "1.25.1" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.25.1.tgz#9847234b6f2b0cca71962b338da7db366a1e9720" @@ -3330,6 +3423,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== +"@scure/base@~1.1.4": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + "@scure/bip32@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" @@ -3347,6 +3445,14 @@ "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" +"@scure/bip39@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + "@sentry/browser@6.19.7": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.7.tgz#a40b6b72d911b5f1ed70ed3b4e7d4d4e625c0b5f" @@ -5190,6 +5296,65 @@ "@typescript-eslint/types" "5.35.1" eslint-visitor-keys "^3.3.0" +"@ucanto/client@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@ucanto/client/-/client-9.0.0.tgz#d7d632a8e13a2050fb911c3dd44ecf3d89cf4631" + integrity sha512-Fl8ZGuWoVQygBtLISPlFb5Ej/LKUofghTTAT4kjFNc8WB9bD7AS+yvSPowwd+4uTnxfEOeKWV2lzO1+gRxQF0w== + dependencies: + "@ucanto/core" "^9.0.0" + "@ucanto/interface" "^9.0.0" + +"@ucanto/core@^9.0.0", "@ucanto/core@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@ucanto/core/-/core-9.0.1.tgz#5de481c5d63acc50e287580ee06ac6f2872036ec" + integrity sha512-SsYvKCO3FD27roTVcg8ASxnixjn+j96sPlijpVq1uBUxq7SmuNxNPYFZqpxXKj2R4gty/Oc8XTse12ebB9Kofg== + dependencies: + "@ipld/car" "^5.1.0" + "@ipld/dag-cbor" "^9.0.0" + "@ipld/dag-ucan" "^3.4.0" + "@ucanto/interface" "^9.0.0" + multiformats "^11.0.2" + +"@ucanto/interface@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@ucanto/interface/-/interface-9.0.0.tgz#0ba5d1fcfe8a80d829805408d5fda54c344701c1" + integrity sha512-Y9185yj+CRNpT43EAHTe9MpskCgU9DyWvmYyLMMmF40w+ujp6EYy5JVI/gVjJAsh+2Y9ruvWHOF0M+21TnLQyg== + dependencies: + "@ipld/dag-ucan" "^3.4.0" + multiformats "^11.0.2" + +"@ucanto/principal@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@ucanto/principal/-/principal-9.0.0.tgz#443ffcb76ed52ae421bde24384958a8b0e99e88a" + integrity sha512-3KpaZ0mNycDnDx2WJ9p5qnhTlc4YLFqmuClBpNJcGLk+begaeH7dUlzfxNtloSvZAeB67G03Y883CqiVhN6ZmA== + dependencies: + "@ipld/dag-ucan" "^3.4.0" + "@noble/curves" "^1.2.0" + "@noble/ed25519" "^1.7.3" + "@noble/hashes" "^1.3.2" + "@ucanto/interface" "^9.0.0" + multiformats "^11.0.2" + one-webcrypto "^1.0.3" + +"@ucanto/transport@^9.0.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@ucanto/transport/-/transport-9.1.0.tgz#e37026d0cd389604cf85f62d7dc165ca5de50f06" + integrity sha512-3pLXEg9YIH0NN1faBh0Xaioxbb2JtPL+4AFtQtmO8LnRyqGnTahZwwaM8XFL5eMBAp0pYDoZaQ6wdMce0t1cAQ== + dependencies: + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + +"@ucanto/validator@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@ucanto/validator/-/validator-9.0.1.tgz#ab6458e4400365645119f1b843805fca80ea46b3" + integrity sha512-H9GMOXHNW3vCv36eQZN1/h8zOXHEljRV5yNZ/huyOaJLVAKxt7Va1Ww8VBf2Ho/ac6P7jwvQRT7WgxaXx1/3Hg== + dependencies: + "@ipld/car" "^5.1.0" + "@ipld/dag-cbor" "^9.0.0" + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + multiformats "^11.0.2" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -5265,6 +5430,54 @@ dependencies: web-streams-polyfill "^3.1.1" +"@web3-storage/access@^18.2.0": + version "18.2.0" + resolved "https://registry.yarnpkg.com/@web3-storage/access/-/access-18.2.0.tgz#c8cc52d9af41dea29dcd625fc79624e4c6384e7e" + integrity sha512-EME/HViwasLsXmhGC3j93nxPwL3hfWHb5uD5sOw79PBDIGcPHYE3L9w3TQSDeKPXbA+mA4J7uWbAoTcoDkElSg== + dependencies: + "@ipld/car" "^5.1.1" + "@ipld/dag-ucan" "^3.4.0" + "@scure/bip39" "^1.2.1" + "@ucanto/client" "^9.0.0" + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + "@ucanto/principal" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@ucanto/validator" "^9.0.1" + "@web3-storage/capabilities" "^13.1.1" + "@web3-storage/did-mailto" "^2.1.0" + bigint-mod-arith "^3.1.2" + conf "11.0.2" + multiformats "^12.1.2" + one-webcrypto "https://github.com/web3-storage/one-webcrypto" + p-defer "^4.0.0" + type-fest "^4.9.0" + uint8arrays "^4.0.6" + +"@web3-storage/capabilities@^12.1.0": + version "12.1.0" + resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-12.1.0.tgz#78ab87167ff0f61216853bfb8163596ce5818667" + integrity sha512-SlYdPqCokDHb55zlZOvh+n8uEMOrEU413Z1MzQ8HvULpbzfcEtGyOiDgrAhdNEZtPnWHqaUEtU7o829Yw2Ra5w== + dependencies: + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + "@ucanto/principal" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@ucanto/validator" "^9.0.1" + "@web3-storage/data-segment" "^3.2.0" + +"@web3-storage/capabilities@^13.1.1": + version "13.1.1" + resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-13.1.1.tgz#bd14331e2f73554e105548dde07f74dee6eaf189" + integrity sha512-yQwrjhqwXGc1z8FCs7dCMsNp+G1LCrPq8RWCrflHA0rlISyMez6DQQpOJrCfao/MSk30nzPSzIm+FX/k3+8knw== + dependencies: + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + "@ucanto/principal" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@ucanto/validator" "^9.0.1" + "@web3-storage/data-segment" "^3.2.0" + "@web3-storage/car-block-validator@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@web3-storage/car-block-validator/-/car-block-validator-1.2.0.tgz#533ea6b22059606ed19e906434a50c0a16c07283" @@ -5276,11 +5489,74 @@ multiformats "9.9.0" uint8arrays "^3.1.1" +"@web3-storage/data-segment@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@web3-storage/data-segment/-/data-segment-3.2.0.tgz#62d109a01fb800486c270e65fb2e482a4bc40b47" + integrity sha512-SM6eNumXzrXiQE2/J59+eEgCRZNYPxKhRoHX2QvV3/scD4qgcf4g+paWBc3UriLEY1rCboygGoPsnqYJNyZyfA== + dependencies: + "@ipld/dag-cbor" "^9.0.5" + multiformats "^11.0.2" + sync-multihash-sha2 "^1.0.0" + +"@web3-storage/did-mailto@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@web3-storage/did-mailto/-/did-mailto-2.1.0.tgz#4ba7bd52772e48181d78ece0bdc27728857e919e" + integrity sha512-TRmfSXj1IhtX3ESurSNOylZSBKi0z/VJNoMLpof+AVRdovgZjjocpiePQTs2pfHKqHTHfJXc9AboWyK4IKTWMw== + +"@web3-storage/filecoin-client@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@web3-storage/filecoin-client/-/filecoin-client-3.2.0.tgz#d67d1dd723722df3f1f18b12c48a863cba6e8d86" + integrity sha512-4kSyXcN7jPAnpO2U8afheYBRJ4E/8aRJvCvPgHF+HZEtEaLHYuuQzU72Aro94qV0bm5ZRxXPNh6wRSlz/XZLlg== + dependencies: + "@ipld/dag-ucan" "^3.4.0" + "@ucanto/client" "^9.0.0" + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@web3-storage/capabilities" "^12.1.0" + "@web3-storage/multipart-parser@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== +"@web3-storage/upload-client@^13.0.1": + version "13.0.1" + resolved "https://registry.yarnpkg.com/@web3-storage/upload-client/-/upload-client-13.0.1.tgz#910e6e904f652f3907cca1c5c873dd42e84f630d" + integrity sha512-vfAtp1qIIgcoNQ21X/+jrHZjQU28af516YWWkYWbGV68dBzBd9c7r+8KjQwRDIV8kSl0Pmho6Dy1OWlhpZfE6g== + dependencies: + "@ipld/car" "^5.2.2" + "@ipld/dag-cbor" "^9.0.6" + "@ipld/dag-ucan" "^3.4.0" + "@ipld/unixfs" "^2.1.1" + "@ucanto/client" "^9.0.0" + "@ucanto/interface" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@web3-storage/capabilities" "^13.1.1" + fr32-sha2-256-trunc254-padded-binary-tree-multihash "^3.3.0" + ipfs-utils "^9.0.14" + multiformats "^12.1.2" + p-retry "^5.1.2" + parallel-transform-web "^1.0.1" + varint "^6.0.0" + +"@web3-storage/w3up-client@^12.4.1": + version "12.4.1" + resolved "https://registry.yarnpkg.com/@web3-storage/w3up-client/-/w3up-client-12.4.1.tgz#10f989c08b0961168489fb4f310f96fa9aff37b0" + integrity sha512-Ti4k5UScn5kdF0A5rz0WkDefD0LofUCUJNDGRYQFudw17FmaZHfQGSQvZ0CozYrCJg8K7JPTbU4/m3joWu0ufQ== + dependencies: + "@ipld/dag-ucan" "^3.4.0" + "@ucanto/client" "^9.0.0" + "@ucanto/core" "^9.0.1" + "@ucanto/interface" "^9.0.0" + "@ucanto/principal" "^9.0.0" + "@ucanto/transport" "^9.0.0" + "@web3-storage/access" "^18.2.0" + "@web3-storage/capabilities" "^13.1.1" + "@web3-storage/did-mailto" "^2.1.0" + "@web3-storage/filecoin-client" "^3.2.0" + "@web3-storage/upload-client" "^13.0.1" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -5633,6 +5909,11 @@ acorn@^8.0.0, acorn@^8.0.4, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8 resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +actor@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/actor/-/actor-2.3.1.tgz#80ce158bb41338a0c38863bddf0947c1850b6e20" + integrity sha512-ST/3wnvcP2tKDXnum7nLCLXm+/rsf8vPocXH2Fre6D8FQwNkGDd4JEitBlXj007VQJfiGYRQvXqwOBZVi+JtRg== + address@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" @@ -5689,6 +5970,13 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -5704,6 +5992,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -6113,6 +6411,14 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomically@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.0.2.tgz#e5a6e8021441405b7a1c36d4587e25f7a13545f2" + integrity sha512-Xfmb4q5QV7uqTlVdMSTtO5eF4DCHfNOdaPyKlbFShkzeNP+3lj3yjjcbdjSmEY4+pDBKJ9g26aP+ImTe88UHoQ== + dependencies: + stubborn-fs "^1.2.5" + when-exit "^2.0.0" + autolinker@^3.11.0: version "3.16.0" resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-3.16.0.tgz#6fad29b038ba99cbfbab79f78019fed4264df0c6" @@ -6383,6 +6689,11 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bigint-mod-arith@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.3.1.tgz#8ed33dc9f7886e552a7d47c239e051836e74cfa8" + integrity sha512-pX/cYW3dCa87Jrzv6DAr8ivbbJRzEX5yGhdt8IutnX/PCIXfpx+mabWNK/M8qqh+zQ0J3thftUBHW0ByuUlG0w== + bignumber.js@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" @@ -6623,7 +6934,7 @@ browser-or-node@^2.1.1: resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== -browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2, browser-readablestream-to-it@^1.0.3: +browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2, browser-readablestream-to-it@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== @@ -7091,6 +7402,11 @@ cborg@^1.0.4, cborg@^1.5.4, cborg@^1.6.0, cborg@^1.9.0: resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.9.5.tgz#1e3b8a8407b3665566001f8841c9d72d7a80b2d5" integrity sha512-fLBv8wmqtlXqy1Yu+pHzevAIkW6k2K0ZtMujNzWphLsA34vzzg9BHn+5GmZqOJkSA9V7EMKsWrf6K976c1QMjQ== +cborg@^4.0.0, cborg@^4.0.5: + version "4.1.3" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-4.1.3.tgz#5db6c9bcfe125cf1a653584840b6fe32ecd14580" + integrity sha512-I8sAcVtiarz0dZ4IYixNUaL2hIl9cMDjo1ytI57F5fUlekTEO5Im8aXbAvsuayeP76hHSPRMwos0AUuntHJjqQ== + ccount@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" @@ -7618,6 +7934,20 @@ concordance@^5.0.4: semver "^7.3.2" well-known-symbols "^2.0.0" +conf@11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/conf/-/conf-11.0.2.tgz#b48d526f1795b0cf40d332905a38bdf8a1558f76" + integrity sha512-jjyhlQ0ew/iwmtwsS2RaB6s8DBifcE2GYBEaw2SJDUY/slJJbNfY4GlDVzOs/ff8cM/Wua5CikqXgbFl5eu85A== + dependencies: + ajv "^8.12.0" + ajv-formats "^2.1.1" + atomically "^2.0.0" + debounce-fn "^5.1.2" + dot-prop "^7.2.0" + env-paths "^3.0.0" + json-schema-typed "^8.0.1" + semver "^7.3.8" + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -8066,6 +8396,13 @@ date-time@^3.1.0: dependencies: time-zone "^1.0.0" +debounce-fn@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-5.1.2.tgz#c77bc447ef36828ecdd066df7de23f475e0a6281" + integrity sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A== + dependencies: + mimic-fn "^4.0.0" + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -8555,6 +8892,13 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" + integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== + dependencies: + type-fest "^2.11.2" + dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" @@ -8734,6 +9078,11 @@ entities@2.2.0, entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + err-code@^3.0.0, err-code@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" @@ -10394,6 +10743,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fr32-sha2-256-trunc254-padded-binary-tree-multihash@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fr32-sha2-256-trunc254-padded-binary-tree-multihash/-/fr32-sha2-256-trunc254-padded-binary-tree-multihash-3.3.0.tgz#30e0aaa3594ea781a2d53505570604bfcd9c7085" + integrity sha512-O11VDxPmPvbQj5eac2BJXyieNacyd+RCMhwOzXQQM/NCI25x3c32YWB4/JwgOWPCpKnNXF6lpK/j0lj7GWOnYQ== + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -11856,6 +12210,28 @@ ipfs-utils@^8.1.2: react-native-fetch-api "^2.0.0" stream-to-it "^0.2.2" +ipfs-utils@^9.0.14: + version "9.0.14" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704" + integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg== + dependencies: + any-signal "^3.0.0" + browser-readablestream-to-it "^1.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.1.5" + it-all "^1.0.4" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "^2.6.8" + react-native-fetch-api "^3.0.0" + stream-to-it "^0.2.2" + ipfs-utils@^9.0.2: version "9.0.7" resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.7.tgz#b8644b9d053e4dd258f69773b146ac243921aa1f" @@ -13003,6 +13379,16 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema-typed@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-8.0.1.tgz#826ee39e3b6cef536f85412ff048d3ff6f19dfa0" + integrity sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -13489,6 +13875,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + longest-streak@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" @@ -14849,6 +15240,21 @@ multiformats@9.9.0, multiformats@^9.6.5: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== +multiformats@^11.0.0, multiformats@^11.0.1, multiformats@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" + integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg== + +multiformats@^12.0.1, multiformats@^12.1.2: + version "12.1.3" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e" + integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw== + +multiformats@^13.0.0, multiformats@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.1.0.tgz#5aa9d2175108a448fc3bdb54ba8a3d0b6cab3ac3" + integrity sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ== + multiformats@^9.0.0, multiformats@^9.0.4, multiformats@^9.4.13, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.4.7, multiformats@^9.5.4, multiformats@^9.6.3, multiformats@^9.6.4: version "9.7.1" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.1.tgz#ab348e5fd6f8e7fb3fd56033211bda48854e2173" @@ -15127,6 +15533,13 @@ node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.6, node- version "2.6.7" resolved "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz#1b5d62978f2ed07b99444f64f0df39f960a6d34d" +node-fetch@^2.6.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -15517,6 +15930,10 @@ one-webcrypto@^1.0.3: resolved "https://registry.yarnpkg.com/one-webcrypto/-/one-webcrypto-1.0.3.tgz#f951243cde29b79b6745ad14966fc598a609997c" integrity sha512-fu9ywBVBPx0gS9K0etIROTiCkvI5S1TDjFsYFb3rC1ewFxeOqsbzq7aIMBHsYfrTHBcGXJaONXXjTl8B01cW1Q== +"one-webcrypto@git+https://github.com/web3-storage/one-webcrypto.git": + version "1.0.3" + resolved "git+https://github.com/web3-storage/one-webcrypto.git#5148cd14d5489a8ac4cd38223870e02db15a2382" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -15684,6 +16101,11 @@ p-defer@^3.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== +p-defer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.0.tgz#8082770aeeb10eb6b408abe91866738741ddd5d2" + integrity sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ== + p-event@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6" @@ -15841,6 +16263,14 @@ p-retry@^5.1.1: "@types/retry" "0.12.1" retry "^0.13.1" +p-retry@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-5.1.2.tgz#c16eaee4f2016f9161d12da40d3b8b0f2e3c1b76" + integrity sha512-couX95waDu98NfNZV+i/iLt+fdVxmI7CbrrdC2uDWfPdUAApyxT4wmDlyOtR5KtTDmkDO0zDScDjDou9YHhd9g== + dependencies: + "@types/retry" "0.12.1" + retry "^0.13.1" + p-settle@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/p-settle/-/p-settle-5.1.0.tgz#6abf85e073d6b137b48ed70f8a8d94660454bd17" @@ -15900,6 +16330,11 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parallel-transform-web@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parallel-transform-web/-/parallel-transform-web-1.0.1.tgz#db2f9650459588298b1fedc0b4a159b078e52248" + integrity sha512-RtPU/7IuwPZ4ePcqoPxNCpjtaXYOkCVtnhh5tW3O78wy9jqVoV2hQHms17kUeu8DTYoOP+mykFLg2agwVKlwBw== + parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" @@ -16875,11 +17310,16 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.5.1, "prettier@>=2.2.1 <=2.3.0", prettier@^2.5.1: +prettier@2.5.1, prettier@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== +"prettier@>=2.2.1 <=2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + pretty-error@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" @@ -17046,6 +17486,24 @@ protobufjs@^6.10.2: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@^7.1.2: + version "7.2.6" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" + integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -17184,6 +17642,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +rabin-rs@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/rabin-rs/-/rabin-rs-2.1.0.tgz#87b4f2dea7ca69380f1fa6b9e476d99380e7dc96" + integrity sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g== + rabin-wasm@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/rabin-wasm/-/rabin-wasm-0.1.5.tgz#5b625ca007d6a2cbc1456c78ae71d550addbc9c9" @@ -17432,6 +17895,13 @@ react-native-fetch-api@^2.0.0: dependencies: p-defer "^3.0.0" +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== + dependencies: + p-defer "^3.0.0" + react-query@^3.34.15: version "3.39.2" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.2.tgz#9224140f0296f01e9664b78ed6e4f69a0cc9216f" @@ -17902,6 +18372,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -18336,6 +18811,13 @@ semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -19283,6 +19765,11 @@ strtok3@^6.2.4: "@tokenizer/token" "^0.3.0" peek-readable "^4.1.0" +stubborn-fs@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz#e5e244223166921ddf66ed5e062b6b3bf285bfd2" + integrity sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g== + style-loader@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -19424,6 +19911,13 @@ symbol.prototype.description@^1.0.0: has-symbols "^1.0.2" object.getownpropertydescriptors "^2.1.2" +sync-multihash-sha2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sync-multihash-sha2/-/sync-multihash-sha2-1.0.0.tgz#b3004253cd0bde75ec303e4db1524d891fdbaac1" + integrity sha512-A5gVpmtKF0ov+/XID0M0QRJqF2QxAsj3x/LlDC8yivzgoYCoWkV+XaZPfVu7Vj1T/hYzYS1tfjwboSbXjqocug== + dependencies: + "@noble/hashes" "^1.3.1" + synchronous-promise@^2.0.15: version "2.0.16" resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.16.tgz#669b75e86b4295fdcc1bb0498de9ac1af6fd51a9" @@ -19836,6 +20330,11 @@ toucan-js@^2.7.0: cookie "0.5.0" stacktrace-js "2.0.2" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + traverse@~0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -19988,11 +20487,16 @@ type-fest@^1.0.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^2.0.0: +type-fest@^2.0.0, type-fest@^2.11.2: version "2.19.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^4.9.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.13.0.tgz#b55e877e3d811bb5560a212daded70443c9000c2" + integrity sha512-nKO1N9IFeTec3jnNe/3nZlX+RzwZsvT3c4akWC3IlhYGQbRSPFMBe87vmoaymS3hW2l/rs+4ptDDTxzcbqAcmA== + type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -20044,7 +20548,12 @@ typedoc@^0.22.14: minimatch "^5.1.0" shiki "^0.10.1" -typescript@4.4.4, typescript@4.5.3: +typescript@4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + +typescript@4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.3.tgz#afaa858e68c7103317d89eb90c5d8906268d353c" integrity sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ== @@ -20094,6 +20603,13 @@ uint8arrays@^3.1.1: dependencies: multiformats "^9.4.2" +uint8arrays@^4.0.6: + version "4.0.10" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f" + integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA== + dependencies: + multiformats "^12.0.1" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -20839,6 +21355,11 @@ web3-utils@1.5.2: randombytes "^2.1.0" utf8 "3.0.0" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webpack-bundle-analyzer@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz#2f3c0ca9041d5ee47fa418693cf56b4a518b578b" @@ -20983,6 +21504,19 @@ well-known-symbols@^2.0.0: resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +when-exit@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.2.tgz#888d8af6770e2b772fa3677aba1aff1a54320511" + integrity sha512-u9J+toaf3CCxCAzM/484qNAxQE75rFdVgiFEEV8Xps2gzYhf0tx73s1WXDQhkwV17E3MxRMz40m7Ekd2/121Lg== + which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" From c7793112e93ce88f14c238cd9a867edb5cf8da4d Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:06:07 -0700 Subject: [PATCH 12/46] upgrade typescript in packages/api to fix errors with new deps --- package.json | 5 ++--- packages/api/src/config.js | 6 ++++++ .../api/src/utils/uploader/r2-uploader.js | 3 --- .../api/src/utils/uploader/s3-uploader.js | 1 - yarn.lock | 19 +++++++------------ 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 0b46d2d567..289384b54c 100644 --- a/package.json +++ b/package.json @@ -39,14 +39,13 @@ "prettier": "2.5.1", "rimraf": "^3.0.2", "simple-git-hooks": "^2.3.1", - "typescript": "4.5.3", + "typescript": "5.2.2", "webpack": "^5.72.0", "wrangler": "^2.0.23" }, "resolutions": { "prettier": "2.5.1", - "@types/react": "^17.0.34", - "typescript": "4.5.3" + "@types/react": "^17.0.34" }, "engines": { "node": ">= 16.0" diff --git a/packages/api/src/config.js b/packages/api/src/config.js index f7ecc3d086..1a52da6648 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -156,6 +156,12 @@ function parseRuntimeEnv(s) { return 'test' } + if (typeof s !== 'string') { + throw new Error( + `Unable to parse non-string (${typeof s}) environment name: ${s}` + ) + } + switch (s) { case 'test': case 'dev': diff --git a/packages/api/src/utils/uploader/r2-uploader.js b/packages/api/src/utils/uploader/r2-uploader.js index 06fa24aafa..fe80af9e3f 100644 --- a/packages/api/src/utils/uploader/r2-uploader.js +++ b/packages/api/src/utils/uploader/r2-uploader.js @@ -53,7 +53,6 @@ export class R2Uploader { ]) return { key, url } } catch (cause) { - // @ts-expect-error wen ts understand Error object? throw new Error(`Failed to upload CAR to R2: ${key}`, { cause }) } } @@ -73,7 +72,6 @@ export class R2Uploader { retries: 3, }) } catch (cause) { - // @ts-expect-error error.cause is legit. throw new Error(`Failed to write satnav index to R2: ${key}`, { cause }) } } @@ -90,7 +88,6 @@ export class R2Uploader { retries: 3, }) } catch (cause) { - // @ts-expect-error error.cause is legit. throw new Error(`Failed to write dudewhere index to R2: ${key}`, { cause, }) diff --git a/packages/api/src/utils/uploader/s3-uploader.js b/packages/api/src/utils/uploader/s3-uploader.js index 3cc5258102..2334c81cf0 100644 --- a/packages/api/src/utils/uploader/s3-uploader.js +++ b/packages/api/src/utils/uploader/s3-uploader.js @@ -87,7 +87,6 @@ export class S3Uploader { await pRetry(put, { retries: 3, onFailedAttempt: console.log }) return { key, url } } catch (cause) { - // @ts-expect-error throw new Error('Failed to upload CAR to S3', { cause }) } } diff --git a/yarn.lock b/yarn.lock index 58e66d6234..baeb9f66db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15930,9 +15930,9 @@ one-webcrypto@^1.0.3: resolved "https://registry.yarnpkg.com/one-webcrypto/-/one-webcrypto-1.0.3.tgz#f951243cde29b79b6745ad14966fc598a609997c" integrity sha512-fu9ywBVBPx0gS9K0etIROTiCkvI5S1TDjFsYFb3rC1ewFxeOqsbzq7aIMBHsYfrTHBcGXJaONXXjTl8B01cW1Q== -"one-webcrypto@git+https://github.com/web3-storage/one-webcrypto.git": +"one-webcrypto@https://github.com/web3-storage/one-webcrypto": version "1.0.3" - resolved "git+https://github.com/web3-storage/one-webcrypto.git#5148cd14d5489a8ac4cd38223870e02db15a2382" + resolved "https://github.com/web3-storage/one-webcrypto#5148cd14d5489a8ac4cd38223870e02db15a2382" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" @@ -17310,16 +17310,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.5.1, prettier@^2.5.1: +prettier@2.5.1, "prettier@>=2.2.1 <=2.3.0", prettier@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== -"prettier@>=2.2.1 <=2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" - integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== - pretty-error@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" @@ -20553,10 +20548,10 @@ typescript@4.4.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== -typescript@4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.3.tgz#afaa858e68c7103317d89eb90c5d8906268d353c" - integrity sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ== +typescript@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== typical@^6.0.1: version "6.0.1" From 2ba345cb04ac71e4a16147aefbe996e2186fff00 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:12:23 -0700 Subject: [PATCH 13/46] fix tsc errors in packages/client --- packages/client/test/mock-server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/test/mock-server.js b/packages/client/test/mock-server.js index 0f36613217..e2dd4b0706 100644 --- a/packages/client/test/mock-server.js +++ b/packages/client/test/mock-server.js @@ -125,7 +125,7 @@ const toFormData = async ({ body, headers }) => { if (filename) { form.append(name, new File([data], filename, { type: contentType })) } else { - form.append(name, new TextDecoder().decode(data), filename) + form.append(name, new Blob([new TextDecoder().decode(data)]), filename) } } return form From bd4d6fab2b639041fdc5f53f655bf3eb472b9714 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:20:01 -0700 Subject: [PATCH 14/46] ci: .github/workflows/website.yml no longer uses node v16 because that isn't compatible with new deps. Use v18 and v20 instead --- .github/workflows/website.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 77087d5adb..674b4e5dec 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -17,11 +17,17 @@ jobs: check: name: Test runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: + - 18 + - 20 steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: ${{ matrix.node-version }} - uses: bahmutov/npm-install@v1 - name: Run build env: @@ -42,7 +48,8 @@ jobs: os: - ubuntu-20.04 node-version: - - '16' + - 18 + - 20 test_results_path: # corresponds to playwright invocation/configuration - packages/website/test-results @@ -97,7 +104,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: 20 registry-url: https://registry.npmjs.org/ - uses: bahmutov/npm-install@v1 - name: Run build From 7d4c838ad8d4d2f3a9c04c5fe294060edba1e235 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:10:50 -0700 Subject: [PATCH 15/46] upgrading eslint plugins to work with ts 5.0 --- decisions/20240313-try-w3up.md | 2 + packages/tools/package.json | 2 +- packages/website/package.json | 4 +- packages/website/public/sitemap.xml | 60 +- yarn.lock | 1271 +++++++++++++++++++++++---- 5 files changed, 1152 insertions(+), 187 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index b6c49aee22..23087e4367 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -151,6 +151,8 @@ Prototype Happy path - [x] @gobengo set up nft.storage localdev to be able to hack on packages/api - [x] nft.storage/api: can be configured with W3_URL +- [ ] add deps on w3up-client, ucanto + - [ ] upgrade typescript past 5.x as is required by w3up-client/ucanto - [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime - [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 - [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage diff --git a/packages/tools/package.json b/packages/tools/package.json index 8af049c219..46df19f306 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -19,7 +19,7 @@ "eslint": "^8.4.1", "eslint-config-prettier": "^8.2.0", "eslint-config-standard": "^16.0.2", - "eslint-plugin-import": "^2.25.3", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.1.0" }, diff --git a/packages/website/package.json b/packages/website/package.json index 26836d1f4f..6a12088b66 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -65,10 +65,10 @@ "babel-loader": "^8.2.4", "css-loader": "^6.7.1", "eslint": "^8.4.1", - "eslint-config-next": "12.0.10", + "eslint-config-next": "14.1.4", "eslint-config-prettier": "^8.2.0", "eslint-config-standard": "^16.0.2", - "eslint-plugin-import": "^2.25.3", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^5.1.0", "git-rev-sync": "^3.0.1", diff --git a/packages/website/public/sitemap.xml b/packages/website/public/sitemap.xml index 92ee3ed7c1..9d6f0a98c3 100644 --- a/packages/website/public/sitemap.xml +++ b/packages/website/public/sitemap.xml @@ -1,32 +1,32 @@ -https://nft.storage/daily12022-10-04T13:05:27.430Z -https://nft.storage/api-docs/daily0.82022-10-04T13:05:27.431Z -https://nft.storage/docs/client/http/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/client/js/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/concepts/architecture-considerations/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/concepts/car-files/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/concepts/decentralized-storage/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/concepts/gateways/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/get-status/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/mint-custom-metadata/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/mint-erc-1155/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/nftup/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/pinning-service/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/retrieve/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/store-directory/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/how-to/ucan/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/quickstart/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/troubleshooting/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/docs/why-nft-storage/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/faq/daily0.82022-10-04T13:05:27.431Z -https://nft.storage/login/daily0.82022-10-04T13:05:27.431Z -https://nft.storage/pinning-request/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/stats/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/terms/daily0.82022-10-04T13:05:27.431Z -https://nft.storage/callback/manage/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/callback/files/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/callback/new-file/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/callback/new-key/daily0.72022-10-04T13:05:27.431Z -https://nft.storage/callback/pinning-request/daily0.72022-10-04T13:05:27.431Z - +https://nft.storage/daily12024-03-20T22:09:52.151Z +https://nft.storage/api-docs/daily0.82024-03-20T22:09:52.153Z +https://nft.storage/docs/client/http/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/client/js/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/concepts/architecture-considerations/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/concepts/car-files/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/concepts/decentralized-storage/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/concepts/gateways/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/get-status/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/mint-custom-metadata/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/mint-erc-1155/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/nftup/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/pinning-service/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/retrieve/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/store-directory/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/how-to/ucan/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/quickstart/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/troubleshooting/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/docs/why-nft-storage/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/faq/daily0.82024-03-20T22:09:52.153Z +https://nft.storage/login/daily0.82024-03-20T22:09:52.153Z +https://nft.storage/pinning-request/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/stats/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/terms/daily0.82024-03-20T22:09:52.153Z +https://nft.storage/callback/manage/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/callback/files/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/callback/new-file/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/callback/new-key/daily0.72024-03-20T22:09:52.153Z +https://nft.storage/callback/pinning-request/daily0.72024-03-20T22:09:52.153Z + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index baeb9f66db..b1e2a796ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1961,7 +1961,7 @@ pirates "^4.0.5" source-map-support "^0.5.16" -"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.11.2", "@babel/runtime-corejs3@^7.18.9": +"@babel/runtime-corejs3@^7.11.2", "@babel/runtime-corejs3@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz#7bacecd1cb2dd694eacd32a91fcf7021c20770ae" integrity sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A== @@ -1976,13 +1976,20 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.23.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@~7.5.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" @@ -2495,6 +2502,18 @@ protobufjs "^7.1.2" rabin-rs "^2.1.0" +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -3105,12 +3124,12 @@ resolved "https://registry.yarnpkg.com/@next/env/-/env-12.2.5.tgz#d908c57b35262b94db3e431e869b72ac3e1ad3e3" integrity sha512-vLPLV3cpPGjUPT3PjgRj7e3nio9t6USkuew3JE/jMeon/9Mvp1WyR18v3iwnCuX7eUAm1HmAbJHHLAbcu/EJcw== -"@next/eslint-plugin-next@12.0.10": - version "12.0.10" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.0.10.tgz#521ab5d05a89e818528668df8a3edb8f9df2c547" - integrity sha512-PbGRnV5HGSfRGLjf8uTh1MaWgLwnjKjWiGVjK752ifITJbZ28/5AmLAFT2shDYeux8BHgpgVll5QXu7GN3YLFw== +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== dependencies: - glob "7.1.7" + glob "10.3.10" "@next/swc-android-arm-eabi@12.2.5": version "12.2.5" @@ -3269,6 +3288,11 @@ "@multiformats/murmur3" "^2.1.0" murmurhash3js-revisited "^3.0.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@playwright/test@^1.20.1": version "1.25.1" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.25.1.tgz#9847234b6f2b0cca71962b338da7db366a1e9720" @@ -3413,10 +3437,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rushstack/eslint-patch@^1.0.8": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" - integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== +"@rushstack/eslint-patch@^1.3.3": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz#c5545e6a5d2bd5c26b4021c357177a28698c950e" + integrity sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ== "@scure/base@~1.1.0": version "1.1.1" @@ -5231,14 +5255,15 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0": - version "5.35.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.35.1.tgz#bf2ee2ebeaa0a0567213748243fb4eec2857f04f" - integrity sha512-XL2TBTSrh3yWAsMYpKseBYTVpvudNf69rPOWXWVBI08My2JVT5jR66eTt4IgQFHA/giiKJW5dUD4x/ZviCKyGg== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@typescript-eslint/scope-manager" "5.35.1" - "@typescript-eslint/types" "5.35.1" - "@typescript-eslint/typescript-estree" "5.35.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.35.1": @@ -5249,6 +5274,14 @@ "@typescript-eslint/types" "5.35.1" "@typescript-eslint/visitor-keys" "5.35.1" +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + "@typescript-eslint/type-utils@5.35.1": version "5.35.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.35.1.tgz#d50903b56758c5c8fc3be52b3be40569f27f9c4a" @@ -5263,6 +5296,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.35.1.tgz#af355fe52a0cc88301e889bc4ada72f279b63d61" integrity sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + "@typescript-eslint/typescript-estree@5.35.1": version "5.35.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz#db878a39a0dbdc9bb133f11cdad451770bfba211" @@ -5276,6 +5314,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@5.35.1": version "5.35.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.35.1.tgz#ae1399afbfd6aa7d0ed1b7d941e9758d950250eb" @@ -5296,6 +5348,14 @@ "@typescript-eslint/types" "5.35.1" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + "@ucanto/client@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@ucanto/client/-/client-9.0.0.tgz#d7d632a8e13a2050fb911c3dd44ecf3d89cf4631" @@ -6188,19 +6248,18 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== - dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - aria-query@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -6216,6 +6275,14 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -6226,7 +6293,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.0.3, array-includes@^3.1.4, array-includes@^3.1.5: +array-includes@^3.0.3, array-includes@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== @@ -6237,6 +6304,18 @@ array-includes@^3.0.3, array-includes@^3.1.4, array-includes@^3.1.5: get-intrinsic "^1.1.1" is-string "^1.0.7" +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -6269,7 +6348,31 @@ array.prototype.every@^1.1.3: es-abstract "^1.19.0" is-string "^1.0.7" -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5: +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== @@ -6279,7 +6382,17 @@ array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.3.0: +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== @@ -6289,6 +6402,16 @@ array.prototype.flatmap@^1.2.1, array.prototype.flatmap@^1.3.0: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + array.prototype.map@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.4.tgz#0d97b640cfdd036c1b41cfe706a5e699aa0711f2" @@ -6311,6 +6434,41 @@ array.prototype.reduce@^1.0.4: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + arrgv@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/arrgv/-/arrgv-1.0.2.tgz#025ed55a6a433cad9b604f8112fc4292715a6ec0" @@ -6364,10 +6522,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== ast-types@0.14.2, ast-types@^0.14.2: version "0.14.2" @@ -6507,15 +6665,24 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" - integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" @@ -7287,6 +7454,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -8352,6 +8530,33 @@ data-uri-to-buffer@^3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + datastore-core@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/datastore-core/-/datastore-core-4.0.0.tgz#b62184244929109ba05f935fc2abb9d0d7cbb691" @@ -8403,7 +8608,7 @@ debounce-fn@^5.1.2: dependencies: mimic-fn "^4.0.0" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -8610,6 +8815,15 @@ deferred-leveldown@^7.0.0: abstract-leveldown "^7.2.0" inherits "^2.0.3" +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -8623,6 +8837,15 @@ define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -8684,7 +8907,7 @@ depd@2.0.0, depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -dequal@^2.0.0: +dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -9073,6 +9296,14 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.12.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@2.2.0, entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -9138,11 +9369,122 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-abstract@^1.22.1, es-abstract@^1.22.3: + version "1.22.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.1" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.0" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.14" + +es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-get-iterator@^1.0.2, es-get-iterator@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" @@ -9157,11 +9499,47 @@ es-get-iterator@^1.0.2, es-get-iterator@^1.1.1: is-string "^1.0.5" isarray "^2.0.5" +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -9169,6 +9547,13 @@ es-shim-unscopables@^1.0.0: dependencies: has "^1.0.3" +es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -9631,20 +10016,20 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-next@12.0.10: - version "12.0.10" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.0.10.tgz#f201f8f4514018f7ef46f454f56b81cf5c790379" - integrity sha512-l1er6mwSo1bltjLwmd71p5BdT6k/NQxV1n4lKZI6xt3MDMrq7ChUBr+EecxOry8GC/rCRUtPpH8Ygs0BJc5YLg== - dependencies: - "@next/eslint-plugin-next" "12.0.10" - "@rushstack/eslint-patch" "^1.0.8" - "@typescript-eslint/parser" "^5.0.0" - eslint-import-resolver-node "^0.3.4" - eslint-import-resolver-typescript "^2.4.0" - eslint-plugin-import "^2.25.2" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.27.0" - eslint-plugin-react-hooks "^4.3.0" +eslint-config-next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + dependencies: + "@next/eslint-plugin-next" "14.1.4" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" eslint-config-prettier@^8.2.0: version "8.5.0" @@ -9656,7 +10041,7 @@ eslint-config-standard@^16.0.2: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== -eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6: +eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== @@ -9664,21 +10049,32 @@ eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" -eslint-import-resolver-typescript@^2.4.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" - integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" - glob "^7.2.0" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" is-glob "^4.0.3" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" -eslint-module-utils@^2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" @@ -9690,43 +10086,50 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.25.3: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.28.1, eslint-plugin-import@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jsx-a11y@^6.5.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" - integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== - dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" - ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" minimatch "^3.1.2" - semver "^6.3.0" + object.entries "^1.1.7" + object.fromentries "^2.0.7" eslint-plugin-node@^11.1.0: version "11.1.0" @@ -9752,30 +10155,34 @@ eslint-plugin-promise@^5.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== -eslint-plugin-react-hooks@^4.3.0: +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.27.0: - version "7.31.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz#d29793ed27743f3ed8a473c347b1bf5a0a8fb9af" - integrity sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg== +eslint-plugin-react@^7.33.2: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" - string.prototype.matchall "^4.0.7" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -9830,6 +10237,11 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + eslint@^8.4.1: version "8.23.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040" @@ -10339,6 +10751,17 @@ fast-glob@^3.0.0, fast-glob@^3.2.11, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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.4" + fast-json-parse@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" @@ -10665,6 +11088,14 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fork-ts-checker-webpack-plugin@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" @@ -10847,6 +11278,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -10857,12 +11293,22 @@ function.prototype.name@^1.1.0, function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -10915,6 +11361,17 @@ get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-iterator@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" @@ -10970,6 +11427,22 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -11033,17 +11506,16 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@7.2.0: version "7.2.0" @@ -11057,7 +11529,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0, glob@^7.2.3: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -11100,7 +11572,7 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.0: +globalthis@^1.0.0, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== @@ -11154,6 +11626,13 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^11.8.2: version "11.8.5" resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" @@ -11317,6 +11796,18 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" @@ -11341,6 +11832,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -11409,6 +11907,13 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hast-to-hyperscript@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" @@ -11931,6 +12436,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -12387,6 +12901,14 @@ is-arguments@^1.0.4, is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -12397,6 +12919,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -12448,6 +12977,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -12460,7 +12994,14 @@ is-circular@^1.0.2: resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== -is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== @@ -12481,7 +13022,14 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1, is-date-object@^1.0.2: +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.2, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -12556,6 +13104,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-finite@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" @@ -12583,7 +13138,7 @@ is-function@^1.0.1, is-function@^1.0.2: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -12664,6 +13219,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -12769,6 +13329,13 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -12798,6 +13365,13 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" @@ -13155,6 +13729,26 @@ iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-diff@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" @@ -13413,6 +14007,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.1.2, json5@^2.1.3, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" @@ -13432,7 +14033,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: +"jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== @@ -13440,6 +14041,16 @@ jsonfile@^6.0.1: array-includes "^3.1.5" object.assign "^4.1.3" +jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + junk@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" @@ -13523,17 +14134,17 @@ klona@^2.0.4, klona@^2.0.5: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -language-subtag-registry@~0.3.2: +language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - language-subtag-registry "~0.3.2" + language-subtag-registry "^0.3.20" lazy-universal-dotenv@^3.0.1: version "3.0.1" @@ -13962,6 +14573,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -14965,6 +15581,13 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -15048,6 +15671,11 @@ minipass@^3.3.5: dependencies: yallist "^4.0.0" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -15800,6 +16428,11 @@ object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + object-is@^1.0.1, object-is@^1.1.4, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" @@ -15830,7 +16463,17 @@ object.assign@^4.1.0, object.assign@^4.1.2, object.assign@^4.1.3: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.5: +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== @@ -15839,7 +16482,16 @@ object.entries@^1.1.0, object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" -"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.5: +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +"object.fromentries@^2.0.0 || ^1.0.0": version "2.0.5" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== @@ -15848,6 +16500,16 @@ object.entries@^1.1.0, object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" @@ -15858,13 +16520,22 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2 define-properties "^1.1.4" es-abstract "^1.20.1" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.1.4" - es-abstract "^1.19.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" object.pick@^1.3.0: version "1.3.0" @@ -15873,7 +16544,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.5: +object.values@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== @@ -15882,6 +16553,15 @@ object.values@^1.1.0, object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + objectorarray@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.5.tgz#2c05248bbefabd8f43ad13b41085951aac5e68a5" @@ -16531,6 +17211,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -16842,6 +17530,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" @@ -18106,6 +18799,19 @@ redux@^4.0.0, redux@^4.1.2: dependencies: "@babel/runtime" "^7.9.2" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + refractor@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" @@ -18132,6 +18838,11 @@ regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4, regenerator-runtime@^0 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" @@ -18156,6 +18867,16 @@ regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.4.1, regexp.prototype.f define-properties "^1.1.3" functions-have-names "^1.2.2" +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + regexparam@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-2.0.1.tgz#c912f5dae371e3798100b3c9ce22b7414d0889fa" @@ -18414,12 +19135,17 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.3.2: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -18428,6 +19154,15 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14. path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -18437,6 +19172,15 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -18644,6 +19388,16 @@ safari-14-idb-fix@^3.0.0: resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440" integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog== +safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -18659,6 +19413,15 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -18799,6 +19562,11 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -18806,7 +19574,7 @@ semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@^7.3.8: +semver@^7.3.8, semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -18898,6 +19666,28 @@ set-cookie-parser@^2.4.8: resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -19008,6 +19798,16 @@ side-channel@^1.0.3, side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" @@ -19018,6 +19818,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -19531,6 +20336,15 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -19549,7 +20363,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -19558,7 +20372,7 @@ string-width@^5.0.0: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.7: +"string.prototype.matchall@^4.0.0 || ^3.0.1": version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== @@ -19572,6 +20386,24 @@ string-width@^5.0.0: regexp.prototype.flags "^1.4.1" side-channel "^1.0.4" +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + string.prototype.padend@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" @@ -19599,6 +20431,16 @@ string.prototype.trim@^1.2.6: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" @@ -19608,6 +20450,15 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string.prototype.trimstart@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" @@ -19617,6 +20468,15 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -19644,6 +20504,13 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -20384,6 +21251,11 @@ trouter@^2.0.1: dependencies: matchit "^1.0.0" +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" @@ -20394,13 +21266,13 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -20510,6 +21382,50 @@ type@^2.5.0: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -21523,6 +22439,24 @@ which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -21538,6 +22472,17 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which-typed-array@^1.1.2: version "1.1.8" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" @@ -21635,6 +22580,15 @@ wrangler@^2.0.23: optionalDependencies: fsevents "~2.3.2" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -21653,6 +22607,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From e3fc4f6b85adc5336017401649b5d0d3c682b882 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:19:41 -0700 Subject: [PATCH 16/46] ci: anything using node-version 16 now uses 18 --- .github/workflows/cron-dagcargo-sizes.yml | 2 +- .github/workflows/cron-metrics.yml | 2 +- .github/workflows/cron-nft-ttr.yml | 2 +- .github/workflows/cron-pins-failed.yml | 2 +- .github/workflows/cron-pins.yml | 2 +- .github/workflows/cron.yml | 6 +++--- .github/workflows/deploy.yml | 8 ++++---- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cron-dagcargo-sizes.yml b/.github/workflows/cron-dagcargo-sizes.yml index c5b720a746..7b94e0e03d 100644 --- a/.github/workflows/cron-dagcargo-sizes.yml +++ b/.github/workflows/cron-dagcargo-sizes.yml @@ -23,7 +23,7 @@ jobs: git checkout $LATEST_TAG - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Run job env: diff --git a/.github/workflows/cron-metrics.yml b/.github/workflows/cron-metrics.yml index 3dfceb1fdd..9f44b69d4e 100644 --- a/.github/workflows/cron-metrics.yml +++ b/.github/workflows/cron-metrics.yml @@ -23,7 +23,7 @@ jobs: git checkout $LATEST_TAG - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Run job env: diff --git a/.github/workflows/cron-nft-ttr.yml b/.github/workflows/cron-nft-ttr.yml index 2314c299ea..75545ef473 100644 --- a/.github/workflows/cron-nft-ttr.yml +++ b/.github/workflows/cron-nft-ttr.yml @@ -20,7 +20,7 @@ jobs: git checkout $LATEST_TAG - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Run job env: diff --git a/.github/workflows/cron-pins-failed.yml b/.github/workflows/cron-pins-failed.yml index 703148d796..c7382f502d 100644 --- a/.github/workflows/cron-pins-failed.yml +++ b/.github/workflows/cron-pins-failed.yml @@ -27,7 +27,7 @@ jobs: git checkout $LATEST_TAG - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Run job env: diff --git a/.github/workflows/cron-pins.yml b/.github/workflows/cron-pins.yml index 1cd02f1999..c0468451f4 100644 --- a/.github/workflows/cron-pins.yml +++ b/.github/workflows/cron-pins.yml @@ -23,7 +23,7 @@ jobs: git checkout $LATEST_TAG - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Run job env: diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 50c852f48a..968497b1ef 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - run: yarn workspace nft.storage prepare - run: yarn workspace cron lint @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - run: yarn workspace nft.storage prepare - run: yarn workspace cron typecheck @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Test (ES) run: yarn --cwd packages/cron test diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b235840dcd..bc4f39ddc5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - name: Publish app uses: cloudflare/wrangler-action@1.3.0 @@ -43,7 +43,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - run: ./packages/tools/cli.js dns --name nft.storage --token ${{ secrets.CF_API_TOKEN }} --zone ${{ secrets.CF_ZONE }} --content ${{ github.event.inputs.frontend_cname }} - run: echo "::warning::https://nft.storage" @@ -54,7 +54,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - run: ./packages/tools/cli.js dns --name staging.nft.storage --token ${{ secrets.CF_API_TOKEN }} --zone ${{ secrets.CF_ZONE }} --content ${{ github.event.inputs.frontend_cname }} - run: echo "::warning::https://staging.nft.storage" @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' - uses: bahmutov/npm-install@v1 - run: ./packages/tools/cli.js dns --name dev.nft.storage --token ${{ secrets.CF_API_TOKEN }} --zone ${{ secrets.CF_ZONE }} --content ${{ github.event.inputs.frontend_cname }} - run: echo "::warning::https://dev.nft.storage" From 0dde37301508c2b54d54e4e4a428cf3336707fee Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:25:47 -0700 Subject: [PATCH 17/46] fix ts errors in cron --- decisions/20240313-try-w3up.md | 2 +- packages/cron/src/lib/metrics.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index 23087e4367..a9146591bd 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -152,7 +152,7 @@ Prototype Happy path - [x] @gobengo set up nft.storage localdev to be able to hack on packages/api - [x] nft.storage/api: can be configured with W3_URL - [ ] add deps on w3up-client, ucanto - - [ ] upgrade typescript past 5.x as is required by w3up-client/ucanto + - [ ] upgrade typescript past 5.x and node past 16 as is required by w3up-client+ucanto - [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime - [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 - [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage diff --git a/packages/cron/src/lib/metrics.js b/packages/cron/src/lib/metrics.js index 5ec9b75315..30d744aac9 100644 --- a/packages/cron/src/lib/metrics.js +++ b/packages/cron/src/lib/metrics.js @@ -3,11 +3,11 @@ import { Histogram, Registry, linearBuckets, Pushgateway } from 'prom-client' import { Milliseconds } from './time.js' /** + * @template Value + * @template Labels * @typedef Metric * @property {string} name * @property {(value: Value, labels: Labels) => void} observe - * @template Value - * @template Labels */ /** From 6ea03bc4aa2d09d8e9dc00654d03fe42aafe7188 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:32:12 -0700 Subject: [PATCH 18/46] ci: client ci only does install in client package, so node 16 doesnt fail on installing things that require w3up-client and node 18 --- .github/workflows/client.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index f8e1efda68..eadb85f1da 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -45,6 +45,8 @@ jobs: with: node-version: ${{ matrix.node_version }} - uses: bahmutov/npm-install@v1 + with: + working-directory: packages/client - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From 522d0db2edd32903ff25ca6e1cd371934e39d5e1 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:36:36 -0700 Subject: [PATCH 19/46] try differently for client ci to only install in packages/client --- .github/workflows/client.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index eadb85f1da..f69aa5676f 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -47,6 +47,7 @@ jobs: - uses: bahmutov/npm-install@v1 with: working-directory: packages/client + install-command: yarn --focus - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From 00af17d80d5806dd7c01c9b2df48fe32d966305a Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:38:56 -0700 Subject: [PATCH 20/46] try differently for client ci to only install in packages/client --- .github/workflows/client.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index f69aa5676f..d264bb0a1c 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -46,8 +46,7 @@ jobs: node-version: ${{ matrix.node_version }} - uses: bahmutov/npm-install@v1 with: - working-directory: packages/client - install-command: yarn --focus + install-command: yarn workspace packages/client install - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From a6f3f7072cd50810334e2189073a7acfc7392ac3 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:40:23 -0700 Subject: [PATCH 21/46] try differently for client ci to only install in packages/client --- .github/workflows/client.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index d264bb0a1c..2b6df426ba 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -46,7 +46,7 @@ jobs: node-version: ${{ matrix.node_version }} - uses: bahmutov/npm-install@v1 with: - install-command: yarn workspace packages/client install + install-command: yarn workspace client install - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From 672eac42658946d62520cfb2b3b3c46f49027694 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:45:22 -0700 Subject: [PATCH 22/46] try differently for client ci to only install in packages/client --- .github/workflows/client.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index 2b6df426ba..e26661fcf1 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -46,7 +46,7 @@ jobs: node-version: ${{ matrix.node_version }} - uses: bahmutov/npm-install@v1 with: - install-command: yarn workspace client install + install-command: yarn workspace nft.storage install - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From d94cbb3f8b270c2628e77648682610068edcfbd3 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:56:26 -0700 Subject: [PATCH 23/46] ci: client no longer tests using node 16 because yarn install fails unless node 18 --- .github/workflows/client.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index e26661fcf1..be7d83d810 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -36,7 +36,6 @@ jobs: strategy: matrix: node_version: - - 16 - 18 - 20 steps: @@ -45,8 +44,6 @@ jobs: with: node-version: ${{ matrix.node_version }} - uses: bahmutov/npm-install@v1 - with: - install-command: yarn workspace nft.storage install - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From 6d8cc30ec53298e7feef2be847fbc576c5baea9e Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:07:03 -0700 Subject: [PATCH 24/46] try differently for client ci to only install in packages/client --- .github/workflows/client.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index be7d83d810..d9a816fa26 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -36,6 +36,7 @@ jobs: strategy: matrix: node_version: + - 16 - 18 - 20 steps: @@ -43,7 +44,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node_version }} - - uses: bahmutov/npm-install@v1 + - run: npx yarn workspace nft.storage install --frozen-lockfile - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From 0b22f7832150087077af6ff9468d3f67761928fe Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:23:30 -0700 Subject: [PATCH 25/46] ci: client no longer tests using node 16 because yarn install fails unless node 18 --- .github/workflows/client.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index d9a816fa26..be7d83d810 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -36,7 +36,6 @@ jobs: strategy: matrix: node_version: - - 16 - 18 - 20 steps: @@ -44,7 +43,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node_version }} - - run: npx yarn workspace nft.storage install --frozen-lockfile + - uses: bahmutov/npm-install@v1 - name: Test (ES) run: yarn --cwd packages/client test:es - name: Test (Web) From d9b6b29c86693317fcf771e340ec9a38954d5823 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:39:39 -0700 Subject: [PATCH 26/46] empty commit From 06b0718e5962155d0590c9aed30dbf764526192a Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:09:22 -0700 Subject: [PATCH 27/46] nfts-upload.spec creates real values for W3_NFTSTORAGE envs --- packages/api/src/utils/w3up.js | 33 ++++++++++++++++++++++++++- packages/api/test/nfts-upload.spec.js | 22 +++++++++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index 0dd0d10b72..003460955d 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -4,8 +4,9 @@ import { StoreMemory } from '@web3-storage/access/stores/store-memory' import { CID } from 'multiformats/cid' import { base64 } from 'multiformats/bases/base64' import { identity } from 'multiformats/hashes/identity' -import { CarReader } from '@ipld/car' +import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' +import * as ucanto from '@ucanto/core' /** * @param {object} env @@ -70,3 +71,33 @@ export async function readProofFromBytes(bytes) { throw err } } + +/** + * @param {import('@ucanto/interface').Delegation} delegation - delegation to encode + */ +export async function encodeDelegationAsCid(delegation) { + const { writer, out } = CarWriter.create() + /** @type {Array} */ + const carChunks = [] + await Promise.all([ + // write delegation blocks + (async () => { + for (const block of delegation.export()) { + // @ts-expect-error different Block types + await writer.put(block) + } + await writer.close() + })(), + // read out + (async () => { + for await (const chunk of out) { + carChunks.push(chunk) + } + })(), + ]) + // now get car chunks + const car = new Blob(carChunks) + const bytes = new Uint8Array(await car.arrayBuffer()) + const cid = CID.createV1(ucanto.CAR.code, identity.digest(bytes)) + return cid +} diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index e2a4caad54..c1ef8de7c0 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -27,9 +27,14 @@ import path from 'node:path' import { FormData } from 'undici' import { createCarCid } from '../src/utils/car.js' import { createServer } from 'node:http' +import { ed25519 } from '@ucanto/principal' +import { delegate } from '@ucanto/core' +import { encodeDelegationAsCid } from '../src/utils/w3up.js' const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const nftStorageSpace = ed25519.generate() +const nftStorageApiPrincipal = ed25519.generate() const mockW3up = createListeningMockW3up() test.before(async (t) => { @@ -38,9 +43,20 @@ test.before(async (t) => { overrides: { LINKDEX_URL: linkdexUrl, W3UP_URL: (await mockW3up).url.toString(), - W3_NFTSTORAGE_SPACE: `did:key:zTodo`, - W3_NFTSTORAGE_PRINCIPAL: 'zTodo', - W3_NFTSTORAGE_PROOF: 'zTodo', + W3_NFTSTORAGE_SPACE: (await nftStorageSpace).did(), + W3_NFTSTORAGE_PRINCIPAL: (await nftStorageApiPrincipal).did(), + W3_NFTSTORAGE_PROOF: ( + await encodeDelegationAsCid( + await delegate({ + issuer: await nftStorageSpace, + audience: await nftStorageApiPrincipal, + capabilities: [ + { can: 'store/add', with: (await nftStorageSpace).did() }, + { can: 'upload/add', with: (await nftStorageSpace).did() }, + ], + }) + ) + ).toString(), }, }) }) From ededb899460bc9398d722bad5538cd6890ad0436 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:13:57 -0700 Subject: [PATCH 28/46] add W3_NFTSTORAGE_ env vars to bindings --- packages/api/src/bindings.d.ts | 8 ++++++++ packages/api/test/nfts-upload.spec.js | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index e3d069670c..18055776df 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -7,6 +7,7 @@ import { UserOutput, UserOutputKey } from './utils/db-client-types.js' import { DBClient } from './utils/db-client.js' import { LinkdexApi } from './utils/linkdex.js' import { Logging } from './utils/logs.js' +import { Client as W3upClient } from '@web3-storage/w3up-client' export type RuntimeEnvironmentName = 'test' | 'dev' | 'staging' | 'production' @@ -99,6 +100,12 @@ export interface ServiceConfiguration { /** w3up connection URL (e.g. https://up.web3.storage) */ W3UP_URL?: string + + /** base64 encoded multiformats ed25519 secretKey */ + W3_NFTSTORAGE_PRINCIPAL?: string + + /** CID (identity codec) of CAR-encoded UCAN DAG */ + W3_NFTSTORAGE_PROOF?: string } export interface Ucan { @@ -132,6 +139,7 @@ export interface RouteContext { ucanService: Service auth?: Auth W3UP_URL?: string + w3up?: W3upClient } export type Handler = ( diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index c1ef8de7c0..ee59afc840 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -973,9 +973,9 @@ async function createListeningMockW3up() { server.addListener('listening', () => resolve(undefined)) }) const serverAddress = server.address() - if (typeof serverAddress === 'string') + if (typeof serverAddress === 'string' || !serverAddress) throw new Error('server.address() must not return a string') - const url = new URL(`http://localhost:${serverAddress?.port ?? ''}`) + const url = new URL(`http://localhost:${serverAddress.port}`) return { get requestCount() { return requestCount From d36dc20ce6f6713e26e509fb7f00b7cd6aff8bc3 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:17:23 -0700 Subject: [PATCH 29/46] add w3up createW3upClientFromConfig --- packages/api/src/utils/w3up.js | 40 ++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index 003460955d..a0d74b37a6 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -7,6 +7,9 @@ import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' import * as ucanto from '@ucanto/core' +import * as W3upClient from '@web3-storage/w3up-client' +import { connect } from '@ucanto/client' +import { CAR, HTTP } from '@ucanto/transport' /** * @param {object} env @@ -40,10 +43,7 @@ async function parseW3Proof(proof) { } if (cid.multihash.code !== identity.code) { - console.error( - `Error: failed to read proof. Must be identity CID. Fetching of remote proof CARs not supported by this command yet` - ) - process.exit(1) + throw new Error('expected cid to have identity code') } const delegation = await readProofFromBytes(cid.multihash.digest) return delegation @@ -101,3 +101,35 @@ export async function encodeDelegationAsCid(delegation) { const cid = CID.createV1(ucanto.CAR.code, identity.digest(bytes)) return cid } + +/** + * @param {object} options + * @param {string} options.url + * @param {string} options.principal + * @param {string} options.proof + */ +export async function createW3upClientFromConfig(options) { + const url = new URL(options.url) + const principal = ed25519.parse(options.principal) + const connection = connect({ + id: { did: () => 'did:web:web3.storage' }, + codec: CAR.outbound, + channel: HTTP.open({ + url, + method: 'POST', + }), + }) + const store = new StoreMemory() + const w3up = await W3upClient.create({ + principal, + store, + serviceConf: { + upload: connection, + access: connection, + filecoin: connection, + }, + receiptsEndpoint: new URL('/receipt/', options.url), + }) + await w3up.addSpace(await parseW3Proof(options.proof)) + return w3up +} From 6d14169120d21c9aa81168958ef4bd5454327603 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:21:41 -0700 Subject: [PATCH 30/46] add W3_NFTSTORAGE_SPACE to bindings --- packages/api/src/bindings.d.ts | 3 +++ packages/api/src/utils/context.js | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index 18055776df..6a5d2dfc42 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -106,6 +106,9 @@ export interface ServiceConfiguration { /** CID (identity codec) of CAR-encoded UCAN DAG */ W3_NFTSTORAGE_PROOF?: string + + /** did:key of the w3up space in which to store NFTs */ + W3_NFTSTORAGE_SPACE?: string } export interface Ucan { diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index 9f0145b54a..58aff37beb 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -65,7 +65,11 @@ export async function getContext(event, params) { const w3upConfig = { W3UP_URL: config.W3UP_URL, + W3_NFTSTORAGE_PRINCIPAL: config.W3_NFTSTORAGE_PRINCIPAL, + W3_NFTSTORAGE_PROOF: config.W3_NFTSTORAGE_PROOF, + W3_NFTSTORAGE_SPACE: config.W3_NFTSTORAGE_SPACE, } + console.log('in getContext', w3upConfig) return { ...w3upConfig, params, From c4d1289ee5f7ad3215eee924bcab348b03d06f6e Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:24:25 -0700 Subject: [PATCH 31/46] nft-upload route logs w3upConfig --- packages/api/src/bindings.d.ts | 3 +++ packages/api/src/routes/nfts-upload.js | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index 6a5d2dfc42..c956fd083a 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -142,6 +142,9 @@ export interface RouteContext { ucanService: Service auth?: Auth W3UP_URL?: string + W3_NFTSTORAGE_PRINCIPAL?: string + W3_NFTSTORAGE_PROOF?: string + W3_NFTSTORAGE_SPACE?: string w3up?: W3upClient } diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index 3769406c8a..c9c2c31c05 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -11,6 +11,7 @@ import { createCarCid } from '../utils/car.js' import { JSONResponse } from '../utils/json-response.js' import { checkAuth } from '../utils/auth.js' import { toNFTResponse } from '../utils/db-transforms.js' +import { createW3upClientFromConfig } from '../utils/w3up.js' const MAX_BLOCK_SIZE = 1 << 21 // Maximum permitted block size in bytes (2MiB). const decoders = [pb, raw, cbor] @@ -105,6 +106,14 @@ export async function nftUpload(event, ctx) { }) } + const w3upConfig = { + W3UP_URL: ctx.W3UP_URL, + W3_NFTSTORAGE_PRINCIPAL: ctx.W3_NFTSTORAGE_PRINCIPAL, + W3_NFTSTORAGE_PROOF: ctx.W3_NFTSTORAGE_PROOF, + W3_NFTSTORAGE_SPACE: ctx.W3_NFTSTORAGE_SPACE, + } + console.log('in nfts-upload handler w/ w3up', w3upConfig) + if (ctx.W3UP_URL) { const w3upResponse = await fetch(ctx.W3UP_URL) } From 37e06ffb923448edd3e2ef2f478a838cddb47da0 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:27:37 -0700 Subject: [PATCH 32/46] rm unused import in case it causes URL error --- packages/api/src/routes/nfts-upload.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index c9c2c31c05..d1178103b0 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -11,7 +11,6 @@ import { createCarCid } from '../utils/car.js' import { JSONResponse } from '../utils/json-response.js' import { checkAuth } from '../utils/auth.js' import { toNFTResponse } from '../utils/db-transforms.js' -import { createW3upClientFromConfig } from '../utils/w3up.js' const MAX_BLOCK_SIZE = 1 << 21 // Maximum permitted block size in bytes (2MiB). const decoders = [pb, raw, cbor] From 7c1aa0bbffdf9512a85ab91daf2129a4c721a810 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:32:51 -0700 Subject: [PATCH 33/46] re add import --- packages/api/src/routes/nfts-upload.js | 1 + packages/api/src/utils/w3up.js | 52 +++++++++++++------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index d1178103b0..c9c2c31c05 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -11,6 +11,7 @@ import { createCarCid } from '../utils/car.js' import { JSONResponse } from '../utils/json-response.js' import { checkAuth } from '../utils/auth.js' import { toNFTResponse } from '../utils/db-transforms.js' +import { createW3upClientFromConfig } from '../utils/w3up.js' const MAX_BLOCK_SIZE = 1 << 21 // Maximum permitted block size in bytes (2MiB). const decoders = [pb, raw, cbor] diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index a0d74b37a6..15c3c02eef 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -7,9 +7,9 @@ import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' import * as ucanto from '@ucanto/core' -import * as W3upClient from '@web3-storage/w3up-client' -import { connect } from '@ucanto/client' -import { CAR, HTTP } from '@ucanto/transport' +// import * as W3upClient from '@web3-storage/w3up-client' +// import { connect } from '@ucanto/client' +// import { CAR, HTTP } from '@ucanto/transport' /** * @param {object} env @@ -109,27 +109,27 @@ export async function encodeDelegationAsCid(delegation) { * @param {string} options.proof */ export async function createW3upClientFromConfig(options) { - const url = new URL(options.url) - const principal = ed25519.parse(options.principal) - const connection = connect({ - id: { did: () => 'did:web:web3.storage' }, - codec: CAR.outbound, - channel: HTTP.open({ - url, - method: 'POST', - }), - }) - const store = new StoreMemory() - const w3up = await W3upClient.create({ - principal, - store, - serviceConf: { - upload: connection, - access: connection, - filecoin: connection, - }, - receiptsEndpoint: new URL('/receipt/', options.url), - }) - await w3up.addSpace(await parseW3Proof(options.proof)) - return w3up + // const url = new URL(options.url) + // const principal = ed25519.parse(options.principal) + // const connection = connect({ + // id: { did: () => 'did:web:web3.storage' }, + // codec: CAR.outbound, + // channel: HTTP.open({ + // url, + // method: 'POST', + // }), + // }) + // const store = new StoreMemory() + // const w3up = await W3upClient.create({ + // principal, + // store, + // serviceConf: { + // upload: connection, + // access: connection, + // filecoin: connection, + // }, + // receiptsEndpoint: new URL('/receipt/', options.url), + // }) + // await w3up.addSpace(await parseW3Proof(options.proof)) + // return w3up } From 1532a09288474b933439bf25cd4b677099ff5f98 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:11:36 -0700 Subject: [PATCH 34/46] use w3up client 12.5 --- packages/api/package.json | 2 +- packages/api/src/utils/w3up.js | 52 ++++++++++----------- yarn.lock | 83 +++++++++++++++++----------------- 3 files changed, 68 insertions(+), 69 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 6020cdc6ee..a41e176b1b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -31,7 +31,7 @@ "@ucanto/principal": "^9.0.0", "@web3-storage/access": "^18.2.0", "@web3-storage/car-block-validator": "^1.2.0", - "@web3-storage/w3up-client": "^12.4.1", + "@web3-storage/w3up-client": "^12.5.0", "cardex": "^1.0.0", "ipfs-car": "^0.6.1", "it-last": "^2.0.0", diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index 15c3c02eef..a0d74b37a6 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -7,9 +7,9 @@ import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' import * as ucanto from '@ucanto/core' -// import * as W3upClient from '@web3-storage/w3up-client' -// import { connect } from '@ucanto/client' -// import { CAR, HTTP } from '@ucanto/transport' +import * as W3upClient from '@web3-storage/w3up-client' +import { connect } from '@ucanto/client' +import { CAR, HTTP } from '@ucanto/transport' /** * @param {object} env @@ -109,27 +109,27 @@ export async function encodeDelegationAsCid(delegation) { * @param {string} options.proof */ export async function createW3upClientFromConfig(options) { - // const url = new URL(options.url) - // const principal = ed25519.parse(options.principal) - // const connection = connect({ - // id: { did: () => 'did:web:web3.storage' }, - // codec: CAR.outbound, - // channel: HTTP.open({ - // url, - // method: 'POST', - // }), - // }) - // const store = new StoreMemory() - // const w3up = await W3upClient.create({ - // principal, - // store, - // serviceConf: { - // upload: connection, - // access: connection, - // filecoin: connection, - // }, - // receiptsEndpoint: new URL('/receipt/', options.url), - // }) - // await w3up.addSpace(await parseW3Proof(options.proof)) - // return w3up + const url = new URL(options.url) + const principal = ed25519.parse(options.principal) + const connection = connect({ + id: { did: () => 'did:web:web3.storage' }, + codec: CAR.outbound, + channel: HTTP.open({ + url, + method: 'POST', + }), + }) + const store = new StoreMemory() + const w3up = await W3upClient.create({ + principal, + store, + serviceConf: { + upload: connection, + access: connection, + filecoin: connection, + }, + receiptsEndpoint: new URL('/receipt/', options.url), + }) + await w3up.addSpace(await parseW3Proof(options.proof)) + return w3up } diff --git a/yarn.lock b/yarn.lock index b1e2a796ec..b08e8349c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5396,7 +5396,7 @@ multiformats "^11.0.2" one-webcrypto "^1.0.3" -"@ucanto/transport@^9.0.0": +"@ucanto/transport@^9.0.0", "@ucanto/transport@^9.1.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@ucanto/transport/-/transport-9.1.0.tgz#e37026d0cd389604cf85f62d7dc165ca5de50f06" integrity sha512-3pLXEg9YIH0NN1faBh0Xaioxbb2JtPL+4AFtQtmO8LnRyqGnTahZwwaM8XFL5eMBAp0pYDoZaQ6wdMce0t1cAQ== @@ -5514,10 +5514,10 @@ type-fest "^4.9.0" uint8arrays "^4.0.6" -"@web3-storage/capabilities@^12.1.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-12.1.0.tgz#78ab87167ff0f61216853bfb8163596ce5818667" - integrity sha512-SlYdPqCokDHb55zlZOvh+n8uEMOrEU413Z1MzQ8HvULpbzfcEtGyOiDgrAhdNEZtPnWHqaUEtU7o829Yw2Ra5w== +"@web3-storage/capabilities@^13.1.1": + version "13.1.1" + resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-13.1.1.tgz#bd14331e2f73554e105548dde07f74dee6eaf189" + integrity sha512-yQwrjhqwXGc1z8FCs7dCMsNp+G1LCrPq8RWCrflHA0rlISyMez6DQQpOJrCfao/MSk30nzPSzIm+FX/k3+8knw== dependencies: "@ucanto/core" "^9.0.1" "@ucanto/interface" "^9.0.0" @@ -5526,15 +5526,15 @@ "@ucanto/validator" "^9.0.1" "@web3-storage/data-segment" "^3.2.0" -"@web3-storage/capabilities@^13.1.1": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-13.1.1.tgz#bd14331e2f73554e105548dde07f74dee6eaf189" - integrity sha512-yQwrjhqwXGc1z8FCs7dCMsNp+G1LCrPq8RWCrflHA0rlISyMez6DQQpOJrCfao/MSk30nzPSzIm+FX/k3+8knw== +"@web3-storage/capabilities@^13.2.0": + version "13.2.0" + resolved "https://registry.yarnpkg.com/@web3-storage/capabilities/-/capabilities-13.2.0.tgz#3f268f7e4cc41385e1dff4426968488c1c350a85" + integrity sha512-KYqyW4RNrDPdogSANcmME0+Ci+FLQfTCkYUMfpp67K5hymCz25e8KWSHBSR+lCO9ggSuD4q49zi1LEid8ISIQg== dependencies: "@ucanto/core" "^9.0.1" "@ucanto/interface" "^9.0.0" "@ucanto/principal" "^9.0.0" - "@ucanto/transport" "^9.0.0" + "@ucanto/transport" "^9.1.0" "@ucanto/validator" "^9.0.1" "@web3-storage/data-segment" "^3.2.0" @@ -5558,32 +5558,41 @@ multiformats "^11.0.2" sync-multihash-sha2 "^1.0.0" +"@web3-storage/data-segment@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@web3-storage/data-segment/-/data-segment-5.1.0.tgz#f04505cf1b576f75de319d29cda8049a49abad8e" + integrity sha512-FYdmtKvNiVz+maZ++k4PdD43rfJW5DeagLpstq2y84CyOKNRBWbHLCZ/Ec5zT9iGI+0WgsCGbpC/WlG0jlrnhA== + dependencies: + "@ipld/dag-cbor" "^9.0.5" + multiformats "^11.0.2" + sync-multihash-sha2 "^1.0.0" + "@web3-storage/did-mailto@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@web3-storage/did-mailto/-/did-mailto-2.1.0.tgz#4ba7bd52772e48181d78ece0bdc27728857e919e" integrity sha512-TRmfSXj1IhtX3ESurSNOylZSBKi0z/VJNoMLpof+AVRdovgZjjocpiePQTs2pfHKqHTHfJXc9AboWyK4IKTWMw== -"@web3-storage/filecoin-client@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@web3-storage/filecoin-client/-/filecoin-client-3.2.0.tgz#d67d1dd723722df3f1f18b12c48a863cba6e8d86" - integrity sha512-4kSyXcN7jPAnpO2U8afheYBRJ4E/8aRJvCvPgHF+HZEtEaLHYuuQzU72Aro94qV0bm5ZRxXPNh6wRSlz/XZLlg== +"@web3-storage/filecoin-client@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@web3-storage/filecoin-client/-/filecoin-client-3.3.0.tgz#d6fb01dca5f285c709cbf8d0c24656cc4b4cad50" + integrity sha512-+49+PJN6ebzJvArikZqWk7TdhkwPYRC8k+Q7d8E8drSeDIn2/WKqkokq6bgWe05U+iMxLypvn14x2QBN4AgZ7g== dependencies: "@ipld/dag-ucan" "^3.4.0" "@ucanto/client" "^9.0.0" "@ucanto/core" "^9.0.1" "@ucanto/interface" "^9.0.0" - "@ucanto/transport" "^9.0.0" - "@web3-storage/capabilities" "^12.1.0" + "@ucanto/transport" "^9.1.0" + "@web3-storage/capabilities" "^13.1.1" "@web3-storage/multipart-parser@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== -"@web3-storage/upload-client@^13.0.1": - version "13.0.1" - resolved "https://registry.yarnpkg.com/@web3-storage/upload-client/-/upload-client-13.0.1.tgz#910e6e904f652f3907cca1c5c873dd42e84f630d" - integrity sha512-vfAtp1qIIgcoNQ21X/+jrHZjQU28af516YWWkYWbGV68dBzBd9c7r+8KjQwRDIV8kSl0Pmho6Dy1OWlhpZfE6g== +"@web3-storage/upload-client@^13.1.0": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@web3-storage/upload-client/-/upload-client-13.1.0.tgz#e29beb5ab0991682c28bcfe8c318aca42e43041c" + integrity sha512-RK67hUFviFG7KdupTwbMJCPdIsGEBSzpllybIOzbip3FKVH4fKDq4Sb2kXLptXeeqQfPJ86uRTmFtHTAVGVbZw== dependencies: "@ipld/car" "^5.2.2" "@ipld/dag-cbor" "^9.0.6" @@ -5591,31 +5600,31 @@ "@ipld/unixfs" "^2.1.1" "@ucanto/client" "^9.0.0" "@ucanto/interface" "^9.0.0" - "@ucanto/transport" "^9.0.0" - "@web3-storage/capabilities" "^13.1.1" - fr32-sha2-256-trunc254-padded-binary-tree-multihash "^3.3.0" + "@ucanto/transport" "^9.1.0" + "@web3-storage/capabilities" "^13.2.0" + "@web3-storage/data-segment" "^5.1.0" + "@web3-storage/filecoin-client" "^3.3.0" ipfs-utils "^9.0.14" multiformats "^12.1.2" p-retry "^5.1.2" - parallel-transform-web "^1.0.1" varint "^6.0.0" -"@web3-storage/w3up-client@^12.4.1": - version "12.4.1" - resolved "https://registry.yarnpkg.com/@web3-storage/w3up-client/-/w3up-client-12.4.1.tgz#10f989c08b0961168489fb4f310f96fa9aff37b0" - integrity sha512-Ti4k5UScn5kdF0A5rz0WkDefD0LofUCUJNDGRYQFudw17FmaZHfQGSQvZ0CozYrCJg8K7JPTbU4/m3joWu0ufQ== +"@web3-storage/w3up-client@^12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@web3-storage/w3up-client/-/w3up-client-12.5.0.tgz#67663f6c024bb7d198b2030f7752b139e5d3f9ae" + integrity sha512-SLpXXgA0TZJNSGtLHeq2kF+uwaHYfsH5068utikeRccCXJRrKQnCN1y2FpCe01H4SjLMTIQK13vga6DgSfJiuA== dependencies: "@ipld/dag-ucan" "^3.4.0" "@ucanto/client" "^9.0.0" "@ucanto/core" "^9.0.1" "@ucanto/interface" "^9.0.0" "@ucanto/principal" "^9.0.0" - "@ucanto/transport" "^9.0.0" + "@ucanto/transport" "^9.1.0" "@web3-storage/access" "^18.2.0" - "@web3-storage/capabilities" "^13.1.1" + "@web3-storage/capabilities" "^13.2.0" "@web3-storage/did-mailto" "^2.1.0" - "@web3-storage/filecoin-client" "^3.2.0" - "@web3-storage/upload-client" "^13.0.1" + "@web3-storage/filecoin-client" "^3.3.0" + "@web3-storage/upload-client" "^13.1.0" "@webassemblyjs/ast@1.11.1": version "1.11.1" @@ -11174,11 +11183,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fr32-sha2-256-trunc254-padded-binary-tree-multihash@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fr32-sha2-256-trunc254-padded-binary-tree-multihash/-/fr32-sha2-256-trunc254-padded-binary-tree-multihash-3.3.0.tgz#30e0aaa3594ea781a2d53505570604bfcd9c7085" - integrity sha512-O11VDxPmPvbQj5eac2BJXyieNacyd+RCMhwOzXQQM/NCI25x3c32YWB4/JwgOWPCpKnNXF6lpK/j0lj7GWOnYQ== - fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -17010,11 +17014,6 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -parallel-transform-web@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parallel-transform-web/-/parallel-transform-web-1.0.1.tgz#db2f9650459588298b1fedc0b4a159b078e52248" - integrity sha512-RtPU/7IuwPZ4ePcqoPxNCpjtaXYOkCVtnhh5tW3O78wy9jqVoV2hQHms17kUeu8DTYoOP+mykFLg2agwVKlwBw== - parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" From f18264c2f603e52e288cc85532b4f5edb4f9b579 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:20:17 -0700 Subject: [PATCH 35/46] api context tries to construct a w3up-client --- packages/api/src/routes/nfts-upload.js | 6 ++++-- packages/api/src/utils/context.js | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index c9c2c31c05..e970c4717c 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -112,8 +112,10 @@ export async function nftUpload(event, ctx) { W3_NFTSTORAGE_PROOF: ctx.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: ctx.W3_NFTSTORAGE_SPACE, } - console.log('in nfts-upload handler w/ w3up', w3upConfig) - + console.log('in nfts-upload handler w/ w3up', { + ...w3upConfig, + w3up: ctx.w3up, + }) if (ctx.W3UP_URL) { const w3upResponse = await fetch(ctx.W3UP_URL) } diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index 58aff37beb..e06d32eb15 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -7,6 +7,7 @@ import { Logging } from './logs.js' import pkg from '../../package.json' import { Service } from 'ucan-storage/service' import { LinkdexApi } from './linkdex.js' +import { createW3upClientFromConfig } from './w3up.js' /** * Obtains a route context object. @@ -69,7 +70,22 @@ export async function getContext(event, params) { W3_NFTSTORAGE_PROOF: config.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: config.W3_NFTSTORAGE_SPACE, } - console.log('in getContext', w3upConfig) + let w3up + if ( + config.W3UP_URL && + config.W3_NFTSTORAGE_PRINCIPAL && + config.W3_NFTSTORAGE_PROOF + ) { + try { + w3up = await createW3upClientFromConfig({ + url: config.W3UP_URL, + principal: config.W3_NFTSTORAGE_PRINCIPAL, + proof: config.W3_NFTSTORAGE_PROOF, + }) + } catch (error) { + console.error(`error creatong w3up-client from config`, error) + } + } return { ...w3upConfig, params, @@ -79,5 +95,6 @@ export async function getContext(event, params) { r2Uploader, log, ucanService, + w3up, } } From 8cc567639fdd91f8e2f2aa420a14df89e9382f27 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:29:02 -0700 Subject: [PATCH 36/46] add W3_NFTSTORAGE_ vars to ret of serviceConfigFromVariables --- packages/api/src/config.js | 3 +++ packages/api/src/utils/context.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/api/src/config.js b/packages/api/src/config.js index 1a52da6648..7c2eae41a6 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -63,6 +63,9 @@ export function serviceConfigFromVariables(vars) { COMMITHASH: vars.NFT_STORAGE_COMMITHASH || NFT_STORAGE_COMMITHASH, W3UP_URL: vars.W3UP_URL, + W3_NFTSTORAGE_PRINCIPAL: vars.W3_NFTSTORAGE_PRINCIPAL, + W3_NFTSTORAGE_PROOF: vars.W3_NFTSTORAGE_PROOF, + W3_NFTSTORAGE_SPACE: vars.W3_NFTSTORAGE_SPACE, } } diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index e06d32eb15..9ae34c2593 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -83,7 +83,7 @@ export async function getContext(event, params) { proof: config.W3_NFTSTORAGE_PROOF, }) } catch (error) { - console.error(`error creatong w3up-client from config`, error) + console.error(`error creating w3up-client from config`, error) } } return { From fa84813f1db29918966da0c3a559eca2524aea3f Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:34:56 -0700 Subject: [PATCH 37/46] fix how test creates W3_NFTSTORAGE_PRINCIPAL value --- packages/api/test/nfts-upload.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index ee59afc840..71768de91d 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -44,7 +44,7 @@ test.before(async (t) => { LINKDEX_URL: linkdexUrl, W3UP_URL: (await mockW3up).url.toString(), W3_NFTSTORAGE_SPACE: (await nftStorageSpace).did(), - W3_NFTSTORAGE_PRINCIPAL: (await nftStorageApiPrincipal).did(), + W3_NFTSTORAGE_PRINCIPAL: ed25519.format(await nftStorageApiPrincipal), W3_NFTSTORAGE_PROOF: ( await encodeDelegationAsCid( await delegate({ From 96fe60f6ce5614c25f23435becd37aef37d40f38 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:51:25 -0700 Subject: [PATCH 38/46] parseW3Proof allows base32 --- packages/api/src/utils/w3up.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index a0d74b37a6..52d733be36 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -2,7 +2,9 @@ import * as W3UP from '@web3-storage/w3up-client' import * as ed25519 from '@ucanto/principal/ed25519' import { StoreMemory } from '@web3-storage/access/stores/store-memory' import { CID } from 'multiformats/cid' +import * as bases from 'multiformats/bases/base' import { base64 } from 'multiformats/bases/base64' +import { base32 } from 'multiformats/bases/base32' import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' @@ -27,12 +29,12 @@ export async function getW3upClient({ principal, proof } = {}) { } /** - * @param {string} proof + * @param {string} proof - UCAN Delegation encoded as CID (multicodec=CAR, multihash=identity) */ async function parseW3Proof(proof) { let cid try { - cid = CID.parse(proof, base64) + cid = CID.parse(proof, bases.or(base64, base32)) } catch (/** @type {any} */ err) { if (err?.message?.includes('Unexpected end of data')) { console.error( From 21713903070279c660e4e1c87f5433748c96ec6f Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:57:19 -0700 Subject: [PATCH 39/46] proof cid for test uses base64 multibase --- packages/api/src/utils/w3up.js | 3 +-- packages/api/test/nfts-upload.spec.js | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index 52d733be36..e9e622efe8 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -4,7 +4,6 @@ import { StoreMemory } from '@web3-storage/access/stores/store-memory' import { CID } from 'multiformats/cid' import * as bases from 'multiformats/bases/base' import { base64 } from 'multiformats/bases/base64' -import { base32 } from 'multiformats/bases/base32' import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' @@ -34,7 +33,7 @@ export async function getW3upClient({ principal, proof } = {}) { async function parseW3Proof(proof) { let cid try { - cid = CID.parse(proof, bases.or(base64, base32)) + cid = CID.parse(proof, base64) } catch (/** @type {any} */ err) { if (err?.message?.includes('Unexpected end of data')) { console.error( diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 71768de91d..330c9d20cf 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -30,6 +30,7 @@ import { createServer } from 'node:http' import { ed25519 } from '@ucanto/principal' import { delegate } from '@ucanto/core' import { encodeDelegationAsCid } from '../src/utils/w3up.js' +import { base64 } from 'multiformats/bases/base64' const __dirname = path.dirname(fileURLToPath(import.meta.url)) @@ -56,7 +57,7 @@ test.before(async (t) => { ], }) ) - ).toString(), + ).toString(base64), }, }) }) From 05b65cbeb4f9f8481d64cf07a0c5f317358340b4 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Thu, 21 Mar 2024 17:26:27 -0700 Subject: [PATCH 40/46] rm unused import that breaks ci --- packages/api/src/utils/w3up.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index e9e622efe8..fa6dce84ca 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -2,7 +2,6 @@ import * as W3UP from '@web3-storage/w3up-client' import * as ed25519 from '@ucanto/principal/ed25519' import { StoreMemory } from '@web3-storage/access/stores/store-memory' import { CID } from 'multiformats/cid' -import * as bases from 'multiformats/bases/base' import { base64 } from 'multiformats/bases/base64' import { identity } from 'multiformats/hashes/identity' import { CarReader, CarWriter } from '@ipld/car' From 67665f7c20dcc600484654f2a4e07065c4d752ae Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:32:03 -0700 Subject: [PATCH 41/46] mock w3up uses ucanto. POST /upload/ handler does w3up.uploadCAR --- packages/api/package.json | 1 + packages/api/src/routes/nfts-upload.js | 23 +++++-- packages/api/src/utils/context.js | 5 +- packages/api/test/nfts-upload.spec.js | 51 ++++++++++++-- packages/api/test/utils/w3up-testing.js | 88 +++++++++++++++++++++++++ packages/api/wrangler.toml | 6 +- yarn.lock | 19 +++++- 7 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 packages/api/test/utils/w3up-testing.js diff --git a/packages/api/package.json b/packages/api/package.json index a41e176b1b..0d779a5ab2 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -29,6 +29,7 @@ "@supabase/postgrest-js": "^0.34.1", "@ucanto/core": "^9.0.1", "@ucanto/principal": "^9.0.0", + "@ucanto/server": "^9.0.1", "@web3-storage/access": "^18.2.0", "@web3-storage/car-block-validator": "^1.2.0", "@web3-storage/w3up-client": "^12.5.0", diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index e970c4717c..7f2b6ef233 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -31,6 +31,11 @@ export async function nftUpload(event, ctx) { /** @type {import('../utils/db-client-types').UploadOutput} */ let upload + /** + * blob that should be stored in w3up + * @type {Blob} + */ + let carBlobForW3up if (contentType.includes('multipart/form-data')) { const form = await event.request.formData() // Our API schema requires that all file parts be named `file` and @@ -49,7 +54,7 @@ export async function nftUpload(event, ctx) { input, wrapWithDirectory: true, }) - + carBlobForW3up = car upload = await uploadCar({ event, ctx, @@ -91,7 +96,7 @@ export async function nftUpload(event, ctx) { uploadType = 'Blob' structure = 'Complete' } - + carBlobForW3up = car upload = await uploadCar({ event, ctx, @@ -116,8 +121,18 @@ export async function nftUpload(event, ctx) { ...w3upConfig, w3up: ctx.w3up, }) - if (ctx.W3UP_URL) { - const w3upResponse = await fetch(ctx.W3UP_URL) + if (ctx.w3up) { + try { + await ctx.w3up.uploadCAR(carBlobForW3up) + console.warn('w3up.uploadCAR() succeeded in POST /upload/ handler') + } catch (error) { + // explicitly log so we can debug w/ cause + console.warn('error with w3up.uploadCAR', { + error, + cause: error?.cause, + }) + throw error + } } return new JSONResponse({ ok: true, value: toNFTResponse(upload) }) diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index 9ae34c2593..773362ac19 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -77,11 +77,14 @@ export async function getContext(event, params) { config.W3_NFTSTORAGE_PROOF ) { try { - w3up = await createW3upClientFromConfig({ + const w3upWIP = await createW3upClientFromConfig({ url: config.W3UP_URL, principal: config.W3_NFTSTORAGE_PRINCIPAL, proof: config.W3_NFTSTORAGE_PROOF, }) + // @ts-expect-error todo add DID check + w3upWIP.setCurrentSpace(config.W3_NFTSTORAGE_SPACE) + w3up = w3upWIP } catch (error) { console.error(`error creating w3up-client from config`, error) } diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 330c9d20cf..76afabe637 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -31,19 +31,42 @@ import { ed25519 } from '@ucanto/principal' import { delegate } from '@ucanto/core' import { encodeDelegationAsCid } from '../src/utils/w3up.js' import { base64 } from 'multiformats/bases/base64' +import { createMockW3up, locate } from './utils/w3up-testing.js' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const nftStorageSpace = ed25519.generate() const nftStorageApiPrincipal = ed25519.generate() -const mockW3up = createListeningMockW3up() +let mockW3upStoreAddCount = 0 +let mockW3upUploadAddCount = 0 +const mockW3up = Promise.resolve( + (async function () { + const server = createServer( + await createMockW3up({ + async onHandleStoreAdd(invocation) { + mockW3upStoreAddCount++ + }, + async onHandleUploadAdd(invocation) { + mockW3upUploadAddCount++ + }, + }) + ) + server.listen(0) + await new Promise((resolve) => + server.addListener('listening', () => resolve(undefined)) + ) + return { + server, + } + })() +) test.before(async (t) => { const linkdexUrl = 'http://fake.api.net' await setupMiniflareContext(t, { overrides: { LINKDEX_URL: linkdexUrl, - W3UP_URL: (await mockW3up).url.toString(), + W3UP_URL: locate((await mockW3up).server).url.toString(), W3_NFTSTORAGE_SPACE: (await nftStorageSpace).did(), W3_NFTSTORAGE_PRINCIPAL: ed25519.format(await nftStorageApiPrincipal), W3_NFTSTORAGE_PROOF: ( @@ -63,7 +86,7 @@ test.before(async (t) => { }) test.after(async (t) => { - ;(await mockW3up).close() + ;(await mockW3up).server.close() }) test.serial('should upload a single file', async (t) => { @@ -96,7 +119,8 @@ test.serial('should upload a single file', async (t) => { }) test.serial('should forward uploads to W3UP_URL', async (t) => { - const initialW3upRequestCount = (await mockW3up).requestCount + const initialW3upStoreAddCount = mockW3upStoreAddCount + const initialW3upUploadAddCount = mockW3upUploadAddCount const client = await createClientWithUser(t) const mf = getMiniflareContext(t) const file = new Blob(['hello world!'], { type: 'application/text' }) @@ -107,9 +131,22 @@ test.serial('should forward uploads to W3UP_URL', async (t) => { }) const { ok, value } = await res.json() t.truthy(ok, 'Server response payload has `ok` property') - const finalW3upRequestCount = (await mockW3up).requestCount - const w3upRequestCountDelta = finalW3upRequestCount - initialW3upRequestCount - t.is(w3upRequestCountDelta, 1, 'this upload sent one http request to w3up') + + const finalW3upStoreAddCount = mockW3upStoreAddCount + const storeAddCountDelta = finalW3upStoreAddCount - initialW3upStoreAddCount + t.is( + storeAddCountDelta, + 1, + 'this upload sent one valid store/add invocation to w3up' + ) + + const finalW3upUploadAddCount = mockW3upUploadAddCount + const uploadAddCountDelta = finalW3upUploadAddCount - initialW3upStoreAddCount + t.is( + storeAddCountDelta, + 1, + 'this upload sent one valid store/add invocation to w3up' + ) }) test.serial('should upload multiple blobs', async (t) => { diff --git a/packages/api/test/utils/w3up-testing.js b/packages/api/test/utils/w3up-testing.js new file mode 100644 index 0000000000..a6b97988a5 --- /dev/null +++ b/packages/api/test/utils/w3up-testing.js @@ -0,0 +1,88 @@ +import { Store, Upload, Filecoin } from '@web3-storage/capabilities' +import * as Server from '@ucanto/server' +import * as CAR from '@ucanto/transport/car' +import * as consumers from 'stream/consumers' +import { ed25519 } from '@ucanto/principal' + +/** + * create a RequestListener that can be a mock up.web3.storage + * @param {object} [options] - options + * @param {(invocation: import('@ucanto/server').ProviderInput>) => Promise} [options.onHandleStoreAdd] - called at start of store/add handler + * @param {(invocation: import('@ucanto/server').ProviderInput>) => Promise} [options.onHandleUploadAdd] - called at start of upload/add handler + */ +export async function createMockW3up(options = {}) { + const service = { + filecoin: { + offer: Server.provide(Filecoin.offer, async (invocation) => { + return {} + }), + }, + store: { + add: Server.provide(Store.add, async (invocation) => { + await options.onHandleStoreAdd?.(invocation) + /** @type {import('@web3-storage/access').StoreAddSuccessDone} */ + const success = { + status: 'done', + allocated: invocation.capability.nb.size, + link: invocation.capability.nb.link, + with: invocation.capability.with, + } + return { + ok: success, + } + }), + }, + upload: { + add: Server.provide(Upload.add, async (invocation) => { + await options.onHandleUploadAdd?.(invocation) + /** @type {import('@web3-storage/access').UploadAddSuccess} */ + const success = { + root: invocation.capability.nb.root, + } + return { + ok: success, + } + }), + }, + } + const serverId = (await ed25519.generate()).withDID('did:web:web3.storage') + const server = Server.create({ + id: serverId, + service, + codec: CAR.inbound, + validateAuthorization: () => ({ ok: {} }), + }) + /** @type {import('node:http').RequestListener} */ + const listener = async (req, res) => { + try { + const requestBody = new Uint8Array(await consumers.arrayBuffer(req)) + const response = await server.request({ + body: requestBody, + // @ts-expect-error slight mismatch. ignore like w3infra does + headers: req.headers, + }) + res.writeHead(200, response.headers) + res.write(response.body) + } catch (error) { + console.error('error in mock w3up', error) + res.writeHead(500) + res.write(JSON.stringify(error)) + } finally { + res.end() + } + } + return listener +} + +/** + * Get location of a server + * @param {import('http').Server} server - server that should be listening on the returned url + */ +export function locate(server) { + const address = server.address() + if (typeof address === 'string' || !address) + throw new Error(`unexpected address string`) + const { port } = address + const url = new URL(`http://localhost:${port}/`) + return { url } +} diff --git a/packages/api/wrangler.toml b/packages/api/wrangler.toml index 5ae7ac7a3d..18f43dd497 100644 --- a/packages/api/wrangler.toml +++ b/packages/api/wrangler.toml @@ -7,7 +7,11 @@ workers_dev = true # Compatibility flags https://github.com/cloudflare/wrangler/pull/2009 compatibility_date = "2021-08-23" -compatibility_flags = ["formdata_parser_supports_files"] +compatibility_flags = [ + "formdata_parser_supports_files", + "streams_enable_constructors", + "transformstream_enable_standard_constructor", +] no_bundle = true r2_buckets = [ # CAR files live here. diff --git a/yarn.lock b/yarn.lock index b08e8349c5..03b6903e59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5396,6 +5396,16 @@ multiformats "^11.0.2" one-webcrypto "^1.0.3" +"@ucanto/server@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@ucanto/server/-/server-9.0.1.tgz#949d38bd2dad30991220f5839608434d400c0bfc" + integrity sha512-EGhgKLjPgvM39j86WxSD7UoR0rr7jpTMclCOcpOEVC9r91sob8BReW2i7cm1zPvhSNFqS8rLjlGEgUIAhdAxmg== + dependencies: + "@ucanto/core" "^9.0.0" + "@ucanto/interface" "^9.0.0" + "@ucanto/principal" "^9.0.0" + "@ucanto/validator" "^9.0.0" + "@ucanto/transport@^9.0.0", "@ucanto/transport@^9.1.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@ucanto/transport/-/transport-9.1.0.tgz#e37026d0cd389604cf85f62d7dc165ca5de50f06" @@ -5404,7 +5414,7 @@ "@ucanto/core" "^9.0.1" "@ucanto/interface" "^9.0.0" -"@ucanto/validator@^9.0.1": +"@ucanto/validator@^9.0.0", "@ucanto/validator@^9.0.1": version "9.0.1" resolved "https://registry.yarnpkg.com/@ucanto/validator/-/validator-9.0.1.tgz#ab6458e4400365645119f1b843805fca80ea46b3" integrity sha512-H9GMOXHNW3vCv36eQZN1/h8zOXHEljRV5yNZ/huyOaJLVAKxt7Va1Ww8VBf2Ho/ac6P7jwvQRT7WgxaXx1/3Hg== @@ -18002,11 +18012,16 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.5.1, "prettier@>=2.2.1 <=2.3.0", prettier@^2.5.1: +prettier@2.5.1, prettier@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== +"prettier@>=2.2.1 <=2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" + integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== + pretty-error@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" From cdc9426d1f73f6f2ea3848e9959318b17b8ff584 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:37:32 -0700 Subject: [PATCH 42/46] fix test and dont log secrets --- packages/api/src/routes/nfts-upload.js | 16 +++++----------- packages/api/test/nfts-upload.spec.js | 7 ++++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index 7f2b6ef233..bb174f8de2 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -111,16 +111,6 @@ export async function nftUpload(event, ctx) { }) } - const w3upConfig = { - W3UP_URL: ctx.W3UP_URL, - W3_NFTSTORAGE_PRINCIPAL: ctx.W3_NFTSTORAGE_PRINCIPAL, - W3_NFTSTORAGE_PROOF: ctx.W3_NFTSTORAGE_PROOF, - W3_NFTSTORAGE_SPACE: ctx.W3_NFTSTORAGE_SPACE, - } - console.log('in nfts-upload handler w/ w3up', { - ...w3upConfig, - w3up: ctx.w3up, - }) if (ctx.w3up) { try { await ctx.w3up.uploadCAR(carBlobForW3up) @@ -129,10 +119,14 @@ export async function nftUpload(event, ctx) { // explicitly log so we can debug w/ cause console.warn('error with w3up.uploadCAR', { error, - cause: error?.cause, + cause: /** @type any */ (error)?.cause, }) throw error } + } else { + console.warn( + 'nftUpload route skipping w3up storage due to missing ctx.w3up' + ) } return new JSONResponse({ ok: true, value: toNFTResponse(upload) }) diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 76afabe637..645e8eb4f8 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -141,11 +141,12 @@ test.serial('should forward uploads to W3UP_URL', async (t) => { ) const finalW3upUploadAddCount = mockW3upUploadAddCount - const uploadAddCountDelta = finalW3upUploadAddCount - initialW3upStoreAddCount + const uploadAddCountDelta = + finalW3upUploadAddCount - initialW3upUploadAddCount t.is( - storeAddCountDelta, + uploadAddCountDelta, 1, - 'this upload sent one valid store/add invocation to w3up' + 'this upload sent one valid upload/add invocation to w3up' ) }) From 3a66d40ea0f61a28efaa7adf12ecfddf7bfcc4be Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Fri, 22 Mar 2024 14:17:01 -0700 Subject: [PATCH 43/46] fix tsc error --- packages/api/test/utils/w3up-testing.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/api/test/utils/w3up-testing.js b/packages/api/test/utils/w3up-testing.js index a6b97988a5..b55df0e7a6 100644 --- a/packages/api/test/utils/w3up-testing.js +++ b/packages/api/test/utils/w3up-testing.js @@ -14,7 +14,9 @@ export async function createMockW3up(options = {}) { const service = { filecoin: { offer: Server.provide(Filecoin.offer, async (invocation) => { - return {} + return { + ok: {}, + } }), }, store: { From 9d46b27c157366eefa236d45d79cf0a3c8b34037 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:08:01 -0700 Subject: [PATCH 44/46] add feature switch for w3up upload --- decisions/20240313-try-w3up.md | 14 ++++----- packages/api/src/bindings.d.ts | 8 +++++ packages/api/src/config.js | 3 ++ packages/api/src/routes/nfts-upload.js | 41 +++++++++++++++++++------- packages/api/src/utils/context.js | 2 ++ packages/api/src/utils/db-client.js | 1 + packages/api/test/nfts-upload.spec.js | 25 ++++++++++++++-- packages/api/test/scripts/helpers.js | 12 ++++---- 8 files changed, 82 insertions(+), 24 deletions(-) diff --git a/decisions/20240313-try-w3up.md b/decisions/20240313-try-w3up.md index a9146591bd..fdc1e3af3a 100644 --- a/decisions/20240313-try-w3up.md +++ b/decisions/20240313-try-w3up.md @@ -86,13 +86,13 @@ configures how nft.storage will authenticate to web3.storage when sending invoca configures the capabilities that nft.storage has access to when interacting with web3.storage to store nfts. These capabilities will usually be UCAN delegations whose audience is the identifier of `W3_NFTSTORAGE_PRINCIPAL`. W3_NFTSTORAGE_PROOF needs to have proof rooted in W3_NFTSTORAGE_SPACE that authorize W3_NFTSTORAGE_PRINCIPAL to store in W3_NFTSTORAGE_SPACE. -##### `NFTSTORAGE_W3S_ALLOW_ACCOUNTS` Environment Variable +##### `W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS` Environment Variable configures feature switch for which nftstorage accounts will have new uploads stored in web3.storage. Note: this environment variable may not be a permanent addition to the codebase. It's only meant to be used as a feature switch that decouples enabling the new functionality from deploying the new code. After testing, we may remove or change this feature switch when it is no longer useful. -Format: JSON Array of Account Identifiers +Format: JSON Array of email address strings. #### UI Changes @@ -151,11 +151,11 @@ Prototype Happy path - [x] @gobengo set up nft.storage localdev to be able to hack on packages/api - [x] nft.storage/api: can be configured with W3_URL -- [ ] add deps on w3up-client, ucanto - - [ ] upgrade typescript past 5.x and node past 16 as is required by w3up-client+ucanto -- [ ] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime -- [ ] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 -- [ ] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage +- [x] add deps on w3up-client, ucanto + - [ x] upgrade typescript past 5.x and node past 16 as is required by w3up-client+ucanto +- [x] nft.storage/api: can be configured with `W3_NFTSTORAGE_PRINCIPAL` and `W3_NFTSTORAGE_PROOF` and use them to get a w3up-client at runtime +- [x] nft.storage/api: modify POST /upload/ handler to store using w3up-client@12 +- [x] nft.storage/api: add feature switch requiring allowlist for new uploads to store in web3.storage Rollout diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index c956fd083a..0cbf62c935 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -109,6 +109,13 @@ export interface ServiceConfiguration { /** did:key of the w3up space in which to store NFTs */ W3_NFTSTORAGE_SPACE?: string + + /** + * JSON array of strings that are emails whose uploads should be uploaded via w3up. + * This is meant as a feature switch to test new functionality, + * and this configuration may be removed once the feature switch isn't needed to limit access. + */ + W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS?: string } export interface Ucan { @@ -145,6 +152,7 @@ export interface RouteContext { W3_NFTSTORAGE_PRINCIPAL?: string W3_NFTSTORAGE_PROOF?: string W3_NFTSTORAGE_SPACE?: string + W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS?: string w3up?: W3upClient } diff --git a/packages/api/src/config.js b/packages/api/src/config.js index 7c2eae41a6..fa022896fe 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -66,6 +66,8 @@ export function serviceConfigFromVariables(vars) { W3_NFTSTORAGE_PRINCIPAL: vars.W3_NFTSTORAGE_PRINCIPAL, W3_NFTSTORAGE_PROOF: vars.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: vars.W3_NFTSTORAGE_SPACE, + W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS: + vars.W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS, } } @@ -132,6 +134,7 @@ export function loadConfigVariables() { 'W3_NFTSTORAGE_SPACE', 'W3_NFTSTORAGE_PRINCIPAL', 'W3_NFTSTORAGE_PROOF', + 'W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS', ] for (const name of optional) { diff --git a/packages/api/src/routes/nfts-upload.js b/packages/api/src/routes/nfts-upload.js index bb174f8de2..d906ba2612 100644 --- a/packages/api/src/routes/nfts-upload.js +++ b/packages/api/src/routes/nfts-upload.js @@ -112,16 +112,19 @@ export async function nftUpload(event, ctx) { } if (ctx.w3up) { - try { - await ctx.w3up.uploadCAR(carBlobForW3up) - console.warn('w3up.uploadCAR() succeeded in POST /upload/ handler') - } catch (error) { - // explicitly log so we can debug w/ cause - console.warn('error with w3up.uploadCAR', { - error, - cause: /** @type any */ (error)?.cause, - }) - throw error + if (!w3upFeatureSwitchEnabled(ctx, { user })) { + console.warn(`skipping w3up upload. Feature switch does not allow it.`) + } else { + try { + await ctx.w3up.uploadCAR(carBlobForW3up) + } catch (error) { + // explicitly log so we can debug w/ cause + console.warn('error with w3up.uploadCAR', { + error, + cause: /** @type any */ (error)?.cause, + }) + throw error + } } } else { console.warn( @@ -132,6 +135,24 @@ export async function nftUpload(event, ctx) { return new JSONResponse({ ok: true, value: toNFTResponse(upload) }) } +/** + * returns whether w3up uploading feature is enabled given context + event + * @param {object} context - context of server operation, e.g. including configuration of feature switch + * @param {string} [context.W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS] - JSON array of allowed emails + * @param {object} event - specific event for which we should determine whether w3up feature is enabled + * @param {object} event.user + * @param {string} event.user.email - email address of user associated with event + */ +function w3upFeatureSwitchEnabled(context, event) { + const { W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS = '[]' } = context + const allowedEmails = JSON.parse(W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS) + if (!Array.isArray(allowedEmails)) return false + const eventHasAllowedEmail = allowedEmails.find( + (allowed) => allowed === event.user.email + ) + return eventHasAllowedEmail +} + /** * @typedef {{ * event: FetchEvent, diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index 773362ac19..f2f604b01a 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -69,6 +69,8 @@ export async function getContext(event, params) { W3_NFTSTORAGE_PRINCIPAL: config.W3_NFTSTORAGE_PRINCIPAL, W3_NFTSTORAGE_PROOF: config.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: config.W3_NFTSTORAGE_SPACE, + W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS: + config.W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS, } let w3up if ( diff --git a/packages/api/src/utils/db-client.js b/packages/api/src/utils/db-client.js index e345eccd78..cd8159934f 100644 --- a/packages/api/src/utils/db-client.js +++ b/packages/api/src/utils/db-client.js @@ -111,6 +111,7 @@ export class DBClient { magic_link_id, github_id, did, + email, keys:auth_key_user_id_fkey(user_id,id,name,secret,deleted_at), tags:user_tag_user_id_fkey(user_id,id,tag,value) ` diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 645e8eb4f8..3c3ba198b0 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -37,6 +37,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)) const nftStorageSpace = ed25519.generate() const nftStorageApiPrincipal = ed25519.generate() +const nftStorageAccountEmailAllowListedForW3up = 'test+w3up@dev.nft.storage' let mockW3upStoreAddCount = 0 let mockW3upUploadAddCount = 0 const mockW3up = Promise.resolve( @@ -81,6 +82,9 @@ test.before(async (t) => { }) ) ).toString(base64), + W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS: JSON.stringify([ + nftStorageAccountEmailAllowListedForW3up, + ]), }, }) }) @@ -118,10 +122,13 @@ test.serial('should upload a single file', async (t) => { t.is(data.deleted_at, null) }) -test.serial('should forward uploads to W3UP_URL', async (t) => { +test.serial.only('should forward uploads to W3UP_URL', async (t) => { const initialW3upStoreAddCount = mockW3upStoreAddCount const initialW3upUploadAddCount = mockW3upUploadAddCount - const client = await createClientWithUser(t) + const client = await createClientWithUser(t, { + // note this email should be in W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS env var + email: nftStorageAccountEmailAllowListedForW3up, + }) const mf = getMiniflareContext(t) const file = new Blob(['hello world!'], { type: 'application/text' }) const res = await mf.dispatchFetch('http://miniflare.test/upload', { @@ -148,6 +155,20 @@ test.serial('should forward uploads to W3UP_URL', async (t) => { 1, 'this upload sent one valid upload/add invocation to w3up' ) + + // if similar request is made by user not in W3_NFTSTORAGE_ENABLE_W3UP_FOR_EMAILS allow list, + // that should not result in request to w3up + { + const storeAddCountBeforeClient2 = mockW3upStoreAddCount + const client2 = await createClientWithUser(t) + const response2 = await mf.dispatchFetch('http://miniflare.test/upload', { + method: 'POST', + headers: { Authorization: `Bearer ${client2.token}` }, + body: file, + }) + // should not have incremented + t.is(mockW3upStoreAddCount, storeAddCountBeforeClient2) + } }) test.serial('should upload multiple blobs', async (t) => { diff --git a/packages/api/test/scripts/helpers.js b/packages/api/test/scripts/helpers.js index 8071bb9862..8d0b9c5d39 100644 --- a/packages/api/test/scripts/helpers.js +++ b/packages/api/test/scripts/helpers.js @@ -40,7 +40,7 @@ export const getDBClient = (config) => { /** * @param {import('ava').ExecutionContext} t - * @param {{publicAddress?: string, issuer?: string, name?: string}} userInfo + * @param {{publicAddress?: string, issuer?: string, name?: string, email?: string}} userInfo */ export async function createTestUser(t, userInfo = {}) { const config = getTestServiceConfig(t) @@ -64,6 +64,7 @@ export async function createTestUser(t, userInfo = {}) { publicAddress, issuer, name, + email: userInfo.email, }) } @@ -98,7 +99,7 @@ async function createUserTag(rawClient, tag) { /** * @param {ServiceConfiguration} config - * @param {{publicAddress?: string, issuer?: string, name?: string, token?: string, addAccountRestriction?: boolean}} userInfo + * @param {{publicAddress?: string, issuer?: string, name?: string, token?: string, addAccountRestriction?: boolean, email?: string}} userInfo */ export async function createTestUserWithFixedToken( config, @@ -108,13 +109,14 @@ export async function createTestUserWithFixedToken( issuer = `did:eth:${publicAddress}`, name = 'A Tester', addAccountRestriction = false, + email = 'a.tester@example.org', } = {} ) { const client = getDBClient(config) const rawClient = getRawClient(config) const { data: user, error } = await client .upsertUser({ - email: 'a.tester@example.org', + email, github_id: issuer, magic_link_id: issuer, name, @@ -173,7 +175,7 @@ export async function createTestUserWithFixedToken( }) } - return { token, userId: user.id, githubId: user.github_id } + return { token, userId: user.id, githubId: user.github_id, email } } export class DBTestClient { @@ -215,7 +217,7 @@ export class DBTestClient { } /** * @param {import('ava').ExecutionContext} t - * @param {{publicAddress?: string, issuer?: string, name?: string, token?: string}} [userInfo] + * @param {{publicAddress?: string, issuer?: string, name?: string, token?: string, email?: string}} [userInfo] */ export async function createClientWithUser(t, userInfo) { const serviceConfig = await getTestServiceConfig(t) From 9462e072c0cd3bc1f7cc938a007712e113c0a425 Mon Sep 17 00:00:00 2001 From: bengo <171782+gobengo@users.noreply.github.com> Date: Fri, 22 Mar 2024 16:33:40 -0700 Subject: [PATCH 45/46] remove .only from test --- packages/api/test/nfts-upload.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 3c3ba198b0..0a33f27417 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -122,7 +122,7 @@ test.serial('should upload a single file', async (t) => { t.is(data.deleted_at, null) }) -test.serial.only('should forward uploads to W3UP_URL', async (t) => { +test.serial('should forward uploads to W3UP_URL', async (t) => { const initialW3upStoreAddCount = mockW3upStoreAddCount const initialW3upUploadAddCount = mockW3upUploadAddCount const client = await createClientWithUser(t, { From fc159392bb0305653847e095ce5caa75d7aee378 Mon Sep 17 00:00:00 2001 From: Travis Vachon Date: Wed, 27 Mar 2024 16:32:33 -0700 Subject: [PATCH 46/46] fix: updates from Alan's review this addresses most of the feedback: - fail to start if w3up client principal is not passed - move function to test helpers - make w3up service DID configurable --- packages/api/src/bindings.d.ts | 4 +++ packages/api/src/config.js | 2 ++ packages/api/src/utils/context.js | 4 +++ packages/api/src/utils/w3up.js | 41 ++++------------------- packages/api/test/nfts-upload.spec.js | 10 ++++-- packages/api/test/utils/w3up-testing.js | 43 +++++++++++++++++++++++-- 6 files changed, 66 insertions(+), 38 deletions(-) diff --git a/packages/api/src/bindings.d.ts b/packages/api/src/bindings.d.ts index 0cbf62c935..8af47c0c21 100644 --- a/packages/api/src/bindings.d.ts +++ b/packages/api/src/bindings.d.ts @@ -101,6 +101,9 @@ export interface ServiceConfiguration { /** w3up connection URL (e.g. https://up.web3.storage) */ W3UP_URL?: string + /** w3up service DID (e.g. did:web:web3.storage) */ + W3UP_DID?: string + /** base64 encoded multiformats ed25519 secretKey */ W3_NFTSTORAGE_PRINCIPAL?: string @@ -148,6 +151,7 @@ export interface RouteContext { r2Uploader: Uploader ucanService: Service auth?: Auth + W3UP_DID?: string W3UP_URL?: string W3_NFTSTORAGE_PRINCIPAL?: string W3_NFTSTORAGE_PROOF?: string diff --git a/packages/api/src/config.js b/packages/api/src/config.js index fa022896fe..a835b7afde 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -63,6 +63,7 @@ export function serviceConfigFromVariables(vars) { COMMITHASH: vars.NFT_STORAGE_COMMITHASH || NFT_STORAGE_COMMITHASH, W3UP_URL: vars.W3UP_URL, + W3UP_DID: vars.W3UP_DID, W3_NFTSTORAGE_PRINCIPAL: vars.W3_NFTSTORAGE_PRINCIPAL, W3_NFTSTORAGE_PROOF: vars.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: vars.W3_NFTSTORAGE_SPACE, @@ -131,6 +132,7 @@ export function loadConfigVariables() { 'S3_ENDPOINT', 'SLACK_USER_REQUEST_WEBHOOK_URL', 'W3UP_URL', + 'W3UP_DID', 'W3_NFTSTORAGE_SPACE', 'W3_NFTSTORAGE_PRINCIPAL', 'W3_NFTSTORAGE_PROOF', diff --git a/packages/api/src/utils/context.js b/packages/api/src/utils/context.js index f2f604b01a..2cbfcc2e3a 100644 --- a/packages/api/src/utils/context.js +++ b/packages/api/src/utils/context.js @@ -8,6 +8,7 @@ import pkg from '../../package.json' import { Service } from 'ucan-storage/service' import { LinkdexApi } from './linkdex.js' import { createW3upClientFromConfig } from './w3up.js' +import { DID } from '@ucanto/core' /** * Obtains a route context object. @@ -66,6 +67,7 @@ export async function getContext(event, params) { const w3upConfig = { W3UP_URL: config.W3UP_URL, + W3UP_DID: config.W3UP_DID, W3_NFTSTORAGE_PRINCIPAL: config.W3_NFTSTORAGE_PRINCIPAL, W3_NFTSTORAGE_PROOF: config.W3_NFTSTORAGE_PROOF, W3_NFTSTORAGE_SPACE: config.W3_NFTSTORAGE_SPACE, @@ -75,12 +77,14 @@ export async function getContext(event, params) { let w3up if ( config.W3UP_URL && + config.W3UP_DID && config.W3_NFTSTORAGE_PRINCIPAL && config.W3_NFTSTORAGE_PROOF ) { try { const w3upWIP = await createW3upClientFromConfig({ url: config.W3UP_URL, + did: DID.parse(config.W3UP_DID).did(), principal: config.W3_NFTSTORAGE_PRINCIPAL, proof: config.W3_NFTSTORAGE_PROOF, }) diff --git a/packages/api/src/utils/w3up.js b/packages/api/src/utils/w3up.js index fa6dce84ca..8aff4a3758 100644 --- a/packages/api/src/utils/w3up.js +++ b/packages/api/src/utils/w3up.js @@ -4,9 +4,8 @@ import { StoreMemory } from '@web3-storage/access/stores/store-memory' import { CID } from 'multiformats/cid' import { base64 } from 'multiformats/bases/base64' import { identity } from 'multiformats/hashes/identity' -import { CarReader, CarWriter } from '@ipld/car' +import { CarReader } from '@ipld/car' import { importDAG } from '@ucanto/core/delegation' -import * as ucanto from '@ucanto/core' import * as W3upClient from '@web3-storage/w3up-client' import { connect } from '@ucanto/client' import { CAR, HTTP } from '@ucanto/transport' @@ -17,7 +16,10 @@ import { CAR, HTTP } from '@ucanto/transport' * @param {string|undefined} [env.proof] */ export async function getW3upClient({ principal, proof } = {}) { - const signer = principal ? ed25519.parse(principal) : await ed25519.generate() + if (!principal) { + throw new Error('could not get w3up client, no principal was passed') + } + const signer = ed25519.parse(principal) const store = new StoreMemory() const w3up = await W3UP.create({ principal: signer, store }) if (proof) { @@ -72,47 +74,18 @@ export async function readProofFromBytes(bytes) { } } -/** - * @param {import('@ucanto/interface').Delegation} delegation - delegation to encode - */ -export async function encodeDelegationAsCid(delegation) { - const { writer, out } = CarWriter.create() - /** @type {Array} */ - const carChunks = [] - await Promise.all([ - // write delegation blocks - (async () => { - for (const block of delegation.export()) { - // @ts-expect-error different Block types - await writer.put(block) - } - await writer.close() - })(), - // read out - (async () => { - for await (const chunk of out) { - carChunks.push(chunk) - } - })(), - ]) - // now get car chunks - const car = new Blob(carChunks) - const bytes = new Uint8Array(await car.arrayBuffer()) - const cid = CID.createV1(ucanto.CAR.code, identity.digest(bytes)) - return cid -} - /** * @param {object} options * @param {string} options.url * @param {string} options.principal * @param {string} options.proof + * @param {import('@ucanto/interface').DID} options.did */ export async function createW3upClientFromConfig(options) { const url = new URL(options.url) const principal = ed25519.parse(options.principal) const connection = connect({ - id: { did: () => 'did:web:web3.storage' }, + id: { did: () => options.did }, codec: CAR.outbound, channel: HTTP.open({ url, diff --git a/packages/api/test/nfts-upload.spec.js b/packages/api/test/nfts-upload.spec.js index 0a33f27417..283c940f20 100644 --- a/packages/api/test/nfts-upload.spec.js +++ b/packages/api/test/nfts-upload.spec.js @@ -29,21 +29,26 @@ import { createCarCid } from '../src/utils/car.js' import { createServer } from 'node:http' import { ed25519 } from '@ucanto/principal' import { delegate } from '@ucanto/core' -import { encodeDelegationAsCid } from '../src/utils/w3up.js' import { base64 } from 'multiformats/bases/base64' -import { createMockW3up, locate } from './utils/w3up-testing.js' +import { + createMockW3up, + locate, + encodeDelegationAsCid, +} from './utils/w3up-testing.js' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const nftStorageSpace = ed25519.generate() const nftStorageApiPrincipal = ed25519.generate() const nftStorageAccountEmailAllowListedForW3up = 'test+w3up@dev.nft.storage' +const mockW3upDID = 'did:web:test.web3.storage' let mockW3upStoreAddCount = 0 let mockW3upUploadAddCount = 0 const mockW3up = Promise.resolve( (async function () { const server = createServer( await createMockW3up({ + did: mockW3upDID, async onHandleStoreAdd(invocation) { mockW3upStoreAddCount++ }, @@ -68,6 +73,7 @@ test.before(async (t) => { overrides: { LINKDEX_URL: linkdexUrl, W3UP_URL: locate((await mockW3up).server).url.toString(), + W3UP_DID: mockW3upDID, W3_NFTSTORAGE_SPACE: (await nftStorageSpace).did(), W3_NFTSTORAGE_PRINCIPAL: ed25519.format(await nftStorageApiPrincipal), W3_NFTSTORAGE_PROOF: ( diff --git a/packages/api/test/utils/w3up-testing.js b/packages/api/test/utils/w3up-testing.js index b55df0e7a6..0df210ff6f 100644 --- a/packages/api/test/utils/w3up-testing.js +++ b/packages/api/test/utils/w3up-testing.js @@ -3,14 +3,51 @@ import * as Server from '@ucanto/server' import * as CAR from '@ucanto/transport/car' import * as consumers from 'stream/consumers' import { ed25519 } from '@ucanto/principal' +import { CarWriter } from '@ipld/car' +import * as ucanto from '@ucanto/core' +import { CID } from 'multiformats/cid' +import { identity } from 'multiformats/hashes/identity' + +/** + * @param {import('@ucanto/interface').Delegation} delegation - delegation to encode + */ +export async function encodeDelegationAsCid(delegation) { + const { writer, out } = CarWriter.create() + /** @type {Array} */ + const carChunks = [] + await Promise.all([ + // write delegation blocks + (async () => { + for (const block of delegation.export()) { + // @ts-expect-error different Block types + await writer.put(block) + } + await writer.close() + })(), + // read out + (async () => { + for await (const chunk of out) { + carChunks.push(chunk) + } + })(), + ]) + // now get car chunks + const car = new Blob(carChunks) + const bytes = new Uint8Array(await car.arrayBuffer()) + const cid = CID.createV1(ucanto.CAR.code, identity.digest(bytes)) + return cid +} /** * create a RequestListener that can be a mock up.web3.storage * @param {object} [options] - options + * @param {string} options.did * @param {(invocation: import('@ucanto/server').ProviderInput>) => Promise} [options.onHandleStoreAdd] - called at start of store/add handler * @param {(invocation: import('@ucanto/server').ProviderInput>) => Promise} [options.onHandleUploadAdd] - called at start of upload/add handler */ -export async function createMockW3up(options = {}) { +export async function createMockW3up( + options = { did: 'did:web:test.web3.storage' } +) { const service = { filecoin: { offer: Server.provide(Filecoin.offer, async (invocation) => { @@ -47,7 +84,9 @@ export async function createMockW3up(options = {}) { }), }, } - const serverId = (await ed25519.generate()).withDID('did:web:web3.storage') + const serverId = (await ed25519.generate()).withDID( + ucanto.DID.parse(options.did).did() + ) const server = Server.create({ id: serverId, service,