diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..b3316a3 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,11 @@ +name: Test +on: + pull_request: + +jobs: + run-tests: + name: Run tests + runs-on: ubuntu-22.04-2core-arm64 + steps: + - uses: actions/checkout@v4 + - run: yarn && yarn test diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index e00595d..0000000 --- a/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/jest.server.config.js b/jest.server.config.js new file mode 100644 index 0000000..153afd6 --- /dev/null +++ b/jest.server.config.js @@ -0,0 +1,17 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +const jestConfig = { + preset: "ts-jest/presets/default-esm", + testEnvironment: "node", + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.[tj]s$": [ + "ts-jest", + { + useESM: true, + tsconfig: "tsconfig.node.json", + }, + ], + }, + transformIgnorePatterns: ["/node_modules/*"], +}; +export default jestConfig; diff --git a/package.json b/package.json index 1a731f7..78e46c5 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "docusaurus", + "type": "module", "version": "0.0.0", "private": true, "scripts": { "spellcheck": "bash scripts/check-spelling.sh", - "build-remark": "rm -rf .remark-build && tsc --build tsconfig.node.json && tsc-esm-fix --target='.remark-build' --ext='.mjs'", + "build-remark": "tsc --build tsconfig.node.json && tsc-esm-fix --target='.remark-build' --ext='.mjs'", "git-update": "scripts/update_submodules.sh", "prepare-files": "npx vite-node ./scripts/prepare-files.mts", "prepare-sanity-data": "npx vite-node ./scripts/prepare-sanity-data.mts", @@ -18,12 +19,12 @@ "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids", "typecheck": "tsc --noEmit --skipLibCheck --incremental --tsBuildInfoFile node_modules/.cache/tsc/tsbuildinfo --project .", - "uvu-test": "loadr -- uvu uvu-tests", "base:eslint": "eslint --cache --cache-location node_modules/.cache/eslint '**/*.{js,jsx,ts,tsx}'", "base:prettier": "prettier '**/*.{js,jsx,ts,tsx,json}'", "lint": "yarn base:eslint --fix && yarn base:prettier --write -l", "lint-check": "yarn base:eslint && yarn base:prettier --check", - "markdown-lint": "yarn build-remark && remark --rc-path .remarkrc.mjs 'content/**/docs/pages/**/*.mdx' --quiet --frail --ignore-pattern '**/includes/**' --silently-ignore" + "markdown-lint": "yarn build-remark && remark --rc-path .remarkrc.mjs 'content/**/docs/pages/**/*.mdx' --quiet --frail --ignore-pattern '**/includes/**' --silently-ignore", + "test": "NODE_OPTIONS=\"$NODE_OPTIONS --trace-warnings --experimental-vm-modules\" jest --config ./jest.server.config.js server/*.test.ts" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -62,10 +63,12 @@ "@docusaurus/plugin-client-redirects": "^3.6.3", "@docusaurus/tsconfig": "^3.6.3", "@docusaurus/types": "^3.6.3", + "@types/jest": "^29.5.14", "@types/react": "^18.3.3", "ajv": "^8.16.0", "dotenv": "^16.4.5", "hast": "^1.0.0", + "jest": "^29.7.0", "js-yaml": "^4.1.0", "loadr": "^0.1.1", "mdast": "^3.0.0", @@ -91,15 +94,16 @@ "remark-rehype": "^10.1.0", "remark-validate-links": "^11.0.2", "to-vfile": "^8.0.0", + "ts-jest": "^29.2.5", "tsc-esm-fix": "^3.1.0", "tsm": "^2.3.0", - "typescript": "~5.5.2", + "typescript": "^5.7.3", "unified": "^11.0.5", "unified-lint-rule": "^3.0.0", "unist": "^0.0.1", "unist-util-find": "^3.0.0", "unist-util-visit-parents": "^6.0.1", - "vfile": "^6.0.1", + "vfile": "^6.0.3", "vite-node": "^3.0.4" }, "browserslist": { diff --git a/server/asset-path-helpers.ts b/server/asset-path-helpers.ts index a10f650..525b0e4 100644 --- a/server/asset-path-helpers.ts +++ b/server/asset-path-helpers.ts @@ -15,6 +15,9 @@ const REGEXP_POST_PREPARE_VERSION = /^\/versioned_docs\/version-([^\/]+)\//; // migration script const REGEXP_PRE_PREPARE_VERSION = /^\/?content\/([^\/]+)\//; const REGEXP_EXTENSION = /(\/index)?\.mdx$/; +// Matches content directory paths we use for building the docs site (versus for +// testing). +const REGEXP_CONTENT_DIR_PATH = /^(\/(versioned_)?docs|\/?content)\//; export type DocsMeta = { isCurrent: boolean; @@ -73,8 +76,12 @@ const getCurrentDir = (vfile: VFile) => { const getPagesDir = (vfile: VFile): string => resolve(getRootDir(vfile), "docs/pages"); -const getOriginalPath = (vfile: VFile) => - vfile.path.replace(getCurrentDir(vfile), getPagesDir(vfile)); +const getOriginalPath = (vfile: VFile) => { + if (vfile.path.match(REGEXP_CONTENT_DIR_PATH)) { + return vfile.path.replace(getCurrentDir(vfile), getPagesDir(vfile)); + } + return vfile.path; +}; const extBlackList = ["md", "mdx"]; @@ -136,14 +143,16 @@ export const updatePathsInIncludes = ({ return href; } + let absTargetPath = resolve(versionRootDir, dirname(includePath), href); if (node.type === "link") { const absMdxPath = dirname(vfile.path); - const absTargetPath = resolve( - versionRootDir, - dirname(includePath), - href - ).replace(getPagesDir(vfile), getCurrentDir(vfile)); + if (vfile.path.match(REGEXP_CONTENT_DIR_PATH)) { + absTargetPath = absTargetPath.replace( + getPagesDir(vfile), + getCurrentDir(vfile) + ); + } (node as Link | Image | Definition).url = relative( absMdxPath, @@ -151,9 +160,6 @@ export const updatePathsInIncludes = ({ ); } else { const absMdxPath = resolve(getOriginalPath(vfile)); - - const absTargetPath = resolve(versionRootDir, dirname(includePath), href); - (node as Link | Image | Definition).url = relative( dirname(absMdxPath), absTargetPath diff --git a/server/fixtures/code-snippet-empty-line.mdx b/server/fixtures/code-snippet-empty-line.mdx new file mode 100644 index 0000000..64393d5 --- /dev/null +++ b/server/fixtures/code-snippet-empty-line.mdx @@ -0,0 +1,16 @@ +```code +$ tsh request search --kind node +Name Hostname Labels Resource ID +------------------------------------ ----------- ------------ +------------------------------------------------------ +b1168402-9340-421a-a344-af66a6675738 iot test=test +/teleport.example.com/node/b1168402-9340-421a-a344-af66a6675738 +bbb56211-7b54-4f9e-bee9-b68ea156be5f node test=test +/teleport.example.com/node/bbb56211-7b54-4f9e-bee9-b68ea156be5f + +To request access to these resources, run +> tsh request create --resource +> /teleport.example.com/node/b1168402-9340-421a-a344-af66a6675738 --resource +> /teleport.example.com/node/bbb56211-7b54-4f9e-bee9-b68ea156be5f \ +> --reason +``` diff --git a/server/fixtures/go-comment-var.mdx b/server/fixtures/go-comment-var.mdx new file mode 100644 index 0000000..9082ea3 --- /dev/null +++ b/server/fixtures/go-comment-var.mdx @@ -0,0 +1,8 @@ +```go +// This is a comment about the code below, which contains a +// . This comment also includes another +// . This is the end of the comment. +func myfunc(attr string) error { + return nil +} +``` diff --git a/server/fixtures/hcl-addr-var.mdx b/server/fixtures/hcl-addr-var.mdx new file mode 100644 index 0000000..d1ea119 --- /dev/null +++ b/server/fixtures/hcl-addr-var.mdx @@ -0,0 +1,29 @@ +1. Create a `main.tf` file containing this minimal Terraform code: + + ```hcl + terraform { + required_providers { + teleport = { + source = "terraform.releases.teleport.dev/gravitational/teleport" + version = "~> (=teleport.major_version=).0" + } + } + } + + provider "teleport" { + addr = '' + } + ``` + +1. Then, init your Terraform working directory to download the Teleport provider: + + ```code + $ terraform init + Initializing the backend... + + Initializing provider plugins... + - Finding terraform.releases.teleport.dev/gravitational/teleport versions matching ... + ``` + +1. Finally, run a Terraform plan: + diff --git a/server/fixtures/hcl-vars.mdx b/server/fixtures/hcl-vars.mdx new file mode 100644 index 0000000..0bda284 --- /dev/null +++ b/server/fixtures/hcl-vars.mdx @@ -0,0 +1,11 @@ +Assign to the address of +your Teleport Proxy Service. + +```hcl +provider "teleport" { + # Update addr to point to your Teleport Cloud tenant URL's host:port + addr = "" + identity_file_path = "terraform-identity" +} +``` + diff --git a/server/fixtures/includes-multiple-result.mdx b/server/fixtures/includes-multiple-result.mdx new file mode 100644 index 0000000..67b92a5 --- /dev/null +++ b/server/fixtures/includes-multiple-result.mdx @@ -0,0 +1,39 @@ +## Example code block + +Code block with multiple includes. + +```css +.example1 { + width: 50%; + height: 50%; +} + +.base { + width: 100%; + height: 100%; +} + +.base { + width: 100%; + height: 100%; +} + +.example2 { + width: 50%; + height: 50%; +} + +.base { + width: 100%; + height: 100%; +} + +``` + +## Example test block + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/server/fixtures/includes-multiple-source.mdx b/server/fixtures/includes-multiple-source.mdx new file mode 100644 index 0000000..0e9d457 --- /dev/null +++ b/server/fixtures/includes-multiple-source.mdx @@ -0,0 +1,27 @@ +## Example code block + +Code block with multiple includes. + +```css +.example1 { + width: 50%; + height: 50%; +} + +(!include.css!) +(!include.css!) +.example2 { + width: 50%; + height: 50%; +} + +(!include.css!) +``` + +## Example test block + +(!include-string.mdx!) + +(!include-string.mdx!) + +(!include-string.mdx!) \ No newline at end of file diff --git a/server/fixtures/includes-result.mdx b/server/fixtures/includes-result.mdx new file mode 100644 index 0000000..7d8f744 --- /dev/null +++ b/server/fixtures/includes-result.mdx @@ -0,0 +1,64 @@ +## Header + +```css +.base { + width: 100%; + height: 100%; +} + +``` + +```css +/* Some text inside codeblock before */ + +.base { + width: 100%; + height: 100%; +} + + +/* And after */ +``` + +```md +| OPERATING SYSTEM | CHECKSUM | DOWNLOAD LINK | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Linux 32-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz) | +| Linux 64-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz) | +| Linux 64-bit (RHEL/CentOS 6.x compatible) | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz) | +| Linux ARMv7 | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz) | +| Linux 64-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb.sha256) | [teleport-v6.0.0-alpha.2-amd64.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 32-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_i386.deb.sha256) | [teleport-v6.0.0-alpha.2-i386.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 64-bit RPM | [SHA256](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm.sha256) | [teleport-6.0.0-alpha.2-1.x86-64.rpm](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm) | +| Docker Image | [SHA256](https://quay.io/repository/gravitational/teleport?tab=tags) | `docker pull quay.io/gravitational/teleport:6.0.0-alpha.2` | +``` + +| OPERATING SYSTEM | CHECKSUM | DOWNLOAD LINK | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Linux 32-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz) | +| Linux 64-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz) | +| Linux 64-bit (RHEL/CentOS 6.x compatible) | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz) | +| Linux ARMv7 | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz) | +| Linux 64-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb.sha256) | [teleport-v6.0.0-alpha.2-amd64.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 32-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_i386.deb.sha256) | [teleport-v6.0.0-alpha.2-i386.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 64-bit RPM | [SHA256](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm.sha256) | [teleport-6.0.0-alpha.2-1.x86-64.rpm](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm) | +| Docker Image | [SHA256](https://quay.io/repository/gravitational/teleport?tab=tags) | `docker pull quay.io/gravitational/teleport:6.0.0-alpha.2` | + +Some text before (!include-table.mdx!) and after + +(!non-existing.mdx!) + + + + | OPERATING SYSTEM | CHECKSUM | DOWNLOAD LINK | + | ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | + | Linux 32-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz) | + | Linux 64-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz) | + | Linux 64-bit (RHEL/CentOS 6.x compatible) | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz) | + | Linux ARMv7 | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz) | + | Linux 64-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb.sha256) | [teleport-v6.0.0-alpha.2-amd64.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | + | Linux 32-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_i386.deb.sha256) | [teleport-v6.0.0-alpha.2-i386.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | + | Linux 64-bit RPM | [SHA256](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm.sha256) | [teleport-6.0.0-alpha.2-1.x86-64.rpm](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm) | + | Docker Image | [SHA256](https://quay.io/repository/gravitational/teleport?tab=tags) | `docker pull quay.io/gravitational/teleport:6.0.0-alpha.2` | + + diff --git a/server/fixtures/includes-source.mdx b/server/fixtures/includes-source.mdx new file mode 100644 index 0000000..88bd884 --- /dev/null +++ b/server/fixtures/includes-source.mdx @@ -0,0 +1,29 @@ +## Header + +```css +(!include.css!) +``` + +```css +/* Some text inside codeblock before */ + +(!include.css!) + +/* And after */ +``` + +```md +(!include-table.mdx!) +``` + +(!include-table.mdx!) + +Some text before (!include-table.mdx!) and after + +(!non-existing.mdx!) + + + + (!include-table.mdx!) + + diff --git a/server/fixtures/includes-vars-erroneous-include.mdx b/server/fixtures/includes-vars-erroneous-include.mdx new file mode 100644 index 0000000..9c9807d --- /dev/null +++ b/server/fixtures/includes-vars-erroneous-include.mdx @@ -0,0 +1,5 @@ +## Installation + +Here is a test for including variables in an MDX file. + +(!install-version.mdx version="10" unsupport="9" !) diff --git a/server/fixtures/includes-vars-result.mdx b/server/fixtures/includes-vars-result.mdx new file mode 100644 index 0000000..dd56743 --- /dev/null +++ b/server/fixtures/includes-vars-result.mdx @@ -0,0 +1,59 @@ +## Installation + +Here is a test for including variables in an MDX file. + +Here are instructions for installing version 10: + +```code +$ curl -OL https://example.com/downloads/mysoftware-v10.tar +$ tar -xvf mysoftware-v10.tar +``` + +We no longer support version 9. + +If installation fails, you will see the following error message: + +```text +Installation has failed! +``` + +If installation succeeds, you will see this message: + +```text +Installation==successful! Type "Continue" to proceed. +``` + +After you type "Continue", you will see this message: + +```text +Type 'next' to see the next screen. +``` + +After that, you will see this message: + +```text +Type "final" to see the final screen. +``` + +## Supported platforms + +### Open Source + +The operating systems we support include macOS, Windows Server, and Linux. + +We also support Kubernetes environments on AWS and GCP. + +### Enterprise + +The operating systems we support include macOS and Windows. + +We also support Kubernetes environments on AWS, Azure, and Google Cloud. + +## What about partials where there are no required variables supplied? + +We'll show the template variable in case the partial intended to include the `{{ +variable }}` string. + +```text +{{ message }} +``` diff --git a/server/fixtures/includes-vars.mdx b/server/fixtures/includes-vars.mdx new file mode 100644 index 0000000..92c23e9 --- /dev/null +++ b/server/fixtures/includes-vars.mdx @@ -0,0 +1,38 @@ +## Installation + +Here is a test for including variables in an MDX file. + +(!install-version.mdx version="10" unsupported="9" !) + +If installation fails, you will see the following error message: + +(!error-message.mdx message="Installation has failed!"!) + +If installation succeeds, you will see this message: + +(!error-message.mdx message="Installation==successful! Type \\"Continue\\" to proceed."!) + +After you type "Continue", you will see this message: + +(!error-message.mdx message="Type 'next' to see the next screen."!) + +After that, you will see this message: + +(!error-message.mdx message="Type \\"final\\" to see the final screen."!) + +## Supported platforms + +### Open Source + +(!supported-systems.mdx clouds="AWS and GCP"!) + +### Enterprise + +(!supported-systems.mdx systems="macOS and Windows"!) + +## What about partials where there are no required variables supplied? + +We'll show the template variable in case the partial intended to include the `{{ +variable }}` string. + +(!error-message.mdx!) diff --git a/server/fixtures/includes/anchor-links.mdx b/server/fixtures/includes/anchor-links.mdx new file mode 100644 index 0000000..471f4a0 --- /dev/null +++ b/server/fixtures/includes/anchor-links.mdx @@ -0,0 +1,5 @@ +This is a [link to an anchor](#this-is-a-section). + +## This is a section. + +This is content within the section. diff --git a/server/fixtures/includes/database-access/attach-iam-policies.mdx b/server/fixtures/includes/database-access/attach-iam-policies.mdx new file mode 100644 index 0000000..df5fc4b --- /dev/null +++ b/server/fixtures/includes/database-access/attach-iam-policies.mdx @@ -0,0 +1,11 @@ +Attach the policy and permission boundary you created earlier to the IAM +identity your Teleport Database Service will be using. + +For example, if the Database Service runs as an IAM user, go to the page of the IAM user +in the AWS Management Console, attach the created policy in the "Permissions +policies" section, and set the created boundary policy in the "Permissions +boundary" section. + +
+![IAM user](../../../img/database-access/iam@2x.png) +
diff --git a/server/fixtures/includes/error-message.mdx b/server/fixtures/includes/error-message.mdx new file mode 100644 index 0000000..1aec7de --- /dev/null +++ b/server/fixtures/includes/error-message.mdx @@ -0,0 +1,3 @@ +```text +{{ message }} +``` diff --git a/server/fixtures/includes/include-relative-link.mdx b/server/fixtures/includes/include-relative-link.mdx new file mode 100644 index 0000000..490a0e0 --- /dev/null +++ b/server/fixtures/includes/include-relative-link.mdx @@ -0,0 +1,6 @@ + +Check out our [instructions](../installation.mdx). + +Here is an image showing a successful installation: + +[Successful installation](../installation.png) diff --git a/server/fixtures/includes/include-string.mdx b/server/fixtures/includes/include-string.mdx new file mode 100644 index 0000000..08e00ed --- /dev/null +++ b/server/fixtures/includes/include-string.mdx @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/server/fixtures/includes/include-table.mdx b/server/fixtures/includes/include-table.mdx new file mode 100644 index 0000000..4eca31a --- /dev/null +++ b/server/fixtures/includes/include-table.mdx @@ -0,0 +1,10 @@ +| OPERATING SYSTEM | CHECKSUM | DOWNLOAD LINK | +| ----------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| Linux 32-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-386-bin.tar.gz) | +| Linux 64-bit | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-bin.tar.gz) | +| Linux 64-bit (RHEL/CentOS 6.x compatible) | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-amd64-centos6-bin.tar.gz) | +| Linux ARMv7 | [SHA256](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz.sha256) | [teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz](https://get.gravitational.com/teleport-v6.0.0-alpha.2-linux-arm-bin.tar.gz) | +| Linux 64-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb.sha256) | [teleport-v6.0.0-alpha.2-amd64.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 32-bit DEB | [SHA256](https://get.gravitational.com/teleport_6.0.0-alpha.2_i386.deb.sha256) | [teleport-v6.0.0-alpha.2-i386.deb](https://get.gravitational.com/teleport_6.0.0-alpha.2_amd64.deb) | +| Linux 64-bit RPM | [SHA256](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm.sha256) | [teleport-6.0.0-alpha.2-1.x86-64.rpm](https://get.gravitational.com/teleport-6.0.0-alpha.2-1.x86_64.rpm) | +| Docker Image | [SHA256](https://quay.io/repository/gravitational/teleport?tab=tags) | `docker pull quay.io/gravitational/teleport:6.0.0-alpha.2` | \ No newline at end of file diff --git a/server/fixtures/includes/include.css b/server/fixtures/includes/include.css new file mode 100644 index 0000000..e1e1a1b --- /dev/null +++ b/server/fixtures/includes/include.css @@ -0,0 +1,4 @@ +.base { + width: 100%; + height: 100%; +} diff --git a/server/fixtures/includes/includes-code-snippet-heredoc-error.mdx b/server/fixtures/includes/includes-code-snippet-heredoc-error.mdx new file mode 100644 index 0000000..f4978b3 --- /dev/null +++ b/server/fixtures/includes/includes-code-snippet-heredoc-error.mdx @@ -0,0 +1,18 @@ +## Header + +```code +# Copy and Paste the below and run on the Teleport Auth server. +$ cat > api-role.yaml < api-role.yaml < api-role.yaml << ENDOFMESSAGE > aws-issuer.yaml +kind: role +metadata: + name: api-role +spec: + allow: + rules: + - resources: ['role'] + verbs: ['read'] + deny: + node_labels: + '*': '*' +version: v3 +ENDOFMESSAGE + +# Create role +$ tctl create -f api-role.yaml +# Add user and login via web proxy +$ tctl users add api-user --roles=api-role +``` \ No newline at end of file diff --git a/server/fixtures/includes/includes-code-snippet-simplest.mdx b/server/fixtures/includes/includes-code-snippet-simplest.mdx new file mode 100644 index 0000000..6260ebb --- /dev/null +++ b/server/fixtures/includes/includes-code-snippet-simplest.mdx @@ -0,0 +1,11 @@ +## Header + +```code +$ tsh app config --format=uri +# https://grafana-root.gravitational.io:3080 +``` + +```bash +$ tsh app config --format=uri +# it's bash lang +``` diff --git a/server/fixtures/includes/includes-relative-link-def.mdx b/server/fixtures/includes/includes-relative-link-def.mdx new file mode 100644 index 0000000..5bd90a9 --- /dev/null +++ b/server/fixtures/includes/includes-relative-link-def.mdx @@ -0,0 +1,3 @@ +This partial has a relative link [definition]. + +[definition]: ../../installation.mdx diff --git a/server/fixtures/includes/includes-var-after-commands.mdx b/server/fixtures/includes/includes-var-after-commands.mdx new file mode 100644 index 0000000..74d0062 --- /dev/null +++ b/server/fixtures/includes/includes-var-after-commands.mdx @@ -0,0 +1,11 @@ +## Header + +```code +$ aws iam create-policy --policy-name +# some comment +"Policy": { + "PolicyName": "", + "PolicyId": "ANPAW2Y2Q2Y2Y2Y2Y2Y2Y", + "Arn": "arn:aws:iam::aws:policy/" +} +``` diff --git a/server/fixtures/includes/includes-var-in-block-var.mdx b/server/fixtures/includes/includes-var-in-block-var.mdx new file mode 100644 index 0000000..c8a89e1 --- /dev/null +++ b/server/fixtures/includes/includes-var-in-block-var.mdx @@ -0,0 +1,12 @@ +## Header + +```var +teleport: + identitySecretName: "teleport-plugin-jira-identity" + address: +# /etc/teleport.yaml +auth_service: + # ... + ca_key_params: + keyring: +``` diff --git a/server/fixtures/includes/includes-var-in-command.mdx b/server/fixtures/includes/includes-var-in-command.mdx new file mode 100644 index 0000000..50befea --- /dev/null +++ b/server/fixtures/includes/includes-var-in-command.mdx @@ -0,0 +1,5 @@ +## Header + +```code +$ docker pull quay.io/gravitational/teleport:9 we recommend following our +``` diff --git a/server/fixtures/includes/includes-var-in-multiline-command.mdx b/server/fixtures/includes/includes-var-in-multiline-command.mdx new file mode 100644 index 0000000..4227953 --- /dev/null +++ b/server/fixtures/includes/includes-var-in-multiline-command.mdx @@ -0,0 +1,12 @@ +## Header + +```code +$ tctl create < +version: v3 +metadata: + : +EOF +# create the role +$ tsh db ls +``` diff --git a/server/fixtures/includes/includes-var-in-yaml.mdx b/server/fixtures/includes/includes-var-in-yaml.mdx new file mode 100644 index 0000000..a053b30 --- /dev/null +++ b/server/fixtures/includes/includes-var-in-yaml.mdx @@ -0,0 +1,12 @@ +## Header + +```yaml +teleport: + identitySecretName: "teleport-plugin-jira-identity" + address: +# /etc/teleport.yaml +auth_service: + # ... + ca_key_params: + keyring: +``` diff --git a/server/fixtures/includes/install-version.mdx b/server/fixtures/includes/install-version.mdx new file mode 100644 index 0000000..25637a2 --- /dev/null +++ b/server/fixtures/includes/install-version.mdx @@ -0,0 +1,8 @@ +Here are instructions for installing version {{ version }}: + +```code +$ curl -OL https://example.com/downloads/mysoftware-v{{ version }}.tar +$ tar -xvf mysoftware-v{{ version }}.tar +``` + +We no longer support version {{ unsupported }}. diff --git a/server/fixtures/includes/supported-systems.mdx b/server/fixtures/includes/supported-systems.mdx new file mode 100644 index 0000000..697562d --- /dev/null +++ b/server/fixtures/includes/supported-systems.mdx @@ -0,0 +1,5 @@ +{{ systems="macOS, Windows Server, and Linux" clouds="AWS, Azure, and Google Cloud" }} + +The operating systems we support include {{ systems }}. + +We also support Kubernetes environments on {{ clouds }}. diff --git a/server/fixtures/powershell-var.mdx b/server/fixtures/powershell-var.mdx new file mode 100644 index 0000000..0991ab8 --- /dev/null +++ b/server/fixtures/powershell-var.mdx @@ -0,0 +1,3 @@ +```powershell +certutil -dspublish -f NTAuthCA +``` diff --git a/server/fixtures/result/code-snippet-empty-line.mdx b/server/fixtures/result/code-snippet-empty-line.mdx new file mode 100644 index 0000000..52f5759 --- /dev/null +++ b/server/fixtures/result/code-snippet-empty-line.mdx @@ -0,0 +1,61 @@ + + + + tsh request search --kind node + + + + + Name Hostname Labels Resource ID + + + + \------------------------------------ ----------- ------------ + + + + \------------------------------------------------------ + + + + b1168402-9340-421a-a344-af66a6675738 iot test=test + + + + /teleport.example.com/node/b1168402-9340-421a-a344-af66a6675738 + + + + bbb56211-7b54-4f9e-bee9-b68ea156be5f node test=test + + + + /teleport.example.com/node/bbb56211-7b54-4f9e-bee9-b68ea156be5f + + + + + + +
+ + + To request access to these resources, run + + + + \> tsh request create --resource + + + + \> /teleport.example.com/node/b1168402-9340-421a-a344-af66a6675738 --resource + + + + \> /teleport.example.com/node/bbb56211-7b54-4f9e-bee9-b68ea156be5f \ + + + + \> --reason + +
diff --git a/server/fixtures/result/code-snippet-heredoc.mdx b/server/fixtures/result/code-snippet-heredoc.mdx new file mode 100644 index 0000000..975a31d --- /dev/null +++ b/server/fixtures/result/code-snippet-heredoc.mdx @@ -0,0 +1,91 @@ +## Header + + + + Copy and Paste the below and run on the Teleport Auth server. + + + + + cat > api-role.yaml < + + + kind: role + + + + metadata: + + + + name: api-role + + + + spec: + + + + allow: + + + + rules: + + + + \- resources: ['role'] + + + + verbs: ['read'] + + + + deny: + + + + node_labels: + + + + '*': '*' + + + + version: v3 + + + + ENDOFMESSAGE + + + + + + + +
+ + + Create role + + + + + tctl create -f api-role.yaml + + + + + Add user and login via web proxy + + + + + tctl users add api-user --roles=api-role + + +
diff --git a/server/fixtures/result/code-snippet-multiline.mdx b/server/fixtures/result/code-snippet-multiline.mdx new file mode 100644 index 0000000..5c76eae --- /dev/null +++ b/server/fixtures/result/code-snippet-multiline.mdx @@ -0,0 +1,25 @@ +## Header + + + + + curl \ + + + + \--cacert /Users/alice/.tsh/keys/teleport.example.com/certs.pem \ + + + + \--cert /Users/alice/.tsh/keys/teleport.example.com/alice-app/cluster-name/grafana-x509.pem \ + + + + \--key /Users/alice/.tsh/keys/teleport.example.com/alice \ + + + + https://grafana.teleport.example.com:3080 + + + diff --git a/server/fixtures/result/code-snippet-simplest.mdx b/server/fixtures/result/code-snippet-simplest.mdx new file mode 100644 index 0000000..8106e57 --- /dev/null +++ b/server/fixtures/result/code-snippet-simplest.mdx @@ -0,0 +1,25 @@ +## Header + + + + + tsh app config --format=uri + + + + + https://grafana-root.gravitational.io:3080 + + + + + + + tsh app config --format=uri + + + + + it's bash lang + + diff --git a/server/fixtures/result/go-comment-var.html b/server/fixtures/result/go-comment-var.html new file mode 100644 index 0000000..6c382a5 --- /dev/null +++ b/server/fixtures/result/go-comment-var.html @@ -0,0 +1,7 @@ +
// This is a comment about the code below, which contains a 
+// . This comment also includes another 
+// . This is the end of the comment.
+func myfunc(attr string) error {
+  return nil
+}
+
diff --git a/server/fixtures/result/hcl-addr-var.html b/server/fixtures/result/hcl-addr-var.html new file mode 100644 index 0000000..fbe18ee --- /dev/null +++ b/server/fixtures/result/hcl-addr-var.html @@ -0,0 +1,30 @@ +
    +
  1. +

    Create a main.tf file containing this minimal Terraform code:

    +
    terraform {
    +  required_providers {
    +    teleport = {
    +      source  = "terraform.releases.teleport.dev/gravitational/teleport"
    +      version = "~> (=teleport.major_version=).0"
    +    }
    +  }
    +}
    +
    +provider "teleport" {
    +  addr               = ''
    +}
    +
    +
  2. +
  3. +

    Then, init your Terraform working directory to download the Teleport provider:

    +
    $ terraform init
    +Initializing the backend...
    +
    +Initializing provider plugins...
    +- Finding terraform.releases.teleport.dev/gravitational/teleport versions matching ...
    +
    +
  4. +
  5. +

    Finally, run a Terraform plan:

    +
  6. +
\ No newline at end of file diff --git a/server/fixtures/result/hcl-vars.html b/server/fixtures/result/hcl-vars.html new file mode 100644 index 0000000..3b70417 --- /dev/null +++ b/server/fixtures/result/hcl-vars.html @@ -0,0 +1,8 @@ +

Assign to the address of +your Teleport Proxy Service.

+
provider "teleport" {
+  # Update addr to point to your Teleport Cloud tenant URL's host:port
+  addr               = ""
+  identity_file_path = "terraform-identity"
+}
+
diff --git a/server/fixtures/result/powershell-var.html b/server/fixtures/result/powershell-var.html new file mode 100644 index 0000000..9325e1d --- /dev/null +++ b/server/fixtures/result/powershell-var.html @@ -0,0 +1,2 @@ +
certutil -dspublish -f  NTAuthCA
+
diff --git a/server/fixtures/result/var-after-commands.mdx b/server/fixtures/result/var-after-commands.mdx new file mode 100644 index 0000000..47b2f5a --- /dev/null +++ b/server/fixtures/result/var-after-commands.mdx @@ -0,0 +1,45 @@ +## Header + + + + + aws iam create-policy --policy-name + + + + + + + + + some comment + + + + "Policy": { + + + + "PolicyName": " + + + + ", + + + + "PolicyId": "ANPAW2Y2Q2Y2Y2Y2Y2Y2Y", + + + + "Arn": "arn:aws:iam::aws:policy/" + + + + + + + + } + + diff --git a/server/fixtures/result/var-in-block-var.mdx b/server/fixtures/result/var-in-block-var.mdx new file mode 100644 index 0000000..514332c --- /dev/null +++ b/server/fixtures/result/var-in-block-var.mdx @@ -0,0 +1,43 @@ +## Header + + + + teleport: + + + + identitySecretName: "teleport-plugin-jira-identity" + + + + address: + + + + + + + + /etc/teleport.yaml + + + + auth_service: + + + + \# ... + + + + ca_key_params: + + + + keyring: + + + + + + diff --git a/server/fixtures/result/var-in-command.mdx b/server/fixtures/result/var-in-command.mdx new file mode 100644 index 0000000..a3ce988 --- /dev/null +++ b/server/fixtures/result/var-in-command.mdx @@ -0,0 +1,17 @@ +## Header + + + + + docker pull + + + + quay.io/gravitational/teleport:9 + + + + we recommend following our + + + diff --git a/server/fixtures/result/var-in-multiline-command.mdx b/server/fixtures/result/var-in-multiline-command.mdx new file mode 100644 index 0000000..c35f3db --- /dev/null +++ b/server/fixtures/result/var-in-multiline-command.mdx @@ -0,0 +1,51 @@ +## Header + + + + + tctl create < + + + kind: + + + + + + + + version: v3 + + + + metadata: + + + + + + + + : + + + + + + + + EOF + + + + + create the role + + + + + tsh db ls + + + diff --git a/server/fixtures/result/yaml-comment-vars.html b/server/fixtures/result/yaml-comment-vars.html new file mode 100644 index 0000000..10abe85 --- /dev/null +++ b/server/fixtures/result/yaml-comment-vars.html @@ -0,0 +1,9 @@ +

Here are variables in a code snippet:

+
# This is a comment where you should set some variable values, e.g.,
+#  and 
+key1: 
+  - 
+  - Another value
+  - Another value
+key2: A value
+
diff --git a/server/fixtures/result/yaml-snippet-var.html b/server/fixtures/result/yaml-snippet-var.html new file mode 100644 index 0000000..a414b9d --- /dev/null +++ b/server/fixtures/result/yaml-snippet-var.html @@ -0,0 +1,8 @@ +

Here is a YAML snippet:

+
key1: 
+key2: value
+key3:
+ - value
+ - value2
+ - value3
+
diff --git a/server/fixtures/toc/expected.mdx b/server/fixtures/toc/expected.mdx index 771431f..9cbec5e 100644 --- a/server/fixtures/toc/expected.mdx +++ b/server/fixtures/toc/expected.mdx @@ -2,6 +2,6 @@ Here is an intro. -* [Protect Databases with Teleport](database-access.mdx): Guides to protecting databases with Teleport. -* [Protect MySQL with Teleport](mysql.mdx): How to enroll your MySQL database with Teleport -* [Protect Postgres with Teleport](postgres.mdx): How to enroll Postgres with your Teleport cluster +* [Protect Databases with Teleport](database-access.mdx): Guides to protecting databases with Teleport. +* [Protect MySQL with Teleport](mysql.mdx): How to enroll your MySQL database with Teleport +* [Protect Postgres with Teleport](postgres.mdx): How to enroll Postgres with your Teleport cluster diff --git a/server/fixtures/variables-result.mdx b/server/fixtures/variables-result.mdx new file mode 100644 index 0000000..60ff395 --- /dev/null +++ b/server/fixtures/variables-result.mdx @@ -0,0 +1,27 @@ +### Header 1.0 + +Paragraph 1.0. + +Previously escaped variable 1.0. + +``` +Code 1.0.1 +``` + +Inline code `1.0`. + +[Link text 1.0](/here-we-are) + +[Link value](/here-we-are/1.0) + +[Escaped valiable in link](/here-we-are/1.0) + +Value 1.0 + +Value + +Non existing variable (=variable=) + +

Block element

+ +Text diff --git a/server/fixtures/variables-source.mdx b/server/fixtures/variables-source.mdx new file mode 100644 index 0000000..6068eed --- /dev/null +++ b/server/fixtures/variables-source.mdx @@ -0,0 +1,27 @@ +### Header (=version=) + +Paragraph (=version=). + +Previously escaped variable (=version=). + +``` +Code (=teleport.version=) +``` + +Inline code `(=version=)`. + +[Link text (=version=)](/here-we-are) + +[Link value](/here-we-are/(=version=)) + +[Escaped valiable in link](/here-we-are/\(=version=\)) + +Value (=version=) + +Value + +Non existing variable (=variable=) + +

Block element

+ +Text diff --git a/server/fixtures/varlist.mdx b/server/fixtures/varlist.mdx new file mode 100644 index 0000000..f6d8074 --- /dev/null +++ b/server/fixtures/varlist.mdx @@ -0,0 +1,8 @@ +Here is an example of a `VarList`. + +```markdown +
+ +
+``` + diff --git a/server/fixtures/yaml-comment-vars.mdx b/server/fixtures/yaml-comment-vars.mdx new file mode 100644 index 0000000..21a3598 --- /dev/null +++ b/server/fixtures/yaml-comment-vars.mdx @@ -0,0 +1,11 @@ +Here are variables in a code snippet: + +```yaml +# This is a comment where you should set some variable values, e.g., +# and +key1: + - + - Another value + - Another value +key2: A value +``` diff --git a/server/fixtures/yaml-snippet-var.mdx b/server/fixtures/yaml-snippet-var.mdx new file mode 100644 index 0000000..4132b70 --- /dev/null +++ b/server/fixtures/yaml-snippet-var.mdx @@ -0,0 +1,10 @@ +Here is a YAML snippet: + +```yaml +key1: +key2: value +key3: + - value + - value2 + - value3 +``` diff --git a/server/rehype-hljs.test.ts b/server/rehype-hljs.test.ts new file mode 100644 index 0000000..a6925a7 --- /dev/null +++ b/server/rehype-hljs.test.ts @@ -0,0 +1,146 @@ +import { describe, expect, test } from "@jest/globals"; +import rehypeMdxToHast from "./rehype-mdx-to-hast"; +import { VFile, VFileOptions } from "vfile"; +import { remark } from "remark"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import mdx from "remark-mdx"; +import { rehypeHLJS } from "./rehype-hljs"; +import { unified } from "unified"; +import remarkRehype from "remark-rehype"; +import remarkParse from "remark-parse"; +import rehypeStringify from "rehype-stringify"; +import { definer as hcl } from "highlightjs-terraform"; + +describe("server/remark-hljs-var", () => { + // transformer executes remark and rehype plugins to transform a VFile using + // rehypeHLJS. It uses legacy logic from gravitational/docs. + // TODO: Use an approach that more closely reflects the remark/rehype execution + // logic of Docusaurus. + const transformer = (options: VFileOptions) => + unified() + .use(remarkParse as any) + .use(mdx) + .use(remarkRehype as any, { + passThrough: [ + "mdxFlowExpression", + "mdxJsxFlowElement", + "mdxJsxTextElement", + "mdxTextExpression", + "mdxjsEsm", + ], + }) + .use(rehypeHLJS, { + aliases: { + bash: ["bsh", "systemd", "code", "powershell"], + }, + languages: { hcl: hcl }, + }) + .use(rehypeMdxToHast as any) + .use(rehypeStringify) + .processSync(new VFile(options)); + + test("Insert Var components as HTML nodes: Var gets its own hljs span", () => { + const result = transformer({ + value: readFileSync( + resolve("server/fixtures/yaml-snippet-var.mdx"), + "utf-8" + ), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/yaml-snippet-var.html"), + "utf-8" + ).trim() + ); + }); + + test("Insert Var components as HTML nodes: Var part of a broader span in go", () => { + const result = transformer({ + value: readFileSync( + resolve("server/fixtures/go-comment-var.mdx"), + "utf-8" + ), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/go-comment-var.html"), + "utf-8" + ).trim() + ); + }); + + test("Insert Var components as HTML nodes: Var part of a broader span in YAML", () => { + const result = transformer({ + value: readFileSync( + resolve("server/fixtures/yaml-comment-vars.mdx"), + "utf-8" + ), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/yaml-comment-vars.html"), + "utf-8" + ).trim() + ); + }); + + test("Insert Var components as HTML nodes: text after a Var", () => { + const result = transformer({ + value: readFileSync(resolve("server/fixtures/hcl-vars.mdx"), "utf-8"), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/hcl-vars.html"), + "utf-8" + ).trim() + ); + }); + + test("Insert Var components as HTML nodes: powershell snippet", () => { + const result = transformer({ + value: readFileSync( + resolve("server/fixtures/powershell-var.mdx"), + "utf-8" + ), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/powershell-var.html"), + "utf-8" + ).trim() + ); + }); + + test("Ignore VarList in code snippet components", () => { + // This throws if the plugin interprets VarList components as being Vars. + transformer({ + value: readFileSync(resolve("server/fixtures/varlist.mdx"), "utf-8"), + path: "/docs/index.mdx", + }); + }); + + test("Next node as one of several code node children", () => { + const result = transformer({ + value: readFileSync(resolve("server/fixtures/hcl-addr-var.mdx"), "utf-8"), + path: "/docs/index.mdx", + }); + + expect((result.value as string).trim()).toBe( + readFileSync( + resolve("server/fixtures/result/hcl-addr-var.html"), + "utf-8" + ).trim() + ); + }); +}); diff --git a/server/rehype-mdx-to-hast.ts b/server/rehype-mdx-to-hast.ts new file mode 100644 index 0000000..5767ff3 --- /dev/null +++ b/server/rehype-mdx-to-hast.ts @@ -0,0 +1,101 @@ +/* + * rehype-mdx-to-hast converts a subset of MDX nodes to HAST. The legacy + * NextJS-based engine (the gravitational/docs repo) used this to convert docs + * pages to JSON-serializable objects to be returned by Vercel. The current + * Docusaurus-based engine only uses this to ensure that legacy tests pass. + */ + +import type { Transformer } from "unified"; +import type { Parent } from "unist"; +import type { + MdxJsxFlowElement, + MdxJsxTextElement, + MdxJsxAttribute, + MdxJsxAttributeValueExpression, +} from "mdast-util-mdx-jsx"; +import type { MdxjsEsm } from "mdast-util-mdxjs-esm"; +import type { + MdxFlowExpression, + MdxTextExpression, +} from "mdast-util-mdx-expression"; + +import { visit } from "unist-util-visit"; + +// All the types of node that can be inside MDX file +type MdxNode = + | MdxJsxFlowElement // https://github.com/syntax-tree/mdast-util-mdx-jsx/blob/main/lib/complex-types.d.ts + | MdxJsxTextElement // https://github.com/syntax-tree/mdast-util-mdx-jsx/blob/main/lib/complex-types.d.ts + | MdxjsEsm // https://github.com/syntax-tree/mdast-util-mdxjs-esm/blob/main/complex-types.d.ts + | MdxFlowExpression // https://github.com/syntax-tree/mdast-util-mdx-expression/blob/main/complex-types.d.ts + | MdxTextExpression; // https://github.com/syntax-tree/mdast-util-mdx-expression/blob/main/complex-types.d.ts + +export default function rehypeMdxToHast(): Transformer { + return (root: Parent) => { + visit(root, (node: any, index: number, parent: Parent) => { + // TextElement in an inline tag and FlowElement is a block tag. e want ot convert them. + if ( + node.type === "mdxJsxTextElement" || + node.type === "mdxJsxFlowElement" + ) { + const newNode = { + type: "element", + tagName: node.name.toLowerCase(), + properties: (node.attributes as MdxJsxAttribute[]).reduce( + (result, prop) => { + // If the prop in markdown was a js-expression like disabled={true} + // it will be parsed as an object with original value as a string + // and as a estree. For now we just use the string value. + if (typeof prop.value === "object" && prop.value !== null) { + // Temporary fix for scopeOnly={true}, can be removed after docs update + if (prop.name === "scopeOnly") { + return { + ...result, + [prop.name]: prop?.value?.value || null, + }; + // Temporary fix for scope={["oss", "cloud"]}, will transform value + // to scope="oss,cloud". Can be removed after docs update. + } else if (prop.name === "scope") { + return { + ...result, + [prop.name]: ( + prop.value as MdxJsxAttributeValueExpression + ).value + .split(",") + .map((part) => part.replace(/[^a-z]+/g, "")) + .join(","), + }; + } + + // By default just return value as is. E. g. field={something} + // will get value "{something}"" as is with curly braces. + return { + ...result, + [prop.name]: (prop.value as MdxJsxAttributeValueExpression) + .value, + }; + } + + // for non-js nodes just return value + return { + ...result, + [prop.name]: prop.value === null ? true : prop.value, + }; + }, + {} + ), + children: node.children, + }; + + parent.children[index] = newNode; + // This is a pure JS nodes, like {1 + 1} or imports/exports. + // Just removing them for now for simplicity. + } else if ( + ["mdxFlowExpression", "mdxTextExpression", "mdxjsEsm"].includes( + node.type + ) + ) { + parent.children.splice(index, 1); + } + }); + }; +} diff --git a/server/remark-code-snippet.test.ts b/server/remark-code-snippet.test.ts new file mode 100644 index 0000000..8834d63 --- /dev/null +++ b/server/remark-code-snippet.test.ts @@ -0,0 +1,263 @@ +import { describe, expect, test } from "@jest/globals"; +import { VFile, VFileOptions } from "vfile"; +import { remark } from "remark"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import mdx from "remark-mdx"; +import remarkCodeSnippet, { + RemarkCodeSnippetOptions, +} from "../server/remark-code-snippet"; + +const transformer = ( + options: VFileOptions, + pluginOptions: RemarkCodeSnippetOptions = { + resolve: true, + langs: ["code", "bash", "var"], + } +) => + remark() + .use(mdx as any) + .use(remarkCodeSnippet as any, pluginOptions) + .processSync(new VFile(options) as any); + +describe("server/remark-code-snippet", () => { + test("Fixture match result on resolve", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-code-snippet-simplest.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/code-snippet-simplest.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Multiline command support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-code-snippet-multiline.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/code-snippet-multiline.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Heredoc format support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-code-snippet-heredoc.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/code-snippet-heredoc.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Support output to file mode for heredoc format", () => { + const value = readFileSync( + resolve( + "server/fixtures/includes/includes-code-snippet-output-to-file-mode.mdx" + ), + "utf-8" + ); + + expect(() => + transformer({ + value, + path: "/docs/index.mdx", + }) + ).not.toThrow(); + }); + + test("If a multiline command ends with a slash", () => { + const value = readFileSync( + resolve( + "server/fixtures/includes/includes-code-snippet-multiline-error.mdx" + ), + "utf-8" + ); + + expect(() => + transformer({ + value, + path: "/docs/index.mdx", + }) + ).not.toThrow(); + }); + + test("If a heredoc format command ends without a closing tag", () => { + const value = readFileSync( + resolve( + "server/fixtures/includes/includes-code-snippet-heredoc-error.mdx" + ), + "utf-8" + ); + + expect(() => + transformer({ + value, + path: "/docs/index.mdx", + }) + ).not.toThrow(); + }); + + test("Returns correct error message on heredoc format lint", () => { + const value = readFileSync( + resolve( + "server/fixtures/includes/includes-code-snippet-heredoc-error.mdx" + ), + "utf-8" + ); + + expect(() => + transformer( + { + value, + path: "/docs/index.mdx", + }, + { lint: true, resolve: false, langs: ["code", "bash"] } + ) + ).toThrow("No closing line for heredoc format"); + }); + + test("Returns correct error message on multiline command lint", () => { + const value = readFileSync( + resolve( + "server/fixtures/includes/includes-code-snippet-multiline-error.mdx" + ), + "utf-8" + ); + + expect(() => + transformer( + { + value, + path: "/docs/index.mdx", + }, + { lint: true, resolve: false, langs: ["code", "bash"] } + ) + ).toThrow( + "The last string in the multiline command has to be without symbol \\" + ); + }); + + test("Variables in command support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-var-in-command.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/var-in-command.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Variables in var-block support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-var-in-block-var.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/var-in-block-var.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Variables in code after command support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-var-after-commands.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/var-after-commands.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Variables in multiline command support", () => { + const value = readFileSync( + resolve("server/fixtures/includes/includes-var-in-multiline-command.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/var-in-multiline-command.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Includes empty lines in example command output", () => { + const value = readFileSync( + resolve("server/fixtures/code-snippet-empty-line.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/docs/index.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/result/code-snippet-empty-line.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); +}); diff --git a/server/remark-includes.test.ts b/server/remark-includes.test.ts new file mode 100644 index 0000000..99fd19f --- /dev/null +++ b/server/remark-includes.test.ts @@ -0,0 +1,507 @@ +import { describe, expect, test } from "@jest/globals"; +import { VFile, VFileOptions } from "vfile"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { remark } from "remark"; +import remarkMdx from "remark-mdx"; +import remarkGFM from "remark-gfm"; +import remarkIncludes, { + ParameterAssignments, + RemarkIncludesOptions, + UpdatePathsOptions, + parsePartialParams, + parseParamDefaults, + resolveParamValue, +} from "./remark-includes"; +import { updatePathsInIncludes } from "./asset-path-helpers"; + +const transformer = ( + vfileOptions: VFileOptions, + pluginOptions: RemarkIncludesOptions = { + resolve: true, + updatePaths: updatePathsInIncludes, + } +) => { + const file: VFile = new VFile(vfileOptions); + + return remark() + .use(remarkMdx as any) + .use(remarkGFM) + .use(remarkIncludes, { + rootDir: "server/fixtures/includes/", + ...pluginOptions, + }) + .processSync(file as any); +}; + +describe("server/remark-includes: including partials", () => { + test("Fixture match result on resolve", () => { + const value = readFileSync( + resolve("server/fixtures/includes-source.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/content/4.0/docs/pages/filename.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/includes-result.mdx"), + "utf-8" + ); + + expect(result).toBe(expected); + }); + + test("Returns correct warnings on lint", () => { + const value = readFileSync( + resolve("server/fixtures/includes-source.mdx"), + "utf-8" + ); + + const result = transformer( + { + value, + path: "/content/4.0/docs/pages/filename.mdx", + }, + { lint: true, resolve: false } + ); + + const errors = result.messages.map(({ message }) => message); + + const expectedErrors = [ + "Includes only works if they are the only content on the line", + "Wrong import path non-existing.mdx in file /content/4.0/docs/pages/filename.mdx.", + ]; + + expect(errors).toEqual(expectedErrors); + }); + + test("Leave includes in place on { resolve: false }", () => { + const value = readFileSync( + resolve("server/fixtures/includes-source.mdx"), + "utf-8" + ); + + const result = transformer( + { + value, + path: "/content/4.0/docs/pages/filename.mdx", + }, + { lint: false, resolve: false } + ).toString(); + + expect(value).toBe(result); + }); + + test("Multiple includes resolve in code block", () => { + const value = readFileSync( + resolve("server/fixtures/includes-multiple-source.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/content/4.0/docs/pages/filename.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/includes-multiple-result.mdx"), + "utf-8" + ); + + expect(result).toBe(expected); + }); + + test("Interprets anchor-only links correctly when loading partials", () => { + const actual = transformer({ + value: `Here is the outer page. + +(!anchor-links.mdx!) + +`, + path: "server/fixtures/mypage.mdx", + }).toString(); + + expect(actual).toBe( + `Here is the outer page. + +This is a [link to an anchor](#this-is-a-section). + +## This is a section. + +This is content within the section. +` + ); + }); +}); + +describe("server/remark-includes: parseParamValue", () => { + interface testCase { + description: string; + input: string; + shouldThrow: boolean; + expected: any; + } + const cases: testCase[] = [ + { + description: "mismatched quotes", + input: `"This is a string'`, + shouldThrow: true, + expected: undefined, + }, + { + description: "double quotes containing single quotes", + input: `"This is a 'string'"`, + shouldThrow: false, + expected: `This is a 'string'`, + }, + { + description: "single quotes containing double quotes", + input: `'This is a "string"'`, + shouldThrow: true, + expected: undefined, + }, + { + description: "single quotes containing escaped single quotes", + input: `'This is a \\'string\\''`, + shouldThrow: true, + expected: undefined, + }, + { + description: "double quotes containing escaped double quotes", + input: `"This is a \\"string\\""`, + shouldThrow: false, + expected: `This is a "string"`, + }, + { + description: "input not wrapped in quotes", + input: `This is a string`, + shouldThrow: true, + expected: undefined, + }, + { + description: "empty input", + input: ``, + shouldThrow: true, + expected: undefined, + }, + { + description: "single quotes", + input: `'This is a string'`, + shouldThrow: true, + expected: undefined, + }, + ]; + + test.each(cases)("$description", (c) => { + if (c.shouldThrow == true) { + expect(() => { + resolveParamValue(c.input); + }).toThrow(); + return; + } else { + expect(resolveParamValue(c.input)).toBe(c.expected); + } + }); +}); + +describe("server/remark-includes: parsePartialParams", () => { + interface testCase { + description: string; + shouldThrow: boolean; + input: string; + expected?: ParameterAssignments; + } + + const cases: testCase[] = [ + { + description: "straightforward case", + shouldThrow: false, + input: `(!includes/example.mdx var1="this is a value" var2="this is also a value"!)`, + expected: { + var1: `"this is a value"`, + var2: `"this is also a value"`, + }, + }, + { + description: "no parameters", + shouldThrow: false, + input: "(!includes/example.mdx!)", + expected: {}, + }, + { + description: "mismatched quotes within matching quotes", + shouldThrow: false, + input: `(!includes/example.mdx var1="this is a value' var2='this is also a value"!)`, + expected: { + var1: `"this is a value' var2='this is also a value"`, + }, + }, + { + description: "mismatched quotes, alternating", + input: `(!includes/example.mdx var1="this is a value' var2="this is also a value'!)`, + shouldThrow: true, + }, + { + description: "escaped quotes", + shouldThrow: false, + input: `(!includes/example.mdx var1="this is a \\"quote\\"" var2="this is a \\"quote\\""!)`, + expected: { + var1: `"this is a \\"quote\\""`, + var2: `"this is a \\"quote\\""`, + }, + }, + { + description: "end of input before second quote", + shouldThrow: true, + input: `(!includes/example.mdx var1="this is a value" var2="this is also a value!)`, + }, + { + description: "quoted value with no key", + shouldThrow: true, + input: `(!includes/example.mdx "this is a value" "this is also a value" var1="another value"!)`, + }, + { + description: "not an inclusion expression", + shouldThrow: true, + input: "example.mdx", + }, + { + description: "exclamation point", + shouldThrow: false, + input: `(!error-message.mdx message="Installation has failed!"!)`, + expected: { + message: `"Installation has failed!"`, + }, + }, + { + description: "escaped quotes", + shouldThrow: false, + input: `(!error-message.mdx message="Type \\"final\\" to see the final screen."!)`, + expected: { + message: `"Type \\"final\\" to see the final screen."`, + }, + }, + { + description: "single quotes", + shouldThrow: true, + input: `(!error-message.mdx message='Type "Hello"'!)`, + }, + { + description: "superfluous spaces around an equals sign", + shouldThrow: true, + input: `(!includes/example.mdx var1 = "this is a value" var2="this is also a value"!)`, + }, + ]; + + test.each(cases)("$description", (c) => { + if (c.shouldThrow == true) { + expect(() => { + parsePartialParams(c.input); + }).toThrow(); + return; + } else { + expect(parsePartialParams(c.input)).toMatchObject(c.expected); + } + }); +}); + +describe("server/remark-includes: parseParamDefaults", () => { + interface testCase { + description: string; + shouldThrow: boolean; + input: string; + expected?: ParameterAssignments; + } + const cases: testCase[] = [ + { + description: "straightforward case", + shouldThrow: false, + input: `{{ var1="this is a value" var2="this is also a value" }}`, + expected: { + var1: `"this is a value"`, + var2: `"this is also a value"`, + }, + }, + { + description: "not wrapped in double-curly braces", + shouldThrow: false, + input: `var1="this is a value" var2="this is also a value"`, + expected: {}, + }, + { + description: "only one side includes a double curly brace", + shouldThrow: false, + input: `var="this is a value" var2="this is also a value" }}`, + expected: {}, + }, + { + description: "not on the first line of the partial", + shouldThrow: false, + input: `This is a partial. +{{ var="this is a value" }} +`, + expected: {}, + }, + { + description: "multiple default values expressions", + shouldThrow: false, + input: `{{ var1="this is a value" var2="this is also a value" }} +This is a partial. +{{ var3="this is another value" var4="this is yet another value" }} +`, + expected: { + var1: `"this is a value"`, + var2: `"this is also a value"`, + }, + }, + { + description: "empty input", + shouldThrow: true, + input: "", + }, + { + description: "short partial", + shouldThrow: false, + input: "one", + expected: {}, + }, + { + description: "short partial with no defaults and one param", + shouldThrow: false, + input: `This is partial with a {{ param }}`, + expected: {}, + }, + { + description: "double curly braces and an equals", + shouldThrow: false, + input: `{{ = }}`, + expected: {}, + }, + ]; + + test.each(cases)("$description", (c) => { + if (c.shouldThrow == true) { + expect(() => { + parseParamDefaults(c.input); + }).toThrow(); + return; + } else { + expect(parseParamDefaults(c.input)).toEqual(c.expected); + } + }); +}); + +test("Resolves template variables in includes", () => { + const value = readFileSync( + resolve("server/fixtures/includes-vars.mdx"), + "utf-8" + ); + + const expected = readFileSync( + resolve("server/fixtures/includes-vars-result.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/content/4.0/docs/pages/filename.mdx", + }).toString(); + + expect(result).toEqual(expected); +}); + +describe("server/remark-includes: relative links in partials", () => { + const includingRelativeLink = `Here are instructions on installing the software: + +(!include-relative-link.mdx!) +`; + interface testCase { + includingPage: string; + description: string; + path: string; + expected: string; + } + const testCases: testCase[] = [ + { + includingPage: includingRelativeLink, + description: "including file is on the same dir level as the partial", + path: "server/fixtures/dir/samelevel.mdx", + expected: `Here are instructions on installing the software: + +Check out our [instructions](../installation.mdx). + +Here is an image showing a successful installation: + +[Successful installation](../installation.png) +`, + }, + { + includingPage: includingRelativeLink, + description: "including file is below the dir level of the partial", + path: "server/fixtures/dir/dir2/below.mdx", + expected: `Here are instructions on installing the software: + +Check out our [instructions](../../installation.mdx). + +Here is an image showing a successful installation: + +[Successful installation](../../installation.png) +`, + }, + { + includingPage: includingRelativeLink, + description: "including file is above the dir level of the partial", + path: "server/fixtures/above.mdx", + expected: `Here are instructions on installing the software: + +Check out our [instructions](installation.mdx). + +Here is an image showing a successful installation: + +[Successful installation](installation.png) +`, + }, + { + includingPage: `Here's how to attach an IAM policy for DB Access: + +(!database-access/attach-iam-policies.mdx!) +`, + description: "relative image path", + path: "server/fixtures/includes/db-policy.mdx", + expected: `Here's how to attach an IAM policy for DB Access: + +Attach the policy and permission boundary you created earlier to the IAM +identity your Teleport Database Service will be using. + +For example, if the Database Service runs as an IAM user, go to the page of the IAM user +in the AWS Management Console, attach the created policy in the "Permissions +policies" section, and set the created boundary policy in the "Permissions +boundary" section. + +
+ ![IAM user](../../img/database-access/iam@2x.png) +
+`, + }, + { + includingPage: "(!includes-relative-link-def.mdx!)", + description: "relative definition path", + path: "server/fixtures/definition.mdx", + expected: `This partial has a relative link [definition]. + +[definition]: ../installation.mdx +`, + }, + ]; + + test.each(testCases)("$description", (c) => { + const actual = transformer({ + value: c.includingPage, + path: c.path, + }).toString(); + expect(actual).toBe(c.expected); + }); +}); diff --git a/server/remark-includes.ts b/server/remark-includes.ts index 0749ba0..014b607 100644 --- a/server/remark-includes.ts +++ b/server/remark-includes.ts @@ -261,7 +261,7 @@ const isInclude = (node: Node) => { return typeof valNode.value === "string" && includeRegexp.test(valNode.value); }; -type UpdatePathsOptions = { +export type UpdatePathsOptions = { node: Node; versionRootDir: string; includePath: string; diff --git a/server/remark-toc.test.ts b/server/remark-toc.test.ts new file mode 100644 index 0000000..2893044 --- /dev/null +++ b/server/remark-toc.test.ts @@ -0,0 +1,182 @@ +import { describe, expect, test } from "@jest/globals"; +import { Volume, createFsFromVolume } from "memfs"; +import { default as remarkTOC, getTOC } from "../server/remark-toc"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { Compatible, VFile, VFileOptions } from "vfile"; +import remarkMdx from "remark-mdx"; +import remarkGFM from "remark-gfm"; +import { remark } from "remark"; + +describe("server/remark-toc", () => { + const testFilesTwoSections = { + "/docs/docs.mdx": `--- +title: "Documentation Home" +description: "Guides to setting up the product." +--- + +Guides to setting up the product. + +`, + "/docs/database-access/database-access.mdx": `--- +title: "Database Access" +description: Guides related to Database Access. +--- + +Guides related to Database Access. + +`, + "/docs/database-access/page1.mdx": `--- +title: "Database Access Page 1" +description: "Protecting DB 1 with Teleport" +---`, + "/docs/database-access/page2.mdx": `--- +title: "Database Access Page 2" +description: "Protecting DB 2 with Teleport" +---`, + "/docs/application-access/application-access.mdx": `--- +title: "Application Access" +description: "Guides related to Application Access" +--- + +Guides related to Application Access. + +`, + "/docs/application-access/page1.mdx": `--- +title: "Application Access Page 1" +description: "Protecting App 1 with Teleport" +---`, + "/docs/application-access/page2.mdx": `--- +title: "Application Access Page 2" +description: "Protecting App 2 with Teleport" +---`, + }; + + test("getTOC with one link to a directory", () => { + const expected = `- [Application Access](application-access/application-access.mdx): Guides related to Application Access`; + + const vol = Volume.fromJSON({ + "/docs/docs.mdx": `--- +title: Documentation Home +description: Guides for setting up the product. +--- + +Guides for setting up the product. + +`, + "/docs/application-access/application-access.mdx": `--- +title: "Application Access" +description: "Guides related to Application Access" +--- + +`, + "/docs/application-access/page1.mdx": `--- +title: "Application Access Page 1" +description: "Protecting App 1 with Teleport" +---`, + "/docs/application-access/page2.mdx": `--- +title: "Application Access Page 2" +description: "Protecting App 2 with Teleport" +---`, + }); + const fs = createFsFromVolume(vol); + const actual = getTOC("/docs/docs.mdx", fs); + expect(actual.result).toBe(expected); + }); + + test("getTOC with multiple links to directories", () => { + const expected = `- [Application Access](application-access/application-access.mdx): Guides related to Application Access +- [Database Access](database-access/database-access.mdx): Guides related to Database Access.`; + + const vol = Volume.fromJSON(testFilesTwoSections); + const fs = createFsFromVolume(vol); + const actual = getTOC("/docs/docs.mdx", fs); + expect(actual.result).toBe(expected); + }); + + test("getTOC orders sections correctly", () => { + const expected = `- [API Usage](api.mdx): Using the API. +- [Application Access](application-access/application-access.mdx): Guides related to Application Access +- [Desktop Access](desktop-access/desktop-access.mdx): Guides related to Desktop Access +- [Initial Setup](initial-setup.mdx): How to set up the product for the first time. +- [Kubernetes](kubernetes.mdx): A guide related to Kubernetes.`; + + const vol = Volume.fromJSON({ + "/docs/docs.mdx": `--- +title: Documentation Home +description: Guides to setting up the product. +--- + +Guides to setting up the product. + +`, + "/docs/desktop-access/desktop-access.mdx": `--- +title: "Desktop Access" +description: "Guides related to Desktop Access" +--- + +`, + + "/docs/application-access/application-access.mdx": `--- +title: "Application Access" +description: "Guides related to Application Access" +--- + +`, + "/docs/desktop-access/get-started.mdx": `--- +title: "Get Started" +description: "Get started with desktop access." +---`, + "/docs/application-access/page1.mdx": `--- +title: "Application Access Page 1" +description: "Protecting App 1 with Teleport" +---`, + "/docs/kubernetes.mdx": `--- +title: "Kubernetes" +description: "A guide related to Kubernetes." +---`, + + "/docs/initial-setup.mdx": `--- +title: "Initial Setup" +description: "How to set up the product for the first time." +---`, + "/docs/api.mdx": `--- +title: "API Usage" +description: "Using the API." +---`, + }); + const fs = createFsFromVolume(vol); + const actual = getTOC("/docs/docs.mdx", fs); + expect(actual.result).toBe(expected); + }); + + const transformer = (vfileOptions: VFileOptions) => { + const file: VFile = new VFile(vfileOptions); + + return remark() + .use(remarkMdx as any) + .use(remarkGFM) + .use(remarkTOC) + .processSync(file as any); + }; + + test("replaces inclusion expressions", () => { + const sourcePath = "server/fixtures/toc/database-access/source.mdx"; + const value = readFileSync(resolve(sourcePath), "utf-8"); + + const result = transformer({ + value, + path: sourcePath, + }); + + const actual = result.toString(); + + const expected = readFileSync( + resolve("server/fixtures/toc/expected.mdx"), + "utf-8" + ); + + expect(result.messages.length).toBe(0); + expect(actual).toBe(expected); + }); +}); diff --git a/server/remark-variables.test.ts b/server/remark-variables.test.ts new file mode 100644 index 0000000..b2c417d --- /dev/null +++ b/server/remark-variables.test.ts @@ -0,0 +1,71 @@ +import { describe, expect, test } from "@jest/globals"; + +import { VFile, VFileOptions } from "vfile"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { remark } from "remark"; +import mdx from "remark-mdx"; +import remarkVariables, { + RemarkVariablesOptions, +} from "../server/remark-variables"; + +const variables: Record = { + version: "1.0", + teleport: { + version: "1.0.1", + }, +}; + +const transformer = ( + vfileOptions: VFileOptions, + pluginOptions: RemarkVariablesOptions = { resolve: true } +) => { + const file: VFile = new VFile(vfileOptions); + + return remark() + .use(mdx as any) + .use(remarkVariables as any, { variables, ...pluginOptions }) + .processSync(file as any); +}; + +describe("server/remark-variables", () => { + test("Fixture match result", () => { + const value = readFileSync( + resolve("server/fixtures/variables-source.mdx"), + "utf-8" + ); + + const result = transformer({ + value, + path: "/content/4.0/docs/pages/filename.mdx", + }).toString(); + + const expected = readFileSync( + resolve("server/fixtures/variables-result.mdx"), + "utf-8" + ); + + expect(result).toEqual(expected); + }); + + test("Returns correct warnings on lint", () => { + const value = readFileSync( + resolve("server/fixtures/variables-source.mdx"), + "utf-8" + ); + + const result = transformer( + { + value, + path: "/content/4.0/docs/pages/filename.mdx", + }, + { lint: true, resolve: false } + ); + + const errors = result.messages.map(({ message }) => message); + + const expectedErrors = ["Non existing varaible name (=variable=)"]; + + expect(errors).toEqual(expectedErrors); + }); +}); diff --git a/yarn.lock b/yarn.lock index 0808d30..9fe37d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -117,7 +117,7 @@ "@babel/highlight" "^7.25.9" picocolors "^1.0.0" -"@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.0": version "7.26.2" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -136,7 +136,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.21.3", "@babel/core@^7.25.9": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.25.9": version "7.26.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -178,6 +178,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@^7.7.2": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz" @@ -284,6 +295,11 @@ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz" @@ -360,6 +376,13 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== + dependencies: + "@babel/types" "^7.26.5" + "@babel/parser@^7.25.3", "@babel/parser@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz" @@ -418,6 +441,34 @@ resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" @@ -432,21 +483,91 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.26.0": +"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-jsx@^7.25.9": +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-typescript@^7.25.9": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.7.2": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== @@ -1035,7 +1156,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.9": +"@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== @@ -1057,6 +1178,14 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.26.5", "@babel/types@^7.3.3": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.4.4": version "7.25.9" resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz" @@ -1073,6 +1202,11 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@clack/core@^0.3.2": version "0.3.4" resolved "https://registry.npmjs.org/@clack/core/-/core-0.3.4.tgz" @@ -2554,6 +2688,145 @@ dependencies: "@swc/helpers" "^0.5.0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" @@ -2561,6 +2834,56 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" @@ -2605,7 +2928,7 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -3132,6 +3455,20 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@slorber/remark-comment@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz" @@ -3441,6 +3778,39 @@ dependencies: "@types/estree" "*" +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + "@types/body-parser@*": version "1.19.5" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" @@ -3553,6 +3923,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + "@types/gtag.js@^0.0.12": version "0.0.12" resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" @@ -3604,7 +3981,7 @@ resolved "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz" integrity sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -3623,6 +4000,14 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/js-cookie@^2.2.6": version "2.2.7" resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz" @@ -3805,6 +4190,11 @@ dependencies: "@types/node" "*" +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + "@types/supports-color@^8.0.0": version "8.1.3" resolved "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz" @@ -5329,7 +5719,7 @@ ansi-colors@^4.1.3: resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.3.2: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -5365,6 +5755,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" @@ -5375,7 +5770,7 @@ any-promise@^1.0.0: resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -5467,6 +5862,11 @@ astring@^1.8.0: resolved "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz" integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" @@ -5496,6 +5896,19 @@ autoprefixer@^10.4.19: picocolors "^1.0.1" postcss-value-parser "^4.2.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-loader@^9.2.1: version "9.2.1" resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz" @@ -5511,6 +5924,27 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz" @@ -5535,6 +5969,35 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + bail@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" @@ -5651,6 +6114,20 @@ browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^ node-releases "^2.0.18" update-browserslist-db "^1.1.1" +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -5735,6 +6212,11 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -5779,7 +6261,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5884,6 +6366,11 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + classnames@^2.3.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" @@ -5915,6 +6402,15 @@ cli-table3@^0.6.3: optionalDependencies: "@colors/colors" "1.5.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" @@ -5929,6 +6425,11 @@ clsx@^2.0.0, clsx@^2.1.1: resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + code-block-writer@^12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz" @@ -5939,6 +6440,11 @@ collapse-white-space@^2.0.0: resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz" integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -6196,6 +6702,19 @@ cp-file@^9.0.0: nested-error-stacks "^2.0.0" p-event "^4.1.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@^7.0.3: version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" @@ -6484,6 +7003,11 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" @@ -6573,6 +7097,11 @@ detect-libc@^1.0.3: resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" @@ -6601,6 +7130,11 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + diff@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" @@ -6717,11 +7251,23 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.5.41: version "1.5.45" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.45.tgz" integrity sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -7052,6 +7598,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -7219,6 +7770,22 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + express@^4.17.3: version "4.21.1" resolved "https://registry.npmjs.org/express/-/express-4.21.1.tgz" @@ -7284,7 +7851,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-g merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -7325,6 +7892,13 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + feed@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" @@ -7357,6 +7931,13 @@ file-size@^1.0.0: resolved "https://registry.npmjs.org/file-size/-/file-size-1.0.0.tgz" integrity sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + filesize@^10.0.8: version "10.1.6" resolved "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz" @@ -7402,7 +7983,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -7542,7 +8123,7 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -7557,6 +8138,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" @@ -7573,6 +8159,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" @@ -7602,7 +8193,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -8063,7 +8654,7 @@ html-entities@^2.3.2: resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz" integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== -html-escaper@^2.0.2: +html-escaper@^2.0.0, html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== @@ -8288,6 +8879,14 @@ import-lazy@^4.0.0: resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + import-meta-resolve@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz" @@ -8426,6 +9025,13 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.2" +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-decimal@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" @@ -8456,6 +9062,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -8587,12 +9198,375 @@ isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + javascript-stringify@2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== -jest-util@^29.7.0: +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -8604,6 +9578,32 @@ jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" @@ -8613,7 +9613,7 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.4.3: +jest-worker@^29.4.3, jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== @@ -8623,6 +9623,16 @@ jest-worker@^29.4.3: merge-stream "^2.0.0" supports-color "^8.0.0" +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jiti@^1.19.1, jiti@^1.20.0: version "1.21.6" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" @@ -9054,6 +10064,25 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + markdown-extensions@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz" @@ -10403,13 +11432,20 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^7.4.3: version "7.4.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz" @@ -10503,6 +11539,11 @@ nanoid@^5.0.9: resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz" integrity sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" @@ -10548,6 +11589,11 @@ node-forge@^1: resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + node-releases@^2.0.18: version "2.0.18" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" @@ -10709,7 +11755,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -10986,6 +12032,11 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" @@ -11860,6 +12911,15 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" @@ -11883,7 +12943,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -prompts@^2.4.2: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11942,6 +13002,11 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + qs@6.13.0: version "6.13.0" resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" @@ -13217,6 +14282,11 @@ repeat-string@^1.0.0: resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" @@ -13242,16 +14312,33 @@ resolve-alpn@^1.2.0: resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + resolve@^1.1.6, resolve@^1.14.2: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" @@ -13261,6 +14348,15 @@ resolve@^1.1.6, resolve@^1.14.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.20.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + response-iterator@^0.2.6: version "0.2.6" resolved "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz" @@ -13447,12 +14543,12 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" -semver@^6.0.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: +semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -13594,7 +14690,7 @@ side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -13667,6 +14763,14 @@ source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -13735,6 +14839,13 @@ stack-generator@^2.0.5: dependencies: stackframe "^1.3.4" +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + stackframe@^1.3.4: version "1.3.4" resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" @@ -13772,7 +14883,15 @@ std-env@^3.7.0: resolved "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz" integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== -string-width@^4.1.0, string-width@^4.2.0: +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +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== @@ -13845,6 +14964,11 @@ strip-bom@^3.0.0: resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" @@ -13998,6 +15122,15 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -14037,6 +15170,11 @@ tiny-warning@^1.0.0: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -14105,6 +15243,21 @@ ts-invariant@^0.10.3: dependencies: tslib "^2.1.0" +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + ts-morph@19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-19.0.0.tgz" @@ -14151,6 +15304,11 @@ type-component@0.0.1: resolved "https://registry.npmjs.org/type-component/-/type-component-0.0.1.tgz" integrity sha512-mDZRBQS2yZkwRQKfjJvQ8UIYJeBNNWCq+HBNstl9N5s9jZ4dkVYXEGkVPsSCEh5Ld4JM1kmrZTzjnrqSAIQ7dw== +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" @@ -14196,10 +15354,10 @@ typescript@^5.3.3: resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz" integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== -typescript@~5.5.2: - version "5.5.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== ufo@^1.5.4: version "1.5.4" @@ -14608,6 +15766,15 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" @@ -14690,7 +15857,7 @@ vfile@^5.0.0, vfile@^5.1.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" -vfile@^6.0.0, vfile@^6.0.1: +vfile@^6.0.0, vfile@^6.0.1, vfile@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== @@ -14720,6 +15887,13 @@ vite-node@^3.0.4: optionalDependencies: fsevents "~2.3.3" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" @@ -14964,6 +16138,14 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^7.3.1: version "7.5.10" resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" @@ -14993,6 +16175,11 @@ xregexp@^5.1.1: dependencies: "@babel/runtime-corejs3" "^7.16.5" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" @@ -15008,6 +16195,24 @@ yaml@^1.7.2: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"