diff --git a/Makefile b/Makefile index cb5256247d..8f1440028e 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ LDFLAGS += " # By default, make test-fn-render/test-fn-eval will run all tests. T ?= ".*" -all: generate license fix vet fmt lint test build tidy +all: license fix vet fmt lint test build tidy build: go build ${LDFLAGS} -o $(GOBIN)/kpt -v . diff --git a/documentation/README.md b/documentation/README.md index ba7580cbfa..21dda19b94 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1,12 +1,12 @@ # kpt Documentation Site -[![UPDATE ME](https://api.netlify.com/api/v1/badges/61012e8d-a38d-457e-b1e4-6dc9dbb87934/deploy-status)](https://app.netlify.com/sites/cloud-native-finland/deploys) +[![Netlify Status](https://api.netlify.com/api/v1/badges/57cfe7e6-fce7-4a0e-b00b-f6cc68b3f506/deploy-status)](https://app.netlify.com/projects/kptdocs/deploys) This directory contains a [Hugo](https://gohugo.io) web site published via [Netlify](https://www.netlify.com/) to -. + what is redirected to . When the `main` branch of this repo is updated a fresh build and deploy of the website is executed. Recent Netlify -builds and deployments are listed at . +builds and deployments are listed at . Add content by adding Markdown files to directories in [./content](./content). @@ -29,3 +29,4 @@ Then run the site using `npm run serve`. To have the site run locally with a fun ## License Licensed under the [Creative Commons Attribution 4.0 International license](LICENSE-documentation) + \ No newline at end of file diff --git a/documentation/config.toml b/documentation/config.toml index f086c6cd12..7178c7f929 100644 --- a/documentation/config.toml +++ b/documentation/config.toml @@ -1,4 +1,4 @@ -baseURL = "https://684fb170b24b590a22aa61e6--deluxe-horse-d10c96.netlify.app/" +baseURL = "https://kpt.dev/" title = "kpt documentaion" # Language settings diff --git a/site/.babelrc b/site/.babelrc deleted file mode 100644 index c4e0dc1e7f..0000000000 --- a/site/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["@babel/plugin-proposal-optional-chaining"] - } \ No newline at end of file diff --git a/site/.dockerignore b/site/.dockerignore deleted file mode 100644 index 3091757a3b..0000000000 --- a/site/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -coverage \ No newline at end of file diff --git a/site/.gitignore b/site/.gitignore deleted file mode 100644 index 54d8bd2457..0000000000 --- a/site/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -book/*/README.md -coverage \ No newline at end of file diff --git a/site/CONTRIBUTING.md b/site/CONTRIBUTING.md deleted file mode 100644 index db177d4ac7..0000000000 --- a/site/CONTRIBUTING.md +++ /dev/null @@ -1,28 +0,0 @@ -# How to Contribute - -We'd love to accept your patches and contributions to this project. There are -just a few small guidelines you need to follow. - -## Contributor License Agreement - -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution; -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. - -## Code reviews - -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult -[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more -information on using pull requests. - -## Community Guidelines - -This project follows -[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). diff --git a/site/Dockerfile b/site/Dockerfile deleted file mode 100644 index 87d0d95fd9..0000000000 --- a/site/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM nginx:1.18.0-alpine -COPY . /usr/share/nginx/html -COPY site_check.conf /etc/nginx/conf.d/configfile.template - -ENV PORT 80 -ENV HOST 0.0.0.0 -EXPOSE 80 -RUN sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf" -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/site/README.md b/site/README.md deleted file mode 100644 index 665f3ab7e0..0000000000 --- a/site/README.md +++ /dev/null @@ -1,18 +0,0 @@ -

download Install

- -Get started by [installing](/installation/) kpt. - -

school Learn

- -Read [The kpt Book](/book/). - -

help_outline Ask

- -If your question is not a [FAQ](/faq/), please [reach out](/contact/)! - -

handyman Contribute

- -kpt is an OSS project and anyone can [contribute]! - -[contribute]: - https://github.com/kptdev/kpt/blob/main/CONTRIBUTING.md diff --git a/site/api-reference/README.md b/site/api-reference/README.md deleted file mode 100755 index da1c57c904..0000000000 --- a/site/api-reference/README.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "API Reference" -linkTitle: "API Reference" -type: docs -weight: 40 -description: > - Overview of kpt declarative APIs ---- diff --git a/site/api-reference/kptfile/README.md b/site/api-reference/kptfile/README.md deleted file mode 100644 index c91d07189d..0000000000 --- a/site/api-reference/kptfile/README.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Kptfile" -linkTitle: "Kptfile " -weight: 1 -type: swagger -description: > - Reference for the Kptfile schema ---- -{{< swaggerui src="/openapi/kptfile.yaml" >}} diff --git a/site/book/01-getting-started/00.md b/site/book/01-getting-started/00.md deleted file mode 100644 index f62ae2a374..0000000000 --- a/site/book/01-getting-started/00.md +++ /dev/null @@ -1,2 +0,0 @@ -This chapter is a quick introduction to kpt using an example to demonstrate important concepts and -features. The following chapters will cover these concepts in detail. diff --git a/site/book/01-getting-started/01-system-requirements.md b/site/book/01-getting-started/01-system-requirements.md deleted file mode 100644 index 81b819a67b..0000000000 --- a/site/book/01-getting-started/01-system-requirements.md +++ /dev/null @@ -1,48 +0,0 @@ -In order to follow along with the examples in this book, the following needs to be installed on your -system: - -## kpt - -[Install the kpt CLI][install] and ensure you are running **version 1.0 or later**: - -```shell -$ kpt version -``` - -## Git - -kpt requires that you have [Git] installed and configured. - -## Container Runtime - -`kpt` requires you to have at least one of the following runtimes installed and configured. - - - -### Docker - -Please follow the [instructions][install-docker] to install and configure Docker. - -### Podman - -Please follow the [instructions][install-podman] to install and configure Podman. - -If you want to set up rootless container runtime, [this][rootless] may be a -useful resource for you. - -Environment variable can be used to control which container runtime to use. More -details can be found in the reference documents for [`kpt fn render`](/reference/cli/fn/render/) -and [`kpt fn eval`](/reference/cli/fn/eval/). - -## Kubernetes cluster - -In order to deploy the examples, you need a Kubernetes cluster and a configured kubeconfig context. - -For testing purposes, [kind] tool is useful for running ephemeral Kubernetes cluster on your local host. - -[install]: /installation/ -[install-docker]: https://docs.docker.com/get-docker/ -[install-podman]: https://podman.io/getting-started/installation -[rootless]: https://rootlesscontaine.rs/ -[git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git -[kind]: https://kind.sigs.k8s.io/docs/user/quick-start/ diff --git a/site/book/01-getting-started/02-quickstart.md b/site/book/01-getting-started/02-quickstart.md deleted file mode 100644 index 8999bd6c18..0000000000 --- a/site/book/01-getting-started/02-quickstart.md +++ /dev/null @@ -1,182 +0,0 @@ -In this example, you are going to configure and deploy Nginx to a Kubernetes -cluster. - -## Fetch the package - -kpt is fully integrated with Git and enables forking, rebasing and versioning a -package of configuration using the underlying Git version control system. - -First, let's fetch the _kpt package_ from Git to your local filesystem: - -```shell -$ kpt pkg get https://github.com/kptdev/kpt/package-examples/nginx@v0.9 -``` - -Subsequent commands are run from the `nginx` directory: - -```shell -$ cd nginx -``` - -`kpt pkg` commands provide the functionality for working with packages on Git -and on your local filesystem. - -Next, let's quickly view the content of the package: - -```shell -$ kpt pkg tree -Package "nginx" -├── [Kptfile] Kptfile nginx -├── [deployment.yaml] Deployment my-nginx -└── [svc.yaml] Service my-nginx-svc -``` - -As you can see, this package contains 3 resources in 3 files. There is a special -file named `Kptfile` which is used by the kpt tool itself and is not deployed to -the cluster. Later chapters will explain the `Kptfile` in detail. - -Initialize a local Git repo and commit the forked copy of the package: - -```shell -$ git init; git add .; git commit -m "Pristine nginx package" -``` - -## Customize the package - -At this point, you typically want to customize the package. With kpt, you can -use different approaches depending on your use case. - -### Manual Editing - -You may want to manually edit the files. For example, modify the value of -`spec.replicas` in `deployment.yaml` using your favorite editor: - -```shell -$ vim deployment.yaml -``` - -### Automating One-time Edits with Functions - -The `kpt fn` set of commands enable you to execute programs called _kpt functions_. These -programs are packaged as containers and take in YAML files, mutate or validate them, and then -output YAML. - -For instance, you can use a function (`gcr.io/kpt-fn/search-replace:v0.1`) to search and replace all -the occurrences of the `app` key in the `spec` section of the YAML document (`spec.**.app`) and -set the value to `my-nginx`. - -You can use the `kpt fn eval` command to run this mutation on your local files a single time: - -```shell -$ kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.1 -- by-path='spec.**.app' put-value=my-nginx -``` - -To see what changes were made to the local package: - -```shell -$ git diff -``` - -### Declaratively Defining Edits - -For operations that need to be performed repeatedly, there is a _declarative_ way to define a -pipeline of functions as part of the package (in the `Kptfile`). In this `nginx` package, the author -has already declared a function (`kubeval`) that validates the resources -using their OpenAPI schema. - -```yaml -pipeline: - validators: - - image: gcr.io/kpt-fn/kubeval:v0.3 -``` - -You might want to label all resources in the package. To achieve that, you can -declare `set-labels` function in the `pipeline` section of `Kptfile`. Add this by running the following -command: - -```shell -cat >> Kptfile < kpt automates Kubernetes configuration editing. - -kpt supports management of [Configuration as Data](https://github.com/kptdev/kpt/blob/main/docs/design-docs/06-config-as-data.md). - -*Configuration as Data* is an approach to management of configuration which: - -* makes configuration data the source of truth, stored separately from the live - state -* uses a uniform, serializable data model to represent configuration -* separates code that acts on the configuration from the data and from packages - / bundles of the data -* abstracts configuration file structure and storage from operations that act - upon the configuration data; clients manipulating configuration data don’t - need to directly interact with storage (git, container images) - -This enables machine manipulation of configuration for Kubernetes and any infrastructure represented -in the [Kubernetes Resource Model (KRM)](https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/resource-management.md). - -kpt manages KRM resources in bundles called **packages**. - -Off-the-shelf packages are rarely deployed without any customization. Like [kustomize](https://kustomize.io), kpt applies transformation **functions**, using the same [KRM function specification](https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md), but optimizes for in-place configuration transformation rather than out-of-place transformation. - -Validation goes hand-in-hand with customization and kpt functions can be used to automate both mutation and validation of resources, similar to [Kubernetes admission control](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/). - -The kpt toolchain includes the following components: - -- [**kpt CLI**](https://kpt.dev/reference/cli/): The kpt CLI supports package and function operations, and also - deployment, via either direct apply or GitOps. By keeping an inventory of deployed resources, kpt enables resource pruning, - aggregated status and observability, and an improved preview experience. - -- **Function SDKs**: Any general-purpose or domain-specific language can be used to create functions to transform and/or validate - the YAML KRM input/output format, but we provide SDKs to simplify the function authoring process, in - [Go](https://kpt.dev/book/05-developing-functions/02-developing-in-Go), - [Typescript](https://kpt.dev/book/05-developing-functions/03-developing-in-Typescript), and - [Starlark](https://kpt.dev/book/05-developing-functions/04-developing-in-Starlark), a Python-like embedded language. - -- [**Function catalog**](https://catalog.kpt.dev/): A catalog of off-the-shelf, tested functions. kpt makes configuration - easy to create and transform, via reusable functions. Because they are expected to be used for in-place transformation, - the functions need to be idempotent. - -- [**Package orchestrator**](https://github.com/kptdev/kpt/blob/main/docs/design-docs/07-package-orchestration.md): - The package orchestrator enables the magic behind the unique WYSIWYG experience. It provides a control plane for creating, - modifying, updating, and deleting packages, and evaluating functions on package data. This enables operations on packaged resources - similar to operations directly on the live state through the Kubernetes API. - -- [**Config Sync**](https://cloud.google.com/anthos-config-management/docs/config-sync-overview): While the package orchestrator - can be used with any GitOps tool, Config Sync provides a reference GitOps implementation to complete the WYSIWYG management - experience and enable end-to-end development of new features, such as - [OCI-based packages](https://github.com/kptdev/kpt/issues/2300). Config Sync is also helping to drive improvements - in upstream Kubernetes. For instance, Config Sync is built on top of [git-sync](https://github.com/kubernetes/git-sync) and - leverages [Kustomize](https://kustomize.io) to automatically render manifests on the fly when needed. It uses the same apply - logic as the kpt CLI. - -- **Backstage UI plugin**: We've created a proof-of-concept UI to demonstrate the WYSIWYG experience that's possible on top of the - package orchestrator. More scenarios can be supported by implementing form-based editors for additional Kubernetes resource types. - diff --git a/site/book/02-concepts/01-packages.md b/site/book/02-concepts/01-packages.md deleted file mode 100644 index 0b30f4251c..0000000000 --- a/site/book/02-concepts/01-packages.md +++ /dev/null @@ -1,70 +0,0 @@ -A kpt package is a bundle of configuration _data_. It is represented as a -directory tree containing KRM resources using YAML as the file format. - -A package is explicitly declared using a file named `Kptfile` containing a KRM -resource of kind `Kptfile`. The Kptfile contains metadata about the package and -is just a regular resource in the YAML format. - -Just as directories can be nested, a package can contain another package, called -a _subpackage_. - -Let's take a look at the wordpress package as an example: - -```shell -$ kpt pkg get https://github.com/kptdev/kpt.git/package-examples/wordpress@v0.9 -``` - -View the package hierarchy using the `tree` command: - -```shell -$ kpt pkg tree wordpress/ -Package "wordpress" -├── [Kptfile] Kptfile wordpress -├── [service.yaml] Service wordpress -├── deployment -│   ├── [deployment.yaml] Deployment wordpress -│   └── [volume.yaml] PersistentVolumeClaim wp-pv-claim -└── Package "mysql" - ├── [Kptfile] Kptfile mysql - ├── [deployment.yaml] PersistentVolumeClaim mysql-pv-claim - ├── [deployment.yaml] Deployment wordpress-mysql - └── [deployment.yaml] Service wordpress-mysql -``` - -This _package hierarchy_ contains two packages: - -1. `wordpress` is the top-level package in the hierarchy declared using - `wordpress/Kptfile`. This package contains 2 subdirectories. - `wordpress/deployment` is a regular directory used for organizing resources - that belong to the `wordpress` package itself. The `wordpress` package - contains 3 direct resources in 3 files: `service.yaml`, - `deployment/deployment.yaml`, and `deployment/volume.yaml`. -2. `wordpress/mysql` is a subpackage of `wordpress` package since it contains a - `Kptfile`. This package contains 3 resources in - `wordpress/mysql/deployment.yaml` file. - -kpt uses Git as the underlying version control system. A typical workflow starts -by fetching an _upstream_ package from a Git repository to the local filesystem -using `kpt pkg` commands. All other functionality (i.e. `kpt fn` and `kpt live`) -use the package from the local filesystem, not the remote Git repository. You -may think of this as the _vendoring_ used by tooling for some programming -languages. The main difference is that kpt is designed to enable you to modify -the vendored package on the local filesystem and then later update the package -by merging the local and upstream changes. - -There is one scenario where a Kptfile is implicit: You can use kpt to fetch any -Git directory containing KRM resources, even if it does not contain a `Kptfile`. -Effectively, you are telling kpt to treat that Git directory as a package. kpt -automatically creates the `Kptfile` on the local filesystem to keep track of the -upstream repo. This means that kpt is compatible with large corpus of existing -Kubernetes configuration stored on Git today! - -For example, `cockroachdb` is just a vanilla directory of KRM: - -```shell -$ kpt pkg get https://github.com/kubernetes/examples/staging/cockroachdb -``` - -We will go into details of how to work with packages in [Chapter 3]. - -[chapter 3]: /book/03-packages/ diff --git a/site/book/02-concepts/02-workflows.md b/site/book/02-concepts/02-workflows.md deleted file mode 100644 index de0baaadfd..0000000000 --- a/site/book/02-concepts/02-workflows.md +++ /dev/null @@ -1,64 +0,0 @@ -In this section, we'll describe the typical workflows in kpt. We say "typical", because there is no -single right way of using kpt. A user may choose to use some command but not another. This -modularity is a key design principle. However, we still want to provide guidance on how the -functionality could be used in real-world scenarios. - -A workflow in kpt can be best modelled as performing some verbs on the noun _package_. -For example, when consuming an upstream package, the initial workflow can look like this: - -![img](/static/images/lifecycle/flow1.svg) - -- **Get**: Using `kpt pkg get` -- **Explore**: Using an editor or running commands such as `kpt pkg tree` -- **Edit**: Customize the package either manually or automatically using `kpt fn eval`. This may - involve editing the functions pipeline in the `Kptfile` which is executed - in the next stage. -- **Render**: Using `kpt fn render` - -First, you get a package from upstream. Then, you explore the content of the package to understand -it better. Then you typically want to customize the package for you specific needs. Finally, -you render the package which produces the final resources that can be directly applied to the -cluster. Render is a required step as it ensures certain preconditions and postconditions hold -true about the state of the package. - -This workflow is an iterative process. There is usually a tight Edit/Render loop in order to -produce the desired outcome. - -Some time later, you may want to update to a newer version of the upstream package: - -![img](/static/images/lifecycle/flow2.svg) - -- **Update**: Using `kpt pkg update` - -Updating the package involves merging your local changes with the changes made by the upstream -package authors between the two specified versions. This is a resource-based merge strategy, -and not a line-based merge strategy used by `git merge`. - -Instead of consuming an existing package, you can also create a package from scratch: - -![img](/static/images/lifecycle/flow5.svg) - -- **Create**: Initialize a directory using `kpt pkg init`. - -Now, let's say you have rendered the package, and want to deploy it to a cluster. The workflow -may look like this: - -![img](/static/images/lifecycle/flow3.svg) - -- **Initialize**: One-time process using `kpt live init` -- **Preview**: Using `kpt live apply --dry-run` -- **Apply**: Using `kpt live apply` -- **Observe**: Using `kpt live status` - -First, you use dry-run to validate the resources in your package and verify that the expected -resources will be applied and pruned. Then if that looks good, you apply the package. Afterwards, -you may observe the status of the package on the cluster. - -You typically want to store the package on Git: - -![img](/static/images/lifecycle/flow4.svg) - -- **Publish**: Using `git commit` - -The publishing flow is orthogonal to deployment flow. This allows you to act as a publisher of an -upstream package even though you may not deploy the package personally. diff --git a/site/book/02-concepts/03-functions.md b/site/book/02-concepts/03-functions.md deleted file mode 100644 index c1a9003830..0000000000 --- a/site/book/02-concepts/03-functions.md +++ /dev/null @@ -1,76 +0,0 @@ -A kpt function (also called a _KRM function_) is a containerized program that -can perform CRUD operations on KRM resources stored on the local filesystem. kpt -functions are the extensible mechanism to automate mutation and validation of -KRM resources. Some example use cases: - -- Enforce all `Namespace` resources to have a `cost-center` label. -- Add a label to resources based on some filtering criteria -- Use a `Team` custom resource to generate a `Namespace` and associated - organization-mandated defaults (e.g. `RBAC`, `ResourceQuota`, etc.) when - bootstrapping a new team -- Bulk transformation of all `PodSecurityPolicy` resources to improve the - security posture. -- Inject a sidecar container (service mesh, mysql proxy, logging) in a workload - resource (e.g. `Deployment`) - -Since functions are containerized, they can encapsulate different toolchains, -languages, and runtimes. For example, the function container image can -encapsulate: - -- A binary built using kpt's official Go or Typescript SDK -- Wrap an existing KRM tool such as `kubeval` -- Invoke a bash script performing low-level operations -- The interpreter for "executable configuration" such as `Starlark` or `Rego` - -To astute readers, this model will sound familiar: functions are the client-side -analog to Kubernetes controllers: - -| | Client-side | Server-side | -| ---------------- | ------------------------ | ----------------- | -| **Orchestrator** | kpt | Kubernetes | -| **Data** | YAML files on filesystem | resources on etcd | -| **Programs** | functions | controllers | - -Just as Kubernetes system orchestrates server-side containers, kpt CLI -orchestrates client-side containers operating on configuration. By standardizing -the input and output of the function containers, and how the containers are -executed, kpt can provide the following guarantees: - -- Functions are interoperable -- Functions can be chained together -- Functions are hermetic. For correctness, security and speed, it's desirable to - be able to run functions hermetically without any privileges; preventing - out-of-band access to the host filesystem and networking. - -We will discuss the KRM Functions Specification Standard in detail in Chapter 5. -At a high level, a function execution looks like this: - -![img](/static/images/func.svg) - -where: - -- `input items`: The input list of KRM resources to operate on. -- `output items`: The output list obtained from adding, removing, or modifying - items in the input. -- `functionConfig`: An optional meta resource containing the arguments to this - invocation of the function. -- `results`: An optional meta resource emitted by the function for observability - and debugging purposes. - -Naturally, functions can be chained together in a pipeline: - -![img](/static/images/pipeline.svg) - -There are two different CLI commands that execute functions corresponding to two -fundamentally different approaches: - -- `kpt fn render`: Executes the pipeline of functions declared in the package - and its subpackages. This is a declarative way to run functions. -- `kpt fn eval`: Executes a given function on the package. The image to run and - the `functionConfig` is specified as CLI argument. This is an imperative way - to run functions. Since the function is provided explicitly by the user, an - imperative invocation can be more privileged and low-level than an declarative - invocation. For example, it can have access to the host system. - -We will discuss how to run functions in Chapter 4 and how to develop functions -in Chapter 5. diff --git a/site/book/03-packages/00.md b/site/book/03-packages/00.md deleted file mode 100644 index cf2d6880de..0000000000 --- a/site/book/03-packages/00.md +++ /dev/null @@ -1,5 +0,0 @@ -[Chapter 2][ch2] provided a high-level conceptual explanation of a package and the package -lifecycle. This chapter will cover working with packages in detail: how to get, explore, edit, -update, and publish them. - -[ch2]: /book/02-concepts/01-packages diff --git a/site/book/03-packages/01-getting-a-package.md b/site/book/03-packages/01-getting-a-package.md deleted file mode 100644 index 5791e0756f..0000000000 --- a/site/book/03-packages/01-getting-a-package.md +++ /dev/null @@ -1,121 +0,0 @@ -Packaging in kpt is based on Git forking. Producers publish packages by -committing them to a Git repository. Consumers fork the package to use it. - -Let's revisit the Wordpress example: - -```shell -$ kpt pkg get https://github.com/kptdev/kpt.git/package-examples/wordpress@v0.9 -``` - -A package in a Git repo can be fetched by specifying a branch, tag, or commit -SHA. In this case, we are specifying tag `v0.9`. - -?> Refer to the [get command reference][get-doc] for usage. - -The `Kptfile` contains metadata about the origin of the forked package. Take a -look at the content of the `Kptfile` on your local filesystem: - -```yaml -# wordpress/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -upstream: - type: git - git: - repo: https://github.com/kptdev/kpt - directory: /package-examples/wordpress - ref: v0.9 - updateStrategy: resource-merge -upstreamLock: - type: git - git: - repo: https://github.com/kptdev/kpt - directory: /package-examples/wordpress - ref: package-examples/wordpress/v0.9 - commit: b9ea0bca019dafa9f9f91fd428385597c708518c -info: - emails: - - kpt-team@google.com - description: This is an example wordpress package with mysql subpackage. -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - app: wordpress - validators: - - image: gcr.io/kpt-fn/kubeval:v0.3 -``` - -The `Kptfile` contains two sections to keep track of the upstream package: - -1. The `upstream` section contains the user-specified Git reference to the - upstream package. This contains three pieces of information: - - `repo`: The Git repository where the package can be found - - `directory`: The directory within the Git repository where this package can - be found - - `ref`: The Git reference for the package. This can be either a branch, tag, - or commit SHA. -2. The `upstreamLock` section records the upstream Git reference (exact Git SHA) - that was fetched by kpt. This section is managed by kpt and should not be - changed manually. - -Now, let's look at the `Kptfile` for the `mysql` subpackage: - -```yaml -# wordpress/mysql/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: mysql -info: - emails: - - kpt-team@google.com - description: This is an example mysql package. -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - tier: mysql -``` - -As you can see, this `Kptfile` doesn't have the `upstream` and `upstreamLock` -sections. This is because there are two different package types in kpt: - -- **Independent package:** A package where the `Kptfile` has `upstream` defined. -- **Dependent package:** A package where the `Kptfile` doesn’t have `upstream` - defined. - -In this case, the `mysql` subpackage is a _dependent package_. The upstream -package for `mysql` is automatically inferred from the parent package. You can -think of the `Kptfile` in the `mysql` package as implicitly inheriting the -`upstream` section of its parent, with the only difference being that -`upstream.directory` in the subpackage would instead point to -`/package-examples/wordpress/mysql`. - -## Package Name and Identifier - -It is possible to specify a different local directory name to the `get` command. -For example, the following fetches the packages to a directory named -`mywordpress`: - -```shell -$ kpt pkg get https://github.com/kptdev/kpt.git/package-examples/wordpress@v0.9 mywordpress -``` - -The _name of a package_ is given by its directory name. Since the Kptfile is a -KRM resource and follows the familiar structure of KRM resources, the name of -the package is also available from the `metadata.name` field. This must always -be the name of the directory, and kpt will update it automatically when forking -a package. In this case, `metadata.name` is set to `mywordpress`. - -In general, the package name is not unique. The _unique identifier_ for a -package is defined as the relative path from the top package to the subpackage. -For example, we could have two subpackages with the name `mysql` having the -following identifiers: - -- `wordpress/backend/mysql` -- `wordpress/frontend/mysql` - -[get-doc]: /reference/cli/pkg/get/ diff --git a/site/book/03-packages/02-exploring-a-package.md b/site/book/03-packages/02-exploring-a-package.md deleted file mode 100644 index fabbb44c0f..0000000000 --- a/site/book/03-packages/02-exploring-a-package.md +++ /dev/null @@ -1,35 +0,0 @@ -After you fetch a package to your local filesystem, you typically want to -explore the package to understand how it is composed and how it can be -customized for your needs. Given a kpt package is just an ordinary directory of -human-readable YAML files, you can naturally use your favorite file explorer, -shell commands, or editor to explore the package. - -kpt also provides the `tree` command which is handy for quickly viewing package -hierarchy and the constituent packages, files, and resources: - -```shell -$ kpt pkg tree wordpress/ -Package "wordpress" -├── [Kptfile] Kptfile wordpress -├── [service.yaml] Service wordpress -├── deployment -│   ├── [deployment.yaml] Deployment wordpress -│   └── [volume.yaml] PersistentVolumeClaim wp-pv-claim -└── Package "mysql" - ├── [Kptfile] Kptfile mysql - ├── [deployment.yaml] PersistentVolumeClaim mysql-pv-claim - ├── [deployment.yaml] Deployment wordpress-mysql - └── [deployment.yaml] Service wordpress-mysql -``` - -?> Refer to the [tree command reference][tree-doc] for usage. - -In addition, you can use a kpt function such as `search-replace` to run a query -on the package. For example, to search for resources that have a field with path -`spec.selector.tier`: - -```shell -$ kpt fn eval wordpress -i search-replace:v0.1 -- 'by-path=spec.selector.tier' -``` - -[tree-doc]: /reference/cli/pkg/tree/ diff --git a/site/book/03-packages/03-editing-a-package.md b/site/book/03-packages/03-editing-a-package.md deleted file mode 100644 index e1fa0ca460..0000000000 --- a/site/book/03-packages/03-editing-a-package.md +++ /dev/null @@ -1,56 +0,0 @@ -kpt does not maintain any state on your local machine outside of the directory where you fetched the -package. Making changes to the package is accomplished by manipulating the local filesystem. At the -lowest-level, _editing_ a package is simply a process that either: - -- Changes the resources within that package. Examples: - - Authoring new a Deployment resource - - Customizing an existing Deployment resource - - Modifying the Kptfile -- Changes the package hierarchy, also called _package composition_. Examples: - - Adding a subpackage. - - Create a new dependent subpackage. - -At the end of the day, editing a package will result in a Git commit that fully specifies -the package. This process can be manual or automated depending on your use case. - -We will cover package composition later in this chapter. For now, let's focus on editing resources -_within_ a package. - -## Initialize the local repo - -Before you make any changes to package, you should first initialize and commit the pristine package: - -```shell -$ git init; git add .; git commit -m "Pristine wordpress package" -``` - -## Manual edits - -As mentioned earlier, you can manually edit or author KRM resources using your favorite editor. -Since every KRM resource has a known schema, you can take advantage of tooling that assists in -authoring and validating resource configuration. For example, [Cloud Code] extensions for VS Code -and IntelliJ provide IDE features such as auto-completion, inline documentation, linting, and snippets. - -For example, if you have VS Code installed, try modifying the resources in the `wordpress` package: - -```shell -$ code wordpress -``` - -## Automation - -Oftentimes, you want to automate repetitive or complex operations. Having standardized on KRM for -all resources in a package allows us to easily develop automation in different -toolchains and languages, as well as at levels of abstraction. - -For example, setting a label on all the resources in the `wordpress` package can be done -using the following function: - -```shell -$ kpt fn eval wordpress -i set-labels:v0.1 -- env=dev -``` - -[Chapter 4] discusses different ways of running functions in detail. - -[cloud code]: https://cloud.google.com/code -[chapter 4]: /book/04-using-functions/ diff --git a/site/book/03-packages/04-rendering-a-package.md b/site/book/03-packages/04-rendering-a-package.md deleted file mode 100644 index 900730dc7b..0000000000 --- a/site/book/03-packages/04-rendering-a-package.md +++ /dev/null @@ -1,23 +0,0 @@ -Regardless of how you have edited the package, you want to _render_ the package: - -```shell -$ kpt fn render wordpress -``` - -?> Refer to the [render command reference][render-doc] for usage. - -`render` is a critical step in the package lifecycle. At a high level, it -perform the following steps: - -1. Enforces package preconditions. For example, it validates the `Kptfile`. -2. Executes functions declared in the package hierarchy in a depth-first order. - By default, the packages are modified in-place. -3. Guarantees package postconditions. For example, it enforces a consistent - formatting of resources, even though a function (developed by different - people using different toolchains) may have modified the formatting in some - way. - -[Chapter 4] discusses different ways of running functions in detail. - -[render-doc]: /reference/cli/fn/render/ -[chapter 4]: /book/04-using-functions/ diff --git a/site/book/03-packages/05-updating-a-package.md b/site/book/03-packages/05-updating-a-package.md deleted file mode 100644 index b02360a7dd..0000000000 --- a/site/book/03-packages/05-updating-a-package.md +++ /dev/null @@ -1,70 +0,0 @@ -An independent package records the exact commit where the local fork and the -upstream package diverged. This enables kpt to fetch any update to the upstream -package and merge it with local changes. - -## Commit your local changes - -Before you update the package, you want to commit your local changes. - -First, to see the changes you've made to the fork of the upstream package: - -```shell -$ git diff -``` - -If you're happy with the changes, commit them: - -```shell -$ git add .; git commit -m "My changes" -``` - -## Update the package - -For example, you can update to version `v0.10` of the `wordpress` package: - -```shell -$ kpt pkg update wordpress@v0.10 -``` - -This is a porcelain for manually updating the `upstream` section in the -`Kptfile` : - -```yaml -upstream: - type: git - git: - repo: https://github.com/kptdev/kpt - directory: /package-examples/wordpress - # Change this from v0.9 to v0.10 - ref: v0.10 - updateStrategy: resource-merge -``` - -and then running: - -```shell -$ kpt pkg update wordpress -``` - -The `update` command updates the local `wordpress` package and the dependent -`mysql` package to the upstream version `v0.10` by doing a 3-way merge between: - -1. Original upstream commit -2. New upstream commit -3. Local (edited) package - -Several different strategies are available to handle the merge. By default, the -`resource-merge` strategy is used which performs a structural comparison of the -resource using OpenAPI schema. - -?> Refer to the [update command reference][update-doc] for usage. - -## Commit the updated resources - -Once you have successfully updated the package, commit the changes: - -```shell -$ git add .; git commit -m "Updated wordpress to v0.10" -``` - -[update-doc]: /reference/cli/pkg/update/ diff --git a/site/book/03-packages/06-creating-a-package.md b/site/book/03-packages/06-creating-a-package.md deleted file mode 100644 index 10e275f0e2..0000000000 --- a/site/book/03-packages/06-creating-a-package.md +++ /dev/null @@ -1,40 +0,0 @@ -Creating a new package is simple: create a new directory and [author resources]: - -```shell -$ mkdir awesomeapp -# Create resources in awesomeapp/ -``` - -For convenience, you can use `pkg init` command to create a minimal `Kptfile` -and `README` files: - -```shell -$ kpt pkg init awesomeapp -writing Kptfile -writing README.md -``` - -?> Refer to the [init command reference][init-doc] for usage. - -The `info` section of the `Kptfile` contains some optional package metadata you -may want to set. These fields are not consumed by any functionality in kpt: - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: awesomeapp -info: - description: Awesomeapp solves all the world's problems in half the time. - site: awesomeapp.example.com - emails: - - jack@example.com - - jill@example.com - license: Apache-2.0 - keywords: - - awesome-tech - - world-saver -``` - -[author resources]: /book/03-packages/03-editing-a-package -[init-doc]: /reference/cli/pkg/init/ diff --git a/site/book/03-packages/07-composing-a-package.md b/site/book/03-packages/07-composing-a-package.md deleted file mode 100644 index 5e33b92286..0000000000 --- a/site/book/03-packages/07-composing-a-package.md +++ /dev/null @@ -1,77 +0,0 @@ -A package can be _composed_ of subpackages (_HAS A_ relationship). _Package -composition_ is when you change the package hierarchy by adding or removing -subpackages. - -There are two different ways to add a subpackage to a package on the local -filesystem: - -1. [Create a new package] in a subdirectory -2. [Get an existing package] in a subdirectory - -Let's revisit the `wordpress` package and see how it was composed in the first -place. Currently, it has the following package hierarchy: - -```shell -$ kpt pkg tree wordpress/ -Package "wordpress" -├── [Kptfile] Kptfile wordpress -├── [service.yaml] Service wordpress -├── deployment -│   ├── [deployment.yaml] Deployment wordpress -│   └── [volume.yaml] PersistentVolumeClaim wp-pv-claim -└── Package "mysql" - ├── [Kptfile] Kptfile mysql - ├── [deployment.yaml] PersistentVolumeClaim mysql-pv-claim - ├── [deployment.yaml] Deployment wordpress-mysql - └── [deployment.yaml] Service wordpress-mysql -``` - -First, let's delete the `mysql` subpackage. Deleting a subpackage is done by -simply deleting the subdirectory: - -```shell -$ rm -r wordpress/mysql -``` - -We're going to add back the `mysql` subpackage using the two different -approaches: - -## Create a new package - -Create the directory: - -```shell -$ mkdir wordpress/mysql -``` - -Initialize the package: - -```shell -$ kpt pkg init wordpress/mysql -# author resources in mysql -``` - -This creates a [dependent package]. - -## Get an existing package - -Remove the existing directory if it exists: - -```shell -$ rm -rf wordpress/mysql -``` - -Fetch the package: - -```shell -$ kpt pkg get https://github.com/kubernetes/website.git/content/en/examples/application/mysql@snapshot-initial-v1.20 wordpress/mysql -``` - -This creates an [independent package]. If you wish to make this a dependent -package, you can delete the `upstream` and `upstreamLock` sections of the -`Kptfile` in `mysql` directory. - -[create a new package]: /book/03-packages/06-creating-a-package -[get an existing package]: /book/03-packages/01-getting-a-package -[dependent package]: /book/03-packages/01-getting-a-package -[independent package]: /book/03-packages/01-getting-a-package diff --git a/site/book/03-packages/08-publishing-a-package.md b/site/book/03-packages/08-publishing-a-package.md deleted file mode 100644 index 1cd2ddbf8a..0000000000 --- a/site/book/03-packages/08-publishing-a-package.md +++ /dev/null @@ -1,58 +0,0 @@ -A kpt package is published as a Git subdirectory containing KRM resources. -Publishing a package is just a normal Git push. This also means that any -existing Git directory of KRM resources is a valid kpt package. - -As an example, let's re-publish the local `wordpress` package to your own repo. - -Start by initializing the the `wordpress` directory as a Git repo if you haven't -already done so: - -```shell -$ cd wordpress; git init; git add .; git commit -m "My wordpress package" -``` - -Tag the commit: - -```shell -$ git tag v0.1 -``` - -Push the commit which requires you to have access to the repo: - -```shell -$ git push origin v0.1 -``` - -You can then fetch the published package: - -```shell -$ kpt pkg get /@v0.1 -``` - -## Monorepo Versioning - -You may have a Git repo containing multiple packages. kpt provides a tagging -convention to enable packages to be independently versioned. - -For example, let's assume the `wordpress` directory is not at the root of the -repo but instead is in the directory `packages/wordpress`. - -Tag the commit: - -```shell -$ git tag packages/wordpress/v0.1 -``` - -Push the commit: - -```shell -$ git push origin packages/wordpress/v0.1 -``` - -You can then fetch the published package: - -```shell -$ kpt pkg get /packages/wordpress@v0.1 -``` - -[tagging]: https://git-scm.com/book/en/v2/Git-Basics-Tagging diff --git a/site/book/04-using-functions/00.md b/site/book/04-using-functions/00.md deleted file mode 100644 index f6ed9be5f4..0000000000 --- a/site/book/04-using-functions/00.md +++ /dev/null @@ -1,5 +0,0 @@ -[Chapter 2][ch2] provided a high-level conceptual explanation of functions. We also saw examples of -how to use `fn eval` and `fn render` to execute functions. In this chapter, we will take a closer -look at how to execute functions using these two approaches. - -[ch2]: /book/02-concepts/03-functions diff --git a/site/book/04-using-functions/01-declarative-function-execution.md b/site/book/04-using-functions/01-declarative-function-execution.md deleted file mode 100644 index 9b629ed947..0000000000 --- a/site/book/04-using-functions/01-declarative-function-execution.md +++ /dev/null @@ -1,438 +0,0 @@ -In many real-world scenarios, it's not sufficient to only have packages of -static, fully-rendered resource configuration. You want the package to declare -both static data as well as operations that should be performed on current -resources and any resource that may be added in the future as you edit the -package. Example use cases: - -- Set the namespace on all namespace-scoped resources -- Always perform schema validation on resources in the package -- Always enforce a constraint policy on resources in the package -- Generate resources using a human-authored custom resource - -In kpt, this is achieved by declaring a pipeline of functions in the `Kptfile` -and executing all the pipelines in the package hierarchy in a depth-first order -using the `fn render` command. - -In our wordpress example, the top-level `wordpress` package declares this -pipeline: - -```yaml -# wordpress/Kptfile (Excerpt) -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - app: wordpress - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -This declares two functions: - -- `set-label` is a mutator function which adds a set of labels to resources. -- `kubeval` is a validator function which validates the resources against their - OpenAPI schema. - -?> Refer to the [Functions Catalog](https://catalog.kpt.dev/ ":target=_self") -for details on how to use a particular function. - -There are two differences between mutators and validators: - -1. Validators are not allowed to modify resources. -2. Validators are always executed after mutators. - -The `mysql` subpackage declares only a mutator function: - -```yaml -# wordpress/mysql/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: mysql -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - tier: mysql -``` - -Now, let's render the package hierarchy: - -```shell -$ kpt fn render wordpress -Package "wordpress/mysql": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" - -Package "wordpress": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" -[PASS] "gcr.io/kpt-fn/kubeval:v0.1" - -Successfully executed 3 function(s) in 2 package(s). -``` - -?> Refer to the [render command reference][render-doc] for usage. - -When you invoke the `render` command, kpt performs the following steps: - -1. Sequentially executes the list of mutators declared in the `mysql` package. - The input to the first function is the set of resources read from the - configuration files in the `mysql` package. The output of the first function - is the input of the second function and so on. -2. Similarly, executes all the validators declared in the `mysql` package. The - input to the first validator is the output of the last mutator. The output of - the last validator is the output of the pipeline in the `mysql` package. -3. Sequentially executes the list of mutators declared in the `wordpress` - package. The input to the first function is the union of: - - - Resources read from configuration files in the `wordpress` package AND - - Output of the pipeline from the `mysql` package (Step 2). - -4. Similarly, execute all the validators declared in the `wordpress` package. - The output of the last validator is the output of the pipeline in the - `wordpress` package. -5. Write the output of step 4 by modifying the local filesystem in-place. This - can change both `wordpress` and `mysql` packages. - -The end result is that: - -1. Resources in the `mysql` package are labelled with `tier: mysql`. -2. Resources in `mysql` and `wordpress` packages are labelled with - `app: wordpress`. -3. Resources in `mysql` and `wordpress` packages are validated against their - OpenAPI spec. - -If any of the functions in the pipeline fails for whatever reason, then the -entire pipeline is aborted and the local filesystem is left intact. - -## Specifying `function` - -### `image` - -The `image` field specifies the container image for the function. You can specify -an image from any container registry. If the registry is omitted, the default -container registry for functions catalog (`gcr.io/kpt-fn`) is prepended automatically. -For example, `set-labels:v0.1` is automatically expanded to `gcr.io/kpt-fn/set-labels:v0.1`. - -### `exec` - -The `exec` field specifies the executable command for the function. You can specify -an executable with arguments. - -Example below uses `sed` executable to replace all occurrences of `foo` with `bar` -in the package resources. - -```yaml -# PKG_DIR/Kptfile (Excerpt) -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: app -pipeline: - mutators: - - exec: "sed -e 's/foo/bar/'" -``` - -Note that you must render the package by allowing executables by specifying `--allow-exec` -command line flag as shown below. - -```shell -$ kpt fn render [PKG_DIR] --allow-exec -``` - -Using `exec` is not recommended for two reasons: - -- It makes the package non-portable since rendering the package requires the - executables to be present on the system. -- Executing binaries is not very secure since they can perform privileged operations - on the system. - -## Specifying `functionConfig` - -In [Chapter 2], we saw this conceptual representation of a function invocation: - -![img](/static/images/func.svg) - -`functionConfig` is an optional meta resource containing the arguments to a -particular invocation of the function. There are two different ways to declare -the `functionConfig`. - -### `configPath` - -The general way to provide a `functionConfig` of arbitrary kind (core or custom -resources), is to declare the resource in a separate file in the same directory -as the `Kptfile` and refer to it using the `configPath` field. - -For example: - -```yaml -# wordpress/mysql/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: mysql -pipeline: - mutators: - - image: set-labels:v0.1 - configPath: labels.yaml -``` - -```yaml -# wordpress/mysql/labels.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: labels -data: - tier: mysql -``` - -### `configMap` - -Many functions take a `functionConfig` of kind `ConfigMap` since they only need -simple key/value pairs as argument. For convenience, there is a way to inline -the key/value pairs in the `Kptfile`. - -The following is equivalent to what we showed before: - -```yaml -# wordpress/mysql/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: mysql -pipeline: - mutators: - - image: set-labels:v0.1 - configMap: - tier: mysql -``` - -## Specifying function `name` - -Functions can optionally be named using the `pipeline.mutators.name` -or `pipeline.validators.name` field to identify a function. - -For example: - -```yaml -# wordpress/mysql/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: mysql -pipeline: - mutators: - - name: set tier label - image: set-labels:v0.1 - configMap: - tier: mysql -``` - -Unique function names for all functions in the Kptfile function -pipeline is recommended. If `name` is specified, `kpt pkg update` -will merge each function pipeline list as an associative list, using -`name` as the merge key. An unspecified `name` or duplicated names may -result in unexpected merges. - -## Specifying `selectors` - -In some cases, you want to invoke the function only on a subset of resources based on a -selection criteria. This can be accomplished using selectors. At a high level, selectors -work as follows: - -![img](/static/images/func-target.svg) - -Resources that are selected are passed as input to the function. -Resources that are not selected are passed through unchanged. - -For example, let's add a function to the pipeline that adds an annotation to -resources with name `wordpress-mysql` only: - -```yaml -# wordpress/Kptfile (Excerpt) -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-annotations:v0.1 - configMap: - tier: mysql - selectors: - - name: wordpress-mysql - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - app: wordpress - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -When you invoke the render command, the `mysql` package is rendered first, and `set-annotations` -function is invoked only on the resources with name `wordpress-mysql`. Then, `set-label` -function is invoked on all the resources in the package hierarchy of `wordpress` package. - -```shell -$ kpt fn render wordpress -Package "wordpress/mysql": -[RUNNING] "gcr.io/kpt-fn/set-label:v0.1" -[PASS] "gcr.io/kpt-fn/set-label:v0.1" - -Package "wordpress": -[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1" on 3 resource(s) -[PASS] "gcr.io/kpt-fn/set-annotations:v0.1" -[RUNNING] "gcr.io/kpt-fn/set-label:v0.1" -[PASS] "gcr.io/kpt-fn/set-label:v0.1" -[RUNNING] "gcr.io/kpt-fn/kubeval:v0.1" -[PASS] "gcr.io/kpt-fn/kubeval:v0.1" - -Successfully executed 4 function(s) in 2 package(s). -``` - -As another example, let's add another function to the pipeline that adds a prefix to the name of a resource if: -- it has kind `Deployment` AND name `wordpress` - **OR** -- it has kind `Service` AND name `wordpress` - -```yaml -# wordpress/Kptfile (Excerpt) -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-annotations:v0.1 - configMap: - tier: mysql - selectors: - - name: wordpress-mysql - - image: gcr.io/kpt-fn/set-labels:v0.1 - configMap: - app: wordpress - - image: gcr.io/kpt-fn/ensure-name-substring:v0.1 - configMap: - prepend: dev- - selectors: - - kind: Deployment - name: wordpress - - kind: Service - name: wordpress - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -Now, let's render the package: - -```shell -kpt fn render wordpress -Package "wordpress/mysql": -[RUNNING] "gcr.io/kpt-fn/set-label:v0.1" -[PASS] "gcr.io/kpt-fn/set-label:v0.1" - -Package "wordpress": -[RUNNING] "gcr.io/kpt-fn/set-annotations:v0.1" on 3 resource(s) -[PASS] "gcr.io/kpt-fn/set-annotations:v0.1" -[RUNNING] "gcr.io/kpt-fn/set-label:v0.1" -[PASS] "gcr.io/kpt-fn/set-label:v0.1" -[RUNNING] "gcr.io/kpt-fn/ensure-name-substring:v0.1" on 2 resource(s) -[PASS] "gcr.io/kpt-fn/ensure-name-substring:v0.1" -[RUNNING] "gcr.io/kpt-fn/kubeval:v0.1" -[PASS] "gcr.io/kpt-fn/kubeval:v0.1" - -Successfully executed 5 function(s) in 2 package(s). -``` - -Note that the `ensure-name-substring` function is applied only to the -resources matching the selection criteria. - -If you have resources with particular labels or annotations that you want to use to -select your resources, you can do so. For example, here is a function that will only -be applied to resources matching the label `foo: bar`: - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-annotations:v0.1 - configMap: - tier: mysql - selectors: - - labels: - foo: bar - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -The following are the matchers you can specify in a selector: - -1. `apiVersion`: `apiVersion` field value of resources to be selected. -2. `kind`: `kind` field value of resources to be selected. -3. `name`: `metadata.name` field value of resources to be selected. -4. `namespace`: `metadata.namespace` field of resources to be selected. -5. `annotations`: resources with matching annotations will be selected. -6. `labels`: resources with matching labels will be selected. - -### Specifying exclusions - -Similar to `selectors`, you can also specify resources that should be excluded from functions. - -For example, you can exclude a resource if it has both kind "Deployment" and name "nginx": - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-annotations:v0.1 - configMap: - tier: mysql - exclude: - - kind: Deployment - name: nginx - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -This is distinct from the following, which excludes a resource if it has either kind "Deployment" or name "nginx": - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-annotations:v0.1 - configMap: - tier: mysql - exclude: - - kind: Deployment - - name: nginx - validators: - - image: gcr.io/kpt-fn/kubeval:v0.1 -``` - -The following are the matchers you can specify in an exclusion: - -1. `apiVersion`: `apiVersion` field value of resources to be excluded. -2. `kind`: `kind` field value of resources to be excluded. -3. `name`: `metadata.name` field value of resources to be excluded. -4. `namespace`: `metadata.namespace` field of resources to be excluded. -5. `annotations`: resources with matching annotations will be excluded. -6. `labels`: resources with matching labels will be excluded. - -[chapter 2]: /book/02-concepts/03-functions -[render-doc]: /reference/cli/fn/render/ -[Package identifier]: book/03-packages/01-getting-a-package?id=package-name-and-identifier diff --git a/site/book/04-using-functions/02-imperative-function-execution.md b/site/book/04-using-functions/02-imperative-function-execution.md deleted file mode 100644 index bd93c08f05..0000000000 --- a/site/book/04-using-functions/02-imperative-function-execution.md +++ /dev/null @@ -1,222 +0,0 @@ -The `fn eval` command enables you to execute a single function without declaring -it in the package. This is referred to as imperative function execution. - -For example, to set the namespace of all resources in the wordpress package -hierarchy: - -```shell -$ kpt fn eval wordpress --image gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress -``` - -Alternatively, for convenience, you can use the short-hand form of the above command: - -```shell -$ kpt fn eval wordpress -i set-namespace:v0.1 -- namespace=mywordpress -``` - -?> Refer to the [eval command reference][eval-doc] for usage. - -This changes the resources in the `wordpress` package and the `mysql` -subpackage. - -For comparison, this has the same effect as the following declaration: - -```yaml -# wordpress/Kptfile (Excerpt) -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: wordpress -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-namespace:v0.1 - configMap: - namespace: mywordpress -``` - -So when should you execute a function using `eval` instead of `render`? - -When you have one of these use cases: - -- Perform a one-time operation -- Execute a function from a CI/CD system on packages authored by other teams -- Develop shell scripts and chain functions with the Unix pipe (`|`) -- Execute the function with privilege (Not allowed by `render`) - -We will cover these topics in detail. - -## Specifying `functionConfig` - -There are two ways to specify the `functionConfig`. - -### `fn-config` flag - -The general way to provide a `functionConfig` of arbitrary kind (core or custom -resources), is to declare the resource in a separate file and use the -`fn-config` flag. - -```shell -$ cat << EOF > /tmp/fn-config.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: ns -data: - namespace: mywordpress -EOF -``` - -```shell -$ kpt fn eval wordpress -i set-namespace:v0.1 --fn-config /tmp/fn-config.yaml -``` - -### CLI arguments - -Many functions take a `functionConfig` of kind `ConfigMap` since they only need -simple key/value pairs as argument. For convenience, there is a way to provide -the key/value pairs as command line arguments. The following is equivalent to -what we showed previously: - -```shell -$ kpt fn eval wordpress -i set-namespace:v0.1 -- namespace=mywordpress -``` - -Note that the arguments must come after the separator `--`. - -## Specifying `selectors` - -Selectors can be used to target specific resources for a function execution. - -For example, you can selectively add an annotation to the resources if it has kind -`Deployment` AND name `wordpress`: - -```shell -$ kpt fn eval wordpress -i set-annotations:v0.1 --match-kind Deployment --match-name wordpress -- foo=bar -``` - -Here is the list of available selector matcher flags: - -1. `match-api-version` -2. `match-kind` -3. `match-name` -4. `match-namespace` -5. `match-annotations` -6. `match-labels` - -## Specifying `exclusions` - -Exclusions can be used to exclude specific resources for a function execution. - -For example, you can set the namespace of all resources in the wordpress package, -except for the ones with the label `foo: bar`: - -```shell -$ kpt fn eval wordpress -i set-namespace:v0.1 --exclude-labels foo=bar -- namespace=my-namespace -``` - -If you use multiple exclusions, it will exclude resources that match all provided exclusions. For -example, you can set the namespace of all resources, except for those that have both kind "Deployment" -and name "nginx": - -`$ kpt fn eval wordpress -i set-namespace:v0.1 --exclude-kind Deployment --exclude-name nginx -- namespace=my-namespace` - -Here is the list of available exclusion flags: - -1. `exclude-api-version` -2. `exclude-kind` -3. `exclude-name` -4. `exclude-namespace` -5. `exclude-annotations` -6. `exclude-labels` - -## Privileged Execution - -Since the function is provided explicitly by the user, `eval` can be more -privileged and low-level than a declarative invocation using `render`. For -example, it can have access to the host system. - -In general, we recommend against having functions that require privileged access -to the host since they can only be executed imperatively and pose a challenge in -terms of security, correctness, portability and speed. If at all possible, -functions should be executed hermetically with all required dependencies either -passed in as KRM resources (input items or functionConfig) or included in the -container image. However, there are some legitimate use cases where the only -available option requires either network access or mounting a volume from the -host. In those situations, you can use `eval` as described below. - -### Network Access - -By default, functions cannot access the network. You can enable network access -using the `--network` flag. - -For example, `kubeval` function can download a JSON schema file: - -```shell -$ kpt fn eval wordpress -i kubeval:v0.1 --network -- schema_location="https://kubernetesjsonschema.dev" -``` - -### Mounting Directories - -By default, functions cannot access the host file system. You can use the -`--mount` flag to mount host volumes. kpt accepts the same options to `--mount` -specified on the [Docker Volumes] page. - -For example, `kubeval` function can consume a JSON schema file: - -```shell -$ kpt fn eval -i kubeval:v0.1 --mount type=bind,src="/path/to/schema-dir",dst=/schema-dir --as-current-user wordpress -- schema_location=file:///schema-dir -``` - -Note that the `--as-current-user` flag may be required to run the function as -your uid instead of the default `nobody` to access the host filesystem. - -All volumes are mounted readonly by default. Specify `rw=true` to mount volumes -in read-write mode. - -``` ---mount type=bind,src="/path/to/schema-dir",dst=/schema-dir,rw=true -``` - -## Chaining functions using the Unix pipe - -As an alternative to declaring a pipeline in the `Kptfile`, you can chain -functions using the Unix pipe. - -Here is an example: - -```shell -$ kpt fn source wordpress \ - | kpt fn eval - -i set-namespace:v0.1 -- namespace=mywordpress \ - | kpt fn eval - -i set-labels:v0.1 -- app=wordpress env=prod \ - | kpt fn sink my-wordpress -``` - -?> Refer to the command reference for usage of [source][source-doc] and -[sink][sink-doc] commands. - -The following describes the above pipeline: - -1. The `source` command is used to read the resources in the package hierarchy - (`wordpress` and `mysql` packages). The output of the `source` command - follows the KRM Function Specification standard, which we are going to look - at in chapter 5. -2. The output of the `source` function is piped into the `set-namespace` - function. `eval` function is instructed to read inputs items from the `stdin` - using `-`. This is the convention used in all commands in kpt that can read - from `stdin`. The `set-namespace` function mutates the input items and emits - the output items. -3. The output of the `set-namespace` function is piped into `set-labels` - function which adds the given labels to all resources. -4. The `sink` command writes the output of `set-labels` to the filesystem. - -This is a low-level and less abstracted approach to executing functions. You can -instead write the output of the pipeline to a different directory instead of -mutating the directory in-place. You can also pipe to other programs (e.g. -`sed`, `yq`) that are not functions. Be mindful that the cost of this low-level -flexibility is not having benefits provided by functions: scalability, -reusability, and encapsulation. - -[eval-doc]: /reference/cli/fn/eval/ -[source-doc]: /reference/cli/fn/source/ -[sink-doc]: /reference/cli/fn/sink/ -[docker volumes]: https://docs.docker.com/storage/volumes/ diff --git a/site/book/04-using-functions/03-function-results.md b/site/book/04-using-functions/03-function-results.md deleted file mode 100644 index 71fabab899..0000000000 --- a/site/book/04-using-functions/03-function-results.md +++ /dev/null @@ -1,95 +0,0 @@ -In kpt, the counterpart to Unix philsophophy of "everything is a file" is "everything is a -Kubernetes resource". This also extends to the results of executing functions using `eval` or -`render`. In addition to providing a human-readable terminal output, these commands provide -structured results which can be consumed by other tools. This enables you to build robust UI layers -on top of kpt. For example: - -- Create a custom dashboard that shows the results returned by functions -- Annotate a GitHub Pull Request with results returned by a validator function at the granularity of individuals fields - -In both `render` and `eval`, structured results can be enabled using the `--results-dir` flag. - -For example: - -```shell -$ kpt fn render wordpress --results-dir /tmp -Package "wordpress/mysql": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" - -Package "wordpress": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" -[PASS] "gcr.io/kpt-fn/kubeval:v0.1" - -Successfully executed 3 function(s) in 2 package(s). -For complete results, see /tmp/results.yaml -``` - -The results are provided as resource of kind `FunctionResultList`: - -```yaml -# /tmp/results.yaml -apiVersion: kpt.dev/v1 -kind: FunctionResultList -metadata: - name: fnresults -exitCode: 0 -items: - - image: gcr.io/kpt-fn/set-labels:v0.1 - exitCode: 0 - - image: gcr.io/kpt-fn/set-labels:v0.1 - exitCode: 0 - - image: gcr.io/kpt-fn/kubeval:v0.1 - exitCode: 0 -``` - -Let's see a more interesting result where the `kubeval` function catches a validation issue. -For example, change the value of `port` field in `service.yaml` from `80` to `"80"` and -rerun: - -```shell -$ kpt fn render wordpress --results-dir /tmp -Package "wordpress/mysql": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" - -Package "wordpress": - -[PASS] "gcr.io/kpt-fn/set-labels:v0.1" -[FAIL] "gcr.io/kpt-fn/kubeval:v0.1" - Results: - [ERROR] Invalid type. Expected: integer, given: string in object "v1/Service/wordpress" in file "service.yaml" in field "spec.ports.0.port" - Exit code: 1 - -For complete results, see /tmp/results.yaml -``` - -The results resource will now contain failure details: - -```yaml -# /tmp/results.yaml -apiVersion: kpt.dev/v1 -kind: FunctionResultList -metadata: - name: fnresults -exitCode: 1 -items: - - image: gcr.io/kpt-fn/set-labels:v0.1 - exitCode: 0 - - image: gcr.io/kpt-fn/set-labels:v0.1 - exitCode: 0 - - image: gcr.io/kpt-fn/kubeval:v0.1 - exitCode: 1 - results: - - message: "Invalid type. Expected: integer, given: string" - severity: error - resourceRef: - apiVersion: v1 - kind: Service - name: wordpress - field: - path: spec.ports.0.port - file: - path: service.yaml -``` diff --git a/site/book/05-developing-functions/00.md b/site/book/05-developing-functions/00.md deleted file mode 100644 index 57bd2c2040..0000000000 --- a/site/book/05-developing-functions/00.md +++ /dev/null @@ -1,78 +0,0 @@ -[Chapter 2] provided a high-level conceptual explanation of functions. We -discussed how this architecture enables us to develop functions in different -languages, frameworks and runtimes. In this chapter, we are going to look at -different approaches to developing functions. - -?> Before you start developing your custom function, check out the -[Functions Catalog](https://catalog.kpt.dev/ ":target=_self") in case there is -an existing function that meets your needs. This is an ever-growing catalog of -functions that we consider to be generally useful to many users. If your use -case fits that description, please [open a feature request][fr] for adding a -function to the catalog. - -## Approaches - -### Creating Custom Images - -With this approach you create a custom container image which can execute -programs in an arbitrary language or encapsulate existing tools as long as it -satisfies the KRM Functions Specification we will see later in this chapter. - -To simplify development, we provide frameworks for developing functions in Go -and Typescript. We will cover these later in this chapter. - -### Authoring Executable Configuration - -Instead of developing a custom image, you can use an existing function image -containing a language interpreter, and provide your business logic in a KRM -resource. This is referred to as _executable configuration_. We will see two -examples of executable configuration pattern in this chapter. - -Although using executable configuration saves some time initially, it can become -an anti-pattern if it grows in complexity. We recommend limiting their use to: - -- Small amount of logic (< 20 lines) -- You do not forsee this logic growing in complexity in the future - -Otherwise, you are better off developing functions in a general-purpose language -where you can take advantage of proper abstractions and language features, -better testing, rich IDE experience, and existing libraries. - -## Function Properties - -As you think about how to formulate your function, keep in mind the following -desired properties: - -### Deterministic - -Executing a function with the same input should produce the same output. For -example, a function that annotates a resource with the current timestamp is not -deterministic. - -Note that input to the function includes both `input items` and the -`functionConfig`: - -![img](/static/images/func.svg) - -### Idempotent - -Executing a function a second time should not produce any change. For example, a -function that increments value of the `replicas` field by 1 is not idempotent. -Instead, the function could take the desired value of the `replicas` field as -input. - -This property enables in-place edits to work and is analogous to the -level-driven reconciliation model of the Kubernetes system. - -### Hermetic and Unprivileged - -If possible, try to formulate your function to be hermetic. We discussed this in -detail in [chapter 4]. - -[chapter 2]: /book/02-concepts/03-functions -[chapter 4]: - /book/04-using-functions/02-imperative-function-execution?id=privileged-execution -[fr]: - https://github.com/kptdev/kpt/issues/new?assignees=&labels=enhancement&template=feature_request.md&title= -[functions specification]: - /book/05-developing-functions/01-functions-specification diff --git a/site/book/05-developing-functions/01-functions-specification.md b/site/book/05-developing-functions/01-functions-specification.md deleted file mode 100644 index 9172f9eb7c..0000000000 --- a/site/book/05-developing-functions/01-functions-specification.md +++ /dev/null @@ -1,19 +0,0 @@ -In order to enable functions to be developed in different toolchains and -languages and be interoperable and backwards compatible, the kpt project created -a standard for the inter-process communication between the orchestrator (i.e. -kpt CLI) and functions. This standard was published as [KRM Functions Specification][spec] -and donated to the CNCF as part of the Kubernetes SIG-CLI. - -Understanding this specification enables you to have a deeper understanding of -how things work under the hood. It also enables to create your own toolchain for -function development if you so desire. - -As an example, you can see the `ResourceList` containing resources in the -`wordpress` package: - -```shell -$ kpt fn source wordpress | less -``` - -[spec]: - https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md#krm-functions-specification diff --git a/site/book/05-developing-functions/02-developing-in-Go.md b/site/book/05-developing-functions/02-developing-in-Go.md deleted file mode 100644 index f3ed6fd2b7..0000000000 --- a/site/book/05-developing-functions/02-developing-in-Go.md +++ /dev/null @@ -1,163 +0,0 @@ -You can develop a KRM function in Go using [the kpt function SDK]. - -- **General-purpose language:** Compared to Domain Specific Languages (DSL), Go - is a general-purpose programming language that provides: - - Proper abstractions and language features - - An extensive ecosystem of tooling (e.g. IDE support) - - A comprehensive catalog of well-supported libraries - - Robust community support and detailed documentation - -## Prerequisites - -- [Install kpt](https://kpt.dev/installation/) - -- [Install Docker](https://docs.docker.com/get-docker/) - -- [Golang](https://go.dev/dl/) (at least version 1.19) - -## Quickstart - -In this quickstart, we will write a function that adds an annotation -`config.kubernetes.io/managed-by=kpt` to all `Deployment` resources. - -### Initialize your project - -We start from a "get-started" package which contains a `main.go` file with some scaffolding code. - -```shell -# Set your KRM function name. -export FUNCTION_NAME=set-annotation - -# Get the "get-started" package. -kpt pkg get https://github.com/kptdev/krm-functions-sdk.git/go/get-started@master ${FUNCTION_NAME} - -cd ${FUNCTION_NAME} - -# Initialize the Go module -go mod init -go mod tidy -``` - -### Write the KRM function logic - -Take a look at the `main.go` (as below) and complete the `Run` function. - -```go -// Copyright 2022 The kpt Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "context" - "os" - - "github.com/kptdev/krm-functions-sdk/go/fn" -) - -var _ fn.Runner = &YourFunction{} - -// TODO: Change to your functionConfig "Kind" name. -type YourFunction struct { - FnConfigBool bool - FnConfigInt int - FnConfigFoo string -} - -// Run is the main function logic. -// `items` is parsed from the STDIN "ResourceList.Items". -// `functionConfig` is from the STDIN "ResourceList.FunctionConfig". The value has been assigned to the r attributes -// `results` is the "ResourceList.Results" that you can write result info to. -func (r *YourFunction) Run(ctx *fn.Context, functionConfig *fn.KubeObject, items fn.KubeObjects, results *fn.Results) bool { - // TODO: Write your code. - return true -} - -func main() { - runner := fn.WithContext(context.Background(), &YourFunction{}) - if err := fn.AsMain(runner); err != nil { - os.Exit(1) - } -} -``` - -The [`fn`] library provides a series of KRM level operations for [`ResourceList`]. -Basically, the KRM resource `ResourceList.FunctionConfig` and KRM resources `ResourceList.Items` are both converted to -`KubeObject` objects. You can use `KubeObject` similar as [`unstructured.Unstructured`]. - -The set-annotation function (see below) iterates the `ResourceList.Items`, finds out the `Deployment` resources and -adds the annotation. After the iteration, it adds some user message to the `ResourceList.Results` - -```go -func (r *YourFunction) Run(ctx *fn.Context, functionConfig *fn.KubeObject, items fn.KubeObjects, results *fn.Results) bool { - for _, kubeObject := range items { - if kubeObject.IsGVK("apps", "v1", "Deployment") { - kubeObject.SetAnnotation("config.kubernetes.io/managed-by", "kpt") - } - } - // This result message will be displayed in the function evaluation time. - *results = append(*results, fn.GeneralResult("Add config.kubernetes.io/managed-by=kpt to all `Deployment` resources", fn.Info)) - return true -} -``` - -Learn more about the `KubeObject` from the [go doc](https://pkg.go.dev/github.com/kptdev/krm-functions-sdk/go/fn). - - -### Test the KRM function - -The "get-started" package contains a `./testdata` directory. You can use this to test out your functions. - -```shell -# Edit the `testdata/test1/resources.yaml` with your KRM resources. -# resources.yaml already has a `Deployment` and `Service` as test data. -vim testdata/test1/resources.yaml - -# Convert the KRM resources and FunctionConfig resource to `ResourceList`, and -# then pipe the ResourceList as StdIn to your function -kpt fn source testdata | go run main.go - -# Verify the KRM function behavior in the StdOutput `ResourceList` -``` - -### Build the KRM function as a Docker image - -Build the image - -The "get-started" package provides the `Dockerfile` that you can download using: -```shell -wget https://raw.githubusercontent.com/kptdev/krm-functions-sdk/master/go/kfn/commands/embed/Dockerfile -``` - -```shell -export FN_CONTAINER_REGISTRY= -export TAG= -docker build . -t ${FN_CONTAINER_REGISTRY}/${FUNCTION_NAME}:${TAG} -``` - -To verify the image using the same `./testdata` resources -```shell -kpt fn eval ./testdata/test1/resources.yaml --image ${FN_CONTAINER_REGISTRY}/${FUNCTION_NAME}:${TAG} -``` - -## Next Steps - -- See other [go doc examples] to use KubeObject. -- To contribute to KRM catalog functions, please follow the [contributor guide](https://github.com/kptdev/krm-functions-catalog/blob/master/CONTRIBUTING.md) - -[the kpt function SDK]: https://pkg.go.dev/github.com/kptdev/krm-functions-sdk/go/fn -[go doc examples]: https://pkg.go.dev/github.com/kptdev/krm-functions-sdk/go/fn/examples -[`fn`]: https://pkg.go.dev/github.com/kptdev/krm-functions-sdk/go/fn -[`ResourceList`]: https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md -[`unstructured.Unstructured`]: https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured diff --git a/site/book/05-developing-functions/03-developing-in-Typescript.md b/site/book/05-developing-functions/03-developing-in-Typescript.md deleted file mode 100644 index c18f8b8313..0000000000 --- a/site/book/05-developing-functions/03-developing-in-Typescript.md +++ /dev/null @@ -1,247 +0,0 @@ -kpt project provides an opinionated Typescript SDK for implementing functions. -It provides the following features: - -- **General-purpose language:** Similar to Go, Typescript is a general-purpose - programming language that provides: - - Proper abstractions and language features - - An extensive ecosystem of tooling (e.g. IDE support) - - A comprehensive catalog of well-supported libraries - - Robust community support and detailed documentation -- **Idiomatic:** The TS SDK provides a different level of abstraction compared - to the Go library we saw previously. Instead of exposing the low-level YAML - AST, resources are marshalled into native Typescript objects. As a result, you - get a more idiomatic and high-level abstraction. Ideally, you should work with - native data structure/object in each language and not think about YAML which - is just a file format. Even though resources in configuration files are - round-tripped to Typescript objects, the kpt orchestrator ensures that - YAML-specific constructs such as comments are preserved. The obvious - limitation of this high-level abstraction is that you cannot develop functions - for manipulating YAML-specific constructs like comments. -- **Type-safety:** Kubernetes configuration is typed, and its schema is defined - using the OpenAPI spec. Typescript has a sophisticated type system that - accommodates the complexity of Kubernetes resources. The TS SDK enables - generating Typescript classes for core and CRD types. -- **Batteries-included:** The TS SDK provides a simple, powerful API for - querying and manipulating resources inspired by [document-oriented databases]. - It provides the scaffolding required to develop, build, test, and publish - functions, allowing you to focus on implementing your business-logic. - -## Quickstart - -This quickstart will get you started developing a kpt function with the TS SDK. - -### System Requirements - -Currently supported platforms: amd64 Linux/Mac - -- Install [kpt][download-kpt] and its dependencies -- Install [node][download-node] - - The SDK requires `npm` version 6 or higher. - - If installing node from binaries (i.e. without a package manager), follow - these [installation instructions][install-node]. - -### Explore the Demo Functions Package - -1. Get the `demo-functions` package: - - ```shell - $ git clone --depth 1 https://github.com/kptdev/krm-functions-sdk.git - ``` - - All subsequent commands are run from the `demo-functions` directory: - - ```shell - $ cd kpt-functions-sdk/ts/demo-functions - ``` - -1. Install all dependencies: - - ```shell - $ npm install - ``` - -1. Run the following in a separate terminal to continuously build your function - as you make changes: - - ```shell - $ npm run watch - ``` - -1. Explore the [`label_namespace`][label-namespace] transformer function. This - function takes a given `label_name` and `label_value` to add the appropriate - label to `Namespace` objects using the SDK's `addLabel` function. - - ```typescript - import { addLabel, Configs } from "kpt-functions"; - import { isNamespace } from "./gen/io.k8s.api.core.v1"; - - export const LABEL_NAME = "label_name"; - export const LABEL_VALUE = "label_value"; - - export async function labelNamespace(configs: Configs) { - const labelName = configs.getFunctionConfigValueOrThrow(LABEL_NAME); - const labelValue = configs.getFunctionConfigValueOrThrow(LABEL_VALUE); - configs - .get(isNamespace) - .forEach((n) => addLabel(n, labelName, labelValue)); - } - ``` - -1. Run the `label_namespace` function on the `example-configs` directory: - - ```shell - $ export CONFIGS=../../example-configs - ``` - - ```shell - $ kpt fn eval $CONFIGS --exec "node dist/label_namespace_run.js" -- label_name=color label_value=orange - ``` - - As the name suggests, this function added the given label to all `Namespace` - objects in the `example-configs` directory: - - ```shell - $ git diff $CONFIGS - ``` - -1. Try modifying the function in `src/label_namespace.ts` to perform other - operations and rerun the function on `example-configs` to see the changes. - -1. Explore validation functions like [validate-rolebinding]. Instead of - transforming configuration, this function searches RoleBindings and returns a - results field containing details about invalid subject names. - - ```typescript - import { Configs, kubernetesObjectResult } from "kpt-functions"; - import { isRoleBinding } from "./gen/io.k8s.api.rbac.v1"; - - const SUBJECT_NAME = "subject_name"; - - export async function validateRolebinding(configs: Configs) { - // Get the subject name parameter. - const subjectName = configs.getFunctionConfigValueOrThrow(SUBJECT_NAME); - - // Iterate over all RoleBinding objects in the input - // Filter those that have a subject we're looking for. - const results = configs - .get(isRoleBinding) - .filter( - (rb) => - rb && rb.subjects && rb.subjects.find((s) => s.name === subjectName) - ) - .map((rb) => - kubernetesObjectResult(`Found banned subject '${subjectName}'`, rb) - ); - - configs.addResults(...results); - } - ``` - -1. Run `validate-rolebinding` on `example-configs`. - - ```shell - $ kpt fn eval $CONFIGS --exec "node dist/validate_rolebinding_run.js" -- subject_name=alice@foo-corp.com - ``` - - Look at the changes made by the function: - - ```shell - $ git diff $CONFIGS - ``` - -1. Explore generator functions like [expand-team-cr]. This function generates a - per-environment Namespace and RoleBinding object for each custom resource - (CR) of type Team. - - ```typescript - import { Configs } from "kpt-functions"; - import { isTeam, Team } from "./gen/dev.cft.anthos.v1alpha1"; - import { Namespace } from "./gen/io.k8s.api.core.v1"; - import { RoleBinding, Subject } from "./gen/io.k8s.api.rbac.v1"; - - const ENVIRONMENTS = ["dev", "prod"]; - - export async function expandTeamCr(configs: Configs) { - // For each 'Team' custom resource in the input: - // 1. Generate a per-enviroment Namespace. - // 2. Generate RoleBindings in each Namespace. - configs.get(isTeam).forEach((team) => { - const name = team.metadata.name; - - ENVIRONMENTS.forEach((suffix) => { - const ns = `${name}-${suffix}`; - configs.insert(Namespace.named(ns)); - configs.insert(...createRoleBindings(team, ns)); - }); - }); - } - - function createRoleBindings(team: Team, namespace: string): RoleBinding[] { - return (team.spec.roles || []).map((item) => { - return new RoleBinding({ - metadata: { - name: item.role, - namespace, - }, - subjects: roleSubjects(item), - roleRef: { - kind: "ClusterRole", - name: item.role, - apiGroup: "rbac.authorization.k8s.io", - }, - }); - }); - } - - function roleSubjects(item: Team.Spec.Item): Subject[] { - const userSubjects: Subject[] = (item.users || []).map( - (user) => - new Subject({ - kind: "User", - name: user, - }) - ); - const groupSubjects: Subject[] = (item.groups || []).map( - (group) => - new Subject({ - kind: "Group", - name: group, - }) - ); - return userSubjects.concat(groupSubjects); - } - ``` - -1. Run `expand-team-cr` on `example-configs`. - - ```shell - $ kpt fn eval $CONFIGS --exec "node dist/expand_team_cr_run.js" - ``` - - Look at the changes made by the function: - - ```shell - $ git diff $CONFIGS - ``` - -## Next Steps - -- Read the complete [Typescript SDK Developer Guide]. -- Take a look at these [example functions] to better understand how to use the - TS SDK. - -[download-kpt]: /book/01-getting-started/01-system-requirements -[download-node]: https://nodejs.org/en/download/ -[install-node]: https://github.com/nodejs/help/wiki/Installation/ -[ts sdk api]: https://kptdev.github.io/krm-functions-sdk/api/ -[label-namespace]: - https://github.com/kptdev/krm-functions-sdk/blob/master/ts/demo-functions/src/label_namespace.ts -[validate-rolebinding]: - https://github.com/kptdev/krm-functions-sdk/blob/master/ts/demo-functions/src/validate_rolebinding.ts -[expand-team-cr]: - https://github.com/kptdev/krm-functions-sdk/blob/master/ts/demo-functions/src/expand_team_cr.ts -[example functions]: - https://github.com/kptdev/krm-functions-sdk/tree/master/ts/demo-functions/src/ -[document-oriented databases]: - https://en.wikipedia.org/wiki/Document-oriented_database -[typescript sdk developer guide]: /sdk/ts-guide diff --git a/site/book/05-developing-functions/04-developing-in-Starlark.md b/site/book/05-developing-functions/04-developing-in-Starlark.md deleted file mode 100644 index 2acdcafe27..0000000000 --- a/site/book/05-developing-functions/04-developing-in-Starlark.md +++ /dev/null @@ -1,58 +0,0 @@ -You can write the function in Starlark script. - -?> Starlark SDK is in *experimental* stage. - -[Starlark] is a python-like language designed for use in configuration files that has several desirable properties: -* deterministic evaluation -* hermetic execution -* simplicity. - -Current Starlark SDK is driven by [`gcr.io/kpt-fn/starlark:v0.4`] which contains the interpreter and accepts -a `StarlarkRun` object as its `FunctionConfig`. You should place your starlark script in the `source` field -of the `StarlarkRun` object. - -## Quickstart - -Let's write a starlark function which add annotation "managed-by=kpt" only to `Deployment` resources. - -### Get the "get-started" example - -```shell -kpt pkg get https://github.com/kptdev/krm-functions-sdk.git/starlark/get-started@master set-annotation -cd set-annotation -``` - -### Update the `FunctionConfig` -```yaml -# starlark-fn-config.yaml -apiVersion: fn.kpt.dev/v1alpha1 -kind: StarlarkRun -metadata: - name: set-annotation -# EDIT THE SOURCE! -# This should be your starlark script which preloads the `ResourceList` to `ctx.resource_list` -source: | - for resource in ctx.resource_list["items"]: - if resource.get("kind") == "Deployment": - resource["metadata"]["annotations"]["managed-by"] = "kpt" -``` -In the `source` field, the `ResourceList` from STDIN is loaded to `ctx.resource_list` as a dict. -You can manipulate KRM resource as operating on a dict. - -### Test and Run - -Run the starlark script via `kpt` -```shell -# `starlark:v0.4` is the short form of gcr.io/kpt-fn/starlark:v0.4 catalog function. -kpt fn eval ./data --image starlark:v0.4 --fn-config starlark-fn-config.yaml - -# Verify that the annotation is added to the `Deployment` resource and the other resource `Service` -# does not have this annotation. -cat ./data/resources.yaml | grep annotations -A1 -B5 -``` - -?> Refer to the [Functions Catalog](https://catalog.kpt.dev/starlark/v0.4/) for -details on how to use this function. - -[`gcr.io/kpt-fn/starlark:v0.4`]: https://catalog.kpt.dev/starlark/v0.4/ -[Starlark]: https://github.com/bazelbuild/starlark#starlark \ No newline at end of file diff --git a/site/book/06-deploying-packages/00.md b/site/book/06-deploying-packages/00.md deleted file mode 100644 index cff3820f7e..0000000000 --- a/site/book/06-deploying-packages/00.md +++ /dev/null @@ -1,82 +0,0 @@ -In this chapter of this book, we are going to cover how you deploy a kpt -package to a Kubernetes cluster and how the cluster state is managed as the -package evolves over time. - -We use `kpt live apply` instead `kubectl apply` since it provides some critical -functionality not provided by the latter: pruning and reconcile status. To -enable this functionality, we need a cluster-side mechanism for grouping and -tracking resources belonging to a package. This cluster-side grouping is -implemented using a custom resource of kind `ResourceGroup`. Otherwise, -`kpt live` and `kubectl` are complementary. For example, you can use -`kubectl get` as you normal would. - -`kpt` packages can also be deployed with [GitOps](gitops/) tools. - -## Pruning - -`live apply` will automatically delete cluster resources that are no longer -present in the local package. This clean-up functionality is called pruning. - -For example, consider a package which has been applied with the following three -resources: - -``` -service-1 (Service) -deployment-1 (Deployment) -config-map-1 (ConfigMap) -``` - -Then imagine the package is updated to contain the following resources: - -``` -service-1 (Service) -deployment-1 (Deployment) -config-map-2 (ConfigMap) -``` - -When the updated package is applied, `config-map-1` is automatically deleted -from the cluster. - -## Reconcile Status - -Kubernetes is based on an asynchronous reconciliation model. When you apply a -resource to a cluster, you actually care about two different things: - -- Did the resource apply successfully (synchronous)? -- Did the resource reconcile successfully (asynchronous)? - -This is referred to as _apply status_ and _reconcile status_ respectively: - -![img](/static/images/status.svg) - -The `live apply` command computes the reconcile status. An example of this could -be applying a `Deployment`. Without computing reconcile status, the operation -would be reported as successful as soon as the resource has been created in the -API server. With reconcile status, `live apply` will wait until the desired -number of pods have been created and become available. - -For core kubernetes types, reconcile status is computed using hardcoded rules. -For CRDs, the status computation is based on recommended [convention for status -fields] that needs to be followed by custom resource publishers. If CRDs follow -these conventions, `live apply` will be able to correctly compute status. `kpt` also -has special rules for computing status for [Config Connector resources]. - -Usually multiple resources are being applied together, and we want to know -when all of those resources have been successfully reconciled. `live apply` computes -the aggregate status and will wait until either they are all reconciled, the timeout -expires, or all the remaining unreconciled resources have reached a state where they -are unlikely to successfully reconcile. An example of the latter for `Deployment` -resources is when the progress deadline is exceeded. - -## Dependency ordering - -Sometimes resources must be applied in a specific order. For example, -an application might require that a database is available when it starts. -`kpt live` lets users express these constraints on resources, and use them -to make sure a resource has been successfully applied and reconciled before -any resources that depend on it are applied. - - - -[convention for status fields]: /reference/schema/crd-status-convention/ -[Config Connector resources]: /reference/schema/config-connector-status-convention/ diff --git a/site/book/06-deploying-packages/01-initializing-a-package-for-apply.md b/site/book/06-deploying-packages/01-initializing-a-package-for-apply.md deleted file mode 100644 index 28e85ecdb3..0000000000 --- a/site/book/06-deploying-packages/01-initializing-a-package-for-apply.md +++ /dev/null @@ -1,38 +0,0 @@ -Before you can apply the package to the cluster, it needs to be initialized -using `live init`. This is a one-time client-side operation that adds metadata -to the `ResourceGroup` CR (by default located in `resourcegroup.yaml` file) -specifying the name, namespace and inventoryID of the `ResourceGroup` resource -`live apply` command will use to store the inventory (list of the resources applied). - -Let's initialize the `wordpress` package: - -```shell -$ kpt live init wordpress -initializing "resourcegroup.yaml" inventory info (namespace: default)...success -``` - -This creates the `ResourceGroup` CR in the `resourcegroup.yaml` file: - -```yaml -apiVersion: kpt.dev/v1alpha1 -kind: ResourceGroup -metadata: - name: inventory-74096247 - namespace: default - labels: - cli-utils.sigs.k8s.io/inventory-id: 0a32e2c0200b4bd4c19cd3e097086b4648b8902d-1653113657067255815 -``` - -`ResourceGroup` is a namespace-scoped resource. By default, `live init` command -uses heuristics to automatically choose the namespace. In this example, all the -resources in `wordpress` package were in the `default` namespace, so it chose -`default` for the namespace. Alternatively, you can manually configure the name -and namespace of the `ResourceGroup` resource. - -?> Refer to the [init command reference][init-doc] for usage. - -!> Once a package is applied to the cluster, you do not want to change the -`ResourceGroup` CR; doing so severs the association between the -package and the inventory in the cluster, leading to destructive operations. - -[init-doc]: /reference/cli/live/init/ diff --git a/site/book/06-deploying-packages/02-applying-a-package.md b/site/book/06-deploying-packages/02-applying-a-package.md deleted file mode 100644 index f09762795e..0000000000 --- a/site/book/06-deploying-packages/02-applying-a-package.md +++ /dev/null @@ -1,136 +0,0 @@ -Once you have initialized the package, you can deploy it using `live apply`. - -The `wordpress` package requires a `Secret` containing the mysql password. -Let's create that first: - -```shell -$ kubectl create secret generic mysql-pass --from-literal=password=YOUR_PASSWORD -``` - -!> You can also declare the `Secret` resource, but make sure it is not committed to -Git as part of the package. - -Then deploy the package and wait for the resources to be reconciled: - -```shell -$ kpt live apply wordpress --reconcile-timeout=2m -installing inventory ResourceGroup CRD. -service/wordpress created -service/wordpress-mysql created -deployment.apps/wordpress created -deployment.apps/wordpress-mysql created -persistentvolumeclaim/mysql-pv-claim created -persistentvolumeclaim/wp-pv-claim created -6 resource(s) applied. 6 created, 0 unchanged, 0 configured, 0 failed -service/wordpress reconcile pending -service/wordpress-mysql reconcile pending -deployment.apps/wordpress reconcile pending -deployment.apps/wordpress-mysql reconcile pending -persistentvolumeclaim/mysql-pv-claim reconcile pending -persistentvolumeclaim/wp-pv-claim reconcile pending -service/wordpress reconciled -service/wordpress-mysql reconciled -persistentvolumeclaim/mysql-pv-claim reconciled -persistentvolumeclaim/wp-pv-claim reconciled -deployment.apps/wordpress-mysql reconciled -deployment.apps/wordpress reconciled -6 resource(s) reconciled, 0 skipped, 0 failed to reconcile, 0 timed out -``` - -?> Refer to the [apply command reference][apply-doc] for usage. - -## `ResourceGroup` CRD - -By default, `live apply` automatically installs the `ResourceGroup` CRD (unless -`--dry-run` is specified) since it needs to create the associated -`ResourceGroup` custom resource. You can also manually install the CRD before -running `live apply`: - -```shell -$ kpt live install-resource-group -``` - -?> Installing this CRD requires sufficient ClusterRole permission, so you may -need to ask your cluster admin to install it for you. - -## Server-side vs Client-side apply - -By default, `live apply` command uses client-side apply. The updates are -accomplished by calculating and sending a patch from the client. Server-side -apply, which can be enabled with the `--server-side` flag, sends the entire -resource to the server for the update. - -## Dry-run - -You can use the `--dry-run` flag to get break down of operations that will be -performed when applying the package. - -For example, before applying the `wordpresss` package for the first time, you -would see that 6 resources would be created: - -```shell -$ kpt live apply wordpress --dry-run -Dry-run strategy: client -service/wordpress created -service/wordpress-mysql created -deployment.apps/wordpress created -deployment.apps/wordpress-mysql created -persistentvolumeclaim/mysql-pv-claim created -persistentvolumeclaim/wp-pv-claim created -6 resource(s) applied. 6 created, 0 unchanged, 0 configured, 0 failed -0 resource(s) pruned, 0 skipped, 0 failed -``` - -When combined with server-side apply, the resources in the package pass through -all the validation steps on the API server. - -## Observe the package - -After you have deployed the package, you can get its current status at any time: - -```shell -$ kpt live status wordpress -service/wordpress is Current: Service is ready -service/wordpress-mysql is Current: Service is ready -deployment.apps/wordpress is Current: Deployment is available. Replicas: 1 -deployment.apps/wordpress-mysql is Current: Deployment is available. Replicas: 1 -persistentvolumeclaim/mysql-pv-claim is Current: PVC is Bound -persistentvolumeclaim/wp-pv-claim is Current: PVC is Bound -``` - -?> Refer to the [status command reference][status-doc] for usage. - -## Delete the package - -To delete all the resources in a package, you can use the `live destroy` -command: - -```shell -$ kpt live destroy wordpress -persistentvolumeclaim/wp-pv-claim deleted -persistentvolumeclaim/mysql-pv-claim deleted -deployment.apps/wordpress-mysql deleted -deployment.apps/wordpress deleted -service/wordpress-mysql deleted -service/wordpress deleted -6 resource(s) deleted, 0 skipped, 0 failed to delete -persistentvolumeclaim/wp-pv-claim reconcile pending -persistentvolumeclaim/mysql-pv-claim reconcile pending -deployment.apps/wordpress-mysql reconcile pending -deployment.apps/wordpress reconcile pending -service/wordpress-mysql reconcile pending -service/wordpress reconcile pending -deployment.apps/wordpress-mysql reconciled -deployment.apps/wordpress reconciled -service/wordpress-mysql reconciled -service/wordpress reconciled -persistentvolumeclaim/mysql-pv-claim reconciled -persistentvolumeclaim/wp-pv-claim reconciled -6 resource(s) reconciled, 0 skipped, 0 failed to reconcile, 0 timed out -``` - -?> Refer to the [destroy command reference][destroy-doc] for usage. - -[apply-doc]: /reference/cli/live/apply/ -[status-doc]: /reference/cli/live/status/ -[destroy-doc]: /reference/cli/live/destroy/ diff --git a/site/book/06-deploying-packages/03-handling-dependencies.md b/site/book/06-deploying-packages/03-handling-dependencies.md deleted file mode 100644 index 4451de43ac..0000000000 --- a/site/book/06-deploying-packages/03-handling-dependencies.md +++ /dev/null @@ -1,89 +0,0 @@ -Sometimes resources within a package have dependencies that require -one resource to be applied and reconciled before another resource. -For example, a package that includes both Wordpress and MySQL might -require that the MySQL `StatefulSet` is running before the Wordpress -`Deployment` is started. - -In kpt, this is supported by declaring dependencies with the -`config.kubernetes.io/depends-on` annotation. - -Let's take a look at the `wordpress-with-dependencies` package, a modified -version of the `wordpress` package used earlier: - -```shell -$ kpt pkg get https://github.com/kptdev/kpt.git/package-examples/wordpress-with-dependencies@v0.1 -``` - -You can see that the resources belonging to wordpress have -the `depends-on` annotation referencing the MySQL `StatefulSet`: - -```yaml -# wordpress-with-dependencies/deployment/deployment.yaml (Excerpt) -apiVersion: apps/v1 -kind: Deployment -metadata: - name: wordpress - namespace: default - labels: - app: wordpress - annotations: - config.kubernetes.io/depends-on: apps/namespaces/default/StatefulSet/wordpress-mysql -``` - -The syntax for the resource references are: - * For namespaced resources: `/namespaces///` - * For cluster-scoped resources: `//` - -Before you can deploy the package, you need to initialize it and create a `Secret` -containing the mysql password: - -```shell -$ kpt live init wordpress-with-dependencies -initializing Kptfile inventory info (namespace: default)...success - -$ kubectl create secret generic mysql-pass --from-literal=password=YOUR_PASSWORD -``` - -You can deploy the package just like other packages. You can see that the MySQL `StatefulSet` -and `Service` are created and reconciled before the Wordpress `Deployment` and `Service` are applied. - -```shell -$ kpt live apply wordpress-with-dependencies --reconcile-timeout=2m -service/wordpress-mysql created -statefulset.apps/wordpress-mysql created -service/wordpress-mysql reconcile pending -statefulset.apps/wordpress-mysql reconcile pending -service/wordpress-mysql reconciled -statefulset.apps/wordpress-mysql reconciled -service/wordpress created -deployment.apps/wordpress created -4 resource(s) applied. 4 created, 0 unchanged, 0 configured, 0 failed -service/wordpress reconcile pending -deployment.apps/wordpress reconcile pending -service/wordpress reconciled -deployment.apps/wordpress reconciled -4 resource(s) reconciled, 0 skipped, 0 failed to reconcile, 0 timed out -``` - -When you delete the package from the cluster, you can see that -resources are deleted in reverse order: -```shell -$ kpt live destroy wordpress-with-dependencies -deployment.apps/wordpress deleted -service/wordpress deleted -deployment.apps/wordpress reconciled -service/wordpress reconciled -statefulset.apps/wordpress-mysql deleted -service/wordpress-mysql deleted -4 resource(s) deleted, 0 skipped, 0 failed to delete -statefulset.apps/wordpress-mysql reconcile pending -service/wordpress-mysql reconcile pending -statefulset.apps/wordpress-mysql reconciled -service/wordpress-mysql reconciled -4 resource(s) reconciled, 0 skipped, 0 failed to reconcile, 0 timed out -``` - -See [depends-on] for more information. - -[depends-on]: - /reference/annotations/depends-on/ diff --git a/site/book/07-effective-customizations/00.md b/site/book/07-effective-customizations/00.md deleted file mode 100644 index 3c699224db..0000000000 --- a/site/book/07-effective-customizations/00.md +++ /dev/null @@ -1,19 +0,0 @@ -Kubernetes configuration packages and customizations go hand in hand, all the -packaging tools enable package customization, since every package needs to be adapted to each specific use. In this chapter we cover effective -customizations techniques that kpt rendering and packaging enables. We show how -providing customization through parameters has some [pitfalls] and recommend -alternatives where the contents of the package are not hidden behind a facade. -Some of these alternatives are only possible because kpt has made an investment -into bulk editing with [KRM functions] and upstream merging. - -### Prerequisites - -Before reading this chapter you should familiarize yourself with [chapter 4] -which talks about using functions as well as [updating a package page] in -[chapter 3]. - -[chapter 4]: /book/04-using-functions/ -[chapter 3]: /book/03-packages/ -[pitfalls]: https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/declarative-application-management.md#parameterization-pitfalls -[KRM functions]: https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md -[updating a package page]: /book/03-packages/05-updating-a-package.md \ No newline at end of file diff --git a/site/book/07-effective-customizations/01-single-value-replacement.md b/site/book/07-effective-customizations/01-single-value-replacement.md deleted file mode 100644 index 970f75a8ca..0000000000 --- a/site/book/07-effective-customizations/01-single-value-replacement.md +++ /dev/null @@ -1,137 +0,0 @@ -## Scenario - -I have a single value replacement in my package. I don’t want package consumers -to look through all the yaml files to find the value I want them to set. It -seems easier to just create a parameter for this value and have the user look -at Kptfile for inputs. - -Example storage bucket: - -```yaml -apiVersion: storage.cnrm.cloud.google.com/v1beta1 -kind: StorageBucket -metadata: - name: my-bucket # kpt-set: ${project-id}-${name} - namespace: ns-test # kpt-set: ${namespace} - annotations: - cnrm.cloud.google.com/force-destroy: "false" - cnrm.cloud.google.com/project-id: my-project # kpt-set: ${project-id} -spec: - storageClass: standard # kpt-set: ${storage-class} - uniformBucketLevelAccess: true - versioning: - enabled: false -``` - -The corresponding Kptfile: - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: bucket -info: - description: A Google Cloud Storage bucket -pipeline: - mutators: - - image: gcr.io/kpt-fn/apply-setters:v0.2 - configMap: - name: todo-bucket-name - namespace: todo-namespace - project-id: todo-project-id - storage-class: standard -``` - - -## Problems - -1. With package popularity the single values inevitably expand to provide a -facade to a large portion of the data. That defeats the purpose of minimizing -the cognitive load. With this small example almost half of the StorageBucket configuration is now covered with parameters. -1. Some values like resource names are used as references so setting them in -one place needs to trigger updates in all the places where they are referenced. -1. If additional resources that have similar values are added to the package -new string replacements need to be added. In this case everything will need -to also be marked up with project ID and namespace. -1. If a package is used as a sub-package the string replacement parameters need -to be surfaced to the parent package and if the parent package already expects -some values to be set and the parameters do not exist, the sub-package needs to -be updated. - -## Solutions: - -1. kpt allows the user to edit a particular value directly in the configuration -data and will handle upstream merge. When [editing the yaml] directly the -consumers are not confined to the parameters that the package author has -provided. [kpt pkg update] merges the local edits made by consumer with the -changes in the upstream package made by publisher. In this case `storageClass` -can be set directly by the user. -1. Attributes like resource names which are often updated by consumers to add -prefix or suffix (e.g. *-dev, *-stage, *-prod, na1-*, eu1-*) are best handled -by the [ensure-name-substring] function that will handle dependency updates as -well as capture all the resources in the package. -1. Instead of setting a particular value on a resource a bulk operation can be -applied to all the resources that fit a particular interface. This can be done -by a custom function or by [set-namespace], [search-and-replace] , [set-labels] -and [set-annotations] functions. - -New bucket configuration: - -```yaml -apiVersion: storage.cnrm.cloud.google.com/v1beta1 -kind: StorageBucket -metadata: - name: bucket - annotations: - cnrm.cloud.google.com/force-destroy: "false" -spec: - storageClass: standard - uniformBucketLevelAccess: true - versioning: - enabled: false -``` - -The suggested customizations are now in the Kptfile: - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: bucket -info: - description: A Google Cloud Storage bucket -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-namespace:v0.2.0 - configMap: - namespace: example-ns - - image: gcr.io/kpt-fn/ensure-name-substring:v0.1.1 - configMap: - prepend: project111- - - image: gcr.io/kpt-fn/set-annotations:v0.1.4 - configMap: - cnrm.cloud.google.com/project-id: project111 -``` - -The resource configuration YAML doesn't need to be marked up with where the -namespace value needs to go. The [set-namespace] function is smart enough to -find all the appropriate resources that need the namespace. - -We have put in the starter name `bucket` and have an [ensure-name-substring] -that shows the package consumer that the project ID prefix is what we suggest. -However if they have a different naming convention they can alter the name -prefix or suffix on all the resources in the package. - -Since we are trying to set the annotation to the project ID we can use the -[set-annotations] function one time and the annotation are going to be set on -all the resources in the package. If we add additional resources or whole -sub packages we will get the consistent annotations across all resources -without having to find all the places where annotations can go. - -[editing the yaml]: /book/03-packages/03-editing-a-package -[kpt pkg update]: /book/03-packages/05-updating-a-package -[ensure-name-substring]: https://catalog.kpt.dev/ensure-name-substring/v0.1/ -[search-and-replace]: https://catalog.kpt.dev/search-replace/v0.2/ -[set-labels]: https://catalog.kpt.dev/set-labels/v0.1/ -[set-annotations]: https://catalog.kpt.dev/set-annotations/v0.1/ -[set-namespace]: https://catalog.kpt.dev/set-namespace/v0.2/ \ No newline at end of file diff --git a/site/book/07-effective-customizations/02-limiting-package-changes.md b/site/book/07-effective-customizations/02-limiting-package-changes.md deleted file mode 100644 index c7aa4bb0e3..0000000000 --- a/site/book/07-effective-customizations/02-limiting-package-changes.md +++ /dev/null @@ -1,113 +0,0 @@ -## Scenario: - -I’d like to limit what my package consumers can do with my package and it feels -safer to just provide a string replacement in one place so they know not to -alter the configuration outside of the few places that I designated as OK -places to change. - -Example deployment: -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: # kpt-merge: /nginx-deploy - name: nginx-deploy -spec: - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: backend - image: nginx:1.16.1 # kpt-set: nginx:${tag} -``` - -kpt configuration that uses a setter: -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: dont-change-much -pipeline: - mutators: - - image: gcr.io/kpt-fn/apply-setters:v0.2.0 - configMap: - tag: 1.21 -``` - -## Problems: - -1. The limitation by parameters does not guarantee that consumers are in fact -going to limit their changes to the parameters. A popular pattern is using -kustomize to change output of other tools no matter what parameters had. In -this particular case I am able to fork or patch this package and add: - -```yaml -securityContext: - runAsNonRoot: false -``` - -2. String replacements rarely describe the intent of the package author. -When additional resources are added I need additional places where parameters -need to be applied. I can easily add other containers to this deployment and -the package author's rules are not clear and not easily validated. - -## Solutions: - -1. General ways to describe policy already exist. kpt has a [gatekeeper] -function that allows the author to describe intended limitations for a class -of resources or the entire package giving the consumer the freedom to customize -and get an error or a warning when the policy is violated. - -In the sample provided by the function we see how to provide a policy that will -clearly describe the intent using rego: - -```yaml -apiVersion: templates.gatekeeper.sh/v1 -kind: ConstraintTemplate -metadata: # kpt-merge: /disallowroot - name: disallowroot -spec: - crd: - spec: - names: - kind: DisallowRoot - targets: - - target: admission.k8s.gatekeeper.sh - rego: |- - package disallowroot - violation[{"msg": msg}] { - not input.review.object.spec.template.spec.securityContext.runAsNonRoot - msg := "Containers must not run as root" - } ---- -apiVersion: constraints.gatekeeper.sh/v1beta1 -kind: DisallowRoot -metadata: # kpt-merge: /disallowroot - name: disallowroot -spec: - match: - kinds: - - apiGroups: - - 'apps' - kinds: - - Deployment -``` - -The Kptfile can enforce that resources comply with this policy every time -`kpt fn render` is used: - -```yaml -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: gatekeeper-disallow-root-user -pipeline: - validators: - - image: gcr.io/kpt-fn/gatekeeper:v0.2 -``` - -[gatekeeper]: https://catalog.kpt.dev/gatekeeper/v0.2/ diff --git a/site/book/07-effective-customizations/03-generation.md b/site/book/07-effective-customizations/03-generation.md deleted file mode 100644 index 4393d08d07..0000000000 --- a/site/book/07-effective-customizations/03-generation.md +++ /dev/null @@ -1,29 +0,0 @@ -## Scenario: - -When using template languages I am able to provide conditional statements based -on parameter values. This allows me to ask the user for a little bit of -information and generate a lot of boilerplate configuration. Some template -languages like [Jinja] are very robust and feature rich. - -## Problems: - -1. Increased usage and additional edge cases make a template a piece of code -that requires testing and debugging. -1. The interplay between different conditionals and loops is interleaved in the template making it hard to understand what exactly is configuration and what is -the logic that alters the configuration. The consumer is left with one choice -supply different parameter values, execute the template rendering code and see -what happens. -1. Templates are generally monolithic, when a change is introduced the package consumers need to either pay the cost of updating or the new consumers pay the -cost of having to decipher more optional parameters. - -## Solutions: - -1. When the generated configuration is simple consider just using a sub-package -and running customizations using [single value replacement] techniques. -1. When a complex configuration needs to be generated the package author can -create a generator function using turing complete languages and debugging tools. Example of such a function is [folder generation]. The output of the function -is plain old KRM. - -[folder generation]: https://catalog.kpt.dev/generate-folders/v0.1/ -[Jinja]: https://palletsprojects.com/p/jinja/ -[single value replacement]: /book/07-effective-customizations/01-single-value-replacement.md \ No newline at end of file diff --git a/site/book/08-package-orchestration/00.md b/site/book/08-package-orchestration/00.md deleted file mode 100644 index 0e8fc62d03..0000000000 --- a/site/book/08-package-orchestration/00.md +++ /dev/null @@ -1,28 +0,0 @@ -In this chapter, we are going to cover _package orchestration_ - management -of package lifecycle supported by the kpt toolchain and Porch - Package -Orchestration service. - -Package Orchestration encompasses management of the overall lifecycle of -configuration [**packages**](/book/02-concepts/01-packages), including: - -* management of package repositories -* discovery of configuration packages and kpt - [**functions**](/book/02-concepts/03-functions) -* creating, modifying, updating, and deleting packages -* versioning packages -* WYSIWYG package authoring -* package customization with _guardrails_ -* evaluation of functions on package contents -* approval flow to publish a change to a configuration package -* deployment and rollouts - -Package Orchestration enables [workflows](/book/02-concepts/02-workflows) -similar to those supported by the kpt CLI, but makes them available as a -service. This enables creation of WYSIWYG user experiences, similar to the -proof-of-concept [Backstage plugin](/guides/namespace-provisioning-ui). - -Dedicated user guides are available for the use of Porch with the -[Backstage UI](/guides/namespace-provisioning-ui) and -the [kpt cli](/guides/porch-user-guide). In the following sections -of the book you will follow the basic journey of discovering and authoring -configuration packages using Porch - the Package Orchestration service. diff --git a/site/book/08-package-orchestration/01-system-requirements.md b/site/book/08-package-orchestration/01-system-requirements.md deleted file mode 100644 index a2a5989c97..0000000000 --- a/site/book/08-package-orchestration/01-system-requirements.md +++ /dev/null @@ -1,8 +0,0 @@ -In order to follow the package orchestration examples, you will need: - -* the Package Orchestration service (Porch) - [installed](https://kpt.dev/guides/porch-installation) in your Kubernetes - cluster and [kubectl context][kubeconfig] configured with your cluster. -* kpt CLI [installed](/installation/) on your system - -[kubeconfig]: https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ diff --git a/site/book/08-package-orchestration/02-quickstart.md b/site/book/08-package-orchestration/02-quickstart.md deleted file mode 100644 index bf72bcc10a..0000000000 --- a/site/book/08-package-orchestration/02-quickstart.md +++ /dev/null @@ -1,213 +0,0 @@ -​​In this quickstart you will use Porch to discover configuration packages -in a [sample repository](https://github.com/kptdev/kpt-samples). - -You will use the kpt CLI - the new `kpt alpha` command sub-groups to interact -with the Package Orchestration service. - -## Register the repository - -Start by registering the sample repository with Porch. The repository already -contains a [`basens`][basens] package. - -```sh -# Register a sample Git repository: -$ kpt alpha repo register --namespace default \ - https://github.com/kptdev/kpt-samples.git -``` - -?> Refer to the [register command reference][register-doc] for usage. - -The sample repository is public and Porch therefore doesn't require -authentication to read the repository and discover packages within it. - -You can confirm the repository is now registered with Porch by using the -`kpt alpha repo get` command. Similar to `kubectl get`, the command will list -all repositories registered with Porch, or get information about specific ones -if list of names is provided - -```sh -# Query repositories registered with Porch: -$ kpt alpha repo get -NAME TYPE CONTENT DEPLOYMENT READY ADDRESS -kpt-samples git Package True https://github.com/kptdev/kpt-samples.git -``` - -?> Refer to the [get command reference][get-doc] for usage. - -From the output you can see that: - -* the repository was registered by the name `kpt-samples`. This was chosen - by kpt automatically from the repository URL, but can be overridden -* it is a `git` repository (OCI repositories are also supported, though - currently with some limitations) -* the repository is *not* a deployment repository. Repository can be marked - as deployment repository which indicates that packages in the repository are - intended to be deployed into live state. -* the repository is ready - Porch successfully registered it and discovered - packages stored in the repository. - -The Package Orchestration service is designed to be part of the Kubernetes -ecosystem. The [resources] managed by Porch are KRM resources. - -You can use the `-oyaml` to see the YAML representation of the repository -registration resource: - -?> kpt uses the same output format flags as `kubectl`. Flags with which you are -already familiar from using `kubectl get` will work with the kpt commands -that get or list Porch resources. - -```sh -# View the Repository registration resource as YAML: -$ kpt alpha repo get kpt-samples --namespace default -oyaml -apiVersion: config.porch.kpt.dev/v1alpha1 -kind: Repository -metadata: - name: kpt-samples - namespace: default -spec: - content: Package - git: - branch: main - directory: / - repo: https://github.com/kptdev/kpt-samples.git - secretRef: - name: "" - type: git -status: - conditions: - - reason: Ready - status: "True" - type: Ready -``` - -Few additional details are available in the YAML listing: - -The name of the `main` branch and a directory. These specify location within -the repository where Porch will be managing packages. Porch also analyzes tags -in the repository to identify all packages (and their specific versions), all -within the directory specified. By default Porch will analyze the whole -repository. - -The `secretRef` can contain a name of a Kubernetes [Secret][secret] resource -with authentication credentials for Porch to access the repository. - -### kubectl - -Thanks to the integration with Kubernetes ecosystem, you can also use `kubectl` -directly to interact with Porch, such as listing repository resources: - -```sh -# List registered repositories using kubectl -$ kubectl get repository -NAME TYPE CONTENT DEPLOYMENT READY ADDRESS -kpt-samples git Package True https://github.com/kptdev/kpt-samples.git -``` - -You can use kubectl for _all_ interactions with Porch server if you prefer. -The kpt CLI integration provides a variety of convenience features. - -## Discover packages - -You can use the `kpt alpha rpkg get` command to list the packages discovered -by Porch across all registered repositories. - -```sh -# List package revisions in registered repositories -$ kpt alpha rpkg get -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -kpt-samples-da07e9611f9b99028f761c07a79e3c746d6fc43b basens main false Published kpt-samples -kpt-samples-afcf4d1fac605a60ba1ea4b87b5b5b82e222cb69 basens v0 true Published kpt-samples -``` - -?> Refer to the [get command reference][get-doc] for usage. - -?> The `r` prefix of the `rpkg` command group stands for `remote`. The commands -in the `kpt alpha rpkg` group interact with packages managed (remotely) by Porch -server. The commands in the `rpkg` group are similar to the `kpt pkg` commands -except that they operate on remote packages managed by Porch server rather than -on a local disk. - -The output shows that Porch discovered the `basens` package, and found two -different revisions of it. The `v0` revision (associated with the -[`basens/v0`][basens-v0] tag) and the `main` revision associated with the -[`main` branch][main-branch] in the repository. - -The `LIFECYCLE` column indicates the lifecycle stage of the package revision. -The package revisions in the repository are *`Published`* - ready to be used. -Package revision may be also *`Draft`* (the package revision is being authored) -or *`Proposed`* (the author of the package revision proposed that it be -published). We will encounter examples of these - -Porch identifies the latest revision of the package (`LATEST` column). - -### View package resources - -The `kpt alpha rpkg get` command displays package metadata. To view the -_contents_ of the package revision, use the `kpt alpha rpkg pull` command. - -You can use the command to output the resources as a -[`ResourceList`][resourcelist] on standard output, or save them into a local -directory: - -```sh -# View contents of the basens/v0 package revision -$ kpt alpha rpkg pull kpt-samples-afcf4d1fac605a60ba1ea4b87b5b5b82e222cb69 -ndefault - -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: kpt.dev/v1 - kind: Kptfile - metadata: - name: basens - annotations: -... -``` - -Add a name of a local directory on the command line to save the package onto -local disk for inspection or editing. - -```sh -# Pull package revision resources, save to local disk into `./basens` directory -$ kpt alpha rpkg pull kpt-samples-afcf4d1fac605a60ba1ea4b87b5b5b82e222cb69 ./basens -ndefault - -# Explore the package contents -$ find basens - -basens -basens/README.md -basens/namespace.yaml -basens/Kptfile -... -``` - -?> Refer to the [pull command reference][pull-doc] for usage. - -## Unregister the repository - -When you are done using the repository with Porch, you can unregister it: - -```sh -# Unregister the repository -$ kpt alpha repo unregister kpt-samples -ndefault -``` - -## More resources - -To continue learning about Porch, you can review: - -* [Porch User Guide](/guides/porch-user-guide) -* [Provisioning Namespaces with the UI](/guides/namespace-provisioning-ui) -* [Porch Design Document][design] - -[basens]: https://github.com/kptdev/kpt-samples/tree/main/basens -[register-doc]: /reference/cli/alpha/repo/reg/ -[get-doc]: /reference/cli/alpha/repo/get/ -[pull-doc]: /reference/cli/alpha/rpkg/pull/ -[unregister-doc]: /reference/cli/alpha/repo/unreg/ -[resources]: /guides/porch-user-guide -[secret]: https://kubernetes.io/docs/concepts/configuration/secret/ -[basens-v0]: https://github.com/kptdev/kpt-samples/tree/basens/v0 -[main-branch]: https://github.com/kptdev/kpt-samples/tree/main -[resource-list]: /reference/schema/resource-list/ -[design]: https://github.com/kptdev/kpt/blob/main/docs/design-docs/07-package-orchestration.md diff --git a/site/book/08-package-orchestration/03-registering-a-repository.md b/site/book/08-package-orchestration/03-registering-a-repository.md deleted file mode 100644 index 3dac7edc03..0000000000 --- a/site/book/08-package-orchestration/03-registering-a-repository.md +++ /dev/null @@ -1,63 +0,0 @@ -In the following sections of this chapter you will explore package authoring -using Porch. You will need: - -* A GitHub repository for your blueprints. An otherwise empty repository with an - initial commit works best. The initial commit is required to establish the - `main` branch. -* A GitHub [Personal Access Token](https://github.com/settings/tokens) with - the `repo` scope for Porch to authenticate with the repository and allow it - to create commits in the repository. - -A repository is a porch representation of either a git repo or an oci registry. -Package revisions always belong to a single repository. A repository exists in -a Kubernetes namespace and all package revisions in a repo also belong to -the same namespace. - -Use the `kpt alpha repo register` command to register your repository with -Porch: The command below uses the repository `deployments.git`. -Your repository name may be different; please update the command with the -correct repository name. - -```sh -# Register your Git repository: - -GITHUB_USERNAME= -GITHUB_TOKEN= -REPOSITORY_ADDRESS= - -$ kpt alpha repo register \ - --namespace default \ - --name deployments \ - --deployment \ - --repo-basic-username=${GITHUB_USERNAME} \ - --repo-basic-password=${GITHUB_TOKEN} \ - ${REPOSITORY_ADDRESS} -``` - -And register the sample repository we used in the [quickstart](./02-quickstart): - -```sh -# Register the sample repository: - -kpt alpha repo register --namespace default \ - https://github.com/kptdev/kpt-samples.git -``` - -?> Refer to the [register command reference][register-doc] for usage. - -You now have two repositories registered, and your repository is marked as -deployment repository. This indicates that published packages in the repository -are considered deployment-ready. - -```sh -# Query repositories registered with Porch: -$ kpt alpha repo get -NAME TYPE CONTENT DEPLOYMENT READY ADDRESS -deployments git Package true True [Your repository address] -kpt-samples git Package True https://github.com/kptdev/kpt-samples.git -``` - -?> Refer to the [get command reference][get-doc] for usage. - -[register-doc]: /reference/cli/alpha/repo/reg/ -[get-doc]: /reference/cli/alpha/repo/get/ diff --git a/site/book/08-package-orchestration/04-package-authoring.md b/site/book/08-package-orchestration/04-package-authoring.md deleted file mode 100644 index eb3ed56261..0000000000 --- a/site/book/08-package-orchestration/04-package-authoring.md +++ /dev/null @@ -1,311 +0,0 @@ -There are several ways to author a package revision, including creating -a completely new one, cloning an existing package, or creating a new revision -of an existing package. In this section we will explore the different ways to -author package revisions, and explore how to modify package contents. - -## Create a new package revision - -Create a new package revision in a repository managed by Porch: - -```sh -# Initialize a new (empty) package revision: -$ kpt alpha rpkg init new-package --repository=deployments --revision=v1 -ndefault - -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 created - -# List the available package revisions. -$ kpt alpha rpkg get - -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 false Draft deployments -kpt-samples-da07e9611f9b99028f761c07a79e3c746d6fc43b basens main false Published kpt-samples -kpt-samples-afcf4d1fac605a60ba1ea4b87b5b5b82e222cb69 basens v0 true Published kpt-samples -... -``` - -?> Refer to the [init command reference][rpkg-init] for usage. - -You can see the `new-package` is created in the `Draft` lifecycle stage. This -means that the package is being authored. - -> You may notice that the name of the package revision -> `deployments-c32b851b591b860efda29ba0e006725c8c1f7764` was assigned -> automatically. Packages in a git repository may be located in subdirectories -> and to make sure Porch works well with the rest of the Kubernetes ecosystem, -> the resource names must meet Kubernetes requirements. The resource names -> assigned by Porch are stable, and computed as hash of the repository name, -> directory path within the repository, and revision. - -The contents of the new package revision are the same as if it was created using -the [`kpt pkg init`](/book/03-packages/06-creating-a-package) command, except it -was created by the Package Orchestration service in your repository. - -In fact, if you check your Git repository, you will see a new branch called -`drafts/new-package/v1` which Porch created for the draft authoring. You will -also see one or more commits made into the branch by Porch on your behalf. - -## Clone an existing package - -Another way to create a new package revision is by cloning an already existing -package. The existing package is referred to as *upstream* and the newly created -package is *downstream*. - -Use `kpt alpha rpkg clone` command to create a new *downstream* package -`istions` by cloning the sample `basens/v0` package revision: - -```sh -# Clone an upstream package to create a downstream package -$ kpt alpha rpkg clone \ - kpt-samples-afcf4d1fac605a60ba1ea4b87b5b5b82e222cb69 \ - istions \ - --repository=deployments -ndefault - -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b created - -# Confirm the package revision was created -kpt alpha rpkg get deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b -ndefault -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b istions v1 false Draft deployments -``` - -?> Refer to the [clone command reference][rpkg-clone] for usage. - -Cloning a package using the Package Orchestration service is an action similar to -[`kpt pkg get`](/book/03-packages/01-getting-a-package) command. Porch will -create the appropriate upstream package links in the new package's `Kptfile`. -Let's take a look: - -```sh -# Examine the new package's upstream link (the output has been abbreviated): -$ kpt alpha rpkg pull deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b -ndefault - -kpt alpha rpkg pull deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b -ndefault -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: kpt.dev/v1 - kind: Kptfile - metadata: - name: istions - upstream: - type: git - git: - repo: https://github.com/kptdev/kpt-samples.git - directory: basens - ref: basens/v0 - upstreamLock: - type: git - git: - repo: https://github.com/kptdev/kpt-samples.git - directory: basens - ref: basens/v0 - commit: 026dfe8e3ef8d99993bc8f7c0c6ba639faa9a634 - info: - description: kpt package for provisioning namespace -... -``` - -You can find out more about the `upstream` and `upstreamLock` sections of the -`Kptfile` in an [earlier chapter](/book/03-packages/01-getting-a-package) -of the book. - -> A cloned package must be created in a repository in the same namespace as -> the source package. Cloning a package with the Package Orchestration Service -> retains a reference to the upstream package revision in the clone, and -> cross-namespace references are not allowed. Package revisions in repositories -> in other namespaces can be cloned using a reference directly to the underlying -> oci or git repository as described below. - -You can also clone a package from a repository that is _not_ registered with -Porch, for example: - -```sh -# Clone a package from Git repository directly (repository is not registered) -$ kpt alpha rpkg clone \ - https://github.com/GoogleCloudPlatform/blueprints.git/catalog/bucket@main my-bucket \ - --repository=deployments \ - --namespace=default - -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 created - -# Confirm the package revision was created -$ kpt alpha rpkg get deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 -ndefault -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 my-bucket v1 false Draft deployments -``` - -## Create a new revision of an existing package - -Finally, with Porch you can create a new revision of an existing, -**`Published`** package. All the package revisions in your repository are -**`Draft`** revisions and need to be published first. We will cover the package -approval flow in more detail in the next section. For now we will quickly -propose and approve one of our draft package revisions and create a new revision -from it. - -```sh -# Propose the package draft to be published -$ kpt alpha rpkg propose deployments-c32b851b591b860efda29ba0e006725c8c1f7764 -ndefault -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 proposed - -# Approve the proposed package revision for publishing -$ kpt alpha rpkg approve deployments-c32b851b591b860efda29ba0e006725c8c1f7764 -ndefault -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 approved -``` - -You now have a **`Published`** package revision in the repository managed by Porch -and next you will create a new revision of it. A **`Published`** package is ready -to be used, such as deployed or copied. - -```sh -# Confirm the package is published: -$ kpt alpha rpkg get deployments-c32b851b591b860efda29ba0e006725c8c1f7764 -ndefault -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 true Published deployments -``` - -Copy the existing, **`Published`** package revision to create a **`Draft`** of -a new package revision that you can further customize: - -```sh -# Copy the published package: -$ kpt alpha rpkg copy deployments-c32b851b591b860efda29ba0e006725c8c1f7764 \ - -ndefault --revision v2 -deployments-93bb9ac8c2fb7a5759547a38f5f48b369f42d08a created - -# List all revisions of the new-package that we just copied: -$ kpt alpha rpkg get --name new-package -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-af86ae3c767b0602a198856af513733e4e37bf10 new-package main false Published deployments -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 true Published deployments -deployments-93bb9ac8c2fb7a5759547a38f5f48b369f42d08a new-package v2 false Draft deployments -``` - -?> Refer to the [copy command reference][rpkg-copy] for usage. - -Unlike `clone` of a package which establishes the upstream-downstream -relationship between the respective packages, and updates the `Kptfile` -to reflect the relationship, the `copy` command does *not* change the -upstream-downstream relationships. The copy of a package shares the same -upstream package as the package from which it was copied. Specifically, -in this case both `new-package/v1` and `new-package/v2` have identical contents, -including upstream information, and differ in revision only. - -## Editing package revision resources - -One of the driving motivations for the Package Orchestration service is enabling -WYSIWYG authoring of packages, including their contents, in highly usable UIs. -Porch therefore supports reading and updating package *contents*. - -In addition to using a [UI](/guides/namespace-provisioning-ui) with Porch, we -can change the package contents by pulling the package from Porch onto the local -disk, make any desired changes, and then pushing the updated contents to Porch. - -```sh -# Pull the package contents of istions/v1 onto the local disk: -$ kpt alpha rpkg pull deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b ./istions -ndefault -``` - -?> Refer to the [pull command reference][rpkg-pull] for usage. - -The command downloaded the `istions/v1` package revision contents and saved -them in the `./istions` directory. Now you will make some changes. - -First, note that even though Porch updated the namespace name (in -`namespace.yaml`) to `istions` when the package was cloned, the `README.md` -was not updated. Let's fix it first. - -Open the `README.md` in your favorite editor and update its contents, for -example: - -``` -# istions - -## Description -kpt package for provisioning Istio namespace -``` - -In the second change, add a new mutator to the `Kptfile` pipeline. Use the -[set-labels](https://catalog.kpt.dev/set-labels/v0.1/) function which will add -labels to all resources in the package. Add the following mutator to the -`Kptfile` `pipeline` section: - -```yaml - - image: gcr.io/kpt-fn/set-labels:v0.1.5 - configMap: - color: orange - fruit: apple -``` - -The whole `pipeline` section now looks like this: - -```yaml -pipeline: - mutators: - - image: gcr.io/kpt-fn/set-namespace:v0.4.1 - configPath: package-context.yaml - - image: gcr.io/kpt-fn/apply-replacements:v0.1.1 - configPath: update-rolebinding.yaml - - image: gcr.io/kpt-fn/set-labels:v0.1.5 - configMap: - color: orange - fruit: apple -``` - -Save the changes and push the package contents back to the server: - -```sh -# Push updated package contents to the server -$ kpt alpha rpkg push deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b ./istions -ndefault -``` - -?> Refer to the [push command reference][rpkg-push] for usage. - -Now, pull the contents of the package revision again, and inspect one of the -configuration files. - -```sh -# Pull the updated package contents to local drive for inspection: -$ kpt alpha rpkg pull deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b ./updated-istions -ndefault - -# Inspect updated-istions/namespace.yaml -$ cat updated-istions/namespace.yaml - -apiVersion: v1 -kind: Namespace -metadata: - name: istions - labels: - color: orange - fruit: apple -spec: {} -``` - -The updated namespace now has new labels! What happened? - -Whenever package is updated during the authoring process, Porch automatically -re-renders the package to make sure that all mutators and validators are -executed. So when we added the new `set-labels` mutator, as soon as we pushed -the updated package contents to Porch, Porch re-rendered the package and -the `set-labels` function applied the labels we requested (`color: orange` and -`fruit: apple`). - -## Summary of package authoring - -In this section we reviewed how to use Porch to author packages, including - -* creating a new package ([`kpt alpha rpkg init`][rpkg-init]) -* cloning an existing package ([`kpt alpha rpkg clone`][rpkg-clone]) -* creating a new revision of an existing package - ([`kpt alpha rpkg copy`][rpkg-copy]) -* pulling package contents for local editing - ([`kpt alpha rpkg pull`][rpkg-pull]) -* and pushing updated package contents to Porch - ([`kpt alpha rpkg push`][rpkg-push]) - -[rpkg-init]: /reference/cli/alpha/rpkg/init/ -[rpkg-get]: /reference/cli/alpha/rpkg/get/ -[rpkg-clone]: /reference/cli/alpha/rpkg/clone/ -[rpkg-copy]: /reference/cli/alpha/rpkg/copy/ -[rpkg-pull]: /reference/cli/alpha/rpkg/pull/ -[rpkg-push]: /reference/cli/alpha/rpkg/push/ diff --git a/site/book/08-package-orchestration/05-package-lifecycle.md b/site/book/08-package-orchestration/05-package-lifecycle.md deleted file mode 100644 index 595f5e649a..0000000000 --- a/site/book/08-package-orchestration/05-package-lifecycle.md +++ /dev/null @@ -1,98 +0,0 @@ -When a new package revision is created, it is in a **`Draft`** lifecycle stage, -where the package can be authored, including updating its contents. - -Before a package can be deployed or cloned, it must be **`Published`**. -The approval flow is the process by which the package is advanced from -**`Draft`** to **`Proposed`** and finally **`Published`** lifecycle stage. - -In the [previous section](./04-package-authoring) we created several packages, -let's explore how to publish some of them. - -```sh -# List package revisions (the output was abbreviated to only include Draft) -# packages -$ kpt alpha rpkg get -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b istions v1 false Draft deployments -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 my-bucket v1 false Draft deployments -deployments-93bb9ac8c2fb7a5759547a38f5f48b369f42d08a new-package v2 false Draft deployments -... -``` - -Now, in the role of the package author, we will propose two of those packages -to be published: `istions/v1` and `my-bucket/v2`. - -```sh -# Propose two package revisions to be be published -$ kpt alpha rpkg propose \ - deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b \ - deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 \ - -ndefault - -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b proposed -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 proposed -``` - -?> Refer to the [propose command reference][rpkg-propose] for usage. - -The two package revisions are now **`Proposed`**: - -```sh -# Confirm the package revisions are now Proposed (the output was abbreviated -# to only show relevant packages) -$ kpt alpha rpkg get -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b istions v1 false Proposed deployments -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 my-bucket v1 false Proposed deployments -deployments-93bb9ac8c2fb7a5759547a38f5f48b369f42d08a new-package v2 false Draft deployments -... -``` - -At this point, a person in the _platform administrator_ role, or even an -automated process, will review and either approve or reject the proposals. -To aid with the decision, the platform administrator may inspect the package -contents using the commands above, such as `kpt alpha rpkg pull`. - -```sh -# Approve a proposal to publish istions/v1 -$ kpt alpha rpkg approve deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b -ndefault -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b approved - -# Reject a proposal to publish a my-bucket/v1 -$ kpt alpha rpkg reject deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 -ndefault -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 rejected -``` - -?> Refer to the [approve][rpkg-approve] and [reject][rpkg-reject] command -reference for usage. - -> Approving a package revisions requires that the current user has been granted -> update access to the `approve` subresource of `packagerevisions`. This allows -> for giving only a limited set of users permission to approve package revisions. - -Now, confirm lifecycle stages of the package revisions: - -```sh -# Confirm package revision lifecycle stages after approvals (output was -# abbreviated to display only relevant package revisions): -$ kpt alpha rpkg get -NAME PACKAGE REVISION LATEST LIFECYCLE REPOSITORY -deployments-98bc9a49246a5bd0f4c7a82f3d07d0d2d1293cd0 istions main false Published deployments -deployments-eeb52a8072ca2602e7ee27f3c56ad6344b024f5b istions v1 true Published deployments -deployments-8baf4892d6bdeda0f26ef4b1088fddb85c5a2486 my-bucket v1 false Draft deployments -deployments-93bb9ac8c2fb7a5759547a38f5f48b369f42d08a new-package v2 false Draft deployments -... -``` - -The rejected proposal returned the package to **`Draft`**, and the approved -proposal resulted in **`Published`** package revision. - -You may have noticed that a `main` revision of the istions package appeared. -When a package is approved, Porch will commit it into the branch which was -provided at the repository registration (`main` in this case) and apply a tag. -As a result, the package revision exists in two locations - tag, and the `main` -branch. - -[rpkg-propose]: /reference/cli/alpha/rpkg/propose/ -[rpkg-approve]: /reference/cli/alpha/rpkg/approve/ -[rpkg-reject]: /reference/cli/alpha/rpkg/reject/ diff --git a/site/book/README.md b/site/book/README.md deleted file mode 100644 index 749c12c9f1..0000000000 --- a/site/book/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# The kpt Book - -_by Frank Farzan with contributions from the kpt team and community_ - -Welcome to the _The kpt Book_, a step-by-step introduction to kpt. - -This book is organized as follows: - -- [Chapter 1] is a quickstart to get you oriented with kpt and sets up the - context for the rest of the book. -- [Chapter 2] introduces the fundamental concepts in kpt. -- [Chapter 3] covers how to work with kpt packages. -- [Chapter 4] covers how to use kpt functions to automate configuration changes. -- [Chapter 5] guides you through developing custom functions. -- [Chapter 6] covers how to deploy a package to a Kubernetes cluster. -- [Chapter 7] covers effective customizations techniques. -- [Chapter 8] covers package orchestration concepts and support in kpt toolchain. - -Let's get started! - -[chapter 1]: /book/01-getting-started/ -[chapter 2]: /book/02-concepts/ -[chapter 3]: /book/03-packages/ -[chapter 4]: /book/04-using-functions/ -[chapter 5]: /book/05-developing-functions/ -[chapter 6]: /book/06-deploying-packages/ -[chapter 7]: /book/07-effective-customizations/ -[chapter 8]: /book/08-package-orchestration/ diff --git a/site/contact/README.md b/site/contact/README.md deleted file mode 100755 index f7e0fb6412..0000000000 --- a/site/contact/README.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Contact" -linkTitle: "Contact" -type: docs -weight: 20 -menu: - main: - weight: 7 ---- - -Do you have questions, comments, suggestions for improving kpt? - -We'd love to hear from you! - -- Join our [Slack channel](https://kubernetes.slack.com/channels/kpt) -- Join our [email list](https://groups.google.com/forum/?oldui=1#!forum/kpt-users) -- Join our [office hours](https://calendar.google.com/event?action=TEMPLATE&tmeid=MGk2NWhrdmkyMjgxOGc3ZWtobzFrZnB0NnBfMjAyMjA3MjhUMTcwMDAwWiBzdW5pbGFyb3JhQGdvb2dsZS5jb20&tmsrc=sunilarora%40google.com&scp=ALL) -- Follow us on [Twitter](https://twitter.com/kptdev) -- Subscribe to our [Youtube channel](https://www.youtube.com/channel/UCE6EvJ37y6Z8Xu_cDykhlnw) diff --git a/site/coverpage.md b/site/coverpage.md deleted file mode 100644 index 436762a5b9..0000000000 --- a/site/coverpage.md +++ /dev/null @@ -1,11 +0,0 @@ -# ![kpt logo](static/images/logo.png) - -> kpt: Automate Kubernetes Configuration Editing -
- -
- - -[Why kpt](guides/rationale.md) -[Get Started](?id=overview) diff --git a/site/faq/README.md b/site/faq/README.md deleted file mode 100755 index cdb3612d85..0000000000 --- a/site/faq/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# FAQ - -### What is the roadmap for kpt? - -Please visit the [roadmap document] and the [kpt milestones]. - -### How is kpt different from other solutions? - -Think of configuration as an API or data in a database. kpt can operate on configuration -in storage, git or OCI. - -Rather than expressing configuration AS code or templates that generate configuration, -kpt represents [Configuration as Data]. In particular, it represents configuration -as YAML or JSON objects adhering to [The Kubernetes Resource Model], the same as the -live state in Kubernetes, which enables novel remedies to configuration drift. - -kpt uses an in-place transformation approach to customization: -read configuration in, modify it, and write it back. - -This enables interoperability of a variety of generators, -transformers, and validators. One doesn’t have to make all changes through a monolithic -generator implementation. - -By storing the result of config generators and transformers, automated mutations can be separated in time -from use and other modifications. This enables generation via a UI, for example. -It also is one enabler of in-place edits rather than patches or other programmatic overrides. - -Another ingredient in the secret sauce is the ability to upgrade from an upstream package -despite downstream modifications. Conceptually it's like deriving and applying patches automatically. - -Combine these capabilities with the ability to operate on packages in bulk via APIs, -and new operational capabilities are enabled. - -### What's the difference between kpt and kustomize? - -While both kpt and kustomize support customization of KRM resources via a transformation-based approach, -there are important differences in both feature sets and the scopes of these projects. - -_kustomize_ - -- Builds the final configuration out of place, primarily using the [overlay pattern]. -- Treats base layers as immutable, but enables nearly arbitrary overrides. - -_kpt_ - -- Optimizes for WYSIWYG configuration and in-place customization. -- Allows edits to the configuration in-place without creating complex patches. -- Supports rebase with resource merge strategy allowing for edited config to - be updated. -- Enables workflows that combine programmatic changes ([functions]) with manual - edits. -- Aims to support mutating and validating admission control on derived packages. -- Also supports packages, [package orchestration], resource actuation, and GitOps. - -### Do kpt and kustomize work together? - -The goal of kpt project is to provide a seamless UX spanning packaging, -transformation, and actuation functionality. At the same time, kpt follows a modular -design principle to make it possible to use each of its functionality -independently if needed. For example: - -- You can use packaging without declaring functions -- You can use imperative functions to operate on vanilla directories of Kubernetes - resources -- You can use apply logic without buying into the full packaging story (still - need a minimal `Kptfile` though) - -We have created a [kustomize solution] which allows you to use kpt for packaging -and actuation, and kustomize for customization. - -### Why resource configuration as the artifact rather than templates or configuration DSLs? - -As explained in [Declarative application management in Kubernetes], using -resource configuration provides a number of desirable properties: - -1. it clearly **represents the intended state** of the infrastructure - -2. it **aligns with how tools developed by the Kubernetes project are written** - -- `kubectl`, `kustomize`, etc - -3. it enables **composition of different types of tools written in different - languages** - - - any modern language can manipulate YAML / JSON structures, no need to adopt - `go` - -4. it **supports static analysis and validation** - - - develop tools and processes to perform validation and linting - -5. it **supports programmatic modification** - - - develop CLIs and UIs for working with configuration rather than using `vim` - -6. it **supports display in UI and tools** which use either OpenAPI or the - YAML/JSON directly. - -For a more complete explanation, see the [rationale]. - -### I really like DSL / templating solution X. Can I use it with kpt? - -Yes. kpt supports plugging in solutions which generate or manipulate -configuration, e.g. from DSLs and templates. This may be performed using the -[Functions Catalog]. The generated output may be modified directly, and merged -when regenerated. - -### I want to write high-level abstractions like CRDs, but on the client-side. Can I do this with kpt? - -Yes. kpt's architecture facilitates the developing programs which may generate -or modify configuration. See the [Using Functions] for how to compose multiple -programs together. - -### What's with the name? - -kpt was inspired by `apt`, but with a Kubernetes focus. We wanted to uphold the -tradition of naming tools to start with `k`, and also be short enough that you -don't have to alias it. It is pronounced "kept". - -### I still have questions. How do I contact you? - -[Please reach out!][contact] - -[Configuration as Data]: - https://github.com/kptdev/kpt/blob/main/docs/design-docs/06-config-as-data.md -[package orchestration]: - https://github.com/kptdev/kpt/blob/main/docs/design-docs/07-package-orchestration.md -[the kubernetes resource model]: - https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/resource-management.md -[declarative application management in kubernetes]: - https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/declarative-application-management.md -[rationale]: https://kpt.dev/guides/rationale -[functions]: /reference/cli/fn/eval/ -[using functions]: /book/04-using-functions/ -[contact]: /contact/ -[functions catalog]: https://catalog.kpt.dev/ -[roadmap document]: - https://github.com/kptdev/kpt/blob/main/docs/ROADMAP.md -[kpt milestones]: https://github.com/kptdev/kpt/milestones -[kustomize solution]: - https://github.com/kptdev/kpt/tree/main/package-examples/kustomize -[kustomize]: https://kustomize.io -[overlay pattern]: - https://github.com/kubernetes-sigs/kustomize/tree/master/examples/multibases diff --git a/site/gitops/README.md b/site/gitops/README.md deleted file mode 100644 index bc92119090..0000000000 --- a/site/gitops/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# GitOps - -Packages eventually have to be deployed into one or more clusters. The default -deployment mechanism is [Config Sync](gitops/configsync/), but since configuration is stored in standard -repositories, other [GitOps](https://opengitops.dev/) tools can also be used. - -Currently supported gitops tools: -* [Config Sync](gitops/configsync/) \ No newline at end of file diff --git a/site/gitops/configsync/README.md b/site/gitops/configsync/README.md deleted file mode 100644 index 0a3e4aecfd..0000000000 --- a/site/gitops/configsync/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Config Sync - -Config Sync lets cluster operators and platform administrators deploy consistent -configurations and policies. You can deploy these configurations and policies to -individual Kubernetes clusters, multiple clusters that can span hybrid and -multi-cloud environments, and multiple namespaces within clusters. This process -simplifies and automates configuration and policy management at scale. -Config Sync also lets development teams independently manage their -namespaces within clusters, while still being subject to policy guardrails set -by administrators. - -Config Sync is an open-source project and the source and releases available at -[github.com/GoogleContainerTools/kpt-config-sync](https://github.com/GoogleContainerTools/kpt-config-sync). -It also provides instructions for installing Config Sync on your cluster and -building it from source. - -[Config Sync](https://cloud.google.com/anthos-config-management/docs/config-sync-overview) -is also available with [Anthos Config Management (ACM)](https://cloud.google.com/anthos/config-management) -on [Google Cloud Platform (GCP)](https://cloud.google.com). - - - diff --git a/site/guides/README.md b/site/guides/README.md deleted file mode 100644 index dcd63cb165..0000000000 --- a/site/guides/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Reference - -- [The Rationale Behind kpt](guides/rationale.md) -- [Porch Installation Guide](guides/porch-installation.md) -- [Porch UI Installation Guide](guides/porch-ui-installation.md) -- [Porch User Guide](guides/porch-user-guide.md) -- [Namespace Provisioning CLI](guides/namespace-provisioning-cli.md) -- [Namespace Provisioning UI](guides/namespace-provisioning-ui.md) -- [Variant Constructor Pattern](guides/variant-constructor-pattern.md) -- [Value Propagation Pattern](guides/value-propagation.md) \ No newline at end of file diff --git a/site/guides/namespace-provisioning-cli.md b/site/guides/namespace-provisioning-cli.md deleted file mode 100644 index 64d53ce8c3..0000000000 --- a/site/guides/namespace-provisioning-cli.md +++ /dev/null @@ -1,444 +0,0 @@ -# Namespace provisioning using kpt CLI - -In this guide, we will learn how to create a kpt package from scratch using -`kpt CLI`. We will also learn how to enable customization of the package -with minimal manual steps for package consumers. - -## What package are we creating ? - -Onboarding a new application or a micro-service is a very common task for a -platform team. It involves provisioning a dedicated namespace (and other -associated resources) where all resources that belong to the application reside. -In this guide, we will create a package that will be used for provisioning a namespace. - -## Prerequisites - -### Repositories - -Platform teams will have to setup two repos: -1. Blueprint repo where reusable kpt packages will live. -2. Deployment repo where instances of packages that will be deployed to a -kubernetes cluster will live. Users will create deployable packages from the -packages in the blueprint repo. - -We will refer to the repos with environment variables named $BLUEPRINT_REPO and $DEPLOYMENT_REPO. - -If you don’t have these two repositories, you can follow the steps below using -Github’s CLI [gh](https://cli.github.com/) to set up the repos, or set them up -via the GitHub GUI. - -```shell - -# (optional) skip if you've authenticated.  -# Authenticate gh to create a repository. - -$ gh auth login - -# Create the "blueprint" and "deployment" repos if you don't have them yet - -$ gh repo create blueprint -$ gh repo create deployment - - -# clone and enter the blueprint repo -$ USER= -$ BLUEPRINT_REPO=git@github.com:${USER}/blueprint.git -$ DEPLOYMENT_REPO=git@github.com:${USER}/deployment.git - -$ git clone ${BLUEPRINT_REPO} -$ git clone ${DEPLOYMENT_REPO} - -$ cd blueprint - -``` - -### kube-gen.sh - -We will be writing kubernetes manifests from scratch, feel free to use whatever -tools (IDE/extensions) you are most comfortable with. We have created this -little script that helps in generating kubernetes manifests just with kubectl. -So ensure that you have kubectl installed and configured to talk to a -kubernetes cluster. - -```shell -# quick check is kubectl is working correctly - -$ kubectl get pods -No resources found. -``` - -Run the following bash snippet to create our little k8s manifest generator called -kube-gen.sh. - -```shell -$ cat << 'EOF' > kube-gen.sh - -#!/usr/bin/env bash -#kube-gen.sh resource-type args -res="${1}" -shift 1 -if [[ "${res}" != namespace ]] ; then -  namespace="--namespace=example" -else -  namespace="" -fi -kubectl create "${res}" -o yaml --dry-run=client "${@}" ${namespace} |\ -egrep -v "creationTimestamp|status" -EOF -``` - -Follow the steps below to make sure that script can be invoked from the command line. - -```shell -# make the script executable -$ chmod a+x kube-gen.sh - -# let's make it available in our $PATH -$ sudo mv kube-gen.sh /usr/local/bin - -# test the script out -$ kube-gen.sh --help -Create a resource from a file or from stdin. - JSON and YAML formats are accepted. -.... -``` - -## Steps - -### Initialize a package - -```shell -# You should be under the `./blueprint` git directory. If not, check the above -# section  "Prerequisites | Repositories" - -# create a directory -$ mkdir basens - -# let's initialize the package -$ kpt pkg init basens --description "kpt package for provisioning namespace" -writing basens/Kptfile -writing basens/README.md -writing basens/package-context.yaml - -# examine the package content -$ kpt pkg tree basens -Package "basens" -├── [Kptfile]  Kptfile tenant -└── [package-context.yaml]  ConfigMap kptfile.kpt.dev -``` - -## Adding Resources - -### Namespace - -Now that we have the package initialized we are ready to add basic resources for -provisioning a namespace. - -```shell -# ensure that we are working in the basens directory -$ cd basens - -# create namespace -$ kube-gen.sh namespace example > namespace.yaml - -# you should see namespace resource -$ kpt pkg tree -Package "basens" -├── [Kptfile]  Kptfile tenant -├── [namespace.yaml]  Namespace example -└── [package-context.yaml]  ConfigMap kptfile.kpt.dev -``` - -Before we add more resources to the package, let's configure our package to -ensure that the namespace for new resources in the package is set correctly. -kpt offers a set of common functions as part of [kpt-function-catalog](https://catalog.kpt.dev) -and it has a [set-namespace](https://catalog.kpt.dev/set-namespace) function -that can be used to ensure all resources in a package use the same namespace. - -```shell -# You should be under the "./blueprint/basens" directory. -# Make sure you have kpt autocomplete enabled. -# How it works:  -# Reset your brain, assume you do not know how to use `kpt fn eval`, the goal -# is to find and add a "namespace" function. -# Press the keyboard key `tab` or `tab tab` after each flag `--type`, -# `--keywords`, `--image`, `--fn-config` to see available choices, click `tab` -# to autocomplete your choice or to see further options.  - -$ kpt fn eval --type mutator --keywords namespace --image set-namespace:v0.4.1 --fn-config package-context.yaml -[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.4.1" -[PASS] "gcr.io/kpt-fn/set-namespace:v0.4.1" in 600ms -  Results: -    [info]: namespace "example" updated to "example", 0 values changed - -# let's add `set-namespace` to rendering workflow so that it is invoked whenever -# package is rendered. -$ kpt fn eval -i set-namespace:v0.4.1 --fn-config package-context.yaml --save -t mutator -[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.4.1" -[PASS] "gcr.io/kpt-fn/set-namespace:v0.4.1" in 600ms -  Results: -    [info]: namespace "example" updated to "example", 0 values changed - Added "gcr.io/kpt-fn/set-namespace:v0.4.1" as mutator in the Kptfile. - -# Let's take a look at Kptfile to see if `set-namespace` is added in the -# rendering pipeline. -$ cat Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: -  name: basens -  annotations: -    config.kubernetes.io/local-config: "true" -info: -  description: kpt package for provisioning namespace -pipeline: -  mutators: -    - image: gcr.io/kpt-fn/set-namespace:v0.4.1 -      configPath: package-context.yaml - -# render the package to ensure we have a working package. -$ kpt fn render -Package "tenant":  -[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.4.1" -[PASS] "gcr.io/kpt-fn/set-namespace:v0.4.1" in 600ms -  Results: -    [info]: namespace "example" updated to "example", 0 values changed -Successfully executed 1 function(s) in 1 package(s). -``` - -Note: if you are curious about how KRM functions are implemented. Take a look -at [set-namespace code](https://github.com/kptdev/krm-functions-catalog/blob/master/functions/go/set-namespace/transformer/namespace.go) -to get a feel for the implementation. - -### Permissions - -Cluster roles for administering the workloads (say app-admin) will already be -created with the correct set of permissions. Organizations will have conventions -such as [example.admin@bigco.com](mailto:tenant-name-admins@mycompany.com) -(think [order-service.admin@bigco.com](mailto:order-service-admins@googlegroups.com)) -as the group name responsible for administering namespace example. So let’s -create a rolebinding that grants permissions to the workload service account and -the group [example.admin@bigco.com](mailto:tenant-name-admins@mycompany.com) for -managing this tenant. - -```shell -# create rolebinding and try out the simple value propagation scenario -$ kube-gen.sh rolebinding app-admin --clusterrole=app-admin --group=example.admin@bigco.com > rolebinding.yaml - -$ cat rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: -  name: app-admin -  namespace: example -roleRef: -  apiGroup: rbac.authorization.k8s.io -  kind: ClusterRole -  name: app-admin -subjects: -- apiGroup: rbac.authorization.k8s.io -  kind: Group -  name: example.admin@bigco.com -``` - -To enable automatic customization of this role binding for an instance of a -namespace package, we can bind the value of package instance name to the group -name in the above role binding resource. We will use the [apply-replacements function](https://catalog.kpt.dev/apply-replacements/v0.1/) -from kpt-function-catalog for binding the values. -Here is an snippet that does that: - -```shell -# get the value of package name from configmap in `package-context.yaml` -# and use it to update the name of the entry in subjects section of app-admin -# role binding with a Group kind. Save the config to update-rolebinding.yaml. -$ cat > update-rolebinding.yaml << EOF - -apiVersion: fn.kpt.dev/v1alpha1 -kind: ApplyReplacements -metadata: -  name: update-rolebinding -  annotations: -    config.kubernetes.io/local-config: "true" -replacements: -- source: -    kind: ConfigMap -    name: kptfile.kpt.dev -    fieldPath: data.name -  targets: -  - select: -      name: app-admin -      kind: RoleBinding -    fieldPaths: -    - subjects.[kind=Group].name -    options: -      delimiter: '.' -      index: 0 -EOF -``` - -Run following commands to add apply-replacements in the package rendering workflow. - -```shell -$ kpt fn eval -i apply-replacements:v0.1.1 --fn-config update-rolebinding.yaml --save -t mutator -[RUNNING] "gcr.io/kpt-fn/apply-replacements:v0.1.1" -[PASS] "gcr.io/kpt-fn/apply-replacements:v0.1.1" in 1s -Added "gcr.io/kpt-fn/apply-replacements:v0.1.1" as mutator in the Kptfile. - -# ensure our package is being rendered correctly -$ kpt fn render -``` - -### Quota - -Let’s add quota limits for this tenant. - -```shell -$ kube-gen.sh quota default --hard=cpu=40,memory=40G > resourcequota.yaml -$ kpt fn render - -$ cat resourcequota.yaml -apiVersion: v1 -kind: ResourceQuota -metadata: -  name: default -  namespace: example -spec: -  hard: -    cpu: "40" -    memory: 40G - -``` - -So with that, we should have our basic namespace provisioning package ready. -Let’s take a look at what we have: - -```shell -$ kpt pkg tree -Package "basens" -├── [Kptfile]  Kptfile basens -├── [namespace.yaml]  Namespace example -├── [package-context.yaml]  ConfigMap kptfile.kpt.dev -├── [resourcequota.yaml]  ResourceQuota example/default -├── [rolebinding.yaml]  RoleBinding example/app-admin -└── [update-rolebinding.yaml]  ApplyReplacements update-rolebinding -``` - -## Publishing the package - -Now that we have a basic namespace package in place, let's publish it so that -other users can consume it. - -```shell -$ cd .. && git add basens && git commit -am "initial pkg" -$ git push origin main - -$ git tag basens/v0 && git push origin basens/v0 -``` - -So, now the package should be available in the `blueprint` repo. Consumers -(application teams or platform team provisioning namespace on behalf of -application team) will now use this published package to create deployable -instances of it. There are different ways to create deployable instances of -this package: - -- [Use package orchestration CLI](guides/porch-user-guide.md) -- Use package orchestration UI (coming soon) -- Use kpt CLI without package orchestration as described in the next section. - -### Package Consumption Workflow (without package orchestration) - -Assuming you are onboarding a new micro-service called backend, let’s go -through the process of creating an instance of the basens package for backend. -You need to do this step in the deployment repo. - -```shell -# Redirect yourself to $DEPLOYMENT_REPO, which is created in "Prerequisites – Repositories -$ cd ../deployment - -$ kpt pkg get ${BLUEPRINT_REPO}/basens/@v0 backend --for-deployment -Package "backend": -Fetching ${BLUEPRINT_REPO}@v0 -From ${BLUEPRINT_REPO} - * tag               basens/v0  -> FETCH_HEAD -Adding package "basens". -Fetched 1 package(s). - -Customizing package for deployment. -[RUNNING] "builtins/gen-pkg-context" -[PASS] "builtins/gen-pkg-context" in 0s -  Results: -    [info]: generated package context - -Customized package for deployment. -``` - -Render the `backend` package so that the package is customized for the `backend`. - -```shell - -$ kpt fn render backend -Package "backend": -[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.4.1" -[PASS] "gcr.io/kpt-fn/set-namespace:v0.4.1" in 900ms -  Results: -    [info]: namespace "example" updated to "backend", 3 values changed -[RUNNING] "gcr.io/kpt-fn/apply-replacements:v0.1.1" -[PASS] "gcr.io/kpt-fn/apply-replacements:v0.1.1" in 1s - -Successfully executed 2 function(s) in 1 package(s). -# Important thing to note in the above output is that the `set-namespace` -# function updated the namespace for the `backend` package instance automatically. - -# examine the output of backend package -$ kpt pkg tree backend -Package "backend" -├── [Kptfile]  Kptfile backend -├── [namespace.yaml]  Namespace backend -├── [package-context.yaml]  ConfigMap kptfile.kpt.dev -├── [resourcequota.yaml]  ResourceQuota backend/default -├── [rolebinding.yaml]  RoleBinding backend/app-admin -└── [update-rolebinding.yaml]  ApplyReplacements update-rolebinding - -``` - -So with that we now have a backend service ready to be onboarded and applied to -the cluster. So the first step would be to commit and tag the backend package in -the deployment repo. - -```shell -# assuming you are in deployment repo - -$ git add backend && git commit -am "initial pkg for deployment" -$ git push origin main - -# tag the package -$ git tag backend/v0 main && git push origin backend/v0 - -``` - -## Deploy the package in kubernetes cluster - -Now let’s deploy the package using kpt live: - -```shell -# assuming you are in the deployment directory - -$ kpt live init backend -initializing Kptfile inventory info (namespace: backend)...success - -$ kpt live apply backend -namespace/backend unchanged -namespace/backend reconciled -resourcequota/default created -rolebinding.rbac.authorization.k8s.io/app-admin created -3 resource(s) applied. 2 created, 1 unchanged, 0 configured, 0 failed -resourcequota/default reconcile pending -rolebinding.rbac.authorization.k8s.io/app-admin reconcile pending -resourcequota/default reconciled -rolebinding.rbac.authorization.k8s.io/app-admin reconciled -3 resource(s) reconciled, 0 skipped, 0 failed to reconcile, 0 timed out -``` - -## References - -[Kubernetes RBAC reference documentation](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) diff --git a/site/guides/namespace-provisioning-ui.md b/site/guides/namespace-provisioning-ui.md deleted file mode 100644 index 3a78b9ecb3..0000000000 --- a/site/guides/namespace-provisioning-ui.md +++ /dev/null @@ -1,176 +0,0 @@ -# Namespace provisioning using UI - -This guide will teach us how to create a kpt package from scratch using Config -as Data UI. We will also learn how to enable customization of the package with -minimal steps for package consumers and deploy the package to a Kubernetes -cluster. - -## What package are we creating? - -Onboarding a new application or a micro-service is a very common task for a -platform team. It involves provisioning a dedicated namespace (and other -associated resources) where all resources that belong to the application reside. -In this guide, we will create a package that will be used for provisioning a -namespace. - -## Prerequisites - -Before we begin, ensure that you can access the Config as Data UI. The UI is -provided as a [Backstage](https://backstage.io) plugin and can be accessed at -`[BACKSTAGE_BASE_URL]/config-as-data`. - -_If you don't have a UI installed, follow the steps in the -[UI installation guide](guides/porch-ui-installation.md) to install the UI._ - -You will also need two new git repositories. The first repository will be where -the reusable kpt packages will live. The second repository is where the -instances of packages that will be deployed to a Kubernetes cluster will live. -Users will create deployable packages from the packages in the blueprint repo. - -## Repository Registration - -### Registering blueprint repository - -Start by clicking the **Register Repository** link on the Team Blueprints card -to register a blueprint repository. Enter the following details in the Register -Repository flow: - -- In the Repository Details section, the Repository URL is the clone URL from - your repository. Branch and directory can be left blank. Branch will default - to "main" and directory will default to "/". -- In the Repository Authentication section, you will need to use the GitHub - Personal Access Token (unless your repository allows for unauthenticated - writes). GitHub Personal Access Tokens can be created at - , and must include the 'repo' scope. -- In the Repository Content section, select "Team Blueprints". - -Once the repository is registered, use the breadcrumbs (upper left) to navigate -to the **Package Management** screen. - -### Registering deployment repository - -Start by clicking the **Register Repository** link on the Deployments card to -register a deployment repository. Enter the following details in the Register -Repository flow: - -- In the Repository Details section, the Repository URL is the clone URL from - your repository. Branch and Directory can be left blank. Branch will default - to "main", and directory will default to "/". -- In the Repository Authentication section, either create a new secret, or - optionally select the same secret in the Authentication Secret dropdown you - created for registering the blueprint repository. -- In the Repository Content section, select "Deployments". - -Once the repository is created, use the breadcrumbs (upper left) to navigate to -the **Package Management** screen. - -## Creating a Blueprint from scratch - -Now that we have our repositories registered, we are ready to create the simple -namespace team blueprint using the UI. - -- From the **Package Management** screen, click the **Team Blueprints →** link. -- Clicking the link will take you to a Team Blueprints screen where you can view - and add team blueprints. -- Click the **ADD TEAM BLUEPRINT** button in the upper right corner to create a - new team blueprint. -- On the Add Team Blueprint screen: - - Choose "Create a new team blueprint from scratch". - - Click Next to proceed to the Metadata section. - - Set the team blueprint name to "simplens". - - Click Next to proceed to the Namespace section. - - Check the "Add namespace resource to the team blueprint" checkbox. Checking - this checkbox will automatically add a Namespace resource to the team - blueprint. - - Set namespace option to "Set the namespace to the name of the deployment - instance". This option will set the name of the namespace equal to the name - of the deployment package when a deployment package is created/cloned from - this team blueprint by adding the set-namespace mutator to the Kptfile - resource. Since we are creating a team blueprint, the namespace will be set - to "example". - - Click Next to proceed to the Validate Resources section. - - Click Next to proceed to the Confirm section. - - Click the **CREATE TEAM BLUEPRINT** button. -- The next screen is the package editor screen for the new _Draft_ team - blueprint package you have just created. Here we will want to add a few - resources to complete the team blueprint. - - Click the **EDIT** button to allow the team blueprint to be updated. - - Click the **ADD BUTTON** button and add a new Role Binding resource. - - In the Resource Metadata section, name the resource "app-admin". - - In Role Reference section, set the kind to "Cluster Role" and name to - "app-admin" . - - Click the **ADD SUBJECT** button, and in the newly added subject section, - set the kind to "Group" and name to "example.admin@bigco.com". - - Click the **SAVE** button to close the add resource dialog. - - Click the **ADD BUTTON** button and add a new Apply Replacements resource. - - In the Resource Metadata section, name the resource "update-rolebinding" - - In the Source section, set the source resource as "ConfigMap: - kptfile.kpt.dev" and source path to "data.name: example" - - In the Target section, set the target resource to "RoleBinding: - app-admin", the target path to "subjects.0.name: example.admin@bigco.com". - Set the replacement value option to "Partial value", delimiter to "period - (.)", and replace to "example". - - Click the **SAVE** button to close the add resource dialog. - - Click the **ADD BUTTON** button and add a new Resource Quota resource. - - In the Resource Metadata section, name the resource "base". - - In the Compute Resources section, set Max CPU Requests to "40" and Max - Memory Requests to "40G". - - Click the **SAVE** button to close the add resource dialog. - - Click the **SAVE** button on the upper right corner of the screen. -- This will bring you back to the team blueprint screen. The team blueprint is - still in _Draft_ status so we will need to publish it to make it available for - deployment. - - Click the **PROPOSE** button to propose the simplens team blueprint package - for review. - - It will change to **APPROVE** momentarily. Click that button to publish the - simplens team blueprint. -- Using the breadcrumbs, click back to view your blueprints repository - here - you should see the blueprint you just created has been published. - -This completes the simplens team blueprint. The next section shows how -deployable instances can be created using this team blueprint. - -## Create a deployable instance of the team blueprint - -In this section, we will walk through creating a deployable instance of the -simplens team blueprint. - -- From the **Package Management** screen, click the **Team Blueprints →** link. -- Here you should see the "simplens" team blueprint created in the section - above. -- Click the "simplens" team blueprint row to view the blueprint. -- Click the **CLONE** button. -- In the **Clone simplens** screen: - - Choose "Create a new deployment by cloning the simplens team blueprint" - option. - - Click Next to proceed to the Metadata section. - - Update the deployment name to "backend". - - Click Next to proceed to the Namespace section. - - Click Next to proceed to the Validate Resources section. - - Click Next to proceed to the Confirm section. - - Click the **CREATE DEPLOYMENT** button. -- The next screen is the package editor screen for the new _Draft_ deployment - package you have just created. Note that the namespace across all the - namespace scoped resources has been updated to the name of the package. - - Click the **DIFF** button for any resource to view the differences between - the resource and the same resource in the upstream simplens team blueprint. - For many of the deployable resources, only the namespace will be updated. - For the app-admin RoleBiding resource, the group binding has also been - updated by the Apply Replacements resource. -- We need to publish the deployment package to make it available for deployment. - - Before moving the deployment to _Proposed_, you can make changes by editing - the deployment and adding, removing, and updating resources. - - Click the **PROPOSE** button to propose the backend deployment package for - review. - - It will change to **APPROVE** momentarily. Click that button to publish the - backend deployment package. -- Once the deployment package is published, click the **CREATE SYNC** button to - have _Config Sync_ sync the deployment to the Kubernetes cluster. - - After a few seconds, you will see the Sync status update in the upper - right-hand corner. -- Navigating back to the deployment repository the _SYNC STATUS_ column shows - the status of each deployment package. - -This completes our end-to-end workflow of creating a blueprint from scratch and -deploying a variant of the blueprint to a Kubernetes cluster using the Config as -Data UI. diff --git a/site/guides/porch-installation.md b/site/guides/porch-installation.md deleted file mode 100644 index 6fad9660a2..0000000000 --- a/site/guides/porch-installation.md +++ /dev/null @@ -1,266 +0,0 @@ -# Installing Porch - -You can install Porch by either using one of the -[released versions](https://github.com/kptdev/kpt/releases), or -building Porch from sources. - -## Prerequisites - -Note: Porch should run on any kubernetes cluster and should work on any cloud. -We have just started by documenting one known-good configuration: GCP and GKE. -We would welcome comparable installation instructions or feedback from people -that try it out on other clouds / configurations. - -To run one of the [released versions](https://github.com/kptdev/kpt/releases) -of Porch on GKE, you will need: - -* A [GCP Project](https://console.cloud.google.com/projectcreate) -* [gcloud](https://cloud.google.com/sdk/docs/install) -* [kubectl](https://kubernetes.io/docs/tasks/tools/); you can install it via - `gcloud components install kubectl` -* [kpt](https://kpt.dev/) -* Command line utilities such as `curl`, `tar` - -To build and run Porch on GKE, you will also need: - -* A container registry which will work with your GKE cluster. - [Artifact Registry](https://console.cloud.google.com/artifacts) - or [Container Registry](https://console.cloud.google.com/gcr) work well - though you can use others too. -* [go 1.17](https://go.dev/dl/) or newer -* [docker](https://docs.docker.com/get-docker/) -* [Configured docker credential helper](https://cloud.google.com/sdk/gcloud/reference/auth/configure-docker) -* [git](https://git-scm.com/) -* [make](https://www.gnu.org/software/make/) - -## Getting Started - -Make sure your `gcloud` is configured with your project (alternatively, you can -augment all following `gcloud` commands below with `--project` flag): - -```sh -gcloud config set project YOUR_GCP_PROJECT -``` - -Select a GKE cluster or create a new one: - -```sh -gcloud services enable container.googleapis.com -gcloud container clusters create-auto --region us-central1 porch-dev -``` - -**Note:** For development of Porch, in particular for running Porch tests, -Standard GKE cluster is currently preferable. Select a -[GCP region](https://cloud.google.com/compute/docs/regions-zones#available) - that works best for your needs: - - ```sh -gcloud services enable container.googleapis.com -gcloud container clusters create --region us-central1 porch-dev -``` - -And ensure `kubectl` is targeting your GKE cluster: - -```sh -gcloud container clusters get-credentials --region us-central1 porch-dev -``` - -## Run Released Version of Porch - -To run a released version of Porch, download the release config bundle from -[Porch release page](https://github.com/kptdev/kpt/releases); -please note you'll need to scroll past recent kpt releases to the most -recent `porch/...` release. - -Untar and apply the `deployment-blueprint.tar.gz` config bundle. This will install: - -* Porch server -* [Config Sync](https://kpt.dev/gitops/configsync/) - -```sh -mkdir porch-install -tar xzf ~/Downloads/deployment-blueprint.tar.gz -C porch-install -kubectl apply -f porch-install -kubectl wait deployment --for=condition=Available porch-server -n porch-system -``` - -You can verify that Porch is running by querying the `api-resources`: - -```sh -kubectl api-resources | grep porch -``` -Expected output will include: - -``` -repositories config.porch.kpt.dev/v1alpha1 true Repository -functions porch.kpt.dev/v1alpha1 true Function -packagerevisionresources porch.kpt.dev/v1alpha1 true PackageRevisionResources -packagerevisions porch.kpt.dev/v1alpha1 true PackageRevision -``` - -To install ConfigSync: - -```sh -echo " -apiVersion: configmanagement.gke.io/v1 -kind: ConfigManagement -metadata: - name: config-management -spec: - enableMultiRepo: true -" | kubectl apply -f - -``` - -You can start [using Porch](guides/porch-user-guide.md). - -## Run Custom Build of Porch - -To run custom build of Porch, you will need additional [prerequisites](#prerequisites). -The commands below use [Google Container Registry](https://console.cloud.google.com/gcr). - -Clone this repository into `${GOPATH}/src/github.com/kptdev/kpt`. - -```sh -git clone https://github.com/kptdev/kpt.git "${GOPATH}/src/github.com/kptdev/kpt" -``` - -[Configure](https://cloud.google.com/sdk/gcloud/reference/auth/configure-docker) -docker credential helper for your repository - -If your use case doesn't require Porch to interact with GCP container registries, -you can build and deploy Porch by running the following command. It will build and -push Porch Docker images into (by default) Google Container Registry named (example -shown is the Porch server image): - -`gcr.io/YOUR-PROJECT-ID/porch-server:SHORT-COMMIT-SHA` - - -```sh -IMAGE_TAG=$(git rev-parse --short HEAD) make push-and-deploy-no-sa -``` - -If you want to use different repository, you can set `IMAGE_REPO` variable -(see [Makefile](https://github.com/nephio-project/porch/blob/main/Makefile#L38) -for details). - -The `make push-and-deploy-no-sa` target will install Porch but not Config Sync. -You can install Config Sync in your k8s cluster manually following the -[documentation](https://github.com/kptdev/kpt-config-sync/blob/main/docs/installation.md). - -**Note**: The `-no-sa` (no service account) targets create Porch deployment -configuration which does not associate Kubernetes service accounts with GCP -service accounts. This is sufficient for Porch to integate with Git repositories -using Basic Auth, for example GitHub. - -As above, you can verify that Porch is running by querying the `api-resources`: - -```sh -kubectl api-resources | grep porch -``` - -And start [using Porch](guides/porch-user-guide.md) if the Porch resources are -available. - -### Workload Identity - -[Workload Identity](https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity) -is a simple way to access Google Cloud services from porch. - -#### Google Cloud Source Repositories - -[Cloud Source Repositories](https://cloud.google.com/source-repositories) can be access using -workload identity, removing the need to store credentials in the cluster. - -To set it up, create the necessary service accounts and give it the required roles: - -```sh -GCP_PROJECT_ID=$(gcloud config get-value project) - -# Create GCP service account (GSA) for Porch server. -gcloud iam service-accounts create porch-server - -# We want to create and delete images. Assign IAM roles to allow repository -# administration. -gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \ - --member "serviceAccount:porch-server@${GCP_PROJECT_ID}.iam.gserviceaccount.com" \ - --role "roles/source.admin" - -gcloud iam service-accounts add-iam-policy-binding porch-server@${GCP_PROJECT_ID}.iam.gserviceaccount.com \ - --role roles/iam.workloadIdentityUser \ - --member "serviceAccount:${GCP_PROJECT_ID}.svc.id.goog[porch-system/porch-server]" - -# We need to associate the Kubernetes Service Account (KSA) -# with the GSA by annotating the KSA. -kubectl annotate serviceaccount porch-server -n porch-system \ - iam.gke.io/gcp-service-account=porch-server@${GCP_PROJECT_ID}.iam.gserviceaccount.com -``` - -Build Porch, push images, and deploy porch server and controllers using the -`make` target that adds workload identity service account annotations: - -```sh -IMAGE_TAG=$(git rev-parse --short HEAD) make push-and-deploy -``` - -As above, you can verify that Porch is running by querying the `api-resources`: - -```sh -kubectl api-resources | grep porch -``` - -To register a repository, use the following command: -```sh -kpt alpha repo register --repo-workload-identity --namespace=default https://source.developers.google.com/p//r/ -``` - -#### OCI - -To integrate with OCI repositories such as -[Artifact Registry](https://console.cloud.google.com/artifacts) or -[Container Registry](https://console.cloud.google.com/gcr), Porch relies on -[workload identity](https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity). - -For that use case, create service accounts and assign roles: - -```sh -GCP_PROJECT_ID=$(gcloud config get-value project) - -# Create GCP service account for Porch server. -gcloud iam service-accounts create porch-server -# Create GCP service account for Porch sync controller. -gcloud iam service-accounts create porch-sync - -# We want to create and delete images. Assign IAM roles to allow repository -# administration. -gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \ - --member "serviceAccount:porch-server@${GCP_PROJECT_ID}.iam.gserviceaccount.com" \ - --role "roles/artifactregistry.repoAdmin" - -gcloud iam service-accounts add-iam-policy-binding porch-server@${GCP_PROJECT_ID}.iam.gserviceaccount.com \ - --role roles/iam.workloadIdentityUser \ - --member "serviceAccount:${GCP_PROJECT_ID}.svc.id.goog[porch-system/porch-server]" - -gcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \ - --member "serviceAccount:porch-sync@${GCP_PROJECT_ID}.iam.gserviceaccount.com" \ - --role "roles/artifactregistry.reader" - -gcloud iam service-accounts add-iam-policy-binding porch-sync@${GCP_PROJECT_ID}.iam.gserviceaccount.com \ - --role roles/iam.workloadIdentityUser \ - --member "serviceAccount:${GCP_PROJECT_ID}.svc.id.goog[porch-system/porch-controllers]" -``` - -Build Porch, push images, and deploy porch server and controllers using the -`make` target that adds workload identity service account annotations: - -```sh -IMAGE_TAG=$(git rev-parse --short HEAD) make push-and-deploy -``` - -As above, you can verify that Porch is running by querying the `api-resources`: - -```sh -kubectl api-resources | grep porch -``` - -And start [using Porch](guides/porch-user-guide.md) if the Porch resources are -available. diff --git a/site/guides/porch-ui-installation.md b/site/guides/porch-ui-installation.md deleted file mode 100644 index df604e79e2..0000000000 --- a/site/guides/porch-ui-installation.md +++ /dev/null @@ -1,143 +0,0 @@ -# Accessing the Configuration as Data UI - -You can access the Configuration as Data UI UI either by running the UI on a -cluster or integrating the UI into an existing Backstage installation. - -## Prerequisites - -To access the Configuration as Data UI, you will need: - -- [Porch](guides/porch-installation.md) installed on a Kubernetes cluster -- [kubectl](https://kubernetes.io/docs/tasks/tools/) targeting the Kubernetes - cluster with Porch installed -- [kpt CLI](https://kpt.dev/installation/kpt-cli) installed - -## Running on a GKE cluster - -This setup assumes that you have a GKE cluster up and running with Porch installed, and that -your current kube context is set to that GKE cluster. We would welcome contributions or feedback -from people that have set this up in other clouds outside of GKE. - -First, create a namespace called `backstage`: - -```sh -kubectl create namespace backstage -``` - -Second, Google OAuth Credentials will need to be created to allow the UI to use -Google authentication to authenticate users with the UI and to the Kubernetes -API Server. - -To create the Google OAuth Credentials: - -1. Sign in to the [Google Console](https://console.cloud.google.com) -2. Select or create a new project from the dropdown menu on the top bar -3. Navigate to - [APIs & Services > Credentials](https://console.cloud.google.com/apis/credentials) -4. Click **Create Credentials** and choose `OAuth client ID` -5. Configure an OAuth consent screen, if required - - For scopes, select `openid`, `auth/userinfo.email`, - `auth/userinfo.profile`, and `auth/cloud-platform`. - - Add any users that will want access to the UI if using External user type -6. Set **Application Type** to `Web Application` with these settings: - - `Name`: Config as Data UI (or any name you prefer) - - `Authorized JavaScript origins`: http://localhost:7007 - - `Authorized redirect URIs`: - http://localhost:7007/api/auth/google/handler/frame -7. Click Create -8. Copy the Client ID and Client secret displayed - -We will now need to add the credentials as a secret to the cluster. Be sure to -replace the PLACEHOLDER values prior to executing: - -```sh -kubectl create secret generic -n backstage cad-google-oauth-client --from-literal=client-id=CLIENT_ID_PLACEHOLDER --from-literal=client-secret=CLIENT_SECRET_PLACEHOLDER -``` - -Next, find a published image in the -[kpt-dev/kpt-backstage-plugins container registry](https://console.cloud.google.com/gcr/images/kpt-dev/global/kpt-backstage-plugins/backstage-plugin-cad?project=kpt-dev). -For this example, we will use -`gcr.io/kpt-dev/kpt-backstage-plugins/backstage-plugin-cad:v0.1.3`. - -Now, run the following command to set up the backstage deployment and service. -Change the image name and tag in the `newName` and `newTag` flags in the below -`kpt fn eval` command to the ones you would like to use: - -```sh -echo " -apiVersion: apps/v1 -kind: Deployment -metadata: - name: backstage - namespace: backstage -spec: - replicas: 1 - selector: - matchLabels: - app: backstage - template: - metadata: - labels: - app: backstage - spec: - containers: - - name: backstage - image: backstage - ports: - - name: http - containerPort: 7007 - env: - - name: AUTH_GOOGLE_CLIENT_ID - valueFrom: - secretKeyRef: - name: cad-google-oauth-client - key: client-id - optional: false - - name: AUTH_GOOGLE_CLIENT_SECRET - valueFrom: - secretKeyRef: - name: cad-google-oauth-client - key: client-secret - optional: false ---- -apiVersion: v1 -kind: Service -metadata: - name: backstage - namespace: backstage -spec: - selector: - app: backstage - ports: - - name: http - port: 7007 - targetPort: http -" | kpt fn eval "" -o unwrap --image set-image:v0.1.0 -- \ -name=backstage newName=gcr.io/kpt-dev/kpt-backstage-plugins/backstage-plugin-cad newTag=v0.1.3 | \ -kubectl apply -f - -``` - -In your cluster, confirm the backstage deployment is ready and available: - -```sh -kubectl get deployment -n backstage backstage -``` - -Forward port 7007 locally to access backstage. It is important that you do not map this port to another port -as this will cause Backstage and the OAuth client to fail. - -```sh -kubectl port-forward --namespace=backstage svc/backstage 7007 -``` - -Open the plugin by browsing to `localhost:7007/config-as-data`. On the plugin, you will need to sign in to your -Google account so that the plugin can access your GKE cluster. - -## Running in Backstage - -This setup is intended for those installing the plugin into existing backstage deployments. - -The Configuration as Data UI can be added to an existing -[Backstage](https://backstage.io) application by following the instructions on -the -[Configuration as Data Plugin README](https://github.com/GoogleContainerTools/kpt-backstage-plugins/tree/main/plugins/cad/README.md). diff --git a/site/guides/porch-user-guide.md b/site/guides/porch-user-guide.md deleted file mode 100644 index 02917987fd..0000000000 --- a/site/guides/porch-user-guide.md +++ /dev/null @@ -1,522 +0,0 @@ -# Porch User Guide - -This document is focused on using Porch via the `kpt` CLI. - -Installation of Porch, including prerequisites, is covered in a -[dedicated document](guides/porch-installation.md). - -## Prerequisites - -To use Porch, you will need: - -* [`kpt`](https://kpt.dev) -* [`gcloud`](https://cloud.google.com/sdk/gcloud) (if running on GKE) -* [`kubectl`](https://kubernetes.io/docs/tasks/tools/#kubectl) - -Make sure that your `kubectl` context is set up for `kubectl` to interact with the -correct Kubernetes instance (see -[installation instructions](guides/porch-installation.md) or -the [running-locally](https://docs.nephio.org/docs/porch/running-porch/running-locally/) guide for details). - -To check whether `kubectl` is configured with your Porch cluster (or local instance), run: - -```sh -kubectl api-resources | grep porch -``` - -You should see the following four resourceds listed: - -``` -repositories config.porch.kpt.dev/v1alpha1 true Repository -packagerevisionresources porch.kpt.dev/v1alpha1 true PackageRevisionResources -packagerevisions porch.kpt.dev/v1alpha1 true PackageRevision -functions porch.kpt.dev/v1alpha1 true Function -``` - -## Porch Resources - -Porch server manages the following resources: - -1. `repositories`: a repository (Git or OCI) can be registered with Porch to support - discovery or management of KRM configuration packages in those repositories, - or discovery of KRM functions in those repositories. -2. `packagerevisions`: a specific revision of a KRM configuration package - managed by Porch in one of the registered repositories. This resource - represents a _metadata view_ of the KRM configuration package. -3. `packagerevisionresources`: this resource represents the contents of the - configuration package (KRM resources contained in the package) -4. `functions`: function resource represents a KRM function discovered in a repository - registered with Porch. Functions are only supported with OCI repositories. - -Note that `packagerevisions` and `packagerevisionresources` represent different -_views_ of the same underlying KRM configuration package. `packagerevisions` -represents the package metadata, and `packagerevisionresources` represents the -package content. The matching resources share the same `name` (as well as API -group and version: `porch.kpt.dev/v1alpha1`) and differ in resource kind -(`PackageRevision` and `PackageRevisionResources` respectively). - -## Repository Registration - -To use Porch with a Git repository, you will need: - -* A Git repository for your blueprints. -* A [Personal Access Token](https://github.com/settings/tokens) (when using - GitHub repository) for Porch to authenticate with the repository. Porch requires - the 'repo' scope. -* Or Basic Auth credentials for Porch to authenticate with the repository. - -To use Porch with an OCI repository -([Artifact Registry](https://console.cloud.google.com/artifacts) or -[Google Container Registry](https://cloud.google.com/container-registry)), first -make sure to: -* Enable [workload identity](guides/porch-installation.md#workload-identity) for Porch -* Assign appropriate roles to the Porch workload identity service account - (`iam.gke.io/gcp-service-account=porch-server@$(GCP_PROJECT_ID).iam.gserviceaccount.com`) - to have appropriate level of access to your OCI repository. - -Use the `kpt alpha repo register` command to register your repository with Porch: - -```sh -# Register a Git repository: - -GITHUB_USERNAME= -GITHUB_TOKEN= - -$ kpt alpha repo register \ - --namespace default \ - --repo-basic-username=${GITHUB_USERNAME} \ - --repo-basic-password=${GITHUB_TOKEN} \ - https://github.com/${GITHUB_USERNAME}/blueprints.git -``` - -All command line flags supported: - -* `--directory` - Directory within the repository where to look for packages. -* `--branch` - Branch in the repository where finalized packages are committed. - (defaults to `main`) -* `--name` - Name of the package repository Kubernetes resource. If unspecified, - will default to the name portion (last segment) of the repository URL - (`blueprint` in the example above) -* `--description` - Brief description of the package repository. -* `--deployment` - Boolean value; If specified, repository is a deployment - repository; published packages in a deployment repository are considered - deployment-ready. -* `--repo-basic-username` - Username for repository authentication using basic auth. -* `--repo-basic-password` - Password for repository authentication using basic auth. - -Additionally, common `kubectl` command line flags for controlling aspects of -interaction with the Kubernetes apiserver, logging, and more (this is true for -all `kpt` CLI commands which interact with Porch). - -Use the `kpt alpha repo get` command to query registered repositories: - -```sh -# Query registered repositories -$ kpt alpha repo get - -NAME TYPE CONTENT DEPLOYMENT READY ADDRESS -blueprints git Package True https://github.com/platkrm/blueprints.git -deployments git Package true True https://github.com/platkrm/deployments.git -``` - -The `kpt alpha get` commands support common `kubectl` -[flags](https://kubernetes.io/docs/reference/kubectl/cheatsheet/#formatting-output) -to format output, for example `kpt alpha repo get --output=yaml`. - -The command `kpt alpha repo unregister` can be used to unregister a repository: - -```sh -# Unregister a repository -$ kpt alpha repo unregister deployments --namespace default -``` - -## Package Discovery And Introspection - -The `kpt alpha rpkg` command group contains commands for interacting with -packages managed by the Package Orchestration service. the `r` prefix used -in the command group name stands for 'remote'. - -The `kpt alpha rpkg get` command list the packages in registered repositories: - -```sh -# List package revisions in registered repositories -$ kpt alpha rpkg get - -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -blueprints-0349d71330b89ee48ac85167598ef23021fd0484 basens main main false Published blueprints -blueprints-2e47615fda05664491f72c58b8ab658683afa036 basens v1 v1 true Published blueprints -blueprints-7e2fe44bfdbb744d49bdaaaeac596200102c5f7c istions main main false Published blueprints -blueprints-ac6e872be4a4a3476922deca58cca3183b16a5f7 istions v1 v1 false Published blueprints -blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 istions v2 v2 true Published blueprints -... -``` - -The `LATEST` column indicates whether the package revision is the latest among -the revisions of the same package. In the output above, `v2` is the latest -revision of `istions` package and `v1` is the latest revision of `basens` -package. - -The `LIFECYCLE` column indicates the lifecycle stage of the package revision, -one of: `Published`, `Draft` or `Proposed`. - -The `REVISION` column indicates the revision of the package. Revisions are -assigned when a package is `Published` and starts at `v1`. - -The `WORKSPACENAME` column indicates the workspace name of the package. The -workspace name is assigned when a draft revision is created and is used as the -branch name for proposed and draft package revisions. The workspace name must be -must be unique among package revisions in the same package. - -*Note* on package revision names. Packages exist in a hierarchical directory -structure maintained by the underlying repository such as git, or in a -filesystem bundle of OCI images. The hierarchical, filesystem-compatible names -of packages do not satisfy the Kubernetes naming -[constraints](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). -Therefore, the names of the Kubernetes resources representing package revisions -are computed as a hash. - -Simple filtering of package revisions by name (substring) and revision (exact -match) is supported by the CLI using `--name` and `--revision` flags: - -```sh -# List package with `istio` in the package name, and `v2` revision -$ kpt alpha rpkg get --name istio --revision=v2 - -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 istions v2 v2 true Published blueprints -``` - -The common `kubectl` flags that control output format are available as well: - -```sh -# Get the package revision in YAML format -$ kpt alpha rpkg get blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 -ndefault -oyaml - -apiVersion: porch.kpt.dev/v1alpha1 -kind: PackageRevision -metadata: - labels: - kpt.dev/latest-revision: "true" - name: blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 - namespace: default -spec: - lifecycle: Published - packageName: istions - repository: blueprints - revision: v2 - workspaceName: v2 -... -``` - -The `kpt alpha rpkg pull` command can be used to read the package resources. - -The command can be used to print the package revision resources as -`ResourceList` to `stdout`, which enables -[chaining](https://kpt.dev/book/04-using-functions/02-imperative-function-execution?id=chaining-functions-using-the-unix-pipe) -evaluation of functions on the package revision pulled from the Package -Orchestration server. - -```sh -# Pull package revision resources, output as ResourceList to stdout -$ kpt alpha rpkg pull blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 -ndefault - -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -- apiVersion: kpt.dev/v1 - kind: Kptfile - metadata: - name: istions -... -``` - -Or, the package contents can be saved on local disk for direct introspection -or editing: - -```sh -# Pull package revision resources, save to local disk into `./istions` directory -$ kpt alpha rpkg pull blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 ./istions -ndefault - -# Explore the package contents -$ find istions - -istions -istions/istions.yaml -istions/README.md -istions/Kptfile -istions/package-context.yaml -... -``` - -## Authoring Packages - -Several commands in the `kpt alpha rpkg` group support package authoring: - -* `init` - Initializes a new package revision in the target repository. -* `clone` - Creates a clone of a source package in the target repository. -* `copy` - Creates a new package revision from an existing one. -* `push` - Pushes package resources into a remote package. -* `del` - Deletes one or more packages in registered repositories. - - -The `kpt alpha rpkg init` command can be used to initialize a new package -revision. Porch server will create and initialize a new package (as a draft) -and save it in the specified repository. - -```sh -# Initialize a new (empty) package revision: -$ kpt alpha rpkg init new-package --repository=deployments --workspace=v1 -ndefault - -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 created - -# List the available package revisions. -$ kpt alpha rpkg get - -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 false Draft deployments -... -``` - -The new package is created in the `Draft` lifecycle stage. This is true also for -all commands that create new package revision (`init`, `clone` and `copy`). - -Additional flags supported by the `kpt alpha rpkg init` command are: - -* `--repository` - Repository in which the package will be created. -* `--workspace` - Workspace of the new package. -* `--description` - Short description of the package. -* `--keywords` - List of keywords for the package. -* `--site` - Link to page with information about the package. - - -Use `kpt alpha rpkg clone` command to create a _downstream_ package by cloning -an _upstream_ package: - -```sh -# Clone an upstream package to create a downstream package -$ kpt alpha rpkg clone blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 istions-clone \ - --repository=deployments -ndefault -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 created - -# Confirm the package revision was created -kpt alpha rpkg get deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 -ndefault -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 istions-clone v1 false Draft deployments -``` - -`kpt alpha rpkg clone` can also be used to clone packages that are in -repositories not registered with Porch, for example: - -```sh -# Clone a package from Git repository directly (repository is not registered) -$ kpt alpha rpkg clone \ - https://github.com/GoogleCloudPlatform/blueprints.git cloned-bucket \ - --directory=catalog/bucket \ - --ref=main \ - --repository=deployments \ - --namespace=default -deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac created - -# Confirm the package revision was created -kpt alpha rpkg get deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac -ndefault -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac cloned-bucket v1 false Draft deployments -``` - -The flags supported by the `kpt alpha rpkg clone` command are: - -* `--directory` - Directory within the upstream repository where the upstream - package is located. -* `--ref` - Ref in the upstream repository where the upstream package is - located. This can be a branch, tag, or SHA. -* `--repository` - Repository to which package will be cloned (downstream - repository). -* `--workspace` - Workspace to assign to the downstream package. -* `--strategy` - Update strategy that should be used when updating this package; - one of: `resource-merge`, `fast-forward`, `force-delete-replace`. - - -The `kpt alpha rpkg copy` command can be used to create a new revision of an -existing package. It is a means to modifying an already published package -revision. - -```sh -# Create a new revision of an existing package -$ kpt alpha rpkg copy \ - blueprints-421a5b5e43b03bc697d96f471929efc6ba3f54b3 \ - --workspace=v3 -ndefault - -# Confirm the package revision was created -$ kpt alpha rpkg get blueprints-bf11228f80de09f1a5dd9374dc92ebde3b503689 -ndefault -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -blueprints-bf11228f80de09f1a5dd9374dc92ebde3b503689 istions v3 false Draft blueprints -``` - -The `kpt alpha rpkg push` command can be used to update the resources (package -contents) of a package _draft_: - -```sh -# Pull package draft contents into a local directory -$ kpt alpha rpkg pull \ - deployments-c32b851b591b860efda29ba0e006725c8c1f7764 ./new-package -ndefault - -# Make edits using your favorite YAML editor, for example adding a new resource -$ cat < ./new-package/config-map.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: example-config-map -data: - color: orange -EOF - -# Push the updated contents to the Package Orchestration server, updating the -# package contents. -$ kpt alpha rpkg push \ - deployments-c32b851b591b860efda29ba0e006725c8c1f7764 ./new-package -ndefault - -# Confirm that the remote package now includes the new ConfigMap resource -$ kpt alpha rpkg pull deployments-c32b851b591b860efda29ba0e006725c8c1f7764 -ndefault - -apiVersion: config.kubernetes.io/v1 -kind: ResourceList -items: -... -- apiVersion: v1 - kind: ConfigMap - metadata: - name: example-config-map - data: - color: orange -... -``` - -Package revision can be deleted using `kpt alpha rpkg del` command: - -```sh -# Delete package revision -$ kpt alpha rpkg del blueprints-bf11228f80de09f1a5dd9374dc92ebde3b503689 -ndefault - -blueprints-bf11228f80de09f1a5dd9374dc92ebde3b503689 deleted -``` - -## Package Lifecycle and Approval Flow - -Authoring is performed on the package revisions in the _Draft_ lifecycle stage. -Before a package can be deployed or cloned, it must be _Published_. The approval -flow is the process by which the package is advanced from _Draft_ state through -_Proposed_ state and finally to _Published_ lifecycle stage. - -The commands used to manage package lifecycle stages include: - -* `propose` - Proposes to finalize a package revision draft -* `approve` - Approves a proposal to finalize a package revision. -* `reject` - Rejects a proposal to finalize a package revision - -In the [Authoring Packages](#authoring-packages) section above we created -several _draft_ packages and in this section we will create proposals for -publishing some of them. - -```sh -# List package revisions to identify relevant drafts: -$ kpt alpha rpkg get -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -... -deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac cloned-bucket v1 false Draft deployments -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 istions-clone v1 false Draft deployments -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 false Draft deployments - -# Propose two package revisions to be be published -$ kpt alpha rpkg propose \ - deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 \ - deployments-c32b851b591b860efda29ba0e006725c8c1f7764 \ - -ndefault - -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 proposed -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 proposed - -# Confirm the package revisions are now Proposed -$ kpt alpha rpkg get -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -... -deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac cloned-bucket v1 false Draft deployments -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 istions-clone v1 false Proposed deployments -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 false Proposed deployments -``` - -At this point, a person in _platform administrator_ role, or even an automated -process, will review and either approve or reject the proposals. To aid with the -decision, the platform administrator may inspect the package contents using the -commands above, such as `kpt alpha rpkg pull`. - -```sh -# Approve a proposal to publish a package revision -$ kpt alpha rpkg approve deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 -ndefault -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 approved - -# Reject a proposal to publish a package revision -$ kpt alpha rpkg reject deployments-c32b851b591b860efda29ba0e006725c8c1f7764 -ndefault -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 rejected -``` - -Now the user can confirm lifecycle stages of the package revisions: - -```sh -# Confirm package revision lifecycle stages after approvals: -$ kpt alpha rpkg get -NAME PACKAGE WORKSPACENAME REVISION LATEST LIFECYCLE REPOSITORY -... -deployments-e06c2f6ec1afdd8c7d977fcf204e4d543778ddac cloned-bucket v1 false Draft deployments -deployments-11ca1db650fa4bfa33deeb7f488fbdc50cdb3b82 istions-clone v1 v1 true Published deployments -deployments-c32b851b591b860efda29ba0e006725c8c1f7764 new-package v1 false Draft deployments -``` - -Observe that the rejected proposal returned the package revision back to _Draft_ -lifecycle stage. The package whose proposal was approved is now in _Published_ -state. - -## Deploying a Package - -Commands used in the context of deploying a package include are in the -`kpt alpha sync` command group (named `sync` to emphasize that Config Sync -is the deploying mechanism and that configuration is being synchronized with the -actuation target as a means of deployment) and include: - -* `create` - Creates a sync of a package in the deployment cluster. -* `del` - Deletes the package RootSync. -* `get` - Gets a RootSync resource with which package was deployed. - -```sh -# Make sure Config Sync is configured to use multirepo mode -kubectl apply -f - < - -Configuration as Data is a novel approach that doesn’t sacrifice usability or the potential for higher-level automation in order to enable reproducibility. Instead, it supports an interoperable, WYSIWYG, automatable configuration authoring and editing experience. - diff --git a/site/guides/tenant-onboarding.md b/site/guides/tenant-onboarding.md deleted file mode 100644 index 091007441e..0000000000 --- a/site/guides/tenant-onboarding.md +++ /dev/null @@ -1,248 +0,0 @@ -# Tenant onboarding - -We have seen that in large organizations using kubernetes, there is a platform -team (or infrastructure team) that is responsible for managing the kubernetes -clusters. Typically a kubernetes cluster is shared by multiple teams to run -different types of workloads. One of the common use-cases platform teams have -is onboarding a new tenant on the kubernetes cluster. In this guide, you will -learn - how you can use kpt to address the tenant use-case. Though this guide -focuses on the tenant use-case, the pattern for package workflow discussed here -can be applied to other use cases as well. - -**Note:** This guide is inspired by the [kube-common-setup](https://github.com/nghnam/kube-common-setup) -helm chart. - -## Terminology - -Before we jump into the tutorial, let’s go over some terminologies that are -used throughout this guide. - -### Tenant - -A tenant represents a collection of related infra/app resources and needs to be -isolated from other resources, for example, a microservice, a workload, a team -(group of developers) sharing common infra resources. - -### Platform team - -Central infra team responsible for managing the Kubernetes cluster. Members of -the platform teams typically have administrative privileges on the Kubernetes cluster. - -### App developer team - -The team responsible for operating the tenant. Once the tenant is provisioned, -this team will typically deploy resources (workload, services etc) in the tenant. - -## Package organization - -There are many ways to organize the tenant package and its variants. In this guide, -we will explore one of the patterns where we keep the packages and their variants -in different repos as shown in the figure below. - -![drawing](/static/images/tenant-onboarding.svg) - -Package catalog repo contains kpt packages that will be used to create variants -of the packages. Platform repo contains the variants of the packages and there -is one-to-many relationship between packages in catalog to platform repo. This -organization has many benefits such as: - -* It is easy to discover the packages and its variants. -* It makes it easy to enforce different constraints/invariants on package and - package variants. -* It allows flexibility in roles/permissions for package publishing/consumption. -* Platform repo also serves as the deployment repository. - -```shell -# A sample layout for package catalog repo -# that contains the tenant pkg -pkg-catalog $ tree . -. -├── LICENSE -├── README.md -└── tenant - ├── Kptfile - ├── README.md - ├── namespace.yaml - ├── ns-invariant.yaml - ├── quota.yaml - ├── role-binding.yaml - └── service-account.yaml - # other packages will come here -``` - -```shell -# An sample layout for platform repo -platform $ tree . -. -├── LICENSE -├── README.md -└── tenants - ├── tenant-a - │   ├── Kptfile - │   ├── README.md - │   ├── namespace.yaml - │   ├── ns-invariant.yaml - │   ├── quota.yaml - │   ├── role-binding.yaml - │   └── service-account.yaml - └── tenant-b - ├── Kptfile - ├── README.md - ├── namespace.yaml - ├── ns-invariant.yaml - ├── quota.yaml - ├── role-binding.yaml - └── service-account.yaml -``` - -## Tenant package - -The tenant package should have a good set of defaults configuration so that it -can work as a good starting point for most of the tenants. Application developer -teams can customize the tenant package over time as their need evolves. - -The tenant package should include invariants (guardrails) that prevent -mis-configuration. For example, each tenant package shouldn’t have more than -one namespace, resource quota shouldn’t exceed limits etc. - -One of the key principles to keep in mind is that the tenant package shouldn’t -try to offer all the possible customization options. The tenant package should -offer a reasonable set of defaults with required constraints. Downstream users -of the tenant package can directly edit, add/delete resources as per their needs. - -Here is an example of a [basic tenant package](https://github.com/kptdev/kpt/tree/main/package-examples/tenant). - -```shell - -$ export PKG_CATALOG_DIR= -$ cd $PKG_CATALOG_DIR -pkg-catalog $ kpt pkg tree tenant -Package "tenant" -├── [Kptfile] Kptfile tenant -├── [namespace.yaml] Namespace tenant-name -├── [ns-invariant.yaml] StarlarkRun ns-invariant -├── [quota.yaml] ResourceQuota tenant-name/quota -├── [role-binding.yaml] RoleBinding tenant-name/sa-admin -└── [service-account.yaml] ServiceAccount tenant-name/sa - -``` - -The tenant package’s Kptfile offers basic customization and enforces single -namespace constraint. - -```shell - -$ cd $PKG_CATALOG_DIR -pkg-catalog $ cat tenant/Kptfile -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: tenant -info: - description: Base tenant package -pipeline: - mutators: - - image: set-namespace:v0.1 - configMap: - namespace: tenant-name # ←- will be customized for pkg variant - validators: - - image: gcr.io/kpt-fn/starlark:v0.3 - configPath: ns-invariant.yaml - -``` - -### Publishing tenant package - -So once you are happy with the tenant package, you can publish the tenant -package by tagging the version as shown below: - -```shell -# Assuming you are in the pkg catalog repo where tenant package exists -$ cd $PKG_CATALOG_DIR - -# Please remove the inventory information from the Kptfile before publishing - -# create new tag -$ git tag tenant/v0.1 main - -# push the tag to the upstream -$ git push origin tenant/v0.1 - -``` - -## Tenant onboarding workflow - -Now, let’s take a look at how tenant onboarding will work. Steps described below -can be done by a member of the platform team or application developer team. The -good thing is that it enables self-service workflow for application teams where -they can request for new tenants by simply issuing a PR against the platform repo. - -```shell - -# assuming you have a fork of the platform repo residing locally at pointed by -# by PLATFORM_DIR env variable locally. -$ cd $PLATFORM_DIR - -# create a new branch to onboard new tenant -$ git checkout -b onboarding-tenant-a - -$ cd tenants - -# create an instance `tenant-a` of the upstream tenant package using `kpt pkg get` -# Ensure PKG_CATALOG_REPO env variable points to the pkg catalog repo. -$ kpt pkg get $PKG_CATALOG_REPO/tenant@v0.1 tenant-a - -# tenant customizations: -# change the namespace to tenant-a in the tenant-a/Kptfile -# configure the quota.yaml by directly editing if needed -# configure resources by directly editing them -# Add functions to the pipeline in Kptfile - -# render the package to ensure all customizations are applied -# and validations are run. -$ kpt fn render tenant-a - -# if all invariants passed, then we are all set. - -$ git commit -am "added tenant-a" -$ git push origin onboarding-tenant-a - -# make a pull request for platform team to merge -# TODO (link to an example PR will be great here) -``` - -## Day 2 use-cases - -Platform team can evolve the tenant package over time for example, introducing -additional invariants to be enforced, updating the defaults for quota etc. So -assuming a new version of the tenant package `tenant/v0.2` has been published. -Let’s go through the steps needed to update the tenant package. - -```shell - -# assuming you have a fork of the platform repo residing locally at pointed by -# by PLATFORM_DIR env variable locally. -$ cd $PLATFORM_DIR - -# create a new branch to update tenant -$ git checkout -b update-tenant-a - -$ kpt pkg update tenant-a@tenants/v0.2 - -$ kpt fn render tenant-a - -# if all invariants passed, then we are all set. - -$ git commit -am "updated tenant-a to newer version" -$ git push origin update-tenant-a - -# make a pull request for platform team to merge -``` - -## Summary - -So, in this guide, how platform teams can enable self service workflow for -application teams to onboard a new tenant. In the next guide, we will explore -how platform teams can do it at a scale when there are hundreds of tenants -provisioned on a kubernetes cluster. Next guides will explore package lifecycle -(pkg diff/update) use cases at large scale. diff --git a/site/guides/value-propagation.md b/site/guides/value-propagation.md deleted file mode 100644 index ffe133f658..0000000000 --- a/site/guides/value-propagation.md +++ /dev/null @@ -1,184 +0,0 @@ -[starlark]: https://catalog.kpt.dev/starlark/v0.4/ -[apply-replacements]: https://catalog.kpt.dev/apply-replacements/v0.1/ - -# Value propagation pattern - -Generating a string value and propagating that value to another place -(or many other places) in your configuration is a very common pattern. -In this guide, we will go through the recommended technique to -do this value propagation using our [starlark] and [apply-replacements] -KRM functions. - -## String generation function - -Sometimes, the value that we need to propagate is a concatenation of -other values that come from various other resource fields. In order -to generate the value we need to propagate, we can make use of the -[starlark] function. - -For example, let's say we have a few context resources: - -```yaml -# gcloud-config.yaml - -apiVersion: v1 -kind: ConfigMap -metadata: - name: gcloud-config.kpt.dev - annotations: - config.kubernetes.io/local-config: "true" -data: - domain: domain - orgId: org-ID - projectID: project - region: region - zone: zone -``` - -```yaml -# package-context.yaml - -apiVersion: v1 -kind: ConfigMap -metadata: - name: kptfile.kpt.dev - annotations: - config.kubernetes.io/local-config: "true" -data: - name: namespace -``` - -and a RoleBinding as follows: - -```yaml -# rolebinding.yaml - -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: app-admin - namespace: myns -subjects: -- kind: Group - name: example-admin@example.com - apiGroup: rbac.authorization.k8s.io -roleRef: - kind: ClusterRole - name: app-admin - apiGroup: rbac.authorization.k8s.io -``` - -For this example, our goal is to change the RoleBinding's Group name -from `example-admin@example.com` to the value `project-namespace-role@domain`. -In order to generate this value, we will need to look at various fields from our -context resources, concatenate them together, and then store the generated value somewhere. - -We can create a ConfigMap named `value-store`, which we will use to store the generated string in its -`data.group` field: - -```yaml -# value-store.yaml - -apiVersion: v1 -kind: ConfigMap -metadata: - name: value-store - annotations: - config.kubernetes.io/local-config: "true" -data: - group: example-group -``` - -Now we can use the [starlark] function to generate and store the desired string value. -This function allows you to run a Starlark script to modify or generate resources. In -our case, the functionConfig should look like the following: - -```yaml -# generate-rolebinding-group.yaml - -apiVersion: fn.kpt.dev/v1alpha1 -kind: StarlarkRun -metadata: - name: generate-rolebinding-group.yaml - annotations: - config.kubernetes.io/local-config: "true" -source: |- - load("krmfn.star", "krmfn") - - def generate_group(resources, role): - group = "" - value_store = {} - for r in resources: - if krmfn.match_gvk(r, "v1", "ConfigMap") and krmfn.match_name(r, "gcloud-config.kpt.dev"): - project = r["data"]["projectID"] - domain = r["data"]["domain"] - if krmfn.match_gvk(r, "v1", "ConfigMap") and krmfn.match_name(r, "kptfile.kpt.dev"): - namespace = r["data"]["name"] - if krmfn.match_gvk(r, "v1", "ConfigMap") and krmfn.match_name(r, "value-store"): - value_store = r - group = project + "-" + namespace + "-" + role + "@" + domain - value_store["data"]["group"] = group - generate_group(ctx.resource_list["items"], "app-admin") -``` - -## Value propagation function - -Now that we have a function that can generate the desired value, we will need to -configure another function to propagate the value to the desired place(s). - -We can achieve this with the [apply-replacements] function. The apply-replacements -function is a wrapper for the [kustomize replacements](https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/replacements/) -feature, and can be used to copy a value from a provided source to any number of specified targets. -In our case, the functionConfig looks like the following: - -```yaml -# propagate-rolebinding-group.yaml - -apiVersion: fn.kpt.dev/v1alpha1 -kind: ApplyReplacements -metadata: - name: propagate-rolebinding-group - annotations: - config.kubernetes.io/local-config: "true" -replacements: - - source: - kind: ConfigMap - name: value-store - fieldPath: data.group - targets: - - select: - kind: RoleBinding - name: app-admin - fieldPaths: - - subjects.[kind=Group].name -``` - -This functionConfig will configure [apply-replacements] to copy the value -we stored in `value-store` to the RoleBinding Group. - -## Running the functions - -In order to run the configured functions, we can have the following pipeline in our Kptfile: - -```yaml -# Kptfile - -apiVersion: kpt.dev/v1 -kind: Kptfile -metadata: - name: example -pipeline: - mutators: - - image: gcr.io/kpt-fn/starlark:v0.4 - configPath: generate-rolebinding-group.yaml - - image: gcr.io/kpt-fn/apply-replacements:v0.1 - configPath: propagate-rolebinding-group.yaml -``` - -After running these two functions with `kpt fn render`, we should see the value of our -RoleBinding group change from `example-admin@example.com` to `project-namespace-role@domain` as desired. - -## Summary - -With the above pattern and workflow, you can easily generate and propagate -common values to various places of your configuration. diff --git a/site/guides/variant-constructor-pattern.md b/site/guides/variant-constructor-pattern.md deleted file mode 100644 index 41f5df8d1d..0000000000 --- a/site/guides/variant-constructor-pattern.md +++ /dev/null @@ -1,180 +0,0 @@ -# Variant construction pattern - -If you look at the config workflows, you will notice that creating a variant -of a package is a very frequent operation, so reducing the steps -required to create a variant can have significant benefits for the -package consumers. In this guide, we will look at some techniques -that a package author can use to enable automatic variant construction of a package. - -## Types of packages - -kpt packages comes in two flavors: `abstract package` and -`deployable instance`. An `abstract` package is a reususable package that -is used to create deployable instances that can be deployed to a -kubernetes cluster. In programming language terms, you can think of an `abstract` -packages as the class and `deployable instance` as the instances of the class. -`deployable` instances of package are also referred to as `variant` of the package. - -Figure below shows a `package catalog` on the left that has `abstract` packages -and `deployable instances` on the right. A good pattern is to keep the abstract -packages and instance packages in separate repos and typically -`deployable instances` repo will be setup to auto deploy to a kubernetes cluster -using gitops tools such as `config-sync`, `fluxcd`, `argocd`. - -![variant constructor pkg repo diagram](/static/images/variant-constructor-pkg-repo-diagram.png) - -Resources in an `abstract` package have placeholder values that need to be -substituted with actual values to make them ready for deployment. -For example, the name of the namespace resource below has `example` as a placeholder -value. This is a part of the `abstract package`. - -```yaml -apiVersion:v1 -kind: Namespace -metadata: - name: example # <-- this is a placeholder value -``` - -## Customizing identity of resources - -A kpt package contains kubernetes resources. Whenever you are creating a -variant of the package, first step is to ensure unique identity of the -resources in that variant. For example, if the abstract package contains a -`namespace` resource, then the variant package should contain a `namespace` resource -corresponding to that variant. - -In a kubernetes cluster, resources are identified by their group, version, kind, -namespace and name (also referred to as GVKNN). If resource is cluster scoped, -then the `metadata.name` uniquely identifies the resource in a cluster. If the resource -is namespace scoped, then (`metadata.namespace`, `metadata.name`) together identifies the -resource uniquely. - -[kpt-function-catalog](https://catalog.kpt.dev) provides two function that helps -with customizing the identify of the resources: - -1. [set-namespace](https://catalog.kpt.dev/set-namespace/v0.3/): sets the - namespace for all resources in the package. -2. [ensure-name-substring](https://catalog.kpt.dev/ensure-name-substring/v0.2/): - sets the name of the resources in the package. - -You can use the appropriate functions from the catalog or implement a custom -function to ensure unique identity of the resources. - -## Customizing non-identifier fields of resources - -Packages can use other functions such as `set-labels`, `set-annotations`, `apply-replacements` -or custom functions to transform other fields of resources. - -## Core mechanism - -Enabling automatic variant construction involves two steps: - -1. Use functions to customize identity or other fields of the resources -2. Generating inputs for the functions declarared in the package - -Here is an example of `Kptfile` of a package that uses `set-namespace` and `apply-transform` -to enable customization. - -```Kptfile -# Kptfile -... -pipeline: - mutators: - - image: set-namespace:v0.3.4 - configPath: ... - - image: apply-transform:v0.1.0 - configPath: ... -... -``` - -Now let's talk about the input to the functions. In most cases, variant's name -(deployable instance name) itself can be used to derive unique identity -of the resources in the variant. For example, if I create a variant of -`microservice` package, I will name the deployable instance to -`user-service` or `order-service`. So if the package's name is available to the -functions, then they can use it to customize the name/namespace of the resources. -So, starting with `kpt v1.0.0-beta.15+`, kpt makes `package name` available -in a `ConfigMap` at a well-known path `package-context.yaml` in `data.name` field. -The `package-context.yaml` is available to functions during `kpt fn render|eval`. - -Here are examples of `package-context.yaml` for abstract and deployable instance: - -```yaml -# package-context.yaml -# package context for an abstract package. -# This is automatically created on `kpt pkg init`. -apiVersion: v1 -kind: ConfigMap -data: - name: example # <-- placeholder value -``` - -```yaml -# package-context.yaml -# package context for a deployable instance of a package. -# This is automatically populated during `kpt pkg get`. -apiVersion: v1 -kind: ConfigMap -data: - name: my-pkg-instance # <- deployable instance name -``` - -kpt supports a way to create `deployable instance` such that `package-context.yaml` -is automatically populated with the `deployable instance`'s name. - -```shell -$kpt pkg get my-pkg-instance --for-deployment -``` - -Now, let's look at how to provide the input to the functions. - -If you are using `set-namespace` function in your package, then -`set-namespace` function supports reading input from `package-context.yaml`. -Here is an example: - -```Kptfile -... -pipeline: - mutators: - - image: set-namespace:v0.3.4 - configPath: package-context.yaml -... -``` - -By using `package-context.yaml` as input, `set-namespace` uses the value `example` -for an `abstract` package and variant's name for a deployable instance. The -same pattern can be applied to other functions also. For example, a -"namespace provisioning" package might use the `apply-replacements` function to set -the RoleBinding group using the name of the package. - -In some cases, the inputs needed to generate the variant will come from -some external system or environment. Those can be generated imperatively or -manually edited after the package is forked using `kpt pkg get`. Additional -customizations could also be made at that point. - -So for a package consumer, creating a deployable instance involves the following: - -```shell -# pick name of the deployable instance say `my-pkg-instance` -$ kpt pkg get --for-deployement - -$ kpt fn render - -``` - -## See it in action - -If you want to see `variant constructor pattern` in action for a real use-case, -check out [`namespace provisioning using kpt CLI guide`](/guides/namespace-provisioning-cli.md). - -## Summary - -With the above pattern and workflow, you can see - how a package publisher can -enable automatic customization of deployable instance of a package with minimal -input i.e. package instance name. - -## Future plans - -Currently `--for-deployment` steps invokes built-in function to generate -`package-context.yaml`. We would like to make it extensible for users to invoke their -custom function for deploy workflow. diff --git a/site/index.html b/site/index.html deleted file mode 100644 index 857a3d9014..0000000000 --- a/site/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - kpt - Home - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - diff --git a/site/installation/README.md b/site/installation/README.md deleted file mode 100644 index 019b44ca52..0000000000 --- a/site/installation/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Installation - -Please follow the links below to install `kpt` components: - -- [kpt CLI](/installation/kpt-cli.md) -- [Package Orchestrator](/guides/porch-installation.md) -- [Config Sync](https://github.com/GoogleContainerTools/kpt-config-sync/blob/main/docs/installation.md) -- [Configuration as Data UI](/guides/porch-ui-installation.md) diff --git a/site/installation/kpt-cli.md b/site/installation/kpt-cli.md deleted file mode 100644 index 21852555bc..0000000000 --- a/site/installation/kpt-cli.md +++ /dev/null @@ -1,145 +0,0 @@ -# Installation - -Users can get kpt CLI in a variety of ways: - -## Binaries - -Download pre-compiled binaries: - -- [Linux (amd64)][linux-amd64] -- [Linux (arm64)][linux-arm64] -- [MacOS (amd64)][darwin-amd64] -- [MacOS (arm64)][darwin-arm64] - -Optionally verify the [SLSA3 signatures](slsa.dev) generated using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) during the release process. To verify a release binary: -1. Install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation). -2. Download the signature file `attestation.intoto.jsonl` from the [GitHub releases page](https://github.com/kptdev/kpt/releases). -3. Run the verifier: -```shell -slsa-verifier -artifact-path kpt-- -provenance attestation.intoto.jsonl -source github.com/kptdev/kpt -tag -``` - -On Linux and MacOS, make it executable: - -```shell -$ chmod +x kpt -``` - -?> On MacOS the first time, it may be necessary to open the -program from the finder with _ctrl-click open_. - -Verify the version: - -```shell -$ kpt version -``` - -## (Optional) enable shell auto-completion - -kpt provides auto-completion support for several of the common shells. -To see the options for enabling shell auto-completion: - -```shell -$ kpt completion -h -``` - -### Prerequisites -Previous installations of kpt completion may have added the following line to -the shell's config file (e.g. `.bashrc`, `.zshrc`, etc.): - -```shell -$ complete -C kpt -``` - -This line needs to be removed for kpt's completion implementation to function -properly. - -### Enable kpt auto-completion -The kpt completion script for a shell can be generated with the commands -`kpt completion bash`, `kpt completion zsh`, etc. -For instructions on how to enable the script for the given shell, see the help -page with the commands `kpt completion bash -h`, `kpt completion zsh -h`, etc. - -## gcloud - -Install with gcloud. - -```shell -$ gcloud components install kpt -``` - -```shell -$ kpt version -``` - -The version of kpt installed using `gcloud` may not be the latest released version, and can lag behind. Please use another installation method if you need to latest release. - -## Homebrew - -Install the latest release with Homebrew on MacOS. - -```shell -$ brew tap kptdev/kpt https://github.com/kptdev/kpt.git -$ brew install kpt -``` - -```shell -$ kpt version -``` - -The version of kpt installed using `brew` can only be a tagged release, master releases are not shipped. - -## Docker - -Use one of the kpt docker images. - -| Feature | `kpt` | `kpt-gcloud` | -| --------- | :---: | :----------: | -| kpt | ✓ | ✓ | -| git | ✓ | ✓ | -| diffutils | ✓ | ✓ | -| gcloud | | ✓ | - -### `kpt` - -```shell -$ docker run gcr.io/kpt-dev/kpt:v1.0.0-beta.49 version -``` - -### `kpt-gcloud` - -An image which includes kpt based upon the Google [cloud-sdk] alpine image. - -```shell -$ docker run gcr.io/kpt-dev/kpt-gcloud:v1.0.0-beta.49 version -``` - -## Source - -Install by compiling the source. This requires having Go version 1.21+: - -```shell -$ go install -v github.com/kptdev/kpt@main -``` - -kpt version will return `unknown` for binaries built from source: - -```shell -$ kpt version -``` - -[gcr.io/kpt-dev/kpt]: - https://console.cloud.google.com/gcr/images/kpt-dev/GLOBAL/kpt?gcrImageListsize=30 -[gcr.io/kpt-dev/kpt-gcloud]: - https://console.cloud.google.com/gcr/images/kpt-dev/GLOBAL/kpt-gcloud?gcrImageListsize=30 -[cloud-sdk]: https://github.com/GoogleCloudPlatform/cloud-sdk-docker -[linux-amd64]: - https://github.com/kptdev/kpt/releases/download/v1.0.0-beta.49/kpt_linux_amd64 -[linux-arm64]: - https://github.com/kptdev/kpt/releases/download/v1.0.0-beta.49/kpt_linux_arm64 -[darwin-amd64]: - https://github.com/kptdev/kpt/releases/download/v1.0.0-beta.49/kpt_darwin_amd64 -[darwin-arm64]: - https://github.com/kptdev/kpt/releases/download/v1.0.0-beta.49/kpt_darwin_arm64 -[migration guide]: /installation/migration -[bash-completion]: https://github.com/scop/bash-completion#installation diff --git a/site/installation/migration.md b/site/installation/migration.md deleted file mode 100644 index 959d941175..0000000000 --- a/site/installation/migration.md +++ /dev/null @@ -1,382 +0,0 @@ -## Migrating from kpt `v0.39` to `v1.0` - -- [Before you begin](#Before-you-begin) -- [What's new and changed?](#What's-new-and-changed?) - - [CLI changes](#CLI-changes) - - [Kptfile schema changes](#Kptfile-schema-changes) - - [`pkg`](#pkg) - - [`sync` merged with `update`](#sync-merged-with-update) - - [`cfg`](#cfg) - - [Changes to Setters](#Changes-to-Setters) - - [Setter validations deprecated](#Setter-validations-deprecated) - - [Auto setters deprecated](#Auto-setters-deprecated) - - [`fn`](#fn) - - [`run` is split into `eval` and `render`](#run-is-split-into-eval-and-render) - - [Function Config](#Function-Config) - - [Function Results](#Function-Results) - - [`live`](#live) -- [Migration steps](#Migration-steps) - - [For Package Publishers](#For-Package-Publishers) - - [Automated portion of migration](#Automated-portion-of-migration) - - [Changes made by the function](#Changes-made-by-the-function) - - [Manual portion of migration](#Manual-portion-of-migration) - - [For Package Consumers](#For-Package-Consumers) -- [Timeline](#Timeline) - -kpt `v1.0` is going to be the latest major release of the kpt CLI. The -implementation of kpt `v1.0` has changed considerably from kpt `v0.39`. A rich -set of new features have been added as a result of the users’ input and -requirements. Some features have been deprecated or refactored in ways that make -them incompatible with kpt `v0.39`. Since these are backwards incompatible -changes, there should be a way for users to migrate/fix their existing kpt -packages which are compatible with `v0.39` version of kpt, to become compatible -with kpt `v1.0`. This document outlines the end to end migration journey of -users using a comprehensive kpt package example. - -## Before you begin - -Please go through [installation instructions] for installing `v1.0` binary and -at least Chapter 1 and 2 of [The kpt Book] for understanding the basic model of -kpt `v1.0`. - -## What's new and changed? - -### CLI changes - -To start with, all the commands in kpt `v1.0` will follow the consistent pattern - -``` -$ kpt [PKG_PATH | DIR | - STDIN] [flags] -``` - -Almost all the existing commands/features in kpt `v0.39` are also offered in kpt -`v1.0` but in a better and enhanced format. In kpt `v0.39`, `cfg` group had been -a dumping ground for many cli commands which don’t have a coherent story. `cfg` -is often confused with `pkg` and vice-versa. As a major step, we removed the -`cfg` subgroup and rearranged the functionality. Here are the one-liners for -each command group in kpt `v1.0`. - -1. `pkg:` Commands for composing and describing packages. -2. `fn:` Commands for running functions for validation and customization. -3. `live:` Commands for interacting with a live cluster. - -`PKG_PATH vs DIR:` Most of the commands accept only `PKG_PATH` as input which -means the input directory must have a valid Kptfile. Few commands can work on -just the simple `DIR` with resources. Commands operate on the current working -directory by default. - -| [v0.39 Commands] | [v1.0 Commands] | -| ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `kpt pkg get REPO_URI[.git]/PKG_PATH[@VERSION] LOCAL_DEST_DIRECTORY [flags]` | `kpt pkg get REPO_URI[.git]/PKG_PATH[@VERSION] [flags] [LOCAL_DEST_DIRECTORY]`
Fetch a remote package from a git subdirectory and writes it to a new local directory. | -| `kpt pkg init DIR [flags]` | `kpt pkg init [DIR] [flags]`
Initializes an existing empty directory as a kpt package by adding a Kptfile. | -| `kpt pkg update LOCAL_PKG_DIR[@VERSION] [flags]` | `kpt pkg update [PKG_PATH][@version] [flags]`
Pulls in upstream changes and merges them into a local package. | -| `kpt pkg fix DIR [flags]` | `kpt fn eval --image gcr.io/kpt-fn/fix:v0.2 --include-meta-resources`
Fix a local package which is using deprecated features. | -| `kpt pkg desc DIR [flags]` | Deprecated in favor of reading Kptfile directly | -| `kpt pkg diff DIR[@VERSION] [flags]` | `kpt pkg diff [PKG_PATH][@version] [flags]`
Display differences between upstream and local packages. | -| `kpt cfg fmt DIR/STDIN [flags]` | `kpt fn eval --image gcr.io/kpt-fn/format:v0.1` | -| `kpt cfg tree DIR/STDIN [flags]` | `kpt pkg tree [DIR] [flags]`
Displays resources, files and packages in a tree structure. | -| `kpt cfg cat DIR/STDIN [flags]` | `kpt fn source [DIR] -o unwrap` | -| `kpt fn run DIR/STDIN [flags]` | `kpt fn eval [DIR / -] [flags]`
Executes a single function on resources in a directory.

`kpt fn render [PKG_PATH]`
Executes the pipeline of functions on resources in the package and writes the output to the local filesystem. | -| `kpt fn source DIR [flags]` | `kpt fn source [DIR] [flags]`
Reads resources from a local directory and writes them in Function Specification wire format to stdout. | -| `kpt fn sink DIR [flags]` | `kpt fn sink [DIR] [flags]`
Reads resources from stdin and writes them to a local directory. | -| `kpt fn export DIR [flags]` | Deprecated. | -| `kpt live init DIR [flags]` | `kpt live init [PKG_PATH] [flags]`
Initializes the package with the name, namespace and id of the resource that will keep track of the package inventory. | -| `kpt live apply DIR/STDIN [flags]` | `kpt live apply [PKG_PATH / -] [flags]`
Creates, updates and deletes resources in the cluster to make the remote cluster resources match the local package configuration. | -| `kpt live preview DIR/STDIN [flags]` | Deprecated. The functionality will be provided by `dry-run` flag in `apply` and `destroy` commands. | -| `kpt live destroy DIR/STDIN [flags]` | `kpt live destroy [PKG_PATH / -] [flags]`
Removes all files belonging to a package from the cluster. | -| `kpt live status DIR/STDIN [flags]` | `kpt live status [PKG_PATH / -] [flags]`
Shows the resource status for resources belonging to the package. | -| `kpt live diff DIR/STDIN [flags]` | Deprecated. The functionality will be provided by `dry-run` flag in `apply` and `destroy` commands. | -| `kpt cfg set DIR setter_name setter_value` | `kpt fn eval --image gcr.io/kpt-fn/apply-setters:v0.1 -- 'foo=bar' 'env=[dev, stage]'` | -| `kpt cfg create-setter DIR setter_name setter_value` | `kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.1 -- 'by-value=nginx' 'put-comment=kpt-set: ${image}'` | -| `kpt cfg create-subst DIR subst_name --field-value nginx:1.7.1 --pattern ${image}:${tag} [flags]` | `kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.1 -- 'by-value=nginx:1.7.1' 'put-comment=kpt-set: ${image}:${tag}'` | -| `kpt cfg delete-setter DIR setter_name` | `kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.1 -- 'by-value=nginx' put-comment=''` | -| `kpt cfg delete-subst DIR subst_name [flags]` | `kpt fn eval --image gcr.io/kpt-fn/search-replace:0.1 -- 'by-value=nginx:1.7.1' put-comment=''` | -| `kpt cfg annotate DIR/STDIN [flags]` | `kpt fn eval --image gcr.io/kpt-fn/set-annotations:v0.1 -- 'name=foo' 'value=bar'` | -| `kpt cfg grep DIR/STDIN [flags]` | `kpt fn eval --image gcr.io/kpt-fn/search-replace:v0.1 -- 'by-value=foo' 'by-path=bar'` | -| `kpt cfg count DIR/STDIN [flags]` | Deprecated. | - -### Kptfile schema changes - -The existing [v1alpha1 Kptfile] format/schema is not compatible with kpt `v1.0`. -Here is the schema for [v1 Kptfile] which is compatible with kpt `v1.0`. - -1. The `packageMetaData` section in `v1alpha1` Kptfile is transformed to `info` - section in `v1` Kptfile. -2. `upstream` section, in the `v1alpha1` Kptfile is split into `upstream` and - `upstreamLock` sections in `v1` Kptfile. `upstream` section can be - modified by users to declare the desired version of the package, - `upstreamLock` is the resolved package state and should not be modified by - users. -3. The `OpenAPI` section in `v1alpha1` Kptfile is deprecated. - [Details below](#changes-to-setters). -4. `dependencies` section in `v1alpha1` Kptfile is deprecated. - [Details below](#sync-merged-with-update). -5. `functions` section in `v1alpha1` Kptfile holds definitions for Starlark - functions only. This section is deprecated and all the functions can be - declared in the `pipeline` section including [Starlark function]. -6. `inventory-object` is moved to `inventory` section in `v1` Kptfile. - [Details below](#live-group-changes). - -### `pkg` - -#### `sync` merged with `update` - -Nothing to worry about. `sync` is just a declarative version of `update` -functionality. The functionality is offered by `kpt pkg update` in a more user -friendly fashion. Running the new `kpt pkg update` command on a package which -has subpackages, simply means traversing the package hierarchy, and for each -package encountered, update the package if needed. If you want to declaratively -update nested subpackages, you can declare the desired version in the upstream -section of the respective subpackage and invoking `kpt pkg update` on the root -package will take care of updating all the nested subpackages. [Update guide] - -### `cfg` - -#### Changes to Setters - -`Setters` and `substitutions` no longer follow the complex and verbose OpenAPI -format. The setters and substitutions are simplified to use new and simple -setter pattern comments. Creating a setter is as simple as adding a line comment -to the desired field. Users need not add any `OpenAPI` definitions. Please refer -to [apply-setters] for the information about new syntax for setters and how to -apply setter values, this is equivalent to the `kpt cfg set` in `v0.39`. [Setter -Inheritance] works as usual in kpt `v1.0`. - -Here is the [simple example] of setter syntax transformation. - -#### Setter validations deprecated - -We want to keep the authoring experience of setters as simple as possible and -hence [OpenAPI validations] and [required setters] feature offered by `v0.39` -setters is no longer offered in `v1.0` version of kpt. However, we are working -on providing an easy way to achieve similar functionality retaining the -simplicity of setters, which is scoped for post `v1.0` release. Stay tuned. - -#### Auto setters deprecated - -[Auto-setters] feature is deprecated in `v1.0` version of kpt. Since the setters -are migrated to a new and simple declarative version, package consumers can -easily declare all the setter values and render them all at once. - -### `fn` - -#### `run` is split into `eval` and `render` - -The functionality of `kpt fn run` command in `v0.39` is split into two different -CLI commands that execute functions corresponding to two fundamentally different -approaches: - -`kpt fn render:` Executes the pipeline of functions declared in the package and -its subpackages. This is a declarative way to run functions. [render guide] - -`kpt fn eval:` Executes a given function on the package. The image to run and -the functionConfig is specified as CLI argument. This is an imperative way to -run functions. [eval guide] - -#### Function Config - -As a result of these changes, we no longer need function configs to hold -`config.kubernetes.io/function` annotation. Functions can be declared in the -pipeline section of Kptfile and invoked using `kpt fn render`. The declared -function can point to the [function config] using `configPath` argument. - -#### Function Results - -In both `render` and `eval`, structured results can be enabled using the -`--results-dir` flag. Please refer to the [function results] section for more -information on the new structure of function results. - -### `live` - -`kpt live` in `v1.0` no longer uses an inventory object to track the grouping of -resources in the cluster. Instead, it uses a more expressive `ResourceGroup` -CRD. Please refer to the user guide on [migrating inventory objects] to the -`ResourceGroup` equivalent. - -## Migration Steps - -### For Package Publishers - -Based on the changes discussed above, this section walks package publishers through an end to -end workflow to migrate their existing packages which are compatible with -`v0.39` version of kpt, and make them compatible with kpt `v1.0`. - -#### Automated portion of migration - -Since you are the package publisher, you are expected to have the latest version -of published package on your local disk. If you do not already have it, you can [git clone] -the latest version of remote package on to your local disk. - -```shell -$ DEMO_HOME=$(mktemp -d); cd $DEMO_HOME -``` - -```shell -# replace it with your package repo uri -$ git clone https://github.com/kptdev/krm-functions-catalog.git -``` - -```shell -# cd to the package directory which you want to migrate -$ cd kpt-functions-catalog/testdata/fix/nginx-v1alpha1 -``` - -```shell -# verify the version of kpt -$ kpt version -1.0.0+ -``` - -Invoke `gcr.io/kpt-fn/fix` function on the kpt package. - -```shell -# you must be using 1.0+ version of kpt -$ kpt fn eval --image gcr.io/kpt-fn/fix:v0.2 --include-meta-resources --truncate-output=false -``` - -```shell -# observe the changes done by the fix function -$ git diff -``` - -##### Changes made by the function - -1. Best effort is made by the function to transform the `packageMetaData` - section to the `info` section. -2. `upstream` section, in the `v1alpha1` Kptfile is converted to `upstream` and - `upstreamLock` sections in `v1` version of Kptfile. -3. `dependencies` section is removed from Kptfile. -4. Starlark functions section is removed from Kptfile. -5. `Setters` and `substitutions` are converted to new and simple setter - patterns. The setter comments in the resources are updated to follow new - comment syntax. -6. The `apply-setters` function and all the setters are added to the mutators - section in the pipeline. -7. Function annotation from function configs will be removed and corresponding - function definitions will be declared in `pipeline` section of Kptfile. - Reference to function config is added via [configPath] option. - -Note: This function modifies only the local package files and doesn’t make any -changes to the resources in the live cluster. - -#### Manual portion of migration - -1. All the functions are treated as `mutators` by the `gcr.io/kpt-fn/fix` - function and are added to the `mutators` section in the pipeline. Users must - manually go through the functions and move the validator functions to the - `validators` section in the pipeline section of `v1` Kptfile. - 1. The order of functions also must be re-arranged manually by users if - needed. - 2. Also, note that the [function config] is used to configure the function - and is not included in the input list of resources to function. -2. [OpenAPI validations] and required setters feature offered by `v0.39` setters - is no longer offered in `v1.0` version of kpt. Users must write their own - validation functions to achieve the functionality. `Tip:` Adding a [starlark - function] would be an easier alternative to achieve the equivalent validation - functionality. -3. If you have used [Starlark runtime] in `v0.39`, please checkout the new and - improved [Starlark functions] and declare it accordingly in the pipeline. -4. [Auto-setters] feature is deprecated in `v1.0` version of kpt. Since the - setters are migrated to a new and simple declarative version, package - consumers can easily declare all the setter values and render them all at - once. - -Test your migrated kpt package end-to-end and make sure that the -functionality is as expected. `gcr.io/kpt-fn/fix` is a helper for migration and -doesn't guarantee functional parity. - -Finally, [publish your package] to git by upgrading the version so that your -consumers can fetch the specific version of the package. - -### For Package Consumers - -This section walks package consumers through an end to end workflow in order to -fetch the latest version of the published package which is compatible with kpt `v1.0` -and migrate the local customizations(if any) already performed to their existing package. - -- As a package consumer, you are expected to have some version of the kpt package - which is compatible with kpt `v0.39` on your local. - Fetch the latest version of published remote package in to a new directory different - from your existing package directory. - -```shell -$ DEMO_HOME=$(mktemp -d); cd $DEMO_HOME -``` - -```shell -# verify the version of kpt -$ kpt version -1.0.0+ -``` - -```shell -# fetch the package with upgraded version -$ kpt pkg get https://github.com/kptdev/krm-functions-catalog.git/testdata/fix/nginx-v1@master -``` - -- You might have performed some customizations to your existing package such as, - updated setter values, made some in-place edits to your resources etc. - Please make sure that you capture those customizations and add them to the newly - fetched package. - -- Render the package resources with customizations - -```shell -$ kpt fn render nginx-v1/ -``` - -- The step is only applicable if you're using `kpt live` functionality. - a. If you are using the inventory object in order to manage live resources in the cluster, - please refer to `live migrate` command docs to perform [live migration]. - b. If you are using ResourceGroup CRD to manage live resources, copy the inventory - section in the Kptfile of existing package to the Kptfile of new package. - -- Once you test your new package and confirm that all the changes are as expected, - you can simply discard the existing package and move forward with the new version - of the fetched and customized package. - -Here is an [example kpt package], migrated from `v1alpha1` version(compatible with -kpt `v0.39`) to `v1` version(compatible with kpt `v1.0`). - -## Timeline - -1. `Right now:` You can [install] and try the pre-release version of kpt `v1.0` - binary. -2. `June 1, 2021:` `gcr.io/kpt-fn/fix` function will be released in - [kpt-functions-catalog]. You can start migrating your existing kpt packages - using the function. -3. `July 1, 2021:` Package format `v1` will be released which guarantees - backwards compatibility for new packages going forward. The existing kpt - packages are not compatible with the kpt `v1.0` binary and users will be - prompted to migrate/fix their packages. -4. `TBD:` Feature releases and bug fixes for pre-v1 versions of kpt will be - reserved for serious security bugs only. Users will be asked to migrate to - kpt `v1.0`. - -[v0.39 commands]: https://kptdev.github.io/kpt/reference/ -[v1.0 commands]: https://kpt.dev/reference/cli/ -[v1 kptfile]: https://github.com/kptdev/kpt/blob/main/pkg/api/kptfile/v1/types.go -[starlark function]: https://catalog.kpt.dev/starlark/v0.2/ -[apply-setters]: https://catalog.kpt.dev/apply-setters/v0.1/ -[setter inheritance]: https://kptdev.github.io/kpt/concepts/setters/#inherit-setter-values-from-parent-package -[openapi validations]: https://kptdev.github.io/kpt/guides/producer/setters/#openapi-validations -[required setters]: https://kptdev.github.io/kpt/guides/producer/setters/#required-setters -[auto-setters]: https://kptdev.github.io/kpt/concepts/setters/#auto-setters -[migrating inventory objects]: https://kptdev.github.io/kpt/reference/live/alpha/ -[live migration]: https://kptdev.github.io/kpt/reference/cli/live/alpha/ -[configpath]: https://kpt.dev/book/04-using-functions/01-declarative-function-execution?id=configpath -[example kpt package]: https://github.com/kptdev/krm-functions-catalog/tree/master/testdata/fix -[simple example]: https://github.com/kptdev/krm-functions-catalog/tree/master/functions/go/fix#examples -[function config]: https://kpt.dev/book/04-using-functions/01-declarative-function-execution?id=configpath -[starlark runtime]: https://kptdev.github.io/kpt/guides/producer/functions/starlark/ -[update guide]: https://kpt.dev/book/03-packages/05-updating-a-package -[render guide]: https://kpt.dev/book/04-using-functions/01-declarative-function-execution -[eval guide]: https://kpt.dev/book/04-using-functions/02-imperative-function-execution -[function results]: https://kpt.dev/book/04-using-functions/03-function-results -[the kpt book]: https://kpt.dev/book/ -[installation instructions]: https://kpt.dev/installation/ -[install]: https://kpt.dev/installation/ -[kpt-functions-catalog]: https://catalog.kpt.dev/ -[v1alpha1 kptfile]: https://github.com/kptdev/kpt/blob/master/pkg/kptfile/pkgfile.go#L39 -[git clone]: https://git-scm.com/docs/git-clone -[publish your package]: https://kpt.dev/book/03-packages/08-publishing-a-package diff --git a/site/markdownlint.json b/site/markdownlint.json deleted file mode 100644 index 1b6a8b17cf..0000000000 --- a/site/markdownlint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "default": false, - "MD001": false, - "MD013": false, - "MD024": false, - "MD025": false, - "MD031": false, - "MD040": false, - "MD041": false, - "MD044": { "names": ["kpt"] }, - "MD046": false -} diff --git a/site/package-lock.json b/site/package-lock.json deleted file mode 100644 index 7d4f33833a..0000000000 --- a/site/package-lock.json +++ /dev/null @@ -1,12798 +0,0 @@ -{ - "name": "site", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@gouch/to-title-case": "^2.2.1", - "autoprefixer": "^10.4.16", - "href-checker": "etefera/href-checker#docsify", - "jest": "^27.0.4", - "markdownlint-cli": "^0.32.2", - "postcss-cli": "^10.0.0", - "super-simple-sitemap-generator": "etefera/super-simple-sitemap-generator" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@gouch/to-title-case": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@gouch/to-title-case/-/to-title-case-2.2.1.tgz", - "integrity": "sha512-i/Hj91LfiE2pxYdIT0Ttdc/fIzdBwojDNQe6S6/N/Uf3xMmn0lWO+iLkAd84zs/NUGfTLsMUacDZzSy6N4jkcw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", - "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.0.2", - "jest-util": "^27.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.5.tgz", - "integrity": "sha512-g73//jF0VwsOIrWUC9Cqg03lU3QoAMFxVjsm6n6yNmwZcQPN/o8w+gLWODw5VfKNFZT38otXHWxc6b8eGDUpEA==", - "dev": true, - "dependencies": { - "@jest/console": "^27.0.2", - "@jest/reporters": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.2", - "jest-config": "^27.0.5", - "jest-haste-map": "^27.0.5", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-resolve-dependencies": "^27.0.5", - "jest-runner": "^27.0.5", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "jest-watcher": "^27.0.2", - "micromatch": "^4.0.4", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.5.tgz", - "integrity": "sha512-IAkJPOT7bqn0GiX5LPio6/e1YpcmLbrd8O5EFYpAOZ6V+9xJDsXjdgN2vgv9WOKIs/uA1kf5WeD96HhlBYO+FA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.5.tgz", - "integrity": "sha512-d6Tyf7iDoKqeUdwUKrOBV/GvEZRF67m7lpuWI0+SCD9D3aaejiOQZxAOxwH2EH/W18gnfYaBPLi0VeTGBHtQBg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@sinonjs/fake-timers": "^7.0.2", - "@types/node": "*", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.5.tgz", - "integrity": "sha512-qqKyjDXUaZwDuccpbMMKCCMBftvrbXzigtIsikAH/9ca+kaae8InP2MDf+Y/PdCSMuAsSpHS6q6M25irBBUh+Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.0.5", - "@jest/types": "^27.0.2", - "expect": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.5.tgz", - "integrity": "sha512-4uNg5+0eIfRafnpgu3jCZws3NNcFzhu5JdRd1mKQ4/53+vkIqwB6vfZ4gn5BdGqOaLtYhlOsPaL5ATkKzyBrJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.2", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.5", - "jest-resolve": "^27.0.5", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/source-map": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", - "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", - "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", - "dev": true, - "dependencies": { - "@jest/console": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.5.tgz", - "integrity": "sha512-opztnGs+cXzZ5txFG2+omBaV5ge/0yuJNKbhE3DREMiXE0YxBuzyEa6pNv3kk2JuucIlH2Xvgmn9kEEHSNt/SA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-runtime": "^27.0.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.5.tgz", - "integrity": "sha512-lBD6OwKXSc6JJECBNk4mVxtSVuJSBsQrJ9WCBisfJs7EZuYq4K6vM9HmoB7hmPiLIDGeyaerw3feBV/bC4z8tg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.0.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-regex-util": "^27.0.1", - "jest-util": "^27.0.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", - "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, - "node_modules/@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.5.tgz", - "integrity": "sha512-bTMAbpCX7ldtfbca2llYLeSFsDM257aspyAOpsdrdSrBqoLkWCy4HPYTXtXWaSLgFPjrJGACL65rzzr4RFGadw==", - "dev": true, - "dependencies": { - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", - "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", - "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^27.0.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001546", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", - "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", - "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", - "dev": true - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.0.tgz", - "integrity": "sha512-MrQRs2gyD//7NeHi9TtsfClkf+cFAewDz+PZHR8ILKglLmBMyVX3ymQ+oeznE3tjrS7beTN+6JXb2C3JDHm7ug==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", - "dev": true - }, - "node_modules/diff-sequences": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", - "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.542", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.542.tgz", - "integrity": "sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", - "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.1", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/href-checker": { - "version": "1.1.2", - "resolved": "git+ssh://git@github.com/etefera/href-checker.git#b60a5f983aeed02df5a635825f05aac66b7292fa", - "dev": true, - "license": "MIT", - "dependencies": { - "puppeteer": "^5.4.1", - "sade": "^1.7.4" - }, - "bin": { - "href-checker": "cli.js" - }, - "engines": { - "node": ">= 12.11" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.1.1" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.5.tgz", - "integrity": "sha512-4NlVMS29gE+JOZvgmSAsz3eOjkSsHqjTajlIsah/4MVSmKvf3zFP/TvgcLoWe2UVHiE9KF741sReqhF0p4mqbQ==", - "dev": true, - "dependencies": { - "@jest/core": "^27.0.5", - "import-local": "^3.0.2", - "jest-cli": "^27.0.5" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", - "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.5.tgz", - "integrity": "sha512-p5rO90o1RTh8LPOG6l0Fc9qgp5YGv+8M5CFixhMh7gGHtGSobD1AxX9cjFZujILgY8t30QZ7WVvxlnuG31r8TA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.5.tgz", - "integrity": "sha512-kZqY020QFOFQKVE2knFHirTBElw3/Q0kUbDc3nMfy/x+RQ7zUY89SUuzpHHJoSX1kX7Lq569ncvjNqU3Td/FCA==", - "dev": true, - "dependencies": { - "@jest/core": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "prompts": "^2.0.1", - "yargs": "^16.0.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.5.tgz", - "integrity": "sha512-zCUIXag7QIXKEVN4kUKbDBDi9Q53dV5o3eNhGqe+5zAbt1vLs4VE3ceWaYrOub0L4Y7E9pGfM84TX/0ARcE+Qw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.5", - "@jest/types": "^27.0.2", - "babel-jest": "^27.0.5", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.0.5", - "jest-environment-jsdom": "^27.0.5", - "jest-environment-node": "^27.0.5", - "jest-get-type": "^27.0.1", - "jest-jasmine2": "^27.0.5", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-runner": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", - "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.0.1", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", - "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", - "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.5.tgz", - "integrity": "sha512-ToWhViIoTl5738oRaajTMgYhdQL73UWPoV4GqHGk2DPhs+olv8OLq5KoQW8Yf+HtRao52XLqPWvl46dPI88PdA==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.5.tgz", - "integrity": "sha512-47qqScV/WMVz5OKF5TWpAeQ1neZKqM3ySwNveEnLyd+yaE/KT6lSMx/0SOx60+ZUcVxPiESYS+Kt2JS9y4PpkQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", - "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.5.tgz", - "integrity": "sha512-3LFryGSHxwPFHzKIs6W0BGA2xr6g1MvzSjR3h3D8K8Uqy4vbRm/grpGHzbPtIbOPLC6wFoViRrNEmd116QWSkw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.0.1", - "jest-serializer": "^27.0.1", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.5.tgz", - "integrity": "sha512-m3TojR19sFmTn79QoaGy1nOHBcLvtLso6Zh7u+gYxZWGcza4rRPVqwk1hciA5ZOWWZIJOukAcore8JRX992FaA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.5", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", - "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", - "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", - "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", - "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", - "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.5.tgz", - "integrity": "sha512-Md65pngRh8cRuWVdWznXBB5eDt391OJpdBaJMxfjfuXCvOhM3qQBtLMCMTykhuUKiBMmy5BhqCW7AVOKmPrW+Q==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "escalade": "^3.1.1", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "resolve": "^1.20.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.5.tgz", - "integrity": "sha512-xUj2dPoEEd59P+nuih4XwNa4nJ/zRd/g4rMvjHrZPEBWeWRq/aJnnM6mug+B+Nx+ILXGtfWHzQvh7TqNV/WbuA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-snapshot": "^27.0.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.5.tgz", - "integrity": "sha512-HNhOtrhfKPArcECgBTcWOc+8OSL8GoFoa7RsHGnfZR1C1dFohxy9eLtpYBS+koybAHlJLZzNCx2Y/Ic3iEtJpQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.0.1", - "jest-environment-jsdom": "^27.0.5", - "jest-environment-node": "^27.0.5", - "jest-haste-map": "^27.0.5", - "jest-leak-detector": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.5", - "jest-runtime": "^27.0.5", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.5.tgz", - "integrity": "sha512-V/w/+VasowPESbmhXn5AsBGPfb35T7jZPGZybYTHxZdP7Gwaa+A0EXE6rx30DshHKA98lVCODbCO8KZpEW3hiQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/globals": "^27.0.5", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", - "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.5.tgz", - "integrity": "sha512-H1yFYdgnL1vXvDqMrnDStH6yHFdMEuzYQYc71SnC/IJnuuhW6J16w8GWG1P+qGd3Ag3sQHjbRr0TcwEo/vGS+g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "jest-haste-map": "^27.0.5", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.5", - "jest-util": "^27.0.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.0.2", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", - "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", - "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "leven": "^3.1.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", - "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.0.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/markdownlint": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", - "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", - "dev": true, - "dependencies": { - "markdown-it": "13.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/markdownlint-cli": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz", - "integrity": "sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ==", - "dev": true, - "dependencies": { - "commander": "~9.4.0", - "get-stdin": "~9.0.0", - "glob": "~8.0.3", - "ignore": "~5.2.0", - "js-yaml": "^4.1.0", - "jsonc-parser": "~3.1.0", - "markdownlint": "~0.26.2", - "markdownlint-rule-helpers": "~0.17.2", - "minimatch": "~5.1.0", - "run-con": "~1.2.11" - }, - "bin": { - "markdownlint": "markdownlint.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/markdownlint-cli/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/markdownlint-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/markdownlint-cli/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/markdownlint-cli/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/markdownlint-cli/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/markdownlint-rule-helpers": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", - "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mri": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", - "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-cli": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz", - "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==", - "dev": true, - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", - "get-stdin": "^9.0.0", - "globby": "^13.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^4.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^4.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/postcss-cli/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/postcss-cli/node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/postcss-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", - "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", - "dev": true, - "dependencies": { - "@jest/types": "^27.0.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer/node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "dependencies": { - "agent-base": "5", - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-con": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", - "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~3.0.0", - "minimist": "^1.2.6", - "strip-json-comments": "~3.1.1" - }, - "bin": { - "run-con": "cli.js" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", - "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/super-simple-sitemap-generator": { - "version": "1.0.5", - "resolved": "git+ssh://git@github.com/etefera/super-simple-sitemap-generator.git#cb84797ded8cbcd24446610acd538b35d2a80ee3", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^4.1.1", - "puppeteer": "^2.1.1", - "xmlbuilder": "^13.0.2" - }, - "bin": { - "sitemap": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "dependencies": { - "agent-base": "5", - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/super-simple-sitemap-generator/node_modules/puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=8.16.0" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/super-simple-sitemap-generator/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", - "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", - "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlbuilder": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", - "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "dev": true - }, - "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dev": true, - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@gouch/to-title-case": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@gouch/to-title-case/-/to-title-case-2.2.1.tgz", - "integrity": "sha512-i/Hj91LfiE2pxYdIT0Ttdc/fIzdBwojDNQe6S6/N/Uf3xMmn0lWO+iLkAd84zs/NUGfTLsMUacDZzSy6N4jkcw==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.2.tgz", - "integrity": "sha512-/zYigssuHLImGeMAACkjI4VLAiiJznHgAl3xnFT19iWyct2LhrH3KXOjHRmxBGTkiPLZKKAJAgaPpiU9EZ9K+w==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.0.2", - "jest-util": "^27.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.5.tgz", - "integrity": "sha512-g73//jF0VwsOIrWUC9Cqg03lU3QoAMFxVjsm6n6yNmwZcQPN/o8w+gLWODw5VfKNFZT38otXHWxc6b8eGDUpEA==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/reporters": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.2", - "jest-config": "^27.0.5", - "jest-haste-map": "^27.0.5", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-resolve-dependencies": "^27.0.5", - "jest-runner": "^27.0.5", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "jest-watcher": "^27.0.2", - "micromatch": "^4.0.4", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.5.tgz", - "integrity": "sha512-IAkJPOT7bqn0GiX5LPio6/e1YpcmLbrd8O5EFYpAOZ6V+9xJDsXjdgN2vgv9WOKIs/uA1kf5WeD96HhlBYO+FA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3" - } - }, - "@jest/fake-timers": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.5.tgz", - "integrity": "sha512-d6Tyf7iDoKqeUdwUKrOBV/GvEZRF67m7lpuWI0+SCD9D3aaejiOQZxAOxwH2EH/W18gnfYaBPLi0VeTGBHtQBg==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@sinonjs/fake-timers": "^7.0.2", - "@types/node": "*", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - } - }, - "@jest/globals": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.5.tgz", - "integrity": "sha512-qqKyjDXUaZwDuccpbMMKCCMBftvrbXzigtIsikAH/9ca+kaae8InP2MDf+Y/PdCSMuAsSpHS6q6M25irBBUh+Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.5", - "@jest/types": "^27.0.2", - "expect": "^27.0.2" - } - }, - "@jest/reporters": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.5.tgz", - "integrity": "sha512-4uNg5+0eIfRafnpgu3jCZws3NNcFzhu5JdRd1mKQ4/53+vkIqwB6vfZ4gn5BdGqOaLtYhlOsPaL5ATkKzyBrJw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.2", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.5", - "jest-resolve": "^27.0.5", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.1.tgz", - "integrity": "sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.2.tgz", - "integrity": "sha512-gcdWwL3yP5VaIadzwQtbZyZMgpmes8ryBAJp70tuxghiA8qL4imJyZex+i+USQH2H4jeLVVszhwntgdQ97fccA==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.5.tgz", - "integrity": "sha512-opztnGs+cXzZ5txFG2+omBaV5ge/0yuJNKbhE3DREMiXE0YxBuzyEa6pNv3kk2JuucIlH2Xvgmn9kEEHSNt/SA==", - "dev": true, - "requires": { - "@jest/test-result": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-runtime": "^27.0.5" - } - }, - "@jest/transform": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.5.tgz", - "integrity": "sha512-lBD6OwKXSc6JJECBNk4mVxtSVuJSBsQrJ9WCBisfJs7EZuYq4K6vM9HmoB7hmPiLIDGeyaerw3feBV/bC4z8tg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.0.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-regex-util": "^27.0.1", - "jest-util": "^27.0.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz", - "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, - "@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", - "dev": true - }, - "@types/prettier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.0.tgz", - "integrity": "sha512-hkc1DATxFLQo4VxPDpMH1gCkPpBbpOoJ/4nhuXw4n63/0R6bCpQECj4+K226UJ4JO/eJQz+1mC2I7JsWanAdQw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "requires": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.5.tgz", - "integrity": "sha512-bTMAbpCX7ldtfbca2llYLeSFsDM257aspyAOpsdrdSrBqoLkWCy4HPYTXtXWaSLgFPjrJGACL65rzzr4RFGadw==", - "dev": true, - "requires": { - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz", - "integrity": "sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz", - "integrity": "sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.0.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001546", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", - "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", - "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.0.tgz", - "integrity": "sha512-MrQRs2gyD//7NeHi9TtsfClkf+cFAewDz+PZHR8ILKglLmBMyVX3ymQ+oeznE3tjrS7beTN+6JXb2C3JDHm7ug==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", - "dev": true - }, - "diff-sequences": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz", - "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.542", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.542.tgz", - "integrity": "sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expect": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz", - "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.1", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-regex-util": "^27.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - } - }, - "fraction.js": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", - "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "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" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "dependencies": { - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "href-checker": { - "version": "git+ssh://git@github.com/etefera/href-checker.git#b60a5f983aeed02df5a635825f05aac66b7292fa", - "dev": true, - "from": "href-checker@etefera/href-checker#docsify", - "requires": { - "puppeteer": "^5.4.1", - "sade": "^1.7.4" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "requires": { - "ci-info": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.5.tgz", - "integrity": "sha512-4NlVMS29gE+JOZvgmSAsz3eOjkSsHqjTajlIsah/4MVSmKvf3zFP/TvgcLoWe2UVHiE9KF741sReqhF0p4mqbQ==", - "dev": true, - "requires": { - "@jest/core": "^27.0.5", - "import-local": "^3.0.2", - "jest-cli": "^27.0.5" - } - }, - "jest-changed-files": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.2.tgz", - "integrity": "sha512-eMeb1Pn7w7x3wue5/vF73LPCJ7DKQuC9wQUR5ebP9hDPpk5hzcT/3Hmz3Q5BOFpR3tgbmaWhJcMTVgC8Z1NuMw==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.5.tgz", - "integrity": "sha512-p5rO90o1RTh8LPOG6l0Fc9qgp5YGv+8M5CFixhMh7gGHtGSobD1AxX9cjFZujILgY8t30QZ7WVvxlnuG31r8TA==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.5.tgz", - "integrity": "sha512-kZqY020QFOFQKVE2knFHirTBElw3/Q0kUbDc3nMfy/x+RQ7zUY89SUuzpHHJoSX1kX7Lq569ncvjNqU3Td/FCA==", - "dev": true, - "requires": { - "@jest/core": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "jest-config": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "prompts": "^2.0.1", - "yargs": "^16.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.5.tgz", - "integrity": "sha512-zCUIXag7QIXKEVN4kUKbDBDi9Q53dV5o3eNhGqe+5zAbt1vLs4VE3ceWaYrOub0L4Y7E9pGfM84TX/0ARcE+Qw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.5", - "@jest/types": "^27.0.2", - "babel-jest": "^27.0.5", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.0.5", - "jest-environment-jsdom": "^27.0.5", - "jest-environment-node": "^27.0.5", - "jest-get-type": "^27.0.1", - "jest-jasmine2": "^27.0.5", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-runner": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz", - "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.0.1", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.1.tgz", - "integrity": "sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.2.tgz", - "integrity": "sha512-OLMBZBZ6JkoXgUenDtseFRWA43wVl2BwmZYIWQws7eS7pqsIvePqj/jJmEnfq91ALk3LNphgwNK/PRFBYi7ITQ==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.5.tgz", - "integrity": "sha512-ToWhViIoTl5738oRaajTMgYhdQL73UWPoV4GqHGk2DPhs+olv8OLq5KoQW8Yf+HtRao52XLqPWvl46dPI88PdA==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.5.tgz", - "integrity": "sha512-47qqScV/WMVz5OKF5TWpAeQ1neZKqM3ySwNveEnLyd+yaE/KT6lSMx/0SOx60+ZUcVxPiESYS+Kt2JS9y4PpkQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "jest-mock": "^27.0.3", - "jest-util": "^27.0.2" - } - }, - "jest-get-type": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz", - "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==", - "dev": true - }, - "jest-haste-map": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.5.tgz", - "integrity": "sha512-3LFryGSHxwPFHzKIs6W0BGA2xr6g1MvzSjR3h3D8K8Uqy4vbRm/grpGHzbPtIbOPLC6wFoViRrNEmd116QWSkw==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^27.0.1", - "jest-serializer": "^27.0.1", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.5.tgz", - "integrity": "sha512-m3TojR19sFmTn79QoaGy1nOHBcLvtLso6Zh7u+gYxZWGcza4rRPVqwk1hciA5ZOWWZIJOukAcore8JRX992FaA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.5", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.0.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.2", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-runtime": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "pretty-format": "^27.0.2", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.2.tgz", - "integrity": "sha512-TZA3DmCOfe8YZFIMD1GxFqXUkQnIoOGQyy4hFCA2mlHtnAaf+FeOMxi0fZmfB41ZL+QbFG6BVaZF5IeFIVy53Q==", - "dev": true, - "requires": { - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - } - }, - "jest-matcher-utils": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz", - "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz", - "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "pretty-format": "^27.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "27.0.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.3.tgz", - "integrity": "sha512-O5FZn5XDzEp+Xg28mUz4ovVcdwBBPfAhW9+zJLO0Efn2qNbYcDaJvSlRiQ6BCZUCVOJjALicuJQI9mRFjv1o9Q==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz", - "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==", - "dev": true - }, - "jest-resolve": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.5.tgz", - "integrity": "sha512-Md65pngRh8cRuWVdWznXBB5eDt391OJpdBaJMxfjfuXCvOhM3qQBtLMCMTykhuUKiBMmy5BhqCW7AVOKmPrW+Q==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "chalk": "^4.0.0", - "escalade": "^3.1.1", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "resolve": "^1.20.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.5.tgz", - "integrity": "sha512-xUj2dPoEEd59P+nuih4XwNa4nJ/zRd/g4rMvjHrZPEBWeWRq/aJnnM6mug+B+Nx+ILXGtfWHzQvh7TqNV/WbuA==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "jest-regex-util": "^27.0.1", - "jest-snapshot": "^27.0.5" - } - }, - "jest-runner": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.5.tgz", - "integrity": "sha512-HNhOtrhfKPArcECgBTcWOc+8OSL8GoFoa7RsHGnfZR1C1dFohxy9eLtpYBS+koybAHlJLZzNCx2Y/Ic3iEtJpQ==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.5", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-docblock": "^27.0.1", - "jest-environment-jsdom": "^27.0.5", - "jest-environment-node": "^27.0.5", - "jest-haste-map": "^27.0.5", - "jest-leak-detector": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.5", - "jest-runtime": "^27.0.5", - "jest-util": "^27.0.2", - "jest-worker": "^27.0.2", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.5.tgz", - "integrity": "sha512-V/w/+VasowPESbmhXn5AsBGPfb35T7jZPGZybYTHxZdP7Gwaa+A0EXE6rx30DshHKA98lVCODbCO8KZpEW3hiQ==", - "dev": true, - "requires": { - "@jest/console": "^27.0.2", - "@jest/environment": "^27.0.5", - "@jest/fake-timers": "^27.0.5", - "@jest/globals": "^27.0.5", - "@jest/source-map": "^27.0.1", - "@jest/test-result": "^27.0.2", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.5", - "jest-message-util": "^27.0.2", - "jest-mock": "^27.0.3", - "jest-regex-util": "^27.0.1", - "jest-resolve": "^27.0.5", - "jest-snapshot": "^27.0.5", - "jest-util": "^27.0.2", - "jest-validate": "^27.0.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^16.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.1.tgz", - "integrity": "sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.5.tgz", - "integrity": "sha512-H1yFYdgnL1vXvDqMrnDStH6yHFdMEuzYQYc71SnC/IJnuuhW6J16w8GWG1P+qGd3Ag3sQHjbRr0TcwEo/vGS+g==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/parser": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.5", - "@jest/types": "^27.0.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.0.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.2", - "jest-get-type": "^27.0.1", - "jest-haste-map": "^27.0.5", - "jest-matcher-utils": "^27.0.2", - "jest-message-util": "^27.0.2", - "jest-resolve": "^27.0.5", - "jest-util": "^27.0.2", - "natural-compare": "^1.4.0", - "pretty-format": "^27.0.2", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.2.tgz", - "integrity": "sha512-1d9uH3a00OFGGWSibpNYr+jojZ6AckOMCXV2Z4K3YXDnzpkAaXQyIpY14FOJPiUmil7CD+A6Qs+lnnh6ctRbIA==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.2.tgz", - "integrity": "sha512-UgBF6/oVu1ofd1XbaSotXKihi8nZhg0Prm8twQ9uCuAfo59vlxCXMPI/RKmrZEVgi3Nd9dS0I8A0wzWU48pOvg==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.0.1", - "leven": "^3.1.0", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.2.tgz", - "integrity": "sha512-8nuf0PGuTxWj/Ytfw5fyvNn/R80iXY8QhIT0ofyImUvdnoaBdT6kob0GmhXR+wO+ALYVnh8bQxN4Tjfez0JgkA==", - "dev": true, - "requires": { - "@jest/test-result": "^27.0.2", - "@jest/types": "^27.0.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.0.2", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", - "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.5", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - } - } - }, - "markdownlint": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", - "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", - "dev": true, - "requires": { - "markdown-it": "13.0.1" - } - }, - "markdownlint-cli": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz", - "integrity": "sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ==", - "dev": true, - "requires": { - "commander": "~9.4.0", - "get-stdin": "~9.0.0", - "glob": "~8.0.3", - "ignore": "~5.2.0", - "js-yaml": "^4.1.0", - "jsonc-parser": "~3.1.0", - "markdownlint": "~0.26.2", - "markdownlint-rule-helpers": "~0.17.2", - "minimatch": "~5.1.0", - "run-con": "~1.2.11" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "markdownlint-rule-helpers": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", - "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", - "dev": true - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mri": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", - "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "peer": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "peer": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-cli": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.0.0.tgz", - "integrity": "sha512-Wjy/00wBBEgQqnSToznxLWDnATznokFGXsHtF/3G8glRZpz5KYlfHcBW/VMJmWAeF2x49zjgy4izjM3/Wx1dKA==", - "dev": true, - "requires": { - "chokidar": "^3.3.0", - "dependency-graph": "^0.11.0", - "fs-extra": "^10.0.0", - "get-stdin": "^9.0.0", - "globby": "^13.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^4.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^4.0.0", - "yargs": "^17.0.0" - }, - "dependencies": { - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - } - }, - "postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz", - "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==", - "dev": true, - "requires": { - "@jest/types": "^27.0.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" - }, - "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - } - } - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-con": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", - "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~3.0.0", - "minimist": "^1.2.6", - "strip-json-comments": "~3.1.1" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sade": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", - "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "peer": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "super-simple-sitemap-generator": { - "version": "git+ssh://git@github.com/etefera/super-simple-sitemap-generator.git#cb84797ded8cbcd24446610acd538b35d2a80ee3", - "dev": true, - "from": "super-simple-sitemap-generator@etefera/super-simple-sitemap-generator", - "requires": { - "commander": "^4.1.1", - "puppeteer": "^2.1.1", - "xmlbuilder": "^13.0.2" - }, - "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", - "dev": true, - "requires": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", - "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz", - "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", - "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlbuilder": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", - "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/site/package.json b/site/package.json deleted file mode 100644 index f0ac908980..0000000000 --- a/site/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "main": "none.js", - "scripts": { - "test": "jest", - "lint-check": "node node_modules/markdownlint-cli/markdownlint.js -c markdownlint.json -i node_modules . ../scripts", - "lint-fix": "node node_modules/markdownlint-cli/markdownlint.js -c markdownlint.json -i node_modules --fix . ../scripts" - }, - "devDependencies": { - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@gouch/to-title-case": "^2.2.1", - "autoprefixer": "^10.4.16", - "href-checker": "etefera/href-checker#docsify", - "jest": "^27.0.4", - "markdownlint-cli": "^0.32.2", - "postcss-cli": "^10.0.0", - "super-simple-sitemap-generator": "etefera/super-simple-sitemap-generator" - } -} diff --git a/site/reference/README.md b/site/reference/README.md deleted file mode 100644 index 727598f3e3..0000000000 --- a/site/reference/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Reference - -- [CLI Reference](/reference/cli/) -- [Schema Reference](/reference/schema/) -- [Annotations Reference](/reference/annotations/) diff --git a/site/reference/annotations/README.md b/site/reference/annotations/README.md deleted file mode 100644 index b65cf074fd..0000000000 --- a/site/reference/annotations/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Annotations Reference - -The following annotations are used to configure kpt features: - -| Annotation | Description | -| ---------- | ----------- | -| [config.kubernetes.io/depends-on] | specifies one or more resource dependencies | -| [config.kubernetes.io/apply-time-mutation] | specifies one or more substitutions to make at apply time using dependencies as input | -| [config.kubernetes.io/local-config] | specifies a resource to be skipped when applying | - -The following annotations are used by kpt internally: - -| Annotation | Description | -| ---------- | ----------- | -| `internal.config.kubernetes.io/path` | specifies the resource's file path when formatted as a ResourceList | -| `internal.config.kubernetes.io/index` | specifies the index of the resource in a file when formatted as a ResourceList | -| `config.kubernetes.io/merge-source` | specifies the source of the resource during a three way merge | - -[config.kubernetes.io/depends-on]: /reference/annotations/depends-on/ -[config.kubernetes.io/apply-time-mutation]: /reference/annotations/apply-time-mutation/ -[config.kubernetes.io/local-config]: /reference/annotations/local-config/ diff --git a/site/reference/annotations/apply-time-mutation/README.md b/site/reference/annotations/apply-time-mutation/README.md deleted file mode 100644 index 5e9a31fff9..0000000000 --- a/site/reference/annotations/apply-time-mutation/README.md +++ /dev/null @@ -1,225 +0,0 @@ ---- -title: "`apply-time-mutation`" -linkTitle: "apply-time-mutation" -type: docs -description: > - Specify one or more substitutions to make at apply time using dependencies as input. ---- - -The `config.kubernetes.io/apply-time-mutation` annotation specifies one or more -substitutions to make at apply time using dependencies as input. - -### Schema - -The annotation value accepts a list of substitutions, formatted as a YAML string. - -- (\[\][Substitution]), required - - A list of one or more substitutions to perform on the annotated object. - -#### Substitution - -A substitution is a modification to a specific target field. - -- **sourceRef**: ([ObjectReference]), required - - Reference to the source resource, the dependency for this substitution. - -- **sourcePath**: (string), required - - The source resource field to read from as input, specified with [JSONPath]. - -- **targetPath**: (string), required - - The target resource field to write to as output, specified with [JSONPath]. - -- **token**: (string) - - The substring to replace in the target resource field. - - If the token is unspecified, the whole target field value will be replaced, - allowing for replacement of non-string values using the source field type. - -#### ObjectReference - -A reference to a specific resource object. - -- **apiVersion**: (string) - - The group and version of the object resource. - - One of the following is required: apiVersion or group. - -- **group**: (string) - - The group of the object resource. - - Group is accepted as a version-less alternative to APIVersion. - - Group must be empty for resources in the "core" group. - - One of the following is required: apiVersion or group. - -- **kind**: (string), required - - The kind of the object resource. - -- **name**: (string), required - - The name of the object. - -- **namespace**: (string) - - The namespace of the object. - - Namespace is required for namespaced resources. - -### Behavior - -Like the `depends-on` feature, `apply-time-mutation` waits for dependencies -(source resources) to be applied and reconciled before applying the resource -with the annotation. - -Unlike the `depends-on` feature, `apply-time-mutation` modifies the annotated -resource before applying it. - -#### Special cases - -If the source resource is not part of the package being applied, the apply of -the target resource will fail with an error. - -The `apply-time-mutation` annotation is only enforced by `kpt live apply` and -`kpt live destroy`. Modifying or deleting these resources with other mechanisms -will not follow the rules specified by these annotations. - -### JSONPath syntax - -Since there is no formal specification for JSONPath, the supported syntax -depends on the chosen implementation. In this case, kpt uses the -[ajson](https://github.com/spyzhov/ajson) library. For details about what -language features are supported, see the -[json-path-comparison table](https://cburgmer.github.io/json-path-comparison/). - -### Example - -In this example, pod-b depends on pod-a with two substitutions that replace -tokens in the same target field. The value of the SERVICE_HOST environment -variable of a container in pod-b will be updated to represent the host and port -from pod-a. - -Create a new kpt package: - -```shell -mkdir my-pkg -cd my-pkg -kpt pkg init -``` - -Configure two pods, with one that depends on the other: - -```shell -cat > pods.yaml << EOF -kind: Pod -apiVersion: v1 -metadata: - name: pod-a - namespace: test -spec: - containers: - - name: nginx - image: nginx:1.21 - ports: - - name: tcp - containerPort: 80 ---- -apiVersion: v1 -kind: Pod -metadata: - name: pod-b - namespace: test - annotations: - config.kubernetes.io/apply-time-mutation: | - - sourceRef: - kind: Pod - name: pod-a - sourcePath: $.status.podIP - targetPath: $.spec.containers[?(@.name=="nginx")].env[?(@.name=="SERVICE_HOST")].value - token: ${pod-a-ip} - - sourceRef: - kind: Pod - name: pod-a - sourcePath: $.spec.containers[?(@.name=="nginx")].ports[?(@.name=="tcp")].containerPort - targetPath: $.spec.containers[?(@.name=="nginx")].env[?(@.name=="SERVICE_HOST")].value - token: ${pod-a-port} -spec: - containers: - - name: nginx - image: nginx:1.21 - ports: - - name: tcp - containerPort: 80 - env: - - name: SERVICE_HOST - value: "${pod-a-ip}:${pod-a-port}" -EOF -``` - -Create a namespace for your package: - -```shell -kubectl create namespace test -``` - -Initialize the package inventory: - -```shell -kpt live init -``` - -Apply the package to your Kubernetes cluster: - -```shell -kpt live apply -``` - -If all goes well, the output should look like this: - -``` -pod/pod-a created -1 resource(s) applied. 1 created, 0 unchanged, 0 configured, 0 failed -pod/pod-b created -1 resource(s) applied. 1 created, 0 unchanged, 0 configured, 0 failed -``` - -To verify that the SERVICE_HOST was mutated correctly: - -```shell -# Read the IP of pod-a -kubectl get pod pod-a -n test \ - -o jsonpath='{.status.podIP}' -``` - -```shell -# Read the SERVICE_HOST of pod-b -kubectl get pod pod-b -n test \ - -o jsonpath='{.spec.containers[?(@.name=="nginx")].env[?(@.name=="SERVICE_HOST")].value}' -``` - -Delete the package from your Kubernetes cluster: - -```shell -kpt live destroy -``` - -If all goes well, the output should look like this: - -``` -pod/pod-b deleted -1 resource(s) deleted, 0 skipped -pod/pod-a deleted -1 resource(s) deleted, 0 skipped -``` - -[Substitution]: /reference/annotations/apply-time-mutation/#substitution -[ObjectReference]: /reference/annotations/apply-time-mutation/#objectreference -[JSONPath]: /reference/annotations/apply-time-mutation/#jsonpath-syntax diff --git a/site/reference/annotations/depends-on/README.md b/site/reference/annotations/depends-on/README.md deleted file mode 100644 index a38fb3ee65..0000000000 --- a/site/reference/annotations/depends-on/README.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: "`depends-on`" -linkTitle: "depends-on" -type: docs -description: > - Specify one or more resource dependencies. ---- - -The `config.kubernetes.io/depends-on` annotation specifies one or more resource -dependencies. - -### Schema - -The annotation value accepts a list of resource references, delimited by commas. - -#### Resource reference - -A resource reference is a string that uniquely identifies a resource. - -It consists of the group, kind, name, and optionally the namespace, delimited by -forward slashes. - -| Resource Scope | Format | -| -------------- | ------ | -| namespace-scoped | `/namespaces///` | -| cluster-scoped | `//` | - -For resources in the "core" group, the empty string is used instead -(for example: `/namespaces/test/Pod/pod-a`). - -### Example - -In this example, pod-b depends on pod-a. - -Create a new kpt package: - -```shell -mkdir my-pkg -cd my-pkg -kpt pkg init -``` - -Configure two pods, with one that depends on the other: - -```shell -cat > pods.yaml << EOF -kind: Pod -apiVersion: v1 -metadata: - name: pod-a - namespace: test -spec: - containers: - - name: nginx - image: nginx:1.21 - ports: - - containerPort: 80 ---- -kind: Pod -apiVersion: v1 -metadata: - name: pod-b - namespace: test - annotations: - config.kubernetes.io/depends-on: /namespaces/test/Pod/pod-a -spec: - containers: - - name: nginx - image: nginx:1.21 - ports: - - containerPort: 80 -EOF -``` - -Create a namespace for your package: - -```shell -kubectl create namespace test -``` - -Initialize the package inventory: - -```shell -kpt live init -``` - -Apply the package to your Kubernetes cluster: - -```shell -kpt live apply -``` - -If all goes well, the output should look like this: - -``` -pod/pod-a created -1 resource(s) applied. 1 created, 0 unchanged, 0 configured, 0 failed -pod/pod-b created -1 resource(s) applied. 1 created, 0 unchanged, 0 configured, 0 failed -``` - -Delete the package from your Kubernetes cluster: - -```shell -kpt live destroy -``` - -If all goes well, the output should look like this: - -``` -pod/pod-b deleted -1 resource(s) deleted, 0 skipped -pod/pod-a deleted -1 resource(s) deleted, 0 skipped -``` diff --git a/site/reference/annotations/local-config/README.md b/site/reference/annotations/local-config/README.md deleted file mode 100644 index be2e733b7b..0000000000 --- a/site/reference/annotations/local-config/README.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "`local-config`" -linkTitle: "local-config" -type: docs -description: > - Specify a resource to be skipped when applying. ---- - -The `config.kubernetes.io/local-config` annotation specifies a resource to be -skipped when applying. - -These resources are generally used as input to kpt functions. - -Because local resources are not applied, they don't need to follow a resource -schema known by the cluster. They just need to be a valid Kubernetes resource, -with apiVersion, kind, metadata, and name. - -### Schema - -The annotation value accepts string values of `true` and `false`. - -Make sure to surround the value in quotes, otherwise it will be considered a -YAML boolean (invalid annotation), not a string. - -### Behavior - -Resources with the `local-config` annotation set to any value except `false` -will not be applied to the cluster when using `kpt live apply`. - -### Example - -In this example, the `ConfigMap` `cm-a` is local and not applied. - -Create a new kpt package: - -```shell -mkdir my-pkg -cd my-pkg -kpt pkg init -``` - -Configure a local `ConfigMap`: - -```shell -cat > setters.yaml << EOF -apiVersion: v1 -kind: ConfigMap -metadata: - name: setters - annotations: - config.kubernetes.io/local-config: "true" -data: - key-a: value-a - key-b: value-b -EOF -``` - -Create a namespace for your package: - -```shell -kubectl create namespace test -``` - -Initialize the package inventory: - -```shell -kpt live init -``` - -Apply the package to your Kubernetes cluster: - -```shell -kpt live apply -``` - -If all goes well, the output should be empty. - -To verify that the `ConfigMap` was not created: - -```shell -kubectl get ConfigMap setters -``` - -The request should error: - -``` -Error from server (NotFound): configmaps "setters" not found -``` diff --git a/site/reference/cli/README.md b/site/reference/cli/README.md deleted file mode 100755 index 656b06d45b..0000000000 --- a/site/reference/cli/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# CLI Reference - - - - - -All kpt commands follow this general synopsis: - -``` -kpt [PKG_PATH] [flags] -``` - -kpt functionality is divided into following command groups: - -| Group | Description | -| ------- | --------------------------------------------------------------------- | -| [pkg] | get, update, and describe packages with resources. | -| [fn] | generate, transform, validate packages using containerized functions. | -| [live] | deploy local configuration packages to a cluster. | -| [alpha] | commands currently in alpha and might change without notice. | - - - -[pkg]: /reference/cli/pkg/ -[fn]: /reference/cli/fn/ -[live]: /reference/cli/live/ -[alpha]: /reference/cli/alpha/ \ No newline at end of file diff --git a/site/reference/cli/TEMPLATE.md b/site/reference/cli/TEMPLATE.md deleted file mode 100644 index 8f3b85e71a..0000000000 --- a/site/reference/cli/TEMPLATE.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "`cmd`" -linkTitle: "cmd" -type: docs -description: > -One line description of the command ---- - - -Short description of the command. The command should be referred to verbatim and -not be capitalized, for example `get`, `update`, `fn`. -The documentation for each command should be focused and concise. Any fundamental -concepts or concerns cutting across many command should be covered in the kpt book -and the reference docs should provide deep links to the relevant content. -Args, flags, and env vars should be listed in alphabetical order. - -### Synopsis - -``` -kpt [flags] -``` - -#### Args -``` -EXAMPLE_ARG: - Description of the arg. This should include information about whether the ARG - is required and if it is not, what would be the default value. It should use - correct grammar, including capitalization and punctuation. -``` - -#### Flags -``` ---example-flag: - Description of the flag, including the default value. It should use correct - grammar, including capitalization and punctuation. -``` - -#### Env Vars -``` -EXAMPLE_ENV_VAR: - Description of the env variable. It should use correct - grammar, including capitalization and punctuation. -``` - - -### Examples - - -```shell -# Examples of how to use the command. This should include the most common use-cases -# and include an example where the local package argument is not provided. -# The description of each example should use correct grammar, including capitalization -# and punctuation. -kpt ... -``` - \ No newline at end of file diff --git a/site/reference/cli/alpha/README.md b/site/reference/cli/alpha/README.md deleted file mode 100644 index 5bd43b690d..0000000000 --- a/site/reference/cli/alpha/README.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "`alpha`" -linkTitle: "alpha" -type: docs -weight: 4 -description: > - This command is currently in alpha and might change without notice. ---- - - - - -The `alpha` command group contains subcommands which are in alpha and might change without notice. - diff --git a/site/reference/cli/alpha/live/README.md b/site/reference/cli/alpha/live/README.md deleted file mode 100644 index 6dfff280e3..0000000000 --- a/site/reference/cli/alpha/live/README.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "`live`" -linkTitle: "live" -type: docs -weight: 4 -description: > - Deploy local packages to a cluster. ---- - - - - -The `live` command group contains subcommands for deploying local -`kpt` packages to a cluster. - - diff --git a/site/reference/cli/alpha/live/plan/README.md b/site/reference/cli/alpha/live/plan/README.md deleted file mode 100644 index 0dc017d30e..0000000000 --- a/site/reference/cli/alpha/live/plan/README.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "`plan`" -linkTitle: "plan" -type: docs -description: > - Output a plan for the changes that will happen when applying a package. ---- - - - -?> This feature is still in alpha, so the UX and the output format is subject to change. - -`plan` does a dry-run of applying a package to the cluster. It outputs the results -in combination with a diff for every resource that will be updated, which gives an -overview of the impact of applying a package. - -Note that `plan` does only works reliably with server-side apply. - -### Synopsis - - - -``` -kpt alpha live plan [PKG_PATH | -] [flags] -``` - -#### Args - -``` -PKG_PATH | -: - Path to the local package which should be applied to the cluster. It must - contain a Kptfile with inventory information. Defaults to the current working - directory. - Using '-' as the package path will cause kpt to read resources from stdin. -``` - -#### Flags - -``` ---field-manager: - Identifier for the **owner** of the fields being applied. Only usable - when --server-side flag is specified. Default value is kubectl. - ---force-conflicts: - Force overwrite of field conflicts during apply due to different field - managers. Only usable when --server-side flag is specified. - Default value is false (error and failure when field managers conflict). - ---inventory-policy: - Determines how to handle overlaps between the package being currently applied - and existing resources in the cluster. The available options are: - - * strict: If any of the resources already exist in the cluster, but doesn't - belong to the current package, it is considered an error. - * adopt: If a resource already exist in the cluster, but belongs to a - different package, it is considered an error. Resources that doesn't belong - to other packages are adopted into the current package. - - The default value is `strict`. - ---output: - Determines the output format for the plan. Must be one of the following: - - * text: The plan will be printed as text to stdout. - * krm: The plan will be printed as a Plan KRM resource to stdout. This - can be used as input to kpt functions for automatic validation. - - The default value is ‘text’. -``` - - - -### Examples - - - -```shell -# create a plan for the package in the current directory and output in KRM format. -$ kpt alpha live plan --output=krm -``` - diff --git a/site/reference/cli/alpha/repo/README.md b/site/reference/cli/alpha/repo/README.md deleted file mode 100644 index 40b588a121..0000000000 --- a/site/reference/cli/alpha/repo/README.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "`repo`" -linkTitle: "repo" -type: docs -weight: 4 -description: > - Manage package repositories. ---- - - - - -The `repo` command group contains subcommands for managing package repositories. - \ No newline at end of file diff --git a/site/reference/cli/alpha/repo/get/README.md b/site/reference/cli/alpha/repo/get/README.md deleted file mode 100644 index 5655c7c3c8..0000000000 --- a/site/reference/cli/alpha/repo/get/README.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "`get`" -linkTitle: "get" -type: docs -description: > - List registered repositories. ---- - - - -`get` lists registered repositories. - -### Synopsis - - - -``` -kpt alpha repo get [REPOSITORY_NAME] [flags] -``` - -#### Args - -``` -REPOSITORY_NAME: - The name of a repository. If provided, only that specific - repository will be shown. Defaults to showing all registered - repositories. -``` - - - -### Examples - - - -```shell -# list all repositories registered in the default namespace -$ kpt alpha repo get --namespace default -``` - -```shell -# show the repository named foo in the bar namespace -$ kpt alpha repo get foo --namespace bar -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/repo/reg/README.md b/site/reference/cli/alpha/repo/reg/README.md deleted file mode 100644 index bde3075094..0000000000 --- a/site/reference/cli/alpha/repo/reg/README.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "`reg`" -linkTitle: "reg" -type: docs -description: > - Register a package repository. ---- - - - -`reg` registers a new repository. - -### Synopsis - - - -``` -kpt alpha repo reg REPOSITORY [flags] -``` - -#### Args - -``` -REPOSITORY: - The URI for the registry. It can be either a git repository - or an oci repository. For the latter, the URI must have the - 'oci://' prefix. -``` - -#### Flags - -``` ---branch: - Branch within the repository where finalized packages are - commited. The default is to use the 'main' branch. - ---deployment: - Tags the repository as a deployment repository. Packages in - a deployment repository are considered ready for deployment. - ---description: - Description of the repository. - ---directory: - Directory within the repository where packages are found. The - default is the root of the repository. - ---name: - Name of the repository. By default the last segment of the - repository URL will be used as the name. - ---repo-basic-username: - Username for authenticating to a repository with basic auth. - ---repo-basic-password: - Password for authenticating to a repository with basic auth. -``` - - - -### Examples - - - -```shell -# register a new git repository with the name generated from the URI. -$ kpt alpha repo register https://github.com/platkrm/demo-blueprints.git --namespace=default -``` - -```shell -# register a new deployment repository with name foo. -$ kpt alpha repo register https://github.com/platkrm/blueprints-deployment.git --name=foo --deployment --namespace=bar -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/repo/unreg/README.md b/site/reference/cli/alpha/repo/unreg/README.md deleted file mode 100644 index bef3aa7459..0000000000 --- a/site/reference/cli/alpha/repo/unreg/README.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "`unreg`" -linkTitle: "unreg" -type: docs -description: > - Unregister a repository. ---- - - - -`unreg` unregisters a repository. - -### Synopsis - - - -``` -kpt alpha repo unreg REPOSITORY_NAME [flags] -``` - -#### Args - -``` -REPOSITORY_NAME: - The name of a repository. -``` - -#### Flags - -``` ---keep-auth-secret: - Keep the Secret object with auth information referenced by the repository. - By default, it will be deleted when the repository is unregistered. -``` - - - -### Examples - - - -```shell -# unregister a repository and keep the auth secret. -$ kpt alpha repo unreg registered-repository --namespace=default --keep-auth-secret -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/README.md b/site/reference/cli/alpha/rpkg/README.md deleted file mode 100644 index a6a25ee655..0000000000 --- a/site/reference/cli/alpha/rpkg/README.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "`rpkg`" -linkTitle: "rpkg" -type: docs -description: > - Manage packages. ---- - - - - -The `rpkg` command group contains subcommands for managing packages and revisions. - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/approve/README.md b/site/reference/cli/alpha/rpkg/approve/README.md deleted file mode 100644 index b37ed56569..0000000000 --- a/site/reference/cli/alpha/rpkg/approve/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "`approve`" -linkTitle: "approve" -type: docs -description: > - Approve a proposal to publish a package revision. ---- - - - -`approve` publishes a package revision - -### Synopsis - - - -``` -kpt alpha rpkg approve [PACKAGE_REV_NAME...] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME...: - The name of one or more package revisions. If more than - one is provided, they must be space-separated. -``` - - - -### Examples - - - -```shell -# approve package revision blueprint-91817620282c133138177d16c981cf35f0083cad -$ kpt alpha rpkg approve blueprint-91817620282c133138177d16c981cf35f0083cad --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/clone/README.md b/site/reference/cli/alpha/rpkg/clone/README.md deleted file mode 100644 index f75e360ee7..0000000000 --- a/site/reference/cli/alpha/rpkg/clone/README.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "`clone`" -linkTitle: "clone" -type: docs -description: > - Create a clone of an existing package revision. ---- - - - -`clone` creates a new package revision by cloning an existing one. The -new package revision will keep a reference to the source that can be used -to pull in updates. - -### Synopsis - - - -``` -kpt alpha rpkg clone SOURCE_PACKAGE_REV TARGET_PACKAGE_NAME [flags] -``` - -#### Args - -``` -SOURCE_PACKAGE_REV: - The source package that will be cloned to create the new package revision. - The types of sources are supported: - - * OCI: A URI to a OCI repository must be provided. - oci://oci-repository/package-name - * Git: A URI to a git repository must be provided. - https://git-repository.git/package-name - * Package: The name of a package revision already available in the - repository. - blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a - -TARGET_PACKAGE_NAME: - The name of the new package. - -``` - -#### Flags - -``` ---directory - Directory within the repository where the upstream - package revision is located. This only applies if the source package is in git - or oci. - ---ref - Ref in the repository where the upstream package revision - is located (branch, tag, SHA). This only applies when the source package - is in git. - ---repository - Repository to which package revision will be cloned - (downstream repository). - ---workspace - Workspace for the new package. The default value is v1. - ---strategy - Update strategy that should be used when updating the new - package revision. Must be one of: resource-merge, fast-forward, or - force-delete-replace. The default value is resource-merge. -``` - - - -### Examples - - - -```shell -# clone the blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a package and create a new package revision called -# foo in the blueprint repository with a custom workspaceName. -$ kpt alpha rpkg clone blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a foo --repository blueprint --workspace=first-draft -``` - -```shell -# clone the git repository at https://github.com/repo/blueprint.git at reference base/v0 and in directory base. The new -# package revision will be created in repository blueprint and namespace default. -$ kpt alpha rpkg clone https://github.com/repo/blueprint.git bar --repository=blueprint --ref=base/v0 --namespace=default --directory=base -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/copy/README.md b/site/reference/cli/alpha/rpkg/copy/README.md deleted file mode 100644 index 658455496d..0000000000 --- a/site/reference/cli/alpha/rpkg/copy/README.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "`copy`" -linkTitle: "copy" -type: docs -description: > - Create a new package revision from an existing one. ---- - - - -`copy` creates a new package revision from an existing one. The new -revision will be identical to the existing one but with a different -workspace. - -### Synopsis - - - -``` -kpt alpha rpkg copy SOURCE_PACKAGE_REV_NAME [flags] -``` - -#### Args - -``` -SOURCE_PACKAGE_REV_NAME: - The name of the package revision that will be used as the source - for creating a new package revision. -``` - -#### Flags - -``` ---workspace - Workspace for the new package revision. -``` - - - -### Examples - - - -```shell -# create a new package from package blueprint-b47eadc99f3c525571d3834cc61b974453bc6be2 -$ kpt alpha rpkg copy blueprint-b47eadc99f3c525571d3834cc61b974453bc6be2 --workspace=v10 --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/del/README.md b/site/reference/cli/alpha/rpkg/del/README.md deleted file mode 100644 index a1dd6b00c2..0000000000 --- a/site/reference/cli/alpha/rpkg/del/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "`del`" -linkTitle: "del" -type: docs -description: > - Delete a package revision. ---- - - - -`del` removes a package revision from the repository. - -### Synopsis - - - -``` -kpt alpha rpkg del PACKAGE_REV_NAME... [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME...: - The name of one or more package revisions. If more than - one is provided, they must be space-separated. -``` - - - -### Examples - - - -```shell -# remove package revision blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a from the default namespace -$ kpt alpha rpkg del blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/get/README.md b/site/reference/cli/alpha/rpkg/get/README.md deleted file mode 100644 index 9004c2de92..0000000000 --- a/site/reference/cli/alpha/rpkg/get/README.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "`get`" -linkTitle: "get" -type: docs -description: > - List package revisions in registered repositories. ---- - - - -`get` lists package revisions in the registered repositories. - -### Synopsis - - - -``` -kpt alpha rpkg get [PACKAGE_REV_NAME] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME: - The name of a package revision. If provided, only that specific - package revision will be shown. Defaults to showing all package - revisions from all repositories. -``` - -#### Flags - -``` ---name - Name of the packages to get. Any package whose name contains - this value will be included in the results. - ---revision - Revision of the package to get. Any package whose revision - matches this value will be included in the results. -``` - - - -### Examples - - - -```shell -# get a specific package revision in the default namespace -$ kpt alpha rpkg get blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a --namespace=default -``` - -```shell -# get all package revisions in the bar namespace -$ kpt alpha rpkg get --namespace=bar -``` - -```shell -# get all package revisions with revision v0 -$ kpt alpha rpkg get --revision=v0 -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/init/README.md b/site/reference/cli/alpha/rpkg/init/README.md deleted file mode 100644 index 0f0abd0511..0000000000 --- a/site/reference/cli/alpha/rpkg/init/README.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "`init`" -linkTitle: "init" -type: docs -description: > - Initializes a new package in a repository. ---- - - - -`init` initializes a new package in a repository. The inital package revision -will be empty. - -### Synopsis - - - -``` -kpt alpha rpkg init PACKAGE_NAME [flags] -``` - -#### Args - -``` -PACKAGE_NAME: - The name of the new package. -``` - -#### Flags - -``` ---repository - Repository in which the new package will be created. - ---workspace - Workspace of the new package. - ---description - Short description of the package - ---keywords - List of keywords for the package - ---site - Link to page with information about the package -``` - - - -### Examples - - - -```shell -# create a new package named foo in the repository blueprint. -$ kpt alpha rpkg init foo --namespace=default --repository=blueprint --workspace=v1 -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/propose-delete/README.md b/site/reference/cli/alpha/rpkg/propose-delete/README.md deleted file mode 100644 index c9f3e9442d..0000000000 --- a/site/reference/cli/alpha/rpkg/propose-delete/README.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "`propose-delete`" -linkTitle: "propose-delete" -type: docs -description: > - Propose deletion of a published package revision. ---- - - - -`propose-delete` proposes a published package revision for deletion, i.e. -changes its lifecycle from 'Published' to 'DeletionProposed'. - -### Synopsis - - - -``` -kpt alpha rpkg propose-delete PACKAGE_REV_NAME... [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME...: -The name of one or more package revisions. If more than -one is provided, they must be space-separated. -``` - - - -### Examples - - - -```shell -# Propose published package revision blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a for deletion. -$ kpt alpha rpkg propose-delete blueprint-e982b2196b35a4f5e81e92f49a430fe463aa9f1a --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/propose/README.md b/site/reference/cli/alpha/rpkg/propose/README.md deleted file mode 100644 index 06d0350a28..0000000000 --- a/site/reference/cli/alpha/rpkg/propose/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "`propose`" -linkTitle: "propse" -type: docs -description: > - Propose that a package revision should be published. ---- - - - -`propose` creates a proposal for the package revision to be published. - -### Synopsis - - - -``` -kpt alpha rpkg propose [PACKAGE_REV_NAME...] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME...: - The name of one or more package revisions. If more than - one is provided, they must be space-separated. -``` - - - -### Examples - - - -```shell -# propose that package revision blueprint-91817620282c133138177d16c981cf35f0083cad should be finalized. -$ kpt alpha rpkg propose blueprint-91817620282c133138177d16c981cf35f0083cad --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/pull/README.md b/site/reference/cli/alpha/rpkg/pull/README.md deleted file mode 100644 index cf6a83707e..0000000000 --- a/site/reference/cli/alpha/rpkg/pull/README.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "`pull`" -linkTitle: "pull" -type: docs -description: > - Pull the content of the package revision. ---- - - - -`pull` fetches the content of the package revision from the -repository. - -### Synopsis - - - -``` -kpt alpha rpkg pull PACKAGE_REV_NAME [DIR] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME: - The name of a an existing package revision in a repository. - -DIR: - A local directory where the package manifests will be written. - If not provided, the manifests are written to stdout. -``` - - - -### Examples - - - -```shell -# pull the content of package revision blueprint-d5b944d27035efba53836562726fb96e51758d97 -$ kpt alpha rpkg pull blueprint-d5b944d27035efba53836562726fb96e51758d97 --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/push/README.md b/site/reference/cli/alpha/rpkg/push/README.md deleted file mode 100644 index 40cc103d0b..0000000000 --- a/site/reference/cli/alpha/rpkg/push/README.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "`push`" -linkTitle: "push" -type: docs -description: > - Push resources to a package revision. ---- - - - -`push` update the content of a package revision with -the provided resources. - -### Synopsis - - - -``` -kpt alpha rpkg push PACKAGE_REV_NAME [DIR] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME: - The name of a an existing package revision in a repository. - -DIR: - A local directory with the new manifest. If not provided, - the manifests will be read from stdin. -``` - - - -### Examples - - - -```shell -# update the package revision blueprint-f977350dff904fa677100b087a5bd989106d0456 with the resources -# in the ./package directory -$ kpt alpha rpkg push blueprint-f977350dff904fa677100b087a5bd989106d0456 ./package --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/reject/README.md b/site/reference/cli/alpha/rpkg/reject/README.md deleted file mode 100644 index 5aa2723357..0000000000 --- a/site/reference/cli/alpha/rpkg/reject/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "`reject`" -linkTitle: "reject" -type: docs -description: > - Reject a proposal to publish or delete a package revision. ---- - - - -`reject` closes a proposal for publishing or deleting a package revision. - -### Synopsis - - - -``` -kpt alpha rpkg reject [PACKAGE_REV_NAME...] [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME...: - The name of one or more package revisions. If more than - one is provided, they must be space-separated. -``` - - - -### Examples - - - -```shell -# reject the proposal for package revision blueprint-8f9a0c7bf29eb2cbac9476319cd1ad2e897be4f9 -$ kpt alpha rpkg reject blueprint-8f9a0c7bf29eb2cbac9476319cd1ad2e897be4f9 --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/rpkg/update/README.md b/site/reference/cli/alpha/rpkg/update/README.md deleted file mode 100644 index ebcf4e5d8a..0000000000 --- a/site/reference/cli/alpha/rpkg/update/README.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "`clone`" -linkTitle: "clone" -type: docs -description: > -Update a downstream package revision to a more recent revision of its upstream package. ---- - - - -`update` performs a kpt pkg update on an existing downstream package revision. - -### Synopsis - - - -``` -kpt alpha rpkg update PACKAGE_REV_NAME [flags] -``` - -#### Args - -``` -PACKAGE_REV_NAME: -The target downstream package revision to be updated. - -``` - -#### Flags - -``` ---revision -The revision number of the upstream kpt package that the target -downstream package (PACKAGE_REV_NAME) should be updated to. With -this flag, you can only specify one target downstream package. - ---discover -If set, list packages revisions that need updates rather than -performing an update. Must be one of 'upstream' or 'downstream'. If -set to 'upstream', this will list downstream package revisions that -have upstream updates available. If set to 'downstream', this will list -upstream package revisions whose downstream package revisions need -to be updated. You can optionally pass in package revision names as arguments -in order to just list updates for those package revisions, or you can -pass in no arguments in order to list available updates for all package -revisions. - -``` - - - -### Examples - - - -```shell -# update deployment-e982b2196b35a4f5e81e92f49a430fe463aa9f1a package to v3 of its upstream -$ kpt alpha rpkg update deployment-e982b2196b35a4f5e81e92f49a430fe463aa9f1a --revision=v3 -``` - -```shell -# see available upstream updates for all your downstream packages -$ kpt alpha rpkg update --discover=upstream -``` - -```shell -# see available updates for any downstream packages that were created from the upstream blueprints-e982b2196b35a4f5e81e92f49a430fe463aa9f1a package -$ kpt alpha rpkg update --discover=downstream blueprints-e982b2196b35a4f5e81e92f49a430fe463aa9f1a -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/sync/README.md b/site/reference/cli/alpha/sync/README.md deleted file mode 100644 index 2a6d143fc8..0000000000 --- a/site/reference/cli/alpha/sync/README.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "`sync`" -linkTitle: "sync" -type: docs -description: > - Deploy packages. ---- - - - - -The `sync` command group contains subcommands for deploying packages. - \ No newline at end of file diff --git a/site/reference/cli/alpha/sync/create/README.md b/site/reference/cli/alpha/sync/create/README.md deleted file mode 100644 index a7c028d12b..0000000000 --- a/site/reference/cli/alpha/sync/create/README.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "`create`" -linkTitle: "create" -type: docs -description: > - Create a new sync resource in the cluster. ---- - - - -`create` adds a new RootSync resource to the cluster which references -the specified package. Config Sync then deploys the package into the cluster. - -### Synopsis - - - -``` -kpt alpha sync create DEPLOYMENT_NAME [flags] -``` - -#### Args - -``` -DEPLOYMENT_NAME: - The name of the sync resource created in the cluster. -``` - -#### Flags - -``` ---package - Name of the package that should be deployed. It must exist in a - deployment repo and be published. -``` - - - -### Examples - - - -```shell -# get a specific package in the default namespace -$ kpt alpha sync create my-app --package=deployment-8f9a0c7bf29eb2cbac9476319cd1ad2e897be4f9 --namespace=default -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/sync/delete/README.md b/site/reference/cli/alpha/sync/delete/README.md deleted file mode 100644 index 35ed210e97..0000000000 --- a/site/reference/cli/alpha/sync/delete/README.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "`delete`" -linkTitle: "delete" -type: docs -description: > - Remove a sync resource from the cluster. ---- - - - -`delete` removes a sync resource from the cluster. This will also remove -the package resources. - -### Synopsis - - - -``` -kpt alpha sync delete DEPLOYMENT_NAME [flags] -``` - -#### Args - -``` -DEPLOYMENT_NAME: - The name of the sync resource deleted from the cluster. -``` - -#### Flags - -``` ---keep-auth-secret - Do not delete the repository authentication secret, if it exists. - ---timeout - How long we should wait for all resources to be deleted from the cluster. -``` - - - -### Examples - - - -```shell -# remove the my-app sync resource from the cluster. Wait up to 5 minutes for -# resources to be deleted. -$ kpt alpha sync delete my-app --timeout=5m -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/sync/get/README.md b/site/reference/cli/alpha/sync/get/README.md deleted file mode 100644 index c9128759ff..0000000000 --- a/site/reference/cli/alpha/sync/get/README.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "`get`" -linkTitle: "get" -type: docs -description: > - Get sync resources from the cluster. ---- - - - -`get` lists sync resources in the cluster. - -### Synopsis - - - -``` -kpt alpha sync get [DEPLOYMENT_NAME] [flags] -``` - -#### Args - -``` -DEPLOYMENT_NAME: - The name of a sync resource. -``` - - - -### Examples - - - -```shell -# get the sync resource named my-app from the cluster. -$ kpt alpha sync get my-app -``` - - \ No newline at end of file diff --git a/site/reference/cli/alpha/wasm/README.md b/site/reference/cli/alpha/wasm/README.md deleted file mode 100644 index eb6f5a3054..0000000000 --- a/site/reference/cli/alpha/wasm/README.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "`wasm`" -linkTitle: "wasm" -type: docs -weight: 4 -description: > -Manage WASM modules as OCI images. ---- - - - - -The `wasm` command group contains subcommands for managing WASM modules as OCI images. - diff --git a/site/reference/cli/alpha/wasm/pull/README.md b/site/reference/cli/alpha/wasm/pull/README.md deleted file mode 100644 index ae0dec3fc5..0000000000 --- a/site/reference/cli/alpha/wasm/pull/README.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "`pull`" -linkTitle: "pull" -type: docs -description: > -Pull WASM modules. ---- - - - -`pull` fetches and decompressed OCI image to WASM module. - -### Synopsis - - - -``` -kpt alpha wasm pull [IMAGE] [LOCAL_PATH] -``` - -#### Args - -``` -IMAGE: - The name of an image. It can be either a tag or a digest. -LOCAL_PATH: - The desired path for the wasm file. e.g. /tmp/my-fn.wasm -``` - - - -### Examples - - - -```shell -# pull image gcr.io/my-org/my-fn:v1.0.0 and decompress it to ./my-fn.wasm -$ kpt alpha wasm pull gcr.io/my-org/my-fn:v1.0.0 ./my-fn.wasm -``` - - diff --git a/site/reference/cli/alpha/wasm/push/README.md b/site/reference/cli/alpha/wasm/push/README.md deleted file mode 100644 index 42a45dd5c1..0000000000 --- a/site/reference/cli/alpha/wasm/push/README.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: "`push`" -linkTitle: "push" -type: docs -description: > -Push WASM modules. ---- - - - -`push` compresses a WASM module and push it as an OCI image. - -### Synopsis - - - -``` -kpt alpha wasm push [LOCAL_PATH] [IMAGE] -``` - -#### Args - -``` -LOCAL_PATH: - The path to the wasm file. -IMAGE: - The desired name of an image. It must be a tag. -``` - - - -### Examples - - - -```shell -# compress ./my-fn.wasm and push it to gcr.io/my-org/my-fn:v1.0.0 -$ kpt alpha wasm push ./my-fn.wasm gcr.io/my-org/my-fn:v1.0.0 -``` - - diff --git a/site/reference/cli/fn/README.md b/site/reference/cli/fn/README.md deleted file mode 100644 index 6dd08ef8e6..0000000000 --- a/site/reference/cli/fn/README.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "`fn`" -linkTitle: "fn" -type: docs -weight: 4 -description: > - Transform and validate packages using containerized functions. ---- - - - - -The `fn` command group contains subcommands for transforming and validating `kpt` packages -using containerized functions. - \ No newline at end of file diff --git a/site/reference/cli/fn/doc/README.md b/site/reference/cli/fn/doc/README.md deleted file mode 100644 index 0fd7d88c24..0000000000 --- a/site/reference/cli/fn/doc/README.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Doc" -linkTitle: "doc" -type: docs -description: > - Display the documentation for a function ---- - - - -### Synopsis - - - -`kpt fn doc` invokes the function container with `--help` flag. -If the function supports `--help`, it will print the documentation to STDOUT. -Otherwise, it will exit with non-zero exit code and print the error message to STDERR. - -``` -kpt fn doc --image=IMAGE -``` - -#### Flags - -``` ---image, i: (required flag) - Container image of the function e.g. `gcr.io/kpt-fn/set-namespace:v0.1`. - For convenience, if full image path is not specified, `gcr.io/kpt-fn/` is added as default prefix. - e.g. instead of passing `gcr.io/kpt-fn/set-namespace:v0.1` you can pass `set-namespace:v0.1`. -``` - -#### Environment Variables - -``` -KPT_FN_RUNTIME: - The runtime to run kpt functions. It must be one of "docker", "podman" and "nerdctl". -``` - - - -### Examples - - - -```shell -# display the documentation for image set-namespace:v0.1.1 -kpt fn doc -i set-namespace:v0.1.1 -``` - - diff --git a/site/reference/cli/fn/eval/README.md b/site/reference/cli/fn/eval/README.md deleted file mode 100644 index 2c1463d8a1..0000000000 --- a/site/reference/cli/fn/eval/README.md +++ /dev/null @@ -1,268 +0,0 @@ ---- -title: "`eval`" -linkTitle: "eval" -type: docs -description: > - Execute function on resources ---- - - - -`eval` executes a function on resources in a directory. Functions are packaged -as container images. - -If the function fails (i.e. exits with non-zero status code), `eval` will abort -and the local filesystem is left intact. - -Refer to the [Imperative Function Execution] for detailed overview. - -### Synopsis - - - -``` -kpt fn eval [DIR|-] [flags] [-- fn-args] -``` - -#### Args - -``` -DIR|-: - Path to the local directory containing resources. Defaults to the current - working directory. Using '-' as the directory path will cause `eval` to - read resources from `stdin` and write the output to `stdout`. When resources are - read from `stdin`, they must be in one of the following input formats: - - 1. Multi object YAML where resources are separated by `---`. - - 2. KRM Function Specification wire format where resources are wrapped in an object - of kind ResourceList. - - If the output is written to `stdout`, resources are written in multi object YAML - format where resources are separated by `---`. -``` - -``` -fn-args: - function arguments to be provided as input to the function. These must be - provided in the `key=value` format and come after the separator `--`. -``` - -#### Flags - -``` ---as-current-user: - Use the `uid` and `gid` of the kpt process for container function execution. - By default, container function is executed as `nobody` user. You may want to use - this flag to run higher privilege operations such as mounting the local filesystem. - ---env, e: - List of local environment variables to be exported to the container function. - By default, none of local environment variables are made available to the - container running the function. The value can be in `key=value` format or only - the key of an already exported environment variable. - ---exec: - Path to the local executable binary to execute as a function. Quotes are needed - if the executable requires arguments. `eval` executes only one function, so do - not use `--image` flag with this flag. This is useful for testing function locally - during development. It enables faster dev iterations by avoiding the function to - be published as container image. - ---fn-config: - Path to the file containing `functionConfig` for the function. - ---image, i: - Container image of the function to execute e.g. `gcr.io/kpt-fn/set-namespace:v0.1`. - For convenience, if full image path is not specified, `gcr.io/kpt-fn/` is added as default prefix. - e.g. instead of passing `gcr.io/kpt-fn/set-namespace:v0.1` you can pass `set-namespace:v0.1`. - `eval` executes only one function, so do not use `--exec` flag with this flag. - ---image-pull-policy: - If the image should be pulled before rendering the package(s). It can be set - to one of always, ifNotPresent, never. If unspecified, always will be the - default. - If using always, kpt will ensure the function images to run are up-to-date - with the remote container registry. This can be useful for tags like v1. - If using ifNotPresent, kpt will only pull the image when it can't find it in - the local cache. - If using never, kpt will only use images from the local cache. - ---include-meta-resources, m: - (DEPRECATED) include-meta-resources is no longer necessary because meta - resources are included by default with kpt version v1.0.0-beta.15+. - ---match-api-version: - Select resources matching the given apiVersion. - ---match-kind - Select resources matching the given kind. - ---match-name: - Select resources matching the given name. - ---match-namespace: - Select resources matching the given namespace. - ---mount: - List of storage options to enable reading from the local filesytem. By default, - container functions can not access the local filesystem. It accepts the same options - as specified on the [Docker Volumes] for `docker run`. All volumes are mounted - readonly by default. Specify `rw=true` to mount volumes in read-write mode. - ---network: - If enabled, container functions are allowed to access network. - By default it is disabled. - ---output, o: - If specified, the output resources are written to provided location, - if not specified, resources are modified in-place. - Allowed values: stdout|unwrap| - 1. stdout: output resources are wrapped in ResourceList and written to stdout. - 2. unwrap: output resources are written to stdout, in multi-object yaml format. - 3. OUT_DIR_PATH: output resources are written to provided directory. - The provided directory must not already exist. - ---type, t; - Specify the function type. Accept value `mutator` (default), `validator`. - If used with `--save`, this flag will save the evaluated function to the corresponding - Kptfile section: `.pipeline.mutators` if type is `mutator`; `.pipeline.validators` if type - is `validator`. - ---results-dir: - Path to a directory to write structured results. Directory will be created if - it doesn't exist. Structured results emitted by the functions are aggregated and saved - to `results.yaml` file in the specified directory. - If not specified, no result files are written to the local filesystem. - ---save, s: - Save the function image and fn-config to Kptfile. Require ` + "`" + `--image` + "`" + `. - -``` - -#### Environment Variables - -``` -KPT_FN_RUNTIME: - The runtime to run kpt functions. It must be one of "docker", "podman" and "nerdctl". -``` - - - -## Examples - - - -```shell -# execute container my-fn on the resources in DIR directory and -# write output back to DIR -$ kpt fn eval DIR -i gcr.io/example.com/my-fn -``` - -```shell -# execute container my-fn on the resources in DIR directory with -# `functionConfig` my-fn-config -$ kpt fn eval DIR -i gcr.io/example.com/my-fn --fn-config my-fn-config -``` - -```shell -# execute container my-fn with an input ConfigMap containing `data: {foo: bar}` -$ kpt fn eval DIR -i gcr.io/example.com/my-fn:v1.0.0 -- foo=bar -``` - -```shell -# execute container my-fn and save it to Kptfile `pipeline.mutators` (Default) list. -$ kpt fn eval DIR -s -i gcr.io/example.com/my-fn:v1.0.0 -- foo=bar -``` - -```shell -# execute container my-fn and save it to Kptfile `pipeline.validators` list. -$ kpt fn eval DIR -s -t validator -i gcr.io/example.com/my-fn:v1.0.0 -- foo=bar -``` - -```shell -# execute executable my-fn on the resources in DIR directory and -# write output back to DIR -$ kpt fn eval DIR --exec ./my-fn -``` - -```shell -# execute executable my-fn with arguments on the resources in DIR directory and -# write output back to DIR -$ kpt fn eval DIR --exec "./my-fn arg1 arg2" -``` - -```shell -# execute container my-fn on the resources in DIR directory, -# save structured results in /tmp/my-results dir and write output back to DIR -$ kpt fn eval DIR -i gcr.io/example.com/my-fn --results-dir /tmp/my-results-dir -``` - -```shell -# execute container my-fn on the resources in DIR directory with network access enabled, -# and write output back to DIR -$ kpt fn eval DIR -i gcr.io/example.com/my-fn --network -``` - -```shell -# execute container my-fn on the resource in DIR and export KUBECONFIG -# and foo environment variable -$ kpt fn eval DIR -i gcr.io/example.com/my-fn --env KUBECONFIG -e foo=bar -``` - -```shell -# execute kubeval function by mounting schema from a local directory on wordpress package -$ kpt fn eval -i gcr.io/kpt-fn/kubeval:v0.1 \ - --mount type=bind,src="/path/to/schema-dir",dst=/schema-dir \ - --as-current-user wordpress -- additional_schema_locations=/schema-dir -``` - -```shell -# chaining functions using the unix pipe to set namespace and set labels on -# wordpress package -$ kpt fn source wordpress \ - | kpt fn eval - -i gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress \ - | kpt fn eval - -i gcr.io/kpt-fn/set-labels:v0.1 -- label_name=color label_value=orange \ - | kpt fn sink wordpress -``` - -```shell -# execute container 'set-namespace' on the resources in current directory and write -# the output resources to another directory -$ kpt fn eval -i gcr.io/kpt-fn/set-namespace:v0.1 -o path/to/dir -- namespace=mywordpress -``` - -```shell -# execute container 'set-namespace' on the resources in current directory and write -# the output resources to stdout which are piped to 'kubectl apply' -$ kpt fn eval -i gcr.io/kpt-fn/set-namespace:v0.1 -o unwrap -- namespace=mywordpress \ -| kubectl apply -f - -``` - -```shell -# execute container 'set-namespace' on the resources in current directory and write -# the wrapped output resources to stdout which are passed to 'set-annotations' function -# and the output resources after setting namespace and annotation is written to another directory -$ kpt fn eval -i gcr.io/kpt-fn/set-namespace:v0.1 -o stdout -- namespace=staging \ -| kpt fn eval - -i gcr.io/kpt-fn/set-annotations:v0.1.3 -o path/to/dir -- foo=bar -``` - -```shell -# execute container 'set-namespace' on the resources with 'name' foo and 'kind' Deployment -# in current directory -kpt fn eval -i set-namespace:v0.1 --by-kind Deployment --by-name foo -- namespace=staging -``` - -```shell -# execute container my-fn with podman on the resources in DIR directory and -# write output back to DIR -$ KPT_FN_RUNTIME=podman kpt fn eval DIR -i gcr.io/example.com/my-fn -``` - - - -[docker volumes]: https://docs.docker.com/storage/volumes/ -[imperative function execution]: /book/04-using-functions/02-imperative-function-execution -[function specification]: /book/05-developing-functions/01-functions-specification diff --git a/site/reference/cli/fn/export/README.md b/site/reference/cli/fn/export/README.md deleted file mode 100644 index 4146bde763..0000000000 --- a/site/reference/cli/fn/export/README.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "Export" -linkTitle: "export" -type: docs -description: > - Auto-generating function pipelines for different workflow orchestrators ---- - - - -Exports a workflow pipeline that runs kpt functions alongside necessary -configurations. - -### Examples - -{{% hide %}} - - - -``` -# Set up workspace for the test. -TEST_HOME=$(mktemp -d) -cd $TEST_HOME -``` - - - -```shell -export SRC_REPO=https://github.com/kptdev/kpt.git -kpt pkg get $SRC_REPO/package-examples/helloworld-set DIR/ -``` - -{{% /hide %}} - - - - - -```shell -# read functions from DIR, run them against it as one step. -# write the generated GitHub Actions pipeline to main.yaml. -kpt fn export DIR/ --output main.yaml --workflow github-actions -``` - - - -```shell -# discover functions in FUNCTIONS_DIR and run them against resource in DIR. -# write the generated Cloud Build pipeline to stdout. -kpt fn export DIR/ --fn-path FUNCTIONS_DIR/ --workflow cloud-build -``` - - - -### Synopsis - - - -```shell -kpt fn export DIR/ [--fn-path FUNCTIONS_DIR/] --workflow ORCHESTRATOR [--output OUTPUT_FILENAME] - -DIR: - Path to a package directory. -FUNCTIONS_DIR: - Read functions from the directory instead of the DIR/. -ORCHESTRATOR: - Supported orchestrators are: - - github-actions - - cloud-build - - gitlab-ci - - jenkins - - tekton - - circleci -OUTPUT_FILENAME: - Specifies the filename of the generated pipeline. If omitted, the default - output is stdout -``` - - - -## Next Steps - -- Get detailed tutorials on how to use `kpt fn export` from the [Export a - Workflow] guide. - -[export a workflow]: https://kpt.dev#todo diff --git a/site/reference/cli/fn/render/README.md b/site/reference/cli/fn/render/README.md deleted file mode 100644 index 0fe2cd387f..0000000000 --- a/site/reference/cli/fn/render/README.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: "`render`" -linkTitle: "render" -type: docs -description: > - Render a package ---- - - - -`render` executes the pipeline of functions on resources in the package and -writes the output to the local filesystem in-place. - -`render` executes the pipelines in the package hierarchy in a depth-first order. -For example, if a package A contains subpackage B, then the pipeline in B is -executed on resources in B and then the pipeline in A is executed on resources -in A and the output of the pipeline from package B. The output of the pipeline -from A is then written to the local filesystem in-place. - -`render` formats the resources before writing them to the local filesystem. - -If any of the functions in the pipeline fails, then the entire pipeline is -aborted and the local filesystem is left intact. - -Refer to the [Declarative Functions Execution] for more details. - -### Synopsis - - - -``` -kpt fn render [PKG_PATH] [flags] -``` - -#### Args - -``` -PKG_PATH: - Local package path to render. Directory must exist and contain a Kptfile - to be updated. Defaults to the current working directory. -``` - -#### Flags - -``` ---allow-exec: - Allow executable binaries to run as function. Note that executable binaries - can perform privileged operations on your system, so ensure that binaries - referred in the pipeline are trusted and safe to execute. - ---allow-network: - Allow functions to access network during pipeline execution. Default: `false`. Note that this is applicable to container based functions only. - ---image-pull-policy: - If the image should be pulled before rendering the package(s). It can be set - to one of always, ifNotPresent, never. If unspecified, always will be the - default. - ---output, o: - If specified, the output resources are written to provided location, - if not specified, resources are modified in-place. - Allowed values: stdout|unwrap| - 1. stdout: output resources are wrapped in ResourceList and written to stdout. - 2. unwrap: output resources are written to stdout, in multi-object yaml format. - 3. OUT_DIR_PATH: output resources are written to provided directory. - The provided directory must not already exist. - ---results-dir: - Path to a directory to write structured results. Directory will be created if - it doesn't exist. Structured results emitted by the functions are aggregated and saved - to `results.yaml` file in the specified directory. - If not specified, no result files are written to the local filesystem. -``` - -#### Environment Variables - -``` -KPT_FN_RUNTIME: - The runtime to run kpt functions. It must be one of "docker", "podman" and "nerdctl". -``` - - - -### Examples - - - -```shell -# Render the package in current directory -$ kpt fn render -``` - -```shell -# Render the package in current directory and save results in my-results-dir -$ kpt fn render --results-dir my-results-dir -``` - -```shell -# Render my-package-dir -$ kpt fn render my-package-dir -``` - -```shell -# Render the package in current directory and write output resources to another DIR -$ kpt fn render -o path/to/dir -``` - -```shell -# Render resources in current directory and write unwrapped resources to stdout -# which can be piped to kubectl apply -$ kpt fn render -o unwrap | kpt fn eval -i gcr.io/kpt-fn/remove-local-config-resources:v0.1.0 -o unwrap - | kubectl apply -f - -``` - -```shell -# Render resources in current directory, write the wrapped resources -# to stdout which are piped to 'set-annotations' function, -# the transformed resources are written to another directory -$ kpt fn render -o stdout \ -| kpt fn eval - -i gcr.io/kpt-fn/set-annotations:v0.1.3 -o path/to/dir -- foo=bar -``` - -```shell -# Render my-package-dir with podman as runtime for functions -$ KPT_FN_RUNTIME=podman kpt fn render my-package-dir -``` - -```shell -# Render my-package-dir with network access enabled for functions -$ kpt fn render --allow-network -``` - - - -[declarative functions execution]: - /book/04-using-functions/01-declarative-function-execution diff --git a/site/reference/cli/fn/sink/README.md b/site/reference/cli/fn/sink/README.md deleted file mode 100644 index b90e99f4f6..0000000000 --- a/site/reference/cli/fn/sink/README.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "`sink`" -linkTitle: "sink" -type: docs -description: > - Write resources to a local directory ---- - - - -`sink` reads resources from `stdin` and writes them to a local directory. -Resources must be in one of the following input formats: - -1. Multi object YAML where resources are separated by `---`. - -2. KRM Function Specification wire format where resources are wrapped in an - object of kind ResourceList. - -`sink` is useful for chaining functions using Unix pipe. For more details, refer -to [Chaining functions]. - -### Synopsis - - - -``` -kpt fn sink DIR [flags] - -DIR: - Path to a local directory to write resources to. The directory must not already exist. -``` - - - -### Examples - - - -```shell -# read resources from DIR directory, execute my-fn on them and write the -# output to DIR directory. -$ kpt fn source DIR | - kpt fn eval - --image gcr.io/example.com/my-fn | - kpt fn sink NEW_DIR -``` - - - -[chaining functions]: - /book/04-using-functions/02-imperative-function-execution?id=chaining-functions-using-the-unix-pipe -[function specification]: - /book/05-developing-functions/01-functions-specification diff --git a/site/reference/cli/fn/source/README.md b/site/reference/cli/fn/source/README.md deleted file mode 100644 index 9a330fb245..0000000000 --- a/site/reference/cli/fn/source/README.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "`source`" -linkTitle: "source" -type: docs -description: > - Source resources from a local directory ---- - - - -`source` reads resources from a local directory and writes them in [Function -Specification] wire format to `stdout`. The output of the `source` can be pipe'd -to commands such as `kpt fn eval` that accepts Function Specification wire -format. `source` is useful for chaining functions using Unix pipe. For more -details, refer to [Chaining functions]. - -### Synopsis - - - -``` -kpt fn source [DIR] [flags] -``` - -#### Args - -``` -DIR: - Path to the local directory containing resources. Defaults to the current - working directory. -``` - -#### Flags - -``` ---fn-config: - Path to the file containing `functionConfig`. - ---include-meta-resources: - (DEPRECATED) include-meta-resources is no longer necessary because meta - resources are included by default with kpt version v1.0.0-beta.15+. - ---output, o: - If specified, the output resources are written to stdout in provided format. - Allowed values: - 1. stdout(default): output resources are wrapped in ResourceList and written to stdout. - 2. unwrap: output resources are written to stdout, in multi-object yaml format. -``` - - - -### Examples - - - -```shell -# read resources from DIR directory and write the output on stdout. -$ kpt fn source DIR -``` - -```shell -# read resources from DIR directory, execute my-fn on them and write the -# output to DIR directory. -$ kpt fn source DIR | - kpt fn eval - --image gcr.io/example.com/my-fn - | - kpt fn sink DIR -``` - - - -[chaining functions]: - /book/04-using-functions/02-imperative-function-execution?id=chaining-functions-using-the-unix-pipe -[function specification]: - /book/05-developing-functions/01-functions-specification diff --git a/site/reference/cli/live/README.md b/site/reference/cli/live/README.md deleted file mode 100644 index 8f0959670e..0000000000 --- a/site/reference/cli/live/README.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "`live`" -linkTitle: "live" -weight: 3 -type: docs -description: > - Deploy local packages to a cluster. ---- - - - -The `live` command group contains subcommands for deploying local -`kpt` packages to a cluster. - - - -#### Flags - -These are the same flags as is available in [kubectl]. - -``` ---as: - Username to impersonate for the operation. - ---as-group: - Group to impersonate for the operation, this flag can be repeated to specify multiple groups. - ---cache-dir: - Default cache directory (default "/Users/mortent/.kube/cache"). - ---certificate-authority: - Path to a cert file for the certificate authority. - ---client-certificate: - Path to a client certificate file for TLS. - ---client-key: - Path to a client key file for TLS. - ---cluster: - The name of the kubeconfig cluster to use. - ---context: - The name of the kubeconfig context to use. - ---insecure-skip-tls-verify: - If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure. - ---kubeconfig: - Path to the kubeconfig file to use for CLI requests. - ---namespace: - If present, the namespace scope for this CLI request. - ---password: - Password for basic authentication to the API server. - ---request-timeout: - The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0"). - ---server: - The address and port of the Kubernetes API server. - ---tls-server-name: - Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used. - ---token: - Bearer token for authentication to the API server. - ---user: - The name of the kubeconfig user to use. - ---username: - Username for basic authentication to the API server. -``` - -[kubectl]: https://kubernetes.io/docs/reference/kubectl/kubectl/#options diff --git a/site/reference/cli/live/apply/README.md b/site/reference/cli/live/apply/README.md deleted file mode 100644 index 5cf38317b1..0000000000 --- a/site/reference/cli/live/apply/README.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -title: "`apply`" -linkTitle: "apply" -type: docs -description: > - Apply a package to the cluster (create, update, prune). ---- - - - -`apply` creates, updates and deletes resources in the cluster to make the remote -cluster resources match the local package configuration. - -### Synopsis - - - -``` -kpt live apply [PKG_PATH | -] [flags] -``` - -#### Args - -``` -PKG_PATH | -: - Path to the local package which should be applied to the cluster. It must - contain a Kptfile or a ResourceGroup manifest with inventory metadata. - Defaults to the current working directory. - Using '-' as the package path will cause kpt to read resources from stdin. -``` - -#### Flags - -``` ---dry-run: - It true, kpt will validate the resources in the package and print which - resources will be applied and which resources will be pruned, but no resources - will be changed. - If the --server-side flag is true, kpt will do a server-side dry-run, otherwise - it will be a client-side dry-run. Note that the output will differ somewhat - between the two alternatives. - ---field-manager: - Identifier for the **owner** of the fields being applied. Only usable - when --server-side flag is specified. Default value is kubectl. - ---force-conflicts: - Force overwrite of field conflicts during apply due to different field - managers. Only usable when --server-side flag is specified. - Default value is false (error and failure when field managers conflict). - ---install-resource-group: - Install the ResourceGroup CRD into the cluster if it isn't already - available. Default is false. - ---inventory-policy: - Determines how to handle overlaps between the package being currently applied - and existing resources in the cluster. The available options are: - - * strict: If any of the resources already exist in the cluster, but doesn't - belong to the current package, it is considered an error. - * adopt: If a resource already exist in the cluster, but belongs to a - different package, it is considered an error. Resources that doesn't belong - to other packages are adopted into the current package. - - The default value is `strict`. - ---output: - Determines the output format for the status information. Must be one of the following: - - * events: The output will be a list of the status events as they become available. - * json: The output will be a list of the status events as they become available, - each formatted as a json object. - * table: The output will be presented as a table that will be updated inline - as the status of resources become available. - - The default value is ‘events’. - ---prune-propagation-policy: - The propagation policy that should be used when pruning resources. The - default value here is 'Background'. The other options are 'Foreground' and 'Orphan'. - ---prune-timeout: - The threshold for how long to wait for all pruned resources to be - deleted before giving up. If this flag is not set, kpt live apply will wait - until interrupted. In most cases, it would also make sense to set the - --prune-propagation-policy to Foreground when this flag is set. - ---reconcile-timeout: - The threshold for how long to wait for all resources to reconcile before - giving up. If this flag is not set, kpt live apply will wait until - interrupted. - ---server-side: - Perform the apply operation server-side rather than client-side. - Default value is false (client-side). - ---show-status-events: - The output will include the details on the reconciliation status - for all resources. Default is `false`. - - Does not apply for the `table` output format. -``` - - - -### Examples - - - -```shell -# apply resources in the current directory -$ kpt live apply -``` - -```shell -# apply resources in the my-dir directory and wait up until 15 minutes -# for all the resources to be reconciled before pruning -$ kpt live apply --reconcile-timeout=15m my-dir -``` - -```shell -# apply resources and specify how often to poll the cluster for resource status -$ kpt live apply --reconcile-timeout=15m --poll-period=5s my-dir -``` - - diff --git a/site/reference/cli/live/destroy/README.md b/site/reference/cli/live/destroy/README.md deleted file mode 100644 index bc4c22d134..0000000000 --- a/site/reference/cli/live/destroy/README.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "`destroy`" -linkTitle: "destroy" -type: docs -description: > - Remove all previously applied resources in a package from the cluster ---- - - - -`destroy` removes all files belonging to a package from the cluster. - -### Synopsis - - - -``` -kpt live destroy [PKG_PATH | -] -``` - -#### Args - -``` -PKG_PATH | -: - Path to the local package which should be deleted from the cluster. It must - contain a Kptfile or a ResourceGroup manifest with inventory metadata. - Defaults to the current working directory. - Using '-' as the package path will cause kpt to read resources from stdin. -``` - -#### Flags - -``` ---dry-run: - It true, kpt will print the resources that will be removed from the cluster, - but no resources will be deleted. - ---inventory-policy: - Determines how to handle overlaps between the package being currently applied - and existing resources in the cluster. The available options are: - - * strict: If any of the resources already exist in the cluster, but doesn't - belong to the current package, it is considered an error. - * adopt: If a resource already exist in the cluster, but belongs to a - different package, it is considered an error. Resources that doesn't belong - to other packages are adopted into the current package. - - The default value is `strict`. - ---output: - Determines the output format for the status information. Must be one of the following: - - * events: The output will be a list of the status events as they become available. - * json: The output will be a list of the status events as they become available, - each formatted as a json object. - * table: The output will be presented as a table that will be updated inline - as the status of resources become available. - - The default value is ‘events’. - ---show-status-events: - The output will include the details on the reconciliation status - for all resources. Default is `false`. - - Does not apply for the `table` output format. -``` - - - -### Examples - - - -```shell -# remove all resources in the current package from the cluster. -$ kpt live destroy -``` - - diff --git a/site/reference/cli/live/init/README.md b/site/reference/cli/live/init/README.md deleted file mode 100644 index 54619eed30..0000000000 --- a/site/reference/cli/live/init/README.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "`init`" -linkTitle: "init" -type: docs -description: > - Initialize a package with the information needed for inventory tracking. ---- - - - -`init` initializes the package with the name, namespace and id of the resource -that will keep track of the package inventory. - -### Synopsis - - - -``` -kpt live init [PKG_PATH] [flags] -``` - -#### Args - -``` -PKG_PATH: - Path to the local package which should be updated with inventory information. - It must contain a Kptfile. Defaults to the current working directory. -``` - -#### Flags - -``` ---force: - Forces the inventory values to be updated, even if they are already set. - Defaults to false. - ---inventory-id: - Inventory identifier for the package. This is used to detect overlap between - packages that might use the same name and namespace for the inventory object. - Defaults to an auto-generated value. - ---name: - The name for the ResourceGroup resource that contains the inventory - for the package. Defaults to the name of the package. - ---namespace: - The namespace for the ResourceGroup resource that contains the inventory - for the package. If not provided, kpt will check if all the resources - in the package belong in the same namespace. If they do, that namespace will - be used. If they do not, the namespace in the user's context will be chosen. - ---rg-file: - The name used for the file created for the ResourceGroup CR. Defaults to - 'resourcegroup.yaml'. -``` - - - -### Examples - - - -```shell -# initialize a package in the current directory. -$ kpt live init -``` - -```shell -# initialize a package with explicit namespace for the ResourceGroup. -$ kpt live init --namespace=test my-dir -``` - - diff --git a/site/reference/cli/live/install-resource-group/README.md b/site/reference/cli/live/install-resource-group/README.md deleted file mode 100644 index 2e22107b8a..0000000000 --- a/site/reference/cli/live/install-resource-group/README.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "`install-resource-group`" -linkTitle: "install-resource-group" -type: docs -description: > -Install the ResourceGroup CRD in the cluster. ---- - - - -`install-resource-group` installs the ResourceGroup CRD in the cluster. `kpt` -uses ResourceGroup resources for storing the inventory list (which enables -pruning) , so it must be installed in a cluster prior to applying packages. - -### Synopsis - - - -``` -kpt live install-resource-group -``` - - - -### Examples - - - -```shell -# install ResourceGroup CRD into the current cluster. -$ kpt live install-resource-group -``` - - diff --git a/site/reference/cli/live/migrate/README.md b/site/reference/cli/live/migrate/README.md deleted file mode 100644 index 0220f37712..0000000000 --- a/site/reference/cli/live/migrate/README.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "`migrate`" -linkTitle: "migrate" -type: docs -description: > -Migrate a package and the inventory object to use the ResourceGroup CRD. ---- - - - -`migrate` moves the inventory list, which contains the Group, Kind, Name and -Namespace for every resource in the cluster that belongs to a package, into a -`ResourceGroup` CR and moves the inventory information into the a `ResourceGroup` -manifest on local disk. - -0.39.x or earlier versions of `kpt` stored the inventory metadata in a -`ConfigMap` manifest in the package, and stored the inventory list in a -`ConfigMap` resource in the cluster. Running this command will move the -metadata into a `ResourceGroup` manifest in the `resourcegroup.yaml` file -and move the inventory list into a `ResourceGroup` CR. - -Previous 1.0.0-alpha or 1.0.0-beta versions of kpt would store the inventory -metadata in the `Kptfile`. Running this command will move the metadata from -the `Kptfile` in a `ResourceGroup` manifest in the `resourcegroup.yaml` file. - - -### Synopsis - - - -``` -kpt live migrate [PKG_PATH] [flags] -``` - -#### Args - -``` -PKG_PATH: - Path to the local package. It must have a Kptfile and inventory metadata - in the package in either the ConfigMap, Kptfile or ResourceGroup format. - It defaults to the current directory. -``` - -#### Flags - -``` ---dry-run: - Go through the steps of migration, but don't make any changes. - ---force: - Forces the inventory values in the ResourceGroup manfiest to be updated, - even if they are already set. Defaults to false. - ---name: - The name for the ResourceGroup resource that contains the inventory - for the package. Defaults to the same name as the existing inventory - object. - ---namespace: - The namespace for the ResourceGroup resource that contains the inventory - for the package. If not provided, it defaults to the same namespace as the - existing inventory object. -``` - - - -### Examples - - - -```shell -# Migrate the package in the current directory. -$ kpt live migrate -``` - - diff --git a/site/reference/cli/live/status/README.md b/site/reference/cli/live/status/README.md deleted file mode 100644 index 0cc2a18a3f..0000000000 --- a/site/reference/cli/live/status/README.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "`status`" -linkTitle: "status" -type: docs -description: > -Display the status for the resources in the cluster ---- - - - -`status` shows the resource status for resources belonging to the package. - -### Synopsis - - - -``` -kpt live status [PKG_PATH | -] [flags] -``` - -#### Args - -``` -PKG_PATH | -: - Path to the local package for which the status of the package in the cluster - should be displayed. It must contain either a Kptfile or a ResourceGroup CR - with inventory metadata. - Defaults to the current working directory. - Using '-' as the package path will cause kpt to read resources from stdin. -``` - -#### Flags - -``` ---output: - Determines the output format for the status information. Must be one of the following: - - * events: The output will be a list of the status events as they become available. - * json: The output will be a list of the status events as they become available, - each formatted as a json object. - * table: The output will be presented as a table that will be updated inline - as the status of resources become available. - - The default value is ‘events’. - ---poll-period: - The frequency with which the cluster will be polled to determine the status - of the applied resources. The default value is 2 seconds. - ---poll-until: - When to stop polling for status and exist. Must be one of the following: - - * known: Exit when the status for all resources have been found. - * current: Exit when the status for all resources have reached the Current status. - * deleted: Exit when the status for all resources have reached the NotFound - status, i.e. all the resources have been deleted from the live state. - * forever: Keep polling for status until interrupted. - - The default value is ‘known’. - ---timeout: - Determines how long the command should run before exiting. This deadline will - be enforced regardless of the value of the --poll-until flag. The default is - to wait forever. - ---inv-type: - Ways to get the inventory information. Must be one of the following: - - * local: Get the inventory information from the local file. - This will only get the inventory information of the package at the given/default path. - * remote: Get the inventory information by calling List API to the cluster. - This will retrieve a list of inventory information from the cluster. - - The default value is ‘local’. - ---inv-names: - Filter for printing statuses of packages with specified inventory names. - For multiple inventory names, use comma to them. - This must be used with --inv-type=remote. - ---namespaces: - Filter for printing statuses of packages under specified namespaces. - For multiple namespaces, use comma to separate them. - ---statuses: - Filter for printing packages with specified statuses. - For multiple statuses, use comma to separate them. -``` - - - -### Examples - - - -```shell -# Monitor status for the resources belonging to the package in the current -# directory. Wait until all resources have reconciled. -$ kpt live status -``` - -```shell -# Monitor status for the resources belonging to the package in the my-app -# directory. Output in table format: -$ kpt live status my-app --poll-until=forever --output=table -``` - -```shell -# Monitor status for the all resources on the cluster -# with certain inventory names and under certain namespaces. -$ kpt live status --inv-type remote --inv-names inv1,inv2 --namespaces ns1,ns2 -``` - -```shell -# Monitor resources on the cluster that has Current or InProgress status -$ kpt live status --inv-type remote --statuses Current,InProgress -``` - - - -[inventory template]: /reference/cli/live/apply/#prune diff --git a/site/reference/cli/pkg/README.md b/site/reference/cli/pkg/README.md deleted file mode 100644 index d0a783e813..0000000000 --- a/site/reference/cli/pkg/README.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "`pkg`" -linkTitle: "pkg" -weight: 1 -type: docs -description: > - Get, update, and describe packages with resources ---- - - - - -The `pkg` command group contains subcommands for fetching, updating and describing `kpt` packages -from git repositories. - - diff --git a/site/reference/cli/pkg/cat/README.md b/site/reference/cli/pkg/cat/README.md deleted file mode 100644 index 0232e8e67d..0000000000 --- a/site/reference/cli/pkg/cat/README.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "`cat`" -linkTitle: "cat" -type: docs -description: > - Print the resources in a file/directory ---- - - - -`cat` prints the resources in a file or directory as yaml to stdout. - -### Synopsis - - - -``` -kpt pkg cat [FILE | DIR] -``` - -#### Args - -``` -FILE | DIR: - Path to a directory either a directory containing files with KRM resources, or - a file with KRM resource(s). Defaults to the current directory. -``` - - - -#### Flags - -``` ---annotate - Annotate resources with their file origins. - ---format - Format resource before printing. Defaults to true. - ---recurse-subpackages, -R - Print resources recursively in all the nested subpackages. Defaults to true. - ---strip-comments - Remove comments from yaml. - ---style - yaml styles to apply. May be 'TaggedStyle', 'DoubleQuotedStyle', 'LiteralStyle', 'FoldedStyle', 'FlowStyle'. -``` - -### Examples - - - -```shell -# Print resource from a file. -$ kpt pkg cat path/to/deployment.yaml -``` - -```shell -# Print resources from current directory. -$ kpt pkg cat -``` - - diff --git a/site/reference/cli/pkg/diff/README.md b/site/reference/cli/pkg/diff/README.md deleted file mode 100644 index 8c74b2cab4..0000000000 --- a/site/reference/cli/pkg/diff/README.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: "`diff`" -linkTitle: "diff" -type: docs -description: > - Show differences between a local package and upstream. ---- - - - -`diff` displays differences between upstream and local packages. - -It can display differences between: - -- The local package and the upstream version which the local package was based - on. -- The local package and the latest version of the upstream package. - -`diff` fetches the versions of a package that are needed, but it delegates -displaying the differences to a command line diffing tool. By default, the -'diff' command line tool is used, but this can be changed with either the -`diff-tool` flag or the `KPT_EXTERNAL_DIFF` env variable. - -### Synopsis - - - -``` -kpt pkg diff [PKG_PATH@VERSION] [flags] -``` - -#### Args - -``` -PKG_PATH: - Local package path to compare. diff will fail if the directory doesn't exist, or does not - contain a Kptfile. Defaults to the current working directory. - -VERSION: - A git tag, branch, or commit. Specified after the local_package with @, for - example my-package@master. - Defaults to the local package version that was last fetched. -``` - -#### Flags - -``` ---diff-type: - The type of changes to view (local by default). Following types are - supported: - - local: Shows changes in local package relative to upstream source package - at original version. - remote: Shows changes in upstream source package at target version - relative to original version. - combined: Shows changes in local package relative to upstream source - package at target version. - 3way: Shows changes in local package and source package at target version - relative to original version side by side. - ---diff-tool: - Command line diffing tool ('diff' by default) for showing the changes. - Note that it overrides the KPT_EXTERNAL_DIFF environment variable. - - # Show changes using 'meld' commandline tool. - kpt pkg diff @master --diff-tool meld - ---diff-tool-opts: - Commandline options to use with the command line diffing tool. - Note that it overrides the KPT_EXTERNAL_DIFF_OPTS environment variable. - - # Show changes using the diff command with recursive options. - kpt pkg diff @master --diff-tool meld --diff-tool-opts "-r" -``` - -#### Environment Variables - -``` -KPT_EXTERNAL_DIFF: - Commandline diffing tool ('diff; by default) that will be used to show - changes. - - # Use meld to show changes - KPT_EXTERNAL_DIFF=meld kpt pkg diff - -KPT_EXTERNAL_DIFF_OPTS: - Commandline options to use for the diffing tool. For ex. - # Using "-a" diff option - KPT_EXTERNAL_DIFF_OPTS="-a" kpt pkg diff --diff-tool meld - -KPT_CACHE_DIR: - Controls where to cache remote packages when fetching them. - Defaults to /.kpt/repos/ - On macOS and Linux is determined by the $HOME env variable, while on - Windows it is given by the %USERPROFILE% env variable. -``` - - - -### Examples - -{{% hide %}} - - - -``` -# Set up workspace for the test. -TEST_HOME=$(mktemp -d) -cd $TEST_HOME -``` - - - -```shell -export SRC_REPO=https://github.com/kptdev/kpt.git -kpt pkg get $SRC_REPO/package-examples/helloworld-set hello-world -cd hello-world -``` - -{{% /hide %}} - - - - -```shell -# Show changes in current package relative to upstream source package. -$ kpt pkg diff -``` - - diff --git a/site/reference/cli/pkg/get/README.md b/site/reference/cli/pkg/get/README.md deleted file mode 100644 index 21febcea7d..0000000000 --- a/site/reference/cli/pkg/get/README.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: "`get`" -linkTitle: "get" -type: docs -description: > - Fetch a package from a git repo. ---- - - - -`get` fetches a remote package from a git subdirectory and writes it to a new -local directory. - -### Synopsis - - - -``` -kpt pkg get REPO_URI[.git]/PKG_PATH[@VERSION] [LOCAL_DEST_DIRECTORY] [flags] -``` - -#### Args - -``` -REPO_URI: - URI of a git repository containing 1 or more packages as subdirectories. - In most cases the .git suffix should be specified to delimit the REPO_URI - from the PKG_PATH, but this is not required for widely recognized repo - prefixes. If get cannot parse the repo for the directory and version, - then it will print an error asking for '.git' to be specified as part of - the argument. - -PKG_PATH: - Path to remote subdirectory containing Kubernetes resource configuration - files or directories. Defaults to the root directory. - Uses '/' as the path separator (regardless of OS). - e.g. staging/cockroachdb - -VERSION: - A git tag, branch, ref or commit for the remote version of the package - to fetch. Defaults to the default branch of the repository. - -LOCAL_DEST_DIRECTORY: - The local directory to write the package to. Defaults to a subdirectory of the - current working directory named after the upstream package. -``` - -#### Flags - -``` ---strategy: - Defines which strategy should be used to update the package. It defaults to - 'resource-merge'. - - * resource-merge: Perform a structural comparison of the original / - updated resources, and merge the changes into the local package. - * fast-forward: Fail without updating if the local package was modified - since it was fetched. - * force-delete-replace: Wipe all the local changes to the package and replace - it with the remote version. - ---for-deployment: - (Experimental) indicates if the fetched package is a deployable instance that - will be deployed to a cluster. - It is `false` by default. -``` - -#### Env Vars - -``` -KPT_CACHE_DIR: - Controls where to cache remote packages when fetching them. - Defaults to /.kpt/repos/ - On macOS and Linux is determined by the $HOME env variable, while on - Windows it is given by the %USERPROFILE% env variable. -``` - - - -### Examples - -{{% hide %}} - - - -``` -# Set up workspace for the test. -TEST_HOME=$(mktemp -d) -cd $TEST_HOME -``` - -{{% /hide %}} - - - - - -```shell -# Fetch package cockroachdb from github.com/kubernetes/examples/staging/cockroachdb -# This creates a new subdirectory 'cockroachdb' for the downloaded package. -$ kpt pkg get https://github.com/kubernetes/examples.git/staging/cockroachdb@master -``` - - - -```shell -# Fetch package cockroachdb from github.com/kubernetes/examples/staging/cockroachdb -# This will create a new directory 'my-package' for the downloaded package if it -# doesn't already exist. -$ kpt pkg get https://github.com/kubernetes/examples.git/staging/cockroachdb@master ./my-package/ -``` - - - -```shell -# Fetch package examples from github.com/kubernetes/examples at the specified -# git hash. -# This will create a new directory 'examples' for the package. -$ kpt pkg get https://github.com/kubernetes/examples.git/@6fe2792 -``` - - - -```shell -# Create a deployable instance of examples package from github.com/kubernetes/examples -# This will create a new directory 'examples' for the package. -$ kpt pkg get https://github.com/kubernetes/examples.git/@6fe2792 --for-deployment -``` - - diff --git a/site/reference/cli/pkg/init/README.md b/site/reference/cli/pkg/init/README.md deleted file mode 100644 index ffaa9ff4d0..0000000000 --- a/site/reference/cli/pkg/init/README.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "`init`" -linkTitle: "init" -type: docs -description: > - Initialize an empty package. ---- - - - -`init` initializes an existing empty directory as a kpt package by adding a -Kptfile and a placeholder `README.md` file. - -### Synopsis - - - -``` -kpt pkg init [DIR] [flags] -``` - -#### Args - -``` -DIR: - init fails if DIR does not already exist. Defaults to the current working directory. -``` - -#### Flags - -``` ---description - Short description of the package. (default "sample description") - ---keywords - A list of keywords describing the package. - ---site - Link to page with information about the package. -``` - - - -### Examples - -{{% hide %}} - - - -``` -# Set up workspace for the test. -TEST_HOME=$(mktemp -d) -cd $TEST_HOME -``` - -{{% /hide %}} - - - - - -```shell -# Creates a new Kptfile with metadata in the cockroachdb directory. -$ mkdir cockroachdb; kpt pkg init cockroachdb --keywords "cockroachdb,nosql,db" \ - --description "my cockroachdb implementation" -``` - -```shell -# Creates a new Kptfile without metadata in the current directory. -$ kpt pkg init -``` - - diff --git a/site/reference/cli/pkg/sidebar.md b/site/reference/cli/pkg/sidebar.md deleted file mode 100644 index 5e238d7c50..0000000000 --- a/site/reference/cli/pkg/sidebar.md +++ /dev/null @@ -1,17 +0,0 @@ -- [Installation](installation/) - - [Docker](installation/docker/) - - [gcloud](installation/gcloud/) - - [Homebrew](installation/homebrew/) - - [Source](installation/source/) - - [Binaries](installation/binaries/) -- [Reference](reference/) - - [pkg](reference/pkg/) - - [diff](reference/pkg/diff/) - - [get](reference/pkg/get/) - - [init](reference/pkg/init/) - - [tree](reference/pkg/tree/) - - [update](reference/pkg/update/) - - [fn](reference/fn/) - - [live](reference/live/) -- [FAQ](faq/) -- [Contact](contact/) diff --git a/site/reference/cli/pkg/tree/README.md b/site/reference/cli/pkg/tree/README.md deleted file mode 100644 index bc22230ce9..0000000000 --- a/site/reference/cli/pkg/tree/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "`tree`" -linkTitle: "tree" -weight: 4 -type: docs -description: > - Display resources, files and packages in a tree structure. ---- - - - -`tree` displays resources, files and packages in a tree structure. - -### Synopsis - - - -``` -kpt pkg tree [DIR] -``` - - - -#### Args - -``` -DIR: - Path to a directory containing KRM resource(s). Defaults to the current working directory. -``` - -### Examples - - - -```shell -# Show resources in the current directory. -$ kpt pkg tree -``` - - diff --git a/site/reference/cli/pkg/update/README.md b/site/reference/cli/pkg/update/README.md deleted file mode 100644 index 43b2d65608..0000000000 --- a/site/reference/cli/pkg/update/README.md +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: "`update`" -linkTitle: "update" -type: docs -description: > - Apply upstream package updates. ---- - - - -`update` pulls in upstream changes and merges them into a local package. Changes -may be applied using one of several strategies. - -Since this will update the local package, all changes must be committed to git -before running `update`. - -### Synopsis - - - -``` -kpt pkg update [PKG_PATH][@VERSION] [flags] -``` - -#### Args - -``` -PKG_PATH: - Local package path to update. Directory must exist and contain a Kptfile - to be updated. Defaults to the current working directory. - -VERSION: - A git tag, branch, ref or commit. Specified after the local_package - with @ -- pkg@version. - Defaults the ref specified in the Upstream section of the package Kptfile. - - Version types: - * branch: update the local contents to the tip of the remote branch - * tag: update the local contents to the remote tag - * commit: update the local contents to the remote commit -``` - -#### Flags - -``` ---strategy: - Defines which strategy should be used to update the package. This will change - the update strategy for the current kpt package for the current and future - updates. If a strategy is not provided, the strategy specified in the package - Kptfile will be used. - - * resource-merge: Perform a structural comparison of the original / - updated resources, and merge the changes into the local package. - * fast-forward: Fail without updating if the local package was modified - since it was fetched. - * force-delete-replace: Wipe all the local changes to the package and replace - it with the remote version. -``` - -#### Env Vars - -``` -KPT_CACHE_DIR: - Controls where to cache remote packages when fetching them. - Defaults to /.kpt/repos/ - On macOS and Linux is determined by the $HOME env variable, while on - Windows it is given by the %USERPROFILE% env variable. -``` - - - -### Examples - - - -```shell -# Update package in the current directory. -# git add . && git commit -m 'some message' -$ kpt pkg update -``` - -```shell -# Update my-package-dir/ to match the v1.3 branch or tag. -# git add . && git commit -m 'some message' -$ kpt pkg update my-package-dir/@v1.3 -``` - -```shell -# Update with the fast-forward strategy. -# git add . && git commit -m "some message" -$ kpt pkg update my-package-dir/@master --strategy fast-forward -``` - - - -### Details - -#### Resource-merge strategy - -The resource-merge strategy performs a structural comparison of each resource using the -OpenAPI schema. So rather than performing a text-based merge, kpt leverages the -common structure of KRM resources. - -##### Resource identity -In order to perform a per-resource merge, kpt needs to be able to match a resource in -the local package with the same resource in the upstream version of the package. It does -this matching based on the identity of a resource, which is the combination of group, -kind, name and namespace. So in our wordpress example, the identity of the`Deployment` -resource is: -``` -group: apps -kind: Deployment -name: wordpress -namespace: "" -``` -Changing the name and/or namespace of a resource is a pretty common way to customize -a package. In order to make sure this doesn't create problems during merge, kpt will -automatically adding the `# kpt-merge: /` comment on the `metadata` -field of every resource when getting or updating a package. An example is the `Deployment` -resource from the wordpress package: -```yaml -apiVersion: apps/v1 -kind: Deployment -metadata: # kpt-merge: /wordpress - name: wordpress - labels: - app: wordpress -... -``` - -##### Merge rules -kpt performs a 3-way merge for every resource. This means it will use the resource -in the local package, the updated resource from upstream, as well as the resource -at the version where the local and upstream package diverged (i.e. -common ancestor). When discussing the merge rules in detail, we will be referring to -the three different sources as local, upstream and origin. - -In the discussion, we will be referring to non-associative and associative lists. A -non-associative list either has elements that are scalars or another list, or it has elements -that are mappings but without an associative key. An example of this in the kubernetes -API is the `command` property on containers: -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: pod -spec: - containers: - - name: hello - image: busybox - command: ['sh', '-c', 'echo "Hello, World!"] -``` - -An associative list has elements that are mappings and -one or more of the fields in the mappings are designated as associative keys. An associative key -(also sometimes referred to as a merge key) is used to identify the "same" elements in two -different lists for the purpose of merging them. An example from the kubernetes API -is the list of containers in a pod which uses the `name` property as the merge key: -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: pod -spec: - containers: - - name: web - image: nginx - - name: sidecar - image: log-collector -``` - -kpt will primarily look for information about -any associative keys from the OpenAPI schema, but some fields are also automatically recognized as -associative keys: -* `mountPath` -* `devicePath` -* `ip` -* `type` -* `topologyKey` -* `name` -* `containerPort` - -The 3-way merge algorithm operates both on the level of each resource and on -each individual field with a resource. - -On the resource level, the rules are: - -* A resource present in origin and deleted from upstream will be deleted from local. -* A resource missing from origin and added in upstream will be added to local. -* A resource only in local will be kept without changes. -* A resource in both upstream and local will be merged into local. - -On the field level, the rules differ based on the type of field. - -For scalars and non-associative lists: -* If the field is present in either upstream or local and the value is `null`, remove the field from local. -* If the field is unchanged between upstream and local, leave the local value unchanged. -* If the field has been changed in both upstream and local, update local with the value from upstream. - -For mappings: -* If the field is present in either upstream or local and the value is `null`, remove the field from local. -* If the field is present only in local, leave the local value unchanged. -* If the field is not present in local, add the delta between origin and upstream as the value in local. -* If the field is present in both upstream and local, recursively merge the values between local, upstream and origin. - -For associative lists: -* If the field is present in either upstream or local and the value is `null`, remove the field from local. -* If the field is present only in local, leave the local value unchanged. -* If the field is not present in local, add the delta between origin and upstream as the value in local. -* If the field is present in both upstream and local, recursively merge the values between local, upstream and origin. - -#### Fast-forward strategy - -The fast-forward strategy updates a local package with the changes from upstream, but will -fail if the local package has been modified since it was fetched. - -#### Force-delete-replace strategy - -The force-delete-replace strategy updates a local package with changes from upstream, but will -wipe out any modifications to the local package. \ No newline at end of file diff --git a/site/reference/schema/README.md b/site/reference/schema/README.md deleted file mode 100644 index 7942cd31b8..0000000000 --- a/site/reference/schema/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Schema Reference - -This section contains the schema for all the custom resources used in kpt. diff --git a/site/reference/schema/config-connector-status-convention/README.md b/site/reference/schema/config-connector-status-convention/README.md deleted file mode 100644 index aa501eb5e9..0000000000 --- a/site/reference/schema/config-connector-status-convention/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Config Connector Status Convention - -`kpt` includes custom rules for [Config Connector] resources to make them easier to work -with. This document describes how kpt uses fields and conditions on Config Connector -resources to compute [reconcile status]. - -Config Connector resources expose the `observedGeneration` field in the status -object, and `kpt` will always report a resource as being `InProgress` if the -`observedGeneration` doesn't match the value of `metadata.generation`. - -If the `Ready` condition is `True`, a Config Connector resource will be reported -as `Current`, i.e it has been successfully reconciled. - -If the `Ready` condition is `False`, `kpt` will look at the `Reason` field on the -condition object to determine whether the resource is making progress towards -reconciliation. The possible values mirrors those used by [Config Connector events]. -If the value is one of the following, the resource is considered to have failed -reconciliation: -- `ManagementConflict` -- `UpdateFailed` -- `DeleteFailed` -- `DependencyInvalid` - -Note that this doesn't necessarily mean it could never successfully reconcile. -The Config Connector controller will keep retrying. But it does mean that the -resource is in a state where an external change is most likely needed to resolve -the issue. Typical examples would be missing permissions or an API that has not -been enabled. - -Similar to all other resources, a Config Connector resource will be in the `Terminating` -state if the `metadata.deletionTimestamp` is set, and considered fully deleted when -the resource no longer exists in the cluster. - -[reconcile status]: /book/06-deploying-packages/?id=reconcile-status -[Config Connector]: https://cloud.google.com/config-connector/docs/overview -[Config Connector events]: https://cloud.google.com/config-connector/docs/how-to/monitoring-your-resources diff --git a/site/reference/schema/crd-status-convention/README.md b/site/reference/schema/crd-status-convention/README.md deleted file mode 100644 index 2cd4f424b5..0000000000 --- a/site/reference/schema/crd-status-convention/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# CRD Status Convention - -To enable kpt to calculate the [reconcile status] for CRDs, this document -provides additional conventions for status conditions following the [Kubernetes -API Guideline]. Custom controllers should use the following conditions types to -signal whether a resource has been fully reconciled, and whether it has -encountered any problems: - -- `Reconciling`: Indicates that the resource does not yet match its spec. i.e. - the desired state as expressed in the resource spec object has not been fully - realized in the cluster. A value of `"True"` means the controller is in the - process of reconciling the resource while a value of `"False"` means there are - no work left for the controller. -- `Stalled`: Indicates that the controller is not able to make the expected - progress towards reconciling the resource. The cause of this status can be - either that the controller observes an actual problem (like a pod not being - able to start), or that something is taking longer than expected (similar to - the `progressDeadlineSeconds` timeout on Deployments). If this condition is - `"True"`, it should be interpreted that something might be wrong. It does not - mean that the resource will never be reconciled. Most process in Kubernetes - retry forever, so this should not be considered a terminal state. - -CRDs should also set the `observedGeneration` field in the status object, a -pattern already common in the built-in types. The controller should update this -field every time it sees a new generation of the resource. This allows the kpt -library to distinguish between resources that do not have any conditions set -because they are fully reconciled, from resources that have no conditions set -because they have just been created. - -An example of a resource where the latest change has been observed by the -controller which is currently in the process of reconciling would be: - -```yaml -apiVersion: example.com -kind: Foo -metadata: - generation: 12 - name: bar -spec: - replicas: 1 -status: - observedGeneration: 12 - conditions: - - lastTransitionTime: "2020-03-25T21:20:38Z" - lastUpdateTime: "2020-03-25T21:20:38Z" - message: Resource is reconciling - reason: Reconciling - status: "True" - type: Reconciling - - lastTransitionTime: "2020-03-25T21:20:27Z" - lastUpdateTime: "2020-03-25T21:20:39Z" - status: "False" - type: Stalled -``` - -The calculated reconcile status for this resource is `InProgress`. - -[kubernetes api guideline]: - https://www.google.com/url?q=https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md%23typical-status-properties&sa=D&ust=1585160635349000&usg=AFQjCNE3ncANdus3xckLj3fkeupwFUoABw -[reconcile status]: /book/06-deploying-packages/?id=reconcile-status diff --git a/site/reference/schema/function-result-list/README.md b/site/reference/schema/function-result-list/README.md deleted file mode 100644 index a1e54e702b..0000000000 --- a/site/reference/schema/function-result-list/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# FunctionResultList - -See -[definition here](https://github.com/kptdev/kpt/blob/next/pkg/api/fnresult/v1/types.go#L50) diff --git a/site/reference/schema/kptfile/README.md b/site/reference/schema/kptfile/README.md deleted file mode 100644 index 6ebf846926..0000000000 --- a/site/reference/schema/kptfile/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Kptfile - -Grab the OpenAPI -[schema here](https://raw.githubusercontent.com/kptdev/kpt/main/site/reference/schema/kptfile/kptfile.yaml). diff --git a/site/reference/schema/kptfile/kptfile.json b/site/reference/schema/kptfile/kptfile.json deleted file mode 100644 index 7b2de5658e..0000000000 --- a/site/reference/schema/kptfile/kptfile.json +++ /dev/null @@ -1,533 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft/2019-09/schema#", - "type": "object", - "anyOf": [ - "#/definitions/kptfile" - ], - "swagger": "2.0", - "info": { - "title": "Kptfile schema.", - "version": "v1" - }, - "paths": {}, - "definitions": { - "Condition": { - "type": "object", - "properties": { - "message": { - "type": "string", - "x-go-name": "Message" - }, - "reason": { - "type": "string", - "x-go-name": "Reason" - }, - "status": { - "$ref": "#/definitions/ConditionStatus" - }, - "type": { - "type": "string", - "x-go-name": "Type" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "ConditionStatus": { - "type": "string", - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Function": { - "type": "object", - "title": "Function specifies a KRM function.", - "properties": { - "configMap": { - "description": "`ConfigMap` is a convenient way to specify a function config of kind ConfigMap.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "ConfigMap" - }, - "configPath": { - "description": "`ConfigPath` specifies a slash-delimited relative path to a file in the current directory\ncontaining a KRM resource used as the function config. This resource is\nexcluded when resolving 'sources', and as a result cannot be operated on\nby the pipeline.", - "type": "string", - "x-go-name": "ConfigPath" - }, - "exclude": { - "description": "`Exclude` are used to specify resources on which the function should NOT be executed.\nIf not specified, all resources selected by `Selectors` are selected.", - "type": "array", - "items": { - "$ref": "#/definitions/Selector" - }, - "x-go-name": "Exclusions" - }, - "exec": { - "description": "Exec specifies the function binary executable.\nThe executable can be fully qualified or it must exists in the $PATH e.g:\n\nexec: set-namespace\nexec: /usr/local/bin/my-custom-fn", - "type": "string", - "x-go-name": "Exec" - }, - "image": { - "description": "`Image` specifies the function container image.\nIt can either be fully qualified, e.g.:\n\nimage: gcr.io/kpt-fn/set-labels\n\nOptionally, kpt can be configured to use a image\nregistry host-path that will be used to resolve the image path in case\nthe image path is missing (Defaults to gcr.io/kpt-fn).\ne.g. The following resolves to gcr.io/kpt-fn/set-labels:\n\nimage: set-labels", - "type": "string", - "x-go-name": "Image" - }, - "name": { - "description": "`Name` is used to uniquely identify the function declaration\nthis is primarily used for merging function declaration with upstream counterparts", - "type": "string", - "x-go-name": "Name" - }, - "selectors": { - "description": "`Selectors` are used to specify resources on which the function should be executed\nif not specified, all resources are selected", - "type": "array", - "items": { - "$ref": "#/definitions/Selector" - }, - "x-go-name": "Selectors" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Git": { - "type": "object", - "title": "Git is the user-specified locator for a package on Git.", - "properties": { - "directory": { - "description": "Directory is the sub directory of the git repository.\ne.g. 'staging/cockroachdb'", - "type": "string", - "x-go-name": "Directory" - }, - "ref": { - "description": "Ref can be a Git branch, tag, or a commit SHA-1.", - "type": "string", - "x-go-name": "Ref" - }, - "repo": { - "description": "Repo is the git repository the package.\ne.g. 'https://github.com/kubernetes/examples.git'", - "type": "string", - "x-go-name": "Repo" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "GitLock": { - "type": "object", - "title": "GitLock is the resolved locator for a package on Git.", - "properties": { - "commit": { - "description": "Commit is the SHA-1 for the last fetch of the package.\nThis is set by kpt for bookkeeping purposes.", - "type": "string", - "x-go-name": "Commit" - }, - "directory": { - "description": "Directory is the sub directory of the git repository that was fetched.\ne.g. 'staging/cockroachdb'", - "type": "string", - "x-go-name": "Directory" - }, - "ref": { - "description": "Ref can be a Git branch, tag, or a commit SHA-1 that was fetched.\ne.g. 'master'", - "type": "string", - "x-go-name": "Ref" - }, - "repo": { - "description": "Repo is the git repository that was fetched.\ne.g. 'https://github.com/kubernetes/examples.git'", - "type": "string", - "x-go-name": "Repo" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Inventory": { - "description": "All of the the parameters are required if any are set.", - "type": "object", - "title": "Inventory encapsulates the parameters for the inventory resource applied to a cluster.", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Annotations" - }, - "inventoryID": { - "description": "Unique label to identify inventory resource in cluster.", - "type": "string", - "x-go-name": "InventoryID" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Labels" - }, - "name": { - "description": "Name of the inventory resource.", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace for the inventory resource.", - "type": "string", - "x-go-name": "Namespace" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "NameMeta": { - "type": "object", - "title": "NameMeta contains name information.", - "properties": { - "name": { - "description": "Name is the metadata.name field of a Resource", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace is the metadata.namespace field of a Resource", - "type": "string", - "x-go-name": "Namespace" - } - }, - "x-go-package": "sigs.k8s.io/kustomize/kyaml/yaml" - }, - "ObjectMeta": { - "description": "ObjectMeta contains metadata about a Resource", - "type": "object", - "properties": { - "annotations": { - "description": "Annotations is the metadata.annotations field of a Resource.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Annotations" - }, - "labels": { - "description": "Labels is the metadata.labels field of a Resource", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Labels" - }, - "name": { - "description": "Name is the metadata.name field of a Resource", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace is the metadata.namespace field of a Resource", - "type": "string", - "x-go-name": "Namespace" - } - }, - "x-go-package": "sigs.k8s.io/kustomize/kyaml/yaml" - }, - "OriginType": { - "type": "string", - "title": "OriginType defines the type of origin for a package.", - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "PackageInfo": { - "description": "These fields are not consumed by any functionality in kpt and are simply passed through.\nNote that like any other KRM resource, humans and automation can also use `metadata.labels` and\n`metadata.annotations` as the extension mechanism.", - "type": "object", - "title": "PackageInfo contains optional information about the package such as license, documentation, etc.", - "properties": { - "description": { - "description": "Description contains a short description of the package.", - "type": "string", - "x-go-name": "Description" - }, - "emails": { - "description": "Email is the list of emails for the package authors.", - "type": "array", - "items": { - "type": "string" - }, - "x-go-name": "Emails" - }, - "keywords": { - "description": "Keywords is a list of keywords for this package.", - "type": "array", - "items": { - "type": "string" - }, - "x-go-name": "Keywords" - }, - "license": { - "description": "SPDX license identifier (e.g. \"Apache-2.0\"). See: https://spdx.org/licenses/", - "type": "string", - "x-go-name": "License" - }, - "licenseFile": { - "description": "Relative slash-delimited path to the license file (e.g. LICENSE.txt)", - "type": "string", - "x-go-name": "LicenseFile" - }, - "man": { - "description": "Man is the path to documentation about the package", - "type": "string", - "x-go-name": "Man" - }, - "readinessGates": { - "type": "array", - "items": { - "$ref": "#/definitions/ReadinessGate" - }, - "x-go-name": "ReadinessGates" - }, - "site": { - "description": "Site is the URL for package web page.", - "type": "string", - "x-go-name": "Site" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Pipeline": { - "type": "object", - "title": "Pipeline declares a pipeline of functions used to mutate or validate resources.", - "properties": { - "mutators": { - "description": "Mutators defines a list of of KRM functions that mutate resources.", - "type": "array", - "items": { - "$ref": "#/definitions/Function" - }, - "x-go-name": "Mutators" - }, - "validators": { - "description": "Validators defines a list of KRM functions that validate resources.\nValidators are not permitted to mutate resources.", - "type": "array", - "items": { - "$ref": "#/definitions/Function" - }, - "x-go-name": "Validators" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "ReadinessGate": { - "type": "object", - "properties": { - "conditionType": { - "type": "string", - "x-go-name": "ConditionType" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "ResourceMeta": { - "type": "object", - "title": "ResourceMeta contains the metadata for a both Resource Type and Resource.", - "properties": { - "annotations": { - "description": "Annotations is the metadata.annotations field of a Resource.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Annotations" - }, - "apiVersion": { - "description": "APIVersion is the apiVersion field of a Resource", - "type": "string", - "x-go-name": "APIVersion" - }, - "kind": { - "description": "Kind is the kind field of a Resource", - "type": "string", - "x-go-name": "Kind" - }, - "labels": { - "description": "Labels is the metadata.labels field of a Resource", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Labels" - }, - "name": { - "description": "Name is the metadata.name field of a Resource", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace is the metadata.namespace field of a Resource", - "type": "string", - "x-go-name": "Namespace" - } - }, - "x-go-package": "sigs.k8s.io/kustomize/kyaml/yaml" - }, - "Selector": { - "description": "Selector specifies the selection criteria\nplease update IsEmpty method if more properties are added", - "type": "object", - "properties": { - "annotations": { - "description": "Annotations on the target resources", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Annotations" - }, - "apiVersion": { - "description": "APIVersion of the target resources", - "type": "string", - "x-go-name": "APIVersion" - }, - "kind": { - "description": "Kind of the target resources", - "type": "string", - "x-go-name": "Kind" - }, - "labels": { - "description": "Labels on the target resources", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Labels" - }, - "name": { - "description": "Name of the target resources", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace of the target resources", - "type": "string", - "x-go-name": "Namespace" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Status": { - "type": "object", - "properties": { - "conditions": { - "type": "array", - "items": { - "$ref": "#/definitions/Condition" - }, - "x-go-name": "Conditions" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "TypeMeta": { - "description": "TypeMeta partially copies apimachinery/pkg/apis/meta/v1.TypeMeta\nNo need for a direct dependence; the fields are stable.", - "type": "object", - "properties": { - "apiVersion": { - "description": "APIVersion is the apiVersion field of a Resource", - "type": "string", - "x-go-name": "APIVersion" - }, - "kind": { - "description": "Kind is the kind field of a Resource", - "type": "string", - "x-go-name": "Kind" - } - }, - "x-go-package": "sigs.k8s.io/kustomize/kyaml/yaml" - }, - "UpdateStrategyType": { - "type": "string", - "title": "UpdateStrategyType defines the strategy for updating a package from upstream.", - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "Upstream": { - "type": "object", - "title": "Upstream is a user-specified upstream locator for a package.", - "properties": { - "git": { - "$ref": "#/definitions/Git" - }, - "type": { - "$ref": "#/definitions/OriginType" - }, - "updateStrategy": { - "$ref": "#/definitions/UpdateStrategyType" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "UpstreamLock": { - "type": "object", - "title": "UpstreamLock is a resolved locator for the last fetch of the package.", - "properties": { - "git": { - "$ref": "#/definitions/GitLock" - }, - "type": { - "$ref": "#/definitions/OriginType" - } - }, - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - }, - "kptfile": { - "type": "object", - "title": "KptFile contains information about a package managed with kpt.", - "properties": { - "annotations": { - "description": "Annotations is the metadata.annotations field of a Resource.", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Annotations" - }, - "apiVersion": { - "description": "APIVersion is the apiVersion field of a Resource", - "type": "string", - "x-go-name": "APIVersion" - }, - "info": { - "$ref": "#/definitions/PackageInfo" - }, - "inventory": { - "$ref": "#/definitions/Inventory" - }, - "kind": { - "description": "Kind is the kind field of a Resource", - "type": "string", - "x-go-name": "Kind" - }, - "labels": { - "description": "Labels is the metadata.labels field of a Resource", - "type": "object", - "additionalProperties": { - "type": "string" - }, - "x-go-name": "Labels" - }, - "name": { - "description": "Name is the metadata.name field of a Resource", - "type": "string", - "x-go-name": "Name" - }, - "namespace": { - "description": "Namespace is the metadata.namespace field of a Resource", - "type": "string", - "x-go-name": "Namespace" - }, - "pipeline": { - "$ref": "#/definitions/Pipeline" - }, - "status": { - "$ref": "#/definitions/Status" - }, - "upstream": { - "$ref": "#/definitions/Upstream" - }, - "upstreamLock": { - "$ref": "#/definitions/UpstreamLock" - } - }, - "x-go-name": "KptFile", - "x-go-package": "github.com/kptdev/kpt/pkg/api/kptfile/v1" - } - } -} diff --git a/site/reference/schema/kptfile/kptfile.yaml b/site/reference/schema/kptfile/kptfile.yaml deleted file mode 100644 index 7f064837ee..0000000000 --- a/site/reference/schema/kptfile/kptfile.yaml +++ /dev/null @@ -1,446 +0,0 @@ -definitions: - Condition: - properties: - message: - type: string - x-go-name: Message - reason: - type: string - x-go-name: Reason - status: - $ref: '#/definitions/ConditionStatus' - type: - type: string - x-go-name: Type - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - ConditionStatus: - type: string - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Function: - properties: - configMap: - additionalProperties: - type: string - description: '`ConfigMap` is a convenient way to specify a function config - of kind ConfigMap.' - type: object - x-go-name: ConfigMap - configPath: - description: |- - `ConfigPath` specifies a slash-delimited relative path to a file in the current directory - containing a KRM resource used as the function config. This resource is - excluded when resolving 'sources', and as a result cannot be operated on - by the pipeline. - type: string - x-go-name: ConfigPath - exclude: - description: |- - `Exclude` are used to specify resources on which the function should NOT be executed. - If not specified, all resources selected by `Selectors` are selected. - items: - $ref: '#/definitions/Selector' - type: array - x-go-name: Exclusions - exec: - description: |- - Exec specifies the function binary executable. - The executable can be fully qualified or it must exists in the $PATH e.g: - - exec: set-namespace - exec: /usr/local/bin/my-custom-fn - type: string - x-go-name: Exec - image: - description: |- - `Image` specifies the function container image. - It can either be fully qualified, e.g.: - - image: gcr.io/kpt-fn/set-labels - - Optionally, kpt can be configured to use a image - registry host-path that will be used to resolve the image path in case - the image path is missing (Defaults to gcr.io/kpt-fn). - e.g. The following resolves to gcr.io/kpt-fn/set-labels: - - image: set-labels - type: string - x-go-name: Image - name: - description: |- - `Name` is used to uniquely identify the function declaration - this is primarily used for merging function declaration with upstream counterparts - type: string - x-go-name: Name - selectors: - description: |- - `Selectors` are used to specify resources on which the function should be executed - if not specified, all resources are selected - items: - $ref: '#/definitions/Selector' - type: array - x-go-name: Selectors - title: Function specifies a KRM function. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Git: - properties: - directory: - description: |- - Directory is the sub directory of the git repository. - e.g. 'staging/cockroachdb' - type: string - x-go-name: Directory - ref: - description: Ref can be a Git branch, tag, or a commit SHA-1. - type: string - x-go-name: Ref - repo: - description: |- - Repo is the git repository the package. - e.g. 'https://github.com/kubernetes/examples.git' - type: string - x-go-name: Repo - title: Git is the user-specified locator for a package on Git. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - GitLock: - properties: - commit: - description: |- - Commit is the SHA-1 for the last fetch of the package. - This is set by kpt for bookkeeping purposes. - type: string - x-go-name: Commit - directory: - description: |- - Directory is the sub directory of the git repository that was fetched. - e.g. 'staging/cockroachdb' - type: string - x-go-name: Directory - ref: - description: |- - Ref can be a Git branch, tag, or a commit SHA-1 that was fetched. - e.g. 'master' - type: string - x-go-name: Ref - repo: - description: |- - Repo is the git repository that was fetched. - e.g. 'https://github.com/kubernetes/examples.git' - type: string - x-go-name: Repo - title: GitLock is the resolved locator for a package on Git. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Inventory: - description: All of the the parameters are required if any are set. - properties: - annotations: - additionalProperties: - type: string - type: object - x-go-name: Annotations - inventoryID: - description: Unique label to identify inventory resource in cluster. - type: string - x-go-name: InventoryID - labels: - additionalProperties: - type: string - type: object - x-go-name: Labels - name: - description: Name of the inventory resource. - type: string - x-go-name: Name - namespace: - description: Namespace for the inventory resource. - type: string - x-go-name: Namespace - title: Inventory encapsulates the parameters for the inventory resource applied - to a cluster. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - NameMeta: - properties: - name: - description: Name is the metadata.name field of a Resource - type: string - x-go-name: Name - namespace: - description: Namespace is the metadata.namespace field of a Resource - type: string - x-go-name: Namespace - title: NameMeta contains name information. - type: object - x-go-package: sigs.k8s.io/kustomize/kyaml/yaml - ObjectMeta: - description: ObjectMeta contains metadata about a Resource - properties: - annotations: - additionalProperties: - type: string - description: Annotations is the metadata.annotations field of a Resource. - type: object - x-go-name: Annotations - labels: - additionalProperties: - type: string - description: Labels is the metadata.labels field of a Resource - type: object - x-go-name: Labels - name: - description: Name is the metadata.name field of a Resource - type: string - x-go-name: Name - namespace: - description: Namespace is the metadata.namespace field of a Resource - type: string - x-go-name: Namespace - type: object - x-go-package: sigs.k8s.io/kustomize/kyaml/yaml - OriginType: - title: OriginType defines the type of origin for a package. - type: string - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - PackageInfo: - description: |- - These fields are not consumed by any functionality in kpt and are simply passed through. - Note that like any other KRM resource, humans and automation can also use `metadata.labels` and - `metadata.annotations` as the extension mechanism. - properties: - description: - description: Description contains a short description of the package. - type: string - x-go-name: Description - emails: - description: Email is the list of emails for the package authors. - items: - type: string - type: array - x-go-name: Emails - keywords: - description: Keywords is a list of keywords for this package. - items: - type: string - type: array - x-go-name: Keywords - license: - description: 'SPDX license identifier (e.g. "Apache-2.0"). See: https://spdx.org/licenses/' - type: string - x-go-name: License - licenseFile: - description: Relative slash-delimited path to the license file (e.g. LICENSE.txt) - type: string - x-go-name: LicenseFile - man: - description: Man is the path to documentation about the package - type: string - x-go-name: Man - readinessGates: - items: - $ref: '#/definitions/ReadinessGate' - type: array - x-go-name: ReadinessGates - site: - description: Site is the URL for package web page. - type: string - x-go-name: Site - title: PackageInfo contains optional information about the package such as license, - documentation, etc. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Pipeline: - properties: - mutators: - description: Mutators defines a list of of KRM functions that mutate resources. - items: - $ref: '#/definitions/Function' - type: array - x-go-name: Mutators - validators: - description: |- - Validators defines a list of KRM functions that validate resources. - Validators are not permitted to mutate resources. - items: - $ref: '#/definitions/Function' - type: array - x-go-name: Validators - title: Pipeline declares a pipeline of functions used to mutate or validate resources. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - ReadinessGate: - properties: - conditionType: - type: string - x-go-name: ConditionType - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - ResourceMeta: - properties: - annotations: - additionalProperties: - type: string - description: Annotations is the metadata.annotations field of a Resource. - type: object - x-go-name: Annotations - apiVersion: - description: APIVersion is the apiVersion field of a Resource - type: string - x-go-name: APIVersion - kind: - description: Kind is the kind field of a Resource - type: string - x-go-name: Kind - labels: - additionalProperties: - type: string - description: Labels is the metadata.labels field of a Resource - type: object - x-go-name: Labels - name: - description: Name is the metadata.name field of a Resource - type: string - x-go-name: Name - namespace: - description: Namespace is the metadata.namespace field of a Resource - type: string - x-go-name: Namespace - title: ResourceMeta contains the metadata for a both Resource Type and Resource. - type: object - x-go-package: sigs.k8s.io/kustomize/kyaml/yaml - Selector: - description: |- - Selector specifies the selection criteria - please update IsEmpty method if more properties are added - properties: - annotations: - additionalProperties: - type: string - description: Annotations on the target resources - type: object - x-go-name: Annotations - apiVersion: - description: APIVersion of the target resources - type: string - x-go-name: APIVersion - kind: - description: Kind of the target resources - type: string - x-go-name: Kind - labels: - additionalProperties: - type: string - description: Labels on the target resources - type: object - x-go-name: Labels - name: - description: Name of the target resources - type: string - x-go-name: Name - namespace: - description: Namespace of the target resources - type: string - x-go-name: Namespace - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Status: - properties: - conditions: - items: - $ref: '#/definitions/Condition' - type: array - x-go-name: Conditions - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - TypeMeta: - description: |- - TypeMeta partially copies apimachinery/pkg/apis/meta/v1.TypeMeta - No need for a direct dependence; the fields are stable. - properties: - apiVersion: - description: APIVersion is the apiVersion field of a Resource - type: string - x-go-name: APIVersion - kind: - description: Kind is the kind field of a Resource - type: string - x-go-name: Kind - type: object - x-go-package: sigs.k8s.io/kustomize/kyaml/yaml - UpdateStrategyType: - title: UpdateStrategyType defines the strategy for updating a package from upstream. - type: string - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - Upstream: - properties: - git: - $ref: '#/definitions/Git' - type: - $ref: '#/definitions/OriginType' - updateStrategy: - $ref: '#/definitions/UpdateStrategyType' - title: Upstream is a user-specified upstream locator for a package. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - UpstreamLock: - properties: - git: - $ref: '#/definitions/GitLock' - type: - $ref: '#/definitions/OriginType' - title: UpstreamLock is a resolved locator for the last fetch of the package. - type: object - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 - kptfile: - properties: - annotations: - additionalProperties: - type: string - description: Annotations is the metadata.annotations field of a Resource. - type: object - x-go-name: Annotations - apiVersion: - description: APIVersion is the apiVersion field of a Resource - type: string - x-go-name: APIVersion - info: - $ref: '#/definitions/PackageInfo' - inventory: - $ref: '#/definitions/Inventory' - kind: - description: Kind is the kind field of a Resource - type: string - x-go-name: Kind - labels: - additionalProperties: - type: string - description: Labels is the metadata.labels field of a Resource - type: object - x-go-name: Labels - name: - description: Name is the metadata.name field of a Resource - type: string - x-go-name: Name - namespace: - description: Namespace is the metadata.namespace field of a Resource - type: string - x-go-name: Namespace - pipeline: - $ref: '#/definitions/Pipeline' - status: - $ref: '#/definitions/Status' - upstream: - $ref: '#/definitions/Upstream' - upstreamLock: - $ref: '#/definitions/UpstreamLock' - title: KptFile contains information about a package managed with kpt. - type: object - x-go-name: KptFile - x-go-package: github.com/kptdev/kpt/pkg/api/kptfile/v1 -info: - title: Kptfile schema. - version: v1 -paths: {} -swagger: "2.0" diff --git a/site/reference/schema/plan/README.md b/site/reference/schema/plan/README.md deleted file mode 100644 index f31089958a..0000000000 --- a/site/reference/schema/plan/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Plan - -The `kpt alpha live plan` command gives the option of outputting the plan in KRM format. This will be wrapped in a `ResourceList` -resource so it can easily be piped into kpt functions for validation. - -The plan contains a list of actions (under `spec.actions`) with one item for each resource associated with the package being -applied. Each entry in the list contains the `apiVersion`, `kind`, `name`, and `namespace` to identify the resource. It -also contains an `action` field, which defines which action will be taken on the resource during apply. It can have one of -the values: -* **Create**: The resource does not currently exist in the cluster and will be created. -* **Unchanged**: The resource exists in the cluster and there are no changes to it. -* **Delete**: The resource exists in the cluster, but is not among the applied resources. Therefore it will be pruned. -* **Update**: The resource exists in the cluster and will be updated. -* **Skip**: No changes will be made to this resource due to the presence of one or more lifecycle directives. -* **Error**: An error was encountered for the resource. - -There is also an `original` field which contains the resource from the cluster before apply (is it does exist), and -an `updated` field that contains the resource after apply (but the state in the cluster remains unchanged). Finally, there -is an `error` field that will have a more detailed error message in the cases where the value of the `action` field is `Error`. - -The OpenAPI -[schema is available here](https://raw.githubusercontent.com/kptdev/kpt/main/site/reference/schema/kptfile/kptfile.yaml). \ No newline at end of file diff --git a/site/reference/schema/plan/plan.yaml b/site/reference/schema/plan/plan.yaml deleted file mode 100644 index 05f270b516..0000000000 --- a/site/reference/schema/plan/plan.yaml +++ /dev/null @@ -1,60 +0,0 @@ -definitions: - Action: - properties: - type: - description: The type of action for the resource. One of Create, Unchanged, Delete, Update, Skip, Error - type: string - apiVersion: - description: The apiVersion of the resource - type: string - kind: - description: The kind of the resource - type: string - name: - description: The name of the resource - type: string - namespace: - description: The namespace of the resource - type: string - original: - description: The state of the resource in the cluster before any changes are applied - type: object - updated: - description: The state of the resource in the cluster after a dry-run server-side apply - type: object - error: - description: The error resulting from the apply operation if any - type: string - description: - type: object - Plan: - properties: - apiVersion: - description: APIVersion is the apiVersion field of a Resource - type: string - kind: - description: Kind is the kind field of a Resource - type: string - labels: - additionalProperties: - type: string - description: Labels is the metadata.labels field of a Resource - type: object - name: - description: Name is the metadata.name field of a Resource - type: string - namespace: - description: Namespace is the metadata.namespace field of a Resource - type: string - spec: - description: Spec is the specification of the Plan. - items: - $ref: '#/definitions/Action' - type: array - title: Plan contains actions that will be taken when applying a package - type: object -info: - title: Plan schema. - version: v1alpha1 -paths: {} -swagger: "2.0" diff --git a/site/reference/schema/resource-list/README.md b/site/reference/schema/resource-list/README.md deleted file mode 100644 index 8de3efe2f3..0000000000 --- a/site/reference/schema/resource-list/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# ResourceList - -See -[definition here](https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md#schema) diff --git a/site/sdk/ts-guide.md b/site/sdk/ts-guide.md deleted file mode 100644 index 7bec85da13..0000000000 --- a/site/sdk/ts-guide.md +++ /dev/null @@ -1,237 +0,0 @@ -# Typescript SDK Developer Guide - -This guide will walk you through developing a kpt function using the Typescript SDK. - -## Setup - -### System Requirements - -Currently supported platforms: amd64 Linux/Mac - -### Setting Up Your Local Environment - -Currently supported platforms: amd64 Linux/Mac - -- Install [kpt][download-kpt] and its dependencies -- Install [node][download-node] - - The SDK requires `npm` version 6 or higher. - - If installing node from binaries (i.e. without a package manager), follow - these [installation instructions][install-node]. - -### Your Kubernetes Cluster - -For the type generation functionality to work, you need a Kubernetes cluster -with the [CRD OpenAPI Publishing][crd-openapi] feature which is GA with -Kubernetes 1.16. - -Alternatively, you can use an existing NPM package with pre-generated types -such as the `hello-world` package discussed in the [Quickstart] and skip to -[implementing the function](#implement-the-function). - -### Working with CRDs - -The SDK uses the k8s server to generate the Typescript classes. If your -function uses a Custom Resource Definition, make sure you apply it to the -cluster used for type generation: - -```shell -$ kubectl apply -f /path/to/my/crd.yaml -``` - -## Create the NPM Package - -To initialize a new NPM package, first create a package directory: - -```shell -$ mkdir my-package -$ cd my-package -``` - -> **Note:** All subsequent commands are run from the `my-package/` directory. - -Run the interactive initializer: - -```shell -$ npm init kpt-functions -``` - -Follow the instructions and respond to all prompts. - -This process will create the following: - -1. `package.json`: The `kpt-functions` framework library is the only item - declared in `dependencies`. Everything required to compile and test your - config function is declared as `devDependencies`, including the - `create-kpt-functions` CLI discussed later in the `README`. -1. `src/`: Directory containing the source files for all your functions, e.g.: - - `my_func.ts`: Implement your function's interface here. - - `my_func_test.ts`: Unit tests for your function. - - `my_func_run.ts`: The entry point from which your function is run. -1. `src/gen/`: Contains Kubernetes core and CRD types generated from the - OpenAPI spec published by the cluster you selected. -1. `build/`: Contains Dockerfile for each function, e.g.: - - `my_func.Dockerfile` - -Next, install all package dependencies: - -```shell -$ npm install -``` - -In addition to installation, `install` compiles your function into the `dist/` -directory. - -You can run your function directly: - -```shell -$ node dist/my_func_run.js --help -``` - -Currently, it simply passes through the input configuration data. Let's remedy -this. - -## Implement the Function - -You can now start implementing the function using your favorite IDE, e.g. -[VSCode]: - -```shell -$ code . -``` - -In `src/my_func.ts`, implement the `KptFunc` interface from the [TS SDK API]. - -Take a look at these [demo functions] to better understand how -to use the typescript library. - -Once you've written some code, build the package with: - -```shell -$ npm run build -``` - -Alternatively, run the following in a separate terminal. It will continuously -build your function as you make changes: - -```shell -$ npm run watch -``` - -To run the tests, use: - -```shell -$ npm test -``` - -## Debug and Test the Function - -You may want to run a function developed with one of the config function SDKs -using the exec runtime in order to avoid the overhead associated with running -a container. To run your function in the exec runtime, you will first need to -package your function as an executable. - -The below example shows how to run a typescript function using the kpt exec -runtime. - -### Prerequisites - -- Install the pkg CLI. - - ```shell - $ npm install -g pkg - ``` - -- Install your kpt-functions package module to create your function's - distributable file. - - ```shell - $ npm i - ``` - -### Steps - -1. Pass the path to the appropriate executable for your OS when running kpt - using the exec runtime. - - ```shell - $ kpt fn eval DIR --exec "node dist/my_func_run.js" - ``` - -## Build and push container images - -With your working function in-hand, it's time to package your function into an -executable container image. - -To build the docker image: - -```shell -$ npm run kpt:docker-build -``` - -You can now run the function container, e.g.: - -```shell -$ kpt fn eval DIR --image gcr.io/kpt-functions-demo/my-func:dev -``` - -To push the image to your container registry of choice: - -```shell -$ npm run kpt:docker-push -``` - -You'll need proper authentication/authorization to push to your registry. - -`kpt:docker-push` pushes to the registry specified in the -`kpt.docker_repo_base` field in `package.json`. You can manually edit this -field at any time. - -The default value for the container image tag is `dev`. This can be overridden -using`--tag` flag: - -```shell -$ npm run kpt:docker-build -- --tag=latest -$ npm run kpt:docker-push -- --tag=latest -``` - -## Use the SDK CLI - -The `create-kpt-functions` package (installed as `devDependencies`), provides -a CLI for managing the NPM package you created above. The CLI sub-commands can -be invoked via `npm run`. For example, to add a new function to the package: - -```shell -$ npm run kpt:function-create -``` - -These sub-commands are available: - -``` -kpt:docker-create Generate Dockerfiles for all functions. Overwrite - files if they exist. -kpt:docker-build Build container images for all functions. -kpt:docker-push Push container images to the registry for all - functions. -kpt:function-create Generate stubs for a new function. Overwrites files - if they exist. -kpt:type-create Generate classes for core and CRD types. Overwrite - files if they exist. -``` - -Flags are passed to the CLI after the `--` separator. For example, to pass a -tag when building a container image: - -```shell -$ npm run kpt:docker-build -- --tag=latest -``` - -[download-kpt]: /book/01-getting-started/01-system-requirements -[download-node]: https://nodejs.org/en/download/ -[install-node]: https://github.com/nodejs/help/wiki/Installation/ -[install-node]: https://github.com/nodejs/help/wiki/Installation/ -[install-docker]: https://docs.docker.com/engine/installation/ -[crd-openapi]: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#customresourcedefinition-openapi-publishing -[quickstart]: ../quickstart/ -[vscode]: https://code.visualstudio.com/ -[ts sdk api]: https://kptdev.github.io/krm-functions-sdk/api/ -[demo functions]: https://github.com/kptdev/krm-functions-sdk/tree/master/ts/demo-functions/src/ diff --git a/site/sidebar.md b/site/sidebar.md deleted file mode 100644 index fab3cdbeb7..0000000000 --- a/site/sidebar.md +++ /dev/null @@ -1,112 +0,0 @@ - -- [Installation](installation/) -- [Book](book/) - - [1 Getting Started](book/01-getting-started/) - - [1.1 System Requirements](book/01-getting-started/01-system-requirements.md) - - [1.2 Quickstart](book/01-getting-started/02-quickstart.md) - - [2 Concepts](book/02-concepts/) - - [2.1 Packages](book/02-concepts/01-packages.md) - - [2.2 Workflows](book/02-concepts/02-workflows.md) - - [2.3 Functions](book/02-concepts/03-functions.md) - - [3 Packages](book/03-packages/) - - [3.1 Getting a Package](book/03-packages/01-getting-a-package.md) - - [3.2 Exploring a Package](book/03-packages/02-exploring-a-package.md) - - [3.3 Editing a Package](book/03-packages/03-editing-a-package.md) - - [3.4 Rendering a Package](book/03-packages/04-rendering-a-package.md) - - [3.5 Updating a Package](book/03-packages/05-updating-a-package.md) - - [3.6 Creating a Package](book/03-packages/06-creating-a-package.md) - - [3.7 Composing a Package](book/03-packages/07-composing-a-package.md) - - [3.8 Publishing a Package](book/03-packages/08-publishing-a-package.md) - - [4 Using Functions](book/04-using-functions/) - - [4.1 Declarative Function Execution](book/04-using-functions/01-declarative-function-execution.md) - - [4.2 Imperative Function Execution](book/04-using-functions/02-imperative-function-execution.md) - - [4.3 Function Results](book/04-using-functions/03-function-results.md) - - [5 Developing Functions](book/05-developing-functions/) - - [5.1 Functions Specification](book/05-developing-functions/01-functions-specification.md) - - [5.2 Developing in Go](book/05-developing-functions/02-developing-in-Go.md) - - [5.3 Developing in Typescript](book/05-developing-functions/03-developing-in-Typescript.md) - - [5.4 Developing in Starlark](book/05-developing-functions/04-developing-in-Starlark.md) - - [6 Deploying Packages](book/06-deploying-packages/) - - [6.1 Initializing a Package for Apply](book/06-deploying-packages/01-initializing-a-package-for-apply.md) - - [6.2 Applying a Package](book/06-deploying-packages/02-applying-a-package.md) - - [6.3 Handling Dependencies](book/06-deploying-packages/03-handling-dependencies.md) - - [7 Effective Customizations](book/07-effective-customizations/) - - [7.1 Single Value Replacement](book/07-effective-customizations/01-single-value-replacement.md) - - [7.2 Limiting Package Changes](book/07-effective-customizations/02-limiting-package-changes.md) - - [7.3 Generation](book/07-effective-customizations/03-generation.md) - - [8 Package Orchestration](book/08-package-orchestration/) - - [8.1 System Requirements](book/08-package-orchestration/01-system-requirements.md) - - [8.2 Quickstart](book/08-package-orchestration/02-quickstart.md) - - [8.3 Registering a Repository](book/08-package-orchestration/03-registering-a-repository.md) - - [8.4 Package Authoring](book/08-package-orchestration/04-package-authoring.md) - - [8.5 Package Lifecycle](book/08-package-orchestration/05-package-lifecycle.md) -- [Reference](reference/) - - [Annotations](reference/annotations/) - - [apply-time mutation](reference/annotations/apply-time-mutation/) - - [depends-on](reference/annotations/depends-on/) - - [local-config](reference/annotations/local-config/) - - [CLI](reference/cli/) - - [pkg](reference/cli/pkg/) - - [diff](reference/cli/pkg/diff/) - - [get](reference/cli/pkg/get/) - - [init](reference/cli/pkg/init/) - - [tree](reference/cli/pkg/tree/) - - [update](reference/cli/pkg/update/) - - [fn](reference/cli/fn/) - - [render](reference/cli/fn/render/) - - [eval](reference/cli/fn/eval/) - - [sink](reference/cli/fn/sink/) - - [source](reference/cli/fn/source/) - - [live](reference/cli/live/) - - [apply](reference/cli/live/apply/) - - [destroy](reference/cli/live/destroy/) - - [init](reference/cli/live/init/) - - [install-resource-group](reference/cli/live/install-resource-group/) - - [migrate](reference/cli/live/migrate/) - - [status](reference/cli/live/status/) - - [alpha](reference/cli/alpha/) - - [live](reference/cli/alpha/live/) - - [plan](reference/cli/alpha/live/plan/) - - [repo](reference/cli/alpha/repo/) - - [get](reference/cli/alpha/repo/get/) - - [reg](reference/cli/alpha/repo/reg/) - - [unreg](reference/cli/alpha/repo/unreg/) - - [rpkg](reference/cli/alpha/rpkg/) - - [get](reference/cli/alpha/rpkg/get/) - - [pull](reference/cli/alpha/rpkg/pull/) - - [push](reference/cli/alpha/rpkg/push/) - - [clone](reference/cli/alpha/rpkg/clone/) - - [init](reference/cli/alpha/rpkg/init/) - - [propose](reference/cli/alpha/rpkg/propose/) - - [approve](reference/cli/alpha/rpkg/approve/) - - [del](reference/cli/alpha/rpkg/del/) - - [propose-delete](reference/cli/alpha/rpkg/propose-delete/) - - [reject](reference/cli/alpha/rpkg/reject/) - - [copy](reference/cli/alpha/rpkg/copy/) - - [sync](reference/cli/alpha/sync/) - - [create](reference/cli/alpha/sync/create/) - - [delete](reference/cli/alpha/sync/delete/) - - [get](reference/cli/alpha/sync/get/) - - [Schema](reference/schema/) - - [Kptfile](reference/schema/kptfile/) - - [FunctionResultList](reference/schema/function-result-list/) - - [ResourceList](reference/schema/resource-list/) - - [CRD Status Convention](reference/schema/crd-status-convention/) - - [Config Connector Status Convention](reference/schema/config-connector-status-convention/) - - [Plan](reference/schema/plan/) -- [Functions Catalog](https://catalog.kpt.dev/ ":target=_self") - - [Curated](https://catalog.kpt.dev/ ":target=_self") - - [Contrib](https://catalog.kpt.dev/contrib/ ":target=_self") -- [GitOps](gitops/) - - [Config Sync](gitops/configsync/) -- [Guides](guides/) - - [The Rationale Behind kpt](guides/rationale.md) - - [Porch Installation Guide](guides/porch-installation.md) - - [Porch UI Installation Guide](guides/porch-ui-installation.md) - - [Porch User Guide](guides/porch-user-guide.md) - - [Namespace Provisioning CLI](guides/namespace-provisioning-cli.md) - - [Namespace Provisioning UI](guides/namespace-provisioning-ui.md) - - [Variant Constructor Pattern](guides/variant-constructor-pattern.md) - - [Value Propagation Pattern](guides/value-propagation.md) -- [FAQ](faq/) -- [Contact](contact/) diff --git a/site/site_check.conf b/site/site_check.conf deleted file mode 100644 index 3dfdec1056..0000000000 --- a/site/site_check.conf +++ /dev/null @@ -1,21 +0,0 @@ -server { - listen $PORT; - server_name localhost; - add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; - - location ~* \.md$ { - root /usr/share/nginx/html; - try_files $uri =404; - } - - location ~* ^[\/\w\.-]+[^\.]?.?.?$ { - root /usr/share/nginx/html; - index index.html index.htm; - try_files $uri /index.html; - } - - location ~* sidebar.md$ { - root /usr/share/nginx/html; - index sidebar.md; - } -} \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml deleted file mode 100644 index cd645a048d..0000000000 --- a/site/sitemap.xml +++ /dev/null @@ -1,303 +0,0 @@ - - - - https://kpt.dev/ - 2022-05-01 - - - https://kpt.dev/installation/ - 2022-05-01 - - - https://kpt.dev/book/ - 2022-05-01 - - - https://kpt.dev/book/01-getting-started/ - 2022-05-01 - - - https://kpt.dev/book/01-getting-started/01-system-requirements - 2022-05-01 - - - https://kpt.dev/book/01-getting-started/02-quickstart - 2022-05-01 - - - https://kpt.dev/book/02-concepts/ - 2022-05-01 - - - https://kpt.dev/book/02-concepts/01-packages - 2022-05-01 - - - https://kpt.dev/book/02-concepts/02-workflows - 2022-05-01 - - - https://kpt.dev/book/02-concepts/03-functions - 2022-05-01 - - - https://kpt.dev/book/03-packages/ - 2022-05-01 - - - https://kpt.dev/book/03-packages/01-getting-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/02-exploring-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/03-editing-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/04-rendering-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/05-updating-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/06-creating-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/07-composing-a-package - 2022-05-01 - - - https://kpt.dev/book/03-packages/08-publishing-a-package - 2022-05-01 - - - https://kpt.dev/book/04-using-functions/ - 2022-05-01 - - - https://kpt.dev/book/04-using-functions/01-declarative-function-execution - 2022-05-01 - - - https://kpt.dev/book/04-using-functions/02-imperative-function-execution - 2022-05-01 - - - https://kpt.dev/book/04-using-functions/03-function-results - 2022-05-01 - - - https://kpt.dev/book/05-developing-functions/ - 2022-05-01 - - - https://kpt.dev/book/05-developing-functions/01-functions-specification - 2022-05-01 - - - https://kpt.dev/book/05-developing-functions/02-developing-in-Go - 2022-05-01 - - - https://kpt.dev/book/05-developing-functions/03-developing-in-Typescript - 2022-05-01 - - - https://kpt.dev/book/05-developing-functions/04-developing-in-Starlark - 2022-05-01 - - - https://kpt.dev/book/06-deploying-packages/ - 2022-05-01 - - - https://kpt.dev/book/06-deploying-packages/01-initializing-a-package-for-apply - 2022-05-01 - - - https://kpt.dev/book/06-deploying-packages/02-applying-a-package - 2022-05-01 - - - https://kpt.dev/book/06-deploying-packages/03-handling-dependencies - 2022-05-01 - - - https://kpt.dev/book/07-effective-customizations/ - 2022-05-01 - - - https://kpt.dev/book/07-effective-customizations/01-single-value-replacement - 2022-05-01 - - - https://kpt.dev/book/07-effective-customizations/02-limiting-package-changes - 2022-05-01 - - - https://kpt.dev/book/07-effective-customizations/03-generation - 2022-05-01 - - - https://kpt.dev/reference/ - 2022-05-01 - - - https://kpt.dev/reference/annotations/ - 2022-05-01 - - - https://kpt.dev/reference/annotations/apply-time-mutation/ - 2022-05-01 - - - https://kpt.dev/reference/annotations/depends-on/ - 2022-05-01 - - - https://kpt.dev/reference/annotations/local-config/ - 2022-05-01 - - - https://kpt.dev/reference/cli/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/diff/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/get/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/init/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/tree/ - 2022-05-01 - - - https://kpt.dev/reference/cli/pkg/update/ - 2022-05-01 - - - https://kpt.dev/reference/cli/fn/ - 2022-05-01 - - - https://kpt.dev/reference/cli/fn/render/ - 2022-05-01 - - - https://kpt.dev/reference/cli/fn/eval/ - 2022-05-01 - - - https://kpt.dev/reference/cli/fn/sink/ - 2022-05-01 - - - https://kpt.dev/reference/cli/fn/source/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/apply/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/destroy/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/init/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/install-resource-group/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/migrate/ - 2022-05-01 - - - https://kpt.dev/reference/cli/live/status/ - 2022-05-01 - - - https://kpt.dev/reference/schema/ - 2022-05-01 - - - https://kpt.dev/reference/schema/kptfile/ - 2022-05-01 - - - https://kpt.dev/reference/schema/function-result-list/ - 2022-05-01 - - - https://kpt.dev/reference/schema/resource-list/ - 2022-05-01 - - - https://kpt.dev/reference/schema/crd-status-convention/ - 2022-05-01 - - - https://kpt.dev/reference/schema/config-connector-status-convention/ - 2022-05-01 - - - https://kpt.dev/guides/ - 2022-05-01 - - - https://kpt.dev/guides/rationale - 2022-05-01 - - - https://kpt.dev/guides/tenant-onboarding - 2022-05-01 - - - https://kpt.dev/faq/ - 2022-05-01 - - - https://kpt.dev/contact/ - 2022-05-01 - - - https://kpt.dev/reference/cli/alpha/ - 2022-05-01 - - - https://kpt.dev/sdk/ts-guide - 2022-05-01 - - - https://kpt.dev/quickstart/ - 2022-05-01 - - - https://kpt.dev/installation/migration - 2022-05-01 - - \ No newline at end of file diff --git a/site/static/casts/make-gif.sh b/site/static/casts/make-gif.sh deleted file mode 100755 index 3959342600..0000000000 --- a/site/static/casts/make-gif.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Copyright 2019 The kpt Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -export d=$(pwd) -cd $(mktemp -d) -git init > /dev/null - -export PKG=https://github.com/kptdev/kpt.git/package-examples/helloworld@v0.5.0 - -asciinema rec --overwrite -i 1 -c $d/$1.sh $d/$1.cast diff --git a/site/static/css/site.css b/site/static/css/site.css deleted file mode 100644 index b5bde3b028..0000000000 --- a/site/static/css/site.css +++ /dev/null @@ -1,163 +0,0 @@ -:root { - --content-max-width: 60em; - --search-input-color: black; - --search-result-heading-color: white; - --search-result-keyword-background: unset; - --search-result-keyword-margin: unset; - --search-result-keyword-font-weight: 800; - --theme-color: #3970e4; - --sidebar-background: #0f3074; - --sidebar-nav-link-color: rgba(255, 255, 255, 0.75); - --sidebar-nav-link-color--active: white; - --sidebar-nav-link-font-weight--active: 600; - --sidebar-nav-link-text-decoration--active: underline; - --sidebar-nav-link-before-content-l3: none; - --sidebar-name-color: white; - --sidebar-toggle-offset-top: unset; - --sidebar-width: 20rem; - --pagination-label-font-size: var(--font-size-l); - --pagination-title-font-size: 0px; -} - -.container { - position: relative; - width: 100%; - height: 0; - padding-bottom: 56.25%; -} -.video { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.close, -.close:focus, -.close:hover { - float: unset; - font-size: unset; - font-weight: unset; - line-height: unset; - color: unset; - text-shadow: unset; - filter: unset; - opacity: unset; -} - -.cover-main h1 img { - height: 72px; -} - -.cover-main blockquote { - border-left: unset; -} - -.cover.show { - display: flex !important; -} - -body { - background-color: unset; - line-height: unset; - font-family: unset; - font-size: unset; -} - -h1 { - line-height: unset; -} - -.dropdown-toggle { - background: var(--theme-color); - border: none; -} - -.sidebar { - color: rgba(255, 255, 255, 0.75); - font-size: 16px; -} - -.sidebar-toggle { - bottom: 0; -} - -.sidebar > h1 { - font-size: var(--sidebar-name-font-size); -} - -.sidebar > h1 img { - height: 32px; -} - -/* Hide inactive lists whose titles aren't links. */ -.sidebar-nav ul a + ul.inactive { - display: none; -} - -.sidebar-nav ul a { - white-space: unset; -} - -.sidebar-nav .book-outline ul { - margin-left: var(--sidebar-nav-indent); -} - -#cli-changes ~ .table-wrapper * { - --table-cell-border-width: 1px; - --table-cell-padding: 0.5em 0.5em; - --table-head-border-width: 1px; - --table-row-even-background: var(--mono-tint3); - --table-row-odd-background: inherit; - table-layout: fixed; - white-space: initial; -} - -.docsify-pagination-container { - overflow: hidden; - height: 76px; - margin-bottom: -24px; -} - -pre.language-shell button.copy-button { - position: absolute; - top: 2px; - right: 3em; - background: inherit; - border: none; - opacity: 0.3; -} - -pre.language-shell button.copy-button span { - font-size: 18px; -} - -pre.language-shell button.copy-button:hover { - opacity: 1; -} - -.github-widget { - position: absolute; - left: 47%; - margin-top: 2.5em; - padding-top: 8px; -} - -.github-widget .material-icons-outlined { - opacity: 0.3; - transition: all 0.2s; -} - -.github-widget .material-icons-outlined:hover { - opacity: 1; -} - -.pagination-item-label { - z-index: -1; - position: relative; -} - -.pagination-item a:hover { - color: black; -} diff --git a/site/static/images/KptLogoSmall.png b/site/static/images/KptLogoSmall.png deleted file mode 100644 index 01918e4e7e..0000000000 Binary files a/site/static/images/KptLogoSmall.png and /dev/null differ diff --git a/site/static/images/fn-export/circleci-result.png b/site/static/images/fn-export/circleci-result.png deleted file mode 100644 index 38c545ee84..0000000000 Binary files a/site/static/images/fn-export/circleci-result.png and /dev/null differ diff --git a/site/static/images/fn-export/github-actions-result.png b/site/static/images/fn-export/github-actions-result.png deleted file mode 100644 index 9bc37b7daa..0000000000 Binary files a/site/static/images/fn-export/github-actions-result.png and /dev/null differ diff --git a/site/static/images/fn-export/gitlab-ci-result.png b/site/static/images/fn-export/gitlab-ci-result.png deleted file mode 100644 index a78f2a67c7..0000000000 Binary files a/site/static/images/fn-export/gitlab-ci-result.png and /dev/null differ diff --git a/site/static/images/fn-export/jenkins-result.png b/site/static/images/fn-export/jenkins-result.png deleted file mode 100644 index 74be3c667a..0000000000 Binary files a/site/static/images/fn-export/jenkins-result.png and /dev/null differ diff --git a/site/static/images/fn-export/tekton-result.png b/site/static/images/fn-export/tekton-result.png deleted file mode 100644 index b5e6eb5a48..0000000000 Binary files a/site/static/images/fn-export/tekton-result.png and /dev/null differ diff --git a/site/static/images/func-target.svg b/site/static/images/func-target.svg deleted file mode 100644 index 20ccfbfcaa..0000000000 --- a/site/static/images/func-target.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - func - input items - output items - functionConfig - results - - - Selected - - - Not - Selected - - - - - - - - \ No newline at end of file diff --git a/site/static/images/func.svg b/site/static/images/func.svg deleted file mode 100644 index f2fdeaf871..0000000000 --- a/site/static/images/func.svg +++ /dev/null @@ -1,749 +0,0 @@ -funcinput itemsoutput itemsfunctionConfigresults \ No newline at end of file diff --git a/site/static/images/lifecycle/flow1.svg b/site/static/images/lifecycle/flow1.svg deleted file mode 100644 index e1b344baa2..0000000000 --- a/site/static/images/lifecycle/flow1.svg +++ /dev/null @@ -1,750 +0,0 @@ -GetExploreEditRender \ No newline at end of file diff --git a/site/static/images/lifecycle/flow2.svg b/site/static/images/lifecycle/flow2.svg deleted file mode 100644 index 2c7d3fbccf..0000000000 --- a/site/static/images/lifecycle/flow2.svg +++ /dev/null @@ -1,750 +0,0 @@ -UpdateExploreEditRender \ No newline at end of file diff --git a/site/static/images/lifecycle/flow3.svg b/site/static/images/lifecycle/flow3.svg deleted file mode 100644 index a40b412044..0000000000 --- a/site/static/images/lifecycle/flow3.svg +++ /dev/null @@ -1,749 +0,0 @@ -RenderInitalizePreviewApplyObserve \ No newline at end of file diff --git a/site/static/images/lifecycle/flow4.svg b/site/static/images/lifecycle/flow4.svg deleted file mode 100644 index e9f12f7735..0000000000 --- a/site/static/images/lifecycle/flow4.svg +++ /dev/null @@ -1,731 +0,0 @@ -RenderPublish \ No newline at end of file diff --git a/site/static/images/lifecycle/flow5.svg b/site/static/images/lifecycle/flow5.svg deleted file mode 100644 index fd56beef44..0000000000 --- a/site/static/images/lifecycle/flow5.svg +++ /dev/null @@ -1,742 +0,0 @@ -CreateEditRender \ No newline at end of file diff --git a/site/static/images/logo.png b/site/static/images/logo.png deleted file mode 100644 index 01da12acac..0000000000 Binary files a/site/static/images/logo.png and /dev/null differ diff --git a/site/static/images/logo.svg b/site/static/images/logo.svg deleted file mode 100644 index 1b47f8fb0f..0000000000 --- a/site/static/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/static/images/package-orchestration.svg b/site/static/images/package-orchestration.svg deleted file mode 100644 index 2650dbb29a..0000000000 --- a/site/static/images/package-orchestration.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/static/images/pipeline.svg b/site/static/images/pipeline.svg deleted file mode 100644 index 6be4b284c3..0000000000 --- a/site/static/images/pipeline.svg +++ /dev/null @@ -1,766 +0,0 @@ -func Afunc Binput itemsoutput itemsfunctionConfigfunctionConfigresults \ No newline at end of file diff --git a/site/static/images/set-command.svg b/site/static/images/set-command.svg deleted file mode 100644 index f9097a3180..0000000000 --- a/site/static/images/set-command.svg +++ /dev/null @@ -1,1067 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Produced by OmniGraffle 7.14 - 2020-03-18 15:44:01 +0000 - - - consumer set guide - - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/static/images/set-model.svg b/site/static/images/set-model.svg deleted file mode 100644 index 57cb44a1aa..0000000000 --- a/site/static/images/set-model.svg +++ /dev/null @@ -1,586 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Produced by OmniGraffle 7.13 - 2020-03-16 22:12:27 +0000 - - - Set Model - - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - references - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/static/images/status.svg b/site/static/images/status.svg deleted file mode 100644 index bd313f11f8..0000000000 --- a/site/static/images/status.svg +++ /dev/null @@ -1,747 +0,0 @@ -PackageAPI Server(Desired)API Server(Actual)ApplyApply StatusReconcileReconcile Status \ No newline at end of file diff --git a/site/static/images/substitute-command.svg b/site/static/images/substitute-command.svg deleted file mode 100644 index 3ba915b6e7..0000000000 --- a/site/static/images/substitute-command.svg +++ /dev/null @@ -1,1544 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Produced by OmniGraffle 7.14 - 2020-03-18 15:43:33 +0000 - - - consumer substitution guide - - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/static/images/substitute-model.svg b/site/static/images/substitute-model.svg deleted file mode 100644 index e7d420fe64..0000000000 --- a/site/static/images/substitute-model.svg +++ /dev/null @@ -1,1120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Produced by OmniGraffle 7.13 - 2020-03-16 22:05:50 +0000 - - - Substitution Model - - - Layer 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - references - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - references - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/static/images/tenant-onboarding.svg b/site/static/images/tenant-onboarding.svg deleted file mode 100644 index fcd3f09861..0000000000 --- a/site/static/images/tenant-onboarding.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/site/static/images/variant-constructor-pkg-repo-diagram.png b/site/static/images/variant-constructor-pkg-repo-diagram.png deleted file mode 100644 index 554da14b02..0000000000 Binary files a/site/static/images/variant-constructor-pkg-repo-diagram.png and /dev/null differ diff --git a/site/static/js/config.js b/site/static/js/config.js deleted file mode 100644 index 1588ea2675..0000000000 --- a/site/static/js/config.js +++ /dev/null @@ -1,37 +0,0 @@ -window.$docsify = { - name: `kpt`, - nameLink: window.location.origin, - search: { - maxAge: 43200000, - placeholder: "Search", - paths: "auto", - }, - loadSidebar: "sidebar.md", - alias: { - "/*.*/sidebar.md": "/sidebar.md", - }, - coverpage: "coverpage.md", - crossOriginLinks: [ - "https://catalog.kpt.dev/", - "https://kptdev.github.io/kpt/installation/", - ], - auto2top: true, - repo: "true", - pagination: { - previousText: 'PREV', - nextText: 'NEXT', - crossChapter: true - }, - corner: { - url: "https://github.com/kptdev/kpt", - icon: "github", - }, - routerMode: "history", - markdown: { - renderer: { - image: function (href, title) { - return `${title}`; - }, - }, - }, -}; diff --git a/site/static/js/plugins/book_page_title.js b/site/static/js/plugins/book_page_title.js deleted file mode 100644 index e4154c5fbe..0000000000 --- a/site/static/js/plugins/book_page_title.js +++ /dev/null @@ -1,33 +0,0 @@ -// Add title to book Markdown pages based on directory structure. -function processBookPageTitle(content) { - const pathname = window.location.pathname.toLowerCase(); - - const bookPathMatch = pathname.match(/^\/book\/(\d+)-(.+)\/(\d+)?-?(.+)?/); - - if (content && !content.startsWith("") && bookPathMatch) { - const pageNumber = parseInt(bookPathMatch[3]); - - // Use chapter name if on intro page and page name otherwise. - const chapterNum = `# ${parseInt(bookPathMatch[1])}${ - pageNumber > 0 ? `.${pageNumber}` : "" - }`; - const pageTitle = pageNumber > 0 ? bookPathMatch[4] : bookPathMatch[2]; - - content = - `${chapterNum} ${pageTitle.replace(/-/g, " ").toTitleCase()}\n` + - content; - } - - return content; -} - -// Load plugins into Docsify. -window.$docsify = window.$docsify || {}; -window.$docsify.plugins = [ - (hook, _vm) => hook.beforeEach(processBookPageTitle), -].concat(window.$docsify.plugins || []); - -// Export functions for testing. -if (typeof module !== "undefined") { - module.exports = { processBookPageTitle }; -} diff --git a/site/static/js/plugins/book_page_title.test.js b/site/static/js/plugins/book_page_title.test.js deleted file mode 100644 index ea722b4c89..0000000000 --- a/site/static/js/plugins/book_page_title.test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const plugins = require("./book_page_title"); -require("@gouch/to-title-case"); - -test.each([ - ["1 The Chapter Title", "book/01-the-chapter-title/"], - ["1.1 First Title", "book/01-anything/01-first-title"], - [ - "1.2 A Much Longer Page Title", - "book/01-anything/02-a-much-longer-page-title", - ], -])("title is correct on book pages", (expectedTitle, path) => { - delete window.location; - window.location = new URL(path, "https://test.test"); - const transformedContent = plugins.processBookPageTitle( - "Placeholder content" - ); - expect(transformedContent.split("\n")[0]).toBe(`# ${expectedTitle}`); -}); - -test("title is not set on non-book pages", () => { - delete window.location; - window.location = new URL("non-book/url", "https://test.test"); - const originalContent = "Placeholder content"; - const transformedContent = plugins.processBookPageTitle( - originalContent - ); - expect(transformedContent).toBe(originalContent); -}); - - -test("title is not set on pages without content", () => { - delete window.location; - window.location = new URL("book/01-book-chapter/01-book-page", "https://test.test"); - const originalContent = ""; - const transformedContent = plugins.processBookPageTitle( - originalContent - ); - expect(transformedContent).toBe(originalContent); -}); - - - -test("title is not set on pages that return default HTML", () => { - delete window.location; - window.location = new URL("book/01-book-chapter/01-book-page", "https://test.test"); - const originalContent = ""; - const transformedContent = plugins.processBookPageTitle( - originalContent - ); - expect(transformedContent).toBe(originalContent); -}); \ No newline at end of file diff --git a/site/static/js/plugins/copy_buttons.js b/site/static/js/plugins/copy_buttons.js deleted file mode 100644 index aa445f3c5f..0000000000 --- a/site/static/js/plugins/copy_buttons.js +++ /dev/null @@ -1,50 +0,0 @@ -function addCodeCopyButtons() { - const preBlocks = Array.from(document.getElementsByTagName("pre")).filter( - (el) => - el.classList.contains("language-shell") && - el.firstElementChild.textContent - .split("\n") - .find((line) => line.trimLeft().startsWith("$")) - ); - - const makeButton = () => { - const copyButton = document.createElement("button"); - const buttonClassName = "copy-button"; - copyButton.classList.add(buttonClassName); - copyButton.title = "Copy to clipboard"; - - const copyIcon = document.createElement("span"); - copyIcon.innerText = "copy"; - copyIcon.classList.add("material-icons-outlined"); - copyButton.appendChild(copyIcon); - - copyButton.addEventListener("click", (el) => - navigator.clipboard.writeText([ - el - .composedPath() - .find((el) => el.classList.contains(buttonClassName)) - .previousElementSibling.textContent.split("\n") - .map((s) => s.trim()) - .filter( - (s, ix, arr) => - s.startsWith("$") || (ix > 0 && arr[ix - 1].endsWith("\\")) - ) - .map((s) => s.replace(/^\$\s+/, "")) - .join("\n"), - ]) - ); - return copyButton; - }; - preBlocks.forEach((pre) => pre.appendChild(makeButton())); -} - -// Load plugins into Docsify. -window.$docsify = window.$docsify || {}; -window.$docsify.plugins = [].concat(function (hook, _vm) { - hook.doneEach(addCodeCopyButtons); -}, window.$docsify.plugins); - -// Export functions for testing. -if (typeof module !== "undefined") { - module.exports = { addCodeCopyButtons }; -} diff --git a/site/static/js/plugins/copy_buttons.test.js b/site/static/js/plugins/copy_buttons.test.js deleted file mode 100644 index 91872390db..0000000000 --- a/site/static/js/plugins/copy_buttons.test.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const plugins = require("./copy_buttons"); - -const originalClipboard = { ...global.navigator.clipboard }; -beforeEach(() => { - const mockClipboard = { - writeText: jest.fn(), - }; - global.navigator.clipboard = mockClipboard; -}); - -afterEach(() => { - jest.resetAllMocks(); - global.navigator.clipboard = originalClipboard; -}); - -test("clipboard copying button exists only on shell blocks with a '$'", () => { - document.body.innerHTML = `
-    
-    No copy button because $.
-    
-    
-
-    
-    $ kpt fn eval wordpress --image gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress
-    
-    
-
-    
-    $ No copy button because language.
-    
-    
`; - plugins.addCodeCopyButtons(); - const preTags = document.getElementsByTagName("pre"); - expect(preTags.item(0).getElementsByClassName("copy-button").length).toBe(0); - expect(preTags.item(1).getElementsByClassName("copy-button").length).toBe(1); - expect(preTags.item(2).getElementsByClassName("copy-button").length).toBe(0); -}); - -test.each([ - [ - [ - `kpt fn source wordpress \\ -| kpt fn eval - --image gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress \\ -| kpt fn eval - --image gcr.io/kpt-fn/set-labels:v0.1 -- app=wordpress env=prod \\ -| kpt fn sink wordpress`, - ], - `$ kpt fn source wordpress \\ -| kpt fn eval - --image gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress \\ -| kpt fn eval - --image gcr.io/kpt-fn/set-labels:v0.1 -- app=wordpress env=prod \\ -| kpt fn sink wordpress`, - ], - [ - [ - `kpt fn eval - --image \\ -gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress`, - ], - `$ kpt fn eval - --image \\ -gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=mywordpress -output`, - ], -])( - "clipboard copying button copies all lines of command: %s", - (expected, shellCodeText) => { - document.body.innerHTML = `
-    
-    ${shellCodeText}
-    
-    
`; - plugins.addCodeCopyButtons(); - document.getElementsByClassName("copy-button").item(0).click(); - expect(navigator.clipboard.writeText).toHaveBeenCalledWith(expected); - } -); diff --git a/site/static/js/plugins/github_widget.js b/site/static/js/plugins/github_widget.js deleted file mode 100644 index 3edb60d2c5..0000000000 --- a/site/static/js/plugins/github_widget.js +++ /dev/null @@ -1,49 +0,0 @@ -// Matches a path like /book/02-concepts/01-packages -const bookPath = /^\/book\/(\d+)-(.+)\/(\d+)?-?(.+)?/; - -const issueIcon = document.createElement("span"); -issueIcon.innerText = "bug_report"; -issueIcon.classList.add("material-icons-outlined"); -const createIssue = document.createElement("a"); -createIssue.id = "create_issue_button"; -createIssue.target = "_blank"; -createIssue.title = "Create documentation issue"; -createIssue.appendChild(issueIcon); - -const editIcon = document.createElement("span"); -editIcon.innerText = "edit"; -editIcon.classList.add("material-icons-outlined"); -const editPage = document.createElement("a"); -editPage.id = "edit_page_button"; -editPage.target = "_blank"; -editPage.title = "Edit this page"; -editPage.appendChild(editIcon); - -function addGitHubWidget() { - createIssue.href = `https://github.com/kptdev/kpt/issues/new?labels=documentation&title=Docs: ${document.title} (${window.location})`; - - let path = window.location.pathname; - const pageName = path.match(bookPath) ? "00.md" : "README.md"; - path += path.endsWith("/") ? pageName : ".md"; - editPage.href = `https://github.com/kptdev/kpt/edit/main/site${path}`; - - const container = document.createElement("div"); - container.classList.add("github-widget"); - container.appendChild(createIssue); - container.appendChild(editPage); - document - .getElementsByClassName("docsify-pagination-container") - .item(0) - .append(container); -} - -// Load plugins into Docsify. -window.$docsify = window.$docsify || {}; -window.$docsify.plugins = [].concat(function (hook, _vm) { - hook.doneEach(addGitHubWidget); -}, window.$docsify.plugins); - -// Export functions for testing. -if (typeof module !== "undefined") { - module.exports = { addGitHubWidget }; -} diff --git a/site/static/js/plugins/github_widget.test.js b/site/static/js/plugins/github_widget.test.js deleted file mode 100644 index fe3b1ec2e5..0000000000 --- a/site/static/js/plugins/github_widget.test.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const plugins = require("./github_widget"); - -test.each([ - [ - "https://github.com/kptdev/kpt/issues/new?labels=documentation&title=Docs:%20title%20(https://test.test/book/01-the-chapter-title/)", - "https://github.com/kptdev/kpt/edit/main/site/book/01-the-chapter-title/00.md", - "book/01-the-chapter-title/", - ], - [ - "https://github.com/kptdev/kpt/issues/new?labels=documentation&title=Docs:%20title%20(https://test.test/book/01-the-chapter-title/05-page.md)", - "https://github.com/kptdev/kpt/edit/main/site/book/01-the-chapter-title/05-page.md.md", - "book/01-the-chapter-title/05-page.md", - ], - [ - "https://github.com/kptdev/kpt/issues/new?labels=documentation&title=Docs:%20title%20(https://test.test/faq/)", - "https://github.com/kptdev/kpt/edit/main/site/faq/README.md", - "faq/", - ], -])("github urls are correct", (expectedIssueUrl, expectedEditUrl, path) => { - // Configure test environment. - delete window.location; - window.location = new URL(path, "https://test.test"); - document.title = "title"; - const container = document.createElement("div"); - container.classList.add("docsify-pagination-container"); - - document.body.append(container); - plugins.addGitHubWidget(); - const issueUrl = document.getElementById("create_issue_button").href; - const editUrl = document.getElementById("edit_page_button").href; - expect(issueUrl).toBe(expectedIssueUrl); - expect(editUrl).toBe(expectedEditUrl); -}); diff --git a/site/static/js/plugins/plugins.js b/site/static/js/plugins/plugins.js deleted file mode 100644 index b9618130c6..0000000000 --- a/site/static/js/plugins/plugins.js +++ /dev/null @@ -1,134 +0,0 @@ -function convertFromHugo(content) { - const hugoHideDirectives = /{{% hide %}}.+?{{% \/hide %}}/gms; - const hugoDirectiveTags = /{{.*}}/g; - - content = processHugoTitleHeading(content); - return content.replace(hugoHideDirectives, "").replace(hugoDirectiveTags, ""); -} - -async function addVersionDropdown() { - const sidebar = document.getElementsByClassName("sidebar").item(0); - const latestVersion = "v1.0.0-beta"; - const versionDropdown = ` - - `; - const node = document.createElement("div"); - node.innerHTML = versionDropdown; - sidebar.getElementsByClassName("app-name").item(0).appendChild(node); -} - -function showBookPageFooters() { - const isBookPage = document.location.pathname - .toLowerCase() - .startsWith("/book"); - - const hideButtonsToNonBookPages = (buttons) => { - buttons.forEach((el) => { - url = new URL(el.lastElementChild.href); - el.style.display = isBookPage && url.pathname.toLowerCase().startsWith("/book") - ? "flex" - : "none"; - }); - }; - - const previousPaginationButtons = Array.from( - document.getElementsByClassName("pagination-item--previous") - ); - - const nextPaginationButtons = Array.from( - document.getElementsByClassName("pagination-item--next") - ); - - hideButtonsToNonBookPages( - previousPaginationButtons.concat(nextPaginationButtons) - ); -} - -function addSidebarCollapsibility(sidebar) { - const tocLists = Array.from(sidebar?.getElementsByTagName("ul")); - - // Hide a child list if neither its parent nor any of its descendants are active. - tocLists.forEach((ul) => - ul.parentElement.classList.contains("active") || - ul.getElementsByClassName("active").length - ? ul.classList.remove("inactive") - : ul.classList.add("inactive") - ); -} - -// Make Markdown standard titles (# Title) out of the following: -// +++ -// title: Page Title -// +++ -function processHugoTitleHeading(content) { - const titleBlock = /^[\+\-]{3}[\s\S]*?^[\+\-]{3}$/m; - const titleMatch = content.match(/title:\s*["'](.*)["']/); - - const titleHeading = titleMatch ? `# ${titleMatch[1]}` : ""; - - return content.replace(titleBlock, titleHeading); -} - -// Convert Hugo Asciinema directives to HTML. -function processAsciinemaTags(content) { - const asciinemaDirective = /{{<\s*asciinema.+key="(.+?)".+}}/g; - - return content.replace( - asciinemaDirective, - (_, fileName) => - `` - ); -} -// Workaround for https://github.com/docsifyjs/docsify/pull/1468 -function defaultLinkTargets() { - const externalPageLinks = Array.from( - document.getElementsByTagName("a") - ).filter( - (a) => - window.Docsify.util.isExternal(a.href) && - !window.$docsify.crossOriginLinks.includes(a.href) - ); - externalPageLinks.forEach( - (a) => (a.target = window.$docsify.externalLinkTarget) - ); -} - -function localPlugins(hook, _vm) { - // Process Markdown directives appropriately. - hook.beforeEach(function (content) { - content = processAsciinemaTags(content); - - // Until all source markdown files stop using Hugo directives, - // convert here for compatibility. - content = convertFromHugo(content); - return content; - }); - - hook.mounted(addVersionDropdown); - - // Show navigation footer for book pages. - hook.doneEach(showBookPageFooters); - - // Reset all external links to their appropriate targets. - hook.doneEach(defaultLinkTargets); - - // Process elements in the navigation sidebar. - hook.doneEach(function () { - const sidebar = document.getElementsByClassName("sidebar-nav").item(0); - - // Only show child pages for currently active page to avoid sidebar cluttering. - addSidebarCollapsibility(sidebar); - }); -} - -// Load plugins into Docsify. -window.$docsify = window.$docsify || {}; -window.$docsify.plugins = [localPlugins].concat(window.$docsify.plugins || []); - diff --git a/site/static/openapi/kptfile.yaml b/site/static/openapi/kptfile.yaml deleted file mode 100644 index eb41838ca5..0000000000 --- a/site/static/openapi/kptfile.yaml +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright 2019 The kpt Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -swagger: "2.0" -definitions: - Kptfile: - type: "object" - description: "Kptfile configures a kpt package" - "x-kubernetes-group-version-kind": - "kind": "Kptfile" - properties: - apiVersion: - description: "apiVersion of the Kptfile" - type: string - kind: - description: "kind -- always Kptfile" - type: string - dependencies: - description: "Package dependencies to sync with the `kpt pkg sync` command" - type: "array" - items: - "$ref": "#/definitions/Dependency" - openAPI: - description: "Package specific OpenAPI definitions to be applied to the package contents." - "$ref": "#/definitions/OpenAPI" - upstream: - description: "Metadata about the upstream source" - "$ref": "#/definitions/Upstream" - - OpenAPI: - type: "object" - description: "OpenAPI schema definitions" - properties: - definitions: - type: object - additionalProperties: - example: "io.k8s.cli.setters.replicas" - description: "keys for setters and substitutions must be of the form io.k8s.cli.setters.NAME or io.k8s.cli.substitution.NAME" - type: object - properties: - x-k8s-cli: - description: "kubernetes configuration specific extensions" - "$ref": "#/definitions/Extension" - - Extension: - type: "object" - properties: - type: - description: "field type the setter sets" - type: string - enum: ["array", "boolean", "integer", "string"] - example: "string" - setter: - description: "definition of setter which may be invoked from the cli" - type: object - properties: - name: - description: "name of the setter, should match the name in the definition key" - type: string - example: "replicas" - value: - description: "current value of the setter, which should be applied to fields and substitutions" - type: string - example: "3" - listValues: - description: "list of string values to be used if the type is array" - type: array - example: ["a", "b", "c"] - substitution: - description: "definition of setter which may be invoked from the cli" - type: object - properties: - name: - description: "name of the setter, should match the name in the definition key" - type: string - example: "tag" - pattern: - description: "pattern to substitute one or more setters into" - type: string - example: "nginx:$(TAG_SETTER)" - values: - description: "setters to substitute into the pattern" - type: array - items: - type: object - properties: - marker: - description: "string marker in the pattern which will be replaced by the setter's value" - type: string - example: "$(TAG_SETTER)" - "$ref": - description: "reference to a setter OpenAPI definition to pull the value from" - type: string - example: "#/definitions/io.k8s.cli.setters.tag" - - Dependency: - type: "object" - properties: - name: - description: "Name of the dependency -- must be unique" - type: "string" - upstream: - description: "Name of the dependency -- must be unique" - "$ref": "#/definitions/Upstream" - ensureNotExists: - description: "Set to true to delete the dependency" - type: "boolean" - strategy: - description: "Update merge strategy." - type: "string" - autoSet: - description: "When syncing this dependency, automatically perform setters by pulling their values from environment variables." - type: "boolean" - - Upstream: - type: "object" - properties: - type: - description: "Type of the upstream source -- always git" - type: "string" - git: - description: "Metadata about the upstream git repo" - properties: - commit: - description: "Upstream git commit the the package was last fetched at." - type: "string" - repo: - description: "Upstream git repo." - type: "string" - directory: - description: "Upstream git subdirectory." - type: "string" - ref: - description: "Upstream git ref the the package was last fetched at." - type: "string"