From b5639770dea795b1c9afeb52dd0fdeb805db169f Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Wed, 25 Jan 2023 19:15:21 +0000 Subject: [PATCH 01/28] add turborepo ffi crate --- Cargo.lock | 19 +++++++++++++++++++ crates/turborepo-ffi/Cargo.toml | 1 - crates/turborepo-ffi/src/lib.rs | 1 - 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 033812eec99c8..c41b043c7b0bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -738,6 +738,25 @@ dependencies = [ "toml", ] +[[package]] +name = "cc" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb" +dependencies = [ + "clap 3.2.23", + "heck", + "indexmap", + "log", + "proc-macro2 1.0.50", + "quote 1.0.23", + "serde", + "serde_json", + "syn 1.0.107", + "tempfile", + "toml", +] + [[package]] name = "cc" version = "1.0.79" diff --git a/crates/turborepo-ffi/Cargo.toml b/crates/turborepo-ffi/Cargo.toml index d1b68436586e5..a9a57b5dede08 100644 --- a/crates/turborepo-ffi/Cargo.toml +++ b/crates/turborepo-ffi/Cargo.toml @@ -2,7 +2,6 @@ name = "turborepo-ffi" version = "0.1.0" edition = "2021" -license = "MPL-2.0" [lib] crate-type = ["staticlib"] diff --git a/crates/turborepo-ffi/src/lib.rs b/crates/turborepo-ffi/src/lib.rs index 00c95e420bc92..9438534cf921d 100644 --- a/crates/turborepo-ffi/src/lib.rs +++ b/crates/turborepo-ffi/src/lib.rs @@ -39,7 +39,6 @@ impl From for Buffer { } impl Buffer { - #[allow(dead_code)] fn into_proto(self) -> Result { // SAFETY // protobuf has a fairly strict schema so overrunning or underrunning the byte From 1f884c1d99359665c812033ba2d2635313e79f14 Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Wed, 25 Jan 2023 19:16:07 +0000 Subject: [PATCH 02/28] add turborepo ffi go module --- cli/Makefile | 2 -- cli/internal/ffi/ffi.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cli/Makefile b/cli/Makefile index 3d663f2e3fd24..febb57fc74b22 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -40,7 +40,6 @@ go-turbo$(EXT): $(GENERATED_FILES) $(SRC_FILES) go.mod turborepo-ffi-install turborepo-ffi-install: turborepo-ffi turborepo-ffi-copy-bindings cp ../crates/turborepo-ffi/target/release/libturborepo_ffi.a ./internal/ffi/libturborepo_ffi_$(GOOS)_$(GOARCH).a -.PHONY: turborepo-ffi turborepo-ffi: cd ../crates/turborepo-ffi && cargo build --release --target-dir ./target @@ -100,7 +99,6 @@ turborepo-ffi-linux-amd64: # end # -.PHONY: turborepo-ffi-proto turborepo-ffi-proto: protoc -I../crates/ ../crates/turborepo-ffi/messages.proto --go_out=./internal/ diff --git a/cli/internal/ffi/ffi.go b/cli/internal/ffi/ffi.go index 499e2c04ee846..41cec65bc5077 100644 --- a/cli/internal/ffi/ffi.go +++ b/cli/internal/ffi/ffi.go @@ -42,7 +42,7 @@ func Unmarshal[M proto.Message](b C.Buffer, c M) error { return nil } -// Marshal consumes a proto.Message and returns a bufferfire +// Marshal consumes a proto.Message and returns a buffer // // NOTE: the buffer must be freed by calling `Free` on it func Marshal[M proto.Message](c M) C.Buffer { From 6a51720cb3851937bbe7dcb7a226f49fd0aedead Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Mon, 30 Jan 2023 17:12:45 +0000 Subject: [PATCH 03/28] add license to turborepo-ffi --- crates/turborepo-ffi/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/turborepo-ffi/Cargo.toml b/crates/turborepo-ffi/Cargo.toml index a9a57b5dede08..d1b68436586e5 100644 --- a/crates/turborepo-ffi/Cargo.toml +++ b/crates/turborepo-ffi/Cargo.toml @@ -2,6 +2,7 @@ name = "turborepo-ffi" version = "0.1.0" edition = "2021" +license = "MPL-2.0" [lib] crate-type = ["staticlib"] From e4fdc1c2ca79409e439a3f789f751e160d23f955 Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Mon, 30 Jan 2023 17:32:50 +0000 Subject: [PATCH 04/28] add windows link statements --- cli/internal/ffi/ffi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/internal/ffi/ffi.go b/cli/internal/ffi/ffi.go index 41cec65bc5077..499e2c04ee846 100644 --- a/cli/internal/ffi/ffi.go +++ b/cli/internal/ffi/ffi.go @@ -42,7 +42,7 @@ func Unmarshal[M proto.Message](b C.Buffer, c M) error { return nil } -// Marshal consumes a proto.Message and returns a buffer +// Marshal consumes a proto.Message and returns a bufferfire // // NOTE: the buffer must be freed by calling `Free` on it func Marshal[M proto.Message](c M) C.Buffer { From 35afe666b8dce946b57801f795f5dba268753f4c Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Thu, 2 Feb 2023 12:12:05 +0000 Subject: [PATCH 05/28] make make targets PHONY --- cli/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/Makefile b/cli/Makefile index febb57fc74b22..3d663f2e3fd24 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -40,6 +40,7 @@ go-turbo$(EXT): $(GENERATED_FILES) $(SRC_FILES) go.mod turborepo-ffi-install turborepo-ffi-install: turborepo-ffi turborepo-ffi-copy-bindings cp ../crates/turborepo-ffi/target/release/libturborepo_ffi.a ./internal/ffi/libturborepo_ffi_$(GOOS)_$(GOARCH).a +.PHONY: turborepo-ffi turborepo-ffi: cd ../crates/turborepo-ffi && cargo build --release --target-dir ./target @@ -99,6 +100,7 @@ turborepo-ffi-linux-amd64: # end # +.PHONY: turborepo-ffi-proto turborepo-ffi-proto: protoc -I../crates/ ../crates/turborepo-ffi/messages.proto --go_out=./internal/ From db2b1f347b39d9d1b3670c595fa9c790510d5f2d Mon Sep 17 00:00:00 2001 From: Alexander Lyon Date: Thu, 2 Feb 2023 13:35:55 +0000 Subject: [PATCH 06/28] allow dead code for into_proto This API is going to be used later --- crates/turborepo-ffi/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/turborepo-ffi/src/lib.rs b/crates/turborepo-ffi/src/lib.rs index 9438534cf921d..00c95e420bc92 100644 --- a/crates/turborepo-ffi/src/lib.rs +++ b/crates/turborepo-ffi/src/lib.rs @@ -39,6 +39,7 @@ impl From for Buffer { } impl Buffer { + #[allow(dead_code)] fn into_proto(self) -> Result { // SAFETY // protobuf has a fairly strict schema so overrunning or underrunning the byte From 425ff57d9ee9a935e6f5615368a20acaa782f650 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 31 Jan 2023 16:04:25 -0800 Subject: [PATCH 07/28] add first pass of Rust npm lockfile --- Cargo.lock | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index c41b043c7b0bb..91d12de4c1d83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8078,6 +8078,16 @@ dependencies = [ "turborepo-paths", ] +[[package]] +name = "turborepo-lockfiles" +version = "0.1.0" +dependencies = [ + "petgraph", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "twox-hash" version = "1.6.3" From f831a6ccf66371f9c02de63de2be8e1a30b5c2b5 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Wed, 1 Feb 2023 14:54:22 -0800 Subject: [PATCH 08/28] add subgraph implementation --- crates/turborepo-lockfiles/src/npm.rs | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crates/turborepo-lockfiles/src/npm.rs b/crates/turborepo-lockfiles/src/npm.rs index 0039cda29beb1..4d403b6b26fa8 100644 --- a/crates/turborepo-lockfiles/src/npm.rs +++ b/crates/turborepo-lockfiles/src/npm.rs @@ -154,6 +154,41 @@ impl NpmLockfile { }) } + fn get_package(&self, package: impl AsRef) -> Result<&NpmPackage, Error> { + let pkg_str = package.as_ref(); + self.packages + .get(pkg_str) + .ok_or_else(|| Error::MissingPackage(pkg_str.to_string())) + } + + pub fn subgraph(&self, workspace_packages: &[&str], packages: &[&str]) -> Result { + let mut pruned_packages = HashMap::with_capacity(packages.len()); + for pkg_key in packages { + let pkg = self.get_package(pkg_key)?; + pruned_packages.insert(pkg_key.to_string(), pkg.clone()); + } + if let Some(root) = self.packages.get("") { + pruned_packages.insert("".into(), root.clone()); + } + for workspace in workspace_packages { + let pkg = self.get_package(workspace)?; + pruned_packages.insert(workspace.to_string(), pkg.clone()); + + for (key, entry) in &self.packages { + if entry.resolved.as_deref() == Some(workspace) { + pruned_packages.insert(key.clone(), entry.clone()); + break; + } + } + } + Ok(Self { + lockfile_version: 3, + packages: pruned_packages, + dependencies: HashMap::default(), + other: self.other.clone(), + }) + } + fn possible_npm_deps(key: &str, dep: &str) -> Vec { let mut possible_deps = vec![format!("{key}/node_modules/{dep}")]; From c85dfd7367e412fb9f813962a54c98791723baca Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 3 Feb 2023 15:52:07 -0800 Subject: [PATCH 09/28] add ffi bindings for npm lockfile --- Cargo.lock | 29 -------- cli/internal/lockfile/rust_npm_lockfile.go | 78 ++++++++++++++++++++++ cli/internal/packagemanager/npm.go | 2 +- crates/turborepo-ffi/src/lib.rs | 2 + crates/turborepo-lockfiles/src/npm.rs | 35 ---------- 5 files changed, 81 insertions(+), 65 deletions(-) create mode 100644 cli/internal/lockfile/rust_npm_lockfile.go diff --git a/Cargo.lock b/Cargo.lock index 91d12de4c1d83..033812eec99c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -738,25 +738,6 @@ dependencies = [ "toml", ] -[[package]] -name = "cc" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6358dedf60f4d9b8db43ad187391afe959746101346fe51bb978126bec61dfb" -dependencies = [ - "clap 3.2.23", - "heck", - "indexmap", - "log", - "proc-macro2 1.0.50", - "quote 1.0.23", - "serde", - "serde_json", - "syn 1.0.107", - "tempfile", - "toml", -] - [[package]] name = "cc" version = "1.0.79" @@ -8078,16 +8059,6 @@ dependencies = [ "turborepo-paths", ] -[[package]] -name = "turborepo-lockfiles" -version = "0.1.0" -dependencies = [ - "petgraph", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "twox-hash" version = "1.6.3" diff --git a/cli/internal/lockfile/rust_npm_lockfile.go b/cli/internal/lockfile/rust_npm_lockfile.go new file mode 100644 index 0000000000000..121c99d7e39ad --- /dev/null +++ b/cli/internal/lockfile/rust_npm_lockfile.go @@ -0,0 +1,78 @@ +// TODO add back build tags for Rust + +package lockfile + +import ( + "io" + + mapset "github.com/deckarep/golang-set" + "github.com/vercel/turbo/cli/internal/ffi" + "github.com/vercel/turbo/cli/internal/turbopath" +) + +type NpmLockfileRust struct { + // We just story the entire lockfile in memory and pass it for every call + contents []byte +} + +func (l *NpmLockfileRust) ResolvePackage(workspacePath turbopath.AnchoredUnixPath, name string, version string) (Package, error) { + panic("UNUSED") +} + +func (l *NpmLockfileRust) AllDependencies(key string) (map[string]string, bool) { + panic("UNUSED") +} + +func (l *NpmLockfileRust) Subgraph(workspacePackages []turbopath.AnchoredSystemPath, packages []string) (Lockfile, error) { + workspaces := make([]string, len(workspacePackages)) + for i, workspace := range workspacePackages { + workspaces[i] = workspace.ToUnixPath().ToString() + } + contents, err := ffi.NpmSubgraph(l.contents, workspaces, packages) + if err != nil { + return nil, err + } + return &NpmLockfileRust{contents: contents}, nil +} + +func (l *NpmLockfileRust) Encode(w io.Writer) error { + // do we need to check num of bytes written? + _, err := w.Write(l.contents) + return err +} + +func (l *NpmLockfileRust) Patches() []turbopath.AnchoredUnixPath { + return nil +} + +func (l *NpmLockfileRust) GlobalChange(other Lockfile) bool { + // TODO we can probably just parse the json and look for known global changes + return false +} + +var _ (Lockfile) = (*NpmLockfileRust)(nil) + +func DecodeRustNpmLockfile(contents []byte) (Lockfile, error) { + return &NpmLockfileRust{contents: contents}, nil +} + +func NpmTransitiveDeps(lockfile *NpmLockfileRust, workspacePath turbopath.AnchoredUnixPath, unresolvedDeps map[string]string) (mapset.Set, error) { + // we convert pkg to + pkgDir := workspacePath.ToString() + + packages, err := ffi.NpmTransitiveDeps(lockfile.contents, pkgDir, unresolvedDeps) + if err != nil { + return nil, err + } + + deps := make([]interface{}, len(packages)) + for i, pkg := range packages { + deps[i] = Package{ + Found: pkg.Found, + Key: pkg.Key, + Version: pkg.Version, + } + } + + return mapset.NewSetFromSlice(deps), nil +} diff --git a/cli/internal/packagemanager/npm.go b/cli/internal/packagemanager/npm.go index ab42879903012..6f01c3f07081f 100644 --- a/cli/internal/packagemanager/npm.go +++ b/cli/internal/packagemanager/npm.go @@ -54,6 +54,6 @@ var nodejsNpm = PackageManager{ }, UnmarshalLockfile: func(contents []byte) (lockfile.Lockfile, error) { - return lockfile.DecodeNpmLockfile(contents) + return lockfile.DecodeRustNpmLockfile(contents) }, } diff --git a/crates/turborepo-ffi/src/lib.rs b/crates/turborepo-ffi/src/lib.rs index 00c95e420bc92..c12edd579d173 100644 --- a/crates/turborepo-ffi/src/lib.rs +++ b/crates/turborepo-ffi/src/lib.rs @@ -8,6 +8,8 @@ use std::{mem::ManuallyDrop, path::PathBuf}; pub use lockfile::{npm_subgraph, npm_transitive_closure}; +use turborepo_lockfiles::{npm_subgraph as real_npm_subgraph, transitive_closure, NpmLockfile}; + mod proto { include!(concat!(env!("OUT_DIR"), "/_.rs")); } diff --git a/crates/turborepo-lockfiles/src/npm.rs b/crates/turborepo-lockfiles/src/npm.rs index 4d403b6b26fa8..0039cda29beb1 100644 --- a/crates/turborepo-lockfiles/src/npm.rs +++ b/crates/turborepo-lockfiles/src/npm.rs @@ -154,41 +154,6 @@ impl NpmLockfile { }) } - fn get_package(&self, package: impl AsRef) -> Result<&NpmPackage, Error> { - let pkg_str = package.as_ref(); - self.packages - .get(pkg_str) - .ok_or_else(|| Error::MissingPackage(pkg_str.to_string())) - } - - pub fn subgraph(&self, workspace_packages: &[&str], packages: &[&str]) -> Result { - let mut pruned_packages = HashMap::with_capacity(packages.len()); - for pkg_key in packages { - let pkg = self.get_package(pkg_key)?; - pruned_packages.insert(pkg_key.to_string(), pkg.clone()); - } - if let Some(root) = self.packages.get("") { - pruned_packages.insert("".into(), root.clone()); - } - for workspace in workspace_packages { - let pkg = self.get_package(workspace)?; - pruned_packages.insert(workspace.to_string(), pkg.clone()); - - for (key, entry) in &self.packages { - if entry.resolved.as_deref() == Some(workspace) { - pruned_packages.insert(key.clone(), entry.clone()); - break; - } - } - } - Ok(Self { - lockfile_version: 3, - packages: pruned_packages, - dependencies: HashMap::default(), - other: self.other.clone(), - }) - } - fn possible_npm_deps(key: &str, dep: &str) -> Vec { let mut possible_deps = vec![format!("{key}/node_modules/{dep}")]; From 859ac2a83052ecb2868d521416be42f552dad084 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Thu, 9 Feb 2023 17:11:19 -0800 Subject: [PATCH 10/28] support go and rust codepath --- cli/internal/ffi/lockfile.go | 67 +++++++++++++++++++ cli/internal/lockfile/rust_npm_lockfile.go | 78 ---------------------- cli/internal/packagemanager/npm.go | 2 +- crates/turborepo-ffi/src/lib.rs | 2 +- 4 files changed, 69 insertions(+), 80 deletions(-) create mode 100644 cli/internal/ffi/lockfile.go delete mode 100644 cli/internal/lockfile/rust_npm_lockfile.go diff --git a/cli/internal/ffi/lockfile.go b/cli/internal/ffi/lockfile.go new file mode 100644 index 0000000000000..484cdb0620d97 --- /dev/null +++ b/cli/internal/ffi/lockfile.go @@ -0,0 +1,67 @@ +package ffi + +// #include "bindings.h" +// +// #cgo LDFLAGS: -L${SRCDIR} -lturborepo_ffi +// #cgo windows LDFLAGS: -lole32 -lbcrypt -lws2_32 -luserenv +import "C" + +import ( + "errors" + + ffi_proto "github.com/vercel/turbo/cli/internal/ffi/proto" +) + +// NpmTransitiveDeps returns the transitive external deps of a given package based on the deps and specifiers given +func NpmTransitiveDeps(content []byte, pkgDir string, unresolvedDeps map[string]string) ([]*ffi_proto.LockfilePackage, error) { + return transitiveDeps(npmTransitiveDeps, content, pkgDir, unresolvedDeps) +} + +func npmTransitiveDeps(buf C.Buffer) C.Buffer { + return C.npm_transitive_closure(buf) +} + +func transitiveDeps(cFunc func(C.Buffer) C.Buffer, content []byte, pkgDir string, unresolvedDeps map[string]string) ([]*ffi_proto.LockfilePackage, error) { + req := ffi_proto.TransitiveDepsRequest{ + Contents: content, + WorkspaceDir: pkgDir, + UnresolvedDeps: unresolvedDeps, + } + reqBuf := Marshal(&req) + resBuf := cFunc(reqBuf) + reqBuf.Free() + + resp := ffi_proto.TransitiveDepsResponse{} + if err := Unmarshal(resBuf, resp.ProtoReflect().Interface()); err != nil { + panic(err) + } + + if err := resp.GetError(); err != "" { + return nil, errors.New(err) + } + + list := resp.GetPackages() + return list.GetList(), nil +} + +func NpmSubgraph(content []byte, workspaces []string, packages []string) ([]byte, error) { + req := ffi_proto.SubgraphRequest{ + Contents: content, + Workspaces: workspaces, + Packages: packages, + } + reqBuf := Marshal(&req) + resBuf := C.npm_subgraph(reqBuf) + reqBuf.Free() + + resp := ffi_proto.SubgraphResponse{} + if err := Unmarshal(resBuf, resp.ProtoReflect().Interface()); err != nil { + panic(err) + } + + if err := resp.GetError(); err != "" { + return nil, errors.New(err) + } + + return resp.GetContents(), nil +} diff --git a/cli/internal/lockfile/rust_npm_lockfile.go b/cli/internal/lockfile/rust_npm_lockfile.go deleted file mode 100644 index 121c99d7e39ad..0000000000000 --- a/cli/internal/lockfile/rust_npm_lockfile.go +++ /dev/null @@ -1,78 +0,0 @@ -// TODO add back build tags for Rust - -package lockfile - -import ( - "io" - - mapset "github.com/deckarep/golang-set" - "github.com/vercel/turbo/cli/internal/ffi" - "github.com/vercel/turbo/cli/internal/turbopath" -) - -type NpmLockfileRust struct { - // We just story the entire lockfile in memory and pass it for every call - contents []byte -} - -func (l *NpmLockfileRust) ResolvePackage(workspacePath turbopath.AnchoredUnixPath, name string, version string) (Package, error) { - panic("UNUSED") -} - -func (l *NpmLockfileRust) AllDependencies(key string) (map[string]string, bool) { - panic("UNUSED") -} - -func (l *NpmLockfileRust) Subgraph(workspacePackages []turbopath.AnchoredSystemPath, packages []string) (Lockfile, error) { - workspaces := make([]string, len(workspacePackages)) - for i, workspace := range workspacePackages { - workspaces[i] = workspace.ToUnixPath().ToString() - } - contents, err := ffi.NpmSubgraph(l.contents, workspaces, packages) - if err != nil { - return nil, err - } - return &NpmLockfileRust{contents: contents}, nil -} - -func (l *NpmLockfileRust) Encode(w io.Writer) error { - // do we need to check num of bytes written? - _, err := w.Write(l.contents) - return err -} - -func (l *NpmLockfileRust) Patches() []turbopath.AnchoredUnixPath { - return nil -} - -func (l *NpmLockfileRust) GlobalChange(other Lockfile) bool { - // TODO we can probably just parse the json and look for known global changes - return false -} - -var _ (Lockfile) = (*NpmLockfileRust)(nil) - -func DecodeRustNpmLockfile(contents []byte) (Lockfile, error) { - return &NpmLockfileRust{contents: contents}, nil -} - -func NpmTransitiveDeps(lockfile *NpmLockfileRust, workspacePath turbopath.AnchoredUnixPath, unresolvedDeps map[string]string) (mapset.Set, error) { - // we convert pkg to - pkgDir := workspacePath.ToString() - - packages, err := ffi.NpmTransitiveDeps(lockfile.contents, pkgDir, unresolvedDeps) - if err != nil { - return nil, err - } - - deps := make([]interface{}, len(packages)) - for i, pkg := range packages { - deps[i] = Package{ - Found: pkg.Found, - Key: pkg.Key, - Version: pkg.Version, - } - } - - return mapset.NewSetFromSlice(deps), nil -} diff --git a/cli/internal/packagemanager/npm.go b/cli/internal/packagemanager/npm.go index 6f01c3f07081f..ab42879903012 100644 --- a/cli/internal/packagemanager/npm.go +++ b/cli/internal/packagemanager/npm.go @@ -54,6 +54,6 @@ var nodejsNpm = PackageManager{ }, UnmarshalLockfile: func(contents []byte) (lockfile.Lockfile, error) { - return lockfile.DecodeRustNpmLockfile(contents) + return lockfile.DecodeNpmLockfile(contents) }, } diff --git a/crates/turborepo-ffi/src/lib.rs b/crates/turborepo-ffi/src/lib.rs index c12edd579d173..6942244ce174c 100644 --- a/crates/turborepo-ffi/src/lib.rs +++ b/crates/turborepo-ffi/src/lib.rs @@ -8,7 +8,7 @@ use std::{mem::ManuallyDrop, path::PathBuf}; pub use lockfile::{npm_subgraph, npm_transitive_closure}; -use turborepo_lockfiles::{npm_subgraph as real_npm_subgraph, transitive_closure, NpmLockfile}; +pub use lockfile::{npm_subgraph, npm_transitive_closure}; mod proto { include!(concat!(env!("OUT_DIR"), "/_.rs")); From 385878e67952ff14db6b1923560ee88c5181156d Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 10 Feb 2023 14:34:49 -0800 Subject: [PATCH 11/28] fix lints --- cli/internal/ffi/lockfile.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/internal/ffi/lockfile.go b/cli/internal/ffi/lockfile.go index 484cdb0620d97..14985f3f61a07 100644 --- a/cli/internal/ffi/lockfile.go +++ b/cli/internal/ffi/lockfile.go @@ -44,6 +44,7 @@ func transitiveDeps(cFunc func(C.Buffer) C.Buffer, content []byte, pkgDir string return list.GetList(), nil } +// NpmSubgraph returns the contents of a npm lockfile subgraph func NpmSubgraph(content []byte, workspaces []string, packages []string) ([]byte, error) { req := ffi_proto.SubgraphRequest{ Contents: content, From 5d9dd90366477c3826a82e1c644a69b877d30ada Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 24 Feb 2023 17:11:14 -0800 Subject: [PATCH 12/28] add serde support for berry --- Cargo.lock | 4 + crates/turborepo-lockfiles/Cargo.toml | 6 + .../turborepo-lockfiles/fixtures/berry.lock | 3283 +++++++++++++++++ crates/turborepo-lockfiles/src/berry/de.rs | 45 + crates/turborepo-lockfiles/src/berry/mod.rs | 86 + crates/turborepo-lockfiles/src/berry/ser.rs | 249 ++ crates/turborepo-lockfiles/src/lib.rs | 2 + 7 files changed, 3675 insertions(+) create mode 100644 crates/turborepo-lockfiles/fixtures/berry.lock create mode 100644 crates/turborepo-lockfiles/src/berry/de.rs create mode 100644 crates/turborepo-lockfiles/src/berry/mod.rs create mode 100644 crates/turborepo-lockfiles/src/berry/ser.rs diff --git a/Cargo.lock b/Cargo.lock index 033812eec99c8..1d3b5d37e831a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8019,8 +8019,12 @@ dependencies = [ name = "turborepo-lockfiles" version = "0.1.0" dependencies = [ + "lazy_static", + "pretty_assertions", + "regex", "serde", "serde_json", + "serde_yaml 0.9.17", "thiserror", ] diff --git a/crates/turborepo-lockfiles/Cargo.toml b/crates/turborepo-lockfiles/Cargo.toml index 4305c8dd467a0..6736b6e622dd9 100644 --- a/crates/turborepo-lockfiles/Cargo.toml +++ b/crates/turborepo-lockfiles/Cargo.toml @@ -7,6 +7,12 @@ license = "MPL-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +lazy_static = "1.4.0" +regex = "1" serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.86" +serde_yaml = "0.9" thiserror = "1.0.38" + +[dev-dependencies] +pretty_assertions = "1.3" diff --git a/crates/turborepo-lockfiles/fixtures/berry.lock b/crates/turborepo-lockfiles/fixtures/berry.lock new file mode 100644 index 0000000000000..f4436e4aeb2f6 --- /dev/null +++ b/crates/turborepo-lockfiles/fixtures/berry.lock @@ -0,0 +1,3283 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8c0 + +"@ampproject/remapping@npm:^2.1.0": + version: 2.2.0 + resolution: "@ampproject/remapping@npm:2.2.0" + dependencies: + "@jridgewell/gen-mapping": ^0.1.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 + languageName: node + linkType: hard + +"@babel/code-frame@npm:7.12.11": + version: 7.12.11 + resolution: "@babel/code-frame@npm:7.12.11" + dependencies: + "@babel/highlight": ^7.10.4 + checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/code-frame@npm:7.18.6" + dependencies: + "@babel/highlight": ^7.18.6 + checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/compat-data@npm:7.19.1" + checksum: f985887ea08a140e4af87a94d3fb17af0345491eb97f5a85b1840255c2e2a97429f32a8fd12a7aae9218af5f1024f1eb12a5cd280d2d69b2337583c17ea506ba + languageName: node + linkType: hard + +"@babel/core@npm:^7.0.0": + version: 7.19.1 + resolution: "@babel/core@npm:7.19.1" + dependencies: + "@ampproject/remapping": ^2.1.0 + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.19.0 + "@babel/helper-compilation-targets": ^7.19.1 + "@babel/helper-module-transforms": ^7.19.0 + "@babel/helpers": ^7.19.0 + "@babel/parser": ^7.19.1 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.19.1 + "@babel/types": ^7.19.0 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.1 + semver: ^6.3.0 + checksum: 941c8c119b80bdba5fafc80bbaa424d51146b6d3c30b8fae35879358dd37c11d3d0926bc7e970a0861229656eedaa8c884d4a3a25cc904086eb73b827a2f1168 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/generator@npm:7.19.0" + dependencies: + "@babel/types": ^7.19.0 + "@jridgewell/gen-mapping": ^0.3.2 + jsesc: ^2.5.1 + checksum: aa3d5785cf8f8e81672dcc61aef351188efeadb20d9f66d79113d82cbcf3bbbdeb829989fa14582108572ddbc4e4027bdceb06ccaf5ec40fa93c2dda8fbcd4aa + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-compilation-targets@npm:7.19.1" + dependencies: + "@babel/compat-data": ^7.19.1 + "@babel/helper-validator-option": ^7.18.6 + browserslist: ^4.21.3 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: c2d3039265e498b341a6b597f855f2fcef02659050fefedf36ad4e6815e6aafe1011a761214cc80d98260ed07ab15a8cbe959a0458e97bec5f05a450e1b1741b + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/helper-environment-visitor@npm:7.18.9" + checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-function-name@npm:7.19.0" + dependencies: + "@babel/template": ^7.18.10 + "@babel/types": ^7.19.0 + checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-hoist-variables@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-module-imports@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-module-transforms@npm:7.19.0" + dependencies: + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-module-imports": ^7.18.6 + "@babel/helper-simple-access": ^7.18.6 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/helper-validator-identifier": ^7.18.6 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.19.0 + "@babel/types": ^7.19.0 + checksum: 4483276c66f56cf3b5b063634092ad9438c2593725de5c143ba277dda82f1501e6d73b311c1b28036f181dbe36eaeff29f24726cde37a599d4e735af294e5359 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-simple-access@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: 37cd36eef199e0517845763c1e6ff6ea5e7876d6d707a6f59c9267c547a50aa0e84260ba9285d49acfaf2cfa0a74a772d92967f32ac1024c961517d40b6c16a5 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-split-export-declaration@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.18.10": + version: 7.18.10 + resolution: "@babel/helper-string-parser@npm:7.18.10" + checksum: d554a4393365b624916b5c00a4cc21c990c6617e7f3fe30be7d9731f107f12c33229a7a3db9d829bfa110d2eb9f04790745d421640e3bd245bb412dc0ea123c1 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-validator-option@npm:7.18.6" + checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helpers@npm:7.19.0" + dependencies: + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.19.0 + "@babel/types": ^7.19.0 + checksum: e50e78e0dbb0435075fa3f85021a6bcae529589800bca0292721afd7f7c874bea54508d6dc57eca16e5b8224f8142c6b0e32e3b0140029dc09865da747da4623 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.18.10, @babel/parser@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/parser@npm:7.19.1" + bin: + parser: ./bin/babel-parser.js + checksum: b1e0acb346b2a533c857e1e97ac0886cdcbd76aafef67835a2b23f760c10568eb53ad8a27dd5f862d8ba4e583742e6067f107281ccbd68959d61bc61e4ddaa51 + languageName: node + linkType: hard + +"@babel/runtime-corejs3@npm:^7.10.2": + version: 7.19.1 + resolution: "@babel/runtime-corejs3@npm:7.19.1" + dependencies: + core-js-pure: ^3.25.1 + regenerator-runtime: ^0.13.4 + checksum: 38a1e8fcd2ba1f76c951259c98a5a11052123923adbf30ec8b2fec202dbbe38c6db61658ef9398e00c30f799e2e54ea036e56a09f43229261918bf5ec1b7d03a + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.18.9": + version: 7.19.0 + resolution: "@babel/runtime@npm:7.19.0" + dependencies: + regenerator-runtime: ^0.13.4 + checksum: fa69c351bb05e1db3ceb9a02fdcf620c234180af68cdda02152d3561015f6d55277265d3109815992f96d910f3db709458cae4f8df1c3def66f32e0867d82294 + languageName: node + linkType: hard + +"@babel/template@npm:^7.18.10": + version: 7.18.10 + resolution: "@babel/template@npm:7.18.10" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/parser": ^7.18.10 + "@babel/types": ^7.18.10 + checksum: 93a6aa094af5f355a72bd55f67fa1828a046c70e46f01b1606e6118fa1802b6df535ca06be83cc5a5e834022be95c7b714f0a268b5f20af984465a71e28f1473 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/traverse@npm:7.19.1" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.19.0 + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-function-name": ^7.19.0 + "@babel/helper-hoist-variables": ^7.18.6 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/parser": ^7.19.1 + "@babel/types": ^7.19.0 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 9d782b5089ebc989e54c2406814ed1206cb745ed2734e6602dee3e23d4b6ebbb703ff86e536276630f8de83fda6cde99f0634e3c3d847ddb40572d0303ba8800 + languageName: node + linkType: hard + +"@babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.8.3": + version: 7.19.0 + resolution: "@babel/types@npm:7.19.0" + dependencies: + "@babel/helper-string-parser": ^7.18.10 + "@babel/helper-validator-identifier": ^7.18.6 + to-fast-properties: ^2.0.0 + checksum: 9b346715a68aeede70ba9c685a144b0b26c53bcd595d448e24c8fa8df4d5956a5712e56ebadb7c85dcc32f218ee42788e37b93d50d3295c992072224cb3ef3fe + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^0.4.3": + version: 0.4.3 + resolution: "@eslint/eslintrc@npm:0.4.3" + dependencies: + ajv: ^6.12.4 + debug: ^4.1.1 + espree: ^7.3.0 + globals: ^13.9.0 + ignore: ^4.0.6 + import-fresh: ^3.2.1 + js-yaml: ^3.13.1 + minimatch: ^3.0.4 + strip-json-comments: ^3.1.1 + checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.5.0": + version: 0.5.0 + resolution: "@humanwhocodes/config-array@npm:0.5.0" + dependencies: + "@humanwhocodes/object-schema": ^1.2.0 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.0": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.1.0": + version: 0.1.1 + resolution: "@jridgewell/gen-mapping@npm:0.1.1" + dependencies: + "@jridgewell/set-array": ^1.0.0 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/gen-mapping@npm:0.3.2" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.15 + resolution: "@jridgewell/trace-mapping@npm:0.3.15" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 38917e9c2b014d469a9f51c016ed506acbe44dd16ec2f6f99b553ebf3764d22abadbf992f2367b6d2b3511f3eae8ed3a8963f6c1030093fda23efd35ecab2bae + languageName: node + linkType: hard + +"@next/env@npm:12.2.5": + version: 12.2.5 + resolution: "@next/env@npm:12.2.5" + checksum: a44939e59b46d5951831529a43dba9daa2e4e467e8680ea96e21ae127d1bf7f11757aaf3a6cff8a51273abfe7af782903e1304405a481361c7ba3e66d47e3238 + languageName: node + linkType: hard + +"@next/eslint-plugin-next@npm:12.3.0": + version: 12.3.0 + resolution: "@next/eslint-plugin-next@npm:12.3.0" + dependencies: + glob: 7.1.7 + checksum: f08582b36ff01a776183b3c33d6d81be3a110c1c3c39c81a33aff91277ea822aa4a952d4f2271a08ce56692ca5c58c9e958aaf4e08348c10cc45a85213b208f0 + languageName: node + linkType: hard + +"@next/swc-android-arm-eabi@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-android-arm-eabi@npm:12.2.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@next/swc-android-arm64@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-android-arm64@npm:12.2.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-arm64@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-darwin-arm64@npm:12.2.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-x64@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-darwin-x64@npm:12.2.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-freebsd-x64@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-freebsd-x64@npm:12.2.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-linux-arm-gnueabihf@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-linux-arm-gnueabihf@npm:12.2.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@next/swc-linux-arm64-gnu@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-linux-arm64-gnu@npm:12.2.5" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-arm64-musl@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-linux-arm64-musl@npm:12.2.5" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-linux-x64-gnu@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-linux-x64-gnu@npm:12.2.5" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-x64-musl@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-linux-x64-musl@npm:12.2.5" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-win32-arm64-msvc@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-win32-arm64-msvc@npm:12.2.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-win32-ia32-msvc@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-win32-ia32-msvc@npm:12.2.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@next/swc-win32-x64-msvc@npm:12.2.5": + version: 12.2.5 + resolution: "@next/swc-win32-x64-msvc@npm:12.2.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@rushstack/eslint-patch@npm:^1.1.3": + version: 1.2.0 + resolution: "@rushstack/eslint-patch@npm:1.2.0" + checksum: faa749faae0e83c26ae9eb00ad36a897ac78f3cf27da8e8ff21c00bcf7973b598d823d8f2b3957ef66079288bcf577f94df831eae2d65f3f68d8ca32f18b6aff + languageName: node + linkType: hard + +"@swc/helpers@npm:0.4.3": + version: 0.4.3 + resolution: "@swc/helpers@npm:0.4.3" + dependencies: + tslib: ^2.4.0 + checksum: 5c2f173e950dd3929d84ae48b3586a274d5a874e7cf2013b3d8081e4f8c723fa3a4d4e63b263e84bb7f06431f87b640e91a12655410463c81a3dc2bbc15eceda + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + +"@types/node@npm:^17.0.12": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.5 + resolution: "@types/prop-types@npm:15.7.5" + checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + languageName: node + linkType: hard + +"@types/react-dom@npm:^17.0.11": + version: 17.0.17 + resolution: "@types/react-dom@npm:17.0.17" + dependencies: + "@types/react": ^17 + checksum: 23caf98aa03e968811560f92a2c8f451694253ebe16b670929b24eaf0e7fa62ba549abe9db0ac028a9d8a9086acd6ab9c6c773f163fa21224845edbc00ba6232 + languageName: node + linkType: hard + +"@types/react@npm:18.0.17": + version: 18.0.17 + resolution: "@types/react@npm:18.0.17" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: 18cae64f5bfd6bb58fbd8ee2ba52ec82de844f114254e26de7b513e4b86621f643f9b71d7066958cd571b0d78cb86cbceda449c5289f9349ca573df29ab69252 + languageName: node + linkType: hard + +"@types/react@npm:^17, @types/react@npm:^17.0.37": + version: 17.0.50 + resolution: "@types/react@npm:17.0.50" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: b5629dff7c2f3e9fcba95a19b2b3bfd78d7cacc33ba5fc26413dba653d34afcac3b93ddabe563e8062382688a1eac7db68e93739bb8e712d27637a03aaafbbb8 + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.2 + resolution: "@types/scheduler@npm:0.16.2" + checksum: b6b4dcfeae6deba2e06a70941860fb1435730576d3689225a421280b7742318d1548b3d22c1f66ab68e414f346a9542f29240bc955b6332c5b11e561077583bc + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.21.0": + version: 5.37.0 + resolution: "@typescript-eslint/parser@npm:5.37.0" + dependencies: + "@typescript-eslint/scope-manager": 5.37.0 + "@typescript-eslint/types": 5.37.0 + "@typescript-eslint/typescript-estree": 5.37.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 33343e27c9602820d43ee12de9797365d97a5cf3f716e750fa44de760f2a2c6800f3bc4fa54931ac70c0e0ede77a92224f8151da7f30fed3bf692a029d6659af + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.37.0": + version: 5.37.0 + resolution: "@typescript-eslint/scope-manager@npm:5.37.0" + dependencies: + "@typescript-eslint/types": 5.37.0 + "@typescript-eslint/visitor-keys": 5.37.0 + checksum: 1c439e21ffa63ebaadb8c8363e9d668132a835a28203e5b779366bfa56772f332e5dedb50d63dffb836839b9d9c4e66aa9e3ea47b8c59465b18a0cbd063ec7a3 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.37.0": + version: 5.37.0 + resolution: "@typescript-eslint/types@npm:5.37.0" + checksum: 899e59e7775fa95c2d9fcac5cc02cc49d83af5f1ffc706df495046c3b3733f79d5489568b01bfaf8c9ae4636e057056866adc783113036f774580086d0189f21 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.37.0": + version: 5.37.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.37.0" + dependencies: + "@typescript-eslint/types": 5.37.0 + "@typescript-eslint/visitor-keys": 5.37.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 80365a50fa11ed39bf54d9ef06e264fbbf3bdbcc55b7d7d555ef0be915edae40ec30e98d08b3f6ef048e1874450cbcb1e7d9f429d4f420dacbbde45d3376a7bc + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.37.0": + version: 5.37.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.37.0" + dependencies: + "@typescript-eslint/types": 5.37.0 + eslint-visitor-keys: ^3.3.0 + checksum: d6193550f77413aead0cb267e058df80b80a488c8fb4e39beb5f0a70b971c41682a6391903fbc5f3dd859a872016288c434d631b8efc3ac5a04edbdb7b63b5f6 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.1": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn@npm:^7.4.0": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.11.0 + resolution: "ajv@npm:8.11.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"aria-query@npm:^4.2.2": + version: 4.2.2 + resolution: "aria-query@npm:4.2.2" + dependencies: + "@babel/runtime": ^7.10.2 + "@babel/runtime-corejs3": ^7.10.2 + checksum: 38401a9a400f26f3dcc24b84997461a16b32869a9893d323602bed8da40a8bcc0243b8d2880e942249a1496cea7a7de769e93d21c0baa439f01e1ee936fed665 + languageName: node + linkType: hard + +"array-includes@npm:^3.1.4, array-includes@npm:^3.1.5": + version: 3.1.5 + resolution: "array-includes@npm:3.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + get-intrinsic: ^1.1.1 + is-string: ^1.0.7 + checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.2.5": + version: 1.3.0 + resolution: "array.prototype.flat@npm:1.3.0" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.2 + es-shim-unscopables: ^1.0.0 + checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257 + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.0": + version: 1.3.0 + resolution: "array.prototype.flatmap@npm:1.3.0" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.2 + es-shim-unscopables: ^1.0.0 + checksum: 818538f39409c4045d874be85df0dbd195e1446b14d22f95bdcfefea44ae77db44e42dcd89a559254ec5a7c8b338cfc986cc6d641e3472f9a5326b21eb2976a2 + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.7": + version: 0.0.7 + resolution: "ast-types-flow@npm:0.0.7" + checksum: a26dcc2182ffee111cad7c471759b0bda22d3b7ebacf27c348b22c55f16896b18ab0a4d03b85b4020dce7f3e634b8f00b593888f622915096ea1927fa51866c4 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"axe-core@npm:^4.4.3": + version: 4.4.3 + resolution: "axe-core@npm:4.4.3" + checksum: c3ea000d9ace3ba0bc747c8feafc24b0de62a0f7d93021d0f77b19c73fca15341843510f6170da563d51535d6cfb7a46c5fc0ea36170549dbb44b170208450a2 + languageName: node + linkType: hard + +"axobject-query@npm:^2.2.0": + version: 2.2.0 + resolution: "axobject-query@npm:2.2.0" + checksum: 96b8c7d807ca525f41ad9b286186e2089b561ba63a6d36c3e7d73dc08150714660995c7ad19cda05784458446a0793b45246db45894631e13853f48c1aa3117f + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"berry-patch@workspace:.": + version: 0.0.0-use.local + resolution: "berry-patch@workspace:." + dependencies: + eslint-config-custom: "*" + prettier: latest + turbo: latest + languageName: unknown + linkType: soft + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.3": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" + dependencies: + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 + node-releases: ^2.0.6 + update-browserslist-db: ^1.0.9 + bin: + browserslist: cli.js + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001332, caniuse-lite@npm:^1.0.30001400": + version: 1.0.30001400 + resolution: "caniuse-lite@npm:1.0.30001400" + checksum: 984e29d3c02fd02a59cc92ef4a5e9390fce250de3791056362347cf901f0d91041246961a57cfa8fed800538d03ee341bc4f7eaed19bf7be0ef8a181d94cd848 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"convert-source-map@npm:^1.7.0": + version: 1.8.0 + resolution: "convert-source-map@npm:1.8.0" + dependencies: + safe-buffer: ~5.1.1 + checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed + languageName: node + linkType: hard + +"core-js-pure@npm:^3.25.1": + version: 3.25.1 + resolution: "core-js-pure@npm:3.25.1" + checksum: 0123131ec7ab3a1e56f0b4df4ae659de03d9c245ce281637d4d0f18f9839d8e0cfbfa989bd577ce1b67826f889a7dcc734421f697cf1bbe59f605f29c537a678 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.1 + resolution: "csstype@npm:3.1.1" + checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: d240b7757544460ae0586a341a53110ab0a61126570ef2d8c731e3eab3f0cb6e488e2609e6a69b46727635de49be20b071688698744417ff1b6c1d7ccd03e0de + languageName: node + linkType: hard + +"debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"docs@workspace:apps/docs": + version: 0.0.0-use.local + resolution: "docs@workspace:apps/docs" + dependencies: + "@babel/core": ^7.0.0 + "@types/node": ^17.0.12 + "@types/react": 18.0.17 + eslint: 7.32.0 + eslint-config-custom: "*" + lodash: ^4.17.21 + next: 12.2.5 + next-transpile-modules: 9.0.0 + react: 18.2.0 + react-dom: 18.2.0 + tsconfig: "*" + typescript: ^4.5.3 + ui: "*" + languageName: unknown + linkType: soft + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: ^2.0.2 + checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.251": + version: 1.4.251 + resolution: "electron-to-chromium@npm:1.4.251" + checksum: 470a04dfe1d34814f8bc7e1dde606851b6f787a6d78655a57df063844fc71feb64ce793c52a3a130ceac1fc368b8d3e25a4c55c847a1e9c02c3090f9dcbf40ac + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.7.0": + version: 5.10.0 + resolution: "enhanced-resolve@npm:5.10.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff + languageName: node + linkType: hard + +"enquirer@npm:^2.3.5": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: ^4.1.1 + checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": + version: 1.20.2 + resolution: "es-abstract@npm:1.20.2" + dependencies: + call-bind: ^1.0.2 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.1.2 + get-symbol-description: ^1.0.0 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-symbols: ^1.0.3 + internal-slot: ^1.0.3 + is-callable: ^1.2.4 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-weakref: ^1.0.2 + object-inspect: ^1.12.2 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + string.prototype.trimend: ^1.0.5 + string.prototype.trimstart: ^1.0.5 + unbox-primitive: ^1.0.2 + checksum: ab893dd1f849250f5a2da82656b4e21b511f76429b25a4aea5c8b2a3007ff01cb8e112987d0dd7693b9ad9e6399f8f7be133285d6196a5ebd1b13a4ee2258f70 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-custom@*, eslint-config-custom@workspace:packages/eslint-config-custom": + version: 0.0.0-use.local + resolution: "eslint-config-custom@workspace:packages/eslint-config-custom" + dependencies: + eslint: ^7.23.0 + eslint-config-next: ^12.0.8 + eslint-config-prettier: ^8.3.0 + eslint-config-turbo: latest + eslint-plugin-react: 7.31.7 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + +"eslint-config-next@npm:^12.0.8": + version: 12.3.0 + resolution: "eslint-config-next@npm:12.3.0" + dependencies: + "@next/eslint-plugin-next": 12.3.0 + "@rushstack/eslint-patch": ^1.1.3 + "@typescript-eslint/parser": ^5.21.0 + eslint-import-resolver-node: ^0.3.6 + eslint-import-resolver-typescript: ^2.7.1 + eslint-plugin-import: ^2.26.0 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.29.4 + eslint-plugin-react-hooks: ^4.5.0 + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: ">=3.3.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 50a2e43c515350c689cd848973b953c1d058303b84e05ecba5b5bf0f8feffe3935011de3b574ba35d48de8a5d7d5c42567d21d1a17f02189a701edeb6d76a8e0 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.3.0": + version: 8.5.0 + resolution: "eslint-config-prettier@npm:8.5.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 + languageName: node + linkType: hard + +eslint-config-turbo@latest: + version: 0.0.3 + resolution: "eslint-config-turbo@npm:0.0.3" + dependencies: + eslint-plugin-turbo: 0.0.3 + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + checksum: c92255e91dd0865faeebc857eb3a862e8ca2ccb37fc54ffce93b73cd41e95ad456826ae6634772450dfa9c705b67c288f476e8e413fab3d8194dc271754528e2 + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.6": + version: 0.3.6 + resolution: "eslint-import-resolver-node@npm:0.3.6" + dependencies: + debug: ^3.2.7 + resolve: ^1.20.0 + checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^2.7.1": + version: 2.7.1 + resolution: "eslint-import-resolver-typescript@npm:2.7.1" + dependencies: + debug: ^4.3.4 + glob: ^7.2.0 + is-glob: ^4.0.3 + resolve: ^1.22.0 + tsconfig-paths: ^3.14.1 + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + checksum: 1d81b657b1f73bf95b8f0b745c0305574b91630c1db340318f3ca8918e206fce20a933b95e7c419338cc4452cb80bb2b2d92acaf01b6aa315c78a332d832545c + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.7.3": + version: 2.7.4 + resolution: "eslint-module-utils@npm:2.7.4" + dependencies: + debug: ^3.2.7 + dependenciesMeta: + debug@4.3.4: + unplugged: true + peerDependenciesMeta: + eslint: + optional: true + checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.26.0": + version: 2.26.0 + resolution: "eslint-plugin-import@npm:2.26.0" + dependencies: + array-includes: ^3.1.4 + array.prototype.flat: ^1.2.5 + debug: ^2.6.9 + 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 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.values: ^1.1.5 + resolve: ^1.22.0 + tsconfig-paths: ^3.14.1 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.5.1": + version: 6.6.1 + resolution: "eslint-plugin-jsx-a11y@npm:6.6.1" + 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 + 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 + minimatch: ^3.1.2 + semver: ^6.3.0 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: baae7377f0e25a0cc9b34dc333a3dc6ead9ee8365e445451eff554c3ca267a0a6cb88127fe90395c578ab1b92cfed246aef7dc8d2b48b603389e10181799e144 + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^4.5.0": + version: 4.6.0 + resolution: "eslint-plugin-react-hooks@npm:4.6.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 23001801f14c1d16bf0a837ca7970d9dd94e7b560384b41db378b49b6e32dc43d6e2790de1bd737a652a86f81a08d6a91f402525061b47719328f586a57e86c3 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:7.31.7": + version: 7.31.7 + resolution: "eslint-plugin-react@npm:7.31.7" + dependencies: + array-includes: ^3.1.5 + array.prototype.flatmap: ^1.3.0 + doctrine: ^2.1.0 + 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 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.3 + semver: ^6.3.0 + string.prototype.matchall: ^4.0.7 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 582d422f531d7d3894fc09ac941ef8b6ad595782cfca5e1d52af5895ce117def7a0ff8afeea0166bff7b6ceae8baec2313614b1571754f539575cfa9351cd2da + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.29.4": + version: 7.31.8 + resolution: "eslint-plugin-react@npm:7.31.8" + dependencies: + array-includes: ^3.1.5 + array.prototype.flatmap: ^1.3.0 + doctrine: ^2.1.0 + 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 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.3 + semver: ^6.3.0 + string.prototype.matchall: ^4.0.7 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 0683e2a624a4df6f08264a3f6bc614a81e8f961c83173bdf2d8d3523f84ed5d234cddc976dbc6815913e007c5984df742ba61be0c0592b27c3daabe0f68165a3 + languageName: node + linkType: hard + +"eslint-plugin-turbo@npm:0.0.3": + version: 0.0.3 + resolution: "eslint-plugin-turbo@npm:0.0.3" + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + checksum: 18e2b13ede03eee7635d0c67ca792cf46483e90443143bdc06555bf231045fb5f70b2f6f1d67492365b7fe47620408eea22f7548879f3afcb07ccc070aec5c15 + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "eslint-utils@npm:2.1.0" + dependencies: + eslint-visitor-keys: ^1.1.0 + checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0": + version: 1.3.0 + resolution: "eslint-visitor-keys@npm:1.3.0" + checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0": + version: 3.3.0 + resolution: "eslint-visitor-keys@npm:3.3.0" + checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 + languageName: node + linkType: hard + +"eslint@npm:7.32.0, eslint@npm:^7.23.0, eslint@npm:^7.32.0": + version: 7.32.0 + resolution: "eslint@npm:7.32.0" + dependencies: + "@babel/code-frame": 7.12.11 + "@eslint/eslintrc": ^0.4.3 + "@humanwhocodes/config-array": ^0.5.0 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.0.1 + doctrine: ^3.0.0 + enquirer: ^2.3.5 + escape-string-regexp: ^4.0.0 + eslint-scope: ^5.1.1 + eslint-utils: ^2.1.0 + eslint-visitor-keys: ^2.0.0 + espree: ^7.3.1 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + functional-red-black-tree: ^1.0.1 + glob-parent: ^5.1.2 + globals: ^13.6.0 + ignore: ^4.0.6 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^3.13.1 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.0.4 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + progress: ^2.0.0 + regexpp: ^3.1.0 + semver: ^7.2.1 + strip-ansi: ^6.0.0 + strip-json-comments: ^3.1.0 + table: ^6.0.9 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37 + languageName: node + linkType: hard + +"espree@npm:^7.3.0, espree@npm:^7.3.1": + version: 7.3.1 + resolution: "espree@npm:7.3.1" + dependencies: + acorn: ^7.4.0 + acorn-jsx: ^5.3.1 + eslint-visitor-keys: ^1.3.0 + checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.0": + version: 1.4.0 + resolution: "esquery@npm:1.4.0" + dependencies: + estraverse: ^5.1.0 + checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + 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 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.13.0 + resolution: "fastq@npm:1.13.0" + dependencies: + reusify: ^1.0.4 + checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.2": + version: 1.1.3 + resolution: "get-intrinsic@npm:1.1.3" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.3 + checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob@npm:7.1.7": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + 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 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.2.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.6.0, globals@npm:^13.9.0": + version: 13.17.0 + resolution: "globals@npm:13.17.0" + dependencies: + type-fest: ^0.20.2 + checksum: fbaf4112e59b92c9f5575e85ce65e9e17c0b82711196ec5f58beb08599bbd92fd72703d6dfc9b080381fd35b644e1b11dcf25b38cc2341ec21df942594cbc8ce + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.4": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"ignore@npm:^4.0.6": + version: 4.0.6 + resolution: "ignore@npm:4.0.6" + checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.2.0 + resolution: "ignore@npm:5.2.0" + checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.3": + version: 1.0.3 + resolution: "internal-slot@npm:1.0.3" + dependencies: + get-intrinsic: ^1.1.0 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": + version: 1.2.6 + resolution: "is-callable@npm:1.2.6" + checksum: 7667d6a6be66df00741cfa18c657877c46a00139ea7ea7765251e9db0182745c9ee173506941a329d6914e34e59e9cc80029fb3f68bbf8c22a6c155ee6ea77b3 + languageName: node + linkType: hard + +"is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": + version: 2.10.0 + resolution: "is-core-module@npm:2.10.0" + dependencies: + has: ^1.0.3 + checksum: 0f3f77811f430af3256fa7bbc806f9639534b140f8ee69476f632c3e1eb4e28a38be0b9d1b8ecf596179c841b53576129279df95e7051d694dac4ceb6f967593 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^1.0.1": + version: 1.0.1 + resolution: "json5@npm:1.0.1" + dependencies: + minimist: ^1.2.0 + bin: + json5: lib/cli.js + checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 + languageName: node + linkType: hard + +"json5@npm:^2.2.1": + version: 2.2.1 + resolution: "json5@npm:2.2.1" + bin: + json5: lib/cli.js + checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.2": + version: 3.3.3 + resolution: "jsx-ast-utils@npm:3.3.3" + dependencies: + array-includes: ^3.1.5 + object.assign: ^4.1.3 + checksum: a2ed78cac49a0f0c4be8b1eafe3c5257a1411341d8e7f1ac740debae003de04e5f6372bfcfbd9d082e954ffd99aac85bcda85b7c6bc11609992483f4cdc0f745 + languageName: node + linkType: hard + +"language-subtag-registry@npm:~0.3.2": + version: 0.3.22 + resolution: "language-subtag-registry@npm:0.3.22" + checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a + languageName: node + linkType: hard + +"language-tags@npm:^1.0.5": + version: 1.0.5 + resolution: "language-tags@npm:1.0.5" + dependencies: + language-subtag-registry: ~0.3.2 + checksum: c81b5d8b9f5f9cfd06ee71ada6ddfe1cf83044dd5eeefcd1e420ad491944da8957688db4a0a9bc562df4afdc2783425cbbdfd152c01d93179cf86888903123cf + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash@npm:4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.21-6382451519.patch::locator=berry-patch%40workspace%3A.": + version: 4.17.21 + resolution: "lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.21-6382451519.patch::version=4.17.21&hash=2c6e9e&locator=berry-patch%40workspace%3A." + checksum: 0f54b5291a5cfa3322cc3cb85716df4e23503535b79a341f12a41231513baaa6285fd9808d9894100dcea8b36bf91644360c4f783db1814719a4e103a04f59f3 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: ^3.0.0 || ^4.0.0 + bin: + loose-envify: cli.js + checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" + bin: + nanoid: bin/nanoid.cjs + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"next-transpile-modules@npm:9.0.0": + version: 9.0.0 + resolution: "next-transpile-modules@npm:9.0.0" + dependencies: + enhanced-resolve: ^5.7.0 + escalade: ^3.1.1 + checksum: 9a5d86d80cedc2404b2b1d5bd4994f2f7bf60e5e20f24e8cc5cfec34da1418b4a439916f37a95ca336bcf6d81094c3647354ac6a0c6737b3df59e62b6380507d + languageName: node + linkType: hard + +"next@npm:12.2.5": + version: 12.2.5 + resolution: "next@npm:12.2.5" + dependencies: + "@next/env": 12.2.5 + "@next/swc-android-arm-eabi": 12.2.5 + "@next/swc-android-arm64": 12.2.5 + "@next/swc-darwin-arm64": 12.2.5 + "@next/swc-darwin-x64": 12.2.5 + "@next/swc-freebsd-x64": 12.2.5 + "@next/swc-linux-arm-gnueabihf": 12.2.5 + "@next/swc-linux-arm64-gnu": 12.2.5 + "@next/swc-linux-arm64-musl": 12.2.5 + "@next/swc-linux-x64-gnu": 12.2.5 + "@next/swc-linux-x64-musl": 12.2.5 + "@next/swc-win32-arm64-msvc": 12.2.5 + "@next/swc-win32-ia32-msvc": 12.2.5 + "@next/swc-win32-x64-msvc": 12.2.5 + "@swc/helpers": 0.4.3 + caniuse-lite: ^1.0.30001332 + postcss: 8.4.14 + styled-jsx: 5.0.4 + use-sync-external-store: 1.2.0 + peerDependencies: + fibers: ">= 3.1.0" + node-sass: ^6.0.0 || ^7.0.0 + react: ^17.0.2 || ^18.0.0-0 + react-dom: ^17.0.2 || ^18.0.0-0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-android-arm-eabi": + optional: true + "@next/swc-android-arm64": + optional: true + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-freebsd-x64": + optional: true + "@next/swc-linux-arm-gnueabihf": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: e8fcbd93d74fda81640fd174a9d380f22db404d3ce0893730db3db806317ae18c86d1dbb502e63e47c92fb21a93812de62639c2f1204330cb569fdac4d3d0573 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.6": + version: 2.0.6 + resolution: "node-releases@npm:2.0.6" + checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": + version: 1.12.2 + resolution: "object-inspect@npm:1.12.2" + checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.3, object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"object.entries@npm:^1.1.5": + version: 1.1.5 + resolution: "object.entries@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + checksum: d658696f74fd222060d8428d2a9fda2ce736b700cb06f6bdf4a16a1892d145afb746f453502b2fa55d1dca8ead6f14ddbcf66c545df45adadea757a6c4cd86c7 + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.5": + version: 2.0.5 + resolution: "object.fromentries@npm:2.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + checksum: 61a0b565ded97b76df9e30b569729866e1824cce902f98e90bb106e84f378aea20163366f66dc75c9000e2aad2ed0caf65c6f530cb2abc4c0c0f6c982102db4b + languageName: node + linkType: hard + +"object.hasown@npm:^1.1.1": + version: 1.1.1 + resolution: "object.hasown@npm:1.1.1" + dependencies: + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: d8ed4907ce57f48b93e3b53c418fd6787bf226a51e8d698c91e39b78e80fe5b124cb6282f6a9d5be21cf9e2c7829ab10206dcc6112b7748860eefe641880c793 + languageName: node + linkType: hard + +"object.values@npm:^1.1.5": + version: 1.1.5 + resolution: "object.values@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + word-wrap: ^1.2.3 + checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"postcss@npm:8.4.14": + version: 8.4.14 + resolution: "postcss@npm:8.4.14" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +prettier@latest: + version: 2.7.1 + resolution: "prettier@npm:2.7.1" + bin: + prettier: bin-prettier.js + checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b + languageName: node + linkType: hard + +"progress@npm:^2.0.0": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: ^1.4.0 + object-assign: ^4.1.1 + react-is: ^16.13.1 + checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"react-dom@npm:18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.0 + peerDependencies: + react: ^18.2.0 + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f + languageName: node + linkType: hard + +"react@npm:18.2.0, react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.13.4": + version: 0.13.9 + resolution: "regenerator-runtime@npm:0.13.9" + checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": + version: 1.4.3 + resolution: "regexp.prototype.flags@npm:1.4.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + functions-have-names: ^1.2.2 + checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + languageName: node + linkType: hard + +"regexpp@npm:^3.1.0": + version: 3.2.0 + resolution: "regexpp@npm:3.2.0" + checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:^1.22.0": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.3": + version: 2.0.0-next.4 + resolution: "resolve@npm:2.0.0-next.4" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + languageName: node + linkType: hard + +"resolve@patch:resolve@^2.0.0-next.3#~builtin": + version: 2.0.0-next.4 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: ^1.1.0 + checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"semver@npm:^7.2.1, semver@npm:^7.3.7": + version: 7.3.7 + resolution: "semver@npm:7.3.7" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.7": + version: 4.0.7 + resolution: "string.prototype.matchall@npm:4.0.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + get-intrinsic: ^1.1.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.3 + regexp.prototype.flags: ^1.4.1 + side-channel: ^1.0.4 + checksum: fc09f3ccbfb325de0472bcc87a6be0598a7499e0b4a31db5789676155b15754a4cc4bb83924f15fc9ed48934dac7366ee52c8b9bd160bed6fd072c93b489e75c + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.5": + version: 1.0.5 + resolution: "string.prototype.trimend@npm:1.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.5": + version: 1.0.5 + resolution: "string.prototype.trimstart@npm:1.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.19.5 + checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"styled-jsx@npm:5.0.4": + version: 5.0.4 + resolution: "styled-jsx@npm:5.0.4" + peerDependencies: + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + checksum: db7530155626e5eebc9d80ca117ea5aed6219b0a65469196b0b5727550fbe743117d7eea1499d80511ccb312d31f4a1027a58d1f94a83f0986c9acfdcce8bdd1 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"table@npm:^6.0.9": + version: 6.8.0 + resolution: "table@npm:6.8.0" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 5b07fe462ee03d2e1fac02cbb578efd2e0b55ac07e3d3db2e950aa9570ade5a4a2b8d3c15e9f25c89e4e50b646bc4269934601ee1eef4ca7968ad31960977690 + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.14.1": + version: 3.14.1 + resolution: "tsconfig-paths@npm:3.14.1" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.1 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + languageName: node + linkType: hard + +"tsconfig@*, tsconfig@workspace:packages/tsconfig": + version: 0.0.0-use.local + resolution: "tsconfig@workspace:packages/tsconfig" + languageName: unknown + linkType: soft + +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.4.0": + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"turbo-android-arm64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-android-arm64@npm:1.4.6" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"turbo-darwin-64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-darwin-64@npm:1.4.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"turbo-darwin-arm64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-darwin-arm64@npm:1.4.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"turbo-freebsd-64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-freebsd-64@npm:1.4.6" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"turbo-freebsd-arm64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-freebsd-arm64@npm:1.4.6" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"turbo-linux-32@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-32@npm:1.4.6" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"turbo-linux-64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-64@npm:1.4.6" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"turbo-linux-arm64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-arm64@npm:1.4.6" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"turbo-linux-arm@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-arm@npm:1.4.6" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"turbo-linux-mips64le@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-mips64le@npm:1.4.6" + conditions: os=linux & cpu=mipsel + languageName: node + linkType: hard + +"turbo-linux-ppc64le@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-linux-ppc64le@npm:1.4.6" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"turbo-windows-32@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-windows-32@npm:1.4.6" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"turbo-windows-64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-windows-64@npm:1.4.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"turbo-windows-arm64@npm:1.4.6": + version: 1.4.6 + resolution: "turbo-windows-arm64@npm:1.4.6" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +turbo@latest: + version: 1.4.6 + resolution: "turbo@npm:1.4.6" + dependencies: + turbo-android-arm64: 1.4.6 + turbo-darwin-64: 1.4.6 + turbo-darwin-arm64: 1.4.6 + turbo-freebsd-64: 1.4.6 + turbo-freebsd-arm64: 1.4.6 + turbo-linux-32: 1.4.6 + turbo-linux-64: 1.4.6 + turbo-linux-arm: 1.4.6 + turbo-linux-arm64: 1.4.6 + turbo-linux-mips64le: 1.4.6 + turbo-linux-ppc64le: 1.4.6 + turbo-windows-32: 1.4.6 + turbo-windows-64: 1.4.6 + turbo-windows-arm64: 1.4.6 + dependenciesMeta: + turbo-android-arm64: + optional: true + turbo-darwin-64: + optional: true + turbo-darwin-arm64: + optional: true + turbo-freebsd-64: + optional: true + turbo-freebsd-arm64: + optional: true + turbo-linux-32: + optional: true + turbo-linux-64: + optional: true + turbo-linux-arm: + optional: true + turbo-linux-arm64: + optional: true + turbo-linux-mips64le: + optional: true + turbo-linux-ppc64le: + optional: true + turbo-windows-32: + optional: true + turbo-windows-64: + optional: true + turbo-windows-arm64: + optional: true + bin: + turbo: bin/turbo + checksum: f7191f36e0abddf6dc88eb9a83a007a8616ebed1edd44c37f9b19e0451f3ce90c4406699f6166a99c0a6f8d39cc1f24d96513b7ef16b21747863827538b9c966 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"typescript@npm:^4.5.2, typescript@npm:^4.5.3, typescript@npm:^4.7.4": + version: 4.8.3 + resolution: "typescript@npm:4.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 8286a5edcaf3d68e65c451aa1e7150ad1cf53ee0813c07ec35b7abdfdb10f355ecaa13c6a226a694ae7a67785fd7eeebf89f845da0b4f7e4a35561ddc459aba0 + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.5.2#~builtin, typescript@patch:typescript@^4.5.3#~builtin, typescript@patch:typescript@^4.7.4#~builtin": + version: 4.8.3 + resolution: "typescript@patch:typescript@npm%3A4.8.3#~builtin::version=4.8.3&hash=a1c5e5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2222d2382fb3146089b1d27ce2b55e9d1f99cc64118f1aba75809b693b856c5d3c324f052f60c75b577947fc538bc1c27bad0eb76cbdba9a63a253489504ba7e + languageName: node + linkType: hard + +"ui@*, ui@workspace:packages/ui": + version: 0.0.0-use.local + resolution: "ui@workspace:packages/ui" + dependencies: + "@types/react": ^17.0.37 + "@types/react-dom": ^17.0.11 + eslint: ^7.32.0 + eslint-config-custom: "*" + react: ^18.2.0 + tsconfig: "*" + typescript: ^4.5.2 + languageName: unknown + linkType: soft + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.9": + version: 1.0.9 + resolution: "update-browserslist-db@npm:1.0.9" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + browserslist-lint: cli.js + checksum: f625899b236f6a4d7f62b56be1b8da230c5563d1fef84d3ef148f2e1a3f11a5a4b3be4fd7e3703e51274c116194017775b10afb4de09eb2c0d09d36b90f1f578 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + languageName: node + linkType: hard + +"v8-compile-cache@npm:^2.0.3": + version: 2.3.0 + resolution: "v8-compile-cache@npm:2.3.0" + checksum: adb0a271eaa2297f2f4c536acbfee872d0dd26ec2d76f66921aa7fc437319132773483344207bdbeee169225f4739016d8d2dbf0553913a52bb34da6d0334f8e + languageName: node + linkType: hard + +"web@workspace:apps/web": + version: 0.0.0-use.local + resolution: "web@workspace:apps/web" + dependencies: + "@babel/core": ^7.0.0 + "@types/node": ^17.0.12 + "@types/react": 18.0.17 + eslint: 7.32.0 + eslint-config-custom: "*" + next: 12.2.5 + next-transpile-modules: 9.0.0 + react: 18.2.0 + react-dom: 18.2.0 + tsconfig: "*" + typescript: ^4.5.3 + ui: "*" + languageName: unknown + linkType: soft + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard diff --git a/crates/turborepo-lockfiles/src/berry/de.rs b/crates/turborepo-lockfiles/src/berry/de.rs new file mode 100644 index 0000000000000..b691607aa8f0f --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/de.rs @@ -0,0 +1,45 @@ +use serde::Deserialize; + +use super::SemverString; + +impl<'de> Deserialize<'de> for SemverString { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + // We use this to massage numerical semver versions to strings + // e.g. 2 + #[derive(Deserialize)] + #[serde(untagged)] + enum StringOrNum { + String(String), + Num(u64), + } + + match StringOrNum::deserialize(deserializer)? { + StringOrNum::String(s) => Ok(SemverString(s)), + StringOrNum::Num(x) => Ok(SemverString(x.to_string())), + } + } +} + +#[cfg(test)] +mod test { + use std::collections::HashMap; + + use super::*; + + #[test] + fn test_semver() { + let input = "foo: 1.2.3 +bar: 2 +baz: latest +"; + + let result: HashMap = serde_yaml::from_str(input).unwrap(); + + assert_eq!(result["foo"].as_ref(), "1.2.3"); + assert_eq!(result["bar"].as_ref(), "2"); + assert_eq!(result["baz"].as_ref(), "latest"); + } +} diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs new file mode 100644 index 0000000000000..c1edd63544414 --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -0,0 +1,86 @@ +mod de; +mod ser; + +use serde::{Deserialize, Serialize}; + +// We depend on BTree iteration being sorted +type Map = std::collections::BTreeMap; + +// This is the direct representation of the lockfile as it appears on disk. +// More internal tracking is required for effectively altering the lockfile +#[derive(Debug, Deserialize, Serialize)] +struct LockfileData { + #[serde(rename = "__metadata")] + metadata: Metadata, + #[serde(flatten)] + packages: Map, +} + +#[derive(Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[serde(rename_all = "camelCase")] +struct Metadata { + version: u64, + cache_key: String, +} + +#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Default, Clone)] +#[serde(rename_all = "camelCase")] +struct BerryPackage { + version: SemverString, + language_name: Option, + dependencies: Option>, + peer_dependencies: Option>, + dependencies_meta: Option>, + peer_dependencies_meta: Option>, + // Structured metadata we need to persist + bin: Option>, + link_type: Option, + resolution: Option, + checksum: Option, + conditions: Option, +} + +#[derive(Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Clone, Copy)] +struct DependencyMeta { + optional: Option, + unplugged: Option, +} + +// Newtype used exclusively for correct deserialization +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Default, Clone)] +struct SemverString(String); + +impl From for String { + fn from(value: SemverString) -> Self { + value.0 + } +} + +impl AsRef for SemverString { + fn as_ref(&self) -> &str { + self.0.as_str() + } +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + + use super::*; + + #[test] + fn test_deserialize_lockfile() { + let lockfile: LockfileData = + serde_yaml::from_slice(include_bytes!("../../fixtures/berry.lock")).unwrap(); + assert_eq!(lockfile.metadata.version, 6); + assert_eq!(lockfile.metadata.cache_key, "8c0"); + } + + #[test] + fn test_roundtrip() { + let contents = include_str!("../../fixtures/berry.lock"); + let lockfile: LockfileData = serde_yaml::from_str(contents).unwrap(); + let new_contents = lockfile.to_string(); + assert_eq!(contents, new_contents); + } +} diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs new file mode 100644 index 0000000000000..c8fbf10348053 --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -0,0 +1,249 @@ +use std::{borrow::Cow, fmt}; + +use lazy_static::lazy_static; +use regex::Regex; + +use super::{BerryPackage, DependencyMeta, LockfileData, Metadata}; + +lazy_static! { + static ref SIMPLE_STRING: Regex = + Regex::new( + r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\]\[{}:# \t\r\n])*$"# + // r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\\][{}:# \t\r\n])*"# + ).unwrap(); +} + +const HEADER: &str = "# This file is generated by running \"yarn install\" inside your project. +# Manual changes might be lost - proceed with caution! +"; + +// We implement Display in order to produce a correctly serialized `yarn.lock` +// Since Berry is so particular about the contents we can't use the serde_yaml +// serializer without forking it and heavy modifications. Implementing Display +// is more honest than writing a Serializer implementation since the serializer +// would only support a single type. +impl fmt::Display for LockfileData { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{HEADER}\n{}\n", self.metadata)?; + + for (key, entry) in &self.packages { + let wrapped_key = wrap_string(key); + // Yaml 1.2 spec says that keys over 1024 characters need to be prefixed with ? + // and the : goes in a new line + let key_line = match wrapped_key.len() <= 1024 { + true => format!("{wrapped_key}:"), + false => format!("? {wrapped_key}\n:"), + }; + write!(f, "\n{}\n{}\n", key_line, entry)?; + } + + Ok(()) + } +} + +impl fmt::Display for Metadata { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "__metadata:\n version: {}\n cacheKey: {}", + self.version, + wrap_string(&self.cache_key) + ) + } +} + +impl fmt::Display for BerryPackage { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // we only want to write a newline there was something before + let mut first = true; + let mut write_line = |field: &str, whitespace: &str, value: &str| -> fmt::Result { + if !value.is_empty() { + if !first { + writeln!(f)?; + } + write!(f, " {field}:{whitespace}{}", value,)?; + first = false; + } + Ok(()) + }; + + let space = " "; + let newline = "\n"; + write_line("version", space, &wrap_string(self.version.as_ref()))?; + if let Some(resolution) = &self.resolution { + write_line("resolution", space, &wrap_string(resolution))?; + } + // deps, peer deps, deps meta, peer deps meta, bin + if let Some(deps) = &self.dependencies { + write_line( + "dependencies", + newline, + &stringify_dependencies(deps.iter()), + )?; + } + if let Some(peer_deps) = &self.peer_dependencies { + write_line( + "peerDependencies", + newline, + &stringify_dependencies(peer_deps.iter()), + )?; + } + if let Some(deps_meta) = &self.dependencies_meta { + write_line( + "dependenciesMeta", + newline, + &stringify_dependencies_meta(deps_meta.iter()), + )?; + } + if let Some(peer_deps_meta) = &self.peer_dependencies_meta { + write_line( + "peerDependenciesMeta", + newline, + &stringify_dependencies_meta(peer_deps_meta.iter()), + )?; + } + if let Some(bin) = &self.bin { + write_line("bin", newline, &stringify_dependencies(bin.iter()))?; + } + + if let Some(checksum) = &self.checksum { + write_line("checksum", space, &wrap_string(checksum))?; + } + if let Some(conditions) = &self.conditions { + write_line("conditions", space, &wrap_string(conditions))?; + } + if let Some(language_name) = &self.language_name { + write_line("languageName", space, &wrap_string(language_name))?; + } + if let Some(link_type) = &self.link_type { + write_line("linkType", space, &wrap_string(link_type))?; + } + + Ok(()) + } +} + +fn stringify_dependencies(entries: I) -> String +where + I: Iterator, + S1: AsRef, + S2: AsRef, +{ + let mut string = String::new(); + let mut first = true; + for (key, value) in entries { + let key = key.as_ref(); + let value = value.as_ref(); + + if !first { + string.push('\n'); + } + string.push_str(&format!(" {}: {}", wrap_string(key), wrap_string(value),)); + first = false; + } + string +} + +fn stringify_dependencies_meta<'a, I, S>(metadata: I) -> String +where + I: Iterator, + S: AsRef, +{ + let mut string = String::new(); + let mut first = true; + + let mut add_line = |dependency: &str, field: &str| { + if !first { + string.push('\n'); + } + + string.push_str(&format!( + " {}:\n {}: true", + wrap_string(dependency), + wrap_string(field) + )); + + first = false; + }; + + for (dependency, meta) in metadata { + let dependency = dependency.as_ref(); + if meta.optional.unwrap_or_default() { + add_line(dependency, "optional"); + } + if meta.unplugged.unwrap_or_default() { + add_line(dependency, "unplugged"); + } + } + + string +} + +fn wrap_string(s: &str) -> Cow { + match SIMPLE_STRING.is_match(s) { + // Simple strings require no wrapping + true => Cow::from(s), + // Complex strings require wrapping + false => { + Cow::from(serde_json::to_string(s).unwrap_or_else(|_| panic!("Unable to encode '{s}'"))) + } + } +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + + use super::*; + use crate::berry::SemverString; + + #[test] + fn test_metadata_display() { + let metadata = Metadata { + version: 6, + cache_key: "8c0".to_string(), + }; + assert_eq!( + metadata.to_string(), + "__metadata: + version: 6 + cacheKey: 8c0" + ); + } + + #[test] + fn test_wrap_string() { + fn assert(input: &str, expected: &str) { + assert_eq!(wrap_string(input), expected); + } + assert("debug@4.3.4", "debug@4.3.4"); + assert( + "eslint-module-utils@npm:^2.7.3", + "\"eslint-module-utils@npm:^2.7.3\"", + ); + assert("@babel/core", "\"@babel/core\""); + } + + #[test] + fn test_long_key_gets_wrapped() { + let long_key = "a".repeat(1025); + let lockfile = LockfileData { + metadata: Metadata { + version: 6, + cache_key: "8".into(), + }, + packages: [( + long_key.clone(), + BerryPackage { + version: SemverString("1.2.3".to_string()), + ..Default::default() + }, + )] + .iter() + .cloned() + .collect(), + }; + let serailized = lockfile.to_string(); + assert!(serailized.contains(&format!("? {long_key}\n"))); + } +} diff --git a/crates/turborepo-lockfiles/src/lib.rs b/crates/turborepo-lockfiles/src/lib.rs index 70185fd4561be..e15b4f9baa0cc 100644 --- a/crates/turborepo-lockfiles/src/lib.rs +++ b/crates/turborepo-lockfiles/src/lib.rs @@ -1,8 +1,10 @@ +mod berry; mod error; mod npm; use std::collections::{HashMap, HashSet}; +pub use berry::*; pub use error::Error; pub use npm::*; From fbec0bd278c81921a774e36348ef4b2bad849c58 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Mon, 27 Mar 2023 14:45:18 -0700 Subject: [PATCH 13/28] sync lockfile --- Cargo.lock | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d3b5d37e831a..033812eec99c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8019,12 +8019,8 @@ dependencies = [ name = "turborepo-lockfiles" version = "0.1.0" dependencies = [ - "lazy_static", - "pretty_assertions", - "regex", "serde", "serde_json", - "serde_yaml 0.9.17", "thiserror", ] From 1f11c12311dde2e718ca901ccbad5c7e47a33dcf Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Mon, 27 Mar 2023 15:32:49 -0700 Subject: [PATCH 14/28] add various parse functions --- Cargo.lock | 4 + .../src/berry/identifiers.rs | 103 ++++++++++++++++++ crates/turborepo-lockfiles/src/berry/mod.rs | 1 + 3 files changed, 108 insertions(+) create mode 100644 crates/turborepo-lockfiles/src/berry/identifiers.rs diff --git a/Cargo.lock b/Cargo.lock index 033812eec99c8..07e7b73cf3c78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8019,8 +8019,12 @@ dependencies = [ name = "turborepo-lockfiles" version = "0.1.0" dependencies = [ + "lazy_static", + "pretty_assertions", + "regex", "serde", "serde_json", + "serde_yaml", "thiserror", ] diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs new file mode 100644 index 0000000000000..700fc0bdbf1fb --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -0,0 +1,103 @@ +use lazy_static::lazy_static; +use regex::Regex; +use thiserror::Error; + +lazy_static! { + static ref IDENT: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+)$").unwrap(); + static ref DESCRIPTOR: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+?)(?:@(.+))$").unwrap(); +} + +#[derive(Debug, Error)] +pub enum Error { + #[error("Invalid descriptor ({0})")] + Ident(String), + #[error("Invalid descriptor ({0})")] + Descriptor(String), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Ident<'a> { + scope: Option<&'a str>, + name: &'a str, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Descriptor<'a> { + ident: Ident<'a>, + range: &'a str, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Locator<'a> { + ident: Ident<'a>, + reference: &'a str, +} + +impl<'a> TryFrom<&'a str> for Ident<'a> { + type Error = Error; + + fn try_from(value: &'a str) -> Result { + let make_err = || Error::Ident(value.to_string()); + let captures = IDENT.captures(value).ok_or_else(make_err)?; + let scope = captures.get(1).map(|m| m.as_str()); + let name = captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?; + Ok(Self { scope, name }) + } +} + +impl<'a> TryFrom<&'a str> for Descriptor<'a> { + type Error = Error; + + fn try_from(value: &'a str) -> Result { + let make_err = || Error::Descriptor(value.to_string()); + let captures = DESCRIPTOR.captures(value).ok_or_else(make_err)?; + let scope = captures.get(1).map(|m| m.as_str()); + let name = captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?; + let range = captures.get(3).map(|m| m.as_str()).ok_or_else(make_err)?; + let ident = Ident { scope, name }; + Ok(Descriptor { ident, range }) + } +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + + use super::*; + + #[test] + fn test_parse_ident_with_scope() { + assert_eq!( + Ident::try_from("@babel/parser").unwrap(), + Ident { + scope: Some("babel"), + name: "parser" + } + ) + } + + #[test] + fn test_parse_ident_without_scope() { + assert_eq!( + Ident::try_from("turbo").unwrap(), + Ident { + scope: None, + name: "turbo" + } + ) + } + + #[test] + fn test_parse_descriptor() { + assert_eq!( + Descriptor::try_from("@babel/code-frame@npm:7.12.11").unwrap(), + Descriptor { + ident: Ident { + scope: Some("babel"), + name: "code-frame" + }, + range: "npm:7.12.11", + } + ) + } +} diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index c1edd63544414..d5e62b5bb655e 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -1,4 +1,5 @@ mod de; +mod identifiers; mod ser; use serde::{Deserialize, Serialize}; From 3a140b9b0301f7c99331ff0753ef043dc9cd582a Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Mon, 3 Apr 2023 12:22:05 -0700 Subject: [PATCH 15/28] add decoding logic --- crates/turborepo-ffi/src/lib.rs | 2 - .../src/berry/identifiers.rs | 248 ++++++++++++++++-- crates/turborepo-lockfiles/src/berry/mod.rs | 149 ++++++++++- crates/turborepo-lockfiles/src/berry/ser.rs | 4 +- 4 files changed, 375 insertions(+), 28 deletions(-) diff --git a/crates/turborepo-ffi/src/lib.rs b/crates/turborepo-ffi/src/lib.rs index 6942244ce174c..00c95e420bc92 100644 --- a/crates/turborepo-ffi/src/lib.rs +++ b/crates/turborepo-ffi/src/lib.rs @@ -8,8 +8,6 @@ use std::{mem::ManuallyDrop, path::PathBuf}; pub use lockfile::{npm_subgraph, npm_transitive_closure}; -pub use lockfile::{npm_subgraph, npm_transitive_closure}; - mod proto { include!(concat!(env!("OUT_DIR"), "/_.rs")); } diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 700fc0bdbf1fb..a0eae39fc7da6 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -1,3 +1,5 @@ +use std::{borrow::Cow, fmt}; + use lazy_static::lazy_static; use regex::Regex; use thiserror::Error; @@ -5,32 +7,54 @@ use thiserror::Error; lazy_static! { static ref IDENT: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+)$").unwrap(); static ref DESCRIPTOR: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+?)(?:@(.+))$").unwrap(); + static ref PATCH_REF: Regex = Regex::new(r"patch:(.+)#(?:\./)?([^:]+)(?:::)?.*$").unwrap(); + static ref MULTIKEY: Regex = Regex::new(r" *, *").unwrap(); + static ref BUILTIN: Regex = Regex::new(r"^builtin<([^>]+)>$").unwrap(); } #[derive(Debug, Error)] pub enum Error { - #[error("Invalid descriptor ({0})")] + #[error("Invalid identifier ({0})")] Ident(String), #[error("Invalid descriptor ({0})")] Descriptor(String), + #[error("Invalid locator ({0})")] + Locator(String), } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +/// A package scope and name +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Ident<'a> { - scope: Option<&'a str>, - name: &'a str, + scope: Option>, + name: Cow<'a, str>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +/// An identifier with a semver range +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Descriptor<'a> { - ident: Ident<'a>, - range: &'a str, + pub ident: Ident<'a>, + pub range: Cow<'a, str>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +/// An identifier with a resolved version. +/// They are similar to descriptors except that descriptors can reference +/// multiple packages whereas a locator references exactly one. +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Locator<'a> { - ident: Ident<'a>, - reference: &'a str, + pub ident: Ident<'a>, + pub reference: Cow<'a, str>, +} + +impl<'a> Ident<'a> { + pub fn into_owned(&self) -> Ident<'static> { + let Ident { scope, name } = self; + let scope = scope + .as_ref() + .map(|scope| scope.to_string()) + .map(Cow::Owned); + let name = Cow::Owned(name.to_string()); + Ident { scope, name } + } } impl<'a> TryFrom<&'a str> for Ident<'a> { @@ -39,26 +63,114 @@ impl<'a> TryFrom<&'a str> for Ident<'a> { fn try_from(value: &'a str) -> Result { let make_err = || Error::Ident(value.to_string()); let captures = IDENT.captures(value).ok_or_else(make_err)?; - let scope = captures.get(1).map(|m| m.as_str()); - let name = captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?; + let scope = captures.get(1).map(|m| Cow::Borrowed(m.as_str())); + let name = Cow::Borrowed(captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?); Ok(Self { scope, name }) } } +impl<'a> fmt::Display for Ident<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(scope) = self.scope.as_deref() { + f.write_fmt(format_args!("@{scope}/"))?; + } + f.write_str(&self.name) + } +} + impl<'a> TryFrom<&'a str> for Descriptor<'a> { type Error = Error; fn try_from(value: &'a str) -> Result { let make_err = || Error::Descriptor(value.to_string()); let captures = DESCRIPTOR.captures(value).ok_or_else(make_err)?; - let scope = captures.get(1).map(|m| m.as_str()); - let name = captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?; - let range = captures.get(3).map(|m| m.as_str()).ok_or_else(make_err)?; + let scope = captures.get(1).map(|m| Cow::Borrowed(m.as_str())); + let name = Cow::Borrowed(captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?); + let range = Cow::Borrowed(captures.get(3).map(|m| m.as_str()).ok_or_else(make_err)?); let ident = Ident { scope, name }; Ok(Descriptor { ident, range }) } } +impl<'a> fmt::Display for Descriptor<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!("{}@{}", self.ident, self.range)) + } +} + +impl<'a> Descriptor<'a> { + /// Extracts all descriptors that are present in a lockfile entry key + pub fn from_lockfile_key(key: &'a str) -> impl Iterator, Error>> { + MULTIKEY.split(key).map(Descriptor::try_from) + } + + pub fn range_without_protocol(&self) -> &str { + self.range + .find(':') + .map_or(&self.range, |colon_index| &self.range[colon_index + 1..]) + } +} + +impl<'a> TryFrom<&'a str> for Locator<'a> { + type Error = Error; + + fn try_from(value: &'a str) -> Result { + // Descriptors and locators have the same structure so we use the descriptor + // parsing logic + let Descriptor { ident, range } = Descriptor::try_from(value).map_err(|err| match err { + Error::Descriptor(val) => Error::Locator(val), + _ => err, + })?; + Ok(Locator { + ident, + reference: range, + }) + } +} + +impl<'a> fmt::Display for Locator<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_fmt(format_args!("{}@{}", self.ident, self.reference)) + } +} + +impl<'a> Locator<'a> { + pub fn is_patch_builtin(patch: &str) -> bool { + patch.starts_with('~') || BUILTIN.is_match(patch) + } + + /// Converts a possibly borrowed Locator to one that must be owned + pub fn as_owned(&self) -> Locator<'static> { + let Locator { ident, reference } = self; + let ident = ident.into_owned(); + let reference = Cow::Owned(reference.to_string()); + Locator { ident, reference } + } + + pub fn patch_file(&self) -> Option<&str> { + PATCH_REF + .captures(&self.reference) + .and_then(|caps| caps.get(2)) + .map(|m| m.as_str()) + } + + pub fn patched_locator(&self) -> Option> { + let caps = PATCH_REF.captures(&self.reference)?; + let capture_group = caps.get(1)?; + let Locator { ident, reference } = Locator::try_from(capture_group.as_str()).ok()?; + // This might seem like a special case hack, but this is what yarn does + let mut decoded_reference = reference.replace("npm%3A", "npm:"); + // Some older versions of yarn don't encode the npm protocol + if !decoded_reference.starts_with("npm:") { + decoded_reference.insert_str(0, "npm:"); + } + Some(Locator { + ident: ident.into_owned(), + reference: Cow::Owned(decoded_reference), + }) + } +} + #[cfg(test)] mod test { use pretty_assertions::assert_eq; @@ -70,8 +182,8 @@ mod test { assert_eq!( Ident::try_from("@babel/parser").unwrap(), Ident { - scope: Some("babel"), - name: "parser" + scope: Some("babel".into()), + name: "parser".into() } ) } @@ -82,22 +194,116 @@ mod test { Ident::try_from("turbo").unwrap(), Ident { scope: None, - name: "turbo" + name: "turbo".into(), } ) } + #[test] + fn test_ident_roundtrip() { + for ident in ["turbo", "@babel/parser"] { + assert_eq!(ident, Ident::try_from(ident).unwrap().to_string()); + } + } + #[test] fn test_parse_descriptor() { assert_eq!( Descriptor::try_from("@babel/code-frame@npm:7.12.11").unwrap(), Descriptor { ident: Ident { - scope: Some("babel"), - name: "code-frame" + scope: Some("babel".into()), + name: "code-frame".into() }, - range: "npm:7.12.11", + range: "npm:7.12.11".into(), } ) } + + #[test] + fn test_descriptor_roundtrip() { + for descriptor in [ + "@babel/code-frame@npm:7.12.11", + "lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.21-6382451519.\ + patch::version=4.17.21&hash=2c6e9e&locator=berry-patch%40workspace%3A.", + ] { + assert_eq!( + descriptor, + Descriptor::try_from(descriptor).unwrap().to_string() + ) + } + } + + #[test] + fn test_locator_patch_file() { + struct TestCase { + locator: &'static str, + file: Option<&'static str>, + } + let test_cases = [ + TestCase { + locator: "lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.\ + 21-6382451519.patch::version=4.17.21&hash=2c6e9e&locator=berry-patch%\ + 40workspace%3A.", + file: Some(".yarn/patches/lodash-npm-4.17.21-6382451519.patch"), + }, + TestCase { + locator: "lodash@npm:4.17.21", + file: None, + }, + TestCase { + locator: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=07638b", + file: Some("~builtin"), + }, + ]; + for tc in test_cases { + let locator = Locator::try_from(tc.locator).unwrap(); + assert_eq!(locator.patch_file(), tc.file); + } + } + + #[test] + fn test_locator_patch_original_locator() { + let locator = Locator::try_from( + "lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.21-6382451519.\ + patch::version=4.17.21&hash=2c6e9e&locator=berry-patch%40workspace%3A.", + ) + .unwrap(); + let original = locator.patched_locator().unwrap(); + assert_eq!(original, Locator::try_from("lodash@npm:4.17.21").unwrap()) + } + + #[test] + fn test_patch_primary_version() { + struct TestCase { + locator: &'static str, + version: Option<&'static str>, + } + let test_cases = [ + TestCase { + locator: "lodash@patch:lodash@npm%3A4.17.21#./.yarn/patches/lodash-npm-4.17.\ + 21-6382451519.patch::locator=berry-patch%40workspace%3A.", + version: Some("npm:4.17.21"), + }, + TestCase { + locator: "typescript@patch:typescript@^4.5.2#~builtin", + version: Some("npm:^4.5.2"), + }, + TestCase { + locator: "react@npm:18.2.0", + version: None, + }, + ]; + for tc in test_cases { + let locator = Locator::try_from(tc.locator).unwrap(); + let patch_locator = locator.patched_locator(); + assert_eq!( + tc.version, + patch_locator.as_ref().map(|l| l.reference.as_ref()), + "{}", + tc.locator + ); + } + } } diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index d5e62b5bb655e..7ea47c30cca97 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -2,15 +2,42 @@ mod de; mod identifiers; mod ser; +use std::{ + collections::HashSet, + path::{Path, PathBuf}, +}; + +use identifiers::{Descriptor, Ident, Locator}; use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use super::Lockfile; + +#[derive(Debug, Error)] +pub enum Error { + #[error("unable to parse")] + Identifiers(#[from] identifiers::Error), + #[error("unable to find original package in patch locator {0}")] + PatchMissingOriginalLocator(Locator<'static>), +} // We depend on BTree iteration being sorted type Map = std::collections::BTreeMap; +pub struct BerryLockfile<'a> { + data: &'a LockfileData, + resolutions: Map, Locator<'a>>, + locator_package: Map, &'a BerryPackage>, + // Map of regular locators to patch locators that apply to them + patches: Map, Locator<'a>>, + // Descriptors that come from default package extensions that ship with berry + extensions: HashSet>, +} + // This is the direct representation of the lockfile as it appears on disk. // More internal tracking is required for effectively altering the lockfile #[derive(Debug, Deserialize, Serialize)] -struct LockfileData { +pub struct LockfileData { #[serde(rename = "__metadata")] metadata: Metadata, #[serde(flatten)] @@ -36,7 +63,7 @@ struct BerryPackage { // Structured metadata we need to persist bin: Option>, link_type: Option, - resolution: Option, + resolution: String, checksum: Option, conditions: Option, } @@ -47,6 +74,124 @@ struct DependencyMeta { unplugged: Option, } +impl<'a> BerryLockfile<'a> { + pub fn new(lockfile: &'a LockfileData) -> Result { + let mut patches = Map::new(); + let mut locator_package = Map::new(); + let mut descriptor_locator = Map::new(); + for (key, package) in &lockfile.packages { + let locator = Locator::try_from(package.resolution.as_str())?; + + // TODO we're ignoring buildin patches, should we not? + if let Some(path_file) = locator.patch_file() { + // in go code we just produce the original by replacing the ref with + // "npm:{package.version}" I think we can extract this from the + // locator itself + let original_locator = locator + .patched_locator() + .ok_or_else(|| Error::PatchMissingOriginalLocator(locator.as_owned()))?; + patches.insert(original_locator, locator.clone()); + } + + locator_package.insert(locator.clone(), package); + + for descriptor in Descriptor::from_lockfile_key(key) { + let descriptor = descriptor?; + descriptor_locator.insert(descriptor, locator.clone()); + } + } + + // A temporary representation that is keyed off of the ident to allow for faster + // finding of possible descriptor matches + let mut descriptor_by_indent: Map> = Map::new(); + for descriptor in descriptor_locator.keys() { + let ranges = descriptor_by_indent + .entry(descriptor.ident.clone()) + .or_default(); + ranges.insert(&descriptor.range); + } + for package in lockfile.packages.values() { + if let Some(deps) = &package.dependencies { + for (name, range) in deps { + let ident = Ident::try_from(name.as_str())?; + if let Some(ranges) = descriptor_by_indent.get_mut(&ident) { + // If a full range contains the range of an entry then + // the descriptor can be accounted for. + // We keep any range that doesn't contain the range listed in the entry + ranges.retain(|full_range| !full_range.contains(range.as_ref())) + } // should there ever be a time where we don't have a + // matching ident? + } + } + } + + // we go through every dep package + // if we can't find a descriptor for a given ident then we should add a map + // how does this work for pkg specific overrides? + // need to get resolution field as otherwise impossible to tell which version + // should be used + + let mut extensions = HashSet::new(); + for (ident, ranges) in descriptor_by_indent { + for range in ranges { + extensions.insert(Descriptor { + ident: ident.into_owned(), + range: range.to_string().into(), + }); + } + } + + // make sure to filter out any idents with no ranges + + // instead of generating all possible descriptors we could just check the ident + // & that the descriptor minus the protocol + + // list of package extensions is just descriptors - any that appear to come from + // a dependency + + // overrides essentially inject a descriptor with an exact version + // this descriptor should be used as the default if it appears an entry's dep + // doesn't exist e.g. lodash@npm:^4.17.20 doesn't exist + // we should then look any lodash@ and use that instead + + // we'll need to keep a list of these mappings around for all deps + Ok(Self { + data: lockfile, + resolutions: descriptor_locator, + locator_package, + patches, + extensions, + }) + } + + pub fn patches(&self) -> Vec<&Path> { + self.patches + .values() + .filter_map(|patch| patch.patch_file()) + .filter(|path| !Locator::is_patch_builtin(path)) + .map(Path::new) + .collect() + } +} + +impl<'a> Lockfile for BerryLockfile<'a> { + fn resolve_package( + &self, + _workspace_path: &str, + name: &str, + version: &str, + ) -> Result, crate::Error> { + todo!() + } + + fn all_dependencies( + &self, + key: &str, + ) -> Result>, crate::Error> { + todo!() + } +} + // Newtype used exclusively for correct deserialization #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Default, Clone)] struct SemverString(String); diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs index c8fbf10348053..5f875686a5a15 100644 --- a/crates/turborepo-lockfiles/src/berry/ser.rs +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -70,9 +70,7 @@ impl fmt::Display for BerryPackage { let space = " "; let newline = "\n"; write_line("version", space, &wrap_string(self.version.as_ref()))?; - if let Some(resolution) = &self.resolution { - write_line("resolution", space, &wrap_string(resolution))?; - } + write_line("resolution", space, &wrap_string(&self.resolution))?; // deps, peer deps, deps meta, peer deps meta, bin if let Some(deps) = &self.dependencies { write_line( From 821bdffb4a49f1995f8071e42774dedd36e0e17c Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Wed, 5 Apr 2023 11:00:58 -0700 Subject: [PATCH 16/28] add resolution parser --- Cargo.lock | 2 + crates/turborepo-lockfiles/Cargo.toml | 2 + crates/turborepo-lockfiles/src/berry/mod.rs | 1 + .../src/berry/resolution.pest | 23 ++ .../src/berry/resolution.rs | 198 ++++++++++++++++++ 5 files changed, 226 insertions(+) create mode 100644 crates/turborepo-lockfiles/src/berry/resolution.pest create mode 100644 crates/turborepo-lockfiles/src/berry/resolution.rs diff --git a/Cargo.lock b/Cargo.lock index 07e7b73cf3c78..1bba7e8d08a33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8020,6 +8020,8 @@ name = "turborepo-lockfiles" version = "0.1.0" dependencies = [ "lazy_static", + "pest", + "pest_derive", "pretty_assertions", "regex", "serde", diff --git a/crates/turborepo-lockfiles/Cargo.toml b/crates/turborepo-lockfiles/Cargo.toml index 6736b6e622dd9..b14005cd693d5 100644 --- a/crates/turborepo-lockfiles/Cargo.toml +++ b/crates/turborepo-lockfiles/Cargo.toml @@ -8,6 +8,8 @@ license = "MPL-2.0" [dependencies] lazy_static = "1.4.0" +pest = "2.5.6" +pest_derive = "2.5.6" regex = "1" serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.86" diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index 7ea47c30cca97..e0e377a6c9e03 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -1,5 +1,6 @@ mod de; mod identifiers; +mod resolution; mod ser; use std::{ diff --git a/crates/turborepo-lockfiles/src/berry/resolution.pest b/crates/turborepo-lockfiles/src/berry/resolution.pest new file mode 100644 index 0000000000000..ef935eba688e0 --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/resolution.pest @@ -0,0 +1,23 @@ +// See +// https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-parsers/sources/grammars/resolution.pegjs + +resolution = { + SOI ~ + ((specifier ~ "/" ~ specifier) + | specifier) + ~ EOI +} + +specifier = { + (fullName ~ "@" ~ description) + | fullName +} + +fullName = { + ( "@" ~ ident ~ "/" ~ ident ) + | ident +} + +ident = { (!("/" | "@") ~ ANY) + } + +description = { (!("/") ~ ANY) + } diff --git a/crates/turborepo-lockfiles/src/berry/resolution.rs b/crates/turborepo-lockfiles/src/berry/resolution.rs new file mode 100644 index 0000000000000..6e537723e9bb8 --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/resolution.rs @@ -0,0 +1,198 @@ +use std::fmt; + +use pest::{iterators::Pair, Parser}; +use pest_derive::Parser; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum Error { + #[error("unable to parse")] + ParseError(#[from] pest::error::Error), + #[error("unexpected end of input")] + UnexpectedEOI, + #[error("unexpected token")] + UnexpectedToken(Rule), +} + +#[derive(Debug, PartialEq, Clone, Copy, Eq, Default)] +pub struct Resolution<'a> { + from: Option>, + descriptor: Specifier<'a>, +} + +#[derive(Debug, PartialEq, Clone, Copy, Eq, Default)] +struct Specifier<'a> { + full_name: &'a str, + description: Option<&'a str>, +} + +#[derive(Parser)] +#[grammar = "src/berry/resolution.pest"] +struct ResolutionParser; + +pub fn parse_resolution(resolution: &str) -> Result { + let resolution = ResolutionParser::parse(Rule::resolution, resolution)? + .next() + .ok_or(Error::UnexpectedEOI)?; + + match resolution.as_rule() { + Rule::resolution => { + let mut specifiers = resolution.into_inner(); + let s1 = parse_specifier(specifiers.next().ok_or(Error::UnexpectedEOI)?)? + .ok_or(Error::UnexpectedEOI)?; + let s2 = specifiers + .next() + .map(parse_specifier) + .transpose()? + .flatten(); + Ok(if let Some(s2) = s2 { + Resolution { + from: Some(s1), + descriptor: s2, + } + } else { + Resolution { + from: None, + descriptor: s1, + } + }) + } + Rule::EOI => Err(Error::UnexpectedEOI), + _ => Err(Error::UnexpectedToken(resolution.as_rule())), + } +} + +fn parse_specifier(specifier: Pair<'_, Rule>) -> Result, Error> { + match specifier.as_rule() { + Rule::specifier => { + let mut parts = specifier.into_inner(); + let full_name = parts.next().ok_or(Error::UnexpectedEOI)?.as_str(); + let description = parts.next().map(|p| p.as_str()); + Ok(Some(Specifier { + full_name, + description, + })) + } + Rule::EOI => Ok(None), + _ => Err(Error::UnexpectedToken(specifier.as_rule())), + } +} + +impl fmt::Display for Resolution<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if let Some(from) = &self.from { + f.write_fmt(format_args!("{from}/"))?; + } + f.write_fmt(format_args!("{}", self.descriptor))?; + todo!() + } +} + +impl fmt::Display for Specifier<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.full_name)?; + if let Some(descriptor) = self.description { + f.write_fmt(format_args!("@{descriptor}"))?; + } + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_full_name() { + assert_eq!( + ResolutionParser::parse(Rule::fullName, "relay-compiler") + .unwrap() + .as_str(), + "relay-compiler" + ); + assert_eq!( + ResolutionParser::parse(Rule::fullName, "@babel/types") + .unwrap() + .as_str(), + "@babel/types" + ); + } + + #[test] + fn test_specifier() { + assert_eq!( + ResolutionParser::parse(Rule::specifier, "replay-compiler") + .unwrap() + .as_str(), + "replay-compiler" + ); + assert_eq!( + ResolutionParser::parse(Rule::specifier, "replay-compiler@npm:1.0.0") + .unwrap() + .as_str(), + "replay-compiler@npm:1.0.0" + ); + } + + #[test] + fn test_descriptor_only() { + assert_eq!( + parse_resolution("relay-compiler").unwrap(), + Resolution { + from: None, + descriptor: Specifier { + full_name: "relay-compiler", + description: None + } + } + ) + } + + #[test] + fn test_descriptor_with_scope() { + assert_eq!( + parse_resolution("@babel/core").unwrap(), + Resolution { + from: None, + descriptor: Specifier { + full_name: "@babel/core", + description: None + } + } + ) + } + + #[test] + fn test_from_and_descriptor_only() { + assert_eq!( + parse_resolution("webpack/memory-fs").unwrap(), + Resolution { + from: Some(Specifier { + full_name: "webpack", + description: None + }), + descriptor: Specifier { + full_name: "memory-fs", + description: None + } + } + ) + } + + #[test] + fn test_descriptor_with_version() { + assert_eq!( + parse_resolution("@babel/core@npm:7.0.0/@babel/generator").unwrap(), + Resolution { + from: Some(Specifier { + full_name: "@babel/core", + description: Some("npm:7.0.0"), + }), + descriptor: Specifier { + full_name: "@babel/generator", + description: None + } + } + ) + } +} From 41812932b037a75aa88a1c127021c2d93c07492d Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Thu, 6 Apr 2023 16:16:32 -0700 Subject: [PATCH 17/28] add resolution aware package resolve --- Cargo.lock | 1 + crates/turborepo-lockfiles/Cargo.toml | 1 + .../src/berry/identifiers.rs | 18 ++++ crates/turborepo-lockfiles/src/berry/mod.rs | 76 ++++++++++++++- .../src/berry/resolution.rs | 96 ++++++++++++++++++- 5 files changed, 185 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1bba7e8d08a33..4e4141aaab5e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8024,6 +8024,7 @@ dependencies = [ "pest_derive", "pretty_assertions", "regex", + "semver 1.0.17", "serde", "serde_json", "serde_yaml", diff --git a/crates/turborepo-lockfiles/Cargo.toml b/crates/turborepo-lockfiles/Cargo.toml index b14005cd693d5..c3612c051471d 100644 --- a/crates/turborepo-lockfiles/Cargo.toml +++ b/crates/turborepo-lockfiles/Cargo.toml @@ -11,6 +11,7 @@ lazy_static = "1.4.0" pest = "2.5.6" pest_derive = "2.5.6" regex = "1" +semver = "1.0.17" serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.86" serde_yaml = "0.9" diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index a0eae39fc7da6..4e98abda941b3 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -10,6 +10,7 @@ lazy_static! { static ref PATCH_REF: Regex = Regex::new(r"patch:(.+)#(?:\./)?([^:]+)(?:::)?.*$").unwrap(); static ref MULTIKEY: Regex = Regex::new(r" *, *").unwrap(); static ref BUILTIN: Regex = Regex::new(r"^builtin<([^>]+)>$").unwrap(); + static ref PROTOCOL: Regex = Regex::new(r"^[A-Za-z]+:").unwrap(); } #[derive(Debug, Error)] @@ -99,6 +100,15 @@ impl<'a> fmt::Display for Descriptor<'a> { } impl<'a> Descriptor<'a> { + pub fn new(ident: &'a str, range: &'a str) -> Result { + let ident = Ident::try_from(ident)?; + let mut range = Cow::from(range); + // If no protocol we use the default "npm:" protocol + if !PROTOCOL.is_match(&range) { + range.to_mut().insert_str(0, "npm:"); + } + Ok(Self { ident, range }) + } /// Extracts all descriptors that are present in a lockfile entry key pub fn from_lockfile_key(key: &'a str) -> impl Iterator, Error>> { MULTIKEY.split(key).map(Descriptor::try_from) @@ -135,6 +145,14 @@ impl<'a> fmt::Display for Locator<'a> { } impl<'a> Locator<'a> { + pub fn new(ident: &'a str, reference: &'a str) -> Result { + let ident = Ident::try_from(ident)?; + Ok(Self { + ident, + reference: reference.into(), + }) + } + pub fn is_patch_builtin(patch: &str) -> bool { patch.starts_with('~') || BUILTIN.is_match(patch) } diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index e0e377a6c9e03..aa1a83686ac40 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -12,6 +12,7 @@ use identifiers::{Descriptor, Ident, Locator}; use serde::{Deserialize, Serialize}; use thiserror::Error; +use self::resolution::{parse_resolution, Resolution}; use super::Lockfile; #[derive(Debug, Error)] @@ -20,6 +21,8 @@ pub enum Error { Identifiers(#[from] identifiers::Error), #[error("unable to find original package in patch locator {0}")] PatchMissingOriginalLocator(Locator<'static>), + #[error("unable to parse resolutions field")] + Resolutions(#[from] resolution::Error), } // We depend on BTree iteration being sorted @@ -33,6 +36,8 @@ pub struct BerryLockfile<'a> { patches: Map, Locator<'a>>, // Descriptors that come from default package extensions that ship with berry extensions: HashSet>, + // Package overrides + overrides: Map, &'a str>, } // This is the direct representation of the lockfile as it appears on disk. @@ -75,8 +80,16 @@ struct DependencyMeta { unplugged: Option, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BerryManifest { + resolutions: Option>, +} + impl<'a> BerryLockfile<'a> { - pub fn new(lockfile: &'a LockfileData) -> Result { + pub fn new( + lockfile: &'a LockfileData, + manifest: Option<&'a BerryManifest>, + ) -> Result { let mut patches = Map::new(); let mut locator_package = Map::new(); let mut descriptor_locator = Map::new(); @@ -102,6 +115,11 @@ impl<'a> BerryLockfile<'a> { } } + let overrides = manifest + .and_then(|manifest| manifest.resolutions()) + .transpose()? + .unwrap_or_default(); + // A temporary representation that is keyed off of the ident to allow for faster // finding of possible descriptor matches let mut descriptor_by_indent: Map> = Map::new(); @@ -162,6 +180,7 @@ impl<'a> BerryLockfile<'a> { locator_package, patches, extensions, + overrides, }) } @@ -178,21 +197,72 @@ impl<'a> BerryLockfile<'a> { impl<'a> Lockfile for BerryLockfile<'a> { fn resolve_package( &self, - _workspace_path: &str, + workspace_path: &str, name: &str, version: &str, ) -> Result, crate::Error> { - todo!() + // Retrieving the workspace package is necessary in case there's a + // workspace specific override. + // In practice, this is extremely silly since changing the version of + // the dependency in the workspace's package.json does the same thing. + let workspace_locator = self + .locator_package + .keys() + .find(|locator| { + locator.reference.starts_with("workspace:") + && locator.reference.ends_with(workspace_path) + }) + .ok_or_else(|| crate::Error::MissingWorkspace(workspace_path.to_string()))?; + + // TODO don't unwrap here + let mut dependency = Descriptor::new(name, version).unwrap(); + for (resolution, reference) in &self.overrides { + if let Some(override_dependency) = + resolution.reduce_dependency(reference, &dependency, workspace_locator) + { + dependency = override_dependency; + } + } + + let locator = self + .resolutions + .get(&dependency) + .ok_or_else(|| crate::Error::MissingPackage(dependency.to_string()))?; + + let package = self + .locator_package + .get(locator) + .ok_or_else(|| crate::Error::MissingPackage(dependency.to_string()))?; + + Ok(Some(crate::Package { + key: locator.to_string(), + version: package.version.clone().into(), + })) } fn all_dependencies( &self, key: &str, ) -> Result>, crate::Error> { + // For each dependency we need to check if there's an override todo!() } } +impl BerryManifest { + pub fn resolutions(&self) -> Option, Error>> { + self.resolutions.as_ref().map(|resolutions| { + resolutions + .iter() + .map(|(resolution, reference)| { + let res = parse_resolution(resolution)?; + Ok((res, reference.as_str())) + }) + .collect() + }) + } +} + // Newtype used exclusively for correct deserialization #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Default, Clone)] struct SemverString(String); diff --git a/crates/turborepo-lockfiles/src/berry/resolution.rs b/crates/turborepo-lockfiles/src/berry/resolution.rs index 6e537723e9bb8..2ed02f3213d9b 100644 --- a/crates/turborepo-lockfiles/src/berry/resolution.rs +++ b/crates/turborepo-lockfiles/src/berry/resolution.rs @@ -1,26 +1,35 @@ use std::fmt; +use lazy_static::lazy_static; use pest::{iterators::Pair, Parser}; use pest_derive::Parser; +use regex::Regex; +use semver::Version; use thiserror::Error; +use super::identifiers::{Descriptor, Ident, Locator}; + +lazy_static! { + static ref TAG_REGEX: Regex = Regex::new(r"^[^v][a-z0-9._-]*$").unwrap(); +} + #[derive(Debug, Error)] pub enum Error { #[error("unable to parse")] - ParseError(#[from] pest::error::Error), + Pest(#[from] Box>), #[error("unexpected end of input")] UnexpectedEOI, #[error("unexpected token")] UnexpectedToken(Rule), } -#[derive(Debug, PartialEq, Clone, Copy, Eq, Default)] +#[derive(Debug, PartialEq, Clone, Copy, Eq, Default, PartialOrd, Ord, Hash)] pub struct Resolution<'a> { from: Option>, descriptor: Specifier<'a>, } -#[derive(Debug, PartialEq, Clone, Copy, Eq, Default)] +#[derive(Debug, PartialEq, Clone, Copy, Eq, Default, PartialOrd, Ord, Hash)] struct Specifier<'a> { full_name: &'a str, description: Option<&'a str>, @@ -31,7 +40,8 @@ struct Specifier<'a> { struct ResolutionParser; pub fn parse_resolution(resolution: &str) -> Result { - let resolution = ResolutionParser::parse(Rule::resolution, resolution)? + let resolution = ResolutionParser::parse(Rule::resolution, resolution) + .map_err(Box::new)? .next() .ok_or(Error::UnexpectedEOI)?; @@ -78,6 +88,84 @@ fn parse_specifier(specifier: Pair<'_, Rule>) -> Result, Error } } +impl<'a> Resolution<'a> { + /// Returns a new descriptor if necessary (TODO finish doc) + // reference is the version override + // locator is the package where the dependency is coming from + // dependency is the package that we are considering overriding + // will only return desc if there's an override that should be used instead + pub fn reduce_dependency<'b>( + &self, + reference: &str, + dependency: &Descriptor<'b>, + locator: &Locator, + ) -> Option> { + if let Some(from) = &self.from { + let from_ident = from.ident(); + // If the from doesn't match the locator we skip + if from_ident != locator.ident { + return None; + } + + let mut from_locator = Locator { + ident: from_ident, + reference: from + .description + .map_or_else(|| locator.reference.to_string(), |desc| desc.to_string()) + .into(), + }; + + // we now insert the default protocol if one isn't present + if Version::parse(&from_locator.reference).is_ok() + || TAG_REGEX.is_match(&from_locator.reference) + { + let reference = from_locator.reference.to_mut(); + reference.insert_str(0, "npm:"); + } + + // If the normalized from locator doesn't match the package we're currently + // processing, we skip + if &from_locator != locator { + return None; + } + } + + // Note: berry parses this as a locator even though it's an ident + let resolution_ident = self.descriptor.ident(); + if resolution_ident != dependency.ident { + return None; + } + + let resolution_descriptor = Descriptor { + ident: resolution_ident, + range: self + .descriptor + .description + .map_or_else(|| dependency.range.to_string(), |range| range.to_string()) + .into(), + }; + + if &resolution_descriptor != dependency { + return None; + } + + // We have a match an we now override the dependency + let mut dependency_override = dependency.clone(); + dependency_override.range = reference.to_string().into(); + if Version::parse(reference).is_ok() || TAG_REGEX.is_match(reference) { + dependency_override.range.to_mut().insert_str(0, "npm:") + } + + Some(dependency_override) + } +} + +impl<'a> Specifier<'a> { + fn ident(&self) -> Ident<'a> { + Ident::try_from(self.full_name).expect("Invalid identifier in resolution") + } +} + impl fmt::Display for Resolution<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(from) = &self.from { From 76d01334a54c78c279891382ec06f6e3547cbdf6 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 11 Apr 2023 15:21:22 -0700 Subject: [PATCH 18/28] add subgraph impl to berry --- .../src/berry/identifiers.rs | 54 +++-- crates/turborepo-lockfiles/src/berry/mod.rs | 212 +++++++++++++++++- crates/turborepo-lockfiles/src/lib.rs | 2 +- crates/turborepo-lockfiles/src/npm.rs | 4 +- 4 files changed, 246 insertions(+), 26 deletions(-) diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 4e98abda941b3..04b476755b8ef 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, fmt}; +use std::{borrow::Cow, fmt, ops::Index}; use lazy_static::lazy_static; use regex::Regex; @@ -119,6 +119,18 @@ impl<'a> Descriptor<'a> { .find(':') .map_or(&self.range, |colon_index| &self.range[colon_index + 1..]) } + + pub fn protocol(&self) -> Option<&str> { + self.range.find(':').map(|i| &self.range[0..i]) + } + + /// If the descriptor is a patch returns the version that the patch targets + pub fn primary_version(&self) -> Option { + let Locator { reference, .. } = Locator::from_patch_reference(&self.range)?; + // This is always owned due to needing to replace '%3A' with ':' so + // we extract the owned string. + Some(reference.into_owned()) + } } impl<'a> TryFrom<&'a str> for Locator<'a> { @@ -144,6 +156,8 @@ impl<'a> fmt::Display for Locator<'a> { } } +const WORKSPACE_PROTOCOL: &str = "workspace:"; + impl<'a> Locator<'a> { pub fn new(ident: &'a str, reference: &'a str) -> Result { let ident = Ident::try_from(ident)?; @@ -153,10 +167,32 @@ impl<'a> Locator<'a> { }) } + fn from_patch_reference(patch_reference: &'a str) -> Option { + let caps = PATCH_REF.captures(patch_reference)?; + let capture_group = caps.get(1)?; + let Locator { ident, reference } = Locator::try_from(capture_group.as_str()).ok()?; + // This might seem like a special case hack, but this is what yarn does + let mut decoded_reference = reference.replace("npm%3A", "npm:"); + // Some older versions of yarn don't encode the npm protocol + if !decoded_reference.starts_with("npm:") { + decoded_reference.insert_str(0, "npm:"); + } + Some(Locator { + ident, + reference: Cow::Owned(decoded_reference), + }) + } + pub fn is_patch_builtin(patch: &str) -> bool { patch.starts_with('~') || BUILTIN.is_match(patch) } + pub fn is_workspace_path(&self, workspace_path: &str) -> bool { + // This is slightly awkward, but it allows us to avoid an allocation + self.reference.starts_with(WORKSPACE_PROTOCOL) + && &self.reference[WORKSPACE_PROTOCOL.len()..] == workspace_path + } + /// Converts a possibly borrowed Locator to one that must be owned pub fn as_owned(&self) -> Locator<'static> { let Locator { ident, reference } = self; @@ -172,20 +208,8 @@ impl<'a> Locator<'a> { .map(|m| m.as_str()) } - pub fn patched_locator(&self) -> Option> { - let caps = PATCH_REF.captures(&self.reference)?; - let capture_group = caps.get(1)?; - let Locator { ident, reference } = Locator::try_from(capture_group.as_str()).ok()?; - // This might seem like a special case hack, but this is what yarn does - let mut decoded_reference = reference.replace("npm%3A", "npm:"); - // Some older versions of yarn don't encode the npm protocol - if !decoded_reference.starts_with("npm:") { - decoded_reference.insert_str(0, "npm:"); - } - Some(Locator { - ident: ident.into_owned(), - reference: Cow::Owned(decoded_reference), - }) + pub fn patched_locator(&self) -> Option> { + Locator::from_patch_reference(&self.reference) } } diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index aa1a83686ac40..464a10e0bc76f 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -4,7 +4,8 @@ mod resolution; mod ser; use std::{ - collections::HashSet, + collections::{HashMap, HashSet}, + iter, path::{Path, PathBuf}, }; @@ -23,6 +24,8 @@ pub enum Error { PatchMissingOriginalLocator(Locator<'static>), #[error("unable to parse resolutions field")] Resolutions(#[from] resolution::Error), + #[error("unable to find entry for {0}")] + MissingPackageForLocator(Locator<'static>), } // We depend on BTree iteration being sorted @@ -50,11 +53,11 @@ pub struct LockfileData { packages: Map, } -#[derive(Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[derive(Debug, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Clone)] #[serde(rename_all = "camelCase")] struct Metadata { version: u64, - cache_key: String, + cache_key: Option, } #[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Default, Clone)] @@ -192,6 +195,176 @@ impl<'a> BerryLockfile<'a> { .map(Path::new) .collect() } + + fn locator_to_descriptors(&self) -> HashMap<&Locator<'a>, HashSet<&Descriptor<'a>>> { + let mut reverse_lookup: HashMap<&Locator, HashSet<&Descriptor>> = + HashMap::with_capacity(self.locator_package.len()); + + for (descriptor, locator) in &self.resolutions { + reverse_lookup + .entry(locator) + .or_default() + .insert(descriptor); + } + + reverse_lookup + } + + pub fn lockfile(&self) -> Result { + let mut packages: std::collections::BTreeMap = Map::new(); + let mut metadata = self.data.metadata.clone(); + let reverse_lookup = self.locator_to_descriptors(); + + for (locator, descriptors) in reverse_lookup { + let mut descriptors = descriptors + .into_iter() + .map(|d| d.to_string()) + .collect::>(); + descriptors.sort(); + let key = descriptors.join(", "); + + let package = self + .locator_package + .get(locator) + .ok_or_else(|| Error::MissingPackageForLocator(locator.as_owned()))?; + packages.insert(key, (*package).clone()); + } + + // If there aren't any checksums in the lockfile, then cache key is omitted + if self + .resolutions + .values() + .map(|locator| { + self.locator_package + .get(locator) + .unwrap_or_else(|| panic!("No entry found for {locator}")) + }) + .all(|pkg| pkg.checksum.is_none()) + { + metadata.cache_key = None; + } + + Ok(LockfileData { metadata, packages }) + } + + pub fn subgraph( + &self, + workspace_packages: &[String], + packages: &[String], + ) -> Result, Error> { + let reverse_lookup = self.locator_to_descriptors(); + + let mut resolutions = Map::new(); + let mut patches = Map::new(); + + // Include all workspace packages and their references + for (locator, package) in &self.locator_package { + if workspace_packages + .iter() + .map(|s| s.as_str()) + .chain(iter::once(".")) + .any(|path| locator.is_workspace_path(path)) + { + // we need to all descriptors coming out the workspace + for (name, range) in package.dependencies.iter().flatten() { + let dependency = self.resolve_dependency(locator, name, range.as_ref())?; + // we add this dependency to the resolutions + let dep_locator = self.resolutions.get(&dependency).unwrap(); + resolutions.insert(dependency, locator.clone()); + } + + if let Some(descriptors) = reverse_lookup.get(locator) { + for descriptor in descriptors { + resolutions.insert((*descriptor).clone(), locator.clone()); + } + } + } + } + + for key in packages { + let locator = Locator::try_from(key.as_str())?; + + let package = self + .locator_package + .get(&locator) + .ok_or_else(|| Error::MissingPackageForLocator(locator.as_owned()))?; + + for (name, range) in package.dependencies.iter().flatten() { + let dependency = self.resolve_dependency(&locator, &name, range.as_ref())?; + let dep_locator = self.resolutions.get(&dependency).unwrap(); + resolutions.insert(dependency, locator.clone()); + } + + // these packages are included, we must figure out which descriptors are + // included we just lookup the package and calculate all of the + // descriptors it creates + if let Some(patch_locator) = self.patches.get(&locator) { + patches.insert(locator.as_owned(), patch_locator.clone()); + let patch_descriptors = reverse_lookup + .get(patch_locator) + .unwrap_or_else(|| panic!("No descriptors found for {patch_locator}")); + for patch_descriptor in patch_descriptors { + resolutions.insert((*patch_descriptor).clone(), patch_locator.clone()); + } + } + } + + for (primary, patch) in &self.patches { + let primary_descriptors = reverse_lookup.get(primary).unwrap(); + let patch_descriptors = reverse_lookup.get(patch).unwrap(); + + // For each patch descriptor we extract the primary descriptor that each patch + // descriptor targets and check if that descriptor is present in the + // pruned map and add it if it is present + for patch_descriptor in patch_descriptors { + let version = patch_descriptor.primary_version().unwrap(); + let primary_descriptor = Descriptor { + ident: patch_descriptor.ident.clone(), + range: version.into(), + }; + + if resolutions.contains_key(&primary_descriptor) { + resolutions.insert((*patch_descriptor).clone(), patch.clone()); + } + } + } + + for descriptor in &self.extensions { + // TODO graceful + let locator = self.resolutions.get(descriptor).unwrap(); + resolutions.insert(descriptor.clone(), locator.clone()); + } + + Ok(Self { + data: self.data, + resolutions, + // We rely on resolutions only containing the required locators + // for proper pruning. + locator_package: self.locator_package.clone(), + patches, + extensions: self.extensions.clone(), + overrides: self.overrides.clone(), + }) + } + + fn resolve_dependency( + &self, + locator: &Locator, + name: &str, + range: &str, + ) -> Result { + let mut dependency = Descriptor::new(name, range)?; + + for (resolution, reference) in &self.overrides { + if let Some(override_dependency) = + resolution.reduce_dependency(reference, &dependency, locator) + { + dependency = override_dependency; + } + } + + Ok(dependency) + } } impl<'a> Lockfile for BerryLockfile<'a> { @@ -214,8 +387,8 @@ impl<'a> Lockfile for BerryLockfile<'a> { }) .ok_or_else(|| crate::Error::MissingWorkspace(workspace_path.to_string()))?; - // TODO don't unwrap here - let mut dependency = Descriptor::new(name, version).unwrap(); + let mut dependency = Descriptor::new(name, version) + .unwrap_or_else(|_| panic!("{name} is an invalid lockfile identifier")); for (resolution, reference) in &self.overrides { if let Some(override_dependency) = resolution.reduce_dependency(reference, &dependency, workspace_locator) @@ -243,9 +416,32 @@ impl<'a> Lockfile for BerryLockfile<'a> { fn all_dependencies( &self, key: &str, - ) -> Result>, crate::Error> { + ) -> Result>, crate::Error> { + let locator = + Locator::try_from(key).unwrap_or_else(|_| panic!("Was passed invalid locator: {key}")); + let package = self.locator_package.get(&locator); + + if package.is_none() { + return Ok(None); + } + + let package = package.unwrap(); + + let mut map = HashMap::new(); + for (name, version) in package.dependencies.iter().flatten() { + let mut dependency = Descriptor::new(name, version.as_ref()).unwrap(); + for (resolution, reference) in &self.overrides { + if let Some(override_dependency) = + resolution.reduce_dependency(reference, &dependency, &locator) + { + dependency = override_dependency; + break; + } + } + map.insert(dependency.ident.to_string(), dependency.range.to_string()); + } // For each dependency we need to check if there's an override - todo!() + Ok(Some(map)) } } @@ -290,7 +486,7 @@ mod test { let lockfile: LockfileData = serde_yaml::from_slice(include_bytes!("../../fixtures/berry.lock")).unwrap(); assert_eq!(lockfile.metadata.version, 6); - assert_eq!(lockfile.metadata.cache_key, "8c0"); + assert_eq!(lockfile.metadata.cache_key.as_deref(), Some("8c0")); } #[test] diff --git a/crates/turborepo-lockfiles/src/lib.rs b/crates/turborepo-lockfiles/src/lib.rs index e15b4f9baa0cc..f5b3821f62ea0 100644 --- a/crates/turborepo-lockfiles/src/lib.rs +++ b/crates/turborepo-lockfiles/src/lib.rs @@ -28,7 +28,7 @@ pub trait Lockfile { ) -> Result, Error>; // Given a lockfile key return all (prod/dev/optional) dependencies of that // package - fn all_dependencies(&self, key: &str) -> Result>, Error>; + fn all_dependencies(&self, key: &str) -> Result>, Error>; } // this should get replaced by petgraph in the future :) diff --git a/crates/turborepo-lockfiles/src/npm.rs b/crates/turborepo-lockfiles/src/npm.rs index 0039cda29beb1..9c845c19ec5f5 100644 --- a/crates/turborepo-lockfiles/src/npm.rs +++ b/crates/turborepo-lockfiles/src/npm.rs @@ -75,7 +75,7 @@ impl Lockfile for NpmLockfile { .transpose() } - fn all_dependencies(&self, key: &str) -> Result>, Error> { + fn all_dependencies(&self, key: &str) -> Result>, Error> { self.packages .get(key) .map(|pkg| { @@ -88,7 +88,7 @@ impl Lockfile for NpmLockfile { let version = entry.version.as_deref().ok_or_else(|| { Error::MissingVersion(possible_key.clone()) })?; - Ok((possible_key, version)) + Ok((possible_key, version.to_string())) }) }) }) From 98efadd83ef289b608174882a7160c8d7209499e Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Tue, 11 Apr 2023 15:50:17 -0700 Subject: [PATCH 19/28] fix compilation issue --- .../fixtures/minimal-berry.lock | 45 +++++++++++++++++++ .../src/berry/identifiers.rs | 6 ++- crates/turborepo-lockfiles/src/berry/mod.rs | 37 ++++++++++++--- crates/turborepo-lockfiles/src/berry/ser.rs | 15 +++---- 4 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 crates/turborepo-lockfiles/fixtures/minimal-berry.lock diff --git a/crates/turborepo-lockfiles/fixtures/minimal-berry.lock b/crates/turborepo-lockfiles/fixtures/minimal-berry.lock new file mode 100644 index 0000000000000..3844ce3067698 --- /dev/null +++ b/crates/turborepo-lockfiles/fixtures/minimal-berry.lock @@ -0,0 +1,45 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8c8 + +"a@workspace:packages/a": + version: 0.0.0-use.local + resolution: "a@workspace:packages/a" + dependencies: + c: "*" + lodash: ^4.17.0 + peerDependencies: + lodash: ^3.0.0 || ^4.0.0 + languageName: unknown + linkType: soft + +"b@workspace:packages/b": + version: 0.0.0-use.local + resolution: "b@workspace:packages/b" + dependencies: + c: "*" + lodash: ^3.0.0 || ^4.0.0 + languageName: unknown + linkType: soft + +"c@*, c@workspace:packages/c": + version: 0.0.0-use.local + resolution: "c@workspace:packages/c" + languageName: unknown + linkType: soft + +"lodash@npm:^3.0.0 || ^4.0.0, lodash@npm:^4.17.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"minimal-berry@workspace:.": + version: 0.0.0-use.local + resolution: "minimal-berry@workspace:." + languageName: unknown + linkType: soft diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 04b476755b8ef..369f2714846be 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -105,8 +105,10 @@ impl<'a> Descriptor<'a> { let mut range = Cow::from(range); // If no protocol we use the default "npm:" protocol if !PROTOCOL.is_match(&range) { - range.to_mut().insert_str(0, "npm:"); + // We don't want to do this necessarily + // range.to_mut().insert_str(0, "npm:"); } + Ok(Self { ident, range }) } /// Extracts all descriptors that are present in a lockfile entry key @@ -208,7 +210,7 @@ impl<'a> Locator<'a> { .map(|m| m.as_str()) } - pub fn patched_locator(&self) -> Option> { + pub fn patched_locator(&self) -> Option { Locator::from_patch_reference(&self.reference) } } diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index 464a10e0bc76f..a76b66c996a39 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -107,7 +107,7 @@ impl<'a> BerryLockfile<'a> { let original_locator = locator .patched_locator() .ok_or_else(|| Error::PatchMissingOriginalLocator(locator.as_owned()))?; - patches.insert(original_locator, locator.clone()); + patches.insert(original_locator.as_owned(), locator.clone()); } locator_package.insert(locator.clone(), package); @@ -269,8 +269,11 @@ impl<'a> BerryLockfile<'a> { for (name, range) in package.dependencies.iter().flatten() { let dependency = self.resolve_dependency(locator, name, range.as_ref())?; // we add this dependency to the resolutions - let dep_locator = self.resolutions.get(&dependency).unwrap(); - resolutions.insert(dependency, locator.clone()); + let dep_locator = self + .resolutions + .get(&dependency) + .unwrap_or_else(|| panic!("No locator found for {dependency}")); + resolutions.insert(dependency, dep_locator.clone()); } if let Some(descriptors) = reverse_lookup.get(locator) { @@ -292,7 +295,7 @@ impl<'a> BerryLockfile<'a> { for (name, range) in package.dependencies.iter().flatten() { let dependency = self.resolve_dependency(&locator, &name, range.as_ref())?; let dep_locator = self.resolutions.get(&dependency).unwrap(); - resolutions.insert(dependency, locator.clone()); + resolutions.insert(dependency, dep_locator.clone()); } // these packages are included, we must figure out which descriptors are @@ -350,9 +353,9 @@ impl<'a> BerryLockfile<'a> { fn resolve_dependency( &self, locator: &Locator, - name: &str, - range: &str, - ) -> Result { + name: &'a str, + range: &'a str, + ) -> Result, Error> { let mut dependency = Descriptor::new(name, range)?; for (resolution, reference) in &self.overrides { @@ -496,4 +499,24 @@ mod test { let new_contents = lockfile.to_string(); assert_eq!(contents, new_contents); } + + #[test] + fn test_basic_descriptor_prune() { + let data: LockfileData = + serde_yaml::from_str(include_str!("../../fixtures/minimal-berry.lock")).unwrap(); + let lockfile = BerryLockfile::new(&data, None).unwrap(); + + let pruned_lockfile = lockfile + .subgraph( + &["packages/a".into(), "packages/c".into()], + &["lodash@npm:4.17.21".into()], + ) + .unwrap(); + + let lodash_desc = pruned_lockfile + .resolutions + .get(&Descriptor::new("lodash", "npm:^4.17.0").unwrap()); + assert!(lodash_desc.is_some()); + assert_eq!(lodash_desc.unwrap().reference, "npm:4.17.21"); + } } diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs index 5f875686a5a15..f70a24a9718ae 100644 --- a/crates/turborepo-lockfiles/src/berry/ser.rs +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -43,12 +43,11 @@ impl fmt::Display for LockfileData { impl fmt::Display for Metadata { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "__metadata:\n version: {}\n cacheKey: {}", - self.version, - wrap_string(&self.cache_key) - ) + write!(f, "__metadata:\n version: {}", self.version,)?; + if let Some(cache_key) = &self.cache_key { + write!(f, "\n cacheKey: {}", wrap_string(cache_key))?; + } + Ok(()) } } @@ -199,7 +198,7 @@ mod test { fn test_metadata_display() { let metadata = Metadata { version: 6, - cache_key: "8c0".to_string(), + cache_key: Some("8c0".to_string()), }; assert_eq!( metadata.to_string(), @@ -228,7 +227,7 @@ mod test { let lockfile = LockfileData { metadata: Metadata { version: 6, - cache_key: "8".into(), + cache_key: Some("8".into()), }, packages: [( long_key.clone(), From 9ae06cc24bbba3db6eb8e8d6d2097f2b16ceb5a5 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 14 Apr 2023 08:59:17 -0700 Subject: [PATCH 20/28] add descriptor resolver --- .../src/berry/identifiers.rs | 32 +++++++-- crates/turborepo-lockfiles/src/berry/mod.rs | 66 +++++++++++------ .../src/berry/protocol_resolver.rs | 70 +++++++++++++++++++ 3 files changed, 140 insertions(+), 28 deletions(-) create mode 100644 crates/turborepo-lockfiles/src/berry/protocol_resolver.rs diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 369f2714846be..c5a2f45b087d8 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -102,30 +102,48 @@ impl<'a> fmt::Display for Descriptor<'a> { impl<'a> Descriptor<'a> { pub fn new(ident: &'a str, range: &'a str) -> Result { let ident = Ident::try_from(ident)?; - let mut range = Cow::from(range); - // If no protocol we use the default "npm:" protocol - if !PROTOCOL.is_match(&range) { - // We don't want to do this necessarily - // range.to_mut().insert_str(0, "npm:"); - } - + let range = range.into(); Ok(Self { ident, range }) } + /// Extracts all descriptors that are present in a lockfile entry key pub fn from_lockfile_key(key: &'a str) -> impl Iterator, Error>> { MULTIKEY.split(key).map(Descriptor::try_from) } + pub fn strip_protocol(range: &str) -> &str { + range + .find(':') + .map_or(range, |colon_index| &range[colon_index + 1..]) + } + pub fn range_without_protocol(&self) -> &str { self.range .find(':') .map_or(&self.range, |colon_index| &self.range[colon_index + 1..]) } + pub fn into_owned(self) -> Descriptor<'static> { + let Self { ident, range } = self; + let range = Cow::Owned(range.to_string()); + Descriptor { + ident: ident.into_owned(), + range, + } + } + pub fn protocol(&self) -> Option<&str> { self.range.find(':').map(|i| &self.range[0..i]) } + /// Access the range based on the lifetime of the underlying string slice + pub fn range(&self) -> Option<&'a str> { + match self.range { + Cow::Borrowed(s) => Some(s), + _ => None, + } + } + /// If the descriptor is a patch returns the version that the patch targets pub fn primary_version(&self) -> Option { let Locator { reference, .. } = Locator::from_patch_reference(&self.range)?; diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index a76b66c996a39..d22cbf28c3a13 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -1,15 +1,17 @@ mod de; mod identifiers; +mod protocol_resolver; mod resolution; mod ser; use std::{ collections::{HashMap, HashSet}, iter, - path::{Path, PathBuf}, + path::Path, }; use identifiers::{Descriptor, Ident, Locator}; +use protocol_resolver::DescriptorResolver; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -34,6 +36,8 @@ type Map = std::collections::BTreeMap; pub struct BerryLockfile<'a> { data: &'a LockfileData, resolutions: Map, Locator<'a>>, + // A mapping from descriptors without protocols to a range with a protocol + resolver: DescriptorResolver<'a>, locator_package: Map, &'a BerryPackage>, // Map of regular locators to patch locators that apply to them patches: Map, Locator<'a>>, @@ -96,11 +100,12 @@ impl<'a> BerryLockfile<'a> { let mut patches = Map::new(); let mut locator_package = Map::new(); let mut descriptor_locator = Map::new(); + let mut resolver = DescriptorResolver::new(); for (key, package) in &lockfile.packages { let locator = Locator::try_from(package.resolution.as_str())?; // TODO we're ignoring buildin patches, should we not? - if let Some(path_file) = locator.patch_file() { + if locator.patch_file().is_some() { // in go code we just produce the original by replacing the ref with // "npm:{package.version}" I think we can extract this from the // locator itself @@ -114,6 +119,9 @@ impl<'a> BerryLockfile<'a> { for descriptor in Descriptor::from_lockfile_key(key) { let descriptor = descriptor?; + if let Some(other) = resolver.insert(&descriptor) { + panic!("Descriptor collision {descriptor} and {other}"); + } descriptor_locator.insert(descriptor, locator.clone()); } } @@ -125,6 +133,7 @@ impl<'a> BerryLockfile<'a> { // A temporary representation that is keyed off of the ident to allow for faster // finding of possible descriptor matches + /* let mut descriptor_by_indent: Map> = Map::new(); for descriptor in descriptor_locator.keys() { let ranges = descriptor_by_indent @@ -132,18 +141,17 @@ impl<'a> BerryLockfile<'a> { .or_default(); ranges.insert(&descriptor.range); } + */ + + let mut xs: HashSet<_> = descriptor_locator.keys().collect(); for package in lockfile.packages.values() { - if let Some(deps) = &package.dependencies { - for (name, range) in deps { - let ident = Ident::try_from(name.as_str())?; - if let Some(ranges) = descriptor_by_indent.get_mut(&ident) { - // If a full range contains the range of an entry then - // the descriptor can be accounted for. - // We keep any range that doesn't contain the range listed in the entry - ranges.retain(|full_range| !full_range.contains(range.as_ref())) - } // should there ever be a time where we don't have a - // matching ident? + for (name, range) in package.dependencies.iter().flatten() { + let mut descriptor = Descriptor::new(name, range.as_ref())?; + if descriptor.protocol().is_none() { + // probably shouldn't unwrap + descriptor.range = resolver.get(&descriptor).unwrap().into(); } + xs.remove(&descriptor); } } @@ -153,15 +161,10 @@ impl<'a> BerryLockfile<'a> { // need to get resolution field as otherwise impossible to tell which version // should be used - let mut extensions = HashSet::new(); - for (ident, ranges) in descriptor_by_indent { - for range in ranges { - extensions.insert(Descriptor { - ident: ident.into_owned(), - range: range.to_string().into(), - }); - } - } + let extensions = xs + .into_iter() + .map(|desc| desc.clone().into_owned()) + .collect(); // make sure to filter out any idents with no ranges @@ -181,6 +184,7 @@ impl<'a> BerryLockfile<'a> { data: lockfile, resolutions: descriptor_locator, locator_package, + resolver, patches, extensions, overrides, @@ -345,6 +349,7 @@ impl<'a> BerryLockfile<'a> { // for proper pruning. locator_package: self.locator_package.clone(), patches, + resolver: self.resolver.clone(), extensions: self.extensions.clone(), overrides: self.overrides.clone(), }) @@ -357,6 +362,12 @@ impl<'a> BerryLockfile<'a> { range: &'a str, ) -> Result, Error> { let mut dependency = Descriptor::new(name, range)?; + // If there's no protocol we attempt to find a known one + if dependency.protocol().is_none() { + if let Some(range) = self.resolver.get(&dependency) { + dependency.range = range.to_string().into(); + } + } for (resolution, reference) in &self.overrides { if let Some(override_dependency) = @@ -518,5 +529,18 @@ mod test { .get(&Descriptor::new("lodash", "npm:^4.17.0").unwrap()); assert!(lodash_desc.is_some()); assert_eq!(lodash_desc.unwrap().reference, "npm:4.17.21"); + + let pruned_lockfile = lockfile + .subgraph( + &["packages/b".into(), "packages/c".into()], + &["lodash@npm:4.17.21".into()], + ) + .unwrap(); + + let lodash_desc = pruned_lockfile + .resolutions + .get(&Descriptor::new("lodash", "npm:^3.0.0 || ^4.0.0").unwrap()); + assert!(lodash_desc.is_some()); + assert_eq!(lodash_desc.unwrap().reference, "npm:4.17.21"); } } diff --git a/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs b/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs new file mode 100644 index 0000000000000..c4e6db0da8963 --- /dev/null +++ b/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs @@ -0,0 +1,70 @@ +use std::collections::HashMap; + +use super::identifiers::{Descriptor, Ident}; + +/// A data structure for resolving descriptors when the protocol isn't known +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DescriptorResolver<'a> { + mapping: HashMap, &'a str>, +} + +#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] +struct Key<'a> { + ident: Ident<'a>, + range: &'a str, +} + +impl<'a> DescriptorResolver<'a> { + pub fn new() -> Self { + Self { + mapping: Default::default(), + } + } + + /// Add a descriptor to the resolver + pub fn insert(&mut self, descriptor: &Descriptor<'a>) -> Option<&'a str> { + let key = Key::new(descriptor)?; + self.mapping.insert(key, descriptor.range()?) + } + + /// If given a descriptor without a protocol it will return all matching + /// descriptors with a protocol + pub fn get(&self, descriptor: &Descriptor) -> Option<&'a str> { + let key = Key::new(descriptor)?; + self.mapping.get(&key).copied() + } +} + +impl<'a> Key<'a> { + fn new(desc: &Descriptor<'a>) -> Option { + let ident = desc.ident.clone(); + let range = Descriptor::strip_protocol(desc.range()?); + Some(Key { ident, range }) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_descriptor_reconstruction() { + let mut resolver = DescriptorResolver::new(); + let babel_npm = Descriptor::new("@babel/core", "npm:^5.0.0").unwrap(); + let babel_file = Descriptor::new("@babel/core", "file:4.5.0").unwrap(); + assert!(resolver.insert(&babel_npm).is_none()); + assert!(resolver.insert(&babel_file).is_none()); + let babel_5 = Descriptor::new("@babel/core", "^5.0.0").unwrap(); + let babel_4 = Descriptor::new("@babel/core", "4.5.0").unwrap(); + assert_eq!(resolver.get(&babel_5), Some("npm:^5.0.0")); + assert_eq!(resolver.get(&babel_4), Some("file:4.5.0")); + } + + #[test] + fn test_descriptors_without_protocols() { + let mut resolver = DescriptorResolver::new(); + let workspace = Descriptor::new("internal-workspace", "*").unwrap(); + assert!(resolver.insert(&workspace).is_none()); + assert_eq!(resolver.get(&workspace), Some("*")); + } +} From 4aeed29527cb8147bcc21290968cdc52172794c0 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 14 Apr 2023 11:39:51 -0700 Subject: [PATCH 21/28] finish porting tests --- .../src/berry/identifiers.rs | 2 + crates/turborepo-lockfiles/src/berry/mod.rs | 201 ++++++++++++------ 2 files changed, 143 insertions(+), 60 deletions(-) diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index c5a2f45b087d8..82dffb2b09b7e 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -58,6 +58,8 @@ impl<'a> Ident<'a> { } } +// These TryFrom impls should be FromStr, but to avoid unnecessary copying we +// use TryFrom so we can use a lifetime. impl<'a> TryFrom<&'a str> for Ident<'a> { type Error = Error; diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index d22cbf28c3a13..6a0a3c8b4d354 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -10,7 +10,7 @@ use std::{ path::Path, }; -use identifiers::{Descriptor, Ident, Locator}; +use identifiers::{Descriptor, Locator}; use protocol_resolver::DescriptorResolver; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -30,7 +30,7 @@ pub enum Error { MissingPackageForLocator(Locator<'static>), } -// We depend on BTree iteration being sorted +// We depend on BTree iteration being sorted for correct serialization type Map = std::collections::BTreeMap; pub struct BerryLockfile<'a> { @@ -106,9 +106,6 @@ impl<'a> BerryLockfile<'a> { // TODO we're ignoring buildin patches, should we not? if locator.patch_file().is_some() { - // in go code we just produce the original by replacing the ref with - // "npm:{package.version}" I think we can extract this from the - // locator itself let original_locator = locator .patched_locator() .ok_or_else(|| Error::PatchMissingOriginalLocator(locator.as_owned()))?; @@ -131,64 +128,46 @@ impl<'a> BerryLockfile<'a> { .transpose()? .unwrap_or_default(); - // A temporary representation that is keyed off of the ident to allow for faster - // finding of possible descriptor matches - /* - let mut descriptor_by_indent: Map> = Map::new(); - for descriptor in descriptor_locator.keys() { - let ranges = descriptor_by_indent - .entry(descriptor.ident.clone()) - .or_default(); - ranges.insert(&descriptor.range); - } - */ + let mut this = Self { + data: lockfile, + resolutions: descriptor_locator, + locator_package, + resolver, + patches, + overrides, + extensions: Default::default(), + }; + + this.populate_extensions()?; + + Ok(this) + } - let mut xs: HashSet<_> = descriptor_locator.keys().collect(); - for package in lockfile.packages.values() { + fn populate_extensions(&mut self) -> Result<(), Error> { + let mut possible_extensions: HashSet<_> = self + .resolutions + .keys() + .filter(|descriptor| matches!(descriptor.protocol(), Some("npm"))) + .collect(); + for (locator, package) in &self.locator_package { for (name, range) in package.dependencies.iter().flatten() { - let mut descriptor = Descriptor::new(name, range.as_ref())?; + // TODO: go through overrides + let mut descriptor = self.resolve_dependency(locator, name, range.as_ref())?; if descriptor.protocol().is_none() { - // probably shouldn't unwrap - descriptor.range = resolver.get(&descriptor).unwrap().into(); + if let Some(range) = self.resolver.get(&descriptor) { + descriptor.range = range.into(); + } } - xs.remove(&descriptor); + possible_extensions.remove(&descriptor); } } - // we go through every dep package - // if we can't find a descriptor for a given ident then we should add a map - // how does this work for pkg specific overrides? - // need to get resolution field as otherwise impossible to tell which version - // should be used - - let extensions = xs - .into_iter() - .map(|desc| desc.clone().into_owned()) - .collect(); - - // make sure to filter out any idents with no ranges - - // instead of generating all possible descriptors we could just check the ident - // & that the descriptor minus the protocol - - // list of package extensions is just descriptors - any that appear to come from - // a dependency - - // overrides essentially inject a descriptor with an exact version - // this descriptor should be used as the default if it appears an entry's dep - // doesn't exist e.g. lodash@npm:^4.17.20 doesn't exist - // we should then look any lodash@ and use that instead - - // we'll need to keep a list of these mappings around for all deps - Ok(Self { - data: lockfile, - resolutions: descriptor_locator, - locator_package, - resolver, - patches, - extensions, - overrides, - }) + self.extensions.extend( + possible_extensions + .into_iter() + .map(|desc| desc.clone().into_owned()), + ); + Ok(()) } pub fn patches(&self) -> Vec<&Path> { @@ -411,10 +390,19 @@ impl<'a> Lockfile for BerryLockfile<'a> { } } - let locator = self - .resolutions - .get(&dependency) - .ok_or_else(|| crate::Error::MissingPackage(dependency.to_string()))?; + if dependency.protocol().is_none() { + if let Some(range) = self.resolver.get(&dependency) { + dependency.range = range.into(); + } + } + + let locator = self.resolutions.get(&dependency); + + if locator.is_none() { + return Ok(None); + } + + let locator = locator.unwrap(); let package = self .locator_package @@ -494,6 +482,7 @@ mod test { use pretty_assertions::assert_eq; use super::*; + use crate::Package; #[test] fn test_deserialize_lockfile() { @@ -511,6 +500,98 @@ mod test { assert_eq!(contents, new_contents); } + #[test] + fn test_resolve_package() { + let data: LockfileData = + serde_yaml::from_str(include_str!("../../fixtures/berry.lock")).unwrap(); + let lockfile = BerryLockfile::new(&data, None).unwrap(); + + assert_eq!( + lockfile + .resolve_package("apps/docs", "js-tokens", "^3.0.0 || ^4.0.0") + .unwrap(), + Some(Package { + key: "js-tokens@npm:4.0.0".into(), + version: "4.0.0".into() + }), + ); + assert_eq!( + lockfile + .resolve_package("apps/docs", "js-tokens", "^4.0.0") + .unwrap(), + Some(Package { + key: "js-tokens@npm:4.0.0".into(), + version: "4.0.0".into() + }), + ); + assert_eq!( + lockfile + .resolve_package("apps/docs", "eslint-config-custom", "*") + .unwrap(), + Some(Package { + key: "eslint-config-custom@workspace:packages/eslint-config-custom".into(), + version: "0.0.0-use.local".into() + }), + ); + assert_eq!( + lockfile + .resolve_package("apps/docs", "@babel/code-frame", "^7.12.11") + .unwrap(), + None, + ); + } + + #[test] + fn test_all_dependencies() { + let data: LockfileData = + serde_yaml::from_str(include_str!("../../fixtures/berry.lock")).unwrap(); + let lockfile = BerryLockfile::new(&data, None).unwrap(); + + let pkg = lockfile + .resolve_package("apps/docs", "react-dom", "18.2.0") + .unwrap() + .unwrap(); + let deps = lockfile.all_dependencies(&pkg.key).unwrap().unwrap(); + assert_eq!( + deps, + [ + ("loose-envify".to_string(), "^1.1.0".to_string()), + ("scheduler".to_string(), "^0.23.0".to_string()) + ] + .iter() + .cloned() + .collect() + ); + } + + #[test] + fn test_package_extension_detection() { + let data: LockfileData = + serde_yaml::from_str(include_str!("../../fixtures/berry.lock")).unwrap(); + let lockfile = BerryLockfile::new(&data, None).unwrap(); + + assert_eq!( + &lockfile.extensions, + &(["@babel/types@npm:^7.8.3", "lodash@npm:4.17.21"] + .iter() + .map(|s| Descriptor::try_from(*s).unwrap()) + .collect::>()) + ); + } + + #[test] + fn test_patch_list() { + let data: LockfileData = + serde_yaml::from_str(include_str!("../../fixtures/berry.lock")).unwrap(); + let lockfile = BerryLockfile::new(&data, None).unwrap(); + + let locator = Locator::try_from("resolve@npm:2.0.0-next.4").unwrap(); + + let patch = lockfile.patches.get(&locator).unwrap(); + let package = lockfile.locator_package.get(patch).unwrap(); + assert_eq!(package.version.as_ref(), "2.0.0-next.4"); + } + #[test] fn test_basic_descriptor_prune() { let data: LockfileData = From c480bf986a8d9a841af5df786b6aa1b7f6528293 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 14 Apr 2023 14:23:52 -0700 Subject: [PATCH 22/28] add additional tests, fix comments --- .../fixtures/minimal-berry-resolutions.lock | 50 ++++++++ .../src/berry/identifiers.rs | 20 ++-- crates/turborepo-lockfiles/src/berry/mod.rs | 113 +++++++++++++++--- .../src/berry/resolution.rs | 12 +- crates/turborepo-lockfiles/src/berry/ser.rs | 6 +- 5 files changed, 164 insertions(+), 37 deletions(-) create mode 100644 crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock diff --git a/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock b/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock new file mode 100644 index 0000000000000..4b63aae82e6bc --- /dev/null +++ b/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock @@ -0,0 +1,50 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"a@workspace:packages/a": + version: 0.0.0-use.local + resolution: "a@workspace:packages/a" + languageName: unknown + linkType: soft + +"b@workspace:packages/b": + version: 0.0.0-use.local + resolution: "b@workspace:packages/b" + dependencies: + debug: ^4.3.4 + lodash: ^4.17.21 + languageName: unknown + linkType: soft + +"debug@npm:1.0.0": + version: 1.0.0 + resolution: "debug@npm:1.0.0" + dependencies: + ms: 0.6.2 + checksum: edfec8784737afbeea43cc78c3f56c33b88d3e751cc7220ae7a1c5370ff099e7352703275bdb56ea9967f92961231ce0625f8234d82259047303849671153f03 + languageName: node + linkType: hard + +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"ms@npm:0.6.0": + version: 0.6.0 + resolution: "ms@npm:0.6.0" + checksum: 4dee72321abe75382a9ba73cf69efca4484fd75f997ff74904eb5803437f47880e6b69b7db31b808040d9cd0276c34c263f9ca664e14027a1d71943cc8aeecff + languageName: node + linkType: hard + +"shit@workspace:.": + version: 0.0.0-use.local + resolution: "shit@workspace:." + languageName: unknown + linkType: soft diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 82dffb2b09b7e..7ce73b2397916 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, fmt, ops::Index}; +use std::{borrow::Cow, fmt}; use lazy_static::lazy_static; use regex::Regex; @@ -47,7 +47,8 @@ pub struct Locator<'a> { } impl<'a> Ident<'a> { - pub fn into_owned(&self) -> Ident<'static> { + /// Clones underlying strings and changes lifetime to represent this + pub fn to_owned(&self) -> Ident<'static> { let Ident { scope, name } = self; let scope = scope .as_ref() @@ -113,33 +114,30 @@ impl<'a> Descriptor<'a> { MULTIKEY.split(key).map(Descriptor::try_from) } + /// Removes the protocol from a version range pub fn strip_protocol(range: &str) -> &str { range .find(':') .map_or(range, |colon_index| &range[colon_index + 1..]) } - pub fn range_without_protocol(&self) -> &str { - self.range - .find(':') - .map_or(&self.range, |colon_index| &self.range[colon_index + 1..]) - } - pub fn into_owned(self) -> Descriptor<'static> { let Self { ident, range } = self; let range = Cow::Owned(range.to_string()); Descriptor { - ident: ident.into_owned(), + ident: ident.to_owned(), range, } } + /// Returns the protocol of the version range if one is present pub fn protocol(&self) -> Option<&str> { self.range.find(':').map(|i| &self.range[0..i]) } /// Access the range based on the lifetime of the underlying string slice - pub fn range(&self) -> Option<&'a str> { + /// this will return None if the underlying range is owned. + pub(crate) fn range(&self) -> Option<&'a str> { match self.range { Cow::Borrowed(s) => Some(s), _ => None, @@ -218,7 +216,7 @@ impl<'a> Locator<'a> { /// Converts a possibly borrowed Locator to one that must be owned pub fn as_owned(&self) -> Locator<'static> { let Locator { ident, reference } = self; - let ident = ident.into_owned(); + let ident = ident.to_owned(); let reference = Cow::Owned(reference.to_string()); Locator { ident, reference } } diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index 6a0a3c8b4d354..bd5cbfa3a5f8f 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -28,6 +28,8 @@ pub enum Error { Resolutions(#[from] resolution::Error), #[error("unable to find entry for {0}")] MissingPackageForLocator(Locator<'static>), + #[error("unable to find any locator for {0}")] + MissingLocator(Descriptor<'static>), } // We depend on BTree iteration being sorted for correct serialization @@ -104,7 +106,6 @@ impl<'a> BerryLockfile<'a> { for (key, package) in &lockfile.packages { let locator = Locator::try_from(package.resolution.as_str())?; - // TODO we're ignoring buildin patches, should we not? if locator.patch_file().is_some() { let original_locator = locator .patched_locator() @@ -170,6 +171,7 @@ impl<'a> BerryLockfile<'a> { Ok(()) } + /// All patch files referenced in the lockfile pub fn patches(&self) -> Vec<&Path> { self.patches .values() @@ -179,6 +181,7 @@ impl<'a> BerryLockfile<'a> { .collect() } + // Helper function for inverting the resolution map fn locator_to_descriptors(&self) -> HashMap<&Locator<'a>, HashSet<&Descriptor<'a>>> { let mut reverse_lookup: HashMap<&Locator, HashSet<&Descriptor>> = HashMap::with_capacity(self.locator_package.len()); @@ -193,6 +196,7 @@ impl<'a> BerryLockfile<'a> { reverse_lookup } + /// Constructs a new lockfile data ready to be serialized pub fn lockfile(&self) -> Result { let mut packages: std::collections::BTreeMap = Map::new(); let mut metadata = self.data.metadata.clone(); @@ -230,6 +234,8 @@ impl<'a> BerryLockfile<'a> { Ok(LockfileData { metadata, packages }) } + /// Produces a new lockfile containing only the given workspaces and + /// packages pub fn subgraph( &self, workspace_packages: &[String], @@ -248,10 +254,9 @@ impl<'a> BerryLockfile<'a> { .chain(iter::once(".")) .any(|path| locator.is_workspace_path(path)) { - // we need to all descriptors coming out the workspace + // We need to track all of the descriptors coming out the workspace for (name, range) in package.dependencies.iter().flatten() { let dependency = self.resolve_dependency(locator, name, range.as_ref())?; - // we add this dependency to the resolutions let dep_locator = self .resolutions .get(&dependency) @@ -276,14 +281,14 @@ impl<'a> BerryLockfile<'a> { .ok_or_else(|| Error::MissingPackageForLocator(locator.as_owned()))?; for (name, range) in package.dependencies.iter().flatten() { - let dependency = self.resolve_dependency(&locator, &name, range.as_ref())?; - let dep_locator = self.resolutions.get(&dependency).unwrap(); + let dependency = self.resolve_dependency(&locator, name, range.as_ref())?; + let dep_locator = self + .resolutions + .get(&dependency) + .unwrap_or_else(|| panic!("Unable to find locator for {dependency}")); resolutions.insert(dependency, dep_locator.clone()); } - // these packages are included, we must figure out which descriptors are - // included we just lookup the package and calculate all of the - // descriptors it creates if let Some(patch_locator) = self.patches.get(&locator) { patches.insert(locator.as_owned(), patch_locator.clone()); let patch_descriptors = reverse_lookup @@ -295,9 +300,10 @@ impl<'a> BerryLockfile<'a> { } } - for (primary, patch) in &self.patches { - let primary_descriptors = reverse_lookup.get(primary).unwrap(); - let patch_descriptors = reverse_lookup.get(patch).unwrap(); + for patch in self.patches.values() { + let patch_descriptors = reverse_lookup + .get(patch) + .unwrap_or_else(|| panic!("Unable to find {patch} in reverse lookup")); // For each patch descriptor we extract the primary descriptor that each patch // descriptor targets and check if that descriptor is present in the @@ -315,19 +321,21 @@ impl<'a> BerryLockfile<'a> { } } + // Add any descriptors used by package extensions for descriptor in &self.extensions { - // TODO graceful - let locator = self.resolutions.get(descriptor).unwrap(); + let locator = resolutions + .get(descriptor) + .ok_or_else(|| Error::MissingLocator(descriptor.to_owned()))?; resolutions.insert(descriptor.clone(), locator.clone()); } Ok(Self { data: self.data, resolutions, - // We rely on resolutions only containing the required locators - // for proper pruning. - locator_package: self.locator_package.clone(), patches, + // We clone the following structures without any alterations and + // rely on resolutions being correctly pruned. + locator_package: self.locator_package.clone(), resolver: self.resolver.clone(), extensions: self.extensions.clone(), overrides: self.overrides.clone(), @@ -624,4 +632,77 @@ mod test { assert!(lodash_desc.is_some()); assert_eq!(lodash_desc.unwrap().reference, "npm:4.17.21"); } + + #[test] + fn test_basic_resolutions_dependencies() { + let data: LockfileData = serde_yaml::from_str(include_str!( + "../../fixtures/minimal-berry-resolutions.lock" + )) + .unwrap(); + let manifest = BerryManifest { + resolutions: Some( + [("debug@^4.3.4".to_string(), "1.0.0".to_string())] + .iter() + .cloned() + .collect(), + ), + }; + let lockfile = BerryLockfile::new(&data, Some(&manifest)).unwrap(); + + let pkg = lockfile + .resolve_package("packages/b", "debug", "^4.3.4") + .unwrap() + .unwrap(); + assert_eq!( + pkg, + Package { + key: "debug@npm:1.0.0".into(), + version: "1.0.0".into() + } + ) + } + + #[test] + fn test_targeted_resolutions_dependencies() { + let data: LockfileData = serde_yaml::from_str(include_str!( + "../../fixtures/minimal-berry-resolutions.lock" + )) + .unwrap(); + let manifest = BerryManifest { + resolutions: Some( + [ + ("debug".to_string(), "1.0.0".to_string()), + // This is a targeted override just for the ms dependency of the debug package + ("debug/ms".to_string(), "0.6.0".to_string()), + ] + .iter() + .cloned() + .collect(), + ), + }; + let lockfile = BerryLockfile::new(&data, Some(&manifest)).unwrap(); + + let deps = lockfile + .all_dependencies("debug@npm:1.0.0") + .unwrap() + .unwrap(); + assert_eq!( + deps, + [("ms".to_string(), "npm:0.6.0".to_string())] + .iter() + .cloned() + .collect(), + ); + let pkg = lockfile + .resolve_package("packages/b", "ms", "npm:0.6.0") + .unwrap() + .unwrap(); + assert_eq!( + pkg, + Package { + key: "ms@npm:0.6.0".into(), + version: "0.6.0".into() + } + ); + } } diff --git a/crates/turborepo-lockfiles/src/berry/resolution.rs b/crates/turborepo-lockfiles/src/berry/resolution.rs index 2ed02f3213d9b..ab4dd4a5c3aba 100644 --- a/crates/turborepo-lockfiles/src/berry/resolution.rs +++ b/crates/turborepo-lockfiles/src/berry/resolution.rs @@ -23,12 +23,15 @@ pub enum Error { UnexpectedToken(Rule), } +/// A resolution that can appear in the resolutions field of the top level +/// package.json #[derive(Debug, PartialEq, Clone, Copy, Eq, Default, PartialOrd, Ord, Hash)] pub struct Resolution<'a> { from: Option>, descriptor: Specifier<'a>, } +// This is essentially an Ident with an optional semver range #[derive(Debug, PartialEq, Clone, Copy, Eq, Default, PartialOrd, Ord, Hash)] struct Specifier<'a> { full_name: &'a str, @@ -89,11 +92,10 @@ fn parse_specifier(specifier: Pair<'_, Rule>) -> Result, Error } impl<'a> Resolution<'a> { - /// Returns a new descriptor if necessary (TODO finish doc) - // reference is the version override - // locator is the package where the dependency is coming from - // dependency is the package that we are considering overriding - // will only return desc if there's an override that should be used instead + /// Returns a new descriptor if an override is applicable + // reference: version that this resolution resolves to + // locator: package that depends on the dependency + // dependency: package that we are considering overriding pub fn reduce_dependency<'b>( &self, reference: &str, diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs index f70a24a9718ae..29ee5488d70fb 100644 --- a/crates/turborepo-lockfiles/src/berry/ser.rs +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -7,10 +7,7 @@ use super::{BerryPackage, DependencyMeta, LockfileData, Metadata}; lazy_static! { static ref SIMPLE_STRING: Regex = - Regex::new( - r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\]\[{}:# \t\r\n])*$"# - // r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\\][{}:# \t\r\n])*"# - ).unwrap(); + Regex::new(r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\]\[{}:# \t\r\n])*$"#).unwrap(); } const HEADER: &str = "# This file is generated by running \"yarn install\" inside your project. @@ -70,7 +67,6 @@ impl fmt::Display for BerryPackage { let newline = "\n"; write_line("version", space, &wrap_string(self.version.as_ref()))?; write_line("resolution", space, &wrap_string(&self.resolution))?; - // deps, peer deps, deps meta, peer deps meta, bin if let Some(deps) = &self.dependencies { write_line( "dependencies", From 48da577128868b4761d1d2de67939cb25c220a8c Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 14 Apr 2023 14:24:11 -0700 Subject: [PATCH 23/28] remove old todo --- crates/turborepo-lockfiles/src/berry/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index bd5cbfa3a5f8f..bbc0bd760a4d6 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -152,7 +152,6 @@ impl<'a> BerryLockfile<'a> { .collect(); for (locator, package) in &self.locator_package { for (name, range) in package.dependencies.iter().flatten() { - // TODO: go through overrides let mut descriptor = self.resolve_dependency(locator, name, range.as_ref())?; if descriptor.protocol().is_none() { if let Some(range) = self.resolver.get(&descriptor) { From 22f9ee0a087283dbd97f9059900c389af780d1e0 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 14 Apr 2023 14:41:05 -0700 Subject: [PATCH 24/28] remove some frustration --- cli/internal/ffi/lockfile.go | 68 ------------------- .../fixtures/minimal-berry-resolutions.lock | 4 +- 2 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 cli/internal/ffi/lockfile.go diff --git a/cli/internal/ffi/lockfile.go b/cli/internal/ffi/lockfile.go deleted file mode 100644 index 14985f3f61a07..0000000000000 --- a/cli/internal/ffi/lockfile.go +++ /dev/null @@ -1,68 +0,0 @@ -package ffi - -// #include "bindings.h" -// -// #cgo LDFLAGS: -L${SRCDIR} -lturborepo_ffi -// #cgo windows LDFLAGS: -lole32 -lbcrypt -lws2_32 -luserenv -import "C" - -import ( - "errors" - - ffi_proto "github.com/vercel/turbo/cli/internal/ffi/proto" -) - -// NpmTransitiveDeps returns the transitive external deps of a given package based on the deps and specifiers given -func NpmTransitiveDeps(content []byte, pkgDir string, unresolvedDeps map[string]string) ([]*ffi_proto.LockfilePackage, error) { - return transitiveDeps(npmTransitiveDeps, content, pkgDir, unresolvedDeps) -} - -func npmTransitiveDeps(buf C.Buffer) C.Buffer { - return C.npm_transitive_closure(buf) -} - -func transitiveDeps(cFunc func(C.Buffer) C.Buffer, content []byte, pkgDir string, unresolvedDeps map[string]string) ([]*ffi_proto.LockfilePackage, error) { - req := ffi_proto.TransitiveDepsRequest{ - Contents: content, - WorkspaceDir: pkgDir, - UnresolvedDeps: unresolvedDeps, - } - reqBuf := Marshal(&req) - resBuf := cFunc(reqBuf) - reqBuf.Free() - - resp := ffi_proto.TransitiveDepsResponse{} - if err := Unmarshal(resBuf, resp.ProtoReflect().Interface()); err != nil { - panic(err) - } - - if err := resp.GetError(); err != "" { - return nil, errors.New(err) - } - - list := resp.GetPackages() - return list.GetList(), nil -} - -// NpmSubgraph returns the contents of a npm lockfile subgraph -func NpmSubgraph(content []byte, workspaces []string, packages []string) ([]byte, error) { - req := ffi_proto.SubgraphRequest{ - Contents: content, - Workspaces: workspaces, - Packages: packages, - } - reqBuf := Marshal(&req) - resBuf := C.npm_subgraph(reqBuf) - reqBuf.Free() - - resp := ffi_proto.SubgraphResponse{} - if err := Unmarshal(resBuf, resp.ProtoReflect().Interface()); err != nil { - panic(err) - } - - if err := resp.GetError(); err != "" { - return nil, errors.New(err) - } - - return resp.GetContents(), nil -} diff --git a/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock b/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock index 4b63aae82e6bc..6533daca67fd1 100644 --- a/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock +++ b/crates/turborepo-lockfiles/fixtures/minimal-berry-resolutions.lock @@ -43,8 +43,8 @@ __metadata: languageName: node linkType: hard -"shit@workspace:.": +"test@workspace:.": version: 0.0.0-use.local - resolution: "shit@workspace:." + resolution: "test@workspace:." languageName: unknown linkType: soft From d001065abed0ac8549ea06a4124cf237800b8a65 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Wed, 19 Apr 2023 09:23:05 -0700 Subject: [PATCH 25/28] pr feedback --- Cargo.lock | 2 +- crates/turborepo-lockfiles/src/berry/de.rs | 18 ++++++++++-- crates/turborepo-lockfiles/src/berry/mod.rs | 25 +++------------- .../src/berry/protocol_resolver.rs | 12 ++------ crates/turborepo-lockfiles/src/berry/ser.rs | 29 ++++++++++--------- 5 files changed, 39 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ff7083f2c0874..2a7afc10f4388 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8310,7 +8310,7 @@ dependencies = [ "semver 1.0.17", "serde", "serde_json", - "serde_yaml", + "serde_yaml 0.9.19", "thiserror", ] diff --git a/crates/turborepo-lockfiles/src/berry/de.rs b/crates/turborepo-lockfiles/src/berry/de.rs index b691607aa8f0f..ad3402a46739a 100644 --- a/crates/turborepo-lockfiles/src/berry/de.rs +++ b/crates/turborepo-lockfiles/src/berry/de.rs @@ -1,6 +1,20 @@ -use serde::Deserialize; +use serde::{Deserialize, Serialize}; -use super::SemverString; +// Newtype used for correct deserialization +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Default, Clone)] +pub struct SemverString(pub String); + +impl From for String { + fn from(value: SemverString) -> Self { + value.0 + } +} + +impl AsRef for SemverString { + fn as_ref(&self) -> &str { + self.0.as_str() + } +} impl<'de> Deserialize<'de> for SemverString { fn deserialize(deserializer: D) -> Result diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index bbc0bd760a4d6..05e099750d05c 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -10,6 +10,7 @@ use std::{ path::Path, }; +use de::SemverString; use identifiers::{Descriptor, Locator}; use protocol_resolver::DescriptorResolver; use serde::{Deserialize, Serialize}; @@ -102,7 +103,7 @@ impl<'a> BerryLockfile<'a> { let mut patches = Map::new(); let mut locator_package = Map::new(); let mut descriptor_locator = Map::new(); - let mut resolver = DescriptorResolver::new(); + let mut resolver = DescriptorResolver::default(); for (key, package) in &lockfile.packages { let locator = Locator::try_from(package.resolution.as_str())?; @@ -430,11 +431,9 @@ impl<'a> Lockfile for BerryLockfile<'a> { Locator::try_from(key).unwrap_or_else(|_| panic!("Was passed invalid locator: {key}")); let package = self.locator_package.get(&locator); - if package.is_none() { + let Some(package) = package else { return Ok(None); - } - - let package = package.unwrap(); + }; let mut map = HashMap::new(); for (name, version) in package.dependencies.iter().flatten() { @@ -468,22 +467,6 @@ impl BerryManifest { } } -// Newtype used exclusively for correct deserialization -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Default, Clone)] -struct SemverString(String); - -impl From for String { - fn from(value: SemverString) -> Self { - value.0 - } -} - -impl AsRef for SemverString { - fn as_ref(&self) -> &str { - self.0.as_str() - } -} - #[cfg(test)] mod test { use pretty_assertions::assert_eq; diff --git a/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs b/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs index c4e6db0da8963..b773284d79db5 100644 --- a/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs +++ b/crates/turborepo-lockfiles/src/berry/protocol_resolver.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use super::identifiers::{Descriptor, Ident}; /// A data structure for resolving descriptors when the protocol isn't known -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct DescriptorResolver<'a> { mapping: HashMap, &'a str>, } @@ -15,12 +15,6 @@ struct Key<'a> { } impl<'a> DescriptorResolver<'a> { - pub fn new() -> Self { - Self { - mapping: Default::default(), - } - } - /// Add a descriptor to the resolver pub fn insert(&mut self, descriptor: &Descriptor<'a>) -> Option<&'a str> { let key = Key::new(descriptor)?; @@ -49,7 +43,7 @@ mod test { #[test] fn test_descriptor_reconstruction() { - let mut resolver = DescriptorResolver::new(); + let mut resolver = DescriptorResolver::default(); let babel_npm = Descriptor::new("@babel/core", "npm:^5.0.0").unwrap(); let babel_file = Descriptor::new("@babel/core", "file:4.5.0").unwrap(); assert!(resolver.insert(&babel_npm).is_none()); @@ -62,7 +56,7 @@ mod test { #[test] fn test_descriptors_without_protocols() { - let mut resolver = DescriptorResolver::new(); + let mut resolver = DescriptorResolver::default(); let workspace = Descriptor::new("internal-workspace", "*").unwrap(); assert!(resolver.insert(&workspace).is_none()); assert_eq!(resolver.get(&workspace), Some("*")); diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs index 29ee5488d70fb..2a4929d5a99b7 100644 --- a/crates/turborepo-lockfiles/src/berry/ser.rs +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -48,11 +48,14 @@ impl fmt::Display for Metadata { } } +const SPACE: char = ' '; +const NEWLINE: char = '\n'; + impl fmt::Display for BerryPackage { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // we only want to write a newline there was something before let mut first = true; - let mut write_line = |field: &str, whitespace: &str, value: &str| -> fmt::Result { + let mut write_line = |field: &str, whitespace: char, value: &str| -> fmt::Result { if !value.is_empty() { if !first { writeln!(f)?; @@ -63,53 +66,51 @@ impl fmt::Display for BerryPackage { Ok(()) }; - let space = " "; - let newline = "\n"; - write_line("version", space, &wrap_string(self.version.as_ref()))?; - write_line("resolution", space, &wrap_string(&self.resolution))?; + write_line("version", SPACE, &wrap_string(self.version.as_ref()))?; + write_line("resolution", SPACE, &wrap_string(&self.resolution))?; if let Some(deps) = &self.dependencies { write_line( "dependencies", - newline, + NEWLINE, &stringify_dependencies(deps.iter()), )?; } if let Some(peer_deps) = &self.peer_dependencies { write_line( "peerDependencies", - newline, + NEWLINE, &stringify_dependencies(peer_deps.iter()), )?; } if let Some(deps_meta) = &self.dependencies_meta { write_line( "dependenciesMeta", - newline, + NEWLINE, &stringify_dependencies_meta(deps_meta.iter()), )?; } if let Some(peer_deps_meta) = &self.peer_dependencies_meta { write_line( "peerDependenciesMeta", - newline, + NEWLINE, &stringify_dependencies_meta(peer_deps_meta.iter()), )?; } if let Some(bin) = &self.bin { - write_line("bin", newline, &stringify_dependencies(bin.iter()))?; + write_line("bin", NEWLINE, &stringify_dependencies(bin.iter()))?; } if let Some(checksum) = &self.checksum { - write_line("checksum", space, &wrap_string(checksum))?; + write_line("checksum", SPACE, &wrap_string(checksum))?; } if let Some(conditions) = &self.conditions { - write_line("conditions", space, &wrap_string(conditions))?; + write_line("conditions", SPACE, &wrap_string(conditions))?; } if let Some(language_name) = &self.language_name { - write_line("languageName", space, &wrap_string(language_name))?; + write_line("languageName", SPACE, &wrap_string(language_name))?; } if let Some(link_type) = &self.link_type { - write_line("linkType", space, &wrap_string(link_type))?; + write_line("linkType", SPACE, &wrap_string(link_type))?; } Ok(()) From c3a271ba3c001bdc2fb657426530ceb7c3b7e1f6 Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Thu, 20 Apr 2023 16:57:59 -0700 Subject: [PATCH 26/28] drop lazy static --- Cargo.lock | 1 - crates/turborepo-lockfiles/Cargo.toml | 1 - .../src/berry/identifiers.rs | 45 ++++++++++++------- .../src/berry/resolution.rs | 13 +++--- crates/turborepo-lockfiles/src/berry/ser.rs | 15 ++++--- crates/turborepo-lockfiles/src/lib.rs | 2 + 6 files changed, 47 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a7afc10f4388..4fabd18981279 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8302,7 +8302,6 @@ dependencies = [ name = "turborepo-lockfiles" version = "0.1.0" dependencies = [ - "lazy_static", "pest", "pest_derive", "pretty_assertions", diff --git a/crates/turborepo-lockfiles/Cargo.toml b/crates/turborepo-lockfiles/Cargo.toml index c3612c051471d..d89c8076d9c96 100644 --- a/crates/turborepo-lockfiles/Cargo.toml +++ b/crates/turborepo-lockfiles/Cargo.toml @@ -7,7 +7,6 @@ license = "MPL-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -lazy_static = "1.4.0" pest = "2.5.6" pest_derive = "2.5.6" regex = "1" diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 7ce73b2397916..2bb54ef0fe1d0 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -1,16 +1,31 @@ -use std::{borrow::Cow, fmt}; +use std::{borrow::Cow, fmt, sync::OnceLock}; -use lazy_static::lazy_static; use regex::Regex; use thiserror::Error; -lazy_static! { - static ref IDENT: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+)$").unwrap(); - static ref DESCRIPTOR: Regex = Regex::new(r"^(?:@([^/]+?)/)?([^@/]+?)(?:@(.+))$").unwrap(); - static ref PATCH_REF: Regex = Regex::new(r"patch:(.+)#(?:\./)?([^:]+)(?:::)?.*$").unwrap(); - static ref MULTIKEY: Regex = Regex::new(r" *, *").unwrap(); - static ref BUILTIN: Regex = Regex::new(r"^builtin<([^>]+)>$").unwrap(); - static ref PROTOCOL: Regex = Regex::new(r"^[A-Za-z]+:").unwrap(); +fn ident() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^(?:@([^/]+?)/)?([^@/]+)$").unwrap()) +} + +fn descriptor() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^(?:@([^/]+?)/)?([^@/]+?)(?:@(.+))$").unwrap()) +} + +fn patch_ref() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"patch:(.+)#(?:\./)?([^:]+)(?:::)?.*$").unwrap()) +} + +fn multikey() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r" *, *").unwrap()) +} + +fn builtin() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^builtin<([^>]+)>$").unwrap()) } #[derive(Debug, Error)] @@ -66,7 +81,7 @@ impl<'a> TryFrom<&'a str> for Ident<'a> { fn try_from(value: &'a str) -> Result { let make_err = || Error::Ident(value.to_string()); - let captures = IDENT.captures(value).ok_or_else(make_err)?; + let captures = ident().captures(value).ok_or_else(make_err)?; let scope = captures.get(1).map(|m| Cow::Borrowed(m.as_str())); let name = Cow::Borrowed(captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?); Ok(Self { scope, name }) @@ -87,7 +102,7 @@ impl<'a> TryFrom<&'a str> for Descriptor<'a> { fn try_from(value: &'a str) -> Result { let make_err = || Error::Descriptor(value.to_string()); - let captures = DESCRIPTOR.captures(value).ok_or_else(make_err)?; + let captures = descriptor().captures(value).ok_or_else(make_err)?; let scope = captures.get(1).map(|m| Cow::Borrowed(m.as_str())); let name = Cow::Borrowed(captures.get(2).map(|m| m.as_str()).ok_or_else(make_err)?); let range = Cow::Borrowed(captures.get(3).map(|m| m.as_str()).ok_or_else(make_err)?); @@ -111,7 +126,7 @@ impl<'a> Descriptor<'a> { /// Extracts all descriptors that are present in a lockfile entry key pub fn from_lockfile_key(key: &'a str) -> impl Iterator, Error>> { - MULTIKEY.split(key).map(Descriptor::try_from) + multikey().split(key).map(Descriptor::try_from) } /// Removes the protocol from a version range @@ -188,7 +203,7 @@ impl<'a> Locator<'a> { } fn from_patch_reference(patch_reference: &'a str) -> Option { - let caps = PATCH_REF.captures(patch_reference)?; + let caps = patch_ref().captures(patch_reference)?; let capture_group = caps.get(1)?; let Locator { ident, reference } = Locator::try_from(capture_group.as_str()).ok()?; // This might seem like a special case hack, but this is what yarn does @@ -204,7 +219,7 @@ impl<'a> Locator<'a> { } pub fn is_patch_builtin(patch: &str) -> bool { - patch.starts_with('~') || BUILTIN.is_match(patch) + patch.starts_with('~') || builtin().is_match(patch) } pub fn is_workspace_path(&self, workspace_path: &str) -> bool { @@ -222,7 +237,7 @@ impl<'a> Locator<'a> { } pub fn patch_file(&self) -> Option<&str> { - PATCH_REF + patch_ref() .captures(&self.reference) .and_then(|caps| caps.get(2)) .map(|m| m.as_str()) diff --git a/crates/turborepo-lockfiles/src/berry/resolution.rs b/crates/turborepo-lockfiles/src/berry/resolution.rs index ab4dd4a5c3aba..d88ffce63e712 100644 --- a/crates/turborepo-lockfiles/src/berry/resolution.rs +++ b/crates/turborepo-lockfiles/src/berry/resolution.rs @@ -1,6 +1,5 @@ -use std::fmt; +use std::{fmt, sync::OnceLock}; -use lazy_static::lazy_static; use pest::{iterators::Pair, Parser}; use pest_derive::Parser; use regex::Regex; @@ -9,13 +8,15 @@ use thiserror::Error; use super::identifiers::{Descriptor, Ident, Locator}; -lazy_static! { - static ref TAG_REGEX: Regex = Regex::new(r"^[^v][a-z0-9._-]*$").unwrap(); +fn tag_regex() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^[^v][a-z0-9._-]*$").unwrap()) } #[derive(Debug, Error)] pub enum Error { #[error("unable to parse")] + // Boxed due to this enum variant being much larger than the others Pest(#[from] Box>), #[error("unexpected end of input")] UnexpectedEOI, @@ -119,7 +120,7 @@ impl<'a> Resolution<'a> { // we now insert the default protocol if one isn't present if Version::parse(&from_locator.reference).is_ok() - || TAG_REGEX.is_match(&from_locator.reference) + || tag_regex().is_match(&from_locator.reference) { let reference = from_locator.reference.to_mut(); reference.insert_str(0, "npm:"); @@ -154,7 +155,7 @@ impl<'a> Resolution<'a> { // We have a match an we now override the dependency let mut dependency_override = dependency.clone(); dependency_override.range = reference.to_string().into(); - if Version::parse(reference).is_ok() || TAG_REGEX.is_match(reference) { + if Version::parse(reference).is_ok() || tag_regex().is_match(reference) { dependency_override.range.to_mut().insert_str(0, "npm:") } diff --git a/crates/turborepo-lockfiles/src/berry/ser.rs b/crates/turborepo-lockfiles/src/berry/ser.rs index 2a4929d5a99b7..57b094b429a1f 100644 --- a/crates/turborepo-lockfiles/src/berry/ser.rs +++ b/crates/turborepo-lockfiles/src/berry/ser.rs @@ -1,13 +1,14 @@ -use std::{borrow::Cow, fmt}; +use std::{borrow::Cow, fmt, sync::OnceLock}; -use lazy_static::lazy_static; use regex::Regex; use super::{BerryPackage, DependencyMeta, LockfileData, Metadata}; -lazy_static! { - static ref SIMPLE_STRING: Regex = - Regex::new(r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\]\[{}:# \t\r\n])*$"#).unwrap(); +fn simple_string() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| { + Regex::new(r#"^[^-?:,\]\[{}#&*!|>'"%@` \t\r\n]([ \t]*[^,\]\[{}:# \t\r\n])*$"#).unwrap() + }) } const HEADER: &str = "# This file is generated by running \"yarn install\" inside your project. @@ -132,7 +133,7 @@ where if !first { string.push('\n'); } - string.push_str(&format!(" {}: {}", wrap_string(key), wrap_string(value),)); + string.push_str(&format!(" {}: {}", wrap_string(key), wrap_string(value))); first = false; } string @@ -174,7 +175,7 @@ where } fn wrap_string(s: &str) -> Cow { - match SIMPLE_STRING.is_match(s) { + match simple_string().is_match(s) { // Simple strings require no wrapping true => Cow::from(s), // Complex strings require wrapping diff --git a/crates/turborepo-lockfiles/src/lib.rs b/crates/turborepo-lockfiles/src/lib.rs index f5b3821f62ea0..34d9f161e559d 100644 --- a/crates/turborepo-lockfiles/src/lib.rs +++ b/crates/turborepo-lockfiles/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(once_cell)] + mod berry; mod error; mod npm; From 394fee07438a43776007a39df9ad8155c6f8af1d Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Thu, 20 Apr 2023 17:10:25 -0700 Subject: [PATCH 27/28] use split_once --- crates/turborepo-lockfiles/src/berry/identifiers.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/turborepo-lockfiles/src/berry/identifiers.rs b/crates/turborepo-lockfiles/src/berry/identifiers.rs index 2bb54ef0fe1d0..bb0e147268848 100644 --- a/crates/turborepo-lockfiles/src/berry/identifiers.rs +++ b/crates/turborepo-lockfiles/src/berry/identifiers.rs @@ -131,9 +131,7 @@ impl<'a> Descriptor<'a> { /// Removes the protocol from a version range pub fn strip_protocol(range: &str) -> &str { - range - .find(':') - .map_or(range, |colon_index| &range[colon_index + 1..]) + range.split_once(':').map_or(range, |(_, rest)| rest) } pub fn into_owned(self) -> Descriptor<'static> { @@ -147,7 +145,7 @@ impl<'a> Descriptor<'a> { /// Returns the protocol of the version range if one is present pub fn protocol(&self) -> Option<&str> { - self.range.find(':').map(|i| &self.range[0..i]) + self.range.split_once(':').map(|(protocol, _)| protocol) } /// Access the range based on the lifetime of the underlying string slice From 58b03537a40faed314e1cf9c35967c9a802356be Mon Sep 17 00:00:00 2001 From: Chris Olszewski Date: Fri, 21 Apr 2023 12:00:34 -0700 Subject: [PATCH 28/28] cherry pick fix and additional tests --- .../fixtures/robust-berry-resolutions.lock | 3160 +++++++++++++++++ crates/turborepo-lockfiles/src/berry/mod.rs | 88 +- 2 files changed, 3243 insertions(+), 5 deletions(-) create mode 100644 crates/turborepo-lockfiles/fixtures/robust-berry-resolutions.lock diff --git a/crates/turborepo-lockfiles/fixtures/robust-berry-resolutions.lock b/crates/turborepo-lockfiles/fixtures/robust-berry-resolutions.lock new file mode 100644 index 0000000000000..cfab2c47d2593 --- /dev/null +++ b/crates/turborepo-lockfiles/fixtures/robust-berry-resolutions.lock @@ -0,0 +1,3160 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@ampproject/remapping@npm:^2.1.0": + version: 2.2.0 + resolution: "@ampproject/remapping@npm:2.2.0" + dependencies: + "@jridgewell/gen-mapping": ^0.1.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 + languageName: node + linkType: hard + +"@babel/code-frame@npm:7.12.11": + version: 7.12.11 + resolution: "@babel/code-frame@npm:7.12.11" + dependencies: + "@babel/highlight": ^7.10.4 + checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/code-frame@npm:7.18.6" + dependencies: + "@babel/highlight": ^7.18.6 + checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.20.0": + version: 7.20.1 + resolution: "@babel/compat-data@npm:7.20.1" + checksum: 989b9b7a6fe43c547bb8329241bd0ba6983488b83d29cc59de35536272ee6bb4cc7487ba6c8a4bceebb3a57f8c5fea1434f80bbbe75202bc79bc1110f955ff25 + languageName: node + linkType: hard + +"@babel/core@npm:^7.0.0": + version: 7.20.2 + resolution: "@babel/core@npm:7.20.2" + dependencies: + "@ampproject/remapping": ^2.1.0 + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.20.2 + "@babel/helper-compilation-targets": ^7.20.0 + "@babel/helper-module-transforms": ^7.20.2 + "@babel/helpers": ^7.20.1 + "@babel/parser": ^7.20.2 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.2 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.1 + semver: ^6.3.0 + checksum: 98faaaef26103a276a30a141b951a93bc8418d100d1f668bf7a69d12f3e25df57958e8b6b9100d95663f720db62da85ade736f6629a5ebb1e640251a1b43c0e4 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.20.1, @babel/generator@npm:^7.20.2": + version: 7.20.4 + resolution: "@babel/generator@npm:7.20.4" + dependencies: + "@babel/types": ^7.20.2 + "@jridgewell/gen-mapping": ^0.3.2 + jsesc: ^2.5.1 + checksum: 967b59f18e5ce999e5a741825bcecb2be4bbfc1824a92c21b47d0b5694e0eb09314a70f8b9142e9591c149c7fb83d51f73ae8fbd96d30a42666425889e51ceb1 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/helper-compilation-targets@npm:7.20.0" + dependencies: + "@babel/compat-data": ^7.20.0 + "@babel/helper-validator-option": ^7.18.6 + browserslist: ^4.21.3 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: bc183f2109648849c8fde0b3c5cf08adf2f7ad6dc617b546fd20f34c8ef574ee5ee293c8d1bd0ed0221212e8f5907cdc2c42097870f1dcc769a654107d82c95b + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/helper-environment-visitor@npm:7.18.9" + checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.19.0": + version: 7.19.0 + resolution: "@babel/helper-function-name@npm:7.19.0" + dependencies: + "@babel/template": ^7.18.10 + "@babel/types": ^7.19.0 + checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-hoist-variables@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-module-imports@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-module-transforms@npm:7.20.2" + dependencies: + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-module-imports": ^7.18.6 + "@babel/helper-simple-access": ^7.20.2 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/helper-validator-identifier": ^7.19.1 + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.2 + checksum: 33a60ca115f6fce2c9d98e2a2e5649498aa7b23e2ae3c18745d7a021487708fc311458c33542f299387a0da168afccba94116e077f2cce49ae9e5ab83399e8a2 + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-simple-access@npm:7.20.2" + dependencies: + "@babel/types": ^7.20.2 + checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-split-export-declaration@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.19.4": + version: 7.19.4 + resolution: "@babel/helper-string-parser@npm:7.19.4" + checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-validator-option@npm:7.18.6" + checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.20.1": + version: 7.20.1 + resolution: "@babel/helpers@npm:7.20.1" + dependencies: + "@babel/template": ^7.18.10 + "@babel/traverse": ^7.20.1 + "@babel/types": ^7.20.0 + checksum: be35f78666bdab895775ed94dbeb098f7b4fa08ce4cfb0c3a9e69b7220cce56960dcdc2b14f5df9d3b80388d4bf7df155c97f6cf6768c0138f4e6931d0f44955 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.18.10, @babel/parser@npm:^7.20.1, @babel/parser@npm:^7.20.2": + version: 7.20.3 + resolution: "@babel/parser@npm:7.20.3" + bin: + parser: ./bin/babel-parser.js + checksum: 33bcdb45de65a3cf27ed376cb34f32be3c3485a10e3252f8d0126f6a034efc3145c0d219e57fcd5a8956361552008bc30b9bae4a723823fb3633027071be8a45 + languageName: node + linkType: hard + +"@babel/runtime-corejs3@npm:^7.10.2": + version: 7.20.1 + resolution: "@babel/runtime-corejs3@npm:7.20.1" + dependencies: + core-js-pure: ^3.25.1 + regenerator-runtime: ^0.13.10 + checksum: bac1463304deb0e395f78aef2bf0e042d0ae303285b9f55e443d8ce4d3d05ccb92ac0aa5ca4bf83526695d21b12a239317537b00918d6ebf7a4132e5ec2f6f33 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.18.9": + version: 7.20.1 + resolution: "@babel/runtime@npm:7.20.1" + dependencies: + regenerator-runtime: ^0.13.10 + checksum: 00567a333d3357925742a6f5e39394dcc0af6e6029103fe188158bf7ae8b0b3ee3c6c0f68fccc217f0a6cfa455f6be252298baf56b3f5ff37b34313b170cd9f6 + languageName: node + linkType: hard + +"@babel/template@npm:^7.18.10": + version: 7.18.10 + resolution: "@babel/template@npm:7.18.10" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/parser": ^7.18.10 + "@babel/types": ^7.18.10 + checksum: 93a6aa094af5f355a72bd55f67fa1828a046c70e46f01b1606e6118fa1802b6df535ca06be83cc5a5e834022be95c7b714f0a268b5f20af984465a71e28f1473 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.20.1": + version: 7.20.1 + resolution: "@babel/traverse@npm:7.20.1" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.20.1 + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-function-name": ^7.19.0 + "@babel/helper-hoist-variables": ^7.18.6 + "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/parser": ^7.20.1 + "@babel/types": ^7.20.0 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 6696176d574b7ff93466848010bc7e94b250169379ec2a84f1b10da46a7cc2018ea5e3a520c3078487db51e3a4afab9ecff48f25d1dbad8c1319362f4148fb4b + languageName: node + linkType: hard + +"@babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.8.3": + version: 7.20.2 + resolution: "@babel/types@npm:7.20.2" + dependencies: + "@babel/helper-string-parser": ^7.19.4 + "@babel/helper-validator-identifier": ^7.19.1 + to-fast-properties: ^2.0.0 + checksum: 57e76e5f21876135f481bfd4010c87f2d38196bb0a2bc60a28d6e55e3afa90cdd9accf164e4cb71bdfb620517fa0a0cb5600cdce36c21d59fdaccfbb899c024c + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^0.4.3": + version: 0.4.3 + resolution: "@eslint/eslintrc@npm:0.4.3" + dependencies: + ajv: ^6.12.4 + debug: ^4.1.1 + espree: ^7.3.0 + globals: ^13.9.0 + ignore: ^4.0.6 + import-fresh: ^3.2.1 + js-yaml: ^3.13.1 + minimatch: ^3.0.4 + strip-json-comments: ^3.1.1 + checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.5.0": + version: 0.5.0 + resolution: "@humanwhocodes/config-array@npm:0.5.0" + dependencies: + "@humanwhocodes/object-schema": ^1.2.0 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.0": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.1.0": + version: 0.1.1 + resolution: "@jridgewell/gen-mapping@npm:0.1.1" + dependencies: + "@jridgewell/set-array": ^1.0.0 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/gen-mapping@npm:0.3.2" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 + languageName: node + linkType: hard + +"@next/env@npm:13.0.0": + version: 13.0.0 + resolution: "@next/env@npm:13.0.0" + checksum: 3146f10324366283c22bce0b700a8ae6c7dffad63cb81d698300c1795e7121d1fa0c2b6e0cbf7f7614117b0c3aa15556e88a7727a7b0e59aed054c2dfecb7d58 + languageName: node + linkType: hard + +"@next/eslint-plugin-next@npm:13.0.0": + version: 13.0.0 + resolution: "@next/eslint-plugin-next@npm:13.0.0" + dependencies: + glob: 7.1.7 + checksum: 03d3e359165e477978baa4862d88ffe6e4a1d0d944b7e3dc93c1d426b9769fdef6f115b1ac2933c95bdaa3d760667225935736523445330ed9c5b2d62bc055a5 + languageName: node + linkType: hard + +"@next/swc-android-arm-eabi@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-android-arm-eabi@npm:13.0.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@next/swc-android-arm64@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-android-arm64@npm:13.0.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-arm64@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-darwin-arm64@npm:13.0.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-darwin-x64@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-darwin-x64@npm:13.0.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-freebsd-x64@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-freebsd-x64@npm:13.0.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@next/swc-linux-arm-gnueabihf@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-linux-arm-gnueabihf@npm:13.0.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@next/swc-linux-arm64-gnu@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-linux-arm64-gnu@npm:13.0.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-arm64-musl@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-linux-arm64-musl@npm:13.0.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-linux-x64-gnu@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-linux-x64-gnu@npm:13.0.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@next/swc-linux-x64-musl@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-linux-x64-musl@npm:13.0.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@next/swc-win32-arm64-msvc@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-win32-arm64-msvc@npm:13.0.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@next/swc-win32-ia32-msvc@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-win32-ia32-msvc@npm:13.0.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@next/swc-win32-x64-msvc@npm:13.0.0": + version: 13.0.0 + resolution: "@next/swc-win32-x64-msvc@npm:13.0.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@rushstack/eslint-patch@npm:^1.1.3": + version: 1.2.0 + resolution: "@rushstack/eslint-patch@npm:1.2.0" + checksum: faa749faae0e83c26ae9eb00ad36a897ac78f3cf27da8e8ff21c00bcf7973b598d823d8f2b3957ef66079288bcf577f94df831eae2d65f3f68d8ca32f18b6aff + languageName: node + linkType: hard + +"@swc/helpers@npm:0.4.11": + version: 0.4.11 + resolution: "@swc/helpers@npm:0.4.11" + dependencies: + tslib: ^2.4.0 + checksum: 736857d524b41a8a4db81094e9b027f554004e0fa3e86325d85bdb38f7e6459ce022db079edb6c61ba0f46fe8583b3e663e95f7acbd13e51b8da6c34e45bba2e + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + +"@types/node@npm:^17.0.12": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.5 + resolution: "@types/prop-types@npm:15.7.5" + checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + languageName: node + linkType: hard + +"@types/react-dom@npm:^17.0.11": + version: 17.0.18 + resolution: "@types/react-dom@npm:17.0.18" + dependencies: + "@types/react": ^17 + checksum: b74525b1a13a0e27fe20859ff7a7e8f7e4581fb9d45ed1b6447ad1534d86f813818353c39d0df2e28f9d2b9be2e3af1908c244b2214a979393d19f217665e614 + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.0.7": + version: 18.0.9 + resolution: "@types/react-dom@npm:18.0.9" + dependencies: + "@types/react": "*" + checksum: e744e3feba25fc43733289d4df4d9c0e59fcca7f34e8c89d75f81a339accb2bd70236d69382d47d2c0ad06a1529b2e56aa6171fe175854d60e07156ddceedfcb + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^18.0.22": + version: 18.0.25 + resolution: "@types/react@npm:18.0.25" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: 231d658c45abdef044a716b4502774f1585d8336d73b2f5bd68f181acbfc874b7a457686ecd29b415b43ed0922c309bab7e2cf96832d188a3f4f1b02f2af760a + languageName: node + linkType: hard + +"@types/react@npm:^17, @types/react@npm:^17.0.37": + version: 17.0.52 + resolution: "@types/react@npm:17.0.52" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: a51b98dd87838d161278fdf9dd78e6a4ff8c018f406d6647f77963e144fb52a8beee40c89fd0e7e840eaeaa8bd9fe2f34519410540b1a52d43a6f8b4d2fbce33 + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.2 + resolution: "@types/scheduler@npm:0.16.2" + checksum: b6b4dcfeae6deba2e06a70941860fb1435730576d3689225a421280b7742318d1548b3d22c1f66ab68e414f346a9542f29240bc955b6332c5b11e561077583bc + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.21.0": + version: 5.44.0 + resolution: "@typescript-eslint/parser@npm:5.44.0" + dependencies: + "@typescript-eslint/scope-manager": 5.44.0 + "@typescript-eslint/types": 5.44.0 + "@typescript-eslint/typescript-estree": 5.44.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2d09a1a1547a7ae3f76c9a33a54e11d79a194fbb9dbae69988e7aed3370bdf12bafde669211152769d89db822e0cdee4173affc126664fa6f17abba56daa7261 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.44.0": + version: 5.44.0 + resolution: "@typescript-eslint/scope-manager@npm:5.44.0" + dependencies: + "@typescript-eslint/types": 5.44.0 + "@typescript-eslint/visitor-keys": 5.44.0 + checksum: 4cfe4b55eb428eda740e6b967e3a87f3e1f9c4bbd8e1d6b8d64a11666abe33ffe7a21e4e614444ccde2da6930fa85f3e0ffca43d6e339943ff7a4fbccb09c8fc + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.44.0": + version: 5.44.0 + resolution: "@typescript-eslint/types@npm:5.44.0" + checksum: ced7d32abecfc62ccb67cf27e30c0785b9c153ec7b1a05153ced58fa5a2031ab3845bc2e477b83e4cebdcc5881c5845d23053c6739c62549d41ae6208e547e85 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.44.0": + version: 5.44.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.44.0" + dependencies: + "@typescript-eslint/types": 5.44.0 + "@typescript-eslint/visitor-keys": 5.44.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 758731108497cca7ff81cf0a78d086b5a85757a983979d6bb25ad8252b7acbc738c642ecb5f5df82f925a45926b9846e431d5cf9fee5ed2613300b4d0c5d6c3f + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.44.0": + version: 5.44.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.44.0" + dependencies: + "@typescript-eslint/types": 5.44.0 + eslint-visitor-keys: ^3.3.0 + checksum: a012c888209e1d6ae684b2a44fd460ae5a80f5faf07bca4bda6c9c0d8c063ad3297d4c53f7151ae86cf1a43dee09625dc3ee72183323c91089c7288fd573c6f4 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.1": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn@npm:^7.4.0": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 + languageName: node + linkType: hard + +"ajv@npm:^8": + version: 8.11.2 + resolution: "ajv@npm:8.11.2" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 53435bf79ee7d1eabba8085962dba4c08d08593334b304db7772887f0b7beebc1b3d957432f7437ed4b60e53b5d966a57b439869890209c50fed610459999e3e + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"aria-query@npm:^4.2.2": + version: 4.2.2 + resolution: "aria-query@npm:4.2.2" + dependencies: + "@babel/runtime": ^7.10.2 + "@babel/runtime-corejs3": ^7.10.2 + checksum: 38401a9a400f26f3dcc24b84997461a16b32869a9893d323602bed8da40a8bcc0243b8d2880e942249a1496cea7a7de769e93d21c0baa439f01e1ee936fed665 + languageName: node + linkType: hard + +"array-includes@npm:^3.1.4, array-includes@npm:^3.1.5, array-includes@npm:^3.1.6": + version: 3.1.6 + resolution: "array-includes@npm:3.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + get-intrinsic: ^1.1.3 + is-string: ^1.0.7 + checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.2.5": + version: 1.3.1 + resolution: "array.prototype.flat@npm:1.3.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.0, array.prototype.flatmap@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flatmap@npm:1.3.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.1": + version: 1.1.1 + resolution: "array.prototype.tosorted@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + get-intrinsic: ^1.1.3 + checksum: 7923324a67e70a2fc0a6e40237405d92395e45ebd76f5cb89c2a5cf1e66b47aca6baacd0cd628ffd88830b90d47fff268071493d09c9ae123645613dac2c2ca3 + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.7": + version: 0.0.7 + resolution: "ast-types-flow@npm:0.0.7" + checksum: a26dcc2182ffee111cad7c471759b0bda22d3b7ebacf27c348b22c55f16896b18ab0a4d03b85b4020dce7f3e634b8f00b593888f622915096ea1927fa51866c4 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"axe-core@npm:^4.4.3": + version: 4.5.2 + resolution: "axe-core@npm:4.5.2" + checksum: 4068f183b2ef1db7e5a75606032c238781abfaa34ab4c23177e17f7dff8cc83f175e887b52689d20d88d2d4f001cbf632bd98925850026fe1d9abc739cabcf16 + languageName: node + linkType: hard + +"axobject-query@npm:^2.2.0": + version: 2.2.0 + resolution: "axobject-query@npm:2.2.0" + checksum: 96b8c7d807ca525f41ad9b286186e2089b561ba63a6d36c3e7d73dc08150714660995c7ad19cda05784458446a0793b45246db45894631e13853f48c1aa3117f + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.3": + version: 4.21.4 + resolution: "browserslist@npm:4.21.4" + dependencies: + caniuse-lite: ^1.0.30001400 + electron-to-chromium: ^1.4.251 + node-releases: ^2.0.6 + update-browserslist-db: ^1.0.9 + bin: + browserslist: cli.js + checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001406": + version: 1.0.30001434 + resolution: "caniuse-lite@npm:1.0.30001434" + checksum: 7c9d2641e8e8f3ddf9af14c4ce47266a9d8fd1fc0243626049ff1b2eca4bf02938ff440813cc3feae3fa8d851ec8d1b9718044340c8d09bb4372d92d4f6b519c + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"client-only@npm:0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.25.1": + version: 3.26.1 + resolution: "core-js-pure@npm:3.26.1" + checksum: d88c40e5e29e413c11d1ef991a8d5b6a63f00bd94707af0f649d3fc18b3524108b202f4ae75ce77620a1557d1ba340bc3362b4f25d590eccc37cf80fc75f7cd4 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.1 + resolution: "csstype@npm:3.1.1" + checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: d240b7757544460ae0586a341a53110ab0a61126570ef2d8c731e3eab3f0cb6e488e2609e6a69b46727635de49be20b071688698744417ff1b6c1d7ccd03e0de + languageName: node + linkType: hard + +"debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"docs@workspace:apps/docs": + version: 0.0.0-use.local + resolution: "docs@workspace:apps/docs" + dependencies: + "@babel/core": ^7.0.0 + "@types/node": ^17.0.12 + "@types/react": ^18.0.22 + "@types/react-dom": ^18.0.7 + eslint: 7.32.0 + eslint-config-custom: "*" + next: 13.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + tsconfig: "*" + typescript: ^4.5.3 + ui: "*" + languageName: unknown + linkType: soft + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: ^2.0.2 + checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.251": + version: 1.4.284 + resolution: "electron-to-chromium@npm:1.4.284" + checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"enquirer@npm:^2.3.5": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: ^4.1.1 + checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.20.4 + resolution: "es-abstract@npm:1.20.4" + dependencies: + call-bind: ^1.0.2 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.1.3 + get-symbol-description: ^1.0.0 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-symbols: ^1.0.3 + internal-slot: ^1.0.3 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-weakref: ^1.0.2 + object-inspect: ^1.12.2 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trimend: ^1.0.5 + string.prototype.trimstart: ^1.0.5 + unbox-primitive: ^1.0.2 + checksum: 89297cc785c31aedf961a603d5a07ed16471e435d3a1b6d070b54f157cf48454b95cda2ac55e4b86ff4fe3276e835fcffd2771578e6fa634337da49b26826141 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-custom@*, eslint-config-custom@workspace:packages/eslint-config-custom": + version: 0.0.0-use.local + resolution: "eslint-config-custom@workspace:packages/eslint-config-custom" + dependencies: + eslint: ^7.23.0 + eslint-config-next: 13.0.0 + eslint-config-prettier: ^8.3.0 + eslint-config-turbo: latest + eslint-plugin-react: 7.31.8 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + +"eslint-config-next@npm:13.0.0": + version: 13.0.0 + resolution: "eslint-config-next@npm:13.0.0" + dependencies: + "@next/eslint-plugin-next": 13.0.0 + "@rushstack/eslint-patch": ^1.1.3 + "@typescript-eslint/parser": ^5.21.0 + eslint-import-resolver-node: ^0.3.6 + eslint-import-resolver-typescript: ^2.7.1 + eslint-plugin-import: ^2.26.0 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.31.7 + eslint-plugin-react-hooks: ^4.5.0 + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: ">=3.3.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 69f04df8d831aba78df30edec2ce7a7cc5779af89159bfdc42f015d2e038a26e8b2b6e8407873a3827098f5abd21b5657aace0ff014d345465ae98d133ddb285 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.3.0": + version: 8.5.0 + resolution: "eslint-config-prettier@npm:8.5.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 + languageName: node + linkType: hard + +eslint-config-turbo@latest: + version: 0.0.4 + resolution: "eslint-config-turbo@npm:0.0.4" + dependencies: + eslint-plugin-turbo: 0.0.4 + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + checksum: 5f89b557c0ebefe558315fdb6c2a2b800084ecb8c1cd170998c3b29f359885c5b40f48393a1657c36a868b3b9d89cd23503c3d927103cd9ca58e4d3aaccb6888 + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.6": + version: 0.3.6 + resolution: "eslint-import-resolver-node@npm:0.3.6" + dependencies: + debug: ^3.2.7 + resolve: ^1.20.0 + checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^2.7.1": + version: 2.7.1 + resolution: "eslint-import-resolver-typescript@npm:2.7.1" + dependencies: + debug: ^4.3.4 + glob: ^7.2.0 + is-glob: ^4.0.3 + resolve: ^1.22.0 + tsconfig-paths: ^3.14.1 + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + checksum: 1d81b657b1f73bf95b8f0b745c0305574b91630c1db340318f3ca8918e206fce20a933b95e7c419338cc4452cb80bb2b2d92acaf01b6aa315c78a332d832545c + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.7.3": + version: 2.7.4 + resolution: "eslint-module-utils@npm:2.7.4" + dependencies: + debug: ^3.2.7 + peerDependenciesMeta: + eslint: + optional: true + checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.26.0": + version: 2.26.0 + resolution: "eslint-plugin-import@npm:2.26.0" + dependencies: + array-includes: ^3.1.4 + array.prototype.flat: ^1.2.5 + debug: ^2.6.9 + 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 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.values: ^1.1.5 + resolve: ^1.22.0 + tsconfig-paths: ^3.14.1 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.5.1": + version: 6.6.1 + resolution: "eslint-plugin-jsx-a11y@npm:6.6.1" + 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 + 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 + minimatch: ^3.1.2 + semver: ^6.3.0 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: baae7377f0e25a0cc9b34dc333a3dc6ead9ee8365e445451eff554c3ca267a0a6cb88127fe90395c578ab1b92cfed246aef7dc8d2b48b603389e10181799e144 + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^4.5.0": + version: 4.6.0 + resolution: "eslint-plugin-react-hooks@npm:4.6.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 23001801f14c1d16bf0a837ca7970d9dd94e7b560384b41db378b49b6e32dc43d6e2790de1bd737a652a86f81a08d6a91f402525061b47719328f586a57e86c3 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:7.31.8": + version: 7.31.8 + resolution: "eslint-plugin-react@npm:7.31.8" + dependencies: + array-includes: ^3.1.5 + array.prototype.flatmap: ^1.3.0 + doctrine: ^2.1.0 + 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 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.3 + semver: ^6.3.0 + string.prototype.matchall: ^4.0.7 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 0683e2a624a4df6f08264a3f6bc614a81e8f961c83173bdf2d8d3523f84ed5d234cddc976dbc6815913e007c5984df742ba61be0c0592b27c3daabe0f68165a3 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.31.7": + version: 7.31.11 + resolution: "eslint-plugin-react@npm:7.31.11" + dependencies: + array-includes: ^3.1.6 + array.prototype.flatmap: ^1.3.1 + array.prototype.tosorted: ^1.1.1 + doctrine: ^2.1.0 + estraverse: ^5.3.0 + jsx-ast-utils: ^2.4.1 || ^3.0.0 + minimatch: ^3.1.2 + object.entries: ^1.1.6 + object.fromentries: ^2.0.6 + object.hasown: ^1.1.2 + object.values: ^1.1.6 + prop-types: ^15.8.1 + resolve: ^2.0.0-next.3 + semver: ^6.3.0 + string.prototype.matchall: ^4.0.8 + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: a3d612f6647bef33cf2a67c81a6b37b42c075300ed079cffecf5fb475c0d6ab855c1de340d1cbf361a0126429fb906dda597527235d2d12c4404453dbc712fc6 + languageName: node + linkType: hard + +"eslint-plugin-turbo@npm:0.0.4": + version: 0.0.4 + resolution: "eslint-plugin-turbo@npm:0.0.4" + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + checksum: c2a27226ae46b6cc4a747a6d82eefc7efa5df14542dcf84806e72564e11d1d76971284e73b44ee36e5bf33eb13519fe2b5d71b783c1789c185da1519caf54cb5 + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "eslint-utils@npm:2.1.0" + dependencies: + eslint-visitor-keys: ^1.1.0 + checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0": + version: 1.3.0 + resolution: "eslint-visitor-keys@npm:1.3.0" + checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0": + version: 3.3.0 + resolution: "eslint-visitor-keys@npm:3.3.0" + checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 + languageName: node + linkType: hard + +"eslint@npm:7.32.0, eslint@npm:^7.23.0, eslint@npm:^7.32.0": + version: 7.32.0 + resolution: "eslint@npm:7.32.0" + dependencies: + "@babel/code-frame": 7.12.11 + "@eslint/eslintrc": ^0.4.3 + "@humanwhocodes/config-array": ^0.5.0 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.0.1 + doctrine: ^3.0.0 + enquirer: ^2.3.5 + escape-string-regexp: ^4.0.0 + eslint-scope: ^5.1.1 + eslint-utils: ^2.1.0 + eslint-visitor-keys: ^2.0.0 + espree: ^7.3.1 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + functional-red-black-tree: ^1.0.1 + glob-parent: ^5.1.2 + globals: ^13.6.0 + ignore: ^4.0.6 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^3.13.1 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.0.4 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + progress: ^2.0.0 + regexpp: ^3.1.0 + semver: ^7.2.1 + strip-ansi: ^6.0.0 + strip-json-comments: ^3.1.0 + table: ^6.0.9 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37 + languageName: node + linkType: hard + +"espree@npm:^7.3.0, espree@npm:^7.3.1": + version: 7.3.1 + resolution: "espree@npm:7.3.1" + dependencies: + acorn: ^7.4.0 + acorn-jsx: ^5.3.1 + eslint-visitor-keys: ^1.3.0 + checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.0": + version: 1.4.0 + resolution: "esquery@npm:1.4.0" + dependencies: + estraverse: ^5.1.0 + checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + 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 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.13.0 + resolution: "fastq@npm:1.13.0" + dependencies: + reusify: ^1.0.4 + checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": + version: 1.1.3 + resolution: "get-intrinsic@npm:1.1.3" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.3 + checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob@npm:7.1.7": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + 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 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.2.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.6.0, globals@npm:^13.9.0": + version: 13.18.0 + resolution: "globals@npm:13.18.0" + dependencies: + type-fest: ^0.20.2 + checksum: 9fdaa74cfd5d4ac91319662f512c29b11d1d2deb9c8a20d3998097671deba83d195f20730b2345887de3ddab958a6fa68952feed9ae836ee4594a82ace62fdb4 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"ignore@npm:^4.0.6": + version: 4.0.6 + resolution: "ignore@npm:4.0.6" + checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.2.0 + resolution: "ignore@npm:5.2.0" + checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.3": + version: 1.0.3 + resolution: "internal-slot@npm:1.0.3" + dependencies: + get-intrinsic: ^1.1.0 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": + version: 2.11.0 + resolution: "is-core-module@npm:2.11.0" + dependencies: + has: ^1.0.3 + checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^1.0.1": + version: 1.0.1 + resolution: "json5@npm:1.0.1" + dependencies: + minimist: ^1.2.0 + bin: + json5: lib/cli.js + checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 + languageName: node + linkType: hard + +"json5@npm:^2.2.1": + version: 2.2.1 + resolution: "json5@npm:2.2.1" + bin: + json5: lib/cli.js + checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.2": + version: 3.3.3 + resolution: "jsx-ast-utils@npm:3.3.3" + dependencies: + array-includes: ^3.1.5 + object.assign: ^4.1.3 + checksum: a2ed78cac49a0f0c4be8b1eafe3c5257a1411341d8e7f1ac740debae003de04e5f6372bfcfbd9d082e954ffd99aac85bcda85b7c6bc11609992483f4cdc0f745 + languageName: node + linkType: hard + +"language-subtag-registry@npm:~0.3.2": + version: 0.3.22 + resolution: "language-subtag-registry@npm:0.3.22" + checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a + languageName: node + linkType: hard + +"language-tags@npm:^1.0.5": + version: 1.0.5 + resolution: "language-tags@npm:1.0.5" + dependencies: + language-subtag-registry: ~0.3.2 + checksum: c81b5d8b9f5f9cfd06ee71ada6ddfe1cf83044dd5eeefcd1e420ad491944da8957688db4a0a9bc562df4afdc2783425cbbdfd152c01d93179cf86888903123cf + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: ^3.0.0 || ^4.0.0 + bin: + loose-envify: cli.js + checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.7 + resolution: "minimist@npm:1.2.7" + checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + languageName: node + linkType: hard + +"monorepo@workspace:.": + version: 0.0.0-use.local + resolution: "monorepo@workspace:." + dependencies: + eslint-config-custom: "*" + prettier: latest + turbo: 1.6.3 + languageName: unknown + linkType: soft + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" + bin: + nanoid: bin/nanoid.cjs + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"next@npm:13.0.0": + version: 13.0.0 + resolution: "next@npm:13.0.0" + dependencies: + "@next/env": 13.0.0 + "@next/swc-android-arm-eabi": 13.0.0 + "@next/swc-android-arm64": 13.0.0 + "@next/swc-darwin-arm64": 13.0.0 + "@next/swc-darwin-x64": 13.0.0 + "@next/swc-freebsd-x64": 13.0.0 + "@next/swc-linux-arm-gnueabihf": 13.0.0 + "@next/swc-linux-arm64-gnu": 13.0.0 + "@next/swc-linux-arm64-musl": 13.0.0 + "@next/swc-linux-x64-gnu": 13.0.0 + "@next/swc-linux-x64-musl": 13.0.0 + "@next/swc-win32-arm64-msvc": 13.0.0 + "@next/swc-win32-ia32-msvc": 13.0.0 + "@next/swc-win32-x64-msvc": 13.0.0 + "@swc/helpers": 0.4.11 + caniuse-lite: ^1.0.30001406 + postcss: 8.4.14 + styled-jsx: 5.1.0 + use-sync-external-store: 1.2.0 + peerDependencies: + fibers: ">= 3.1.0" + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.0.0-0 + react-dom: ^18.0.0-0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-android-arm-eabi": + optional: true + "@next/swc-android-arm64": + optional: true + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-freebsd-x64": + optional: true + "@next/swc-linux-arm-gnueabihf": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: 7b5c84728783433c07e3eac65d5d85434f6c056a3e55c417c7636e08d8e1af2532d83f75b8448ddc5c9525145a6a7c93e8482744ee3f2d647841b152306da939 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.6": + version: 2.0.6 + resolution: "node-releases@npm:2.0.6" + checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": + version: 1.12.2 + resolution: "object-inspect@npm:1.12.2" + checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.3, object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"object.entries@npm:^1.1.5, object.entries@npm:^1.1.6": + version: 1.1.6 + resolution: "object.entries@npm:1.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28 + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.5, object.fromentries@npm:^2.0.6": + version: 2.0.6 + resolution: "object.fromentries@npm:2.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 453c6d694180c0c30df451b60eaf27a5b9bca3fb43c37908fd2b78af895803dc631242bcf05582173afa40d8d0e9c96e16e8874b39471aa53f3ac1f98a085d85 + languageName: node + linkType: hard + +"object.hasown@npm:^1.1.1, object.hasown@npm:^1.1.2": + version: 1.1.2 + resolution: "object.hasown@npm:1.1.2" + dependencies: + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: b936572536db0cdf38eb30afd2f1026a8b6f2cc5d2c4497c9d9bbb01eaf3e980dead4fd07580cfdd098e6383e5a9db8212d3ea0c6bdd2b5e68c60aa7e3b45566 + languageName: node + linkType: hard + +"object.values@npm:^1.1.5, object.values@npm:^1.1.6": + version: 1.1.6 + resolution: "object.values@npm:1.1.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + word-wrap: ^1.2.3 + checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"postcss@npm:8.4.14": + version: 8.4.14 + resolution: "postcss@npm:8.4.14" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +prettier@latest: + version: 2.7.1 + resolution: "prettier@npm:2.7.1" + bin: + prettier: bin-prettier.js + checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b + languageName: node + linkType: hard + +"progress@npm:^2.0.0": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: ^1.4.0 + object-assign: ^4.1.1 + react-is: ^16.13.1 + checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"react-dom@npm:^18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.0 + peerDependencies: + react: ^18.2.0 + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.13.10": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.3": + version: 1.4.3 + resolution: "regexp.prototype.flags@npm:1.4.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + functions-have-names: ^1.2.2 + checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + languageName: node + linkType: hard + +"regexpp@npm:^3.1.0": + version: 3.2.0 + resolution: "regexpp@npm:3.2.0" + checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:^1.22.0": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.3": + version: 2.0.0-next.4 + resolution: "resolve@npm:2.0.0-next.4" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + languageName: node + linkType: hard + +"resolve@patch:resolve@^2.0.0-next.3#~builtin": + version: 2.0.0-next.4 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=c3c19d" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: ^1.1.0 + checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"semver@npm:^7.2.1, semver@npm:^7.3.7": + version: 7.3.8 + resolution: "semver@npm:7.3.8" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.7, string.prototype.matchall@npm:^4.0.8": + version: 4.0.8 + resolution: "string.prototype.matchall@npm:4.0.8" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + get-intrinsic: ^1.1.3 + has-symbols: ^1.0.3 + internal-slot: ^1.0.3 + regexp.prototype.flags: ^1.4.3 + side-channel: ^1.0.4 + checksum: 952da3a818de42ad1c10b576140a5e05b4de7b34b8d9dbf00c3ac8c1293e9c0f533613a39c5cda53e0a8221f2e710bc2150e730b1c2278d60004a8a35726efb6 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.5": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.5": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"styled-jsx@npm:5.1.0": + version: 5.1.0 + resolution: "styled-jsx@npm:5.1.0" + dependencies: + client-only: 0.0.1 + peerDependencies: + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + checksum: e5b70476fd9059147dfe35dd912e537e422a7f900cc88f80456c97da495c655598875d64de2199641d627770a7e55ed08be0fd82646bc386791fdb1d0e5af2b1 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"table@npm:^6.0.9": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.14.1": + version: 3.14.1 + resolution: "tsconfig-paths@npm:3.14.1" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.1 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + languageName: node + linkType: hard + +"tsconfig@*, tsconfig@workspace:packages/tsconfig": + version: 0.0.0-use.local + resolution: "tsconfig@workspace:packages/tsconfig" + languageName: unknown + linkType: soft + +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.4.0": + version: 2.4.1 + resolution: "tslib@npm:2.4.1" + checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"turbo-darwin-64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-darwin-64@npm:1.6.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"turbo-darwin-arm64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-darwin-arm64@npm:1.6.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"turbo-linux-64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-linux-64@npm:1.6.3" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"turbo-linux-arm64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-linux-arm64@npm:1.6.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"turbo-windows-64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-windows-64@npm:1.6.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"turbo-windows-arm64@npm:1.6.3": + version: 1.6.3 + resolution: "turbo-windows-arm64@npm:1.6.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"turbo@npm:1.6.3": + version: 1.6.3 + resolution: "turbo@npm:1.6.3" + dependencies: + turbo-darwin-64: 1.6.3 + turbo-darwin-arm64: 1.6.3 + turbo-linux-64: 1.6.3 + turbo-linux-arm64: 1.6.3 + turbo-windows-64: 1.6.3 + turbo-windows-arm64: 1.6.3 + dependenciesMeta: + turbo-darwin-64: + optional: true + turbo-darwin-arm64: + optional: true + turbo-linux-64: + optional: true + turbo-linux-arm64: + optional: true + turbo-windows-64: + optional: true + turbo-windows-arm64: + optional: true + bin: + turbo: bin/turbo + checksum: 35195f4b7623014c25ba152c11a8cb23e51cbd75dc9266d0656692665f85b28faf3496dea8cecacf52795a917410668124186ffbdcf276325ccc3e11df9e9623 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"typescript@npm:^4.5.2, typescript@npm:^4.5.3, typescript@npm:^4.7.4": + version: 4.9.3 + resolution: "typescript@npm:4.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 17b8f816050b412403e38d48eef0e893deb6be522d6dc7caf105e54a72e34daf6835c447735fd2b28b66784e72bfbf87f627abb4818a8e43d1fa8106396128dc + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.5.2#~builtin, typescript@patch:typescript@^4.5.3#~builtin, typescript@patch:typescript@^4.7.4#~builtin": + version: 4.9.3 + resolution: "typescript@patch:typescript@npm%3A4.9.3#~builtin::version=4.9.3&hash=d73830" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 67ca21a387c0572f1c04936e638dde7782c5aa520c3754aadc7cc9b7c915da9ebc3e27c601bfff4ccb7d7264e82dce6d277ada82ec09dc75024349e0ef64926d + languageName: node + linkType: hard + +"ui@*, ui@workspace:packages/ui": + version: 0.0.0-use.local + resolution: "ui@workspace:packages/ui" + dependencies: + "@types/react": ^17.0.37 + "@types/react-dom": ^17.0.11 + eslint: ^7.32.0 + eslint-config-custom: "*" + react: ^18.2.0 + tsconfig: "*" + typescript: ^4.5.2 + languageName: unknown + linkType: soft + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.9": + version: 1.0.10 + resolution: "update-browserslist-db@npm:1.0.10" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + browserslist-lint: cli.js + checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"use-sync-external-store@npm:1.2.0": + version: 1.2.0 + resolution: "use-sync-external-store@npm:1.2.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a + languageName: node + linkType: hard + +"v8-compile-cache@npm:^2.0.3": + version: 2.3.0 + resolution: "v8-compile-cache@npm:2.3.0" + checksum: adb0a271eaa2297f2f4c536acbfee872d0dd26ec2d76f66921aa7fc437319132773483344207bdbeee169225f4739016d8d2dbf0553913a52bb34da6d0334f8e + languageName: node + linkType: hard + +"web@workspace:apps/web": + version: 0.0.0-use.local + resolution: "web@workspace:apps/web" + dependencies: + "@babel/core": ^7.0.0 + "@types/node": ^17.0.12 + "@types/react": ^18.0.22 + "@types/react-dom": ^18.0.7 + eslint: 7.32.0 + eslint-config-custom: "*" + next: 13.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + tsconfig: "*" + typescript: ^4.5.3 + ui: "*" + languageName: unknown + linkType: soft + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard diff --git a/crates/turborepo-lockfiles/src/berry/mod.rs b/crates/turborepo-lockfiles/src/berry/mod.rs index 05e099750d05c..e8569313d1410 100644 --- a/crates/turborepo-lockfiles/src/berry/mod.rs +++ b/crates/turborepo-lockfiles/src/berry/mod.rs @@ -21,6 +21,8 @@ use super::Lockfile; #[derive(Debug, Error)] pub enum Error { + #[error("unable to parse")] + Parse(#[from] serde_yaml::Error), #[error("unable to parse")] Identifiers(#[from] identifiers::Error), #[error("unable to find original package in patch locator {0}")] @@ -285,7 +287,7 @@ impl<'a> BerryLockfile<'a> { let dep_locator = self .resolutions .get(&dependency) - .unwrap_or_else(|| panic!("Unable to find locator for {dependency}")); + .ok_or_else(|| Error::MissingLocator(dependency.clone().into_owned()))?; resolutions.insert(dependency, dep_locator.clone()); } @@ -323,7 +325,8 @@ impl<'a> BerryLockfile<'a> { // Add any descriptors used by package extensions for descriptor in &self.extensions { - let locator = resolutions + let locator = self + .resolutions .get(descriptor) .ok_or_else(|| Error::MissingLocator(descriptor.to_owned()))?; resolutions.insert(descriptor.clone(), locator.clone()); @@ -453,7 +456,21 @@ impl<'a> Lockfile for BerryLockfile<'a> { } } +impl LockfileData { + pub fn from_bytes(s: &[u8]) -> Result { + serde_yaml::from_slice(s).map_err(Error::from) + } +} + impl BerryManifest { + pub fn with_resolutions(resolutions: I) -> Self + where + I: IntoIterator, + { + let resolutions = Some(resolutions.into_iter().collect()); + Self { resolutions } + } + pub fn resolutions(&self) -> Option, Error>> { self.resolutions.as_ref().map(|resolutions| { resolutions @@ -467,17 +484,38 @@ impl BerryManifest { } } +pub fn berry_subgraph( + contents: &[u8], + workspace_packages: &[String], + packages: &[String], + resolutions: Option>, +) -> Result, Error> { + let manifest = resolutions.map(BerryManifest::with_resolutions); + let data = LockfileData::from_bytes(contents)?; + let lockfile = BerryLockfile::new(&data, manifest.as_ref())?; + let pruned_lockfile = lockfile.subgraph(workspace_packages, packages)?; + let new_contents = pruned_lockfile.lockfile()?.to_string().into_bytes(); + Ok(new_contents) +} + +pub fn berry_global_change(prev_contents: &[u8], curr_contents: &[u8]) -> Result { + let prev_data = LockfileData::from_bytes(prev_contents)?; + let curr_data = LockfileData::from_bytes(curr_contents)?; + Ok(prev_data.metadata.cache_key != curr_data.metadata.cache_key + || prev_data.metadata.version != curr_data.metadata.version) +} + #[cfg(test)] mod test { use pretty_assertions::assert_eq; use super::*; - use crate::Package; + use crate::{transitive_closure, Package}; #[test] fn test_deserialize_lockfile() { let lockfile: LockfileData = - serde_yaml::from_slice(include_bytes!("../../fixtures/berry.lock")).unwrap(); + LockfileData::from_bytes(include_bytes!("../../fixtures/berry.lock")).unwrap(); assert_eq!(lockfile.metadata.version, 6); assert_eq!(lockfile.metadata.cache_key.as_deref(), Some("8c0")); } @@ -485,7 +523,7 @@ mod test { #[test] fn test_roundtrip() { let contents = include_str!("../../fixtures/berry.lock"); - let lockfile: LockfileData = serde_yaml::from_str(contents).unwrap(); + let lockfile = LockfileData::from_bytes(contents.as_bytes()).unwrap(); let new_contents = lockfile.to_string(); assert_eq!(contents, new_contents); } @@ -687,4 +725,44 @@ mod test { } ); } + + #[test] + fn test_robust_resolutions_dependencies() { + let data = LockfileData::from_bytes(include_bytes!( + "../../fixtures/robust-berry-resolutions.lock" + )) + .unwrap(); + let manifest = BerryManifest { + resolutions: Some( + [("ajv".to_string(), "^8".to_string())] + .iter() + .cloned() + .collect(), + ), + }; + let lockfile = BerryLockfile::new(&data, Some(&manifest)).unwrap(); + + let unresolved_deps = vec![ + ("@types/react-dom", "^17.0.11"), + ("@types/react", "^17.0.37"), + ("eslint", "^7.32.0"), + ("typescript", "^4.5.2"), + ("react", "^18.2.0"), + ] + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect(); + + let closure = + transitive_closure(&lockfile, "packages/ui".to_string(), unresolved_deps).unwrap(); + + assert!(closure.contains(&Package { + key: "ajv@npm:8.11.2".into(), + version: "8.11.2".into() + })); + assert!(closure.contains(&Package { + key: "uri-js@npm:4.4.1".into(), + version: "4.4.1".into() + })); + } }