1
0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-02-17 03:19:36 +01:00

feat: parse highligt code, readme and sanitize on ui (#3505)

This commit is contained in:
Juan Picado 2022-11-19 18:59:59 +01:00 committed by GitHub
parent e73656f144
commit a23628be97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 185 additions and 1227 deletions

@ -0,0 +1,7 @@
---
'@verdaccio/ui-theme': minor
'@verdaccio/server-fastify': minor
'@verdaccio/web': minor
---
feat: parse and sanitize on ui

@ -9,7 +9,6 @@
"@verdaccio/file-locking": "11.0.0-alpha.0",
"verdaccio-htpasswd": "11.0.0-alpha.0",
"@verdaccio/local-storage": "11.0.0-alpha.0",
"@verdaccio/readme": "11.0.0-alpha.0",
"@verdaccio/types": "11.0.0-alpha.0",
"@verdaccio/hooks": "6.0.0-alpha.0",
"@verdaccio/loaders": "6.0.0-alpha.0",

@ -1,3 +0,0 @@
{
"extends": "../../../.babelrc"
}

@ -1 +0,0 @@
lib/

@ -1,307 +0,0 @@
# Change Log
## 11.0.0-6-next.6
### Patch Changes
- 351aeeaa: fix(deps): @verdaccio/utils should be a prod dep of local-storage
## 11.0.0-6-next.5
### Major Changes
- 292c0a37: feat!: replace deprecated request dependency by got
This is a big refactoring of the core, fetching dependencies, improve code, more tests and better stability. This is essential for the next release, will take some time but would allow modularize more the core.
## Notes
- Remove deprecated `request` by other `got`, retry improved, custom Agent ( got does not include it built-in)
- Remove `async` dependency from storage (used by core) it was linked with proxy somehow safe to remove now
- Refactor with promises instead callback wherever is possible
- ~Document the API~
- Improve testing, integration tests
- Bugfix
- Clean up old validations
- Improve performance
## 💥 Breaking changes
- Plugin API methods were callbacks based are returning promises, this will break current storage plugins, check documentation for upgrade.
- Write Tarball, Read Tarball methods parameters change, a new set of options like `AbortController` signals are being provided to the `addAbortSignal` can be internally used with Streams when a request is aborted. eg: `addAbortSignal(signal, fs.createReadStream(pathName));`
- `@verdaccio/streams` stream abort support is legacy is being deprecated removed
- Remove AWS and Google Cloud packages for future refactoring [#2574](https://github.com/verdaccio/verdaccio/pull/2574).
## 11.0.0-6-next.4
### Major Changes
- 794af76c: Remove Node 12 support
- We need move to the new `undici` and does not support Node.js 12
## 10.0.0-alpha.3
### Patch Changes
- fecbb9be: chore: add release step to private regisry on merge changeset pr
## 10.0.0-alpha.2
### Minor Changes
- 54c58d1e: feat: add server rate limit protection to all request
To modify custom values, use the server settings property.
```markdown
server:
## https://www.npmjs.com/package/express-rate-limit#configuration-options
rateLimit:
windowMs: 1000
max: 10000
```
The values are intended to be high, if you want to improve security of your server consider
using different values.
## 10.0.0-alpha.1
### Major Changes
- d87fa026: feat!: experiments config renamed to flags
- The `experiments` configuration is renamed to `flags`. The functionality is exactly the same.
```js
flags: token: false;
search: false;
```
- The `self_path` property from the config file is being removed in favor of `config_file` full path.
- Refactor `config` module, better types and utilities
- da1ee9c8: - Replace signature handler for legacy tokens by removing deprecated crypto.createDecipher by createCipheriv
- Introduce environment variables for legacy tokens
### Code Improvements
- Add debug library for improve developer experience
### Breaking change
- The new signature invalidates all previous tokens generated by Verdaccio 4 or previous versions.
- The secret key must have 32 characters long.
### New environment variables
- `VERDACCIO_LEGACY_ALGORITHM`: Allows to define the specific algorithm for the token signature which by default is `aes-256-ctr`
- `VERDACCIO_LEGACY_ENCRYPTION_KEY`: By default, the token stores in the database, but using this variable allows to get it from memory
### Minor Changes
- 26b494cb: feat: add typescript project references settings
Reading https://ebaytech.berlin/optimizing-multi-package-apps-with-typescript-project-references-d5c57a3b4440 I realized I can use project references to solve the issue to pre-compile modules on develop mode.
It allows to navigate (IDE) trough the packages without need compile the packages.
Add two `tsconfig`, one using the previous existing configuration that is able to produce declaration files (`tsconfig.build`) and a new one `tsconfig` which is enables [_projects references_](https://www.typescriptlang.org/docs/handbook/project-references.html).
### Patch Changes
- b57b4338: Enable prerelease mode with **changesets**
- 31af0164: ESLint Warnings Fixed
Related to issue #1461
- max-len: most of the sensible max-len errors are fixed
- no-unused-vars: most of these types of errors are fixed by deleting not needed declarations
- @typescript-eslint/no-unused-vars: same as above
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [9.7.3](https://github.com/verdaccio/monorepo/compare/v9.7.2...v9.7.3) (2020-07-30)
### Bug Fixes
- update marked / request security vulnerability ([#378](https://github.com/verdaccio/monorepo/issues/378)) ([4188e08](https://github.com/verdaccio/monorepo/commit/4188e088f42d0f6e090c948b869312ba1f30cd79))
## [9.7.2](https://github.com/verdaccio/monorepo/compare/v9.7.1...v9.7.2) (2020-07-20)
**Note:** Version bump only for package @verdaccio/readme
## [9.7.1](https://github.com/verdaccio/monorepo/compare/v9.7.0...v9.7.1) (2020-07-10)
**Note:** Version bump only for package @verdaccio/readme
# [9.7.0](https://github.com/verdaccio/monorepo/compare/v9.6.1...v9.7.0) (2020-06-24)
**Note:** Version bump only for package @verdaccio/readme
## [9.6.1](https://github.com/verdaccio/monorepo/compare/v9.6.0...v9.6.1) (2020-06-07)
**Note:** Version bump only for package @verdaccio/readme
## [9.5.1](https://github.com/verdaccio/monorepo/compare/v9.5.0...v9.5.1) (2020-06-03)
### Bug Fixes
- restore Node v8 support ([#361](https://github.com/verdaccio/monorepo/issues/361)) ([9be55a1](https://github.com/verdaccio/monorepo/commit/9be55a1deebe954e8eef9edc59af9fd16e29daed))
# [9.5.0](https://github.com/verdaccio/monorepo/compare/v9.4.1...v9.5.0) (2020-05-02)
**Note:** Version bump only for package @verdaccio/readme
# [9.4.0](https://github.com/verdaccio/monorepo/compare/v9.3.4...v9.4.0) (2020-03-21)
**Note:** Version bump only for package @verdaccio/readme
## [9.3.3](https://github.com/verdaccio/monorepo/compare/v9.3.2...v9.3.3) (2020-03-11)
### Bug Fixes
- update jsdom@16.2.1 ([#340](https://github.com/verdaccio/monorepo/issues/340)) ([6060769](https://github.com/verdaccio/monorepo/commit/6060769d52f796337dda9f1a54f149c5fb22ca17))
## [9.3.2](https://github.com/verdaccio/monorepo/compare/v9.3.1...v9.3.2) (2020-03-08)
### Bug Fixes
- security dependency jsdom@16.2.0 update ([#338](https://github.com/verdaccio/monorepo/issues/338)) ([0599f3e](https://github.com/verdaccio/monorepo/commit/0599f3e16fd1de993494943e2e7464d10b62d6be))
- update dependencies ([#332](https://github.com/verdaccio/monorepo/issues/332)) ([b6165ae](https://github.com/verdaccio/monorepo/commit/b6165aea9b7e4012477081eae68bfa7159c58f56))
## [9.3.1](https://github.com/verdaccio/monorepo/compare/v9.3.0...v9.3.1) (2020-02-23)
**Note:** Version bump only for package @verdaccio/readme
# [9.3.0](https://github.com/verdaccio/monorepo/compare/v9.2.0...v9.3.0) (2020-01-29)
**Note:** Version bump only for package @verdaccio/readme
# [9.0.0](https://github.com/verdaccio/monorepo/compare/v8.5.3...v9.0.0) (2020-01-07)
**Note:** Version bump only for package @verdaccio/readme
## [8.5.2](https://github.com/verdaccio/monorepo/compare/v8.5.1...v8.5.2) (2019-12-25)
**Note:** Version bump only for package @verdaccio/readme
## [8.5.1](https://github.com/verdaccio/monorepo/compare/v8.5.0...v8.5.1) (2019-12-24)
**Note:** Version bump only for package @verdaccio/readme
# [8.5.0](https://github.com/verdaccio/monorepo/compare/v8.4.2...v8.5.0) (2019-12-22)
**Note:** Version bump only for package @verdaccio/readme
## [8.4.2](https://github.com/verdaccio/monorepo/compare/v8.4.1...v8.4.2) (2019-11-23)
**Note:** Version bump only for package @verdaccio/readme
## [8.4.1](https://github.com/verdaccio/monorepo/compare/v8.4.0...v8.4.1) (2019-11-22)
**Note:** Version bump only for package @verdaccio/readme
# [8.4.0](https://github.com/verdaccio/monorepo/compare/v8.3.0...v8.4.0) (2019-11-22)
**Note:** Version bump only for package @verdaccio/readme
# [8.3.0](https://github.com/verdaccio/monorepo/compare/v8.2.0...v8.3.0) (2019-10-27)
**Note:** Version bump only for package @verdaccio/readme
# [8.2.0](https://github.com/verdaccio/monorepo/compare/v8.2.0-next.0...v8.2.0) (2019-10-23)
### Bug Fixes
- core/readme/package.json to reduce vulnerabilities ([#216](https://github.com/verdaccio/monorepo/issues/216)) ([40299ab](https://github.com/verdaccio/monorepo/commit/40299ab))
# [8.2.0-next.0](https://github.com/verdaccio/monorepo/compare/v8.1.4...v8.2.0-next.0) (2019-10-08)
### Bug Fixes
- fixed lint errors ([5e677f7](https://github.com/verdaccio/monorepo/commit/5e677f7))
- fixed lint errors ([c80e915](https://github.com/verdaccio/monorepo/commit/c80e915))
- quotes should be single ([ae9aa44](https://github.com/verdaccio/monorepo/commit/ae9aa44))
## [8.1.2](https://github.com/verdaccio/monorepo/compare/v8.1.1...v8.1.2) (2019-09-29)
### Bug Fixes
- **readme:** security vulnerabilities in marked dep ([ee604b1](https://github.com/verdaccio/monorepo/commit/ee604b1))
## [8.1.1](https://github.com/verdaccio/monorepo/compare/v8.1.0...v8.1.1) (2019-09-26)
### Bug Fixes
- **security:** Cross-site Scripting (XSS) for readme ([7b53e1b](https://github.com/verdaccio/monorepo/commit/7b53e1b))
# [8.1.0](https://github.com/verdaccio/monorepo/compare/v8.0.1-next.1...v8.1.0) (2019-09-07)
**Note:** Version bump only for package @verdaccio/readme
## [8.0.1-next.1](https://github.com/verdaccio/monorepo/compare/v8.0.1-next.0...v8.0.1-next.1) (2019-08-29)
**Note:** Version bump only for package @verdaccio/readme
## [8.0.1-next.0](https://github.com/verdaccio/monorepo/compare/v8.0.0...v8.0.1-next.0) (2019-08-29)
**Note:** Version bump only for package @verdaccio/readme
# [8.0.0](https://github.com/verdaccio/monorepo/compare/v8.0.0-next.4...v8.0.0) (2019-08-22)
**Note:** Version bump only for package @verdaccio/readme
# [8.0.0-next.4](https://github.com/verdaccio/monorepo/compare/v8.0.0-next.3...v8.0.0-next.4) (2019-08-18)
**Note:** Version bump only for package @verdaccio/readme
# [8.0.0-next.2](https://github.com/verdaccio/monorepo/compare/v8.0.0-next.1...v8.0.0-next.2) (2019-08-03)
**Note:** Version bump only for package @verdaccio/readme
# [8.0.0-next.1](https://github.com/verdaccio/monorepo/compare/v8.0.0-next.0...v8.0.0-next.1) (2019-08-01)
**Note:** Version bump only for package @verdaccio/readme
# [8.0.0-next.0](https://github.com/verdaccio/monorepo/compare/v2.0.0...v8.0.0-next.0) (2019-08-01)
### Features
- **readme:** import readme package ([f4bbf3a](https://github.com/verdaccio/monorepo/commit/f4bbf3a))
- **readme:** modernize project ([0d8f963](https://github.com/verdaccio/monorepo/commit/0d8f963))
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [1.0.4](https://github.com/verdaccio/readme/compare/v1.0.3...v1.0.4) (2019-06-22)
### Bug Fixes
- update dependencies ([3316ccf](https://github.com/verdaccio/readme/commit/3316ccf))
### [1.0.3](https://github.com/verdaccio/readme/compare/v1.0.2...v1.0.3) (2019-05-15)
### Bug Fixes
- **build:** lib folder as main ([e1ac882](https://github.com/verdaccio/readme/commit/e1ac882))
### [1.0.2](https://github.com/verdaccio/readme/compare/v1.0.1...v1.0.2) (2019-05-15)
### Bug Fixes
- **build:** remove publish script ([9b36d5f](https://github.com/verdaccio/readme/commit/9b36d5f))
### 1.0.1 (2019-05-15)
### Tests
- add basic test ([774a54d](https://github.com/verdaccio/readme/commit/774a54d))
- add image test ([8c4639e](https://github.com/verdaccio/readme/commit/8c4639e))
- add xss scenarios ([81e43e8](https://github.com/verdaccio/readme/commit/81e43e8))
- add xss scenarios ([b211b97](https://github.com/verdaccio/readme/commit/b211b97))

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2019 Verdaccio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,22 +0,0 @@
# @verdaccio/readme
📃 Readme markdown parser
[![verdaccio (latest)](https://img.shields.io/npm/v/@verdaccio/readme/latest.svg)](https://www.npmjs.com/package/@verdaccio/readme)
[![CircleCI](https://circleci.com/gh/verdaccio/readme/tree/master.svg?style=svg)](https://circleci.com/gh/verdaccio/readme/tree/master)
[![Known Vulnerabilities](https://snyk.io/test/github/verdaccio/readme/badge.svg?targetFile=package.json)](https://snyk.io/test/github/verdaccio/readme?targetFile=package.json)
[![codecov](https://codecov.io/gh/verdaccio/readme/branch/master/graph/badge.svg)](https://codecov.io/gh/verdaccio/readme)
[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)
[![discord](https://img.shields.io/discord/388674437219745793.svg)](http://chat.verdaccio.org/)
![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)
[![node](https://img.shields.io/node/v/@verdaccio/readme/latest.svg)](https://www.npmjs.com/package/@verdaccio/readme)
> This package is already built-in in verdaccio
```
npm install @verdaccio/readme
```
## License
Verdaccio is [MIT licensed](https://github.com/verdaccio/readme/blob/master/LICENSE).

@ -1,3 +0,0 @@
const config = require('../../../jest/config');
module.exports = Object.assign({}, config, {});

@ -1,62 +0,0 @@
{
"name": "@verdaccio/readme",
"version": "11.0.0-6-next.6",
"description": "Readme markdown parser",
"keywords": [
"private",
"package",
"repository",
"registry",
"enterprise",
"modules",
"proxy",
"server",
"verdaccio"
],
"author": {
"name": "Juan Picado",
"email": "juanpicado19@gmail.com"
},
"license": "MIT",
"homepage": "https://verdaccio.org",
"engines": {
"node": ">=14",
"npm": ">=6"
},
"repository": {
"type": "https",
"url": "https://github.com/verdaccio/verdaccio",
"directory": "packages/core/readme"
},
"bugs": {
"url": "https://github.com/verdaccio/verdaccio/issues"
},
"publishConfig": {
"access": "public"
},
"main": "./build/index.js",
"types": "./build/index.d.ts",
"files": [
"build"
],
"dependencies": {
"dompurify": "2.4.0",
"jsdom": "17.0.0",
"marked": "3.0.8"
},
"devDependencies": {
"@verdaccio/types": "workspace:11.0.0-6-next.17"
},
"scripts": {
"clean": "rimraf ./build",
"test": "jest",
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
"watch": "pnpm build:js -- --watch",
"build": "pnpm run build:js && pnpm run build:types"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
}
}

@ -1,17 +0,0 @@
import createDOMPurify from 'dompurify';
import { JSDOM } from 'jsdom';
import marked from 'marked';
const DOMPurify = createDOMPurify(new JSDOM('').window);
export default function parseReadme(readme: string): string | void {
if (readme) {
return DOMPurify.sanitize(
marked(readme, {
sanitize: false,
}).trim()
);
}
return;
}

@ -1,3 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`readme mix readmes / markdown should parse marked 1`] = `"<h1 id="mix-html-and-xss-markdown">mix html and XSS markdown</h1><p><a>Basic</a></p><p><a href="https://github.com/webpack/webpack"><img src="https://webpack.js.org/assets/icon-square-big.svg" height="200" width="200"></a></p>"`;

@ -1,5 +0,0 @@
# mix html and XSS markdown
[Basic](<javascript:alert('Basic')>)
<a href="https://github.com/webpack/webpack"><img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg"></a>

@ -1,247 +0,0 @@
import fs from 'fs';
import path from 'path';
import parseReadme from '../src';
function readReadme(project: string, fileName = 'readme.md'): Promise<string> {
return new Promise((resolve, reject): void => {
fs.readFile(path.join(__dirname, 'partials', project, fileName), 'utf8', (err, data) => {
if (err) {
return reject(err);
}
return resolve(data.toString());
});
});
}
function clean(text: string): string {
return text.replace(/\n|\r/g, '').trim();
}
describe('readme', () => {
test('should handle empty readme', () => {
expect(parseReadme('')).toBeUndefined();
});
test('should handle single string readme', () => {
expect(parseReadme('this is a readme')).toEqual('<p>this is a readme</p>');
});
test('should handle wrong text', () => {
// @ts-expect-error
expect(parseReadme(undefined)).toBeUndefined();
});
describe('basic parsing', () => {
test('should parse basic', () => {
expect(parseReadme('# hi')).toEqual(`<h1 id=\"hi\">hi</h1>`);
});
test('should parse basic / js alert', () => {
expect(parseReadme("[Basic](javascript:alert('Basic'))")).toEqual('<p><a>Basic</a></p>');
});
test('should parse basic / local storage', () => {
expect(
parseReadme('[Local Storage](javascript:alert(JSON.stringify(localStorage)))')
).toEqual('<p><a>Local Storage</a></p>');
});
test('should parse basic / case insensitive', () => {
expect(parseReadme("[CaseInsensitive](JaVaScRiPt:alert('CaseInsensitive'))")).toEqual(
'<p><a>CaseInsensitive</a></p>'
);
});
test('should parse basic / url', () => {
expect(parseReadme("[URL](javascript://www.google.com%0Aalert('URL'))")).toEqual(
'<p><a>URL</a></p>'
);
});
test('should parse basic / in quotes', () => {
expect(parseReadme('[In Quotes](\'javascript:alert("InQuotes")\')')).toEqual(
'<p><a href="\'javascript:alert(%22InQuotes%22)\'">In Quotes</a></p>'
);
});
});
describe('should parse images', () => {
test('in quotes', () => {
expect(
parseReadme(
'![Escape SRC - onload](https://www.example.com/image.png"onload="alert(\'ImageOnLoad\'))'
)
).toEqual(
'<p><img alt="Escape SRC - onload" src="https://www.example.com/image.png%22onload=' +
"%22alert('ImageOnLoad')\"></p>"
);
});
test('in image error', () => {
expect(parseReadme('![Escape SRC - onerror]("onerror="alert(\'ImageOnError\'))')).toEqual(
'<p><img alt="Escape SRC - onerror" src="%22onerror=%22alert(\'ImageOnError\')"></p>'
);
});
});
describe('should test fuzzing', () => {
test('xss / document cookie', () => {
expect(parseReadme('[XSS](javascript:prompt(document.cookie))')).toEqual('<p><a>XSS</a></p>');
});
test('xss / white space cookie', () => {
expect(
parseReadme('[XSS](j a v a s c r i p t:prompt(document.cookie))')
).toEqual('<p>[XSS](j a v a s c r i p t:prompt(document.cookie))</p>');
});
test('xss / data test/html', () => {
expect(
parseReadme('[XSS](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)')
).toEqual('<p><a>XSS</a></p>');
});
test('xss / data test/html encoded', () => {
expect(
parseReadme(
'[XSS](&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x7' +
'2&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29)'
)
).toEqual(
'<p><a href="&amp;#x6A&amp;#x61&amp;#x76&amp;#x61&amp;#x73&amp;#x63&amp;#x72&amp;' +
'#x69&amp;#x70&amp;#x74&amp;#x3A&amp;#x61&amp;#x6C&amp;#x65&amp;#x72&amp;#x74&amp' +
';#x28&amp;#x27&amp;#x58&amp;#x53&amp;#x53&amp;#x27&amp;#x29">XSS</a></p>'
);
});
test('xss / js prompt', () => {
expect(parseReadme('[XSS]: (javascript:prompt(document.cookie))')).toEqual('');
});
test('xss / js window error alert', () => {
expect(parseReadme('[XSS](javascript:window.onerror=alert;throw%20document.cookie)')).toEqual(
'<p><a>XSS</a></p>'
);
});
test('xss / js window encoded prompt', () => {
expect(parseReadme('[XSS](javascript://%0d%0aprompt(1))')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js window encoded prompt multiple statement', () => {
expect(parseReadme('[XSS](javascript://%0d%0aprompt(1);com)')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js window encoded window error alert multiple statement', () => {
expect(parseReadme('[XSS](javascript:window.onerror=alert;throw%20document.cookie)')).toEqual(
'<p><a>XSS</a></p>'
);
});
test('xss / js window encoded window error alert throw error', () => {
expect(
parseReadme('[XSS](javascript://%0d%0awindow.onerror=alert;throw%20document.cookie)')
).toEqual('<p><a>XSS</a></p>');
});
test('xss / js window encoded data text/html base 64', () => {
expect(
parseReadme('[XSS](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)')
).toEqual('<p><a>XSS</a></p>');
});
test('xss / js vbscript alert', () => {
expect(parseReadme('[XSS](vbscript:alert(document.domain))')).toEqual('<p><a>XSS</a></p>');
});
describe('xss / js alert this', () => {
test('xss / js case #1', () => {
expect(parseReadme('[XSS](javascript:this;alert(1))')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js case #2', () => {
expect(parseReadme('[XSS](javascript:this;alert(1&#41;)')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js case #3', () => {
expect(parseReadme('[XSS](javascript&#58this;alert(1&#41;)')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js case #4', () => {
expect(parseReadme('[XSS](Javas&#99;ript:alert(1&#41;)')).toEqual('<p><a>XSS</a></p>');
});
test('xss / js case #5', () => {
expect(parseReadme('[XSS](Javas%26%2399;ript:alert(1&#41;)')).toEqual(
'<p><a href="Javas%26%2399;ript:alert(1)">XSS</a></p>'
);
});
test('xss / js case #6', () => {
expect(parseReadme('[XSS](javascript:alert&#65534;(1&#41;)')).toEqual('<p><a>XSS</a></p>');
});
});
test('xss / js confirm', () => {
expect(parseReadme('[XSS](javascript:confirm(1)')).toEqual('<p><a>XSS</a></p>');
});
describe('xss / js url', () => {
test('xss / case #1', () => {
expect(parseReadme('[XSS](javascript://www.google.com%0Aprompt(1))')).toEqual(
'<p><a>XSS</a></p>'
);
});
test('xss / case #2', () => {
expect(parseReadme('[XSS](javascript://%0d%0aconfirm(1);com)')).toEqual(
'<p><a>XSS</a></p>'
);
});
test('xss / case #3', () => {
expect(parseReadme('[XSS](javascript:window.onerror=confirm;throw%201)')).toEqual(
'<p><a>XSS</a></p>'
);
});
test('xss / case #4', () => {
expect(parseReadme('[XSS](<28>javascript:alert(document.domain&#41;)')).toEqual(
'<p><a href="%EF%BF%BDjavascript:alert(document.domain)">XSS</a></p>'
);
});
test('xss / case #5', () => {
expect(parseReadme('![XSS](javascript:prompt(document.cookie))\\')).toEqual(
'<p><img alt="XSS">\\</p>'
);
});
test('xss / case #6', () => {
expect(
parseReadme('![XSS](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)\\')
).toEqual(
'<p><img alt="XSS" src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3Nj' +
'cmlwdD4K">\\</p>'
);
});
// FIXME: requires proper parsing
test.skip('xss / case #7', () => {
expect(parseReadme(`![XSS'"\`onerror=prompt(document.cookie)](x)\\`)).toEqual(
'<p>![XSS\'\\"`onerror=prompt(document.cookie)](x)\\\\</p>'
);
});
});
});
describe('mix readmes / markdown', () => {
test('should parse marked', async () => {
const readme: string = await readReadme('mixed-html-mk');
expect(clean(parseReadme(readme) as string)).toMatchSnapshot();
});
});
});

@ -1,9 +0,0 @@
{
"extends": "../../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./build"
},
"include": ["src/**/*"],
"exclude": ["src/**/*.test.ts"]
}

@ -1,13 +0,0 @@
{
"extends": "../../../tsconfig.reference.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./build",
"preserveSymlinks": true,
"composite": true,
"declaration": true,
"declarationMap": true
},
"include": ["src/**/*.ts"],
"exclude": ["src/**/*.test.ts"]
}

@ -40,7 +40,6 @@
"css-loader": "6.7.1",
"dayjs": "1.11.5",
"friendly-errors-webpack-plugin": "1.7.0",
"github-markdown-css": "4.0.0",
"harmony-reflect": "1.6.2",
"history": "4.10.1",
"html-webpack-plugin": "5.5.0",
@ -57,6 +56,9 @@
"normalize.css": "8.0.1",
"optimize-css-assets-webpack-plugin": "6.0.1",
"ora": "5.4.1",
"dompurify": "2.4.0",
"highlight.js": "11.6.0",
"marked": "4.2.2",
"raw-loader": "4.0.2",
"react": "18.2.0",
"react-dom": "18.2.0",
@ -90,8 +92,7 @@
"webpack-dev-server": "3.11.3",
"webpack-manifest-plugin": "4.1.1",
"webpack-merge": "5.8.0",
"whatwg-fetch": "3.6.2",
"xss": "1.0.14"
"whatwg-fetch": "3.6.2"
},
"keywords": [
"private",

@ -1,5 +1,4 @@
import React from 'react';
import { preventXSS } from 'verdaccio-ui/utils/sec-utils';
import Readme from './Readme';
@ -11,8 +10,8 @@ const DetailContainerContentReadme: React.FC<Props> = ({ description }) => {
if (!description) {
return null;
}
const encodedReadme = preventXSS(description);
return <Readme description={encodedReadme} />;
return <Readme description={description} />;
};
export default DetailContainerContentReadme;

@ -1,21 +1,23 @@
import styled from '@emotion/styled';
import 'github-markdown-css';
import 'highlight.js/styles/default.css';
import React from 'react';
import { Theme } from 'verdaccio-ui/design-tokens/theme';
import { Props } from './types';
import { parseReadme } from './utils';
const Readme: React.FC<Props> = ({ description }) => (
<Wrapper className="markdown-body" dangerouslySetInnerHTML={{ __html: description }} />
);
const Readme: React.FC<Props> = ({ description }) => {
return (
<Wrapper
className="markdown-body"
dangerouslySetInnerHTML={{ __html: parseReadme(description) as string }}
/>
);
};
export default Readme;
const Wrapper = styled('div')<{ theme?: Theme }>(({ theme }) => ({
background: theme?.palette.white,
color: theme?.palette.black,
padding: theme?.spacing(2, 3),
ul: {
listStyle: 'disc',
},
}));

@ -9,16 +9,16 @@ exports[`<Readme /> component should load the component in default state 1`] = `
padding: 16px 24px;
}
.emotion-0 ul {
list-style: disc;
}
<body>
<div>
<div
class="markdown-body emotion-0 emotion-1"
>
test
<p>
test
</p>
</div>
</div>
</body>,
@ -28,15 +28,15 @@ exports[`<Readme /> component should load the component in default state 1`] = `
padding: 16px 24px;
}
.emotion-0 ul {
list-style: disc;
}
<div>
<div
class="markdown-body emotion-0 emotion-1"
>
test
<p>
test
</p>
</div>
</div>,
"debug": [Function],

@ -0,0 +1,25 @@
import * as DOMPurify from 'dompurify';
import * as marked from 'marked';
marked.setOptions({
renderer: new marked.Renderer(),
highlight: function (code, lang) {
const hljs = require('highlight.js');
const language = hljs.getLanguage(lang) ? lang : 'plaintext';
return hljs.highlight(code, { language }).value;
},
langPrefix: 'hljs language-', // highlight.js css expects a top-level 'hljs' class.
pedantic: false,
gfm: true,
breaks: false,
mangle: false,
xhtml: false,
});
export function parseReadme(readme: string): string | void {
if (typeof readme === 'string') {
const html = marked.parse(readme);
return DOMPurify.sanitize(html);
}
return '';
}

@ -1,15 +0,0 @@
import { escapeAttrValue, filterXSS } from 'xss';
const xssOpts = {
onIgnoreTagAttr: function (tag: string, name: string, value: string) {
if (tag.match(/^h[0-9]$/) && name === 'id') {
return name + '="' + escapeAttrValue(value) + '"';
}
},
};
export function preventXSS(text: string): string {
const encodedText = filterXSS(text, xssOpts);
return encodedText;
}

@ -41,7 +41,6 @@
"@verdaccio/store": "workspace:6.0.0-6-next.30",
"@verdaccio/tarball": "workspace:11.0.0-6-next.19",
"@verdaccio/utils": "workspace:6.0.0-6-next.18",
"@verdaccio/readme": "workspace:11.0.0-6-next.6",
"core-js": "3.25.5",
"debug": "4.3.4",
"fastify": "4.8.1",

@ -1,8 +1,6 @@
import buildDebug from 'debug';
import { FastifyInstance } from 'fastify';
import _ from 'lodash';
import sanitizyReadme from '@verdaccio/readme';
import { Manifest } from '@verdaccio/types';
const debug = buildDebug('verdaccio:fastify:web:readme');
@ -27,7 +25,7 @@ async function readmeRoute(fastify: FastifyInstance) {
},
})) as Manifest;
try {
const parsedReadme = parseReadme(manifest.name, manifest.readme as string);
const parsedReadme = manifest.readme;
reply.code(fastify.statusCode.OK).send(parsedReadme);
} catch {
reply.code(fastify.statusCode.OK).send(NOT_README_FOUND);
@ -52,8 +50,7 @@ async function readmeRoute(fastify: FastifyInstance) {
},
})) as Manifest;
try {
const parsedReadme = parseReadme(manifest.name, manifest.readme as string);
reply.code(fastify.statusCode.OK).send(parsedReadme);
reply.code(fastify.statusCode.OK).send(manifest.readme);
} catch {
reply.code(fastify.statusCode.OK).send(NOT_README_FOUND);
}
@ -61,17 +58,3 @@ async function readmeRoute(fastify: FastifyInstance) {
}
export default readmeRoute;
/**
* parse package readme - markdown/ascii
* @param {String} packageName name of package
* @param {String} readme package readme
* @return {String} converted html template
*/
export function parseReadme(packageName: string, readme: string): string | void {
if (_.isEmpty(readme) === false) {
debug('sanizity readme');
return sanitizyReadme(readme);
}
throw new Error('ERROR: No README data found!');
}

@ -31,7 +31,6 @@
"@verdaccio/loaders": "workspace:6.0.0-6-next.19",
"@verdaccio/logger": "workspace:6.0.0-6-next.18",
"@verdaccio/middleware": "workspace:6.0.0-6-next.29",
"@verdaccio/readme": "workspace:11.0.0-6-next.6",
"@verdaccio/store": "workspace:6.0.0-6-next.30",
"@verdaccio/tarball": "workspace:11.0.0-6-next.19",
"@verdaccio/url": "workspace:11.0.0-6-next.16",

@ -4,20 +4,27 @@ import { Router } from 'express';
import { Auth } from '@verdaccio/auth';
import { HEADERS, HEADER_TYPE } from '@verdaccio/core';
import { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';
import sanitizyReadme from '@verdaccio/readme';
import { Storage } from '@verdaccio/store';
import { Manifest } from '@verdaccio/types';
import { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';
import { AuthorAvatar, addScope } from '../utils/web-utils';
export { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages
// TODO: review this type, should be on @verdacid/types
export type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };
const debug = buildDebug('verdaccio:web:api:readme');
export const NOT_README_FOUND = 'ERROR: No README data found!';
const debug = buildDebug('verdaccio:web:api:readme');
const getReadme = (readme) => {
if (typeof readme === 'string' && readme.length === 0) {
return NOT_README_FOUND;
}
if (typeof readme !== 'string') {
return NOT_README_FOUND;
} else {
return readme;
}
};
function addReadmeWebApi(storage: Storage, auth: Auth): Router {
debug('initialized readme web api');
@ -53,11 +60,7 @@ function addReadmeWebApi(storage: Storage, auth: Auth): Router {
})) as Manifest;
debug('readme pkg %o', manifest?.name);
res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);
try {
next(parseReadme(manifest.name, manifest.readme as string));
} catch {
next(sanitizyReadme(NOT_README_FOUND));
}
next(getReadme(manifest.readme));
} catch (err) {
next(err);
}

@ -1,7 +1,6 @@
import buildDebug from 'debug';
import _ from 'lodash';
import sanitizyReadme from '@verdaccio/readme';
// import { normalizeContributors } from '@verdaccio/store';
import { Author, ConfigYaml } from '@verdaccio/types';
@ -19,23 +18,6 @@ export function validatePrimaryColor(primaryColor) {
return primaryColor;
}
/**
* parse package readme - markdown/ascii
* @param {String} packageName name of package
* @param {String} readme package readme
* @return {String} converted html template
*/
export function parseReadme(packageName: string, readme: string): string | void {
if (_.isEmpty(readme) === false) {
debug('sanizity readme');
return sanitizyReadme(readme);
}
// logs readme not found error
// logger.error({ packageName }, '@{packageName}: No readme found');
throw new Error('ERROR: No README data found!');
}
export function deleteProperties(propertiesToDelete: string[], objectItem: any): any {
debug('deleted unused version properties');
_.forEach(propertiesToDelete, (property): any => {

@ -1,51 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Utilities parseReadme should parse makrdown text to html template 1`] = `
"<h1 id="project-title">Project Title</h1>
<p>One Paragraph of project description goes here</p>
<h2 id="getting-started">Getting Started</h2>
<p>These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.</p>
<h3 id="prerequisites">Prerequisites</h3>
<p>What things you need to install the software and how to install them</p>
<pre><code>Give examples
</code></pre>
<h3 id="installing">Installing</h3>
<p>A step by step series of examples that tell you how to get a development env running</p>
<p>Say what the step will be</p>
<pre><code>Give the example
</code></pre>
<p>And repeat</p>
<pre><code>until finished
</code></pre>
<p>End with an example of getting some data out of the system or using it for a little demo</p>
<h2 id="running-the-tests">Running the tests</h2>
<p>Explain how to run the automated tests for this system</p>
<h3 id="break-down-into-end-to-end-tests">Break down into end to end tests</h3>
<p>Explain what these tests test and why</p>
<pre><code>Give an example
</code></pre>
<h3 id="and-coding-style-tests">And coding style tests</h3>
<p>Explain what these tests test and why</p>
<pre><code>Give an example
</code></pre>
<h2 id="deployment">Deployment</h2>
<p>Add additional notes about how to deploy this on a live system</p>
<h2 id="built-with">Built With</h2>
<ul>
<li>The web framework used</li>
<li>Dependency Management</li>
<li>Used to generate RSS Feeds</li>
</ul>
<h2 id="contributing">Contributing</h2>
<p>Please read <a href="CONTRIBUTING.md">CONTRIBUTING.md</a> for details on our code of conduct, and the process for submitting pull requests to us.</p>
<h2 id="versioning">Versioning</h2>
<p>We use <a href="http://semver.org/">SemVer</a> for versioning. For the versions available, see the <a href="https://github.com/your/project/tags">tags on this repository</a>.</p>
<h2 id="license">License</h2>
<p>This project is licensed under the MIT License - see the <a href="LICENSE.md">LICENSE.md</a> file for details</p>
<h2 id="acknowledgments">Acknowledgments</h2>
<ul>
<li>Hat tip to anyone whose code was used</li>
<li>Inspiration</li>
<li>etc</li>
</ul>"
`;

@ -8,7 +8,7 @@ import { publishVersion } from '@verdaccio/test-helper';
import { NOT_README_FOUND } from '../src/api/readme';
import { initializeServer } from './helper';
setup([]);
setup({});
const mockManifest = jest.fn();
jest.mock('@verdaccio/ui-theme', () => mockManifest());

@ -1,81 +0,0 @@
# Project Title
One Paragraph of project description goes here
## Getting Started
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
### Prerequisites
What things you need to install the software and how to install them
```
Give examples
```
### Installing
A step by step series of examples that tell you how to get a development env running
Say what the step will be
```
Give the example
```
And repeat
```
until finished
```
End with an example of getting some data out of the system or using it for a little demo
## Running the tests
Explain how to run the automated tests for this system
### Break down into end to end tests
Explain what these tests test and why
```
Give an example
```
### And coding style tests
Explain what these tests test and why
```
Give an example
```
## Deployment
Add additional notes about how to deploy this on a live system
## Built With
- The web framework used
- Dependency Management
- Used to generate RSS Feeds
## Contributing
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags).
## License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
## Acknowledgments
- Hat tip to anyone whose code was used
- Inspiration
- etc

@ -1,11 +1,4 @@
import fs from 'fs';
import path from 'path';
import { parseReadme, validatePrimaryColor } from '../src/utils/web-utils';
const readmeFile = (fileName = 'markdown.md') => {
return fs.readFileSync(path.join(__dirname, `./partials/readme/${fileName}`));
};
import { validatePrimaryColor } from '../src/utils/web-utils';
describe('Utilities', () => {
describe('validatePrimaryColor', () => {
@ -17,29 +10,4 @@ describe('Utilities', () => {
expect(validatePrimaryColor('fff')).toBeUndefined();
});
});
describe('parseReadme', () => {
test('should parse makrdown text to html template', () => {
const markdown = '# markdown';
expect(parseReadme('testPackage', markdown)).toEqual('<h1 id="markdown">markdown</h1>');
// @ts-ignore
expect(parseReadme('testPackage', String(readmeFile('markdown.md')))).toMatchSnapshot();
});
test('should pass for conversion of non-ascii to markdown text', () => {
const simpleText = 'simple text';
const randomText = '%%%%%**##==';
const randomTextMarkdown = 'simple text \n # markdown';
expect(parseReadme('testPackage', randomText)).toEqual('<p>%%%%%**##==</p>');
expect(parseReadme('testPackage', simpleText)).toEqual('<p>simple text</p>');
expect(parseReadme('testPackage', randomTextMarkdown)).toEqual(
'<p>simple text </p>\n<h1 id="markdown">markdown</h1>'
);
});
test('should show error for no readme data', () => {
const noData = '';
expect(() => parseReadme('testPackage', noData)).toThrowError('ERROR: No README data found!');
});
});
});

369
pnpm-lock.yaml generated

@ -466,19 +466,6 @@ importers:
devDependencies:
'@verdaccio/types': link:../types
packages/core/readme:
specifiers:
'@verdaccio/types': workspace:11.0.0-6-next.17
dompurify: 2.4.0
jsdom: 17.0.0
marked: 3.0.8
dependencies:
dompurify: 2.4.0
jsdom: 17.0.0
marked: 3.0.8
devDependencies:
'@verdaccio/types': link:../types
packages/core/tarball:
specifiers:
'@verdaccio/core': workspace:6.0.0-6-next.50
@ -811,9 +798,10 @@ importers:
country-flag-icons: 1.5.5
css-loader: 6.7.1
dayjs: 1.11.5
dompurify: 2.4.0
friendly-errors-webpack-plugin: 1.7.0
github-markdown-css: 4.0.0
harmony-reflect: 1.6.2
highlight.js: 11.6.0
history: 4.10.1
html-webpack-plugin: 5.5.0
i18next: 20.6.1
@ -822,6 +810,7 @@ importers:
js-yaml: 3.14.1
localstorage-memory: 1.0.3
lodash: 4.17.21
marked: 4.2.2
mini-css-extract-plugin: 2.6.1
msw: 0.47.4
mutationobserver-shim: 0.3.7
@ -863,7 +852,6 @@ importers:
webpack-manifest-plugin: 4.1.1
webpack-merge: 5.8.0
whatwg-fetch: 3.6.2
xss: 1.0.14
devDependencies:
'@emotion/babel-plugin': 11.10.2_@babel+core@7.19.3
'@emotion/css': 11.10.0_@babel+core@7.19.3
@ -891,9 +879,10 @@ importers:
country-flag-icons: 1.5.5
css-loader: 6.7.1_webpack@5.74.0
dayjs: 1.11.5
dompurify: 2.4.0
friendly-errors-webpack-plugin: 1.7.0_webpack@5.74.0
github-markdown-css: 4.0.0
harmony-reflect: 1.6.2
highlight.js: 11.6.0
history: 4.10.1
html-webpack-plugin: 5.5.0_webpack@5.74.0
i18next: 20.6.1
@ -902,6 +891,7 @@ importers:
js-yaml: 3.14.1
localstorage-memory: 1.0.3
lodash: 4.17.21
marked: 4.2.2
mini-css-extract-plugin: 2.6.1_webpack@5.74.0
msw: 0.47.4_typescript@4.8.4
mutationobserver-shim: 0.3.7
@ -943,7 +933,6 @@ importers:
webpack-manifest-plugin: 4.1.1_webpack@5.74.0
webpack-merge: 5.8.0
whatwg-fetch: 3.6.2
xss: 1.0.14
packages/proxy:
specifiers:
@ -1040,7 +1029,6 @@ importers:
'@verdaccio/config': workspace:6.0.0-6-next.50
'@verdaccio/core': workspace:6.0.0-6-next.50
'@verdaccio/logger': workspace:6.0.0-6-next.18
'@verdaccio/readme': workspace:11.0.0-6-next.6
'@verdaccio/store': workspace:6.0.0-6-next.30
'@verdaccio/tarball': workspace:11.0.0-6-next.19
'@verdaccio/types': workspace:11.0.0-6-next.17
@ -1056,7 +1044,6 @@ importers:
'@verdaccio/config': link:../../config
'@verdaccio/core': link:../../core/core
'@verdaccio/logger': link:../../logger
'@verdaccio/readme': link:../../core/readme
'@verdaccio/store': link:../../store
'@verdaccio/tarball': link:../../core/tarball
'@verdaccio/utils': link:../../utils
@ -1322,7 +1309,6 @@ importers:
'@verdaccio/loaders': workspace:6.0.0-6-next.19
'@verdaccio/logger': workspace:6.0.0-6-next.18
'@verdaccio/middleware': workspace:6.0.0-6-next.29
'@verdaccio/readme': workspace:11.0.0-6-next.6
'@verdaccio/store': workspace:6.0.0-6-next.30
'@verdaccio/tarball': workspace:11.0.0-6-next.19
'@verdaccio/test-helper': workspace:2.0.0-6-next.6
@ -1348,7 +1334,6 @@ importers:
'@verdaccio/loaders': link:../loaders
'@verdaccio/logger': link:../logger
'@verdaccio/middleware': link:../middleware
'@verdaccio/readme': link:../core/readme
'@verdaccio/store': link:../store
'@verdaccio/tarball': link:../core/tarball
'@verdaccio/url': link:../core/url
@ -5941,7 +5926,7 @@ packages:
copy-webpack-plugin: 11.0.0_webpack@5.74.0
core-js: 3.25.5
css-loader: 6.7.1_webpack@5.74.0
css-minimizer-webpack-plugin: 4.0.0_webpack@5.74.0
css-minimizer-webpack-plugin: 4.0.0_2868035f691d246a9a4674d398e4be11
cssnano: 5.1.12_postcss@8.4.18
del: 6.1.1
detect-port: 1.3.0
@ -5984,8 +5969,10 @@ packages:
webpackbar: 5.0.2_webpack@5.74.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6036,7 +6023,7 @@ packages:
copy-webpack-plugin: 11.0.0_webpack@5.74.0
core-js: 3.25.5
css-loader: 6.7.1_webpack@5.74.0
css-minimizer-webpack-plugin: 4.0.0_webpack@5.74.0
css-minimizer-webpack-plugin: 4.0.0_2868035f691d246a9a4674d398e4be11
cssnano: 5.1.12_postcss@8.4.18
del: 6.1.1
detect-port: 1.3.0
@ -6079,8 +6066,10 @@ packages:
webpackbar: 5.0.2_webpack@5.74.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6233,8 +6222,10 @@ packages:
utility-types: 3.10.0
webpack: 5.74.0_esbuild@0.14.10
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6272,8 +6263,10 @@ packages:
utility-types: 3.10.0
webpack: 5.74.0_esbuild@0.14.10
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6303,8 +6296,10 @@ packages:
tslib: 2.4.0
webpack: 5.74.0_esbuild@0.14.10
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6332,9 +6327,11 @@ packages:
react-json-view: 1.21.3_react-dom@17.0.2+react@17.0.2
tslib: 2.4.0
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- '@types/react'
- bufferutil
- csso
- debug
- encoding
- esbuild
@ -6361,8 +6358,10 @@ packages:
react-dom: 17.0.2_react@17.0.2
tslib: 2.4.0
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6388,8 +6387,10 @@ packages:
react-dom: 17.0.2_react@17.0.2
tslib: 2.4.0
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6420,8 +6421,10 @@ packages:
sitemap: 7.1.1
tslib: 2.4.0
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6456,9 +6459,11 @@ packages:
react-dom: 17.0.2_react@17.0.2
transitivePeerDependencies:
- '@algolia/client-search'
- '@parcel/css'
- '@swc/core'
- '@types/react'
- bufferutil
- csso
- debug
- encoding
- esbuild
@ -6533,8 +6538,10 @@ packages:
tslib: 2.4.0
utility-types: 3.10.0
transitivePeerDependencies:
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6571,8 +6578,10 @@ packages:
utility-types: 3.10.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6609,8 +6618,10 @@ packages:
utility-types: 3.10.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6650,9 +6661,11 @@ packages:
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- '@types/react'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6692,9 +6705,11 @@ packages:
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/types'
- '@parcel/css'
- '@swc/core'
- '@types/react'
- bufferutil
- csso
- debug
- esbuild
- eslint
@ -6792,6 +6807,9 @@ packages:
engines: {node: '>=16.14'}
peerDependencies:
'@docusaurus/types': '*'
peerDependenciesMeta:
'@docusaurus/types':
optional: true
dependencies:
tslib: 2.4.0
@ -6800,6 +6818,9 @@ packages:
engines: {node: '>=16.14'}
peerDependencies:
'@docusaurus/types': '*'
peerDependenciesMeta:
'@docusaurus/types':
optional: true
dependencies:
'@docusaurus/types': 2.2.0_e04bad828ac717e6587f05c972df8358
tslib: 2.4.0
@ -6880,6 +6901,9 @@ packages:
engines: {node: '>=16.14'}
peerDependencies:
'@docusaurus/types': '*'
peerDependenciesMeta:
'@docusaurus/types':
optional: true
dependencies:
'@docusaurus/logger': 2.2.0
'@docusaurus/types': 2.2.0_e04bad828ac717e6587f05c972df8358
@ -6910,6 +6934,9 @@ packages:
engines: {node: '>=16.14'}
peerDependencies:
'@docusaurus/types': '*'
peerDependenciesMeta:
'@docusaurus/types':
optional: true
dependencies:
'@docusaurus/logger': 2.2.0
'@docusaurus/types': 2.2.0_react-dom@17.0.2+react@17.0.2
@ -6940,6 +6967,9 @@ packages:
engines: {node: '>=16.14'}
peerDependencies:
'@docusaurus/types': '*'
peerDependenciesMeta:
'@docusaurus/types':
optional: true
dependencies:
'@docusaurus/logger': 2.2.0
'@svgr/webpack': 6.2.1
@ -8615,11 +8645,6 @@ packages:
react-dom: 18.2.0_react@18.2.0
dev: true
/@tootallnate/once/1.1.2:
resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
engines: {node: '>= 6'}
dev: false
/@tootallnate/once/2.0.0:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@ -9642,10 +9667,6 @@ packages:
through: 2.3.8
dev: false
/abab/2.0.5:
resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==}
dev: false
/abab/2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
dev: true
@ -9674,13 +9695,6 @@ packages:
mime-types: 2.1.34
negotiator: 0.6.3
/acorn-globals/6.0.0:
resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==}
dependencies:
acorn: 7.4.1
acorn-walk: 7.2.0
dev: false
/acorn-globals/7.0.1:
resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
dependencies:
@ -9710,27 +9724,10 @@ packages:
dependencies:
acorn: 8.8.0
/acorn-walk/7.2.0:
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
engines: {node: '>=0.4.0'}
dev: false
/acorn-walk/8.2.0:
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
engines: {node: '>=0.4.0'}
/acorn/7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: false
/acorn/8.4.1:
resolution: {integrity: sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: false
/acorn/8.7.1:
resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
engines: {node: '>=0.4.0'}
@ -10090,6 +10087,7 @@ packages:
/asynckit/0.4.0:
resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=}
dev: true
/at-least-node/1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
@ -10757,10 +10755,6 @@ packages:
wcwidth: 1.0.1
dev: true
/browser-process-hrtime/1.0.0:
resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
dev: false
/browserslist/4.14.2:
resolution: {integrity: sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@ -11291,6 +11285,7 @@ packages:
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: true
/comma-separated-tokens/1.0.8:
resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
@ -11723,13 +11718,28 @@ packages:
webpack: 5.74.0_esbuild@0.14.10
dev: false
/css-minimizer-webpack-plugin/4.0.0_webpack@5.74.0:
/css-minimizer-webpack-plugin/4.0.0_2868035f691d246a9a4674d398e4be11:
resolution: {integrity: sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==}
engines: {node: '>= 14.15.0'}
peerDependencies:
'@parcel/css': '*'
clean-css: '*'
csso: '*'
esbuild: '*'
webpack: ^5.0.0
peerDependenciesMeta:
'@parcel/css':
optional: true
clean-css:
optional: true
csso:
optional: true
esbuild:
optional: true
dependencies:
clean-css: 5.3.0
cssnano: 5.1.12_postcss@8.4.18
esbuild: 0.14.10
jest-worker: 27.5.1
postcss: 8.4.18
schema-utils: 4.0.0
@ -11823,10 +11833,6 @@ packages:
engines: {node: '>=4'}
hasBin: true
/cssfilter/0.0.10:
resolution: {integrity: sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=}
dev: true
/cssnano-preset-advanced/5.3.8_postcss@8.4.16:
resolution: {integrity: sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==}
engines: {node: ^10 || ^12 || >=14.0}
@ -12039,15 +12045,18 @@ packages:
/cssom/0.3.8:
resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
dev: true
/cssom/0.5.0:
resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
dev: true
/cssstyle/2.3.0:
resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
engines: {node: '>=8'}
dependencies:
cssom: 0.3.8
dev: true
/csstype/2.6.13:
resolution: {integrity: sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==}
@ -12150,15 +12159,6 @@ packages:
assert-plus: 1.0.0
dev: true
/data-urls/3.0.0:
resolution: {integrity: sha512-4AefxbTTdFtxDUdh0BuMBs2qJVL25Mow2zlcuuePegQwgD6GEmQao42LLEeksOui8nL4RcNEugIpFP7eRd33xg==}
engines: {node: '>=12'}
dependencies:
abab: 2.0.5
whatwg-mimetype: 2.3.0
whatwg-url: 9.1.0
dev: false
/data-urls/3.0.2:
resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
engines: {node: '>=12'}
@ -12257,6 +12257,7 @@ packages:
optional: true
dependencies:
ms: 2.1.2
dev: true
/debug/4.3.3_supports-color@6.1.0:
resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==}
@ -12318,10 +12319,6 @@ packages:
resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=}
engines: {node: '>=0.10.0'}
/decimal.js/10.3.1:
resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==}
dev: false
/decimal.js/10.4.2:
resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==}
dev: true
@ -12453,6 +12450,7 @@ packages:
/delayed-stream/1.0.0:
resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
engines: {node: '>=0.4.0'}
dev: true
/depd/1.1.2:
resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
@ -12688,13 +12686,6 @@ packages:
/domelementtype/2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
/domexception/2.0.1:
resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
engines: {node: '>=8'}
dependencies:
webidl-conversions: 5.0.0
dev: false
/domexception/4.0.0:
resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
engines: {node: '>=12'}
@ -12717,7 +12708,7 @@ packages:
/dompurify/2.4.0:
resolution: {integrity: sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==}
dev: false
dev: true
/domutils/1.7.0:
resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
@ -13286,6 +13277,7 @@ packages:
optionator: 0.8.3
optionalDependencies:
source-map: 0.6.1
dev: true
/eslint-config-google/0.14.0_eslint@8.26.0:
resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==}
@ -14377,6 +14369,11 @@ packages:
typescript: '>= 2.7'
vue-template-compiler: '*'
webpack: '>= 4'
peerDependenciesMeta:
eslint:
optional: true
vue-template-compiler:
optional: true
dependencies:
'@babel/code-frame': 7.18.6
'@types/json-schema': 7.0.9
@ -14429,6 +14426,7 @@ packages:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.34
dev: true
/formidable/2.0.1:
resolution: {integrity: sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==}
@ -14616,10 +14614,6 @@ packages:
assert-plus: 1.0.0
dev: true
/github-markdown-css/4.0.0:
resolution: {integrity: sha512-mH0bcIKv4XAN0mQVokfTdKo2OD5K8WJE9+lbMdM32/q0Ie5tXgVN/2o+zvToRMxSTUuiTRcLg5hzkFfOyBYreg==}
dev: true
/github-slugger/1.4.0:
resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==}
@ -14987,6 +14981,11 @@ packages:
engines: {node: '>=8'}
dev: true
/highlight.js/11.6.0:
resolution: {integrity: sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==}
engines: {node: '>=12.0.0'}
dev: true
/history/4.10.1:
resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==}
dependencies:
@ -15033,13 +15032,6 @@ packages:
engines: {node: '>=14'}
dev: false
/html-encoding-sniffer/2.0.1:
resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==}
engines: {node: '>=10'}
dependencies:
whatwg-encoding: 1.0.5
dev: false
/html-encoding-sniffer/3.0.0:
resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
engines: {node: '>=12'}
@ -15197,17 +15189,6 @@ packages:
/http-parser-js/0.5.2:
resolution: {integrity: sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==}
/http-proxy-agent/4.0.1:
resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
engines: {node: '>= 6'}
dependencies:
'@tootallnate/once': 1.1.2
agent-base: 6.0.2
debug: 4.3.3
transitivePeerDependencies:
- supports-color
dev: false
/http-proxy-agent/5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
@ -15236,6 +15217,9 @@ packages:
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/express': ^4.17.13
peerDependenciesMeta:
'@types/express':
optional: true
dependencies:
'@types/express': 4.17.14
'@types/http-proxy': 1.17.8
@ -15285,16 +15269,6 @@ packages:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
/https-proxy-agent/5.0.0:
resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==}
engines: {node: '>= 6'}
dependencies:
agent-base: 6.0.2
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: false
/https-proxy-agent/5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
@ -15806,6 +15780,7 @@ packages:
/is-potential-custom-element-name/1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true
/is-promise/2.2.2:
resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
@ -16545,48 +16520,6 @@ packages:
resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=}
dev: true
/jsdom/17.0.0:
resolution: {integrity: sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA==}
engines: {node: '>=12'}
peerDependencies:
canvas: ^2.5.0
peerDependenciesMeta:
canvas:
optional: true
dependencies:
abab: 2.0.5
acorn: 8.4.1
acorn-globals: 6.0.0
cssom: 0.5.0
cssstyle: 2.3.0
data-urls: 3.0.0
decimal.js: 10.3.1
domexception: 2.0.1
escodegen: 2.0.0
form-data: 4.0.0
html-encoding-sniffer: 2.0.1
http-proxy-agent: 4.0.1
https-proxy-agent: 5.0.0
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.0
parse5: 6.0.1
saxes: 5.0.1
symbol-tree: 3.2.4
tough-cookie: 4.0.0
w3c-hr-time: 1.0.2
w3c-xmlserializer: 2.0.0
webidl-conversions: 6.1.0
whatwg-encoding: 1.0.5
whatwg-mimetype: 2.3.0
whatwg-url: 9.1.0
ws: 8.2.1
xml-name-validator: 3.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
dev: false
/jsdom/20.0.1:
resolution: {integrity: sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==}
engines: {node: '>=14'}
@ -16920,6 +16853,7 @@ packages:
dependencies:
prelude-ls: 1.1.2
type-check: 0.3.2
dev: true
/levn/0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
@ -17291,17 +17225,17 @@ packages:
resolution: {integrity: sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==}
dev: true
/marked/3.0.8:
resolution: {integrity: sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==}
engines: {node: '>= 12'}
hasBin: true
dev: false
/marked/4.1.1:
resolution: {integrity: sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==}
engines: {node: '>= 12'}
hasBin: true
/marked/4.2.2:
resolution: {integrity: sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ==}
engines: {node: '>= 12'}
hasBin: true
dev: true
/mathml-tag-names/2.1.3:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
dev: true
@ -18749,10 +18683,6 @@ packages:
dependencies:
boolbase: 1.0.0
/nwsapi/2.2.0:
resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==}
dev: false
/nwsapi/2.2.2:
resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==}
dev: true
@ -18935,6 +18865,7 @@ packages:
prelude-ls: 1.1.2
type-check: 0.3.2
word-wrap: 1.2.3
dev: true
/optionator/0.9.1:
resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
@ -20403,6 +20334,7 @@ packages:
/prelude-ls/1.1.2:
resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=}
engines: {node: '>= 0.8.0'}
dev: true
/prelude-ls/1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@ -20566,6 +20498,7 @@ packages:
/psl/1.8.0:
resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==}
dev: true
/pstree.remy/1.1.8:
resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
@ -21847,13 +21780,6 @@ packages:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
dev: false
/saxes/5.0.1:
resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
engines: {node: '>=10'}
dependencies:
xmlchars: 2.2.0
dev: false
/saxes/6.0.0:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
@ -23002,6 +22928,7 @@ packages:
/symbol-tree/3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
/table/6.8.0:
resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==}
@ -23301,15 +23228,6 @@ packages:
punycode: 2.1.1
dev: true
/tough-cookie/4.0.0:
resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==}
engines: {node: '>=6'}
dependencies:
psl: 1.8.0
punycode: 2.1.1
universalify: 0.1.2
dev: false
/tough-cookie/4.1.2:
resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
engines: {node: '>=6'}
@ -23323,13 +23241,6 @@ packages:
/tr46/0.0.3:
resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=}
/tr46/2.1.0:
resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
engines: {node: '>=8'}
dependencies:
punycode: 2.1.1
dev: false
/tr46/3.0.0:
resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
engines: {node: '>=12'}
@ -23466,6 +23377,7 @@ packages:
engines: {node: '>= 0.8.0'}
dependencies:
prelude-ls: 1.1.2
dev: true
/type-check/0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@ -23790,6 +23702,7 @@ packages:
/universalify/0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
dev: true
/universalify/0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
@ -24198,19 +24111,6 @@ packages:
/vscode-textmate/6.0.0:
resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==}
/w3c-hr-time/1.0.2:
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
dependencies:
browser-process-hrtime: 1.0.0
dev: false
/w3c-xmlserializer/2.0.0:
resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
engines: {node: '>=10'}
dependencies:
xml-name-validator: 3.0.0
dev: false
/w3c-xmlserializer/3.0.0:
resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==}
engines: {node: '>=12'}
@ -24290,16 +24190,6 @@ packages:
/webidl-conversions/3.0.1:
resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=}
/webidl-conversions/5.0.0:
resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
engines: {node: '>=8'}
dev: false
/webidl-conversions/6.1.0:
resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
engines: {node: '>=10.4'}
dev: false
/webidl-conversions/7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
@ -24555,6 +24445,10 @@ packages:
hasBin: true
peerDependencies:
webpack: ^4.37.0 || ^5.0.0
webpack-cli: '*'
peerDependenciesMeta:
webpack-cli:
optional: true
dependencies:
'@types/bonjour': 3.5.10
'@types/connect-history-api-fallback': 1.3.5
@ -24822,12 +24716,6 @@ packages:
resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
engines: {node: '>=0.8.0'}
/whatwg-encoding/1.0.5:
resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
dependencies:
iconv-lite: 0.4.24
dev: false
/whatwg-encoding/2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
@ -24839,10 +24727,6 @@ packages:
resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==}
dev: true
/whatwg-mimetype/2.3.0:
resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
dev: false
/whatwg-mimetype/3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
@ -24862,14 +24746,6 @@ packages:
tr46: 0.0.3
webidl-conversions: 3.0.1
/whatwg-url/9.1.0:
resolution: {integrity: sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==}
engines: {node: '>=12'}
dependencies:
tr46: 2.1.0
webidl-conversions: 6.1.0
dev: false
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:
@ -25019,19 +24895,6 @@ packages:
utf-8-validate:
optional: true
/ws/8.2.1:
resolution: {integrity: sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
dev: false
/ws/8.9.0:
resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==}
engines: {node: '>=10.0.0'}
@ -25055,10 +24918,6 @@ packages:
sax: 1.2.4
dev: false
/xml-name-validator/3.0.0:
resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
dev: false
/xml-name-validator/4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
@ -25070,14 +24929,6 @@ packages:
/xmlchars/2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
/xss/1.0.14:
resolution: {integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==}
engines: {node: '>= 0.10.0'}
hasBin: true
dependencies:
commander: 2.20.3
cssfilter: 0.0.10
dev: true
/xtend/4.0.2: