From 5c74f013a1509c16c9b13cb57837f7bf2bcbaf87 Mon Sep 17 00:00:00 2001 From: Jason Stirnaman Date: Fri, 21 Jun 2024 18:41:07 -0500 Subject: [PATCH] chore(ci): Improve CI lint and test runners - Reconfigures prettier linting. - Adds .editorconfig to help with consistent editor settings - Refactors test runs: - Removes test configuration from compose.yaml (not suited for this use case). - Splits test runner into test content setup and pytest that can be run separately or together (and with other test runners in the future). - Configuration is in Dockerfiles and command line (`.lintstagedrc.mjs`) - Updates CONTRIBUTING.md - Updates client library write examples in cloud-dedicated and clustered. --- .editorconfig | 6 + .gitignore | 6 +- .husky/pre-commit | 3 +- .lintstagedrc.mjs | 44 + .prettierignore | 5 + .prettierrc.yaml | 14 +- CONTRIBUTING.md | 369 ++++++-- Dockerfile.pytest | 54 ++ Dockerfile.tests | 18 + compose.yaml | 46 +- .../cloud-dedicated/get-started/_index.md | 148 +-- .../cloud-dedicated/get-started/write.md | 887 +++++++++++------- .../line-protocol/client-libraries.md | 599 +++++++----- .../influxdb/clustered/get-started/_index.md | 79 +- .../influxdb/clustered/get-started/write.md | 771 +++++++++------ .../line protocol/client-libraries.md | 375 -------- .../write-data/line protocol/influxctl-cli.md | 165 ---- .../_index.md | 2 +- .../line-protocol/client-libraries.md | 463 +++++++++ package.json | 19 +- test.Dockerfile | 94 -- test.sh | 66 -- test/.dockerignore | 4 +- test/.gitignore | 3 + test/setup/run-tests.sh | 116 --- test/{ => src}/parse_yaml.sh | 0 test/src/prepare-content.sh | 105 +++ test/{ => src}/pytest.ini | 0 test/{ => src}/requirements.txt | 0 yarn.lock | 745 ++++++++------- 30 files changed, 2945 insertions(+), 2261 deletions(-) create mode 100644 .editorconfig create mode 100644 .lintstagedrc.mjs create mode 100644 .prettierignore create mode 100644 Dockerfile.pytest create mode 100644 Dockerfile.tests delete mode 100644 content/influxdb/clustered/write-data/line protocol/client-libraries.md delete mode 100644 content/influxdb/clustered/write-data/line protocol/influxctl-cli.md rename content/influxdb/clustered/write-data/{line protocol => line-protocol}/_index.md (95%) create mode 100644 content/influxdb/clustered/write-data/line-protocol/client-libraries.md delete mode 100644 test.Dockerfile delete mode 100755 test.sh delete mode 100644 test/setup/run-tests.sh rename test/{ => src}/parse_yaml.sh (100%) create mode 100644 test/src/prepare-content.sh rename test/{ => src}/pytest.ini (100%) rename test/{ => src}/requirements.txt (100%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..367809061 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 +max_line_length = 80 diff --git a/.gitignore b/.gitignore index 9448e9d4f..2c9564d31 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ public .*.swp node_modules +.config* +**/.env* *.log /resources .hugo_build.lock @@ -10,4 +12,6 @@ node_modules /api-docs/redoc-static.html* .vscode/* .idea -package-lock.json \ No newline at end of file +config.toml +package-lock.json +tmp \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 2021602b8..e3456b228 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1 @@ -npx lint-staged --relative --verbose -yarn run test +npx lint-staged --relative diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs new file mode 100644 index 000000000..296ed2cf6 --- /dev/null +++ b/.lintstagedrc.mjs @@ -0,0 +1,44 @@ +// Lint-staged configuration. This file must export a lint-staged configuration object. + +function lintStagedContent(paths, productPath) { + const name = `staged-${productPath.replace(/\//g, '-')}`; + + return [ + `prettier --write ${paths.join(' ')}`, + + `docker build . -f Dockerfile.tests -t influxdata-docs/tests:latest`, + + // Remove any existing test container. + `docker rm -f ${name} || true`, + + `docker run --name ${name} --mount type=volume,target=/app/content --mount type=bind,src=./content,dst=/src/content --mount type=bind,src=./static/downloads,dst=/app/data + influxdata-docs/tests --files "${paths.join(' ')}"`, + + `docker build . -f Dockerfile.pytest -t influxdata-docs/pytest:latest`, + + // Run test runners. If tests fail, the container will be removed, + //but the "test-" container will remain until the next run. + `docker run --env-file ${productPath}/.env.test + --volumes-from ${name} --rm + influxdata-docs/pytest --codeblocks ${productPath}/` + ]; +} + +export default { + "*.{js,css}": paths => `prettier --write ${paths.join(' ')}`, + + // Don't let prettier check or write Markdown files for now; + // it indents code blocks within list items, which breaks Hugo's rendering. + // "*.md": paths => `prettier --check ${paths.join(' ')}`, + + "content/influxdb/cloud-dedicated/**/*.md": + paths => lintStagedContent(paths, 'content/influxdb/cloud-dedicated'), + "content/influxdb/clustered/**/*.md": + paths => lintStagedContent(paths, 'content/influxdb/clustered'), + + // "content/influxdb/cloud-serverless/**/*.md": "docker compose run -T lint --config=content/influxdb/cloud-serverless/.vale.ini --minAlertLevel=error", + + // "content/influxdb/clustered/**/*.md": "docker compose run -T lint --config=content/influxdb/clustered/.vale.ini --minAlertLevel=error", + + // "content/influxdb/{cloud,v2,telegraf}/**/*.md": "docker compose run -T lint --config=.vale.ini --minAlertLevel=error" +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..004c23fb4 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +# Ignore Prettier checking for files +**/.git +**/.svn +**/.hg +**/node_modules diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 672e2297b..a0af81adc 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -1,4 +1,14 @@ -trailingComma: "es5" -tabWidth: 2 +# ~/.prettierrc.yaml +printWidth: 80 semi: true singleQuote: true +tabWidth: 2 +trailingComma: "es5" +useTabs: false +overrides: + - files: + - "*.md" + - "*.markdown" + options: + proseWrap: "preserve" +# Prettier also uses settings, such as indent, specified in .editorconfig \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aa8dbf62e..96d9068fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ # Contributing to InfluxData Documentation ## Sign the InfluxData CLA + The InfluxData Contributor License Agreement (CLA) is part of the legal framework for the open source ecosystem that protects both you and InfluxData. To make substantial contributions to InfluxData documentation, first sign the InfluxData CLA. @@ -10,77 +11,176 @@ What constitutes a "substantial" change is at the discretion of InfluxData docum _**Note:** Typo and broken link fixes are greatly appreciated and do not require signing the CLA._ -*If you're new to contributing or you're looking for an easy update, see [`docs-v2` good-first-issues](https://github.com/influxdata/docs-v2/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue).* +_If you're new to contributing or you're looking for an easy update, see [`docs-v2` good-first-issues](https://github.com/influxdata/docs-v2/issues?q=is%3Aissue+is%3Aopen+label%3Agood-first-issue)._ ## Make suggested updates ### Fork and clone InfluxData Documentation Repository + [Fork this repository](https://help.github.com/articles/fork-a-repo/) and [clone it](https://help.github.com/articles/cloning-a-repository/) to your local machine. +## Install project dependencies + +docs-v2 automatically runs format (Markdown, JS, and CSS) linting and code block tests for staged files that you try to commit. + +For the linting and tests to run, you need to install Docker and Node.js +dependencies. + +\_**Note:** +We strongly recommend running linting and tests, but you can skip them +(and avoid installing dependencies) +by including the `--no-verify` flag with your commit--for example, enter the following command in your terminal: + +```sh +git commit -m "" --no-verify +``` + +### Install Node.js dependencies + +To install dependencies listed in package.json: + +1. Install [Node.js](https://nodejs.org/en) for your system. +2. Install [Yarn](https://yarnpkg.com/getting-started/install) for your system. +3. Run `yarn` to install dependencies (including Hugo). +4. Install the Yarn package manager and run `yarn` to install project dependencies. + +`package.json` contains dependencies for linting and running Git hooks. + +- **[husky](https://github.com/typicode/husky)**: manages Git hooks, including the pre-commit hook for linting and testing +- **[lint-staged](https://github.com/lint-staged/lint-staged)**: passes staged files to commands +- **[prettier](https://prettier.io/docs/en/)**: formats code, including Markdown, according to style rules for consistency + +### Install Docker + +Install [Docker](https://docs.docker.com/get-docker/) for your system. + +docs-v2 includes Docker configurations (`compose.yaml` and Dockerfiles) for running the Vale style linter and tests for code blocks (Shell, Bash, and Python) in Markdown files. + ### Run the documentation locally (optional) + To run the documentation locally, follow the instructions provided in the README. -### Install and run Vale +### Make your changes -Use the [Vale](https://vale.sh/) style linter for spellchecking and enforcing style guidelines. -The docs-v2 `package.json` includes a Vale dependency that installs the Vale binary when you run `yarn`. -After you use `yarn` to install Vale, you can run `npx vale` to execute Vale commands. +Make your suggested changes being sure to follow the [style and formatting guidelines](#style--formatting) outline below. -_To install Vale globally or use a different package manager, follow the [Vale CLI installation](https://vale.sh/docs/vale-cli/installation/) for your system._ +## Lint and test your changes -#### Integrate with your editor +### Automatic pre-commit checks + +docs-v2 uses Husky to manage Git hook scripts. +When you try to commit your changes (for example, `git commit`), Git runs +scripts configured in `.husky/pre-commit`, including linting and tests for your staged files. + +### Skip pre-commit hooks + +**We strongly recommend running linting and tests**, but you can skip them +(and avoid installing dependencies) +by including the `--no-verify` flag with your commit--for example, enter the following command in your terminal: + +```sh +git commit -m "" --no-verify +``` + +For more options, see the [Husky documentation](https://typicode.github.io/husky/how-to.html#skipping-git-hooks). + +### Pre-commit linting and testing + +When you try to commit your changes using `git commit` or your editor, +the project automatically runs pre-commit checks for spelling, punctuation, +and style on your staged files. + +The pre-commit hook calls [`lint-staged`](https://github.com/lint-staged/lint-staged) using the configuration in `package.json`. + +To run `lint-staged` scripts manually (without committing), enter the following +command in your terminal: + +```sh +npx lint-staged --relative --verbose +``` + +The pre-commit linting configuration checks for _error-level_ problems. +An error-level rule violation fails the commit and you must +fix the problems before you can commit your changes. + +If an error doesn't warrant a fix (for example, a term that should be allowed), +you can override the check and try the commit again or you can edit the linter +style rules to permanently allow the content. See **Configure style rules**. + +### Vale style linting + +docs-v2 includes Vale writing style linter configurations to enforce documentation writing style rules, guidelines, branding, and vocabulary terms. + +To run Vale, use the Vale extension for your editor or the included Docker configuration. +For example, the following command runs Vale in a container and lints `*.md` (Markdown) files in the path `./content/influxdb/cloud-dedicated/write-data/` using the specified configuration for `cloud-dedicated`: + +```sh +docker compose run -T vale --config=content/influxdb/cloud-dedicated/.vale.ini --minAlertLevel=error content/influxdb/cloud-dedicated/write-data/**/*.md +``` + +The output contains error-level style alerts for the Markdown content. + +**Note**: We strongly recommend running Vale, but it's not included in the +docs-v2 pre-commit hooks](#automatic-pre-commit-checks) for now. +You can include it in your own Git hooks. + +If a file contains style, spelling, or punctuation problems, +the Vale linter can raise one of the following alert levels: + +- **Error**: + - Problems that can cause content to render incorrectly + - Violations of branding guidelines or trademark guidelines + - Rejected vocabulary terms +- **Warning**: General style guide rules and best practices +- **Suggestion**: Style preferences that may require refactoring or updates to an exceptions list + +### Integrate Vale with your editor To integrate Vale with VSCode: 1. Install the [Vale VSCode](https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode) extension. -2. In the extension settings, set the `Vale:Vale CLI:Path` value to the path of your Vale binary. -Use the path `${workspaceFolder}/node_modules/.bin/vale` for the Vale binary that you installed with Yarn. +2. In the extension settings, set the `Vale:Vale CLI:Path` value to the path of your Vale binary (`${workspaceFolder}/node_modules/.bin/vale` for Yarn-installed Vale). To use with an editor other than VSCode, see the [Vale integration guide](https://vale.sh/docs/integrations/guide/). -#### Lint product directories +### Configure style rules -The `docs-v2` repository includes a shell script that lints product directories using the `InfluxDataDocs` style rules and product-specific vocabularies, and then generates a report. -To run the script, enter the following command in your terminal: +`/.ci/vale/styles/` contains configuration files for the custom `InfluxDataDocs` style. -```sh -sh .ci/vale/vale.sh -``` - -#### Configure style rules - -The `docs-v2` repository contains `.vale.ini` files that configure a custom `InfluxDataDocs` style with spelling and style rules. -When you run `vale ` (from the CLI or an editor extension), it searches for a `.vale.ini` file in the directory of the file being linted. - -`docs-v2` style rules are located at `.ci/vale/styles/`. The easiest way to add accepted or rejected spellings is to enter your terms (or regular expression patterns) into the Vocabulary files at `.ci/vale/styles/config/vocabularies`. +To add accepted/rejected terms for specific products, configure a style for the product and include a `Branding.yml` configuration. As an example, see `content/influxdb/cloud-dedicated/.vale.ini` and `.ci/vale/styles/Cloud-Dedicated/Branding.yml`. + To learn more about configuration and rules, see [Vale configuration](https://vale.sh/docs/topics/config). -### Make your changes -Make your suggested changes being sure to follow the [style and formatting guidelines](#style--formatting) outline below. - ### Submit a pull request + Push your changes up to your forked repository, then [create a new pull request](https://help.github.com/articles/creating-a-pull-request/). ## Style & Formatting ### Markdown -All of our documentation is written in [Markdown](https://en.wikipedia.org/wiki/Markdown). + +Most docs-v2 documentation content uses [Markdown](https://en.wikipedia.org/wiki/Markdown). + +_Some parts of the documentation, such as `./api-docs`, contain Markdown within YAML and rely on additional tooling._ ### Semantic line feeds + Use [semantic line feeds](http://rhodesmill.org/brandon/2012/one-sentence-per-line/). Separating each sentence with a new line makes it easy to parse diffs with the human eye. **Diff without semantic line feeds:** -``` diff + +```diff -Data is taking off. This data is time series. You need a database that specializes in time series. You should check out InfluxDB. +Data is taking off. This data is time series. You need a database that specializes in time series. You need InfluxDB. ``` **Diff with semantic line feeds:** -``` diff + +```diff Data is taking off. This data is time series. You need a database that specializes in time series. @@ -89,16 +189,19 @@ You need a database that specializes in time series. ``` ### Article headings + Use only h2-h6 headings in markdown content. h1 headings act as the page title and are populated automatically from the `title` frontmatter. h2-h6 headings act as section headings. ### Image naming conventions + Save images using the following naming format: `project/version-context-description.png`. For example, `influxdb/2-0-visualizations-line-graph.png` or `influxdb/2-0-tasks-add-new.png`. Specify a version other than 2.0 only if the image is specific to that version. ## Page frontmatter + Every documentation page includes frontmatter which specifies information about the page. Frontmatter populates variables in page templates and the site's navigation menu. @@ -121,7 +224,7 @@ external_url: # Used in children shortcode type="list" for page links that are e list_image: # Image included with article descriptions in children type="articles" shortcode list_note: # Used in children shortcode type="list" to add a small note next to listed links list_code_example: # Code example included with article descriptions in children type="articles" shortcode -list_query_example: # Code examples included with article descriptions in children type="articles" shortcode, +list_query_example:# Code examples included with article descriptions in children type="articles" shortcode, # References to examples in data/query_examples canonical: # Path to canonical page, overrides auto-gen'd canonical URL v2: # Path to v2 equivalent page @@ -138,22 +241,27 @@ updated_in: # Product and version the referenced feature was updated in (display ### Title usage ##### `title` + The `title` frontmatter populates each page's HTML `h1` heading tag. It shouldn't be overly long, but should set the context for users coming from outside sources. ##### `seotitle` + The `seotitle` frontmatter populates each page's HTML `title` attribute. Search engines use this in search results (not the page's h1) and therefore it should be keyword optimized. ##### `list_title` + The `list_title` frontmatter determines an article title when in a list generated by the [`{{< children >}}` shortcode](#generate-a-list-of-children-articles). ##### `menu > name` + The `name` attribute under the `menu` frontmatter determines the text used in each page's link in the site navigation. It should be short and assume the context of its parent if it has one. #### Page Weights + To ensure pages are sorted both by weight and their depth in the directory structure, pages should be weighted in "levels." All top level pages are weighted 1-99. @@ -163,6 +271,7 @@ Then 201-299 and so on. _**Note:** `_index.md` files should be weighted one level up from the other `.md` files in the same directory._ ### Related content + Use the `related` frontmatter to include links to specific articles at the bottom of an article. - If the page exists inside of this documentation, just include the path to the page. @@ -181,6 +290,7 @@ related: ``` ### Canonical URLs + Search engines use canonical URLs to accurately rank pages with similar or identical content. The `canonical` HTML meta tag identifies which page should be used as the source of truth. @@ -200,6 +310,7 @@ canonical: /{{< latest "influxdb" "v2" >}}/path/to/canonical/doc/ ``` ### v2 equivalent documentation + To display a notice on a 1.x page that links to an equivalent 2.0 page, add the following frontmatter to the 1.x page: @@ -208,6 +319,7 @@ v2: /influxdb/v2.0/get-started/ ``` ### Prepend and append content to a page + Use the `prepend` and `append` frontmatter to add content to the top or bottom of a page. Each has the following fields: @@ -235,6 +347,7 @@ cascade: ``` ### Cascade + To automatically apply frontmatter to a page and all of its children, use the [`cascade` frontmatter](https://gohugo.io/content-management/front-matter/#front-matter-cascade) built in into Hugo. @@ -253,6 +366,7 @@ those frontmatter keys. Frontmatter defined on the page overrides frontmatter ## Shortcodes ### Notes and warnings + Shortcodes are available for formatting notes and warnings in each article: ```md @@ -266,6 +380,7 @@ Insert warning markdown content here. ``` ### Enterprise Content + For sections content that relate specifically to InfluxDB Enterprise, use the `{{% enterprise %}}` shortcode. ```md @@ -275,6 +390,7 @@ Insert enterprise-specific markdown content here. ``` #### Enterprise name + The name used to refer to InfluxData's enterprise offering is subject to change. To facilitate easy updates in the future, use the `enterprise-name` shortcode when referencing the enterprise product. @@ -288,6 +404,7 @@ This is content that references {{< enterprise-name "short" >}}. Product names are stored in `data/products.yml`. #### Enterprise link + References to InfluxDB Enterprise are often accompanied with a link to a page where visitors can get more information about the Enterprise offering. This link is subject to change. @@ -299,6 +416,7 @@ Find more info [here][{{< enterprise-link >}}] ``` ### InfluxDB Cloud Content + For sections of content that relate specifically to InfluxDB Cloud, use the `{{% cloud %}}` shortcode. ```md @@ -308,6 +426,7 @@ Insert cloud-specific markdown content here. ``` #### InfluxDB Cloud name + The name used to refer to InfluxData's cloud offering is subject to change. To facilitate easy updates in the future, use the `cloud-name` short-code when referencing the cloud product. @@ -321,6 +440,7 @@ This is content that references {{< cloud-name "short" >}}. Product names are stored in `data/products.yml`. #### InfluxDB Cloud link + References to InfluxDB Cloud are often accompanied with a link to a page where visitors can get more information. This link is subject to change. @@ -332,6 +452,7 @@ Find more info [here][{{< cloud-link >}}] ``` ### Latest links + Each of the InfluxData projects have different "latest" versions. Use the `{{< latest >}}` shortcode to populate link paths with the latest version for the specified project. @@ -365,6 +486,7 @@ Use the following for project names: ``` ### Latest patch version + Use the `{{< latest-patch >}}` shortcode to add the latest patch version of a product. By default, this shortcode parses the product and minor version from the URL. To specify a specific product and minor version, use the `product` and `version` arguments. @@ -379,6 +501,7 @@ Easier to maintain being you update the version number in the `data/products.yml ``` ### Latest influx CLI version + Use the `{{< latest-cli >}}` shortcode to add the latest version of the `influx` CLI supported by the minor version of InfluxDB. By default, this shortcode parses the minor version from the URL. @@ -392,6 +515,7 @@ Maintain CLI version numbers in the `data/products.yml` file instead of updating ``` ### API endpoint + Use the `{{< api-endpoint >}}` shortcode to generate a code block that contains a colored request method, a specified API endpoint, and an optional link to the API reference documentation. @@ -420,6 +544,7 @@ Provide the following arguments: ``` ### Tabbed Content + To create "tabbed" content (content that is changed by a users' selection), use the following three shortcodes in combination: `{{< tabs-wrapper >}}` @@ -453,6 +578,7 @@ This shortcode must be closed with `{{% /tab-content %}}`. **Note**: The `%` characters used in this shortcode indicate that the contents should be processed as Markdown. #### Example tabbed content group + ```md {{< tabs-wrapper >}} @@ -473,6 +599,7 @@ Markdown content for tab 2. ``` #### Tabbed code blocks + Shortcodes are also available for tabbed code blocks primarily used to give users the option to choose between different languages and syntax. The shortcode structure is the same as above, but the shortcode names are different: @@ -481,7 +608,7 @@ The shortcode structure is the same as above, but the shortcode names are differ `{{% code-tabs %}}` `{{% code-tab-content %}}` -~~~md +````md {{< code-tabs-wrapper >}} {{% code-tabs %}} @@ -490,6 +617,7 @@ The shortcode structure is the same as above, but the shortcode names are differ {{% /code-tabs %}} {{% code-tab-content %}} + ```js data = from(bucket: "example-bucket") |> range(start: -15m) @@ -498,18 +626,21 @@ data = from(bucket: "example-bucket") r._field == "used_percent" ) ``` + {{% /code-tab-content %}} {{% code-tab-content %}} + ```sql SELECT "used_percent" FROM "telegraf"."autogen"."mem" WHERE time > now() - 15m ``` + {{% /code-tab-content %}} {{< /code-tabs-wrapper >}} -~~~ +```` #### Link to tabbed content @@ -522,6 +653,7 @@ For example: ``` ### Required elements + Use the `{{< req >}}` shortcode to identify required elements in documentation with orange text and/or asterisks. By default, the shortcode outputs the text, "Required," but you can customize the text by passing a string argument with the shortcode. @@ -546,8 +678,9 @@ customize the text of the required message. ``` #### Required elements in a list + When identifying required elements in a list, use `{{< req type="key" >}}` to generate -a "* Required" key before the list. For required elements in the list, include +a "\* Required" key before the list. For required elements in the list, include {{< req "\*" >}} before the text of the list item. For example: ```md @@ -559,6 +692,7 @@ a "* Required" key before the list. For required elements in the list, include ``` #### Change color of required text + Use the `color` argument to change the color of required text. The following colors are available: @@ -571,6 +705,7 @@ The following colors are available: ``` ### Page navigation buttons + Use the `{{< page-nav >}}` shortcode to add page navigation buttons to a page. These are useful for guiding users through a set of docs that should be read in sequential order. The shortcode has the following parameters: @@ -587,16 +722,20 @@ document, but you can use `prevText` and `nextText` to override button text. ```md + {{ page-nav prev="/path/to/prev/" next="/path/to/next" >}} + {{ page-nav prev="/path/to/prev/" prevText="Previous" next="/path/to/next" nextText="Next" >}} + {{ page-nav prev="/path/to/prev/" next="/path/to/next" keepTab=true>}} ``` ### Keybinds + Use the `{{< keybind >}}` shortcode to include OS-specific keybindings/hotkeys. The following parameters are available: @@ -608,16 +747,20 @@ The following parameters are available: ```md + {{< keybind mac="⇧⌘P" other="Ctrl+Shift+P" >}} + {{< keybind all="Ctrl+Shift+P" >}} + {{< keybind mac="⇧⌘P" linux="Ctrl+Shift+P" win="Ctrl+Shift+Alt+P" >}} ``` ### Diagrams + Use the `{{< diagram >}}` shortcode to dynamically build diagrams. The shortcode uses [mermaid.js](https://github.com/mermaid-js/mermaid) to convert simple text into SVG diagrams. @@ -626,28 +769,32 @@ For information about the syntax, see the [mermaid.js documentation](https://mer ```md {{< diagram >}} flowchart TB - This --> That - That --> There +This --> That +That --> There {{< /diagram >}} ``` ### File system diagrams + Use the `{{< filesystem-diagram >}}` shortcode to create a styled file system diagram using a Markdown unordered list. ##### Example filesystem diagram shortcode + ```md {{< filesystem-diagram >}} + - Dir1/ - Dir2/ - ChildDir/ - Child - Child - Dir3/ -{{< /filesystem-diagram >}} + {{< /filesystem-diagram >}} ``` ### High-resolution images + In many cases, screenshots included in the docs are taken from high-resolution (retina) screens. Because of this, the actual pixel dimension is 2x larger than it needs to be and is rendered 2x bigger than it should be. The following shortcode automatically sets a fixed width on the image using half of its actual pixel dimension. @@ -659,12 +806,14 @@ cause by browser image resizing. ``` ###### Notes + - This should only be used on screenshots takes from high-resolution screens. - The `src` should be relative to the `static` directory. - Image widths are limited to the width of the article content container and will scale accordingly, even with the `width` explicitly set. ### Truncated content blocks + In some cases, it may be appropriate to shorten or truncate blocks of content. Use cases include long examples of output data or tall images. The following shortcode truncates blocks of content and allows users to opt into @@ -677,6 +826,7 @@ Truncated markdown content here. ``` ### Expandable accordion content blocks + Use the `{{% expand "Item label" %}}` shortcode to create expandable, accordion-style content blocks. Each expandable block needs a label that users can click to expand or collapse the content block. Pass the label as a string to the shortcode. @@ -711,6 +861,7 @@ Markdown content associated with label 2. ``` ### Captions + Use the `{{% caption %}}` shortcode to add captions to images and code blocks. Captions are styled with a smaller font size, italic text, slight transparency, and appear directly under the previous image or code block. @@ -722,6 +873,7 @@ Markdown content for the caption. ``` ### Generate a list of children articles + Section landing pages often contain just a list of articles with links and descriptions for each. This can be cumbersome to maintain as content is added. To automate the listing of articles in a section, use the `{{< children >}}` shortcode. @@ -735,7 +887,9 @@ or only "page" articles (those with no children) using the `show` argument: ```md {{< children show="sections" >}} + + {{< children show="pages" >}} ``` @@ -757,6 +911,7 @@ The following list types are available: - **functions:** a special use-case designed for listing Flux functions. #### Include a "Read more" link + To include a "Read more" link with each child summary, set `readmore=true`. _Only the `articles` list type supports "Read more" links._ @@ -765,6 +920,7 @@ _Only the `articles` list type supports "Read more" links._ ``` #### Include a horizontal rule + To include a horizontal rule after each child summary, set `hr=true`. _Only the `articles` list type supports horizontal rules._ @@ -773,54 +929,63 @@ _Only the `articles` list type supports horizontal rules._ ``` #### Include a code example with a child summary + Use the `list_code_example` frontmatter to provide a code example with an article in an articles list. -~~~yaml +````yaml list_code_example: | ```sh This is a code example ``` -~~~ +```` #### Organize and include native code examples + To include text from a file in `/shared/text/`, use the `{{< get-shared-text >}}` shortcode and provide the relative path and filename. This is useful for maintaining and referencing sample code variants in their - native file formats. +native file formats. 1. Store code examples in their native formats at `/shared/text/`. - ```md - /shared/text/example1/example.js - /shared/text/example1/example.py - ``` + +```md +/shared/text/example1/example.js +/shared/text/example1/example.py +``` 2. Include the files--for example, in code tabs: + ````md - {{% code-tabs-wrapper %}} - {{% code-tabs %}} - [Javascript](#js) - [Python](#py) - {{% /code-tabs %}} - {{% code-tab-content %}} - ```js - {{< get-shared-text "example1/example.js" >}} - ``` - {{% /code-tab-content %}} - {{% code-tab-content %}} - ```py - {{< get-shared-text "example1/example.py" >}} - ``` - {{% /code-tab-content %}} - {{% /code-tabs-wrapper %}} + {{% code-tabs-wrapper %}} + {{% code-tabs %}} + [Javascript](#js) + [Python](#py) + {{% /code-tabs %}} + {{% code-tab-content %}} + + ```js + {{< get-shared-text "example1/example.js" >}} + ``` + + {{% /code-tab-content %}} + {{% code-tab-content %}} + + ```py + {{< get-shared-text "example1/example.py" >}} + ``` + + {{% /code-tab-content %}} + {{% /code-tabs-wrapper %}} ```` #### Include specific files from the same directory + To include the text from one file in another file in the same directory, use the `{{< get-leaf-text >}}` shortcode. The directory that contains both files must be a -Hugo [*Leaf Bundle*](https://gohugo.io/content-management/page-bundles/#leaf-bundles), +Hugo [_Leaf Bundle_](https://gohugo.io/content-management/page-bundles/#leaf-bundles), a directory that doesn't have any child directories. In the following example, `api` is a leaf bundle. `content` isn't. @@ -829,26 +994,30 @@ In the following example, `api` is a leaf bundle. `content` isn't. content | |--- api - | query.pdmc - | query.sh - | _index.md +| query.pdmc +| query.sh +| \_index.md ``` ##### query.pdmc + ```md # Query examples ``` ##### query.sh + ```md curl https://localhost:8086/query ``` To include `query.sh` and `query.pdmc` in `api/_index.md`, use the following code: + ````md {{< get-leaf-text "query.pdmc" >}} # Curl example + ```sh {{< get-leaf-text "query.sh" >}} ``` @@ -858,6 +1027,7 @@ Avoid using the following file extensions when naming included text files since `.ad`, `.adoc`, `.asciidoc`, `.htm`, `.html`, `.markdown`, `.md`, `.mdown`, `.mmark`, `.pandoc`, `.pdc`, `.org`, or `.rst`. #### Reference a query example in children + To include a query example with the children in your list, update `data/query_examples.yml` with the example code, input, and output, and use the `list_query_example` frontmatter to reference the corresponding example. @@ -867,20 +1037,22 @@ list_query_example: cumulative_sum ``` #### Children frontmatter + Each children list `type` uses [frontmatter properties](#page-frontmatter) when generating the list of articles. The following table shows which children types use which frontmatter properties: | Frontmatter | articles | list | functions | -|:----------- |:--------:|:----:|:---------:| -| `list_title` | ✓ | ✓ | ✓ | -| `description` | ✓ | | | -| `external_url` | ✓ | ✓ | | -| `list_image` | ✓ | | | -| `list_note` | | ✓ | | -| `list_code_example` | ✓ | | | -| `list_query_example` | ✓ | | | +| :------------------- | :------: | :--: | :-------: | +| `list_title` | ✓ | ✓ | ✓ | +| `description` | ✓ | | | +| `external_url` | ✓ | ✓ | | +| `list_image` | ✓ | | | +| `list_note` | | ✓ | | +| `list_code_example` | ✓ | | | +| `list_query_example` | ✓ | | | ### Inline icons + The `icon` shortcode allows you to inject icons in paragraph text. It's meant to clarify references to specific elements in the InfluxDB user interface. This shortcode supports Clockface (the UI) v2 and v3. @@ -955,6 +1127,7 @@ Below is a list of available icons (some are aliases): - x ### InfluxDB UI left navigation icons + In many cases, documentation references an item in the left nav of the InfluxDB UI. Provide a visual example of the navigation item using the `nav-icon` shortcode. This shortcode supports Clockface (the UI) v2 and v3. @@ -978,6 +1151,7 @@ The following case insensitive values are supported: - feedback ### Flexbox-formatted content blocks + CSS Flexbox formatting lets you create columns in article content that adjust and flow based on the viewable width. In article content, this helps if you have narrow tables that could be displayed @@ -1010,6 +1184,7 @@ The following options are available: - quarter ### Tooltips + Use the `{{< tooltip >}}` shortcode to add tooltips to text. The **first** argument is the text shown in the tooltip. The **second** argument is the highlighted text that triggers the tooltip. @@ -1022,6 +1197,7 @@ The rendered output is "I like butterflies" with "butterflies" highlighted. When you hover over "butterflies," a tooltip appears with the text: "Butterflies are awesome!" ### Flux sample data tables + The Flux `sample` package provides basic sample datasets that can be used to illustrate how Flux functions work. To quickly display one of the raw sample datasets, use the `{{% flux/sample %}}` shortcode. @@ -1030,6 +1206,7 @@ The `flux/sample` shortcode has the following arguments that can be specified by name or positionally. #### set + Sample dataset to output. Use either `set` argument name or provide the set as the first argument. The following sets are available: @@ -1041,33 +1218,41 @@ as the first argument. The following sets are available: - numericBool #### includeNull + Specify whether or not to include _null_ values in the dataset. Use either `includeNull` argument name or provide the boolean value as the second argument. #### includeRange + Specify whether or not to include time range columns (`_start` and `_stop`) in the dataset. This is only recommended when showing how functions that require a time range (such as `window()`) operate on input data. Use either `includeRange` argument name or provide the boolean value as the third argument. ##### Example Flux sample data shortcodes + ```md + {{% flux/sample %}} + {{% flux/sample set="string" includeNull=false %}} + {{% flux/sample "int" true %}} + {{% flux/sample set="int" includeNull=true includeRange=true %}} {{% flux/sample "int" true true %}} ``` ### Duplicate OSS content in Cloud + Docs for InfluxDB OSS and InfluxDB Cloud share a majority of content. To prevent duplication of content between versions, use the following shortcodes: @@ -1076,12 +1261,14 @@ To prevent duplication of content between versions, use the following shortcodes - `{{% cloud-only %}}` #### duplicate-oss + The `{{< duplicate-oss >}}` shortcode copies the page content of the file located at the identical file path in the most recent InfluxDB OSS version. The Cloud version of this markdown file should contain the frontmatter required for all pages, but the body content should just be the `{{< duplicate-oss >}}` shortcode. #### oss-only + Wrap content that should only appear in the OSS version of the doc with the `{{% oss-only %}}` shortcode. Use the shortcode on both inline and content blocks: @@ -1090,7 +1277,7 @@ Use the shortcode on both inline and content blocks: {{% oss-only %}} -This is a multi-paragraph content block that spans multiple paragraphs and will +This is a multi-paragraph content block that spans multiple paragraphs and will only render in the InfluxDB OSS documentation. **Note:** Notice the blank newline after the opening short-code tag. @@ -1113,7 +1300,7 @@ This is necessary to get the first sentence/paragraph to render correctly. 2. {{% oss-only %}}This is a list item that will only render in InfluxDB OSS docs.{{% /oss-only %}} 3. {{% oss-only %}} - This is a list item that contains multiple paragraphs or nested list items and will only render in the InfluxDB OSS docs. + This is a list item that contains multiple paragraphs or nested list items and will only render in the InfluxDB OSS docs. **Note:** Notice shortcode is _inside_ of the line item. There also must be blank newline after the opening short-code tag. @@ -1123,6 +1310,7 @@ This is necessary to get the first sentence/paragraph to render correctly. ``` #### cloud-only + Wrap content that should only appear in the Cloud version of the doc with the `{{% cloud-only %}}` shortcode. Use the shortcode on both inline and content blocks: @@ -1164,6 +1352,7 @@ This is necessary to get the first sentence/paragraph to render correctly. ``` #### All-Caps + Clockface v3 introduces many buttons with text formatted as all-caps. Use the `{{< caps >}}` shortcode to format text to match those buttons. @@ -1172,20 +1361,24 @@ Click {{< caps >}}Add Data{{< /caps >}} ``` #### Code callouts + Use the `{{< code-callout >}}` shortcode to highlight and emphasize a specific piece of code (for example, a variable, placeholder, or value) in a code block. Provide the string to highlight in the code block. Include a syntax for the codeblock to properly style the called out code. -~~~md +````md {{< code-callout "03a2bbf46249a000" >}} + ```sh http://localhost:8086/orgs/03a2bbf46249a000/... ``` + {{< /code-callout >}} -~~~ +```` #### InfluxDB University banners + Use the `{{< influxdbu >}}` shortcode to add an InfluxDB University banner that points to the InfluxDB University site or a specific course. Use the default banner template, a predefined course template, or fully customize @@ -1199,10 +1392,12 @@ the content of the banner. {{< influxdbu "influxdb-101" >}} -{{< influxdbu title="Course title" summary="Short course summary." action="Take the course" link="https://university.influxdata.com/" >}} +{{< influxdbu title="Course title" summary="Short course summary." action="Take +the course" link="https://university.influxdata.com/" >}} ``` ##### Course templates + Use one of the following course templates: - influxdb-101 @@ -1210,6 +1405,7 @@ Use one of the following course templates: - flux-103 ##### Custom banner content + Use the following shortcode parameters to customize the content of the InfluxDB University banner: @@ -1219,6 +1415,7 @@ University banner: - **link**: URL the button links to ### Reference content + The InfluxDB documentation is "task-based," meaning content primarily focuses on what a user is **doing**, not what they are **using**. However, there is a need to document tools and other things that don't necessarily @@ -1242,6 +1439,7 @@ menu: ``` ## InfluxDB URLs + When a user selects an InfluxDB product and region, example URLs in code blocks throughout the documentation are updated to match their product and region. InfluxDB URLs are configured in `/data/influxdb_urls.yml`. @@ -1251,7 +1449,7 @@ Use this URL in all code examples that should be updated with a selected provide For example: -~~~ +```` ```sh # This URL will get updated http://localhost:8086 @@ -1259,37 +1457,40 @@ http://localhost:8086 # This URL will NOT get updated http://example.com ``` -~~~ +```` If the user selects the **US West (Oregon)** region, all occurrences of `http://localhost:8086` in code blocks will get updated to `https://us-west-2-1.aws.cloud2.influxdata.com`. ### Exempt URLs from getting updated + To exempt a code block from being updated, include the `{{< keep-url >}}` shortcode just before the code block. -~~~ +```` {{< keep-url >}} ``` // This URL won't get updated http://localhost:8086 ``` -~~~ +```` ### Code examples only supported in InfluxDB Cloud + Some functionality is only supported in InfluxDB Cloud and code examples should only use InfluxDB Cloud URLs. In these cases, use `https://cloud2.influxdata.com` as the placeholder in the code block. It will get updated on page load and when users select a Cloud region in the URL select modal. -~~~ +```` ```sh # This URL will get updated https://cloud2.influxdata.com ``` -~~~ +```` ### Automatically populate InfluxDB host placeholder + The InfluxDB host placeholder that gets replaced by custom domains differs between each InfluxDB product/version. Use the `influxdb/host` shortcode to automatically render the correct @@ -1313,6 +1514,7 @@ Supported argument values: ``` ## New Versions of InfluxDB + Version bumps occur regularly in the documentation. Each minor version has its own directory with unique content. Patch versions within a minor version are updated in place. @@ -1321,17 +1523,20 @@ To add a new minor version, go through the steps below. _This example assumes v2.0 is the most recent version and v2.1 is the new version._ 1. Ensure your `master` branch is up to date: + ```sh git checkout master git pull ``` 2. Create a new branch for the new minor version: + ```sh git checkout -b influxdb-2.1 ``` 3. Duplicate the most recent version's content directory: + ```sh # From the root of the project cp content/influxdb/v2.0 content/influxdb/v2.1 @@ -1355,6 +1560,7 @@ _This example assumes v2.0 is the most recent version and v2.1 is the new versio ``` 6. Update the `latest_version` in `data/products.yml`: + ```yaml latest_version: v2.1 ``` @@ -1370,6 +1576,7 @@ Once the necessary changes are in place and the new version is released, merge the new branch into `master`. ## InfluxDB API documentation + InfluxData uses [Redoc](https://github.com/Redocly/redoc) to generate the full InfluxDB API documentation when documentation is deployed. Redoc generates HTML documentation using the InfluxDB `swagger.yml`. diff --git a/Dockerfile.pytest b/Dockerfile.pytest new file mode 100644 index 000000000..1eeb122c1 --- /dev/null +++ b/Dockerfile.pytest @@ -0,0 +1,54 @@ +FROM golang:latest + +RUN apt-get update && apt-get upgrade -y && apt-get install -y \ + curl \ + git \ + gpg \ + jq \ + maven \ + nodejs \ + npm \ + python3 \ + python3-pip \ + python3-venv \ + wget + +RUN ln -s /usr/bin/python3 /usr/bin/python + +# Create a virtual environment for Python to avoid conflicts with the system Python and having to use the --break-system-packages flag when installing packages with pip. +RUN python -m venv /opt/venv +# Enable venv +ENV PATH="/opt/venv/bin:$PATH" +# Prevents Python from writing pyc files. +ENV PYTHONDONTWRITEBYTECODE=1 +# the application crashes without emitting any logs due to buffering. +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +# Some Python test dependencies (pytest-dotenv and pytest-codeblocks) aren't +# available as packages in apt-cache, so use pip to download dependencies in a # separate step and use Docker's caching. +COPY ./test/src/pytest.ini pytest.ini +COPY ./test/src/requirements.txt requirements.txt +RUN pip install -Ur requirements.txt + + # Activate the Python virtual environment configured in the Dockerfile. +RUN . /opt/venv/bin/activate + +### Install InfluxDB clients for testing +# Install InfluxDB keys to verify client installs. +# Follow the install instructions (https://docs.influxdata.com/telegraf/v1/install/?t=curl), except for sudo (which isn't available in Docker). +# influxdata-archive_compat.key GPG fingerprint: +# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E +ADD https://repos.influxdata.com/influxdata-archive_compat.key ./influxdata-archive_compat.key +RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null + +RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list + +# Install InfluxDB clients to use in tests. +RUN apt-get update && apt-get -y install telegraf influxdb2-cli influxctl +COPY --chmod=755 ./test/config.toml /root/.config/influxctl/config.toml +### End InfluxDB client installs + +ENTRYPOINT [ "pytest" ] +CMD [ "" ] \ No newline at end of file diff --git a/Dockerfile.tests b/Dockerfile.tests new file mode 100644 index 000000000..b1bc12e4f --- /dev/null +++ b/Dockerfile.tests @@ -0,0 +1,18 @@ +# Use the Dockerfile 1.2 syntax to leverage BuildKit features like cache mounts and inline mounts--temporary mounts that are only available during the build step, not at runtime. +# syntax=docker/dockerfile:1.2 + +# Starting from a Go base image is easier than setting up the Go environment later. +FROM python:3.9-slim + +# Install the necessary packages for the test environment. +RUN apt-get update && apt-get upgrade -y && apt-get install -y \ + rsync + +COPY --chmod=755 ./test/src/parse_yaml.sh /usr/local/bin/parse_yaml +COPY --chmod=755 ./test/src/prepare-content.sh /usr/local/bin/prepare-content +COPY ./data/products.yml /app/appdata/products.yml + +WORKDIR /src +ENTRYPOINT [ "prepare-content" ] +# The default command is an empty string to pass all command line arguments to the entrypoint and allow the entrypoint to run. +CMD [ "" ] \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 11d58ffc3..d0edb5c4d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,27 +1,39 @@ # This is a Docker Compose file for the InfluxData documentation site. ## Run documentation tests for code samples. +name: influxdata-docs +volumes: + test-content: services: - test: - image: docs-v2-tests - container_name: docs-v2-tests + markdownlint: + image: davidanson/markdownlint-cli2:v0.13.0 + container_name: markdownlint profiles: - - test + - ci + - lint volumes: - - type: bind - source: ./test - target: /usr/src/app/test - - type: bind - source: ./data - target: /usr/src/app/test/data - - type: bind - source: ./static/downloads - target: /usr/src/app/test/tmp/data + - type: bind + source: . + target: /workdir + working_dir: /workdir build: context: . - dockerfile: test.Dockerfile - args: - - SOURCE_DIR=test - - DOCKER_IMAGE=docs-v2-tests + vale: + image: jdkato/vale:latest + container_name: vale + profiles: + - ci + - lint + volumes: + - type: bind + source: . + target: /workdir + working_dir: /workdir + entrypoint: ["/bin/vale"] + build: + context: . + dockerfile_inline: | + COPY .ci /src/.ci + COPY **/.vale.ini /src/ ## Run InfluxData documentation with the hugo development server on port 1313. ## For more information about the hugomods/hugo image, see ## https://docker.hugomods.com/docs/development/docker-compose/ diff --git a/content/influxdb/cloud-dedicated/get-started/_index.md b/content/influxdb/cloud-dedicated/get-started/_index.md index 85bdb8a57..e0ab6569c 100644 --- a/content/influxdb/cloud-dedicated/get-started/_index.md +++ b/content/influxdb/cloud-dedicated/get-started/_index.md @@ -10,16 +10,16 @@ weight: 3 influxdb/cloud-dedicated/tags: [get-started] --- -{{% product-name %}} is the platform purpose-built to collect, store, and -query time series data. -It is powered by the InfluxDB 3.0 storage engine which provides a number of -benefits including nearly unlimited series cardinality, improved query performance, -and interoperability with widely used data processing tools and platforms. +InfluxDB is the platform purpose-built to collect, store, and query +time series data. +{{% product-name %}} is powered by the InfluxDB 3.0 storage engine, that +provides nearly unlimited series cardinality, +improved query performance, and interoperability with widely used data +processing tools and platforms. -**Time series data** is a sequence of data points indexed in time order. -Data points typically consist of successive measurements made from the same -source and are used to track changes over time. -Examples of time series data include: +**Time series data** is a sequence of data points indexed in time order. Data +points typically consist of successive measurements made from the same source +and are used to track changes over time. Examples of time series data include: - Industrial sensor data - Server performance metrics @@ -28,14 +28,14 @@ Examples of time series data include: - Rainfall measurements - Stock prices -This multi-part tutorial walks you through writing time series data to {{% product-name %}}, -querying, and then visualizing that data. +This multi-part tutorial walks you through writing time series data to +{{% product-name %}}, querying, and then visualizing that data. ## Key concepts before you get started -Before you get started using InfluxDB, it's important to understand how time series -data is organized and stored in InfluxDB and some key definitions that are used -throughout this documentation. +Before you get started using InfluxDB, it's important to understand how time +series data is organized and stored in InfluxDB and some key definitions that +are used throughout this documentation. - [Data organization](#data-organization) - [Schema on write](#schema-on-write) @@ -44,43 +44,53 @@ throughout this documentation. ### Data organization The {{% product-name %}} data model organizes time series data into databases -and measurements. +and tables. -A database can contain multiple measurements. -Measurements contain multiple tags and fields. +A database can contain multiple tables. +Tables contain multiple tags and fields. -- **Database**: Named location where time series data is stored. - A database can contain multiple _measurements_. - - **Measurement**: Logical grouping for time series data. - All _points_ in a given measurement should have the same _tags_. - A measurement contains multiple _tags_ and _fields_. - - **Tags**: Key-value pairs that provide metadata for each point--for example, - something to identify the source or context of the data like host, - location, station, etc. - Tag values may be null. - - **Fields**: Key-value pairs with values that change over time--for example, - temperature, pressure, stock price, etc. - Field values may be null, but at least one field value is not null on any given row. - - **Timestamp**: Timestamp associated with the data. - When stored on disk and queried, all data is ordered by time. - A timestamp is never null. +- **Database**: A named location where time series data is stored in _tables_. + _Database_ is synonymous with _bucket_ in InfluxDB Cloud Serverless and InfluxDB TSM. + - **Table**: A logical grouping for time series data. All _points_ in a given + table should have the same _tags_. A table contains _tags_ and + _fields_. _Table_ is synonymous with _measurement_ in InfluxDB Cloud + Serverless and InfluxDB TSM. + - **Tags**: Key-value pairs that provide metadata for each point--for + example, something to identify the source or context of the data like + host, location, station, etc. Tag values may be null. + - **Fields**: Key-value pairs with values that change over time--for + example, temperature, pressure, stock price, etc. Field values may be + null, but at least one field value is not null on any given row. + - **Timestamp**: Timestamp associated with the data. When stored on disk and + queried, all data is ordered by time. A timestamp is never null. + +{{% note %}} + +#### What about buckets and measurements? + +If coming from InfluxDB Cloud Serverless or InfluxDB powered by the TSM storage +engine, you're likely familiar with the concepts _bucket_ and _measurement_. +_Bucket_ in TSM or InfluxDB Cloud Serverless is synonymous with _database_ in +{{% product-name %}}. _Measurement_ in TSM or InfluxDB Cloud Serverless is +synonymous with _table_ in {{% product-name %}}. +{{% /note %}} ### Schema on write -When using InfluxDB, you define your schema as you write your data. -You don't need to create measurements (equivalent to a relational table) or -explicitly define the schema of the measurement. -Measurement schemas are defined by the schema of data as it is written to the measurement. +As you write data to InfluxDB, the data defines the table schema. You don't need +to create tables or explicitly define the table schema. ### Important definitions The following definitions are important to understand when using InfluxDB: -- **Point**: Single data record identified by its _measurement, tag keys, tag values, field key, and timestamp_. -- **Series**: A group of points with the same _measurement, tag keys and values, and field key_. -- **Primary key**: Columns used to uniquely identify each row in a table. - Rows are uniquely identified by their _timestamp and tag set_. - A row's primary key _tag set_ does not include tags with null values. +- **Point**: Single data record identified by its _measurement, tag keys, tag + values, field key, and timestamp_. +- **Series**: A group of points with the same _measurement, tag keys and values, + and field key_. +- **Primary key**: Columns used to uniquely identify each row in a table. Rows + are uniquely identified by their _timestamp and tag set_. A row's primary key + _tag set_ does not include tags with null values. ##### Example InfluxDB query results @@ -88,8 +98,8 @@ The following definitions are important to understand when using InfluxDB: ## Tools to use -The following table compares tools that you can use to interact with {{% product-name %}}. -This tutorial covers many of the recommended tools. +The following table compares tools that you can use to interact with +{{% product-name %}}. This tutorial covers many of the recommended tools. | Tool | Administration | Write | Query | | :-------------------------------------------------------------------------------------------------- | :----------------------: | :----------------------: | :----------------------: | @@ -114,39 +124,52 @@ This tutorial covers many of the recommended tools. {{< /caption >}} {{% warn %}} -Avoid using the `influx` CLI with {{% product-name %}}. -While it may coincidentally work, it isn't supported. +Avoid using the `influx` CLI with {{% product-name %}}. While it +may coincidentally work, it isn't supported. {{% /warn %}} ### `influxctl` CLI -The [`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/) +The +[`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/) writes, queries, and performs administrative tasks, such as managing databases and authorization tokens in a cluster. ### `influx3` data CLI -The [`influx3` data CLI](/influxdb/cloud-dedicated/get-started/query/?t=influx3+CLI#execute-an-sql-query) is a community-maintained tool that lets you write and query data in {{% product-name %}} from a command line. -It uses the HTTP API to write data and uses Flight gRPC to query data. +The +[`influx3` data CLI](/influxdb/cloud-dedicated/get-started/query/?t=influx3+CLI#execute-an-sql-query) +is a community-maintained tool that lets you write and query data in +{{% product-name %}} from a command line. It uses the HTTP API to write data and +uses Flight gRPC to query data. ### InfluxDB HTTP API -The [InfluxDB HTTP API](/influxdb/v2/reference/api/) provides a simple way to let you manage {{% product-name %}} and write and query data using HTTP(S) clients. -Examples in this tutorial use cURL, but any HTTP(S) client will work. +The [InfluxDB HTTP API](/influxdb/v2/reference/api/) provides a simple way to +let you manage {{% product-name %}} and write and query data using HTTP(S) +clients. Examples in this tutorial use cURL, but any HTTP(S) client will work. -The `/write` and `/query` v1-compatible endpoints work with the username/password authentication schemes and existing InfluxDB 1.x tools and code. -The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB 2.x tools and code. +The `/write` and `/query` v1-compatible endpoints work with the +username/password authentication schemes and existing InfluxDB 1.x tools and +code. The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB +2.x tools and code. ### InfluxDB client libraries -InfluxDB client libraries are community-maintained, language-specific clients that interact with InfluxDB APIs. +InfluxDB client libraries are community-maintained, language-specific clients +that interact with InfluxDB APIs. -[InfluxDB v3 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v3/) are the recommended client libraries for writing and querying data {{% product-name %}}. -They use the HTTP API to write data and use Flight gRPC to query data. +[InfluxDB v3 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v3/) +are the recommended client libraries for writing and querying data +{{% product-name %}}. They use the HTTP API to write data and use InfluxDB's +Flight gRPC API to query data. -[InfluxDB v2 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v2/) can use `/api/v2` HTTP endpoints to manage resources such as buckets and API tokens, and write data in {{% product-name %}}. +[InfluxDB v2 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v2/) +can use `/api/v2` HTTP endpoints to manage resources such as buckets and API +tokens, and write data in {{% product-name %}}. -[InfluxDB v1 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v1/) can write data to {{% product-name %}}. +[InfluxDB v1 client libraries](/influxdb/cloud-dedicated/reference/client-libraries/v1/) +can write data to {{% product-name %}}. ## Authorization @@ -158,13 +181,14 @@ There are two types of tokens: - **Database token**: A token that grants read and write access to InfluxDB databases. - **Management token**: A short-lived (1 hour) [Auth0 token](#) used to - administer your InfluxDB cluster. - These are generated by the `influxctl` CLI and do not require any direct management. - Management tokens authorize a user to perform tasks related to: - + administer your InfluxDB cluster. These are generated by the `influxctl` CLI + and do not require any direct management. Management tokens authorize a user + to perform tasks related to: + - Account management - Database management - Database token management - Pricing -{{< page-nav next="/influxdb/cloud-dedicated/get-started/setup/" >}} + +{{< page-nav next="/influxdb/clustered/get-started/setup/" >}} diff --git a/content/influxdb/cloud-dedicated/get-started/write.md b/content/influxdb/cloud-dedicated/get-started/write.md index e5302d825..acda50b2e 100644 --- a/content/influxdb/cloud-dedicated/get-started/write.md +++ b/content/influxdb/cloud-dedicated/get-started/write.md @@ -3,8 +3,8 @@ title: Get started writing data seotitle: Write data | Get started with InfluxDB Cloud Dedicated list_title: Write data description: > - Get started writing data to InfluxDB by learning about line protocol - and using tools like Telegraf, client libraries, and the InfluxDB API. + Get started writing data to InfluxDB by learning about line protocol and using + tools like Telegraf, client libraries, and the InfluxDB API. menu: influxdb_cloud_dedicated: name: Write data @@ -21,9 +21,11 @@ related: - /telegraf/v1/ --- -This tutorial walks you through the fundamental of creating **line protocol** data and writing it to InfluxDB. +This tutorial walks you through the fundamental of creating **line protocol** +data and writing it to InfluxDB. -InfluxDB provides many different options for ingesting or writing data, including the following: +InfluxDB provides many different options for ingesting or writing data, +including the following: - InfluxDB HTTP API (v1 and v2) - Telegraf @@ -31,15 +33,16 @@ InfluxDB provides many different options for ingesting or writing data, includin - `influx3` data CLI - InfluxDB client libraries -If using tools like Telegraf or InfluxDB client libraries, they can -build the line protocol for you, but it's good to understand how line protocol works. +If using tools like Telegraf or InfluxDB client libraries, they can build the +line protocol for you, but it's good to understand how line protocol works. ## Line protocol All data written to InfluxDB is written using **line protocol**, a text-based -format that lets you provide the necessary information to write a data point to InfluxDB. -_This tutorial covers the basics of line protocol, but for detailed information, -see the [Line protocol reference](/influxdb/cloud-dedicated/reference/syntax/line-protocol/)._ +format that lets you provide the necessary information to write a data point to +InfluxDB. _This tutorial covers the basics of line protocol, but for detailed +information, see the +[Line protocol reference](/influxdb/cloud-dedicated/reference/syntax/line-protocol/)._ ### Line protocol elements @@ -47,30 +50,42 @@ Each line of line protocol contains the following elements: {{< req type="key" >}} -- {{< req "\*" >}} **measurement**: String that identifies the - [measurement](/influxdb/cloud-dedicated/reference/glossary/#measurement) to store the data in. +- {{< req "\*" >}} **measurement**: A string that identifies the + [table](/influxdb/cloud-dedicated/reference/glossary/#table) to store the data + in. - **tag set**: Comma-delimited list of key value pairs, each representing a tag. - Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._ -- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field. - Field keys are unquoted strings. _Spaces and commas must be escaped._ - Field values can be [strings](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#string) (quoted), + Tag keys and values are unquoted strings. _Spaces, commas, and equal + characters must be escaped._ +- {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each + representing a field. Field keys are unquoted strings. _Spaces and commas must + be escaped._ Field values can be + [strings](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#string) + (quoted), [floats](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#float), [integers](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#integer), [unsigned integers](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#uinteger), - or [booleans](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#boolean). -- **timestamp**: [Unix timestamp](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#unix-timestamp) - associated with the data. InfluxDB supports up to nanosecond precision. - _If the precision of the timestamp is not in nanoseconds, you must specify the + or + [booleans](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#boolean). +- **timestamp**: + [Unix timestamp](/influxdb/cloud-dedicated/reference/syntax/line-protocol/#unix-timestamp) + associated with the data. InfluxDB supports up to nanosecond precision. _If + the precision of the timestamp is not in nanoseconds, you must specify the precision when writing the data to InfluxDB._ #### Line protocol element parsing -- **measurement**: Everything before the _first unescaped comma before the first whitespace_. -- **tag set**: Key-value pairs between the _first unescaped comma_ and the _first unescaped whitespace_. -- **field set**: Key-value pairs between the _first and second unescaped whitespaces_. + + +- **measurement**: Everything before the _first unescaped comma before the first + whitespace_. +- **tag set**: Key-value pairs between the _first unescaped comma_ and the + _first unescaped whitespace_. +- **field set**: Key-value pairs between the _first and second unescaped + whitespaces_. - **timestamp**: Integer value after the _second unescaped whitespace_. -- Lines are separated by the newline character (`\n`). - Line protocol is whitespace sensitive. +- Lines are separated by the newline character (`\n`). Line protocol is +whitespace sensitive. + --- @@ -78,17 +93,19 @@ Each line of line protocol contains the following elements: --- -_For schema design recommendations, see [InfluxDB schema design](/influxdb/cloud-dedicated/write-data/best-practices/schema-design/)._ +_For schema design recommendations, see +[InfluxDB schema design](/influxdb/cloud-dedicated/write-data/best-practices/schema-design/)._ ## Construct line protocol With a basic understanding of line protocol, you can now construct line protocol -and write data to InfluxDB. -Consider a use case where you collect data from sensors in your home. -Each sensor collects temperature, humidity, and carbon monoxide readings. -To collect this data, use the following schema: +and write data to InfluxDB. Consider a use case where you collect data from +sensors in your home. Each sensor collects temperature, humidity, and carbon +monoxide readings. To collect this data, use the following schema: -- **measurement**: `home` + + +- **measurement**: `home` - **tags** - `room`: Living Room or Kitchen - **fields** @@ -96,10 +113,12 @@ To collect this data, use the following schema: - `hum`: percent humidity (float) - `co`: carbon monoxide in parts per million (integer) - **timestamp**: Unix timestamp in _second_ precision + -Data is collected hourly beginning at -{{% influxdb/custom-timestamps-span %}}**2022-01-01T08:00:00Z (UTC)** until **2022-01-01T20:00:00Z (UTC)**{{% /influxdb/custom-timestamps-span %}}. -The resulting line protocol would look something like the following: +Data is collected hourly beginning at +{{% influxdb/custom-timestamps-span %}}**2022-01-01T08:00:00Z (UTC)** until +**2022-01-01T20:00:00Z (UTC)**{{% /influxdb/custom-timestamps-span %}}. The +resulting line protocol would look something like the following: {{% influxdb/custom-timestamps %}} @@ -138,19 +157,20 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 ## Write line protocol to InfluxDB -The following examples show how to write the +The following examples show how to write the [sample data](#home-sensor-data-line-protocol), already in line protocol format, to an {{% product-name %}} database. -To learn more about available tools and options, see [Write data](/influxdb/cloud-dedicated/write-data/). +To learn more about available tools and options, see +[Write data](/influxdb/cloud-dedicated/write-data/). -{{% note %}} -Some examples in this getting started tutorial assume your InfluxDB +{{% note %}} Some examples in this getting started tutorial assume your InfluxDB credentials (**URL**, **organization**, and **token**) are provided by [environment variables](/influxdb/cloud-dedicated/get-started/setup/?t=InfluxDB+API#configure-authentication-credentials). {{% /note %}} {{< tabs-wrapper >}} + {{% tabs %}} [influxctl CLI](#) [Telegraf](#) @@ -162,22 +182,26 @@ credentials (**URL**, **organization**, and **token**) are provided by [C#](#) [Java](#) {{% /tabs %}} + {{% tab-content %}} + -Use the [`influxctl write` command](/influxdb/cloud-dedicated/reference/cli/influxctl/write/) +Use the +[`influxctl write` command](/influxdb/cloud-dedicated/reference/cli/influxctl/write/) to write the [home sensor sample data](#home-sensor-data-line-protocol) to your -{{< product-name omit=" Clustered" >}} cluster. -Provide the following: +{{< product-name omit=" Clustered" >}} cluster. Provide the following: - Database name using the `--database` flag -- Database token using the `--token` flag (use the `INFLUX_TOKEN` environment variable created in +- Database token using the `--token` flag (use the `INFLUX_TOKEN` environment + variable created in [Get started--Set up {{< product-name >}}](/influxdb/cloud-dedicated/get-started/setup/#configure-authentication-credentials)) - Timestamp precision as seconds (`s`) using the `--precision` flag - [Home sensor data line protocol](#home-sensor-data-line-protocol) {{% influxdb/custom-timestamps %}} {{% code-placeholders "get-started" %}} + ```sh influxctl write \ --database get-started \ @@ -213,18 +237,24 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200' {{% /code-placeholders %}} {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -Use [Telegraf](/telegraf/v1/) to consume line protocol, -and then write it to {{< product-name >}}. +Use [Telegraf](/telegraf/v1/) to consume line protocol, and then write it to +{{< product-name >}}. -1. If you haven't already, follow the instructions to [download and install Telegraf](/telegraf/v1/install/). +1. If you haven't already, follow the instructions to + [download and install Telegraf](/telegraf/v1/install/). -2. Copy and save the [home sensor data sample](#home-sensor-data-line-protocol) to a file on your local system--for example, `home.lp`. +2. Copy and save the [home sensor data sample](#home-sensor-data-line-protocol) + to a file on your local system--for example, `home.lp`. ```sh cat <<- EOF > home.lp @@ -257,7 +287,9 @@ and then write it to {{< product-name >}}. EOF ``` -3. Run the following command to generate a Telegraf configuration file (`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2` plugins: +3. Run the following command to generate a Telegraf configuration file + (`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2` + plugins: ```sh telegraf --sample-config \ @@ -268,8 +300,9 @@ and then write it to {{< product-name >}}. 4. In your editor, open `./telegraf.conf` and configure the following: - - **`file` input plugin**: In the `[[inputs.file]].files` list, replace `"/tmp/metrics.out"` with your sample data filename. - If Telegraf can't find a file when started, it stops processing and exits. + - **`file` input plugin**: In the `[[inputs.file]].files` list, replace + `"/tmp/metrics.out"` with your sample data filename. If Telegraf can't + find a file when started, it stops processing and exits. ```toml [[inputs.file]] @@ -281,13 +314,13 @@ and then write it to {{< product-name >}}. - - **`output-influxdb_v2` output plugin**: In the `[[outputs.influxdb_v2]]` section, replace the default values with the following configuration for your {{% product-name %}} database: + - **`output-influxdb_v2` output plugin**: In the `[[outputs.influxdb_v2]]` + section, replace the default values with the following configuration for + your {{% product-name %}} database: ```toml [[outputs.influxdb_v2]] @@ -307,23 +340,20 @@ and then write it to {{< product-name >}}. The example configuration uses the following InfluxDB credentials: - - **`urls`**: an array containing your **`INFLUX_HOST`** environment variable + - **`urls`**: an array containing your **`INFLUX_HOST`** environment + variable - **`token`**: your **`INFLUX_TOKEN`** environment variable - **`organization`**: an empty string (InfluxDB ignores this parameter) - **`bucket`**: the name of the database to write to @@ -331,7 +361,8 @@ and then write it to {{< product-name >}}. 5. To write the data, start the `telegraf` daemon with the following options: - `--config`: Specifies the path of the configuration file. - - `--once`: Runs a single Telegraf collection cycle for the configured inputs and outputs, and then exits. + - `--once`: Runs a single Telegraf collection cycle for the configured + inputs and outputs, and then exits. Enter the following command in your terminal: @@ -347,28 +378,40 @@ and then write it to {{< product-name >}}. 2023-05-31T20:09:19Z D! [outputs.influxdb_v2] Buffer fullness: 0 / 10000 metrics ``` -Telegraf and its plugins provide many options for reading and writing data. -To learn more, see how to [use Telegraf to write data](/influxdb/cloud-dedicated/write-data/use-telegraf/). +Telegraf and its plugins provide many options for reading and writing data. To +learn more, see how to +[use Telegraf to write data](/influxdb/cloud-dedicated/write-data/use-telegraf/). {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -Write data with your existing workloads that already use the InfluxDB v1 `/write` API endpoint. +Write data with your existing workloads that already use the InfluxDB v1 +`/write` API endpoint. {{% note %}} -If migrating data from InfluxDB 1.x, see the [Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/cloud-dedicated/guides/migrate-data/migrate-1x-to-cloud-dedicated/) guide. +If migrating data from InfluxDB 1.x, see the +[Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/cloud-dedicated/guides/migrate-data/migrate-1x-to-cloud-dedicated/) +guide. {{% /note %}} -To write data to InfluxDB using the [InfluxDB v1 HTTP API](/influxdb/cloud-dedicated/reference/api/), send a -request to the [InfluxDB API `/write` endpoint](/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite) using the `POST` request method. +To write data to InfluxDB using the +[InfluxDB v1 HTTP API](/influxdb/cloud-dedicated/reference/api/), send a request +to the +[InfluxDB API `/write` endpoint](/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite) +using the `POST` request method. -{{% api-endpoint endpoint="https://{{< influxdb/host >}}/write" method="post" api-ref="/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite"%}} +{{% api-endpoint endpoint="https://{{< influxdb/host >}}/write" method="post" +api-ref="/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite"%}} Include the following with your request: @@ -378,12 +421,17 @@ Include the following with your request: - **Accept**: application/json - **Query parameters**: - **db**: InfluxDB database name - - **precision**:[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) (default is `ns`) + - **precision**:[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + (default is `ns`) - **Request body**: Line protocol as plain text {{% note %}} -With the {{% product-name %}} [v1 API `/write` endpoint](/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite), `Authorization: Bearer` and `Authorization: Token` are equivalent and you can use either scheme to pass a database token in your request. -For more information about HTTP API token schemes, see how to [authenticate API requests](/influxdb/cloud-dedicated/guides/api-compatibility/v1/). +With the {{% product-name %}} +[v1 API `/write` endpoint](/influxdb/cloud-dedicated/api/#operation/PostLegacyWrite), +`Authorization: Bearer` and `Authorization: Token` are equivalent and you can +use either scheme to pass a database token in your request. For more information +about HTTP API token schemes, see how to +[authenticate API requests](/influxdb/cloud-dedicated/guides/api-compatibility/v1/). {{% /note %}} The following example uses cURL and the InfluxDB v1 API to write line protocol @@ -392,7 +440,7 @@ to InfluxDB: {{% code-placeholders "DATABASE_TOKEN" %}} ```sh -curl --silent -w "%{response_code}: %{errormsg}\n" \ +response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \ "https://{{< influxdb/host >}}/write?db=get-started&precision=s" \ --header "Authorization: Bearer DATABASE_TOKEN" \ --header "Content-type: text/plain; charset=utf-8" \ @@ -424,7 +472,19 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600 home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600 home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200 home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 -" +") + +# Format the response code and error message output. +response_code=${response%%:*} +errormsg=${response#*:} + +# Remove leading and trailing whitespace from errormsg +errormsg=$(echo "${errormsg}" | tr -d '[:space:]') + +echo "$response_code" +if [[ $errormsg ]]; then + echo "$errormsg" +fi ``` {{% /code-placeholders %}} @@ -432,51 +492,66 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 Replace the following: - {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: - a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-token) - with sufficient permissions to the specified database + a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-token) with + sufficient permissions to the specified database If successful, the output is an HTTP `204 No Content` status code. ``` -204: +204 ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -To write data to InfluxDB using the [InfluxDB v2 HTTP API](/influxdb/cloud-dedicated/reference/api/), send a -request to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method. +To write data to InfluxDB using the +[InfluxDB v2 HTTP API](/influxdb/cloud-dedicated/reference/api/), send a request +to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method. -{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write" method="post" api-ref="/influxdb/cloud-dedicated/api/#operation/PostWrite" >}} +{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write" +method="post" api-ref="/influxdb/cloud-dedicated/api/#operation/PostWrite" >}} Include the following with your request: + + - **Headers**: - **Authorization**: Bearer - **Content-Type**: text/plain; charset=utf-8 - **Accept**: application/json - **Query parameters**: - **bucket**: InfluxDB database name - - **precision**:[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) (default is `ns`) + - **precision**:[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + (default is `ns`) - **Request body**: Line protocol as plain text + {{% note %}} -The {{% product-name %}} v2 API `/api/v2/write` endpoint supports `Bearer` and `Token` authorization schemes and you can use either scheme to pass a database token in your request. -For more information about HTTP API token schemes, see how to [authenticate API requests](/influxdb/cloud-dedicated/guides/api-compatibility/v2/). +The {{% product-name %}} v2 API `/api/v2/write` endpoint supports +`Bearer` and `Token` authorization schemes and you can use either scheme to pass +a database token in your request. +For more information about HTTP API token +schemes, see how to +[authenticate API requests](/influxdb/cloud-dedicated/guides/api-compatibility/v2/). {{% /note %}} The following example uses cURL and the InfluxDB v2 API to write line protocol to InfluxDB: {{% code-placeholders "DATABASE_TOKEN"%}} + ```sh -curl --silent -w "%{response_code}: %{errormsg}\n" \ +response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \ "https://{{< influxdb/host >}}/api/v2/write?bucket=get-started&precision=s" \ --header "Authorization: Bearer DATABASE_TOKEN" \ --header "Content-Type: text/plain; charset=utf-8" \ @@ -508,30 +583,46 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600 home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600 home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200 home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 -" +") + +# Format the response code and error message output. +response_code=${response%%:*} +errormsg=${response#*:} + +# Remove leading and trailing whitespace from errormsg +errormsg=$(echo "${errormsg}" | tr -d '[:space:]') + +echo "$response_code" +if [[ $errormsg ]]; then + echo "$errormsg" +fi ``` {{% /code-placeholders %}} Replace the following: -- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: - a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with sufficient permissions to the specified database +- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) with + sufficient permissions to the specified database If successful, the output is an HTTP `204 No Content` status code. ``` -204: +204 ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} To write data to {{% product-name %}} using Python, use the @@ -541,141 +632,156 @@ dependencies to your current project. 1. Create a module directory and navigate into it--for example: - + - ```bash - mkdir -p influxdb_py_client && cd influxdb_py_client - ``` + ```bash + mkdir -p influxdb_py_client && cd influxdb_py_client + ``` -2. Setup your Python virtual environment. - Inside of your module directory: +2. Setup your Python virtual environment. + Inside of your module directory: - + - ```bash - python -m venv envs/virtual-env - ``` + ```bash + python -m venv envs/virtual-env + ``` 3. Activate the virtual environment. - + - ```bash - source ./envs/virtual-env/bin/activate - ``` + ```bash + source ./envs/virtual-env/bin/activate + ``` -4. Install the client library package: +4. Install the client library package: - + - ```bash - pip install influxdb3-python - ``` + ```bash + pip install influxdb3-python + ``` - The `influxdb3-python` package provides the `influxdb_client_3` module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data returned from queries. + The `influxdb3-python` package provides the `influxdb_client_3` module and + also installs the + [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for + working with Arrow data returned from queries. -5. In your terminal or editor, create a new file for your code--for example: `write.py`. +5. In your terminal or editor, create a new file for your code--for example: + `write.py`. - + - ```bash - touch write.py - ``` + ```bash + touch write.py + ``` -6. Inside of `write.py`, enter the following sample code: +6. Inside of `write.py`, enter the following sample code: - ```py - from influxdb_client_3 import InfluxDBClient3 - import os + ```py + from influxdb_client_3 import InfluxDBClient3 + import os - # INFLUX_TOKEN is an environment variable you assigned to your - # database WRITE token value. - token = os.getenv('INFLUX_TOKEN') + # INFLUX_TOKEN is an environment variable you assigned to your + # database WRITE token value. + token = os.getenv('INFLUX_TOKEN') - # host is the URL without protocol or trailing slash - client = InfluxDBClient3( - host='{{< influxdb/host >}}', - org='', - token=token, - database='get-started' - ) + # host is the URL without protocol or trailing slash + client = InfluxDBClient3( + host='{{< influxdb/host >}}', + org='', + token=token, + database='get-started' + ) - lines = [ - "home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000", - "home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000", - "home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600", - "home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600", - "home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200", - "home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200", - "home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800", - "home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800", - "home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400", - "home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400", - "home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000", - "home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000", - "home,room=Living\ Room temp=22.3,hum=36.1,co=0i 1641045600", - "home,room=Kitchen temp=22.8,hum=36.3,co=1i 1641045600", - "home,room=Living\ Room temp=22.3,hum=36.1,co=1i 1641049200", - "home,room=Kitchen temp=22.7,hum=36.2,co=3i 1641049200", - "home,room=Living\ Room temp=22.4,hum=36.0,co=4i 1641052800", - "home,room=Kitchen temp=22.4,hum=36.0,co=7i 1641052800", - "home,room=Living\ Room temp=22.6,hum=35.9,co=5i 1641056400", - "home,room=Kitchen temp=22.7,hum=36.0,co=9i 1641056400", - "home,room=Living\ Room temp=22.8,hum=36.2,co=9i 1641060000", - "home,room=Kitchen temp=23.3,hum=36.9,co=18i 1641060000", - "home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600", - "home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600", - "home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200", - "home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200" - ] + lines = [ + "home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000", + "home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000", + "home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600", + "home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600", + "home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200", + "home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200", + "home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800", + "home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800", + "home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400", + "home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400", + "home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000", + "home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000", + "home,room=Living\ Room temp=22.3,hum=36.1,co=0i 1641045600", + "home,room=Kitchen temp=22.8,hum=36.3,co=1i 1641045600", + "home,room=Living\ Room temp=22.3,hum=36.1,co=1i 1641049200", + "home,room=Kitchen temp=22.7,hum=36.2,co=3i 1641049200", + "home,room=Living\ Room temp=22.4,hum=36.0,co=4i 1641052800", + "home,room=Kitchen temp=22.4,hum=36.0,co=7i 1641052800", + "home,room=Living\ Room temp=22.6,hum=35.9,co=5i 1641056400", + "home,room=Kitchen temp=22.7,hum=36.0,co=9i 1641056400", + "home,room=Living\ Room temp=22.8,hum=36.2,co=9i 1641060000", + "home,room=Kitchen temp=23.3,hum=36.9,co=18i 1641060000", + "home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600", + "home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600", + "home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200", + "home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200" + ] - client.write(lines,write_precision='s') - ``` + client.write(lines,write_precision='s') + ``` - The sample does the following: + The sample does the following: - 1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module. - 2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB client - configured with the following credentials: + 1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module. + 2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB + client configured with the following credentials: - - **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL without protocol or trailing slash) - - **`org`**: an empty or arbitrary string (InfluxDB ignores this parameter) - - **`token`**: a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with write access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ - - **`database`**: the name of the {{% product-name %}} database to write to - - 3. Defines a list of line protocol strings where each string represents a data record. - 4. Calls the `client.write()` method with the line protocol record list and write options. + - **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL + without protocol or trailing slash) + - **`org`**: an empty or arbitrary string (InfluxDB ignores this + parameter) + - **`token`**: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + with write access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ + - **`database`**: the name of the {{% product-name %}} database to write + to - **Because the timestamps in the sample line protocol are in second - precision, the example passes the `write_precision='s'` option - to set the [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) to seconds.** + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the `client.write()` method with the line protocol record list and + write options. -6. To execute the module and write line protocol to your {{% product-name %}} - database, enter the following command in your terminal: - - + **Because the timestamps in the sample line protocol are in second + precision, the example passes the `write_precision='s'` option to set the + [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + to seconds.** - ```bash - python write.py - ``` +7. To execute the module and write line protocol to your {{% product-name %}} + database, enter the following command in your terminal: + + + + ```bash + python write.py + ``` {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -To write data to {{% product-name %}} using Go, use the -InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go). +To write data to {{% product-name %}} using Go, use the InfluxDB v3 +[influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go). -1. Inside of your project directory, create a new module directory and navigate into it. +1. Inside of your project directory, create a new module directory and navigate + into it. @@ -722,14 +829,14 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu // database WRITE token value. token := os.Getenv("INFLUX_TOKEN") database := os.Getenv("INFLUX_DATABASE") - + // Initialize a client with URL and token, // and set the timestamp precision for writes. client, err := influxdb3.New(influxdb3.ClientConfig{ Host: "https://{{< influxdb/host >}}", Token: token, Database: database, - WriteOptions: &influxdb3.WriteOptions{Precision: lineprotocol.Second}, + WriteOptions: &influxdb3.WriteOptions{Precision: lineprotocol.Second}, }) // Close the client when the function returns. @@ -772,7 +879,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu `home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641167200`, `home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641167200`, } - + // Iterate over the lines array and write each line // separately to InfluxDB for _, record := range lines { @@ -785,7 +892,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu if err != nil { panic(err) } - + fmt.Println("Data has been written successfully.") return nil } @@ -794,42 +901,51 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample does the following: 1. Imports required packages. - 2. Defines a `WriteLineProtocol()` function that does the following: - - 1. To instantiate the client, calls the `influxdb3.New(influxdb3.ClientConfig)` function and passes the following: + + 1. To instantiate the client, calls the + `influxdb3.New(influxdb3.ClientConfig)` function and passes the + following: + - **`Host`**: the {{% product-name omit=" Clustered" %}} cluster URL - **`Database`**: The name of your {{% product-name %}} database - - **`Token`**: a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ - - **`WriteOptions`**: `influxdb3.WriteOptions` options for writing to InfluxDB. + - **`Token`**: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a + secret store or environment variable to avoid exposing the raw + token string._ + - **`WriteOptions`**: `influxdb3.WriteOptions` options for writing + to InfluxDB. **Because the timestamps in the sample line protocol are in second - precision, the example passes the `Precision: lineprotocol.Second` option - to set the [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) to seconds.** - - 2. Defines a deferred function that closes the client when the function returns. - + precision, the example passes the `Precision: lineprotocol.Second` + option to set the + [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + to seconds.** + + 2. Defines a deferred function that closes the client when the function + returns. 3. Defines an array of line protocol strings where each string represents a data record. - - 4. Iterates through the array of line protocol and calls the - write client's `Write()` method - to write each line of line protocol separately to InfluxDB. + 4. Iterates through the array of line protocol and calls the write + client's `Write()` method to write each line of line protocol + separately to InfluxDB. -5. In your editor, create a `main.go` file and enter the following sample code that calls the `WriteLineProtocol()` function: +5. In your editor, create a `main.go` file and enter the following sample code + that calls the `WriteLineProtocol()` function: ```go package main // Module main function - func main() { + func main() { WriteLineProtocol() } ``` -6. In your terminal, enter the following command to install the packages listed in `imports`, build the `influxdb_go_client` module, and execute the `main()` function: +6. In your terminal, enter the following command to install the packages listed + in `imports`, build the `influxdb_go_client` module, and execute the + `main()` function: @@ -840,21 +956,28 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The program writes the line protocol to your {{% product-name %}} database. {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} {{% influxdb/custom-timestamps %}} + -1. If you haven't already, follow the instructions for [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) for your system. -2. In your terminal, enter the following command to create a `influxdb_js_client` directory for your project: +1. If you haven't already, follow the instructions for + [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) + for your system. +2. In your terminal, enter the following command to create a + `influxdb_js_client` directory for your project: ```bash mkdir influxdb_js_client && cd influxdb_js_client ``` -3. Inside of `influxdb_js_client`, enter the following command to initialize a package. - This example configures the package to use [ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders). +3. Inside of `influxdb_js_client`, enter the following command to initialize a + package. This example configures the package to use + [ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders). @@ -862,7 +985,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu npm init -y; npm pkg set type="module" ``` -4. Install the `@influxdata/influxdb3-client` JavaScript client library as a dependency to your project. +4. Install the `@influxdata/influxdb3-client` JavaScript client library as a + dependency to your project. @@ -882,31 +1006,31 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ```js // write.js - import { InfluxDBClient } from "@influxdata/influxdb3-client"; + import { InfluxDBClient } from '@influxdata/influxdb3-client'; /** - * Set InfluxDB credentials. - */ - const host = "https://cluster-id.influxdb.io"; - const database = "get-started"; + * Set InfluxDB credentials. + */ + const host = 'https://cluster-id.influxdb.io'; + const database = 'get-started'; /** - * INFLUX_TOKEN is an environment variable you assigned to your - * WRITE token value. - */ + * INFLUX_TOKEN is an environment variable you assigned to your + * WRITE token value. + */ const token = process.env.INFLUX_TOKEN; /** - * Write line protocol to InfluxDB using the JavaScript client library. - */ + * Write line protocol to InfluxDB using the JavaScript client library. + */ export async function writeLineProtocol() { /** - * Instantiate an InfluxDBClient - */ + * Instantiate an InfluxDBClient + */ const client = new InfluxDBClient({ host, token }); /** - * Define line protocol records to write. - */ + * Define line protocol records to write. + */ const records = [ `home,room=Living\\ Room temp=21.1,hum=35.9,co=0i 1641124000`, `home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641124000`, @@ -937,20 +1061,21 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ]; /** - * Creates an array that contains separate write request promises - * for all the records. - */ + * Creates an array that contains separate write request promises + * for all the records. + */ const writePromises = records.map((record) => { - return client.write(record, database, "", { precision: "s" }) - .then(() => `Data has been written successfully: ${record}`, - () => `Failed writing data: ${record}`); + return client.write(record, database, '', { precision: 's' }).then( + () => `Data has been written successfully: ${record}`, + () => `Failed writing data: ${record}` + ); }); /** - * Wait for all the write promises to settle, and then output the results. - */ + * Wait for all the write promises to settle, and then output the results. + */ const writeResults = await Promise.allSettled(writePromises); - writeResults.forEach(write => console.log(write.value)); + writeResults.forEach((write) => console.log(write.value)); /** Close the client to release resources. */ await client.close(); @@ -960,39 +1085,52 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample code does the following: 1. Imports the `InfluxDBClient` class. - 2. Calls the `new InfluxDBClient()` constructor and passes a `ClientOptions` object to instantiate a client configured - with InfluxDB credentials. + 2. Calls the `new InfluxDBClient()` constructor and passes a + `ClientOptions` object to instantiate a client configured with InfluxDB + credentials. - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`token`**: a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`token`**: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ + + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the client's `write()` method for each record, defines the success + or failure message to return, and collects the pending promises into the + `writePromises` array. Each call to `write()` passes the following + arguments: - 3. Defines a list of line protocol strings where each string represents a data record. - 4. Calls the client's `write()` method for each record, defines the success or failure message to return, and collects the pending promises into the `writePromises` array. - Each call to `write()` passes the following arguments: - - **`record`**: the line protocol record - - **`database`**: the name of the {{% product-name %}} database to write to - - **`{precision}`**: a `WriteOptions` object that sets the `precision` value. + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`{precision}`**: a `WriteOptions` object that sets the `precision` + value. **Because the timestamps in the sample line protocol are in second - precision, the example passes `s` as the `precision` value to set the write - [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) to seconds.** + precision, the example passes `s` as the `precision` value to set the + write + [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + to seconds.** + + 5. Calls `Promise.allSettled()` with the promises array to pause execution + until the promises have completed, and then assigns the array containing + success and failure messages to a `writeResults` constant. + 6. Iterates over and prints the messages in `writeResults`. + 7. Closes the client to release resources. - 5. Calls `Promise.allSettled()` with the promises array to pause execution until the promises have completed, and then assigns the array containing success and failure messages to a `writeResults` constant. - 7. Iterates over and prints the messages in `writeResults`. - 8. Closes the client to release resources. 7. In your terminal or editor, create an `index.js` file. -8. Inside of `index.js`, enter the following sample code to import and call `writeLineProtocol()`: +8. Inside of `index.js`, enter the following sample code to import and call + `writeLineProtocol()`: ```js // index.js - import { writeLineProtocol } from "./write.js"; + import { writeLineProtocol } from './write.js'; /** - * Execute the client functions. - */ + * Execute the client functions. + */ async function main() { /** Write line protocol data to InfluxDB. */ await writeLineProtocol(); @@ -1010,13 +1148,21 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -1. If you haven't already, follow the [Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download) to install .NET and the `dotnet` CLI. -2. In your terminal, create an executable C# project using the .NET **console** template. + +1. If you haven't already, follow the + [Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download) + to install .NET and the `dotnet` CLI. +2. In your terminal, create an executable C# project using the .NET **console** + template. @@ -1024,15 +1170,16 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu dotnet new console --name influxdb_csharp_client ``` -3. Change into the generated `influxdb_csharp_client` directory. - +3. Change into the generated `influxdb_csharp_client` directory. + ```sh cd influxdb_csharp_client ``` -4. Run the following command to install the latest version of the InfluxDB v3 C# client library. +4. Run the following command to install the latest version of the InfluxDB v3 + C# client library. @@ -1040,7 +1187,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu dotnet add package InfluxDB3.Client ``` -5. In your editor, create a `Write.cs` file and enter the following sample code: +5. In your editor, create a `Write.cs` file and enter the following sample + code: ```c# // Write.cs @@ -1057,7 +1205,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu /** * Writes line protocol to InfluxDB using the C# .NET client * library. - */ + */ public static async Task WriteLines() { // Set InfluxDB credentials @@ -1075,7 +1223,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu using var client = new InfluxDBClient( host, token: token, database: database); - /** + /** * Define an array of line protocol strings to write. * Include an additional backslash to preserve backslashes * and prevent interpretation of escape sequences---for example, @@ -1125,25 +1273,34 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample does the following: - 1. Calls the `new InfluxDBClient()` constructor to instantiate a client configured - with InfluxDB credentials. + 1. Calls the `new InfluxDBClient()` constructor to instantiate a client + configured with InfluxDB credentials. - - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`database`**: the name of the {{% product-name %}} database to write to - - **`token`**: a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`token`**: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ - _Instantiating the client with the `using` statement ensures that the client is disposed of when it's no longer needed._ + _Instantiating the client with the `using` statement ensures that the + client is disposed of when it's no longer needed._ - 2. Defines an array of line protocol strings where each string represents a data record. - 3. Calls the client's `WriteRecordAsync()` method to write each line protocol record to InfluxDB. + 2. Defines an array of line protocol strings where each string represents a + data record. + 3. Calls the client's `WriteRecordAsync()` method to write each line + protocol record to InfluxDB. - **Because the timestamps in the sample line protocol are in second - precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs) - to the `precision:` option to set the[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) to seconds.** + **Because the timestamps in the sample line protocol are in second + precision, the example passes the + [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs) + to the `precision:` option to set + the[timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + to seconds.** -6. In your editor, open the `Program.cs` file and replace its contents with the following: +6. In your editor, open the `Program.cs` file and replace its contents with the + following: ```c# // Program.cs @@ -1162,27 +1319,33 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu } ``` - The `Program` class shares the same `InfluxDBv3` namespace as the `Write` class you defined in the preceding step - and defines a `Main()` function that calls `Write.WriteLineProtocol()`. - The `dotnet` CLI recognizes `Program.Main()` as the entry point for your program. + The `Program` class shares the same `InfluxDBv3` namespace as the `Write` + class you defined in the preceding step and defines a `Main()` function that + calls `Write.WriteLineProtocol()`. The `dotnet` CLI recognizes + `Program.Main()` as the entry point for your program. -7. To build and execute the program and write the line protocol to your {{% product-name %}} database, enter the following command in your terminal: +7. To build and execute the program and write the line protocol to your + {{% product-name %}} database, enter the following command in your terminal: - + - ```sh - dotnet run - ``` - -{{% /influxdb/custom-timestamps %}} -{{% /tab-content %}} -{{% tab-content %}} -{{% influxdb/custom-timestamps %}} - + ```sh + dotnet run + ``` + + + + {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} + {{% tab-content %}} + {{% influxdb/custom-timestamps %}} + _The tutorial assumes using Maven version 3.9 and Java version >= 15._ -1. If you haven't already, follow the instructions to download and install the [Java JDK](https://www.oracle.com/java/technologies/downloads/) and [Maven](https://maven.apache.org/download.cgi) for your system. +1. If you haven't already, follow the instructions to download and install the + [Java JDK](https://www.oracle.com/java/technologies/downloads/) and + [Maven](https://maven.apache.org/download.cgi) for your system. 2. In your terminal or editor, use Maven to generate a project--for example: ```bash @@ -1194,9 +1357,11 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ ``` Maven creates the `` directory (`./influxdb_java_client`) that - contains a `pom.xml` and scaffolding for your `com.influxdbv3.influxdb_java_client` Java application. + contains a `pom.xml` and scaffolding for your + `com.influxdbv3.influxdb_java_client` Java application. -3. In your terminal or editor, change into the `./influxdb_java_client` directory--for example: +3. In your terminal or editor, change into the `./influxdb_java_client` + directory--for example: @@ -1204,7 +1369,8 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ cd ./influxdb_java_client ``` -4. In your editor, open the `pom.xml` Maven configuration file and add the `com.influxdb.influxdb3-java` client library into `dependencies`. +4. In your editor, open the `pom.xml` Maven configuration file and add the + `com.influxdb.influxdb3-java` client library into `dependencies`. ```pom ... @@ -1218,15 +1384,19 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ ... ``` -5. To validate your `pom.xml`, run Maven's `validate` command--for example, enter the following in your terminal: - + +5. To check your `pom.xml` for problems, run Maven's `validate` command--for example, + enter the following in your terminal: + ```bash mvn validate ``` -6. In your editor, navigate to the `./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a `Write.java` file. +6. In your editor, navigate to the + `./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a + `Write.java` file. 7. In `Write.java`, enter the following sample code: ```java @@ -1241,7 +1411,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ /** * Writes line protocol to InfluxDB using the Java client * library. - */ + */ public final class Write { /** * Write data to InfluxDB v3. @@ -1254,7 +1424,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ * @throws Exception */ public static void writeLineProtocol() throws Exception { - + // Set InfluxDB credentials final String host = "https://{{< influxdb/host >}}"; final String database = "get-started"; @@ -1318,7 +1488,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ The sample code does the following: 1. Imports the following classes: - + - `java.util.List`; - `com.influxdb.v3.client.InfluxDBClient` - `com.influxdb.v3.client.write.WriteParameters` @@ -1328,19 +1498,27 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ with InfluxDB credentials. - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`database`**: the name of the {{% product-name %}} database to write to - - **`token`**: a [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`token`**: a + [database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ - 2. Defines a list of line protocol strings where each string represents a data record. - 3. Calls the client's `writeRecord()` method to write each record separately to InfluxDB. + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the client's `writeRecord()` method to write each record + separately to InfluxDB. **Because the timestamps in the sample line protocol are in second - precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java) - as the `precision` argument to set the write [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) to seconds.** + precision, the example passes the + [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java) + as the `precision` argument to set the write + [timestamp precision](/influxdb/cloud-dedicated/reference/glossary/#timestamp-precision) + to seconds.** -8. In your editor, open the `App.java` file (created by Maven) and replace its contents with the following sample code: +8. In your editor, open the `App.java` file (created by Maven) and replace its + contents with the following sample code: ```java // App.java @@ -1363,10 +1541,13 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ } } ``` - - - The `App` class and `Write` class are part of the same `com.influxdbv3` package (your project **groupId**). + + - The `App` class and `Write` class are part of the same `com.influxdbv3` + package (your project **groupId**). - `App` defines a `main()` function that calls `Write.writeLineProtocol()`. -9. In your terminal or editor, use Maven to to install dependencies and compile the project code--for example: + +9. In your terminal or editor, use Maven to install dependencies and compile + the project code--for example: @@ -1374,58 +1555,62 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ mvn compile ``` -10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for example, using Maven: +10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for + example, using Maven: - + - ```sh - mvn exec:java -Dexec.mainClass="com.influxdbv3.App" - ``` - -{{% /influxdb/custom-timestamps %}} -{{% /tab-content %}} -{{< /tabs-wrapper >}} + ```sh + mvn exec:java -Dexec.mainClass="com.influxdbv3.App" + ``` -If successful, the output is the success message; otherwise, error details and the failure message. + + + {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} + {{< /tabs-wrapper >}} + +If successful, the output is the success message; otherwise, error details and +the failure message. {{< expand-wrapper >}} {{% expand "View the written data" %}} {{% influxdb/custom-timestamps %}} -| time | room | co | hum | temp | +| time | room | co | hum | temp | | :------------------- | :---------- | --: | ---: | ---: | -| 2022-01-01T08:00:00Z | Kitchen | 0 | 35.9 | 21 | -| 2022-01-01T09:00:00Z | Kitchen | 0 | 36.2 | 23 | -| 2022-01-01T10:00:00Z | Kitchen | 0 | 36.1 | 22.7 | -| 2022-01-01T11:00:00Z | Kitchen | 0 | 36 | 22.4 | -| 2022-01-01T12:00:00Z | Kitchen | 0 | 36 | 22.5 | -| 2022-01-01T13:00:00Z | Kitchen | 1 | 36.5 | 22.8 | -| 2022-01-01T14:00:00Z | Kitchen | 1 | 36.3 | 22.8 | -| 2022-01-01T15:00:00Z | Kitchen | 3 | 36.2 | 22.7 | -| 2022-01-01T16:00:00Z | Kitchen | 7 | 36 | 22.4 | -| 2022-01-01T17:00:00Z | Kitchen | 9 | 36 | 22.7 | -| 2022-01-01T18:00:00Z | Kitchen | 18 | 36.9 | 23.3 | -| 2022-01-01T19:00:00Z | Kitchen | 22 | 36.6 | 23.1 | -| 2022-01-01T20:00:00Z | Kitchen | 26 | 36.5 | 22.7 | -| 2022-01-01T08:00:00Z | Living Room | 0 | 35.9 | 21.1 | -| 2022-01-01T09:00:00Z | Living Room | 0 | 35.9 | 21.4 | -| 2022-01-01T10:00:00Z | Living Room | 0 | 36 | 21.8 | -| 2022-01-01T11:00:00Z | Living Room | 0 | 36 | 22.2 | -| 2022-01-01T12:00:00Z | Living Room | 0 | 35.9 | 22.2 | -| 2022-01-01T13:00:00Z | Living Room | 0 | 36 | 22.4 | -| 2022-01-01T14:00:00Z | Living Room | 0 | 36.1 | 22.3 | -| 2022-01-01T15:00:00Z | Living Room | 1 | 36.1 | 22.3 | -| 2022-01-01T16:00:00Z | Living Room | 4 | 36 | 22.4 | -| 2022-01-01T17:00:00Z | Living Room | 5 | 35.9 | 22.6 | -| 2022-01-01T18:00:00Z | Living Room | 9 | 36.2 | 22.8 | -| 2022-01-01T19:00:00Z | Living Room | 14 | 36.3 | 22.5 | -| 2022-01-01T20:00:00Z | Living Room | 17 | 36.4 | 22.2 | +| 2022-01-01T08:00:00Z | Kitchen | 0 | 35.9 | 21 | +| 2022-01-01T09:00:00Z | Kitchen | 0 | 36.2 | 23 | +| 2022-01-01T10:00:00Z | Kitchen | 0 | 36.1 | 22.7 | +| 2022-01-01T11:00:00Z | Kitchen | 0 | 36 | 22.4 | +| 2022-01-01T12:00:00Z | Kitchen | 0 | 36 | 22.5 | +| 2022-01-01T13:00:00Z | Kitchen | 1 | 36.5 | 22.8 | +| 2022-01-01T14:00:00Z | Kitchen | 1 | 36.3 | 22.8 | +| 2022-01-01T15:00:00Z | Kitchen | 3 | 36.2 | 22.7 | +| 2022-01-01T16:00:00Z | Kitchen | 7 | 36 | 22.4 | +| 2022-01-01T17:00:00Z | Kitchen | 9 | 36 | 22.7 | +| 2022-01-01T18:00:00Z | Kitchen | 18 | 36.9 | 23.3 | +| 2022-01-01T19:00:00Z | Kitchen | 22 | 36.6 | 23.1 | +| 2022-01-01T20:00:00Z | Kitchen | 26 | 36.5 | 22.7 | +| 2022-01-01T08:00:00Z | Living Room | 0 | 35.9 | 21.1 | +| 2022-01-01T09:00:00Z | Living Room | 0 | 35.9 | 21.4 | +| 2022-01-01T10:00:00Z | Living Room | 0 | 36 | 21.8 | +| 2022-01-01T11:00:00Z | Living Room | 0 | 36 | 22.2 | +| 2022-01-01T12:00:00Z | Living Room | 0 | 35.9 | 22.2 | +| 2022-01-01T13:00:00Z | Living Room | 0 | 36 | 22.4 | +| 2022-01-01T14:00:00Z | Living Room | 0 | 36.1 | 22.3 | +| 2022-01-01T15:00:00Z | Living Room | 1 | 36.1 | 22.3 | +| 2022-01-01T16:00:00Z | Living Room | 4 | 36 | 22.4 | +| 2022-01-01T17:00:00Z | Living Room | 5 | 35.9 | 22.6 | +| 2022-01-01T18:00:00Z | Living Room | 9 | 36.2 | 22.8 | +| 2022-01-01T19:00:00Z | Living Room | 14 | 36.3 | 22.5 | +| 2022-01-01T20:00:00Z | Living Room | 17 | 36.4 | 22.2 | {{% /influxdb/custom-timestamps %}} {{% /expand %}} {{< /expand-wrapper >}} -**Congratulations!** You have written data to InfluxDB. -With data now stored in InfluxDB, let's query it. +**Congratulations!** You've written data to InfluxDB. +Next, learn how to query your data. {{< page-nav prev="/influxdb/cloud-dedicated/get-started/setup/" next="/influxdb/cloud-dedicated/get-started/query/" keepTab=true >}} diff --git a/content/influxdb/cloud-dedicated/write-data/line-protocol/client-libraries.md b/content/influxdb/cloud-dedicated/write-data/line-protocol/client-libraries.md index 74af5cdda..f1567173c 100644 --- a/content/influxdb/cloud-dedicated/write-data/line-protocol/client-libraries.md +++ b/content/influxdb/cloud-dedicated/write-data/line-protocol/client-libraries.md @@ -1,7 +1,8 @@ --- title: Use InfluxDB client libraries to write line protocol data description: > - Use InfluxDB API clients to write line protocol data to InfluxDB Cloud Dedicated. + Use InfluxDB API clients to write points as line protocol data to InfluxDB + Cloud Dedicated. menu: influxdb_cloud_dedicated: name: Use client libraries @@ -13,24 +14,36 @@ related: - /influxdb/cloud-dedicated/get-started/write/ --- -Use InfluxDB client libraries to build line protocol, and then write it to an -InfluxDB database. +Use InfluxDB client libraries to build time series points, and then write them +line protocol to an {{% product-name %}} database. - [Construct line protocol](#construct-line-protocol) + - [Example home schema](#example-home-schema) - [Set up your project](#set-up-your-project) - [Construct points and write line protocol](#construct-points-and-write-line-protocol) -- [Run the example](#run-the-example) - - [Home sensor data line protocol](#home-sensor-data-line-protocol) ## Construct line protocol -With a [basic understanding of line protocol](/influxdb/cloud-dedicated/write-data/line-protocol/), -you can now construct line protocol and write data to InfluxDB. -Consider a use case where you collect data from sensors in your home. -Each sensor collects temperature, humidity, and carbon monoxide readings. +With a +[basic understanding of line protocol](/influxdb/cloud-dedicated/write-data/line-protocol/), +you can construct line protocol data and write it to InfluxDB. + +All InfluxDB client libraries write data in line protocol format to InfluxDB. +Client library `write` methods let you provide data as raw line protocol or as +`Point` objects that the client library converts to line protocol. If your +program creates the data you write to InfluxDB, use the client library `Point` +interface to take advantage of type safety in your program. + +### Example home schema + +Consider a use case where you collect data from sensors in your home. Each +sensor collects temperature, humidity, and carbon monoxide readings. + To collect this data, use the following schema: -- **measurement**: `home` + + +- **measurement**: `home` - **tags** - `room`: Living Room or Kitchen - **fields** @@ -39,337 +52,427 @@ To collect this data, use the following schema: - `co`: carbon monoxide in parts per million (integer) - **timestamp**: Unix timestamp in _second_ precision -The following example shows how to construct and write points that follow this schema. + + +The following example shows how to construct and write points that follow the +`home` schema. ## Set up your project -The examples in this guide assume you followed [Set up InfluxDB](/influxdb/cloud-dedicated/get-started/setup/) -and [Write data set up](/influxdb/cloud-dedicated/get-started/write/#set-up-your-project-and-credentials) +The examples in this guide assume you followed +[Set up InfluxDB](/influxdb/cloud-dedicated/get-started/setup/) and +[Write data set up](/influxdb/cloud-dedicated/get-started/write/#set-up-your-project-and-credentials) instructions in [Get started](/influxdb/cloud-dedicated/get-started/). After setting up InfluxDB and your project, you should have the following: - {{< product-name >}} credentials: - - [Database](/influxdb/cloud-dedicated/admin/databases/) - - [Database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) - - Cluster hostname + - [Database](/influxdb/cloud-dedicated/admin/databases/) + - [Database token](/influxdb/cloud-dedicated/admin/tokens/#database-tokens) + - Cluster hostname - A directory for your project. -- Credentials stored as environment variables or in a project configuration file--for example, a `.env` ("dotenv") file. +- Credentials stored as environment variables or in a project configuration + file--for example, a `.env` ("dotenv") file. - Client libraries installed for writing data to InfluxDB. -The following example shows how to construct `Point` objects that follow the [example `home` schema](#example-home-schema), and then write the points as line protocol to an -{{% product-name %}} database. +The following example shows how to construct `Point` objects that follow the +[example `home` schema](#example-home-schema), and then write the data as line +protocol to an {{% product-name %}} database. + +The examples use InfluxDB v3 client libraries. For examples using InfluxDB v2 +client libraries to write data to InfluxDB v3, see +[InfluxDB v2 clients](/influxdb/cloud-dedicated/reference/client-libraries/v2/). {{< tabs-wrapper >}} {{% tabs %}} + + [Go](#) [Node.js](#) [Python](#) {{% /tabs %}} {{% tab-content %}} + +The following steps set up a Go project using the +[InfluxDB v3 Go client](https://github.com/InfluxCommunity/influxdb3-go/): + -1. Install [Go 1.13 or later](https://golang.org/doc/install). +1. Install [Go 1.13 or later](https://golang.org/doc/install). -2. Inside of your project directory, install the client package to your project dependencies. +1. Create a directory for your Go module and change to the directory--for + example: - ```sh - go get github.com/influxdata/influxdb-client-go/v2 - ``` + ```sh + mkdir iot-starter-go && cd $_ + ``` + +1. Initialize a Go module--for example: + + ```sh + go mod init iot-starter + ``` + +1. Install [`influxdb3-go`](https://github.com/InfluxCommunity/influxdb3-go/), + which provides the InfluxDB `influxdb3` Go client library module. + + ```sh + go get github.com/InfluxCommunity/influxdb3-go + ``` -{{% /tab-content %}} -{{% tab-content %}} + +{{% /tab-content %}} {{% tab-content %}} + -Inside of your project directory, install the `@influxdata/influxdb-client` InfluxDB v2 JavaScript client library. +The following steps set up a JavaScript project using the +[InfluxDB v3 JavaScript client](https://github.com/InfluxCommunity/influxdb3-js/). -```sh -npm install --save @influxdata/influxdb-client -``` +1. Install [Node.js](https://nodejs.org/en/download/). + +1. Create a directory for your JavaScript project and change to the + directory--for example: + + ```sh + mkdir -p iot-starter-js && cd $_ + ``` + +1. Initialize a project--for example, using `npm`: + + + + ```sh + npm init + ``` + +1. Install the `@influxdata/influxdb3-client` InfluxDB v3 JavaScript client + library. + + ```sh + npm install @influxdata/influxdb3-client + ``` -{{% /tab-content %}} -{{% tab-content %}} + +{{% /tab-content %}} {{% tab-content %}} + -1. **Optional, but recommended**: Use [`venv`](https://docs.python.org/3/library/venv.html)) or [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual environment for installing and executing code--for example: +The following steps set up a Python project using the +[InfluxDB v3 Python client](https://github.com/InfluxCommunity/influxdb3-python/): - Inside of your project directory, enter the following command using `venv` to create and activate a virtual environment for the project: +1. Install [Python](https://www.python.org/downloads/) - ```sh - python3 -m venv envs/env1 && source ./envs/env1/bin/activate - ``` +1. Inside of your project directory, create a directory for your Python module + and change to the module directory--for example: -2. Install the [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), which provides the InfluxDB `influxdb_client_3` Python client library module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data. + ```sh + mkdir -p iot-starter-py && cd $_ + ``` - ```sh - pip install influxdb3-python - ``` +1. **Optional, but recommended**: Use + [`venv`](https://docs.python.org/3/library/venv.html) or + [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual + environment for installing and executing code--for example, enter the + following command using `venv` to create and activate a virtual environment + for the project: + + ```bash + python3 -m venv envs/iot-starter && source ./envs/iot-starter/bin/activate + ``` + +1. Install + [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), + which provides the InfluxDB `influxdb_client_3` Python client library module + and also installs the + [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for + working with Arrow data. + + ```sh + pip install influxdb3-python + ``` + {{% /tab-content %}} {{< /tabs-wrapper >}} ## Construct points and write line protocol +Client libraries provide one or more `Point` constructor methods. Some libraries +support language-native data structures, such as Go's `struct`, for creating +points. + {{< tabs-wrapper >}} {{% tabs %}} + + [Go](#) [Node.js](#) [Python](#) {{% /tabs %}} {{% tab-content %}} + -1. Create a file for your module--for example: `write-point.go`. +1. Create a file for your module--for example: `main.go`. -2. In `write-point.go`, enter the following sample code: +1. In `main.go`, enter the following sample code: - ```go - package main + ```go + package main - import ( - "os" - "time" - "fmt" - "github.com/influxdata/influxdb-client-go/v2" - ) + import ( + "context" + "os" + "fmt" + "time" + "github.com/InfluxCommunity/influxdb3-go/influxdb3" + "github.com/influxdata/line-protocol/v2/lineprotocol" + ) - func main() { - // Set a log level constant - const debugLevel uint = 4 + func Write() error { + url := os.Getenv("INFLUX_HOST") + token := os.Getenv("INFLUX_TOKEN") + database := os.Getenv("INFLUX_DATABASE") - /** - * Define options for the client. - * Instantiate the client with the following arguments: - * - An object containing InfluxDB URL and token credentials. - * - Write options for batch size and timestamp precision. + // To instantiate a client, call New() with InfluxDB credentials. + client, err := influxdb3.New(influxdb3.ClientConfig{ + Host: url, + Token: token, + Database: database, + }) + + /** Use a deferred function to ensure the client is closed when the + * function returns. **/ - clientOptions := influxdb2.DefaultOptions(). - SetBatchSize(20). - SetLogLevel(debugLevel). - SetPrecision(time.Second) + defer func (client *influxdb3.Client) { + err = client.Close() + if err != nil { + panic(err) + } + }(client) - client := influxdb2.NewClientWithOptions(os.Getenv("INFLUX_URL"), - os.Getenv("INFLUX_TOKEN"), - clientOptions) - - /** - * Create an asynchronous, non-blocking write client. - * Provide your InfluxDB org and database as arguments + /** Use the NewPoint method to construct a point. + * NewPoint(measurement, tags map, fields map, time) **/ - writeAPI := client.WriteAPI(os.Getenv("INFLUX_ORG"), "get-started") + point := influxdb3.NewPoint("home", + map[string]string{ + "room": "Living Room", + }, + map[string]any{ + "temp": 24.5, + "hum": 40.5, + "co": 15i}, + time.Now(), + ) - // Get the errors channel for the asynchronous write client. - errorsCh := writeAPI.Errors() - - /** Create a point. - * Provide measurement, tags, and fields as arguments. + /** Use the NewPointWithMeasurement method to construct a point with + * method chaining. **/ - p := influxdb2.NewPointWithMeasurement("home"). - AddTag("room", "Kitchen"). - AddField("temp", 72.0). - AddField("hum", 20.2). - AddField("co", 9). - SetTime(time.Now()) - - // Define a proc for handling errors. - go func() { - for err := range errorsCh { - fmt.Printf("write error: %s\n", err.Error()) - } - }() + point2 := influxdb3.NewPointWithMeasurement("home"). + SetTag("room", "Living Room"). + SetField("temp", 23.5). + SetField("hum", 38.0). + SetField("co", 16i). + SetTimestamp(time.Now()) - // Write the point asynchronously - writeAPI.WritePoint(p) + fmt.Println("Writing points") + points := []*influxdb3.Point{point, point2} - // Send pending writes from the buffer to the database. - writeAPI.Flush() + /** Write points to InfluxDB. + * You can specify WriteOptions, such as Gzip threshold, + * default tags, and timestamp precision. Default precision is lineprotocol.Nanosecond + **/ + err = client.WritePoints(context.Background(), points, + influxdb3.WithPrecision(lineprotocol.Second)) + return nil + } + + func main() { + Write() + } + ``` + +1. To run the module and write the data to your {{% product-name %}} database, + enter the following command in your terminal: + + + + ```sh + go run main.go + ``` + + + +{{% /tab-content %}} {{% tab-content %}} - // Ensure background processes finish and release resources. - client.Close() - } - ``` - -{{% /tab-content %}} -{{% tab-content %}} -1. Create a file for your module--for example: `write-point.js`. +1. Create a file for your module--for example: `write-points.js`. -2. In `write-point.js`, enter the following sample code: +1. In `write-points.js`, enter the following sample code: - ```js - 'use strict' - /** @module write - * Use the JavaScript client library for Node.js. to create a point and write it to InfluxDB - **/ + ```js + // write-points.js + import { InfluxDBClient, Point } from '@influxdata/influxdb3-client'; - import {InfluxDB, Point} from '@influxdata/influxdb-client' + /** + * Set InfluxDB credentials. + */ + const host = process.env.INFLUX_HOST ?? ''; + const database = process.env.INFLUX_DATABASE; + const token = process.env.INFLUX_TOKEN; - /** Get credentials from the environment **/ - const url = process.env.INFLUX_URL - const token = process.env.INFLUX_TOKEN - const org = process.env.INFLUX_ORG + /** + * Write line protocol to InfluxDB using the JavaScript client library. + */ + export async function writePoints() { + /** + * Instantiate an InfluxDBClient. + * Provide the host URL and the database token. + */ + const client = new InfluxDBClient({ host, token }); - /** - * Instantiate a client with a configuration object - * that contains your InfluxDB URL and token. - **/ - const influxDB = new InfluxDB({url, token}) + /** Use the fluent interface with chained methods to construct Points. */ + const point = Point.measurement('home') + .setTag('room', 'Living Room') + .setFloatField('temp', 22.2) + .setFloatField('hum', 35.5) + .setIntegerField('co', 7) + .setTimestamp(new Date().getTime() / 1000); - /** - * Create a write client configured to write to the database. - * Provide your InfluxDB org and database. - **/ - const writeApi = influxDB.getWriteApi(org, 'get-started') + const point2 = Point.measurement('home') + .setTag('room', 'Kitchen') + .setFloatField('temp', 21.0) + .setFloatField('hum', 35.9) + .setIntegerField('co', 0) + .setTimestamp(new Date().getTime() / 1000); - /** - * Create a point and add tags and fields. - * To add a field, call the field method for your data type. - **/ - const point1 = new Point('home') - .tag('room', 'Kitchen') - .floatField('temp', 72.0) - .floatField('hum', 20.2) - .intField('co', 9) - console.log(` ${point1}`) + /** Write points to InfluxDB. + * The write method accepts an array of points, the target database, and + * an optional configuration object. + * You can specify WriteOptions, such as Gzip threshold, default tags, + * and timestamp precision. Default precision is lineprotocol.Nanosecond + **/ - /** - * Add the point to the batch. - **/ - writeApi.writePoint(point1) + try { + await client.write([point, point2], database, '', { precision: 's' }); + console.log('Data has been written successfully!'); + } catch (error) { + console.error(`Error writing data to InfluxDB: ${error.body}`); + } - /** - * Flush pending writes in the batch from the buffer and close the write client. - **/ - writeApi.close().then(() => { - console.log('WRITE FINISHED') - }) - ``` - -{{% /tab-content %}} -{{% tab-content %}} - + client.close(); + } -1. Create a file for your module--for example: `write-point.py`. + writePoints(); + ``` -2. In `write-point.py`, enter the following sample code to write data in batching mode: +1. To run the module and write the data to your {{\< product-name >}} database, + enter the following command in your terminal: - ```python - import os - from influxdb_client_3 import Point, write_client_options, WritePrecision, WriteOptions, InfluxDBError + - # Create an array of points with tags and fields. - points = [Point("home") - .tag("room", "Kitchen") - .field("temp", 25.3) - .field('hum', 20.2) - .field('co', 9)] + ```sh + node writePoints.js + ``` - # With batching mode, define callbacks to execute after a successful or failed write request. - # Callback methods receive the configuration and data sent in the request. - def success(self, data: str): - print(f"Successfully wrote batch: data: {data}") + - def error(self, data: str, exception: InfluxDBError): - print(f"Failed writing batch: config: {self}, data: {data} due: {exception}") + {{% /tab-content %}} {{% tab-content %}} - def retry(self, data: str, exception: InfluxDBError): - print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}") + - # Configure options for batch writing. - write_options = WriteOptions(batch_size=500, - flush_interval=10_000, - jitter_interval=2_000, - retry_interval=5_000, - max_retries=5, - max_retry_delay=30_000, - exponential_base=2) +1. Create a file for your module--for example: `write-points.py`. - # Create an options dict that sets callbacks and WriteOptions. - wco = write_client_options(success_callback=success, - error_callback=error, - retry_callback=retry, - WriteOptions=write_options) +1. In `write-points.py`, enter the following sample code to write data in + batching mode: - # Instantiate a synchronous instance of the client with your - # InfluxDB credentials and write options. - with InfluxDBClient3(host=config['INFLUX_HOST'], - token=config['INFLUX_TOKEN'], - database=config['INFLUX_DATABASE'], - write_client_options=wco) as client: + ```python + import os + from influxdb_client_3 import ( + InfluxDBClient3, InfluxDBError, Point, WritePrecision, + WriteOptions, write_client_options) - client.write(points, write_precision='s') - ``` - -{{% /tab-content %}} -{{< /tabs-wrapper >}} + host = os.getenv('INFLUX_HOST') + token = os.getenv('INFLUX_TOKEN') + database = os.getenv('INFLUX_DATABASE') + + # Create an array of points with tags and fields. + points = [Point("home") + .tag("room", "Kitchen") + .field("temp", 25.3) + .field('hum', 20.2) + .field('co', 9)] + + # With batching mode, define callbacks to execute after a successful or + # failed write request. + # Callback methods receive the configuration and data sent in the request. + def success(self, data: str): + print(f"Successfully wrote batch: data: {data}") + + def error(self, data: str, exception: InfluxDBError): + print(f"Failed writing batch: config: {self}, data: {data} due: {exception}") + + def retry(self, data: str, exception: InfluxDBError): + print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}") + + # Configure options for batch writing. + write_options = WriteOptions(batch_size=500, + flush_interval=10_000, + jitter_interval=2_000, + retry_interval=5_000, + max_retries=5, + max_retry_delay=30_000, + exponential_base=2) + + # Create an options dict that sets callbacks and WriteOptions. + wco = write_client_options(success_callback=success, + error_callback=error, + retry_callback=retry, + write_options=write_options) + + # Instantiate a synchronous instance of the client with your + # InfluxDB credentials and write options, such as Gzip threshold, default tags, + # and timestamp precision. Default precision is nanosecond ('ns'). + with InfluxDBClient3(host=host, + token=token, + database=database, + write_client_options=wco) as client: + + client.write(points, write_precision='s') + ``` + +1. To run the module and write the data to your {{< product-name >}} database, + enter the following command in your terminal: + + + + ```sh + python write-points.py + ``` + + + + {{% /tab-content %}} {{< /tabs-wrapper >}} The sample code does the following: -1. Instantiates a client configured with the InfluxDB URL and API token. + -2. Uses the client to instantiate a **write client** with credentials. +1. Instantiates a client configured with the InfluxDB URL and API token. +1. Constructs `home` + [measurement](/influxdb/cloud-dedicated/reference/glossary/#measurement) + `Point` objects. +1. Sends data as line protocol format to InfluxDB and waits for the response. +1. If the write succeeds, logs the success message to stdout; otherwise, logs + the failure message and error details. +1. Closes the client to release resources. -3. Constructs a `Point` object with the [measurement](/influxdb/cloud-dedicated/reference/glossary/#measurement) name (`"home"`). - -4. Adds a tag and fields to the point. - -5. Adds the point to a batch to be written to the database. - -6. Sends the batch to InfluxDB and waits for the response. - -7. Executes callbacks for the response, flushes the write buffer, and releases resources. - -## Run the example - -To run the sample and write the data to your InfluxDB Cloud Dedicated database, enter the following command in your terminal: - -{{< code-tabs-wrapper >}} -{{% code-tabs %}} -[Go](#) -[Node.js](#) -[Python](#) -{{% /code-tabs %}} -{{% code-tab-content %}} - - -```sh -go run write-point.go -``` - - -{{% /code-tab-content %}} -{{% code-tab-content %}} - - - ```sh - node write-point.js - ``` - -{{% /code-tab-content %}} - -{{% code-tab-content %}} - - - ```sh - python write-point.py - ``` - -{{% /code-tab-content %}} -{{< /code-tabs-wrapper >}} - -The example logs the point as line protocol to stdout, and then writes the point to the database. -The line protocol is similar to the following: - -### Home sensor data line protocol - -```sh -home,room=Kitchen co=9i,hum=20.2,temp=72 1641024000 -``` + diff --git a/content/influxdb/clustered/get-started/_index.md b/content/influxdb/clustered/get-started/_index.md index 9bec42bf3..f9e04d982 100644 --- a/content/influxdb/clustered/get-started/_index.md +++ b/content/influxdb/clustered/get-started/_index.md @@ -10,17 +10,16 @@ weight: 3 influxdb/clustered/tags: [get-started] --- -{{% product-name %}} is a highly available InfluxDB cluster hosted and -managed on your own infrastructure and is the platform purpose-built to collect, -store, and query time series data. -It is powered by the InfluxDB 3.0 storage engine which provides a number of -benefits including nearly unlimited series cardinality, improved query performance, -and interoperability with widely used data processing tools and platforms. +InfluxDB is the platform purpose-built to collect, store, and query +time series data. +{{% product-name %}} is powered by the InfluxDB 3.0 storage engine, that +provides nearly unlimited series cardinality, +improved query performance, and interoperability with widely used data +processing tools and platforms. -**Time series data** is a sequence of data points indexed in time order. -Data points typically consist of successive measurements made from the same -source and are used to track changes over time. -Examples of time series data include: +**Time series data** is a sequence of data points indexed in time order. Data +points typically consist of successive measurements made from the same source +and are used to track changes over time. Examples of time series data include: - Industrial sensor data - Server performance metrics @@ -45,33 +44,43 @@ throughout this documentation. ### Data organization The {{% product-name %}} data model organizes time series data into databases -and measurements. +and tables. -A database can contain multiple measurements. -Measurements contain multiple tags and fields. +A database can contain multiple tables. +Tables contain multiple tags and fields. -- **Database**: Named location where time series data is stored. - A database can contain multiple _measurements_. - - **Measurement**: Logical grouping for time series data. - All _points_ in a given measurement should have the same _tags_. - A measurement contains multiple _tags_ and _fields_. - - **Tags**: Key-value pairs that provide metadata for each point--for example, - something to identify the source or context of the data like host, - location, station, etc. - Tag values may be null. - - **Fields**: Key-value pairs with values that change over time--for example, - temperature, pressure, stock price, etc. - Field values may be null, but at least one field value is not null on any given row. - - **Timestamp**: Timestamp associated with the data. - When stored on disk and queried, all data is ordered by time. - A timestamp is never null. +- **Database**: A named location where time series data is stored in _tables_. + _Database_ is synonymous with _bucket_ in InfluxDB Cloud Serverless and InfluxDB TSM. + - **Table**: A logical grouping for time series data. All _points_ in a given + table should have the same _tags_. A table contains _tags_ and + _fields_. _Table_ is synonymous with _measurement_ in InfluxDB Cloud + Serverless and InfluxDB TSM. + - **Tags**: Key-value pairs that provide metadata for each point--for + example, something to identify the source or context of the data like + host, location, station, etc. Tag values may be null. + - **Fields**: Key-value pairs with values that change over time--for + example, temperature, pressure, stock price, etc. Field values may be + null, but at least one field value is not null on any given row. + - **Timestamp**: Timestamp associated with the data. When stored on disk and + queried, all data is ordered by time. A timestamp is never null. + +{{% note %}} + +#### What about buckets and measurements? + +If coming from InfluxDB Cloud Serverless or InfluxDB powered by the TSM storage engine, you're likely familiar +with the concepts _bucket_ and _measurement_. +_Bucket_ in TSM or InfluxDB Cloud Serverless is synonymous with +_database_ in {{% product-name %}}. +_Measurement_ in TSM or InfluxDB Cloud Serverless is synonymous with +_table_ in {{% product-name %}}. +{{% /note %}} ### Schema on write -When using InfluxDB, you define your schema as you write your data. -You don't need to create measurements (equivalent to a relational table) or -explicitly define the schema of the measurement. -Measurement schemas are defined by the schema of data as it is written to the measurement. +As you write data to InfluxDB, the data defines the table schema. +You don't need to create tables or +explicitly define the table schema. ### Important definitions @@ -121,7 +130,7 @@ While it may coincidentally work, it isn't supported. ### `influxctl` admin CLI -The [`influxctl` command line interface (CLI)](/influxdb/cloud-dedicated/reference/cli/influxctl/) +The [`influxctl` command line interface (CLI)](/influxdb/clustered/reference/cli/influxctl/) writes, queries, and performs administrative tasks, such as managing databases and authorization tokens in a cluster. @@ -143,7 +152,7 @@ The `/api/v2/write` v2-compatible endpoint works with existing InfluxDB 2.x tool InfluxDB client libraries are community-maintained, language-specific clients that interact with InfluxDB APIs. [InfluxDB v3 client libraries](/influxdb/clustered/reference/client-libraries/v3/) are the recommended client libraries for writing and querying data {{% product-name %}}. -They use the HTTP API to write data and use Flight gRPC to query data. +They use the HTTP API to write data and use InfluxDB's Flight gRPC API to query data. [InfluxDB v2 client libraries](/influxdb/clustered/reference/client-libraries/v2/) can use `/api/v2` HTTP endpoints to manage resources such as buckets and API tokens, and write data in {{% product-name %}}. @@ -162,7 +171,7 @@ There are two types of tokens: administer your InfluxDB cluster. These are generated by the `influxctl` CLI and do not require any direct management. Management tokens authorize a user to perform tasks related to: - + - Account management - Database management - Database token management diff --git a/content/influxdb/clustered/get-started/write.md b/content/influxdb/clustered/get-started/write.md index e57658fb9..b6eb2337c 100644 --- a/content/influxdb/clustered/get-started/write.md +++ b/content/influxdb/clustered/get-started/write.md @@ -21,9 +21,11 @@ related: - /telegraf/v1/ --- -This tutorial walks you through the fundamental of creating **line protocol** data and writing it to InfluxDB. +This tutorial walks you through the fundamental of creating **line protocol** +data and writing it to InfluxDB. -InfluxDB provides many different options for ingesting or writing data, including the following: +InfluxDB provides many different options for ingesting or writing data, +including the following: - InfluxDB HTTP API (v1 and v2) - Telegraf @@ -31,15 +33,16 @@ InfluxDB provides many different options for ingesting or writing data, includin - `influx3` data CLI - InfluxDB client libraries -If using tools like Telegraf or InfluxDB client libraries, they can -build the line protocol for you, but it's good to understand how line protocol works. +If using tools like Telegraf or InfluxDB client libraries, they can build the +line protocol for you, but it's good to understand how line protocol works. ## Line protocol All data written to InfluxDB is written using **line protocol**, a text-based -format that lets you provide the necessary information to write a data point to InfluxDB. -_This tutorial covers the basics of line protocol, but for detailed information, -see the [Line protocol reference](/influxdb/clustered/reference/syntax/line-protocol/)._ +format that lets you provide the necessary information to write a data point to +InfluxDB. _This tutorial covers the basics of line protocol, but for detailed +information, see the +[Line protocol reference](/influxdb/clustered/reference/syntax/line-protocol/)._ ### Line protocol elements @@ -47,8 +50,8 @@ Each line of line protocol contains the following elements: {{< req type="key" >}} -- {{< req "\*" >}} **measurement**: String that identifies the - [measurement](/influxdb/clustered/reference/glossary/#measurement) to store the data in. +- {{< req "\*" >}} **measurement**: A string that identifies the + [table](/influxdb/clustered/reference/glossary/#table) to store the data in. - **tag set**: Comma-delimited list of key value pairs, each representing a tag. Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._ - {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field. @@ -65,12 +68,15 @@ Each line of line protocol contains the following elements: #### Line protocol element parsing + + - **measurement**: Everything before the _first unescaped comma before the first whitespace_. - **tag set**: Key-value pairs between the _first unescaped comma_ and the _first unescaped whitespace_. - **field set**: Key-value pairs between the _first and second unescaped whitespaces_. - **timestamp**: Integer value after the _second unescaped whitespace_. - Lines are separated by the newline character (`\n`). - Line protocol is whitespace sensitive. +Line protocol is whitespace sensitive. + --- @@ -88,7 +94,9 @@ Consider a use case where you collect data from sensors in your home. Each sensor collects temperature, humidity, and carbon monoxide readings. To collect this data, use the following schema: -- **measurement**: `home` + + +- **measurement**: `home` - **tags** - `room`: Living Room or Kitchen - **fields** @@ -96,8 +104,9 @@ To collect this data, use the following schema: - `hum`: percent humidity (float) - `co`: carbon monoxide in parts per million (integer) - **timestamp**: Unix timestamp in _second_ precision + -Data is collected hourly beginning at +Data is collected hourly beginning at {{% influxdb/custom-timestamps-span %}}**2022-01-01T08:00:00Z (UTC)** until **2022-01-01T20:00:00Z (UTC)**{{% /influxdb/custom-timestamps-span %}}. The resulting line protocol would look something like the following: @@ -138,7 +147,7 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 ## Write line protocol to InfluxDB -The following examples show how to write the +The following examples show how to write the [sample data](#home-sensor-data-line-protocol), already in line protocol format, to an {{% product-name %}} database. @@ -151,6 +160,7 @@ credentials (**URL**, **organization**, and **token**) are provided by {{% /note %}} {{< tabs-wrapper >}} + {{% tabs %}} [influxctl CLI](#) [Telegraf](#) @@ -162,7 +172,9 @@ credentials (**URL**, **organization**, and **token**) are provided by [C#](#) [Java](#) {{% /tabs %}} + {{% tab-content %}} + Use the [`influxctl write` command](/influxdb/clustered/reference/cli/influxctl/write/) @@ -178,6 +190,7 @@ Provide the following: {{% influxdb/custom-timestamps %}} {{% code-placeholders "get-started" %}} + ```sh influxctl write \ --database get-started \ @@ -213,10 +226,14 @@ home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200' {{% /code-placeholders %}} {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} Use [Telegraf](/telegraf/v1/) to consume line protocol, @@ -257,7 +274,9 @@ and then write it to {{< product-name >}}. EOF ``` -3. Run the following command to generate a Telegraf configuration file (`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2` plugins: +3. Run the following command to generate a Telegraf configuration file + (`./telegraf.conf`) that enables the `inputs.file` and `outputs.influxdb_v2` + plugins: ```sh telegraf --sample-config \ @@ -268,8 +287,9 @@ and then write it to {{< product-name >}}. 4. In your editor, open `./telegraf.conf` and configure the following: - - **`file` input plugin**: In the `[[inputs.file]].files` list, replace `"/tmp/metrics.out"` with your sample data filename. - If Telegraf can't find a file when started, it stops processing and exits. + - **`file` input plugin**: In the `[[inputs.file]].files` list, replace + `"/tmp/metrics.out"` with your sample data filename. If Telegraf can't + find a file when started, it stops processing and exits. ```toml [[inputs.file]] @@ -281,8 +301,6 @@ and then write it to {{< product-name >}}. @@ -307,23 +325,20 @@ and then write it to {{< product-name >}}. The example configuration uses the following InfluxDB credentials: - - **`urls`**: an array containing your **`INFLUX_HOST`** environment variable + - **`urls`**: an array containing your **`INFLUX_HOST`** environment + variable - **`token`**: your **`INFLUX_TOKEN`** environment variable - **`organization`**: an empty string (InfluxDB ignores this parameter) - **`bucket`**: the name of the database to write to @@ -331,7 +346,8 @@ and then write it to {{< product-name >}}. 5. To write the data, start the `telegraf` daemon with the following options: - `--config`: Specifies the path of the configuration file. - - `--once`: Runs a single Telegraf collection cycle for the configured inputs and outputs, and then exits. + - `--once`: Runs a single Telegraf collection cycle for the configured + inputs and outputs, and then exits. Enter the following command in your terminal: @@ -351,22 +367,29 @@ Telegraf and its plugins provide many options for reading and writing data. To learn more, see how to [use Telegraf to write data](/influxdb/clustered/write-data/use-telegraf/). {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} Write data with your existing workloads that already use the InfluxDB v1 `/write` API endpoint. {{% note %}} -If migrating data from InfluxDB 1.x, see the [Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/clustered/guides/migrate-data/migrate-1x-to-clustered/) guide. +If migrating data from InfluxDB 1.x, see the +[Migrate data from InfluxDB 1.x to InfluxDB {{% product-name %}}](/influxdb/clustered/guides/migrate-data/migrate-1x-to-clustered/) guide. {{% /note %}} -To write data to InfluxDB using the [InfluxDB v1 HTTP API](/influxdb/clustered/reference/api/), send a -request to the [InfluxDB API `/write` endpoint](/influxdb/clustered/api/#operation/PostLegacyWrite) using the `POST` request method. +To write data to InfluxDB using the +[InfluxDB v1 HTTP API](/influxdb/clustered/reference/api/), send a +request to the +[InfluxDB API `/write` endpoint](/influxdb/clustered/api/#operation/PostLegacyWrite) using the `POST` request method. {{% api-endpoint endpoint="https://{{< influxdb/host >}}/write" method="post" api-ref="/influxdb/clustered/api/#operation/PostLegacyWrite"%}} @@ -392,7 +415,7 @@ to InfluxDB: {{% code-placeholders "DATABASE_TOKEN" %}} ```sh -curl --silent -w "%{response_code}: ${errormsg}\n" \ +response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \ "https://{{< influxdb/host >}}/write?db=get-started&precision=s" \ --header "Authorization: Bearer DATABASE_TOKEN" \ --header "Content-type: text/plain; charset=utf-8" \ @@ -424,7 +447,19 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600 home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600 home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200 home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 -" +") + +# Format the response code and error message output. +response_code=${response%%:*} +errormsg=${response#*:} + +# Remove leading and trailing whitespace from errormsg +errormsg=$(echo "${errormsg}" | tr -d '[:space:]') + +echo "$response_code" +if [[ $errormsg ]]; then + echo "$errormsg" +fi ``` {{% /code-placeholders %}} @@ -440,23 +475,31 @@ If successful, the output is an HTTP `204 No Content` status code. ``` -204: +204 ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -To write data to InfluxDB using the [InfluxDB v2 HTTP API](/influxdb/clustered/reference/api/), send a -request to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method. +To write data to InfluxDB using the +[InfluxDB v2 HTTP API](/influxdb/clustered/reference/api/), send a request +to the InfluxDB API `/api/v2/write` endpoint using the `POST` request method. -{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write" method="post" api-ref="/influxdb/clustered/api/#operation/PostWrite" >}} +{{< api-endpoint endpoint="https://{{< influxdb/host >}}/api/v2/write" +method="post" api-ref="/influxdb/clustered/api/#operation/PostWrite" >}} Include the following with your request: + + - **Headers**: - **Authorization**: Bearer - **Content-Type**: text/plain; charset=utf-8 @@ -465,18 +508,24 @@ Include the following with your request: - **bucket**: InfluxDB database name - **precision**:[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) (default is `ns`) - **Request body**: Line protocol as plain text + {{% note %}} -The {{% product-name %}} v2 API `/api/v2/write` endpoint supports `Bearer` and `Token` authorization schemes and you can use either scheme to pass a database token in your request. -For more information about HTTP API token schemes, see how to [authenticate API requests](/influxdb/clustered/guides/api-compatibility/v2/). +The {{% product-name %}} v2 API `/api/v2/write` endpoint supports +`Bearer` and `Token` authorization schemes and you can use either scheme to pass +a database token in your request. +For more information about HTTP API token +schemes, see how to +[authenticate API requests](/influxdb/clustered/guides/api-compatibility/v2/). {{% /note %}} The following example uses cURL and the InfluxDB v2 API to write line protocol to InfluxDB: {{% code-placeholders "DATABASE_TOKEN"%}} + ```sh -curl --silent -w "%{response_code}: %{errormsg}\n" \ +response=$(curl --silent --write-out "%{response_code}:%{errormsg}" \ "https://{{< influxdb/host >}}/api/v2/write?bucket=get-started&precision=s" \ --header "Authorization: Bearer DATABASE_TOKEN" \ --header "Content-Type: text/plain; charset=utf-8" \ @@ -508,7 +557,19 @@ home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600 home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600 home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200 home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200 -" +") + +# Format the response code and error message output. +response_code=${response%%:*} +errormsg=${response#*:} + +# Remove leading and trailing whitespace from errormsg +errormsg=$(echo "${errormsg}" | tr -d '[:space:]') + +echo "$response_code" +if [[ $errormsg ]]; then + echo "$errormsg" +fi ``` {{% /code-placeholders %}} @@ -524,14 +585,18 @@ If successful, the output is an HTTP `204 No Content` status code. ``` -204: +204 ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} To write data to {{% product-name %}} using Python, use the @@ -541,141 +606,156 @@ dependencies to your current project. 1. Create a module directory and navigate into it--for example: - + - ```bash - mkdir -p influxdb_py_client && cd influxdb_py_client - ``` + ```bash + mkdir -p influxdb_py_client && cd influxdb_py_client + ``` -2. Setup your Python virtual environment. - Inside of your module directory: +2. Setup your Python virtual environment. + Inside of your module directory: - + - ```bash - python -m venv envs/virtual-env - ``` + ```bash + python -m venv envs/virtual-env + ``` 3. Activate the virtual environment. - + - ```bash - source ./envs/virtual-env/bin/activate - ``` + ```bash + source ./envs/virtual-env/bin/activate + ``` -4. Install the client library package: +4. Install the client library package: - + - ```bash - pip install influxdb3-python - ``` + ```bash + pip install influxdb3-python + ``` - The `influxdb3-python` package provides the `influxdb_client_3` module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data returned from queries. + The `influxdb3-python` package provides the `influxdb_client_3` module and + also installs the + [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for + working with Arrow data returned from queries. -5. In your terminal or editor, create a new file for your code--for example: `write.py`. +5. In your terminal or editor, create a new file for your code--for example: + `write.py`. - + - ```bash - touch write.py - ``` + ```bash + touch write.py + ``` -6. Inside of `write.py`, enter the following sample code: +6. Inside of `write.py`, enter the following sample code: - ```py - from influxdb_client_3 import InfluxDBClient3 - import os + ```py + from influxdb_client_3 import InfluxDBClient3 + import os - # INFLUX_TOKEN is an environment variable you assigned to your - # database WRITE token value. - token = os.getenv('INFLUX_TOKEN') + # INFLUX_TOKEN is an environment variable you assigned to your + # database WRITE token value. + token = os.getenv('INFLUX_TOKEN') - # host is the URL without protocol or trailing slash - client = InfluxDBClient3( - host='{{< influxdb/host >}}', - org='', - token=token, - database='get-started' - ) + # host is the URL without protocol or trailing slash + client = InfluxDBClient3( + host='{{< influxdb/host >}}', + org='', + token=token, + database='get-started' + ) - lines = [ - "home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000", - "home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000", - "home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600", - "home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600", - "home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200", - "home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200", - "home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800", - "home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800", - "home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400", - "home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400", - "home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000", - "home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000", - "home,room=Living\ Room temp=22.3,hum=36.1,co=0i 1641045600", - "home,room=Kitchen temp=22.8,hum=36.3,co=1i 1641045600", - "home,room=Living\ Room temp=22.3,hum=36.1,co=1i 1641049200", - "home,room=Kitchen temp=22.7,hum=36.2,co=3i 1641049200", - "home,room=Living\ Room temp=22.4,hum=36.0,co=4i 1641052800", - "home,room=Kitchen temp=22.4,hum=36.0,co=7i 1641052800", - "home,room=Living\ Room temp=22.6,hum=35.9,co=5i 1641056400", - "home,room=Kitchen temp=22.7,hum=36.0,co=9i 1641056400", - "home,room=Living\ Room temp=22.8,hum=36.2,co=9i 1641060000", - "home,room=Kitchen temp=23.3,hum=36.9,co=18i 1641060000", - "home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600", - "home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600", - "home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200", - "home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200" - ] + lines = [ + "home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000", + "home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000", + "home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600", + "home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600", + "home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200", + "home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200", + "home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800", + "home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800", + "home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400", + "home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400", + "home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000", + "home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000", + "home,room=Living\ Room temp=22.3,hum=36.1,co=0i 1641045600", + "home,room=Kitchen temp=22.8,hum=36.3,co=1i 1641045600", + "home,room=Living\ Room temp=22.3,hum=36.1,co=1i 1641049200", + "home,room=Kitchen temp=22.7,hum=36.2,co=3i 1641049200", + "home,room=Living\ Room temp=22.4,hum=36.0,co=4i 1641052800", + "home,room=Kitchen temp=22.4,hum=36.0,co=7i 1641052800", + "home,room=Living\ Room temp=22.6,hum=35.9,co=5i 1641056400", + "home,room=Kitchen temp=22.7,hum=36.0,co=9i 1641056400", + "home,room=Living\ Room temp=22.8,hum=36.2,co=9i 1641060000", + "home,room=Kitchen temp=23.3,hum=36.9,co=18i 1641060000", + "home,room=Living\ Room temp=22.5,hum=36.3,co=14i 1641063600", + "home,room=Kitchen temp=23.1,hum=36.6,co=22i 1641063600", + "home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641067200", + "home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641067200" + ] - client.write(lines,write_precision='s') - ``` + client.write(lines,write_precision='s') + ``` - The sample does the following: + The sample does the following: - 1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module. - 2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB client - configured with the following credentials: + 1. Imports the `InfluxDBClient3` object from the `influxdb_client_3` module. + 2. Calls the `InfluxDBClient3()` constructor to instantiate an InfluxDB + client configured with the following credentials: - - **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL without protocol or trailing slash) - - **`org`**: an empty or arbitrary string (InfluxDB ignores this parameter) - - **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens) - with write access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ - - **`database`**: the name of the {{% product-name %}} database to write to - - 3. Defines a list of line protocol strings where each string represents a data record. - 4. Calls the `client.write()` method with the line protocol record list and write options. + - **`host`**: {{% product-name omit=" Clustered" %}} cluster hostname (URL + without protocol or trailing slash) + - **`org`**: an empty or arbitrary string (InfluxDB ignores this + parameter) + - **`token`**: a + [database token](/influxdb/clustered/admin/tokens/#database-tokens) + with write access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ + - **`database`**: the name of the {{% product-name %}} database to write + to - **Because the timestamps in the sample line protocol are in second - precision, the example passes the `write_precision='s'` option - to set the [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.** + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the `client.write()` method with the line protocol record list and + write options. -6. To execute the module and write line protocol to your {{% product-name %}} - database, enter the following command in your terminal: - - + **Because the timestamps in the sample line protocol are in second + precision, the example passes the `write_precision='s'` option to set the + [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) + to seconds.** - ```bash - python write.py - ``` +7. To execute the module and write line protocol to your {{% product-name %}} + database, enter the following command in your terminal: + + + + ```bash + python write.py + ``` {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -To write data to {{% product-name %}} using Go, use the -InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go). +To write data to {{% product-name %}} using Go, use the InfluxDB v3 +[influxdb3-go client library package](https://github.com/InfluxCommunity/influxdb3-go). -1. Inside of your project directory, create a new module directory and navigate into it. +1. Inside of your project directory, create a new module directory and navigate + into it. @@ -722,14 +803,14 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu // database WRITE token value. token := os.Getenv("INFLUX_TOKEN") database := os.Getenv("INFLUX_DATABASE") - + // Initialize a client with URL and token, // and set the timestamp precision for writes. client, err := influxdb3.New(influxdb3.ClientConfig{ Host: "https://{{< influxdb/host >}}", Token: token, Database: database, - WriteOptions: &influxdb3.WriteOptions{Precision: lineprotocol.Second}, + WriteOptions: &influxdb3.WriteOptions{Precision: lineprotocol.Second}, }) // Close the client when the function returns. @@ -772,7 +853,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu `home,room=Living\ Room temp=22.2,hum=36.4,co=17i 1641167200`, `home,room=Kitchen temp=22.7,hum=36.5,co=26i 1641167200`, } - + // Iterate over the lines array and write each line // separately to InfluxDB for _, record := range lines { @@ -785,7 +866,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu if err != nil { panic(err) } - + fmt.Println("Data has been written successfully.") return nil } @@ -794,42 +875,51 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample does the following: 1. Imports required packages. - 2. Defines a `WriteLineProtocol()` function that does the following: - - 1. To instantiate the client, calls the `influxdb3.New(influxdb3.ClientConfig)` function and passes the following: + + 1. To instantiate the client, calls the + `influxdb3.New(influxdb3.ClientConfig)` function and passes the + following: + - **`Host`**: the {{% product-name omit=" Clustered" %}} cluster URL - **`Database`**: The name of your {{% product-name %}} database - - **`Token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ - - **`WriteOptions`**: `influxdb3.WriteOptions` options for writing to InfluxDB. + - **`Token`**: a + [database token](/influxdb/clustered/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a + secret store or environment variable to avoid exposing the raw + token string._ + - **`WriteOptions`**: `influxdb3.WriteOptions` options for writing + to InfluxDB. **Because the timestamps in the sample line protocol are in second - precision, the example passes the `Precision: lineprotocol.Second` option - to set the [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.** - - 2. Defines a deferred function that closes the client when the function returns. - + precision, the example passes the `Precision: lineprotocol.Second` + option to set the + [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) + to seconds.** + + 2. Defines a deferred function that closes the client when the function + returns. 3. Defines an array of line protocol strings where each string represents a data record. - - 4. Iterates through the array of line protocol and calls the - write client's `Write()` method - to write each line of line protocol separately to InfluxDB. + 4. Iterates through the array of line protocol and calls the write + client's `Write()` method to write each line of line protocol + separately to InfluxDB. -5. In your editor, create a `main.go` file and enter the following sample code that calls the `WriteLineProtocol()` function: +5. In your editor, create a `main.go` file and enter the following sample code + that calls the `WriteLineProtocol()` function: ```go package main // Module main function - func main() { + func main() { WriteLineProtocol() } ``` -6. In your terminal, enter the following command to install the packages listed in `imports`, build the `influxdb_go_client` module, and execute the `main()` function: +6. In your terminal, enter the following command to install the packages listed + in `imports`, build the `influxdb_go_client` module, and execute the + `main()` function: @@ -840,21 +930,28 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The program writes the line protocol to your {{% product-name %}} database. {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} {{% influxdb/custom-timestamps %}} + -1. If you haven't already, follow the instructions for [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) for your system. -2. In your terminal, enter the following command to create a `influxdb_js_client` directory for your project: +1. If you haven't already, follow the instructions for + [Downloading and installing Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) + for your system. +2. In your terminal, enter the following command to create a + `influxdb_js_client` directory for your project: ```bash mkdir influxdb_js_client && cd influxdb_js_client ``` -3. Inside of `influxdb_js_client`, enter the following command to initialize a package. - This example configures the package to use [ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders). +3. Inside of `influxdb_js_client`, enter the following command to initialize a + package. This example configures the package to use + [ECMAScript modules (ESM)](https://nodejs.org/api/packages.html#modules-loaders). @@ -862,7 +959,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu npm init -y; npm pkg set type="module" ``` -4. Install the `@influxdata/influxdb3-client` JavaScript client library as a dependency to your project. +4. Install the `@influxdata/influxdb3-client` JavaScript client library as a + dependency to your project. @@ -882,31 +980,31 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ```js // write.js - import { InfluxDBClient } from "@influxdata/influxdb3-client"; + import { InfluxDBClient } from '@influxdata/influxdb3-client'; /** - * Set InfluxDB credentials. - */ - const host = "https://cluster-id.influxdb.io"; - const database = "get-started"; + * Set InfluxDB credentials. + */ + const host = 'https://cluster-id.influxdb.io'; + const database = 'get-started'; /** - * INFLUX_TOKEN is an environment variable you assigned to your - * WRITE token value. - */ + * INFLUX_TOKEN is an environment variable you assigned to your + * WRITE token value. + */ const token = process.env.INFLUX_TOKEN; /** - * Write line protocol to InfluxDB using the JavaScript client library. - */ + * Write line protocol to InfluxDB using the JavaScript client library. + */ export async function writeLineProtocol() { /** - * Instantiate an InfluxDBClient - */ + * Instantiate an InfluxDBClient + */ const client = new InfluxDBClient({ host, token }); /** - * Define line protocol records to write. - */ + * Define line protocol records to write. + */ const records = [ `home,room=Living\\ Room temp=21.1,hum=35.9,co=0i 1641124000`, `home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641124000`, @@ -937,20 +1035,21 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ]; /** - * Creates an array that contains separate write request promises - * for all the records. - */ + * Creates an array that contains separate write request promises + * for all the records. + */ const writePromises = records.map((record) => { - return client.write(record, database, "", { precision: "s" }) - .then(() => `Data has been written successfully: ${record}`, - () => `Failed writing data: ${record}`); + return client.write(record, database, '', { precision: 's' }).then( + () => `Data has been written successfully: ${record}`, + () => `Failed writing data: ${record}` + ); }); /** - * Wait for all the write promises to settle, and then output the results. - */ + * Wait for all the write promises to settle, and then output the results. + */ const writeResults = await Promise.allSettled(writePromises); - writeResults.forEach(write => console.log(write.value)); + writeResults.forEach((write) => console.log(write.value)); /** Close the client to release resources. */ await client.close(); @@ -960,39 +1059,52 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample code does the following: 1. Imports the `InfluxDBClient` class. - 2. Calls the `new InfluxDBClient()` constructor and passes a `ClientOptions` object to instantiate a client configured - with InfluxDB credentials. + 2. Calls the `new InfluxDBClient()` constructor and passes a + `ClientOptions` object to instantiate a client configured with InfluxDB + credentials. - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`token`**: a + [database token](/influxdb/clustered/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ + + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the client's `write()` method for each record, defines the success + or failure message to return, and collects the pending promises into the + `writePromises` array. Each call to `write()` passes the following + arguments: - 3. Defines a list of line protocol strings where each string represents a data record. - 4. Calls the client's `write()` method for each record, defines the success or failure message to return, and collects the pending promises into the `writePromises` array. - Each call to `write()` passes the following arguments: - - **`record`**: the line protocol record - - **`database`**: the name of the {{% product-name %}} database to write to - - **`{precision}`**: a `WriteOptions` object that sets the `precision` value. + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`{precision}`**: a `WriteOptions` object that sets the `precision` + value. **Because the timestamps in the sample line protocol are in second - precision, the example passes `s` as the `precision` value to set the write - [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.** + precision, the example passes `s` as the `precision` value to set the + write + [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) + to seconds.** + + 5. Calls `Promise.allSettled()` with the promises array to pause execution + until the promises have completed, and then assigns the array containing + success and failure messages to a `writeResults` constant. + 6. Iterates over and prints the messages in `writeResults`. + 7. Closes the client to release resources. - 5. Calls `Promise.allSettled()` with the promises array to pause execution until the promises have completed, and then assigns the array containing success and failure messages to a `writeResults` constant. - 7. Iterates over and prints the messages in `writeResults`. - 8. Closes the client to release resources. 7. In your terminal or editor, create an `index.js` file. -8. Inside of `index.js`, enter the following sample code to import and call `writeLineProtocol()`: +8. Inside of `index.js`, enter the following sample code to import and call + `writeLineProtocol()`: ```js // index.js - import { writeLineProtocol } from "./write.js"; + import { writeLineProtocol } from './write.js'; /** - * Execute the client functions. - */ + * Execute the client functions. + */ async function main() { /** Write line protocol data to InfluxDB. */ await writeLineProtocol(); @@ -1010,13 +1122,21 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu ``` {{% /influxdb/custom-timestamps %}} + + {{% /tab-content %}} {{% tab-content %}} + + {{% influxdb/custom-timestamps %}} -1. If you haven't already, follow the [Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download) to install .NET and the `dotnet` CLI. -2. In your terminal, create an executable C# project using the .NET **console** template. + +1. If you haven't already, follow the + [Microsoft.com download instructions](https://dotnet.microsoft.com/en-us/download) + to install .NET and the `dotnet` CLI. +2. In your terminal, create an executable C# project using the .NET **console** + template. @@ -1024,15 +1144,16 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu dotnet new console --name influxdb_csharp_client ``` -3. Change into the generated `influxdb_csharp_client` directory. - +3. Change into the generated `influxdb_csharp_client` directory. + ```sh cd influxdb_csharp_client ``` -4. Run the following command to install the latest version of the InfluxDB v3 C# client library. +4. Run the following command to install the latest version of the InfluxDB v3 + C# client library. @@ -1040,7 +1161,8 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu dotnet add package InfluxDB3.Client ``` -5. In your editor, create a `Write.cs` file and enter the following sample code: +5. In your editor, create a `Write.cs` file and enter the following sample + code: ```c# // Write.cs @@ -1057,7 +1179,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu /** * Writes line protocol to InfluxDB using the C# .NET client * library. - */ + */ public static async Task WriteLines() { // Set InfluxDB credentials @@ -1075,7 +1197,7 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu using var client = new InfluxDBClient( host, token: token, database: database); - /** + /** * Define an array of line protocol strings to write. * Include an additional backslash to preserve backslashes * and prevent interpretation of escape sequences---for example, @@ -1125,25 +1247,34 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu The sample does the following: - 1. Calls the `new InfluxDBClient()` constructor to instantiate a client configured - with InfluxDB credentials. + 1. Calls the `new InfluxDBClient()` constructor to instantiate a client + configured with InfluxDB credentials. - - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`database`**: the name of the {{% product-name %}} database to write to - - **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`token`**: a + [database token](/influxdb/clustered/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ - _Instantiating the client with the `using` statement ensures that the client is disposed of when it's no longer needed._ + _Instantiating the client with the `using` statement ensures that the + client is disposed of when it's no longer needed._ - 2. Defines an array of line protocol strings where each string represents a data record. - 3. Calls the client's `WriteRecordAsync()` method to write each line protocol record to InfluxDB. + 2. Defines an array of line protocol strings where each string represents a + data record. + 3. Calls the client's `WriteRecordAsync()` method to write each line + protocol record to InfluxDB. - **Because the timestamps in the sample line protocol are in second - precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs) - to the `precision:` option to set the[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.** + **Because the timestamps in the sample line protocol are in second + precision, the example passes the + [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-csharp/blob/main/Client/Write/WritePrecision.cs) + to the `precision:` option to set + the[timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) + to seconds.** -6. In your editor, open the `Program.cs` file and replace its contents with the following: +6. In your editor, open the `Program.cs` file and replace its contents with the + following: ```c# // Program.cs @@ -1162,30 +1293,36 @@ InfluxDB v3 [influxdb3-go client library package](https://github.com/InfluxCommu } ``` - The `Program` class shares the same `InfluxDBv3` namespace as the `Write` class you defined in the preceding step - and defines a `Main()` function that calls `Write.WriteLineProtocol()`. - The `dotnet` CLI recognizes `Program.Main()` as the entry point for your program. + The `Program` class shares the same `InfluxDBv3` namespace as the `Write` + class you defined in the preceding step and defines a `Main()` function that + calls `Write.WriteLineProtocol()`. The `dotnet` CLI recognizes + `Program.Main()` as the entry point for your program. -7. To build and execute the program and write the line protocol to your {{% product-name %}} database, enter the following command in your terminal: +7. To build and execute the program and write the line protocol to your + {{% product-name %}} database, enter the following command in your terminal: - + - ```sh - dotnet run - ``` - -{{% /influxdb/custom-timestamps %}} -{{% /tab-content %}} -{{% tab-content %}} -{{% influxdb/custom-timestamps %}} - + ```sh + dotnet run + ``` + + + + {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} + {{% tab-content %}} + {{% influxdb/custom-timestamps %}} + _The tutorial assumes using Maven version 3.9 and Java version >= 15._ -1. If you haven't already, follow the instructions to download and install the [Java JDK](https://www.oracle.com/java/technologies/downloads/) and [Maven](https://maven.apache.org/download.cgi) for your system. +1. If you haven't already, follow the instructions to download and install the + [Java JDK](https://www.oracle.com/java/technologies/downloads/) and + [Maven](https://maven.apache.org/download.cgi) for your system. 2. In your terminal or editor, use Maven to generate a project--for example: - ```sh + ```bash mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate \ -DarchetypeArtifactId="maven-archetype-quickstart" \ -DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4" \ @@ -1194,9 +1331,11 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ ``` Maven creates the `` directory (`./influxdb_java_client`) that - contains a `pom.xml` and scaffolding for your `com.influxdbv3.influxdb_java_client` Java application. + contains a `pom.xml` and scaffolding for your + `com.influxdbv3.influxdb_java_client` Java application. -3. In your terminal or editor, change into the `./influxdb_java_client` directory--for example: +3. In your terminal or editor, change into the `./influxdb_java_client` + directory--for example: @@ -1204,7 +1343,8 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ cd ./influxdb_java_client ``` -4. In your editor, open the `pom.xml` Maven configuration file and add the `com.influxdb.influxdb3-java` client library into `dependencies`. +4. In your editor, open the `pom.xml` Maven configuration file and add the + `com.influxdb.influxdb3-java` client library into `dependencies`. ```pom ... @@ -1218,15 +1358,19 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ ... ``` -5. To validate your `pom.xml`, run Maven's `validate` command--for example, enter the following in your terminal: - + +5. To check your `pom.xml` for problems, run Maven's `validate` command--for example, + enter the following in your terminal: + ```bash mvn validate ``` -6. In your editor, navigate to the `./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a `Write.java` file. +6. In your editor, navigate to the + `./influxdb_java_client/src/main/java/com/influxdbv3` directory and create a + `Write.java` file. 7. In `Write.java`, enter the following sample code: ```java @@ -1241,7 +1385,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ /** * Writes line protocol to InfluxDB using the Java client * library. - */ + */ public final class Write { /** * Write data to InfluxDB v3. @@ -1254,7 +1398,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ * @throws Exception */ public static void writeLineProtocol() throws Exception { - + // Set InfluxDB credentials final String host = "https://{{< influxdb/host >}}"; final String database = "get-started"; @@ -1318,7 +1462,7 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ The sample code does the following: 1. Imports the following classes: - + - `java.util.List`; - `com.influxdb.v3.client.InfluxDBClient` - `com.influxdb.v3.client.write.WriteParameters` @@ -1328,19 +1472,27 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ with InfluxDB credentials. - **`host`**: your {{% product-name omit=" Clustered" %}} cluster URL - - **`database`**: the name of the {{% product-name %}} database to write to - - **`token`**: a [database token](/influxdb/clustered/admin/tokens/#database-tokens) - with _write_ access to the specified database. - _Store this in a secret store or environment variable to avoid exposing the raw token string._ + - **`database`**: the name of the {{% product-name %}} database to write + to + - **`token`**: a + [database token](/influxdb/clustered/admin/tokens/#database-tokens) + with _write_ access to the specified database. _Store this in a secret + store or environment variable to avoid exposing the raw token string._ - 2. Defines a list of line protocol strings where each string represents a data record. - 3. Calls the client's `writeRecord()` method to write each record separately to InfluxDB. + 3. Defines a list of line protocol strings where each string represents a + data record. + 4. Calls the client's `writeRecord()` method to write each record + separately to InfluxDB. **Because the timestamps in the sample line protocol are in second - precision, the example passes the [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java) - as the `precision` argument to set the write [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) to seconds.** + precision, the example passes the + [`WritePrecision.S` enum value](https://github.com/InfluxCommunity/influxdb3-java/blob/main/src/main/java/com/influxdb/v3/client/write/WritePrecision.java) + as the `precision` argument to set the write + [timestamp precision](/influxdb/clustered/reference/glossary/#timestamp-precision) + to seconds.** -8. In your editor, open the `App.java` file (created by Maven) and replace its contents with the following sample code: +8. In your editor, open the `App.java` file (created by Maven) and replace its + contents with the following sample code: ```java // App.java @@ -1363,10 +1515,13 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ } } ``` - - - The `App` class and `Write` class are part of the same `com.influxdbv3` package (your project **groupId**). + + - The `App` class and `Write` class are part of the same `com.influxdbv3` + package (your project **groupId**). - `App` defines a `main()` function that calls `Write.writeLineProtocol()`. -9. In your terminal or editor, use Maven to to install dependencies and compile the project code--for example: + +9. In your terminal or editor, use Maven to install dependencies and compile + the project code--for example: @@ -1374,58 +1529,62 @@ _The tutorial assumes using Maven version 3.9 and Java version >= 15._ mvn compile ``` -10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for example, using Maven: +10. In your terminal or editor, execute `App.main()` to write to InfluxDB--for + example, using Maven: - + - ```sh - mvn exec:java -Dexec.mainClass="com.influxdbv3.App" - ``` - -{{% /influxdb/custom-timestamps %}} -{{% /tab-content %}} -{{< /tabs-wrapper >}} + ```sh + mvn exec:java -Dexec.mainClass="com.influxdbv3.App" + ``` -If successful, the output is the success message; otherwise, error details and the failure message. + + + {{% /influxdb/custom-timestamps %}} + {{% /tab-content %}} + {{< /tabs-wrapper >}} + +If successful, the output is the success message; otherwise, error details and +the failure message. {{< expand-wrapper >}} {{% expand "View the written data" %}} {{% influxdb/custom-timestamps %}} -| time | room | co | hum | temp | +| time | room | co | hum | temp | | :------------------- | :---------- | --: | ---: | ---: | -| 2022-01-01T08:00:00Z | Kitchen | 0 | 35.9 | 21 | -| 2022-01-01T09:00:00Z | Kitchen | 0 | 36.2 | 23 | -| 2022-01-01T10:00:00Z | Kitchen | 0 | 36.1 | 22.7 | -| 2022-01-01T11:00:00Z | Kitchen | 0 | 36 | 22.4 | -| 2022-01-01T12:00:00Z | Kitchen | 0 | 36 | 22.5 | -| 2022-01-01T13:00:00Z | Kitchen | 1 | 36.5 | 22.8 | -| 2022-01-01T14:00:00Z | Kitchen | 1 | 36.3 | 22.8 | -| 2022-01-01T15:00:00Z | Kitchen | 3 | 36.2 | 22.7 | -| 2022-01-01T16:00:00Z | Kitchen | 7 | 36 | 22.4 | -| 2022-01-01T17:00:00Z | Kitchen | 9 | 36 | 22.7 | -| 2022-01-01T18:00:00Z | Kitchen | 18 | 36.9 | 23.3 | -| 2022-01-01T19:00:00Z | Kitchen | 22 | 36.6 | 23.1 | -| 2022-01-01T20:00:00Z | Kitchen | 26 | 36.5 | 22.7 | -| 2022-01-01T08:00:00Z | Living Room | 0 | 35.9 | 21.1 | -| 2022-01-01T09:00:00Z | Living Room | 0 | 35.9 | 21.4 | -| 2022-01-01T10:00:00Z | Living Room | 0 | 36 | 21.8 | -| 2022-01-01T11:00:00Z | Living Room | 0 | 36 | 22.2 | -| 2022-01-01T12:00:00Z | Living Room | 0 | 35.9 | 22.2 | -| 2022-01-01T13:00:00Z | Living Room | 0 | 36 | 22.4 | -| 2022-01-01T14:00:00Z | Living Room | 0 | 36.1 | 22.3 | -| 2022-01-01T15:00:00Z | Living Room | 1 | 36.1 | 22.3 | -| 2022-01-01T16:00:00Z | Living Room | 4 | 36 | 22.4 | -| 2022-01-01T17:00:00Z | Living Room | 5 | 35.9 | 22.6 | -| 2022-01-01T18:00:00Z | Living Room | 9 | 36.2 | 22.8 | -| 2022-01-01T19:00:00Z | Living Room | 14 | 36.3 | 22.5 | -| 2022-01-01T20:00:00Z | Living Room | 17 | 36.4 | 22.2 | +| 2022-01-01T08:00:00Z | Kitchen | 0 | 35.9 | 21 | +| 2022-01-01T09:00:00Z | Kitchen | 0 | 36.2 | 23 | +| 2022-01-01T10:00:00Z | Kitchen | 0 | 36.1 | 22.7 | +| 2022-01-01T11:00:00Z | Kitchen | 0 | 36 | 22.4 | +| 2022-01-01T12:00:00Z | Kitchen | 0 | 36 | 22.5 | +| 2022-01-01T13:00:00Z | Kitchen | 1 | 36.5 | 22.8 | +| 2022-01-01T14:00:00Z | Kitchen | 1 | 36.3 | 22.8 | +| 2022-01-01T15:00:00Z | Kitchen | 3 | 36.2 | 22.7 | +| 2022-01-01T16:00:00Z | Kitchen | 7 | 36 | 22.4 | +| 2022-01-01T17:00:00Z | Kitchen | 9 | 36 | 22.7 | +| 2022-01-01T18:00:00Z | Kitchen | 18 | 36.9 | 23.3 | +| 2022-01-01T19:00:00Z | Kitchen | 22 | 36.6 | 23.1 | +| 2022-01-01T20:00:00Z | Kitchen | 26 | 36.5 | 22.7 | +| 2022-01-01T08:00:00Z | Living Room | 0 | 35.9 | 21.1 | +| 2022-01-01T09:00:00Z | Living Room | 0 | 35.9 | 21.4 | +| 2022-01-01T10:00:00Z | Living Room | 0 | 36 | 21.8 | +| 2022-01-01T11:00:00Z | Living Room | 0 | 36 | 22.2 | +| 2022-01-01T12:00:00Z | Living Room | 0 | 35.9 | 22.2 | +| 2022-01-01T13:00:00Z | Living Room | 0 | 36 | 22.4 | +| 2022-01-01T14:00:00Z | Living Room | 0 | 36.1 | 22.3 | +| 2022-01-01T15:00:00Z | Living Room | 1 | 36.1 | 22.3 | +| 2022-01-01T16:00:00Z | Living Room | 4 | 36 | 22.4 | +| 2022-01-01T17:00:00Z | Living Room | 5 | 35.9 | 22.6 | +| 2022-01-01T18:00:00Z | Living Room | 9 | 36.2 | 22.8 | +| 2022-01-01T19:00:00Z | Living Room | 14 | 36.3 | 22.5 | +| 2022-01-01T20:00:00Z | Living Room | 17 | 36.4 | 22.2 | {{% /influxdb/custom-timestamps %}} {{% /expand %}} {{< /expand-wrapper >}} -**Congratulations!** You have written data to InfluxDB. -With data now stored in InfluxDB, let's query it. +**Congratulations!** You've written data to InfluxDB. +Next, learn how to query your data. {{< page-nav prev="/influxdb/clustered/get-started/setup/" next="/influxdb/clustered/get-started/query/" keepTab=true >}} diff --git a/content/influxdb/clustered/write-data/line protocol/client-libraries.md b/content/influxdb/clustered/write-data/line protocol/client-libraries.md deleted file mode 100644 index 797481813..000000000 --- a/content/influxdb/clustered/write-data/line protocol/client-libraries.md +++ /dev/null @@ -1,375 +0,0 @@ ---- -title: Use InfluxDB client libraries to write line protocol data -description: > - Use InfluxDB API clients to write line protocol data to InfluxDB Clustered. -menu: - influxdb_clustered: - name: Use client libraries - parent: Write line protocol - identifier: write-client-libs -weight: 103 -related: - - /influxdb/clustered/reference/syntax/line-protocol/ - - /influxdb/clustered/get-started/write/ ---- - -Use InfluxDB client libraries to build line protocol, and then write it to an -InfluxDB database. - -- [Construct line protocol](#construct-line-protocol) -- [Set up your project](#set-up-your-project) -- [Construct points and write line protocol](#construct-points-and-write-line-protocol) -- [Run the example](#run-the-example) - - [Home sensor data line protocol](#home-sensor-data-line-protocol) - -## Construct line protocol - -With a [basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/), -you can now construct line protocol and write data to InfluxDB. -Consider a use case where you collect data from sensors in your home. -Each sensor collects temperature, humidity, and carbon monoxide readings. -To collect this data, use the following schema: - -- **measurement**: `home` - - **tags** - - `room`: Living Room or Kitchen - - **fields** - - `temp`: temperature in °C (float) - - `hum`: percent humidity (float) - - `co`: carbon monoxide in parts per million (integer) - - **timestamp**: Unix timestamp in _second_ precision - -The following example shows how to construct and write points that follow this schema. - -## Set up your project - -The examples in this guide assume you followed [Set up InfluxDB](/influxdb/clustered/get-started/setup/) -and [Write data set up](/influxdb/clustered/get-started/write/#set-up-your-project-and-credentials) -instructions in [Get started](/influxdb/clustered/get-started/). - -After setting up InfluxDB and your project, you should have the following: - -- {{< product-name >}} credentials: - - - [Database](/influxdb/clustered/admin/databases/) - - [Database token](/influxdb/clustered/admin/tokens/#database-tokens) - - Cluster hostname - -- A directory for your project. - -- Credentials stored as environment variables or in a project configuration file--for example, a `.env` ("dotenv") file. - -- Client libraries installed for writing data to InfluxDB. - -The following example shows how to construct `Point` objects that follow the [example `home` schema](#example-home-schema), and then write the points as line protocol to an -{{% product-name %}} database. - -{{< tabs-wrapper >}} -{{% tabs %}} -[Go](#) -[Node.js](#) -[Python](#) -{{% /tabs %}} -{{% tab-content %}} - - -1. Install [Go 1.13 or later](https://golang.org/doc/install). - -2. Inside of your project directory, install the client package to your project dependencies. - - ```sh - go get github.com/influxdata/influxdb-client-go/v2 - ``` - - -{{% /tab-content %}} -{{% tab-content %}} - - -Inside of your project directory, install the `@influxdata/influxdb-client` InfluxDB v2 JavaScript client library. - -```sh -npm install --save @influxdata/influxdb-client -``` - - -{{% /tab-content %}} -{{% tab-content %}} - - -1. **Optional, but recommended**: Use [`venv`](https://docs.python.org/3/library/venv.html)) or [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual environment for installing and executing code--for example: - - Inside of your project directory, enter the following command using `venv` to create and activate a virtual environment for the project: - - ```sh - python3 -m venv envs/env1 && source ./envs/env1/bin/activate - ``` - -2. Install the [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), which provides the InfluxDB `influxdb_client_3` Python client library module and also installs the [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for working with Arrow data. - - ```sh - pip install influxdb3-python - ``` - - -{{% /tab-content %}} -{{< /tabs-wrapper >}} - -## Construct points and write line protocol - -{{< tabs-wrapper >}} -{{% tabs %}} -[Go](#) -[Node.js](#) -[Python](#) -{{% /tabs %}} -{{% tab-content %}} - - -1. Create a file for your module--for example: `write-point.go`. - -2. In `write-point.go`, enter the following sample code: - - ```go - package main - - import ( - "os" - "time" - "fmt" - "github.com/influxdata/influxdb-client-go/v2" - ) - - func main() { - // Set a log level constant - const debugLevel uint = 4 - - /** - * Define options for the client. - * Instantiate the client with the following arguments: - * - An object containing InfluxDB URL and token credentials. - * - Write options for batch size and timestamp precision. - **/ - clientOptions := influxdb2.DefaultOptions(). - SetBatchSize(20). - SetLogLevel(debugLevel). - SetPrecision(time.Second) - - client := influxdb2.NewClientWithOptions(os.Getenv("INFLUX_URL"), - os.Getenv("INFLUX_TOKEN"), - clientOptions) - - /** - * Create an asynchronous, non-blocking write client. - * Provide your InfluxDB org and database as arguments - **/ - writeAPI := client.WriteAPI(os.Getenv("INFLUX_ORG"), "get-started") - - // Get the errors channel for the asynchronous write client. - errorsCh := writeAPI.Errors() - - /** Create a point. - * Provide measurement, tags, and fields as arguments. - **/ - p := influxdb2.NewPointWithMeasurement("home"). - AddTag("room", "Kitchen"). - AddField("temp", 72.0). - AddField("hum", 20.2). - AddField("co", 9). - SetTime(time.Now()) - - // Define a proc for handling errors. - go func() { - for err := range errorsCh { - fmt.Printf("write error: %s\n", err.Error()) - } - }() - - // Write the point asynchronously - writeAPI.WritePoint(p) - - // Send pending writes from the buffer to the database. - writeAPI.Flush() - - // Ensure background processes finish and release resources. - client.Close() - } - ``` - -{{% /tab-content %}} -{{% tab-content %}} - - -1. Create a file for your module--for example: `write-point.js`. - -2. In `write-point.js`, enter the following sample code: - - ```js - 'use strict' - /** @module write - * Use the JavaScript client library for Node.js. to create a point and write it to InfluxDB - **/ - - import {InfluxDB, Point} from '@influxdata/influxdb-client' - - /** Get credentials from the environment **/ - const url = process.env.INFLUX_URL - const token = process.env.INFLUX_TOKEN - const org = process.env.INFLUX_ORG - - /** - * Instantiate a client with a configuration object - * that contains your InfluxDB URL and token. - **/ - const influxDB = new InfluxDB({url, token}) - - /** - * Create a write client configured to write to the database. - * Provide your InfluxDB org and database. - **/ - const writeApi = influxDB.getWriteApi(org, 'get-started') - - /** - * Create a point and add tags and fields. - * To add a field, call the field method for your data type. - **/ - const point1 = new Point('home') - .tag('room', 'Kitchen') - .floatField('temp', 72.0) - .floatField('hum', 20.2) - .intField('co', 9) - console.log(` ${point1}`) - - /** - * Add the point to the batch. - **/ - writeApi.writePoint(point1) - - /** - * Flush pending writes in the batch from the buffer and close the write client. - **/ - writeApi.close().then(() => { - console.log('WRITE FINISHED') - }) - ``` - -{{% /tab-content %}} -{{% tab-content %}} - - -1. Create a file for your module--for example: `write-point.py`. - -2. In `write-point.py`, enter the following sample code to write data in batching mode: - - ```python - import os - from influxdb_client_3 import Point, write_client_options, WritePrecision, WriteOptions, InfluxDBError - - # Create an array of points with tags and fields. - points = [Point("home") - .tag("room", "Kitchen") - .field("temp", 25.3) - .field('hum', 20.2) - .field('co', 9)] - - # With batching mode, define callbacks to execute after a successful or failed write request. - # Callback methods receive the configuration and data sent in the request. - def success(self, data: str): - print(f"Successfully wrote batch: data: {data}") - - def error(self, data: str, exception: InfluxDBError): - print(f"Failed writing batch: config: {self}, data: {data} due: {exception}") - - def retry(self, data: str, exception: InfluxDBError): - print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}") - - # Configure options for batch writing. - write_options = WriteOptions(batch_size=500, - flush_interval=10_000, - jitter_interval=2_000, - retry_interval=5_000, - max_retries=5, - max_retry_delay=30_000, - exponential_base=2) - - # Create an options dict that sets callbacks and WriteOptions. - wco = write_client_options(success_callback=success, - error_callback=error, - retry_callback=retry, - WriteOptions=write_options) - - # Instantiate a synchronous instance of the client with your - # InfluxDB credentials and write options. - with InfluxDBClient3(host=config['INFLUX_HOST'], - token=config['INFLUX_TOKEN'], - database=config['INFLUX_DATABASE'], - write_client_options=wco) as client: - - client.write(points, write_precision='s') - ``` - -{{% /tab-content %}} -{{< /tabs-wrapper >}} - -The sample code does the following: - -1. Instantiates a client configured with the InfluxDB URL and API token. - -2. Uses the client to instantiate a **write client** with credentials. - -3. Constructs a `Point` object with the [measurement](/influxdb/clustered/reference/glossary/#measurement) name (`"home"`). - -4. Adds a tag and fields to the point. - -5. Adds the point to a batch to be written to the database. - -6. Sends the batch to InfluxDB and waits for the response. - -7. Executes callbacks for the response, flushes the write buffer, and releases resources. - -## Run the example - -To run the sample and write the data to your InfluxDB Clustered database, enter the following command in your terminal: - -{{< code-tabs-wrapper >}} -{{% code-tabs %}} -[Go](#) -[Node.js](#) -[Python](#) -{{% /code-tabs %}} -{{% code-tab-content %}} - - -```sh -go run write-point.go -``` - - -{{% /code-tab-content %}} -{{% code-tab-content %}} - - - ```sh - node write-point.js - ``` - -{{% /code-tab-content %}} - -{{% code-tab-content %}} - - - ```sh - python write-point.py - ``` - -{{% /code-tab-content %}} -{{< /code-tabs-wrapper >}} - -The example logs the point as line protocol to stdout, and then writes the point to the database. -The line protocol is similar to the following: - -### Home sensor data line protocol - -```sh -home,room=Kitchen co=9i,hum=20.2,temp=72 1641024000 -``` diff --git a/content/influxdb/clustered/write-data/line protocol/influxctl-cli.md b/content/influxdb/clustered/write-data/line protocol/influxctl-cli.md deleted file mode 100644 index 7d251882e..000000000 --- a/content/influxdb/clustered/write-data/line protocol/influxctl-cli.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: Use the influxctl CLI to write line protocol data -description: > - Use the [`influxctl` CLI](/influxdb/clustered/reference/cli/influxctl/) - to write line protocol data to InfluxDB Clustered. -menu: - influxdb_clustered: - name: Use the influxctl CLI - parent: Write line protocol - identifier: write-influxctl -weight: 101 -related: - - /influxdb/clustered/reference/cli/influxctl/write/ - - /influxdb/clustered/reference/syntax/line-protocol/ - - /influxdb/clustered/get-started/write/ ---- - -Use the [`influxctl` CLI](/influxdb/clustered/reference/cli/influxctl/) -to write line protocol data to {{< product-name >}}. - -- [Construct line protocol](#construct-line-protocol) -- [Write the line protocol to InfluxDB](#write-the-line-protocol-to-influxdb) - -## Construct line protocol - -With a [basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/), -you can now construct line protocol and write data to InfluxDB. -Consider a use case where you collect data from sensors in your home. -Each sensor collects temperature, humidity, and carbon monoxide readings. -To collect this data, use the following schema: - -- **measurement**: `home` - - **tags** - - `room`: Living Room or Kitchen - - **fields** - - `temp`: temperature in °C (float) - - `hum`: percent humidity (float) - - `co`: carbon monoxide in parts per million (integer) - - **timestamp**: Unix timestamp in _second_ precision - -The following line protocol represent the schema described above: - -``` -home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000 -home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000 -home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600 -home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600 -home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200 -home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200 -home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800 -home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800 -home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400 -home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400 -home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000 -home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000 -``` - -For this tutorial, you can either pass this line protocol directly to the -`influxctl write` command as a string, via `stdin`, or you can save it to and read -it from a file. - -## Write the line protocol to InfluxDB - -Use the [`influxctl write` command](/influxdb/clustered/reference/cli/influxctl/write/) -to write the [home sensor sample data](#home-sensor-data-line-protocol) to your -{{< product-name omit=" Clustered" >}} cluster. -Provide the following: - -- The [database](/influxdb/clustered/admin/databases/) name using the `--database` flag -- A [database token](/influxdb/clustered/admin/tokens/#database-tokens) (with write permissions - on the target database) using the `--token` flag -- The timestamp precision as seconds (`s`) using the `--precision` flag -- [Line protocol](#construct-line-protocol). - Pass the line protocol in one of the following ways: - - - a string on the command line - - a path to a file that contains the query - - a single dash (`-`) to read the query from stdin - -{{< code-tabs-wrapper >}} -{{% code-tabs %}} -[string](#) -[file](#) -[stdin](#) -{{% /code-tabs %}} -{{% code-tab-content %}} - -{{% influxdb/custom-timestamps %}} -{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}} -```sh -influxctl write \ - --database DATABASE_NAME \ - --token DATABASE_TOKEN \ - --precision s \ - 'home,room=Living\ Room temp=21.1,hum=35.9,co=0i 1641024000 -home,room=Kitchen temp=21.0,hum=35.9,co=0i 1641024000 -home,room=Living\ Room temp=21.4,hum=35.9,co=0i 1641027600 -home,room=Kitchen temp=23.0,hum=36.2,co=0i 1641027600 -home,room=Living\ Room temp=21.8,hum=36.0,co=0i 1641031200 -home,room=Kitchen temp=22.7,hum=36.1,co=0i 1641031200 -home,room=Living\ Room temp=22.2,hum=36.0,co=0i 1641034800 -home,room=Kitchen temp=22.4,hum=36.0,co=0i 1641034800 -home,room=Living\ Room temp=22.2,hum=35.9,co=0i 1641038400 -home,room=Kitchen temp=22.5,hum=36.0,co=0i 1641038400 -home,room=Living\ Room temp=22.4,hum=36.0,co=0i 1641042000 -home,room=Kitchen temp=22.8,hum=36.5,co=1i 1641042000' -``` -{{% /code-placeholders %}} -{{% /influxdb/custom-timestamps %}} - -Replace the following: - -- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}: - Name of the database to write to. -- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: - Database token with write permissions on the target database. - -{{% /code-tab-content %}} -{{% code-tab-content %}} - -{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}} -```sh -influxctl write \ - --database DATABASE_NAME \ - --token DATABASE_TOKEN \ - --precision s \ - LINE_PROTOCOL_FILEPATH -``` -{{% /code-placeholders %}} - -Replace the following: - -- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}: - Name of the database to write to. -- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: - Database token with write permissions on the target database. -- {{% code-placeholder-key %}}`LINE_PROTOCOL_FILEPATH`{{% /code-placeholder-key %}}: - File path to the file containing the line protocol. Can be an absolute file path - or relative to the current working directory. - -{{% /code-tab-content %}} -{{% code-tab-content %}} - -{{% code-placeholders "DATABASE_(NAME|TOKEN)|(LINE_PROTOCOL_FILEPATH)" %}} -```sh -cat LINE_PROTOCOL_FILEPATH | influxctl write \ - --database DATABASE_NAME \ - --token DATABASE_TOKEN \ - --precision s \ - - -``` -{{% /code-placeholders %}} - -Replace the following: - -- {{% code-placeholder-key %}}`DATABASE_NAME`{{% /code-placeholder-key %}}: - Name of the database to write to. -- {{% code-placeholder-key %}}`DATABASE_TOKEN`{{% /code-placeholder-key %}}: - Database token with write permissions on the target database. -- {{% code-placeholder-key %}}`LINE_PROTOCOL_FILEPATH`{{% /code-placeholder-key %}}: - File path to the file containing the line protocol. Can be an absolute file path - or relative to the current working directory. - -{{% /code-tab-content %}} -{{< /code-tabs-wrapper >}} diff --git a/content/influxdb/clustered/write-data/line protocol/_index.md b/content/influxdb/clustered/write-data/line-protocol/_index.md similarity index 95% rename from content/influxdb/clustered/write-data/line protocol/_index.md rename to content/influxdb/clustered/write-data/line-protocol/_index.md index a95e0b0e6..025f4ec4a 100644 --- a/content/influxdb/clustered/write-data/line protocol/_index.md +++ b/content/influxdb/clustered/write-data/line-protocol/_index.md @@ -43,7 +43,7 @@ Each line of line protocol contains the following elements: {{< req type="key" >}} -- {{< req "\*" >}} **measurement**: String that identifies the [measurement](/influxdb/clustered/reference/glossary/#measurement) to store the data in. +- {{< req "\*" >}} **measurement**: A string that identifies the [table](/influxdb/clustered/reference/glossary/#table) to store the data in. - **tag set**: Comma-delimited list of key value pairs, each representing a tag. Tag keys and values are unquoted strings. _Spaces, commas, and equal characters must be escaped._ - {{< req "\*" >}} **field set**: Comma-delimited list of key value pairs, each representing a field. diff --git a/content/influxdb/clustered/write-data/line-protocol/client-libraries.md b/content/influxdb/clustered/write-data/line-protocol/client-libraries.md new file mode 100644 index 000000000..046e55ebe --- /dev/null +++ b/content/influxdb/clustered/write-data/line-protocol/client-libraries.md @@ -0,0 +1,463 @@ +--- +title: Use InfluxDB client libraries to write line protocol data +description: > + Use InfluxDB API clients to write points as line protocol data to InfluxDB + Clustered. +menu: + influxdb_clustered: + name: Use client libraries + parent: Write line protocol + identifier: write-client-libs +weight: 103 +related: + - /influxdb/clustered/reference/syntax/line-protocol/ + - /influxdb/clustered/get-started/write/ +--- + +Use InfluxDB client libraries to build time series points, and then write them +line protocol to an {{% product-name %}} database. + +- [Construct line protocol](#construct-line-protocol) + - [Example home schema](#example-home-schema) +- [Set up your project](#set-up-your-project) +- [Construct points and write line protocol](#construct-points-and-write-line-protocol) + +## Construct line protocol + +With a +[basic understanding of line protocol](/influxdb/clustered/write-data/line-protocol/), +you can construct line protocol data and write it to InfluxDB. + +All InfluxDB client libraries write data in line protocol format to InfluxDB. +Client library `write` methods let you provide data as raw line protocol or as +`Point` objects that the client library converts to line protocol. If your +program creates the data you write to InfluxDB, use the client library `Point` +interface to take advantage of type safety in your program. + +### Example home schema + +Consider a use case where you collect data from sensors in your home. Each +sensor collects temperature, humidity, and carbon monoxide readings. + +To collect this data, use the following schema: + + + +- **measurement**: `home` + - **tags** + - `room`: Living Room or Kitchen + - **fields** + - `temp`: temperature in °C (float) + - `hum`: percent humidity (float) + - `co`: carbon monoxide in parts per million (integer) + - **timestamp**: Unix timestamp in _second_ precision + + + +The following example shows how to construct and write points that follow the +`home` schema. + +## Set up your project + +The examples in this guide assume you followed +[Set up InfluxDB](/influxdb/clustered/get-started/setup/) and +[Write data set up](/influxdb/clustered/get-started/write/#set-up-your-project-and-credentials) +instructions in [Get started](/influxdb/clustered/get-started/). + +After setting up InfluxDB and your project, you should have the following: + +- {{< product-name >}} credentials: + + - [Database](/influxdb/clustered/admin/databases/) + - [Database token](/influxdb/clustered/admin/tokens/#database-tokens) + - Cluster hostname + +- A directory for your project. + +- Credentials stored as environment variables or in a project configuration + file--for example, a `.env` ("dotenv") file. + +- Client libraries installed for writing data to InfluxDB. + +The following example shows how to construct `Point` objects that follow the +[example `home` schema](#example-home-schema), and then write the data as line +protocol to an {{% product-name %}} database. + +The examples use InfluxDB v3 client libraries. For examples using InfluxDB v2 +client libraries to write data to InfluxDB v3, see +[InfluxDB v2 clients](/influxdb/clustered/reference/client-libraries/v2/). + +{{< tabs-wrapper >}} {{% tabs %}} [Go](#) [Node.js](#) [Python](#) {{% /tabs %}} +{{% tab-content %}} + +The following steps set up a Go project using the +[InfluxDB v3 Go client](https://github.com/InfluxCommunity/influxdb3-go/): + + + +1. Install [Go 1.13 or later](https://golang.org/doc/install). + +1. Create a directory for your Go module and change to the directory--for + example: + + ```sh + mkdir iot-starter-go && cd $_ + ``` + +1. Initialize a Go module--for example: + + ```sh + go mod init iot-starter + ``` + +1. Install [`influxdb3-go`](https://github.com/InfluxCommunity/influxdb3-go/), + which provides the InfluxDB `influxdb3` Go client library module. + + ```sh + go get github.com/InfluxCommunity/influxdb3-go + ``` + + + +{{% /tab-content %}} {{% tab-content %}} + + + +The following steps set up a JavaScript project using the +[InfluxDB v3 JavaScript client](https://github.com/InfluxCommunity/influxdb3-js/). + +1. Install [Node.js](https://nodejs.org/en/download/). + +1. Create a directory for your JavaScript project and change to the + directory--for example: + + ```sh + mkdir -p iot-starter-js && cd $_ + ``` + +1. Initialize a project--for example, using `npm`: + + + + ```sh + npm init + ``` + +1. Install the `@influxdata/influxdb3-client` InfluxDB v3 JavaScript client + library. + + ```sh + npm install @influxdata/influxdb3-client + ``` + + + +{{% /tab-content %}} {{% tab-content %}} + + + +The following steps set up a Python project using the +[InfluxDB v3 Python client](https://github.com/InfluxCommunity/influxdb3-python/): + +1. Install [Python](https://www.python.org/downloads/) + +1. Inside of your project directory, create a directory for your Python module + and change to the module directory--for example: + + ```sh + mkdir -p iot-starter-py && cd $_ + ``` + +1. **Optional, but recommended**: Use + [`venv`](https://docs.python.org/3/library/venv.html) or + [`conda`](https://docs.continuum.io/anaconda/install/) to activate a virtual + environment for installing and executing code--for example, enter the + following command using `venv` to create and activate a virtual environment + for the project: + + ```bash + python3 -m venv envs/iot-starter && source ./envs/iot-starter/bin/activate + ``` + +1. Install + [`influxdb3-python`](https://github.com/InfluxCommunity/influxdb3-python), + which provides the InfluxDB `influxdb_client_3` Python client library module + and also installs the + [`pyarrow` package](https://arrow.apache.org/docs/python/index.html) for + working with Arrow data. + + ```sh + pip install influxdb3-python + ``` + + + +{{% /tab-content %}} {{< /tabs-wrapper >}} + +## Construct points and write line protocol + +Client libraries provide one or more `Point` constructor methods. Some libraries +support language-native data structures, such as Go's `struct`, for creating +points. + +{{< tabs-wrapper >}} {{% tabs %}} [Go](#) [Node.js](#) [Python](#) {{% /tabs %}} +{{% tab-content %}} + + + +1. Create a file for your module--for example: `main.go`. + +1. In `main.go`, enter the following sample code: + + ```go + package main + + import ( + "context" + "os" + "fmt" + "time" + "github.com/InfluxCommunity/influxdb3-go/influxdb3" + "github.com/influxdata/line-protocol/v2/lineprotocol" + ) + + func Write() error { + url := os.Getenv("INFLUX_HOST") + token := os.Getenv("INFLUX_TOKEN") + database := os.Getenv("INFLUX_DATABASE") + + // To instantiate a client, call New() with InfluxDB credentials. + client, err := influxdb3.New(influxdb3.ClientConfig{ + Host: url, + Token: token, + Database: database, + }) + + /** Use a deferred function to ensure the client is closed when the + * function returns. + **/ + defer func (client *influxdb3.Client) { + err = client.Close() + if err != nil { + panic(err) + } + }(client) + + /** Use the NewPoint method to construct a point. + * NewPoint(measurement, tags map, fields map, time) + **/ + point := influxdb3.NewPoint("home", + map[string]string{ + "room": "Living Room", + }, + map[string]any{ + "temp": 24.5, + "hum": 40.5, + "co": 15i}, + time.Now(), + ) + + /** Use the NewPointWithMeasurement method to construct a point with + * method chaining. + **/ + point2 := influxdb3.NewPointWithMeasurement("home"). + SetTag("room", "Living Room"). + SetField("temp", 23.5). + SetField("hum", 38.0). + SetField("co", 16i). + SetTimestamp(time.Now()) + + fmt.Println("Writing points") + points := []*influxdb3.Point{point, point2} + + /** Write points to InfluxDB. + * You can specify WriteOptions, such as Gzip threshold, + * default tags, and timestamp precision. Default precision is lineprotocol.Nanosecond + **/ + err = client.WritePoints(context.Background(), points, + influxdb3.WithPrecision(lineprotocol.Second)) + return nil + } + + func main() { + Write() + } + ``` + +1. To run the module and write the data to your {{% product-name %}} database, + enter the following command in your terminal: + + + + ```sh + go run main.go + ``` + + + +{{% /tab-content %}} {{% tab-content %}} + + + +1. Create a file for your module--for example: `write-points.js`. + +1. In `write-points.js`, enter the following sample code: + + ```js + // write-points.js + import { InfluxDBClient, Point } from '@influxdata/influxdb3-client'; + + /** + * Set InfluxDB credentials. + */ + const host = process.env.INFLUX_HOST ?? ''; + const database = process.env.INFLUX_DATABASE; + const token = process.env.INFLUX_TOKEN; + + /** + * Write line protocol to InfluxDB using the JavaScript client library. + */ + export async function writePoints() { + /** + * Instantiate an InfluxDBClient. + * Provide the host URL and the database token. + */ + const client = new InfluxDBClient({ host, token }); + + /** Use the fluent interface with chained methods to construct Points. */ + const point = Point.measurement('home') + .setTag('room', 'Living Room') + .setFloatField('temp', 22.2) + .setFloatField('hum', 35.5) + .setIntegerField('co', 7) + .setTimestamp(new Date().getTime() / 1000); + + const point2 = Point.measurement('home') + .setTag('room', 'Kitchen') + .setFloatField('temp', 21.0) + .setFloatField('hum', 35.9) + .setIntegerField('co', 0) + .setTimestamp(new Date().getTime() / 1000); + + /** Write points to InfluxDB. + * The write method accepts an array of points, the target database, and + * an optional configuration object. + * You can specify WriteOptions, such as Gzip threshold, default tags, + * and timestamp precision. Default precision is lineprotocol.Nanosecond + **/ + + try { + await client.write([point, point2], database, '', { precision: 's' }); + console.log('Data has been written successfully!'); + } catch (error) { + console.error(`Error writing data to InfluxDB: ${error.body}`); + } + + client.close(); + } + + writePoints(); + ``` + +1. To run the module and write the data to your {{\< product-name >}} database, + enter the following command in your terminal: + + + + ```sh + node writePoints.js + ``` + + + + {{% /tab-content %}} {{% tab-content %}} + + + +1. Create a file for your module--for example: `write-points.py`. + +1. In `write-points.py`, enter the following sample code to write data in + batching mode: + + ```python + import os + from influxdb_client_3 import ( + InfluxDBClient3, InfluxDBError, Point, WritePrecision, + WriteOptions, write_client_options) + + host = os.getenv('INFLUX_HOST') + token = os.getenv('INFLUX_TOKEN') + database = os.getenv('INFLUX_DATABASE') + + # Create an array of points with tags and fields. + points = [Point("home") + .tag("room", "Kitchen") + .field("temp", 25.3) + .field('hum', 20.2) + .field('co', 9)] + + # With batching mode, define callbacks to execute after a successful or + # failed write request. + # Callback methods receive the configuration and data sent in the request. + def success(self, data: str): + print(f"Successfully wrote batch: data: {data}") + + def error(self, data: str, exception: InfluxDBError): + print(f"Failed writing batch: config: {self}, data: {data} due: {exception}") + + def retry(self, data: str, exception: InfluxDBError): + print(f"Failed retry writing batch: config: {self}, data: {data} retry: {exception}") + + # Configure options for batch writing. + write_options = WriteOptions(batch_size=500, + flush_interval=10_000, + jitter_interval=2_000, + retry_interval=5_000, + max_retries=5, + max_retry_delay=30_000, + exponential_base=2) + + # Create an options dict that sets callbacks and WriteOptions. + wco = write_client_options(success_callback=success, + error_callback=error, + retry_callback=retry, + write_options=write_options) + + # Instantiate a synchronous instance of the client with your + # InfluxDB credentials and write options, such as Gzip threshold, default tags, + # and timestamp precision. Default precision is nanosecond ('ns'). + with InfluxDBClient3(host=host, + token=token, + database=database, + write_client_options=wco) as client: + + client.write(points, write_precision='s') + ``` + +1. To run the module and write the data to your {{< product-name >}} database, + enter the following command in your terminal: + + + + ```sh + python write-points.py + ``` + + + + {{% /tab-content %}} {{< /tabs-wrapper >}} + +The sample code does the following: + + + +1. Instantiates a client configured with the InfluxDB URL and API token. +1. Constructs `home` + [measurement](/influxdb/clustered/reference/glossary/#measurement) + `Point` objects. +1. Sends data as line protocol format to InfluxDB and waits for the response. +1. If the write succeeds, logs the success message to stdout; otherwise, logs + the failure message and error details. +1. Closes the client to release resources. + + diff --git a/package.json b/package.json index d8285903c..7a46fdf79 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "InfluxDB documentation", "license": "MIT", "devDependencies": { - "@vvago/vale": "^3.0.7", + "@vvago/vale": "^3.4.2", "autoprefixer": ">=10.2.5", "hugo-extended": ">=0.101.0", "husky": "^9.0.11", @@ -20,13 +20,14 @@ }, "scripts": { "prepare": "husky", - "test": "./test.sh" + "lint-vale": ".ci/vale/vale.sh", + "lint-staged": "lint-staged --relative" }, - "lint-staged": { - "*.{js,css,md}": "prettier --write", - "content/influxdb/cloud-dedicated/**/*.md": "npx vale --config=content/influxdb/cloud-dedicated/.vale.ini --minAlertLevel=error --output=line", - "content/influxdb/cloud-serverless/**/*.md": "npx vale --config=content/influxdb/cloud-serverless/.vale.ini --minAlertLevel=error --output=line", - "content/influxdb/clustered/**/*.md": "npx vale --config=content/influxdb/clustered/.vale.ini --minAlertLevel=error --output=line", - "content/influxdb/{cloud,v2,telegraf}/**/*.md": "npx vale --config=.vale.ini --minAlertLevel=error --output=line" - } + "main": "index.js", + "module": "main.js", + "directories": { + "test": "test" + }, + "keywords": [], + "author": "" } diff --git a/test.Dockerfile b/test.Dockerfile deleted file mode 100644 index 1ce673fd3..000000000 --- a/test.Dockerfile +++ /dev/null @@ -1,94 +0,0 @@ -# If you need more help, visit the Dockerfile reference guide at -# https://docs.docker.com/engine/reference/builder/ - -# Starting from a Go base image is easier than setting up the Go environment later. -FROM golang:latest - -RUN apt-get update && apt-get upgrade -y && apt-get install -y \ - curl \ - git \ - gpg \ - jq \ - maven \ - nodejs \ - npm \ - wget - -# Install test runner dependencies -RUN apt-get install -y \ - python3 \ - python3-pip \ - python3-venv - -RUN ln -s /usr/bin/python3 /usr/bin/python - -# Create a virtual environment for Python to avoid conflicts with the system Python and having to use the --break-system-packages flag when installing packages with pip. -RUN python -m venv /opt/venv -# Enable venv -ENV PATH="/opt/venv/bin:$PATH" - -# Prevents Python from writing pyc files. -ENV PYTHONDONTWRITEBYTECODE=1 - -# the application crashes without emitting any logs due to buffering. -ENV PYTHONUNBUFFERED=1 - -# RUN --mount=type=cache,target=/root/.cache/node_modules \ -# --mount=type=bind,source=package.json,target=package.json \ -# npm install - -# Copy docs test directory to the image. -WORKDIR /usr/src/app -RUN chmod -R 755 . - -ARG SOURCE_DIR - -COPY data ./data -# Install parse_yaml.sh and parse YAML config files into dotenv files to be used by tests. -RUN /bin/bash -c 'curl -sO https://raw.githubusercontent.com/mrbaseman/parse_yaml/master/src/parse_yaml.sh' -RUN /bin/bash -c 'source ./parse_yaml.sh && parse_yaml ./data/products.yml > .env.products' - -COPY test ./test -WORKDIR /usr/src/app/test -COPY shared/fixtures ./tmp/data - -# Some Python test dependencies (pytest-dotenv and pytest-codeblocks) aren't -# available as packages in apt-cache, so use pip to download dependencies in a # separate step and use Docker's caching. -# Leverage a cache mount to /root/.cache/pip to speed up subsequent builds. -# Leverage a bind mount to requirements.txt to avoid having to copy them into -# this layer. -RUN --mount=type=cache,target=/root/.cache/pip \ - --mount=type=bind,source=test/requirements.txt,target=requirements.txt \ - pip install -Ur requirements.txt - -COPY test/setup/run-tests.sh /usr/local/bin/run-tests.sh -RUN chmod +x /usr/local/bin/run-tests.sh - -# Install Telegraf for use in tests. -# Follow the install instructions (https://docs.influxdata.com/telegraf/v1/install/?t=curl), except for sudo (which isn't available in Docker). -# influxdata-archive_compat.key GPG fingerprint: -# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E -RUN wget -q https://repos.influxdata.com/influxdata-archive_compat.key - -RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null - -RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list - -RUN apt-get update && apt-get install telegraf - -# Install influx v2 Cloud CLI for use in tests. -# Follow the install instructions(https://portal.influxdata.com/downloads/), except for sudo (which isn't available in Docker). -# influxdata-archive_compat.key GPG fingerprint: -# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E -RUN wget -q https://repos.influxdata.com/influxdata-archive_compat.key - -RUN echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null - -RUN echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list - -RUN apt-get update && apt-get install influxdb2-cli - -ENV TEMP_DIR=./tmp - -ENTRYPOINT [ "run-tests.sh" ] -CMD [""] \ No newline at end of file diff --git a/test.sh b/test.sh deleted file mode 100755 index 74afdf966..000000000 --- a/test.sh +++ /dev/null @@ -1,66 +0,0 @@ -#! /bin/bash - -# Path: test.sh -# Description: -# This script is used to copy content files for testing and to run tests on tests on those temporary copies. -# The temporary files are shared between the host and the Docker container -# using a bind mount configured in compose.yaml. -# -# Docker compose now has an experimental file watch feature -# (https://docs.docker.com/compose/file-watch/) that is likely preferable to the -# strategy here. -# -# Usage: -# The default behavior is to test all *.md files that have been added or modified in the current branch, effectively: -# -# `git diff --name-only --diff-filter=AM --relative master | grep -E '\.md$' | ./test.sh` -# -# To specify files to test, in your terminal command line, pass a file pattern as the only argument to the script--for example: -# -# sh test.sh ./content/**/*.md -## - -paths="$1" -target=./test/tmp -testrun=./test/.test-run.txt -mkdir -p "$target" -cat /dev/null > "$testrun" -rm -rf "$target"/* - -# Check if the user provided a path to copy. -if [ -z "$paths" ]; then - echo "No path provided. Running tests for *.md files that have been added or modified in the current branch." - paths=$(git diff --name-only --diff-filter=AM HEAD | \ - grep -E '\.md$') - - if [ -z "$paths" ]; then - echo "No files found for pattern: $paths" - exit 1 - fi -else - paths=$(find "$paths" -type f -name '*.md') -fi - -# Log the list of files to be tested and copy them to the test directory. -echo "$paths" >> "$testrun" -echo "$paths" | rsync -arv --files-from=- . "$target" - -# Build or rebuild a service if the Dockerfile or build directory have changed, and then run the tests. -docker compose up test - -# Troubleshoot tests -# If you want to examine files or run commands for debugging tests, -# start the container and use `exec` to open an interactive shell--for example: - -# docker compose run -it --entrypoint=/bin/bash test - -# To build and run a new container and debug test failures, use `docker compose run` which runs a one-off command in a new container. Pass additional flags to be used by the container's entrypoint and the test runners it executes--for example: - -# docker compose run --rm test -v -# docker compose run --rm test --entrypoint /bin/bash - -# Or, pass the flags in the compose file--for example: -# services: -# test: -# build:... -# command: ["-vv"] diff --git a/test/.dockerignore b/test/.dockerignore index e18396c45..6d3f92c46 100644 --- a/test/.dockerignore +++ b/test/.dockerignore @@ -8,9 +8,10 @@ **/__pycache__ **/.venv **/.classpath +**/.config.toml **/.dockerignore **/.env -**/.env.influxdbv3 +**/.env.* **/.git **/.gitignore **/.project @@ -23,6 +24,7 @@ **/*.jfm **/bin **/charts +**/config.toml **/docker-compose* **/compose* **/Dockerfile* diff --git a/test/.gitignore b/test/.gitignore index 5bc1678d6..a8aabc891 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,8 +1,11 @@ /target /Cargo.lock +config.toml content node_modules tmp +.config* .env* +**/.env.test .pytest_cache .test-run.txt diff --git a/test/setup/run-tests.sh b/test/setup/run-tests.sh deleted file mode 100644 index 31825d638..000000000 --- a/test/setup/run-tests.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash - -# This script is used to run tests for the InfluxDB documentation. -# The script is designed to be run in a Docker container. It is used to substitute placeholder values. - -# Function to check if an option is present in the arguments -has_option() { - local target="$1" - shift - for arg in "$@"; do - if [ "$arg" == "$target" ]; then - return 0 - fi - done - return 1 -} - -verbose=0 -# Check if "--option" is present in the CMD arguments -if has_option "-v" "$@"; then - verbose=1 - echo "Using verbose mode..." -fi - -BASE_DIR=$(pwd) -cd $TEMP_DIR - -for file in `find . -type f \( -iname '*.md' \)` ; do - if [ -f "$file" ]; then - echo "PRETEST: substituting values in $file" - - # Replaces placeholder values with environment variable references. - - # Non-language-specific replacements. - sed -i 's|https:\/\/{{< influxdb/host >}}|$INFLUX_HOST|g; - ' $file - - # Python-specific replacements. - # Use f-strings to identify placeholders in Python while also keeping valid syntax if - # the user replaces the value. - # Remember to import os for your example code. - sed -i 's/f"DATABASE_TOKEN"/os.getenv("INFLUX_TOKEN")/g; - s/f"API_TOKEN"/os.getenv("INFLUX_TOKEN")/g; - s/f"BUCKET_NAME"/os.getenv("INFLUX_DATABASE")/g; - s/f"DATABASE_NAME"/os.getenv("INFLUX_DATABASE")/g; - s|f"{{< influxdb/host >}}"|os.getenv("INFLUX_HOSTNAME")|g; - s|f"RETENTION_POLICY_NAME\|RETENTION_POLICY"|"autogen"|g; - ' $file - - # Shell-specific replacements. - ## In JSON Heredoc - sed -i 's|"orgID": "ORG_ID"|"orgID": "$INFLUX_ORG"|g; - s|"name": "BUCKET_NAME"|"name": "$INFLUX_DATABASE"|g;' \ - $file - - sed -i 's/API_TOKEN/$INFLUX_TOKEN/g; - s/ORG_ID/$INFLUX_ORG/g; - s/DATABASE_TOKEN/$INFLUX_TOKEN/g; - s/--bucket-id BUCKET_ID/--bucket-id $INFLUX_BUCKET_ID/g; - s/BUCKET_NAME/$INFLUX_DATABASE/g; - s/DATABASE_NAME/$INFLUX_DATABASE/g; - s/--id DBRP_ID/--id $INFLUX_DBRP_ID/g; - s/get-started/$INFLUX_DATABASE/g; - s/RETENTION_POLICY_NAME\|RETENTION_POLICY/$INFLUX_RETENTION_POLICY/g; - s/CONFIG_NAME/CONFIG_$(shuf -i 0-100 -n1)/g;' \ - $file - - # v2-specific replacements. - sed -i 's|https:\/\/us-west-2-1.aws.cloud2.influxdata.com|$INFLUX_HOST|g; - s|{{< latest-patch >}}|${influxdb_latest_patches_v2}|g; - s|{{< latest-patch cli=true >}}|${influxdb_latest_cli_v2}|g;' \ - $file - - # Skip package manager commands. - sed -i 's|sudo dpkg.*$||g; - s|sudo yum.*$||g;' \ - $file - - # Environment-specific replacements. - sed -i 's|sudo ||g;' \ - $file - fi - if [ $verbose -eq 1 ]; then - echo "FILE CONTENTS:" - cat $file - fi -done - -# Miscellaneous test setup. -# For macOS samples. -mkdir -p ~/Downloads && rm -rf ~/Downloads/* -# Clean up installed files from previous runs. -gpg -q --batch --yes --delete-key D8FF8E1F7DF8B07E > /dev/null 2>&1 - -# Activate the Python virtual environment configured in the Dockerfile. -. /opt/venv/bin/activate - -# List installed Python dependencies. -pip list - -# Run test commands with options provided in the CMD of the Dockerfile. -# pytest rootdir is the directory where pytest.ini is located (/test). -if [ -d ./content/influxdb/cloud-dedicated/ ]; then -echo "Running content/influxdb/cloud-dedicated tests..." -pytest --codeblocks --envfile $BASE_DIR/.env.dedicated ./content/influxdb/cloud-dedicated/ $@ -fi - -if [ -d ./content/influxdb/cloud-serverless/ ]; then -echo "Running content/influxdb/cloud-serverless tests..." -pytest --codeblocks --envfile $BASE_DIR/.env.serverless ./content/influxdb/cloud-serverless/ $@ -fi - -if [ -d ./content/telegraf/ ]; then -echo "Running content/telegraf tests..." -pytest --codeblocks --envfile $BASE_DIR/.env.telegraf ./content/telegraf/ $@ -fi diff --git a/test/parse_yaml.sh b/test/src/parse_yaml.sh similarity index 100% rename from test/parse_yaml.sh rename to test/src/parse_yaml.sh diff --git a/test/src/prepare-content.sh b/test/src/prepare-content.sh new file mode 100644 index 000000000..42ba51e33 --- /dev/null +++ b/test/src/prepare-content.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# This script is used to run tests for the InfluxDB documentation. +# The script is designed to be run in a Docker container. It is used to substitute placeholder values in test files. + +TEST_CONTENT="/app/content" + +function substitute_placeholders { + for file in `find "$TEST_CONTENT" -type f \( -iname '*.md' \)`; do + if [ -f "$file" ]; then + # echo "PRETEST: substituting values in $file" + + # Replaces placeholder values with environment variable references. + + # Non-language-specific replacements. + sed -i 's|https:\/\/{{< influxdb/host >}}|$INFLUX_HOST|g; + ' $file + + # Python-specific replacements. + # Use f-strings to identify placeholders in Python while also keeping valid syntax if + # the user replaces the value. + # Remember to import os for your example code. + sed -i 's/f"DATABASE_TOKEN"/os.getenv("INFLUX_TOKEN")/g; + s/f"API_TOKEN"/os.getenv("INFLUX_TOKEN")/g; + s/f"BUCKET_NAME"/os.getenv("INFLUX_DATABASE")/g; + s/f"DATABASE_NAME"/os.getenv("INFLUX_DATABASE")/g; + s|f"{{< influxdb/host >}}"|os.getenv("INFLUX_HOSTNAME")|g; + s|f"RETENTION_POLICY_NAME\|RETENTION_POLICY"|"autogen"|g; + ' $file + + # Shell-specific replacements. + ## In JSON Heredoc + sed -i 's|"orgID": "ORG_ID"|"orgID": "$INFLUX_ORG"|g; + s|"name": "BUCKET_NAME"|"name": "$INFLUX_DATABASE"|g;' \ + $file + + sed -i 's/API_TOKEN/$INFLUX_TOKEN/g; + s/ORG_ID/$INFLUX_ORG/g; + s/DATABASE_TOKEN/$INFLUX_TOKEN/g; + s/--bucket-id BUCKET_ID/--bucket-id $INFLUX_BUCKET_ID/g; + s/BUCKET_NAME/$INFLUX_DATABASE/g; + s/DATABASE_NAME/$INFLUX_DATABASE/g; + s/--id DBRP_ID/--id $INFLUX_DBRP_ID/g; + s/get-started/$INFLUX_DATABASE/g; + s/RETENTION_POLICY_NAME\|RETENTION_POLICY/$INFLUX_RETENTION_POLICY/g; + s/CONFIG_NAME/CONFIG_$(shuf -i 0-100 -n1)/g;' \ + $file + + # v2-specific replacements. + sed -i 's|https:\/\/us-west-2-1.aws.cloud2.influxdata.com|$INFLUX_HOST|g; + s|{{< latest-patch >}}|${influxdb_latest_patches_v2}|g; + s|{{< latest-patch cli=true >}}|${influxdb_latest_cli_v2}|g;' \ + $file + + # Skip package manager commands. + sed -i 's|sudo dpkg.*$||g; + s|sudo yum.*$||g;' \ + $file + + # Environment-specific replacements. + sed -i 's|sudo ||g;' \ + $file + fi + done +} + +setup() { + # Parse YAML config files into dotenv files to be used by tests. + parse_yaml /app/appdata/products.yml > /app/appdata/.env.products + + # Miscellaneous test setup. + # For macOS samples. + mkdir -p ~/Downloads && rm -rf ~/Downloads/* +} + +prepare_tests() { + TEST_FILES="$*" + + # Remove files from the previous run. + rm -rf "$TEST_CONTENT"/* + # Copy the test files to the target directory while preserving the directory structure. + for FILE in $TEST_FILES; do + # Create the parent directories of the destination file + #mkdir -p "$(dirname "$TEST_TARGET/$FILE")" + # Copy the file + rsync -avz --relative --log-file=./test.log "$FILE" /app/ + done + + substitute_placeholders +} + +# If arguments were passed and the first argument is not --files, run the command. This is useful for running "/bin/bash" for debugging the container. +# If --files is passed, prepare all remaining arguments as test files. +# Otherwise (no arguments), run the setup function and return existing files to be tested. +if [ "$1" != "--files" ]; then + echo "Executing $0 without --files argument." + "$@" +fi +if [ "$1" == "--files" ]; then + shift + prepare_tests "$@" +fi +setup +# Return new or existing files to be tested. +find "$TEST_CONTENT" -type f -name '*.md' diff --git a/test/pytest.ini b/test/src/pytest.ini similarity index 100% rename from test/pytest.ini rename to test/src/pytest.ini diff --git a/test/requirements.txt b/test/src/requirements.txt similarity index 100% rename from test/requirements.txt rename to test/src/requirements.txt diff --git a/yarn.lock b/yarn.lock index cb785b0e2..509d560da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@babel/code-frame@^7.0.0": version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz" integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== dependencies: "@babel/highlight" "^7.24.6" @@ -12,12 +12,12 @@ "@babel/helper-validator-identifier@^7.24.6": version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz" integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== "@babel/highlight@^7.24.6": version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz" integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== dependencies: "@babel/helper-validator-identifier" "^7.24.6" @@ -27,7 +27,7 @@ "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -39,20 +39,20 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -60,39 +60,39 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@sindresorhus/is@^5.2.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== "@sindresorhus/merge-streams@^2.1.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" + resolved "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== "@szmarczak/http-timer@^5.0.1": version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== dependencies: defer-to-connect "^2.0.1" "@types/http-cache-semantics@^4.0.2": version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/normalize-package-data@^2.4.1": version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== -"@vvago/vale@^3.0.7": +"@vvago/vale@^3.4.2": version "3.4.2" - resolved "https://registry.yarnpkg.com/@vvago/vale/-/vale-3.4.2.tgz#f3b6625bac8ba1fa47f7b0881c0bf70ca7127853" + resolved "https://registry.npmjs.org/@vvago/vale/-/vale-3.4.2.tgz" integrity sha512-ucMHEg9Hk9GrHkGXkFH1HlNTtF0H8X2FY3x0x00CRj3yFsEq/wzPSXqtrAzeNqd8dw6UAU5hrkOVUl0uShUoIg== dependencies: axios "^1.4.0" @@ -102,41 +102,41 @@ ansi-escapes@^6.2.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz" integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -144,17 +144,17 @@ anymatch@~3.1.2: argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== autoprefixer@>=10.2.5: version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: browserslist "^4.23.0" @@ -166,7 +166,7 @@ autoprefixer@>=10.2.5: axios@^1.4.0, axios@^1.6.0: version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz" integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== dependencies: follow-redirects "^1.15.6" @@ -175,27 +175,27 @@ axios@^1.4.0, axios@^1.6.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== big-integer@^1.6.17: version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== binary@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== dependencies: buffers "~0.1.1" @@ -203,7 +203,7 @@ binary@~0.3.0: bl@^1.0.0: version "1.2.3" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + resolved "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz" integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== dependencies: readable-stream "^2.3.5" @@ -211,12 +211,12 @@ bl@^1.0.0: bluebird@~3.4.1: version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -224,21 +224,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.23.0: +browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: caniuse-lite "^1.0.30001587" @@ -248,12 +248,12 @@ browserslist@^4.23.0: buffer-alloc-unsafe@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" @@ -261,22 +261,22 @@ buffer-alloc@^1.2.0: buffer-crc32@~0.2.3: version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== buffer-indexof-polyfill@~1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz" integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== buffer@^5.2.1: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -284,17 +284,17 @@ buffer@^5.2.1: buffers@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== cacheable-lookup@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz" integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== cacheable-request@^10.2.8: version "10.2.14" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz" integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: "@types/http-cache-semantics" "^4.0.2" @@ -307,12 +307,12 @@ cacheable-request@^10.2.8: caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001625" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz#ead1b155ea691d6a87938754d3cb119c24465b03" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz" integrity sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w== careful-downloader@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/careful-downloader/-/careful-downloader-3.0.0.tgz#7e613e582078e8124e9dab4a2293cd48e6d07e6d" + resolved "https://registry.npmjs.org/careful-downloader/-/careful-downloader-3.0.0.tgz" integrity sha512-5KMIPa0Yoj+2tY6OK9ewdwcPebp+4XS0dMYvvF9/8fkFEfvnEpWmHWYs9JNcZ7RZUvY/v6oPzLpmmTzSIbroSA== dependencies: debug "^4.3.4" @@ -324,14 +324,14 @@ careful-downloader@^3.0.0: chainsaw@~0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== dependencies: traverse ">=0.3.0 <0.4" chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -340,12 +340,12 @@ chalk@^2.4.2: chalk@^5.0.0, chalk@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== chokidar@^3.3.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -360,19 +360,19 @@ chokidar@^3.3.0: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== cli-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== dependencies: restore-cursor "^4.0.0" cli-truncate@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -380,7 +380,7 @@ cli-truncate@^4.0.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -389,63 +389,63 @@ cliui@^8.0.1: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.20: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^2.8.1: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@~12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -454,28 +454,28 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: crypto-random-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz" integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== dependencies: type-fest "^1.0.1" debug@^4.3.4, debug@~4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + resolved "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz" integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== dependencies: file-type "^5.2.0" @@ -484,7 +484,7 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: decompress-tarbz2@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + resolved "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz" integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== dependencies: decompress-tar "^4.1.0" @@ -495,7 +495,7 @@ decompress-tarbz2@^4.0.0: decompress-targz@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + resolved "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz" integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== dependencies: decompress-tar "^4.1.1" @@ -504,7 +504,7 @@ decompress-targz@^4.0.0: decompress-unzip@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + resolved "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz" integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw== dependencies: file-type "^3.8.0" @@ -514,7 +514,7 @@ decompress-unzip@^4.0.1: decompress@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + resolved "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz" integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" @@ -528,83 +528,93 @@ decompress@^4.2.1: defer-to-connect@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== dependency-graph@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz" integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== duplexer2@~0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== dependencies: readable-stream "^2.0.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.668: version "1.4.784" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.784.tgz#729a80154cee6ee9cb8bc3948af83431ab5cb394" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.784.tgz" integrity sha512-9CZwh+sDrhDAeOEFh8s3PqwduzTyYIeYwZolc1b9ENAUt3ePu7R1sJSCWr/820ISssRxCJUyHI9Wb7j+0Uo1AA== emoji-regex@^10.3.0: version "10.3.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== end-of-stream@^1.0.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== execa@~8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -619,7 +629,7 @@ execa@~8.0.1: fast-glob@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -630,43 +640,43 @@ fast-glob@^3.3.2: fastq@^1.6.0: version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" fd-slicer@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" file-type@^3.8.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + resolved "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== file-type@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + resolved "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz" integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ== file-type@^6.1.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + resolved "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz" integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: locate-path "^7.1.0" @@ -674,12 +684,12 @@ find-up@^6.3.0: follow-redirects@^1.15.6: version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: cross-spawn "^7.0.0" @@ -687,12 +697,12 @@ foreground-child@^3.1.0: form-data-encoder@^2.1.2: version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -701,17 +711,17 @@ form-data@^4.0.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^11.0.0, fs-extra@^11.1.1: version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== dependencies: graceful-fs "^4.2.0" @@ -720,24 +730,24 @@ fs-extra@^11.0.0, fs-extra@^11.1.1: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fstream@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" @@ -747,27 +757,27 @@ fstream@^1.0.12: function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-east-asian-width@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz" integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== get-stdin@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== get-stream@^2.2.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz" integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA== dependencies: object-assign "^4.0.1" @@ -775,24 +785,24 @@ get-stream@^2.2.0: get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^10.3.7: version "10.4.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz" integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: foreground-child "^3.1.0" @@ -803,7 +813,7 @@ glob@^10.3.7: glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -815,7 +825,7 @@ glob@^7.1.3: globby@^14.0.0: version "14.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.1.tgz#a1b44841aa7f4c6d8af2bc39951109d77301959b" + resolved "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz" integrity sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ== dependencies: "@sindresorhus/merge-streams" "^2.1.0" @@ -827,7 +837,7 @@ globby@^14.0.0: got@^12.6.0: version "12.6.1" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + resolved "https://registry.npmjs.org/got/-/got-12.6.1.tgz" integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== dependencies: "@sindresorhus/is" "^5.2.0" @@ -844,36 +854,36 @@ got@^12.6.0: graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hosted-git-info@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" http-cache-semantics@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http2-wrapper@^2.1.10: version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" @@ -881,7 +891,7 @@ http2-wrapper@^2.1.10: hugo-extended@>=0.101.0: version "0.126.1" - resolved "https://registry.yarnpkg.com/hugo-extended/-/hugo-extended-0.126.1.tgz#2754cb12e4459daa944b1b86d6d4edf661ace0ac" + resolved "https://registry.npmjs.org/hugo-extended/-/hugo-extended-0.126.1.tgz" integrity sha512-l67xrdep6aBx4tHmruMnwnGDlsUPIQMdJw0AWRgtJ6vsItlvsJfyma3PPd19NxFL2GE0I9D8UlyvnkT+zK35cg== dependencies: careful-downloader "^3.0.0" @@ -890,128 +900,128 @@ hugo-extended@>=0.101.0: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== husky@^9.0.11: version "9.0.11" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + resolved "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz" integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.4: version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.0, inherits@~2.0.3: +inherits@~2.0.0, inherits@~2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.5.0: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: get-east-asian-width "^1.0.0" is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-natural-number@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + resolved "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz" integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz" integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== is-stream@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-unicode-supported@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.1.2.tgz#eada67ea949c6b71de50f1b09c92a961897b90ab" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz" integrity sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1020,29 +1030,29 @@ jackspeak@^3.1.2: js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -1051,24 +1061,31 @@ jsonfile@^6.0.1: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" lilconfig@^3.1.1, lilconfig@~3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + lint-staged@^15.2.5: version "15.2.5" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.5.tgz#8c342f211bdb34ffd3efd1311248fa6b50b43b50" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz" integrity sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA== dependencies: chalk "~5.3.0" @@ -1084,12 +1101,12 @@ lint-staged@^15.2.5: listenercount@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz" integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== listr2@~8.2.1: version "8.2.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.1.tgz#06a1a6efe85f23c5324180d7c1ddbd96b5eefd6d" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz" integrity sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g== dependencies: cli-truncate "^4.0.0" @@ -1101,14 +1118,14 @@ listr2@~8.2.1: locate-path@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: p-locate "^6.0.0" log-symbols@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz" integrity sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA== dependencies: chalk "^5.0.0" @@ -1116,7 +1133,7 @@ log-symbols@^5.1.0: log-update@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz" integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== dependencies: ansi-escapes "^6.2.0" @@ -1127,41 +1144,71 @@ log-update@^6.0.0: lowercase-keys@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== lru-cache@^10.2.0: version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-dir@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" +markdown-it@14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +markdownlint-micromark@0.1.9: + version "0.1.9" + resolved "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz" + integrity sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA== + +markdownlint@^0.34.0: + version "0.34.0" + resolved "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz" + integrity sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw== + dependencies: + markdown-it "14.1.0" + markdownlint-micromark "0.1.9" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4, micromatch@~4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: braces "^3.0.3" @@ -1169,110 +1216,115 @@ micromatch@^4.0.4, micromatch@~4.0.7: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== mimic-response@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4: version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^3.0.0: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minipass@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +minipass@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + "mkdirp@>=0.5 0": version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-package-data@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -1282,74 +1334,74 @@ normalize-package-data@^3.0.2: normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== normalize-url@^8.0.0: version "8.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz" integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" object-assign@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" p-cancelable@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== p-limit@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" p-locate@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: p-limit "^4.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -1359,27 +1411,27 @@ parse-json@^5.2.0: path-exists@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -1387,54 +1439,54 @@ path-scurry@^1.11.1: path-type@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" + resolved "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz" integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== pend@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pinkie-promise@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== postcss-cli@>=9.1.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-11.0.0.tgz#649f4b9af447501feb6cbca7f7505a132f90442b" + resolved "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz" integrity sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA== dependencies: chokidar "^3.3.0" @@ -1452,7 +1504,7 @@ postcss-cli@>=9.1.0: postcss-load-config@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-5.1.0.tgz#4ded23410da973e05edae9d41fa99bb5c1d5477f" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz" integrity sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA== dependencies: lilconfig "^3.1.1" @@ -1460,7 +1512,7 @@ postcss-load-config@^5.0.0: postcss-reporter@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.1.0.tgz#5ec476d224e2fe25a054e3c66d9b2901d4fab422" + resolved "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz" integrity sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA== dependencies: picocolors "^1.0.0" @@ -1468,12 +1520,12 @@ postcss-reporter@^7.0.0: postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@>=8.4.31: +postcss@^8.0.0, postcss@^8.1.0, postcss@>=8.0.9, postcss@>=8.4.31: version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: nanoid "^3.3.7" @@ -1482,44 +1534,49 @@ postcss@>=8.4.31: prettier@^3.2.5: version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-hrtime@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" read-pkg-up@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-9.1.0.tgz#38ca48e0bc6c6b260464b14aad9bcd4e5b1fbdc3" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz" integrity sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== dependencies: find-up "^6.3.0" @@ -1528,7 +1585,7 @@ read-pkg-up@^9.1.0: read-pkg@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-7.1.0.tgz#438b4caed1ad656ba359b3e00fd094f3c427a43e" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz" integrity sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== dependencies: "@types/normalize-package-data" "^2.4.1" @@ -1538,7 +1595,7 @@ read-pkg@^7.1.0: readable-stream@^2.0.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -1551,31 +1608,31 @@ readable-stream@^2.0.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-alpn@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== responselike@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + resolved "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz" integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== dependencies: lowercase-keys "^3.0.0" restore-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== dependencies: onetime "^5.1.0" @@ -1583,92 +1640,92 @@ restore-cursor@^4.0.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz" integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^5.0.0: version "5.0.7" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz" integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== dependencies: glob "^10.3.7" +rimraf@2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-buffer@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== seek-bzip@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" + resolved "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz" integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== dependencies: commander "^2.8.1" semver@^7.3.4: version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== setimmediate@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== slash@^5.0.0, slash@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" + resolved "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -1676,7 +1733,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: ansi-styles "^6.2.1" @@ -1684,12 +1741,12 @@ slice-ansi@^7.0.0: source-map-js@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== spdx-correct@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" @@ -1697,12 +1754,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -1710,17 +1767,33 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.18" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz" integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-argv@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -1729,7 +1802,7 @@ string-argv@~0.3.2: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -1738,56 +1811,56 @@ string-width@^5.0.1, string-width@^5.1.2: string-width@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz" integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== dependencies: emoji-regex "^10.3.0" get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-dirs@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + resolved "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz" integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== dependencies: is-natural-number "^4.0.1" strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" tar-stream@^1.5.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" @@ -1800,7 +1873,7 @@ tar-stream@^1.5.2: tar@^6.1.15: version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" @@ -1812,12 +1885,12 @@ tar@^6.1.15: temp-dir@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz" integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== tempy@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.1.0.tgz#00958b6df85db8589cb595465e691852aac038e9" + resolved "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz" integrity sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== dependencies: is-stream "^3.0.0" @@ -1827,44 +1900,49 @@ tempy@^3.0.0: thenby@^1.3.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/thenby/-/thenby-1.3.4.tgz#81581f6e1bb324c6dedeae9bfc28e59b1a2201cc" + resolved "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz" integrity sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ== through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== to-buffer@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" "traverse@>=0.3.0 <0.4": version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== type-fest@^1.0.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== type-fest@^2.0.0, type-fest@^2.12.2, type-fest@^2.5.0: version "2.19.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + unbzip2-stream@^1.0.9: version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== dependencies: buffer "^5.2.1" @@ -1872,24 +1950,24 @@ unbzip2-stream@^1.0.9: unicorn-magic@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== unique-string@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz" integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: crypto-random-string "^4.0.0" universalify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unzipper@^0.10.14: version "0.10.14" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" + resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz" integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== dependencies: big-integer "^1.6.17" @@ -1905,7 +1983,7 @@ unzipper@^0.10.14: update-browserslist-db@^1.0.13: version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz" integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: escalade "^3.1.2" @@ -1913,12 +1991,12 @@ update-browserslist-db@^1.0.13: util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -1926,14 +2004,23 @@ validate-npm-package-license@^3.0.1: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -1942,7 +2029,7 @@ which@^2.0.1: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -1951,7 +2038,7 @@ wrap-ansi@^8.1.0: wrap-ansi@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: ansi-styles "^6.2.1" @@ -1960,37 +2047,37 @@ wrap-ansi@^9.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== xtend@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.4.2, yaml@~2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz" integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.0.0: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -2003,7 +2090,7 @@ yargs@^17.0.0: yauzl@^2.4.2: version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" @@ -2011,5 +2098,5 @@ yauzl@^2.4.2: yocto-queue@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==