mirror of
https://github.com/verdaccio/verdaccio.git
synced 2024-12-16 21:56:25 -05:00
chore(website): add api section (#3424)
* chore: add api section * chore: fix build * Update website.yml * chore: improve types plugin clean up others stuff * Update crowdin.yaml * clean up
This commit is contained in:
parent
bf36b9477c
commit
64cfedb805
85 changed files with 661 additions and 970 deletions
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': major
|
'@verdaccio/auth': major
|
||||||
'@verdaccio/cli': major
|
'@verdaccio/cli': major
|
||||||
'@verdaccio/config': major
|
'@verdaccio/config': major
|
||||||
'@verdaccio/commons-api': major
|
|
||||||
'@verdaccio/core': major
|
'@verdaccio/core': major
|
||||||
'@verdaccio/local-storage': major
|
'@verdaccio/local-storage': major
|
||||||
'@verdaccio/server-fastify': major
|
'@verdaccio/server-fastify': major
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': major
|
'@verdaccio/auth': major
|
||||||
'@verdaccio/cli': major
|
'@verdaccio/cli': major
|
||||||
'@verdaccio/config': major
|
'@verdaccio/config': major
|
||||||
'@verdaccio/commons-api': major
|
|
||||||
'@verdaccio/file-locking': major
|
'@verdaccio/file-locking': major
|
||||||
'verdaccio-htpasswd': major
|
'verdaccio-htpasswd': major
|
||||||
'@verdaccio/local-storage': major
|
'@verdaccio/local-storage': major
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': major
|
'@verdaccio/auth': major
|
||||||
'@verdaccio/cli': major
|
'@verdaccio/cli': major
|
||||||
'@verdaccio/config': major
|
'@verdaccio/config': major
|
||||||
'@verdaccio/commons-api': major
|
|
||||||
'@verdaccio/file-locking': major
|
'@verdaccio/file-locking': major
|
||||||
'verdaccio-htpasswd': major
|
'verdaccio-htpasswd': major
|
||||||
'@verdaccio/local-storage': major
|
'@verdaccio/local-storage': major
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
'@verdaccio/auth': patch
|
'@verdaccio/auth': patch
|
||||||
'@verdaccio/cli': patch
|
'@verdaccio/cli': patch
|
||||||
'@verdaccio/config': patch
|
'@verdaccio/config': patch
|
||||||
'@verdaccio/commons-api': patch
|
|
||||||
'@verdaccio/file-locking': patch
|
'@verdaccio/file-locking': patch
|
||||||
'verdaccio-htpasswd': patch
|
'verdaccio-htpasswd': patch
|
||||||
'@verdaccio/readme': patch
|
'@verdaccio/readme': patch
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': minor
|
'@verdaccio/auth': minor
|
||||||
'@verdaccio/cli': minor
|
'@verdaccio/cli': minor
|
||||||
'@verdaccio/config': minor
|
'@verdaccio/config': minor
|
||||||
'@verdaccio/commons-api': minor
|
|
||||||
'@verdaccio/file-locking': minor
|
'@verdaccio/file-locking': minor
|
||||||
'verdaccio-htpasswd': minor
|
'verdaccio-htpasswd': minor
|
||||||
'@verdaccio/local-storage': minor
|
'@verdaccio/local-storage': minor
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': minor
|
'@verdaccio/auth': minor
|
||||||
'@verdaccio/cli': minor
|
'@verdaccio/cli': minor
|
||||||
'@verdaccio/config': minor
|
'@verdaccio/config': minor
|
||||||
'@verdaccio/commons-api': minor
|
|
||||||
'@verdaccio/file-locking': minor
|
'@verdaccio/file-locking': minor
|
||||||
'verdaccio-htpasswd': minor
|
'verdaccio-htpasswd': minor
|
||||||
'@verdaccio/local-storage': minor
|
'@verdaccio/local-storage': minor
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': patch
|
'@verdaccio/auth': patch
|
||||||
'@verdaccio/cli': patch
|
'@verdaccio/cli': patch
|
||||||
'@verdaccio/config': patch
|
'@verdaccio/config': patch
|
||||||
'@verdaccio/commons-api': patch
|
|
||||||
'@verdaccio/file-locking': patch
|
'@verdaccio/file-locking': patch
|
||||||
'verdaccio-htpasswd': patch
|
'verdaccio-htpasswd': patch
|
||||||
'@verdaccio/local-storage': patch
|
'@verdaccio/local-storage': patch
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
'@verdaccio/auth': patch
|
'@verdaccio/auth': patch
|
||||||
'@verdaccio/cli': patch
|
'@verdaccio/cli': patch
|
||||||
'@verdaccio/config': patch
|
'@verdaccio/config': patch
|
||||||
'@verdaccio/commons-api': patch
|
|
||||||
'@verdaccio/file-locking': patch
|
'@verdaccio/file-locking': patch
|
||||||
'verdaccio-htpasswd': patch
|
'verdaccio-htpasswd': patch
|
||||||
'@verdaccio/local-storage': patch
|
'@verdaccio/local-storage': patch
|
||||||
|
|
4
.github/workflows/website.yml
vendored
4
.github/workflows/website.yml
vendored
|
@ -37,8 +37,8 @@ jobs:
|
||||||
run_install: |
|
run_install: |
|
||||||
- recursive: true
|
- recursive: true
|
||||||
args: [--frozen-lockfile]
|
args: [--frozen-lockfile]
|
||||||
- name: Build Plugins
|
- name: Build
|
||||||
run: pnpm build --filter "docusaurus-plugin-contributors"
|
run: pnpm build
|
||||||
- name: Build Translations percentage
|
- name: Build Translations percentage
|
||||||
run: pnpm build --filter "@verdaccio/crowdin-translations"
|
run: pnpm build --filter "@verdaccio/crowdin-translations"
|
||||||
- name: Cache Docusaurus Build
|
- name: Cache Docusaurus Build
|
||||||
|
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -49,5 +49,7 @@ api-results*.json
|
||||||
.clinic/
|
.clinic/
|
||||||
|
|
||||||
#docs
|
#docs
|
||||||
./api
|
website/docs/api/**/*.md
|
||||||
**/docs/**
|
website/docs/api/**/*.yml
|
||||||
|
!website/docs/api/index.md
|
||||||
|
packages/core/types/docs
|
||||||
|
|
|
@ -8,13 +8,12 @@ preserve_hierarchy: true
|
||||||
files:
|
files:
|
||||||
- source: /packages/plugins/ui-theme/src/i18n/crowdin/*.json
|
- source: /packages/plugins/ui-theme/src/i18n/crowdin/*.json
|
||||||
translation: '/packages/plugins/ui-theme/src/i18n/download_translations/%locale%/%original_file_name%'
|
translation: '/packages/plugins/ui-theme/src/i18n/download_translations/%locale%/%original_file_name%'
|
||||||
# languages_mapping: *languages_mapping
|
|
||||||
- source: /website/i18n/en/**/*
|
- source: /website/i18n/en/**/*
|
||||||
translation: '/website/i18n/%locale%/**/%original_file_name%'
|
translation: '/website/i18n/%locale%/**/%original_file_name%'
|
||||||
- source: /website/docs/**/*
|
- source: /website/docs/**/*
|
||||||
translation: '/website/i18n/%locale%/docusaurus-plugin-content-docs/current/**/%original_file_name%'
|
translation: '/website/i18n/%locale%/docusaurus-plugin-content-docs/current/**/%original_file_name%'
|
||||||
# languages_mapping: *languages_mapping
|
ignore: [/website/docs/api/**/*]
|
||||||
- source: /website/versioned_docs/**/*
|
- source: /website/versioned_docs/**/*
|
||||||
translation: /website/i18n/%locale%/docusaurus-plugin-content-docs/**/%original_file_name%
|
translation: /website/i18n/%locale%/docusaurus-plugin-content-docs/**/%original_file_name%
|
||||||
# languages_mapping: *languages_mapping
|
ignore: [/website/versioned_docs/version-5.x/api/**/*]
|
||||||
|
|
3
docs/plugins.md
Normal file
3
docs/plugins.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
## Developing plugins
|
||||||
|
|
||||||
|
TBA
|
|
@ -10,7 +10,7 @@ module.exports = {
|
||||||
coveragePathIgnorePatterns: ['node_modules', 'fixtures'],
|
coveragePathIgnorePatterns: ['node_modules', 'fixtures'],
|
||||||
coverageThreshold: {
|
coverageThreshold: {
|
||||||
global: {
|
global: {
|
||||||
lines: 90,
|
lines: 85,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -111,7 +111,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "husky install",
|
"prepare": "husky install",
|
||||||
"husky:pre-commit": "lint-staged",
|
"husky:pre-commit": "lint-staged",
|
||||||
"clean": "pnpm run clean",
|
"clean": "pnpm run clean --filter=./packages",
|
||||||
"build": "pnpm run build --filter=./packages && pnpm run build --filter=./e2e",
|
"build": "pnpm run build --filter=./packages && pnpm run build --filter=./e2e",
|
||||||
"docker": "docker build -t verdaccio/verdaccio:local . --no-cache",
|
"docker": "docker build -t verdaccio/verdaccio:local . --no-cache",
|
||||||
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,yml,yaml,md}\"",
|
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,yml,yaml,md}\"",
|
||||||
|
@ -151,6 +151,12 @@
|
||||||
"local:publish": "cross-env npm_config_registry=http://localhost:4873 pnpm ci:publish",
|
"local:publish": "cross-env npm_config_registry=http://localhost:4873 pnpm ci:publish",
|
||||||
"local:publish:release": "concurrently \"pnpm local:registry\" \"pnpm local:publish\""
|
"local:publish:release": "concurrently \"pnpm local:registry\" \"pnpm local:publish\""
|
||||||
},
|
},
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"got": "11.8.5",
|
||||||
|
"p-cancelable": "2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.5",
|
"node": ">=16.5",
|
||||||
"pnpm": ">=6.32.3 <7.0.0"
|
"pnpm": ">=6.32.3 <7.0.0"
|
||||||
|
|
|
@ -11,18 +11,16 @@ import {
|
||||||
TOKEN_BEARER,
|
TOKEN_BEARER,
|
||||||
VerdaccioError,
|
VerdaccioError,
|
||||||
errorUtils,
|
errorUtils,
|
||||||
|
pluginUtils,
|
||||||
} from '@verdaccio/core';
|
} from '@verdaccio/core';
|
||||||
import { asyncLoadPlugin } from '@verdaccio/loaders';
|
import { asyncLoadPlugin } from '@verdaccio/loaders';
|
||||||
import {
|
import {
|
||||||
AllowAccess,
|
AllowAccess,
|
||||||
AuthPluginPackage,
|
|
||||||
Callback,
|
Callback,
|
||||||
Config,
|
Config,
|
||||||
IPluginAuth,
|
|
||||||
JWTSignOptions,
|
JWTSignOptions,
|
||||||
Logger,
|
Logger,
|
||||||
PackageAccess,
|
PackageAccess,
|
||||||
PluginOptions,
|
|
||||||
RemoteUser,
|
RemoteUser,
|
||||||
Security,
|
Security,
|
||||||
} from '@verdaccio/types';
|
} from '@verdaccio/types';
|
||||||
|
@ -46,15 +44,6 @@ const LoggerApi = require('@verdaccio/logger');
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:auth');
|
const debug = buildDebug('verdaccio:auth');
|
||||||
|
|
||||||
export interface IBasicAuth<T> {
|
|
||||||
config: T & Config;
|
|
||||||
authenticate(user: string, password: string, cb: Callback): void;
|
|
||||||
invalidateToken?(token: string): Promise<void>;
|
|
||||||
changePassword(user: string, password: string, newPassword: string, cb: Callback): void;
|
|
||||||
allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;
|
|
||||||
add_user(user: string, password: string, cb: Callback): any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TokenEncryption {
|
export interface TokenEncryption {
|
||||||
jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;
|
jwtEncrypt(user: RemoteUser, signOptions: JWTSignOptions): Promise<string>;
|
||||||
aesEncrypt(buf: string): string | void;
|
aesEncrypt(buf: string): string | void;
|
||||||
|
@ -74,13 +63,13 @@ export interface IAuthMiddleware {
|
||||||
webUIJWTmiddleware(): $NextFunctionVer;
|
webUIJWTmiddleware(): $NextFunctionVer;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAuth extends IBasicAuth<Config>, IAuthMiddleware, TokenEncryption {
|
export interface IAuth extends IAuthMiddleware, TokenEncryption, pluginUtils.IBasicAuth {
|
||||||
config: Config;
|
config: Config;
|
||||||
logger: Logger;
|
logger: Logger;
|
||||||
secret: string;
|
secret: string;
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
plugins: any[];
|
plugins: any[];
|
||||||
allow_unpublish(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;
|
allow_unpublish(pkg: pluginUtils.AuthPluginPackage, user: RemoteUser, callback: Callback): void;
|
||||||
invalidateToken(token: string): Promise<void>;
|
invalidateToken(token: string): Promise<void>;
|
||||||
init(): Promise<void>;
|
init(): Promise<void>;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +78,7 @@ class Auth implements IAuth {
|
||||||
public config: Config;
|
public config: Config;
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
public secret: string;
|
public secret: string;
|
||||||
public plugins: IPluginAuth<Config>[];
|
public plugins: pluginUtils.IPluginAuth<Config>[];
|
||||||
|
|
||||||
public constructor(config: Config) {
|
public constructor(config: Config) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
@ -114,13 +103,16 @@ class Auth implements IAuth {
|
||||||
|
|
||||||
private loadDefaultPlugin() {
|
private loadDefaultPlugin() {
|
||||||
debug('load default auth plugin');
|
debug('load default auth plugin');
|
||||||
const pluginOptions: PluginOptions = {
|
const pluginOptions: pluginUtils.PluginOptions = {
|
||||||
config: this.config,
|
config: this.config,
|
||||||
logger: this.logger,
|
logger: this.logger,
|
||||||
};
|
};
|
||||||
let authPlugin;
|
let authPlugin;
|
||||||
try {
|
try {
|
||||||
authPlugin = new HTPasswd({ file: './htpasswd' }, pluginOptions as any as PluginOptions);
|
authPlugin = new HTPasswd(
|
||||||
|
{ file: './htpasswd' },
|
||||||
|
pluginOptions as any as pluginUtils.PluginOptions
|
||||||
|
);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
debug('error on loading auth htpasswd plugin stack: %o', error);
|
debug('error on loading auth htpasswd plugin stack: %o', error);
|
||||||
return [];
|
return [];
|
||||||
|
@ -129,14 +121,14 @@ class Auth implements IAuth {
|
||||||
return [authPlugin];
|
return [authPlugin];
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadPlugin(): Promise<IPluginAuth<Config>[]> {
|
private async loadPlugin(): Promise<pluginUtils.IPluginAuth<Config>[]> {
|
||||||
return asyncLoadPlugin<IPluginAuth<Config>>(
|
return asyncLoadPlugin<pluginUtils.IPluginAuth<any>>(
|
||||||
this.config.auth,
|
this.config.auth,
|
||||||
{
|
{
|
||||||
config: this.config,
|
config: this.config,
|
||||||
logger: this.logger,
|
logger: this.logger,
|
||||||
},
|
},
|
||||||
(plugin: IPluginAuth<Config>): boolean => {
|
(plugin: pluginUtils.IPluginAuth<Config>): boolean => {
|
||||||
const { authenticate, allow_access, allow_publish } = plugin;
|
const { authenticate, allow_access, allow_publish } = plugin;
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -195,7 +187,7 @@ class Auth implements IAuth {
|
||||||
public authenticate(username: string, password: string, cb: Callback): void {
|
public authenticate(username: string, password: string, cb: Callback): void {
|
||||||
const plugins = this.plugins.slice(0);
|
const plugins = this.plugins.slice(0);
|
||||||
(function next(): void {
|
(function next(): void {
|
||||||
const plugin = plugins.shift() as IPluginAuth<Config>;
|
const plugin = plugins.shift() as pluginUtils.IPluginAuth<Config>;
|
||||||
|
|
||||||
if (isFunction(plugin.authenticate) === false) {
|
if (isFunction(plugin.authenticate) === false) {
|
||||||
return next();
|
return next();
|
||||||
|
@ -239,7 +231,7 @@ class Auth implements IAuth {
|
||||||
debug('add user %o', user);
|
debug('add user %o', user);
|
||||||
|
|
||||||
(function next(): void {
|
(function next(): void {
|
||||||
const plugin = plugins.shift() as IPluginAuth<Config>;
|
const plugin = plugins.shift() as pluginUtils.IPluginAuth<Config>;
|
||||||
let method = 'adduser';
|
let method = 'adduser';
|
||||||
if (isFunction(plugin[method]) === false) {
|
if (isFunction(plugin[method]) === false) {
|
||||||
method = 'add_user';
|
method = 'add_user';
|
||||||
|
@ -272,7 +264,7 @@ class Auth implements IAuth {
|
||||||
* Allow user to access a package.
|
* Allow user to access a package.
|
||||||
*/
|
*/
|
||||||
public allow_access(
|
public allow_access(
|
||||||
{ packageName, packageVersion }: AuthPluginPackage,
|
{ packageName, packageVersion }: pluginUtils.AuthPluginPackage,
|
||||||
user: RemoteUser,
|
user: RemoteUser,
|
||||||
callback: Callback
|
callback: Callback
|
||||||
): void {
|
): void {
|
||||||
|
@ -286,7 +278,8 @@ class Auth implements IAuth {
|
||||||
debug('allow access for %o', packageName);
|
debug('allow access for %o', packageName);
|
||||||
|
|
||||||
(function next(): void {
|
(function next(): void {
|
||||||
const plugin: IPluginAuth<Config> = plugins.shift() as IPluginAuth<Config>;
|
const plugin: pluginUtils.IPluginAuth<Config> =
|
||||||
|
plugins.shift() as pluginUtils.IPluginAuth<Config>;
|
||||||
|
|
||||||
if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {
|
if (_.isNil(plugin) || isFunction(plugin.allow_access) === false) {
|
||||||
return next();
|
return next();
|
||||||
|
@ -309,7 +302,7 @@ class Auth implements IAuth {
|
||||||
}
|
}
|
||||||
|
|
||||||
public allow_unpublish(
|
public allow_unpublish(
|
||||||
{ packageName, packageVersion }: AuthPluginPackage,
|
{ packageName, packageVersion }: pluginUtils.AuthPluginPackage,
|
||||||
user: RemoteUser,
|
user: RemoteUser,
|
||||||
callback: Callback
|
callback: Callback
|
||||||
): void {
|
): void {
|
||||||
|
@ -354,7 +347,7 @@ class Auth implements IAuth {
|
||||||
* Allow user to publish a package.
|
* Allow user to publish a package.
|
||||||
*/
|
*/
|
||||||
public allow_publish(
|
public allow_publish(
|
||||||
{ packageName, packageVersion }: AuthPluginPackage,
|
{ packageName, packageVersion }: pluginUtils.AuthPluginPackage,
|
||||||
user: RemoteUser,
|
user: RemoteUser,
|
||||||
callback: Callback
|
callback: Callback
|
||||||
): void {
|
): void {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
export { Auth, IAuth, TokenEncryption, IBasicAuth } from './auth';
|
export { Auth, IAuth, TokenEncryption } from './auth';
|
||||||
export * from './utils';
|
export * from './utils';
|
||||||
export * from './legacy-token';
|
export * from './legacy-token';
|
||||||
export * from './jwt-token';
|
export * from './jwt-token';
|
||||||
|
|
|
@ -9,15 +9,9 @@ import {
|
||||||
TOKEN_BEARER,
|
TOKEN_BEARER,
|
||||||
VerdaccioError,
|
VerdaccioError,
|
||||||
errorUtils,
|
errorUtils,
|
||||||
|
pluginUtils,
|
||||||
} from '@verdaccio/core';
|
} from '@verdaccio/core';
|
||||||
import {
|
import { AuthPackageAllow, Callback, Config, RemoteUser, Security } from '@verdaccio/types';
|
||||||
AuthPackageAllow,
|
|
||||||
Callback,
|
|
||||||
Config,
|
|
||||||
IPluginAuth,
|
|
||||||
RemoteUser,
|
|
||||||
Security,
|
|
||||||
} from '@verdaccio/types';
|
|
||||||
|
|
||||||
import { AESPayload, TokenEncryption } from './auth';
|
import { AESPayload, TokenEncryption } from './auth';
|
||||||
import { verifyPayload } from './jwt-token';
|
import { verifyPayload } from './jwt-token';
|
||||||
|
@ -161,7 +155,7 @@ export function isAuthHeaderValid(authorization: string): boolean {
|
||||||
return authorization.split(' ').length === 2;
|
return authorization.split(' ').length === 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDefaultPlugins(logger: any): IPluginAuth<Config> {
|
export function getDefaultPlugins(logger: any): pluginUtils.IPluginAuth<Config> {
|
||||||
return {
|
return {
|
||||||
authenticate(user: string, password: string, cb: Callback): void {
|
authenticate(user: string, password: string, cb: Callback): void {
|
||||||
cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
|
cb(errorUtils.getForbidden(API_ERROR.BAD_USERNAME_PASSWORD));
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
"path": "../config"
|
"path": "../config"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../core/htpasswd"
|
"path": "../plugins/htpasswd"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../loaders"
|
"path": "../loaders"
|
||||||
|
@ -19,9 +19,6 @@
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../logger"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../mock"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../utils"
|
"path": "../utils"
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,6 @@
|
||||||
{
|
{
|
||||||
"path": "../config"
|
"path": "../config"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../core/cli-ui"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../core/core"
|
"path": "../core/core"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,72 +1,5 @@
|
||||||
# @verdaccio/config
|
# @verdaccio/config
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)
|
|
||||||
[![stackshare](https://img.shields.io/badge/Follow%20on-StackShare-blue.svg?logo=stackshare&style=flat)](https://stackshare.io/verdaccio)
|
|
||||||
[![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
|
||||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/verdaccio/localized.svg)](https://crowdin.com/project/verdaccio)
|
|
||||||
[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/verdaccio/verdaccio)](https://www.tickgit.com/browse?repo=github.com/verdaccio/verdaccio)
|
|
||||||
|
|
||||||
[![Twitter followers](https://img.shields.io/twitter/follow/verdaccio_npm.svg?style=social&label=Follow)](https://twitter.com/verdaccio_npm)
|
|
||||||
[![Github](https://img.shields.io/github/stars/verdaccio/verdaccio.svg?style=social&label=Stars)](https://github.com/verdaccio/verdaccio/stargazers)
|
|
||||||
|
|
||||||
## Donations
|
|
||||||
|
|
||||||
Verdaccio is run by **volunteers**; nobody is working full-time on it. If you find this project to be useful and would like to support its development, consider making a donation - **your logo might end up in this readme.** 😉
|
|
||||||
|
|
||||||
**[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\$1/month_ or just one single contribution.
|
|
||||||
|
|
||||||
## Report a vulnerability
|
|
||||||
|
|
||||||
If you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).
|
|
||||||
|
|
||||||
## Open Collective Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio#sponsor)]
|
|
||||||
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.svg)](https://opencollective.com/verdaccio/sponsor/0/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.svg)](https://opencollective.com/verdaccio/sponsor/1/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.svg)](https://opencollective.com/verdaccio/sponsor/2/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.svg)](https://opencollective.com/verdaccio/sponsor/3/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.svg)](https://opencollective.com/verdaccio/sponsor/4/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.svg)](https://opencollective.com/verdaccio/sponsor/5/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.svg)](https://opencollective.com/verdaccio/sponsor/6/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.svg)](https://opencollective.com/verdaccio/sponsor/7/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.svg)](https://opencollective.com/verdaccio/sponsor/8/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.svg)](https://opencollective.com/verdaccio/sponsor/9/website)
|
|
||||||
|
|
||||||
## Open Collective Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio#backer)]
|
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/backers.svg?width=890)](https://opencollective.com/verdaccio#backers)
|
|
||||||
|
|
||||||
## Special Thanks
|
|
||||||
|
|
||||||
Thanks to the following companies to help us to achieve our goals providing free open source licenses.
|
|
||||||
|
|
||||||
[![jetbrain](assets/thanks/jetbrains/logo.png)](https://www.jetbrains.com/)
|
|
||||||
[![crowdin](assets/thanks/crowdin/logo.png)](https://crowdin.com/)
|
|
||||||
[![balsamiq](assets/thanks/balsamiq/logo.jpg)](https://balsamiq.com/)
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
|
||||||
|
|
||||||
[![contributors](https://opencollective.com/verdaccio/contributors.svg?width=890&button=true)](../../graphs/contributors)
|
|
||||||
|
|
||||||
### FAQ / Contact / Troubleshoot
|
|
||||||
|
|
||||||
If you have any issue you can try the following options, do no desist to ask or check our issues database, perhaps someone has asked already what you are looking for.
|
|
||||||
|
|
||||||
- [Blog](https://verdaccio.org/blog/)
|
|
||||||
- [Donations](https://opencollective.com/verdaccio)
|
|
||||||
- [Reporting an issue](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md#reporting-a-bug)
|
|
||||||
- [Running discussions](https://github.com/verdaccio/verdaccio/issues?q=is%3Aissue+is%3Aopen+label%3Adiscuss)
|
|
||||||
- [Chat](http://chat.verdaccio.org/)
|
|
||||||
- [Logos](https://verdaccio.org/docs/en/logo)
|
|
||||||
- [Docker Examples](https://github.com/verdaccio/docker-examples)
|
|
||||||
- [FAQ](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20)
|
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
||||||
|
|
|
@ -1,15 +1,75 @@
|
||||||
import { Config, IPackageStorage, Token, TokenFilter } from '@verdaccio/types';
|
import { Readable, Writable } from 'stream';
|
||||||
|
|
||||||
|
import {
|
||||||
|
AllowAccess,
|
||||||
|
Callback,
|
||||||
|
Config,
|
||||||
|
HttpError,
|
||||||
|
Logger,
|
||||||
|
Manifest,
|
||||||
|
PackageAccess,
|
||||||
|
RemoteUser,
|
||||||
|
Token,
|
||||||
|
TokenFilter,
|
||||||
|
} from '@verdaccio/types';
|
||||||
|
|
||||||
import { searchUtils } from '.';
|
import { searchUtils } from '.';
|
||||||
|
|
||||||
interface IPlugin {
|
export type AuthError = HttpError & { code: number };
|
||||||
version?: string;
|
export type AuthAccessCallback = (error: AuthError | null, access: boolean) => void;
|
||||||
// In case a plugin needs to be cleaned up/removed
|
export type AuthCallback = (error: AuthError | null, groups: string[] | false) => void;
|
||||||
close?(): void;
|
|
||||||
|
export interface AuthPluginPackage {
|
||||||
|
packageName: string;
|
||||||
|
packageVersion?: string;
|
||||||
|
tag?: string;
|
||||||
|
}
|
||||||
|
export interface PluginOptions {
|
||||||
|
config: Config;
|
||||||
|
logger: Logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPluginStorage<T> extends IPlugin {
|
/**
|
||||||
config: T & Config;
|
* The base plugin class, set of utilities for developing
|
||||||
|
* plugins.
|
||||||
|
* @alpha
|
||||||
|
* */
|
||||||
|
export class Plugin<T> {
|
||||||
|
static version = 1;
|
||||||
|
public version: number;
|
||||||
|
public config: T;
|
||||||
|
public options: PluginOptions;
|
||||||
|
public constructor(config: T, options: PluginOptions) {
|
||||||
|
this.version = Plugin.version;
|
||||||
|
this.config = config;
|
||||||
|
this.options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getVersion() {
|
||||||
|
return this.version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export interface IPackageStorage {
|
||||||
|
logger: Logger;
|
||||||
|
deletePackage(fileName: string): Promise<void>;
|
||||||
|
removePackage(): Promise<void>;
|
||||||
|
// next packages migration (this list is meant to replace the callback parent functions)
|
||||||
|
updatePackage(
|
||||||
|
packageName: string,
|
||||||
|
handleUpdate: (manifest: Manifest) => Promise<Manifest>
|
||||||
|
): Promise<Manifest>;
|
||||||
|
readPackage(name: string): Promise<Manifest>;
|
||||||
|
savePackage(pkgName: string, value: Manifest): Promise<void>;
|
||||||
|
readTarball(pkgName: string, { signal }): Promise<Readable>;
|
||||||
|
createPackage(name: string, manifest: Manifest): Promise<void>;
|
||||||
|
writeTarball(tarballName: string, { signal }): Promise<Writable>;
|
||||||
|
// verify if tarball exist in the storage
|
||||||
|
hasTarball(fileName: string): Promise<boolean>;
|
||||||
|
// verify if package exist in the storage
|
||||||
|
hasPackage(): Promise<boolean>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPluginStorage<T> extends Plugin<T> {
|
||||||
add(name: string): Promise<void>;
|
add(name: string): Promise<void>;
|
||||||
remove(name: string): Promise<void>;
|
remove(name: string): Promise<void>;
|
||||||
get(): Promise<any>;
|
get(): Promise<any>;
|
||||||
|
@ -22,3 +82,39 @@ export interface IPluginStorage<T> extends IPlugin {
|
||||||
deleteToken(user: string, tokenKey: string): Promise<any>;
|
deleteToken(user: string, tokenKey: string): Promise<any>;
|
||||||
readTokens(filter: TokenFilter): Promise<Token[]>;
|
readTokens(filter: TokenFilter): Promise<Token[]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IBasicAuth {
|
||||||
|
authenticate(user: string, password: string, cb: Callback): void;
|
||||||
|
invalidateToken?(token: string): Promise<void>;
|
||||||
|
changePassword(user: string, password: string, newPassword: string, cb: Callback): void;
|
||||||
|
allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;
|
||||||
|
add_user(user: string, password: string, cb: Callback): any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPluginMiddleware<T, K, L> extends Plugin<T> {
|
||||||
|
register_middlewares(app: any, auth: L, storage: K): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPluginAuth<T> extends Plugin<T> {
|
||||||
|
/**
|
||||||
|
* @param props user from Application component
|
||||||
|
*/
|
||||||
|
authenticate(user: string, password: string, cb: AuthCallback): void;
|
||||||
|
adduser?(user: string, password: string, cb: AuthCallback): void;
|
||||||
|
changePassword?(user: string, password: string, newPassword: string, cb: AuthCallback): void;
|
||||||
|
allow_publish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
||||||
|
allow_publish?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
|
||||||
|
allow_access?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
||||||
|
allow_access?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
|
||||||
|
allow_unpublish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
||||||
|
allow_unpublish?(
|
||||||
|
user: RemoteUser,
|
||||||
|
pkg: AllowAccess & PackageAccess,
|
||||||
|
cb: AuthAccessCallback
|
||||||
|
): void;
|
||||||
|
apiJWTmiddleware?(helpers: any): Function;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPluginStorageFilter<T> extends Plugin<T> {
|
||||||
|
filterMetadata(packageInfo: Manifest): Promise<Manifest>;
|
||||||
|
}
|
||||||
|
|
|
@ -1,90 +1,9 @@
|
||||||
import { PassThrough, Transform, TransformOptions } from 'stream';
|
import { Readable, Transform } from 'stream';
|
||||||
|
|
||||||
export interface IReadTarball {
|
|
||||||
abort?: () => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IUploadTarball {
|
|
||||||
done?: () => void;
|
|
||||||
abort?: () => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This stream is used to read tarballs from repository.
|
|
||||||
* @param {*} options
|
|
||||||
* @return {Stream}
|
|
||||||
*/
|
|
||||||
class ReadTarball extends PassThrough implements IReadTarball {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {Object} options
|
|
||||||
*/
|
|
||||||
public constructor(options: TransformOptions) {
|
|
||||||
super(options);
|
|
||||||
// called when data is not needed anymore
|
|
||||||
addAbstractMethods(this, 'abort');
|
|
||||||
}
|
|
||||||
|
|
||||||
public abort(): void {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This stream is used to upload tarballs to a repository.
|
|
||||||
* @param {*} options
|
|
||||||
* @return {Stream}
|
|
||||||
*/
|
|
||||||
class UploadTarball extends PassThrough implements IUploadTarball {
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {Object} options
|
|
||||||
*/
|
|
||||||
public constructor(options: any) {
|
|
||||||
super(options);
|
|
||||||
// called when user closes connection before upload finishes
|
|
||||||
addAbstractMethods(this, 'abort');
|
|
||||||
|
|
||||||
// called when upload finishes successfully
|
|
||||||
addAbstractMethods(this, 'done');
|
|
||||||
}
|
|
||||||
|
|
||||||
public abort(): void {}
|
|
||||||
public done(): void {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function intercepts abstract calls and replays them allowing.
|
|
||||||
* us to attach those functions after we are ready to do so
|
|
||||||
* @param {*} self
|
|
||||||
* @param {*} name
|
|
||||||
*/
|
|
||||||
// Perhaps someone knows a better way to write this
|
|
||||||
function addAbstractMethods(self: any, name: any): void {
|
|
||||||
self._called_methods = self._called_methods || {};
|
|
||||||
|
|
||||||
self.__defineGetter__(name, function () {
|
|
||||||
return function (): void {
|
|
||||||
self._called_methods[name] = true;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
self.__defineSetter__(name, function (fn: any) {
|
|
||||||
delete self[name];
|
|
||||||
|
|
||||||
self[name] = fn;
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
|
|
||||||
if (self._called_methods && self._called_methods[name]) {
|
|
||||||
delete self._called_methods[name];
|
|
||||||
|
|
||||||
self[name]();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a buffer stream to a string.
|
* Converts a buffer stream to a string.
|
||||||
*/
|
*/
|
||||||
const readableToString = async (stream) => {
|
const readableToString = async (stream: Readable) => {
|
||||||
const chunks: Buffer[] = [];
|
const chunks: Buffer[] = [];
|
||||||
for await (let chunk of stream) {
|
for await (let chunk of stream) {
|
||||||
chunks.push(Buffer.from(chunk));
|
chunks.push(Buffer.from(chunk));
|
||||||
|
@ -106,4 +25,4 @@ const transformObjectToString = () => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export { ReadTarball, UploadTarball, readableToString, transformObjectToString };
|
export { readableToString, transformObjectToString };
|
||||||
|
|
|
@ -1,34 +1,8 @@
|
||||||
import { Stream } from 'stream';
|
import { Stream } from 'stream';
|
||||||
|
|
||||||
import { ReadTarball, UploadTarball, readableToString } from '../src/stream-utils';
|
import { readableToString } from '../src/stream-utils';
|
||||||
|
|
||||||
describe('mystreams', () => {
|
describe('mystreams', () => {
|
||||||
test('should delay events on ReadTarball abort', (cb) => {
|
|
||||||
const readTballStream = new ReadTarball({});
|
|
||||||
readTballStream.abort();
|
|
||||||
setTimeout(function () {
|
|
||||||
readTballStream.abort = function (): void {
|
|
||||||
cb();
|
|
||||||
};
|
|
||||||
readTballStream.abort = function (): never {
|
|
||||||
throw Error('fail');
|
|
||||||
};
|
|
||||||
}, 10);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should delay events on UploadTarball abort', (cb) => {
|
|
||||||
const uploadTballStream = new UploadTarball({});
|
|
||||||
uploadTballStream.abort();
|
|
||||||
setTimeout(function () {
|
|
||||||
uploadTballStream.abort = function (): void {
|
|
||||||
cb();
|
|
||||||
};
|
|
||||||
uploadTballStream.abort = function (): never {
|
|
||||||
throw Error('fail');
|
|
||||||
};
|
|
||||||
}, 10);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('readableToString single string', async () => {
|
test('readableToString single string', async () => {
|
||||||
expect(await readableToString(Stream.Readable.from('foo'))).toEqual('foo');
|
expect(await readableToString(Stream.Readable.from('foo'))).toEqual('foo');
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,26 +1,3 @@
|
||||||
# @verdaccio/types
|
# @verdaccio/types
|
||||||
|
|
||||||
TypeScript definitions for Verdaccio plugins and internal code.
|
TypeScript definitions for Verdaccio plugins and internal code.
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import type {ILocalData, LocalStorage, Logger, Config} from '@verdaccio/types';
|
|
||||||
|
|
||||||
class LocalData implements ILocalData {
|
|
||||||
path: string;
|
|
||||||
logger: Logger;
|
|
||||||
data: LocalStorage;
|
|
||||||
config: Config;
|
|
||||||
locked: boolean;
|
|
||||||
...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run docs
|
|
||||||
|
|
||||||
Generate the package types documentation at `./docs` folder.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm build:docs
|
|
||||||
```
|
|
||||||
|
|
|
@ -36,14 +36,13 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean": "rimraf ./build",
|
"clean": "rimraf ./build",
|
||||||
"test": "pnpm type-check",
|
"test": "pnpm type-check",
|
||||||
"build:docs": "typedoc --options ./typedoc.json --excludeExternals --tsconfig tsconfig.build.json",
|
"build:docs": "typedoc --options ./typedoc.json --tsconfig tsconfig.build.json",
|
||||||
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
||||||
"build": "tsc --emitDeclarationOnly -p tsconfig.build.json"
|
"build": "tsc --emitDeclarationOnly -p tsconfig.build.json"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "16.11.62",
|
"@types/node": "16.11.62",
|
||||||
"typedoc": "beta",
|
"typedoc": "0.23.15"
|
||||||
"typedoc-plugin-missing-exports": "1.0.0"
|
|
||||||
},
|
},
|
||||||
"typedoc": {
|
"typedoc": {
|
||||||
"entryPoint": "./src/types.ts",
|
"entryPoint": "./src/types.ts",
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
import { Callback, HttpError, RemoteUser } from '../commons';
|
|
||||||
import { Config } from '../configuration';
|
|
||||||
|
|
||||||
export interface AuthPluginPackage {
|
|
||||||
packageName: string;
|
|
||||||
packageVersion?: string;
|
|
||||||
tag?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type AuthError = HttpError & { code: number };
|
|
||||||
export type AuthAccessCallback = (error: AuthError | null, access: boolean) => void;
|
|
||||||
export type AuthCallback = (error: AuthError | null, groups: string[] | false) => void;
|
|
||||||
|
|
||||||
// @deprecated use IBasicAuth from @verdaccio/auth
|
|
||||||
export interface IBasicAuth<T> {
|
|
||||||
config: T & Config;
|
|
||||||
aesEncrypt(buf: Buffer): Buffer;
|
|
||||||
authenticate(user: string, password: string, cb: Callback): void;
|
|
||||||
changePassword(user: string, password: string, newPassword: string, cb: Callback): void;
|
|
||||||
allow_access(pkg: AuthPluginPackage, user: RemoteUser, callback: Callback): void;
|
|
||||||
add_user(user: string, password: string, cb: Callback): any;
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { Config, Logger } from '../configuration';
|
|
||||||
|
|
||||||
export class Plugin<T> {
|
|
||||||
public constructor(config: T, options: PluginOptions) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPlugin<T> {
|
|
||||||
// TODO: not used on core yet
|
|
||||||
version?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PluginOptions {
|
|
||||||
config: Config;
|
|
||||||
logger: Logger;
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
import { Manifest } from '../manifest';
|
|
||||||
import { IPlugin } from './commons';
|
|
||||||
|
|
||||||
export interface IPluginStorageFilter<T> extends IPlugin<T> {
|
|
||||||
filterMetadata(packageInfo: Manifest): Promise<Manifest>;
|
|
||||||
}
|
|
|
@ -1,31 +1 @@
|
||||||
import { RemoteUser } from '../commons';
|
|
||||||
import { AllowAccess } from '../configuration';
|
|
||||||
import { PackageAccess } from '../manifest';
|
|
||||||
import { AuthAccessCallback, AuthCallback } from './auth';
|
|
||||||
import { IPlugin } from './commons';
|
|
||||||
|
|
||||||
export interface IPluginAuth<T> extends IPlugin<T> {
|
|
||||||
/**
|
|
||||||
* @param props user from Application component
|
|
||||||
*/
|
|
||||||
authenticate(user: string, password: string, cb: AuthCallback): void;
|
|
||||||
adduser?(user: string, password: string, cb: AuthCallback): void;
|
|
||||||
changePassword?(user: string, password: string, newPassword: string, cb: AuthCallback): void;
|
|
||||||
allow_publish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
|
||||||
allow_access?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
|
||||||
allow_unpublish?(user: RemoteUser, pkg: T & PackageAccess, cb: AuthAccessCallback): void;
|
|
||||||
allow_publish?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
|
|
||||||
allow_access?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
|
|
||||||
allow_unpublish?(
|
|
||||||
user: RemoteUser,
|
|
||||||
pkg: AllowAccess & PackageAccess,
|
|
||||||
cb: AuthAccessCallback
|
|
||||||
): void;
|
|
||||||
apiJWTmiddleware?(helpers: any): Function;
|
|
||||||
}
|
|
||||||
|
|
||||||
export * from './auth';
|
|
||||||
export * from './storage';
|
export * from './storage';
|
||||||
export * from './middleware';
|
|
||||||
export * from './commons';
|
|
||||||
export * from './filter';
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
import { Config } from '../configuration';
|
|
||||||
import { IBasicAuth } from './auth';
|
|
||||||
import { IPlugin } from './commons';
|
|
||||||
|
|
||||||
// TODO: convert to generic storage should come from implementation
|
|
||||||
export interface IPluginMiddleware<T, K> extends IPlugin<T> {
|
|
||||||
register_middlewares(app: any, auth: IBasicAuth<T>, storage: K): void;
|
|
||||||
}
|
|
|
@ -1,17 +1,8 @@
|
||||||
import { PassThrough, PipelinePromise, Readable, Stream, Writable } from 'stream';
|
import { Callback, CallbackAction } from '../commons';
|
||||||
|
import { Manifest, Token } from '../manifest';
|
||||||
import { Callback, CallbackAction, StringValue } from '../commons';
|
|
||||||
import { Config, Logger } from '../configuration';
|
|
||||||
import { Manifest, MergeTags, Token, Version } from '../manifest';
|
|
||||||
import { IPlugin } from './commons';
|
|
||||||
|
|
||||||
export type StorageList = string[];
|
export type StorageList = string[];
|
||||||
|
|
||||||
export interface LocalStorage {
|
|
||||||
list: any;
|
|
||||||
secret: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ILocalStorage {
|
export interface ILocalStorage {
|
||||||
add(name: string): void;
|
add(name: string): void;
|
||||||
remove(name: string): void;
|
remove(name: string): void;
|
||||||
|
@ -53,43 +44,3 @@ export type StorageUpdateCallback = (data: Manifest, cb: CallbackAction) => void
|
||||||
export type StorageWriteCallback = (name: string, json: Manifest, callback: Callback) => void;
|
export type StorageWriteCallback = (name: string, json: Manifest, callback: Callback) => void;
|
||||||
export type PackageTransformer = (pkg: Manifest) => Manifest;
|
export type PackageTransformer = (pkg: Manifest) => Manifest;
|
||||||
export type ReadPackageCallback = (err: any | null, data?: Manifest) => void;
|
export type ReadPackageCallback = (err: any | null, data?: Manifest) => void;
|
||||||
|
|
||||||
export interface ILocalPackageManager {
|
|
||||||
logger: Logger;
|
|
||||||
deletePackage(fileName: string): Promise<void>;
|
|
||||||
removePackage(): Promise<void>;
|
|
||||||
// next packages migration (this list is meant to replace the callback parent functions)
|
|
||||||
updatePackage(
|
|
||||||
packageName: string,
|
|
||||||
handleUpdate: (manifest: Manifest) => Promise<Manifest>
|
|
||||||
): Promise<Manifest>;
|
|
||||||
readPackage(name: string): Promise<Manifest>;
|
|
||||||
savePackage(pkgName: string, value: Manifest): Promise<void>;
|
|
||||||
readTarball(pkgName: string, { signal }): Promise<Readable>;
|
|
||||||
createPackage(name: string, manifest: Manifest): Promise<void>;
|
|
||||||
writeTarball(tarballName: string, { signal }): Promise<Writable>;
|
|
||||||
// verify if tarball exist in the storage
|
|
||||||
hasTarball(fileName: string): Promise<boolean>;
|
|
||||||
// verify if package exist in the storage
|
|
||||||
hasPackage(): Promise<boolean>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type IPackageStorage = ILocalPackageManager | void;
|
|
||||||
|
|
||||||
export type IPluginStorage<T> = ILocalData<T>;
|
|
||||||
export type IPackageStorageManager = ILocalPackageManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated use @verdaccio/core pluginUtils instead
|
|
||||||
*/
|
|
||||||
interface ILocalData<T> extends IPlugin<T>, ITokenActions {
|
|
||||||
logger: Logger;
|
|
||||||
config: T;
|
|
||||||
add(name: string): Promise<void>;
|
|
||||||
remove(name: string): Promise<void>;
|
|
||||||
get(): Promise<any>;
|
|
||||||
init(): Promise<void>;
|
|
||||||
getSecret(): Promise<string>;
|
|
||||||
setSecret(secret: string): Promise<any>;
|
|
||||||
getPackageStorage(packageInfo: string): IPackageStorage;
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,8 +2,9 @@ import buildDebug from 'debug';
|
||||||
import { lstat } from 'fs/promises';
|
import { lstat } from 'fs/promises';
|
||||||
import { dirname, isAbsolute, join, resolve } from 'path';
|
import { dirname, isAbsolute, join, resolve } from 'path';
|
||||||
|
|
||||||
|
import { pluginUtils } from '@verdaccio/core';
|
||||||
import { logger } from '@verdaccio/logger';
|
import { logger } from '@verdaccio/logger';
|
||||||
import { Config, IPlugin, Logger } from '@verdaccio/types';
|
import { Config, Logger } from '@verdaccio/types';
|
||||||
|
|
||||||
import { isES6, isValid, tryLoad } from './utils';
|
import { isES6, isValid, tryLoad } from './utils';
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ export type Params = { config: Config; logger: Logger };
|
||||||
* @param {*} prefix by default is verdaccio but can be override with config.server.pluginPrefix
|
* @param {*} prefix by default is verdaccio but can be override with config.server.pluginPrefix
|
||||||
* @return {Array} list of plugins
|
* @return {Array} list of plugins
|
||||||
*/
|
*/
|
||||||
export async function asyncLoadPlugin<T extends IPlugin<T>>(
|
export async function asyncLoadPlugin<T extends pluginUtils.Plugin<T>>(
|
||||||
pluginConfigs: any = {},
|
pluginConfigs: any = {},
|
||||||
params: Params,
|
params: Params,
|
||||||
sanityCheck: any,
|
sanityCheck: any,
|
||||||
|
|
|
@ -15,9 +15,6 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../logger"
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "../mock"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,72 +1,5 @@
|
||||||
# @verdaccio/node-api
|
# @verdaccio/node-api
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)
|
|
||||||
[![stackshare](https://img.shields.io/badge/Follow%20on-StackShare-blue.svg?logo=stackshare&style=flat)](https://stackshare.io/verdaccio)
|
|
||||||
[![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
|
||||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/verdaccio/localized.svg)](https://crowdin.com/project/verdaccio)
|
|
||||||
[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/verdaccio/verdaccio)](https://www.tickgit.com/browse?repo=github.com/verdaccio/verdaccio)
|
|
||||||
|
|
||||||
[![Twitter followers](https://img.shields.io/twitter/follow/verdaccio_npm.svg?style=social&label=Follow)](https://twitter.com/verdaccio_npm)
|
|
||||||
[![Github](https://img.shields.io/github/stars/verdaccio/verdaccio.svg?style=social&label=Stars)](https://github.com/verdaccio/verdaccio/stargazers)
|
|
||||||
|
|
||||||
## Donations
|
|
||||||
|
|
||||||
Verdaccio is run by **volunteers**; nobody is working full-time on it. If you find this project to be useful and would like to support its development, consider making a donation - **your logo might end up in this readme.** 😉
|
|
||||||
|
|
||||||
**[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\$1/month_ or just one single contribution.
|
|
||||||
|
|
||||||
## Report a vulnerability
|
|
||||||
|
|
||||||
If you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).
|
|
||||||
|
|
||||||
## Open Collective Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio#sponsor)]
|
|
||||||
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.svg)](https://opencollective.com/verdaccio/sponsor/0/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.svg)](https://opencollective.com/verdaccio/sponsor/1/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.svg)](https://opencollective.com/verdaccio/sponsor/2/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.svg)](https://opencollective.com/verdaccio/sponsor/3/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.svg)](https://opencollective.com/verdaccio/sponsor/4/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.svg)](https://opencollective.com/verdaccio/sponsor/5/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.svg)](https://opencollective.com/verdaccio/sponsor/6/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.svg)](https://opencollective.com/verdaccio/sponsor/7/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.svg)](https://opencollective.com/verdaccio/sponsor/8/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.svg)](https://opencollective.com/verdaccio/sponsor/9/website)
|
|
||||||
|
|
||||||
## Open Collective Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio#backer)]
|
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/backers.svg?width=890)](https://opencollective.com/verdaccio#backers)
|
|
||||||
|
|
||||||
## Special Thanks
|
|
||||||
|
|
||||||
Thanks to the following companies to help us to achieve our goals providing free open source licenses.
|
|
||||||
|
|
||||||
[![jetbrain](assets/thanks/jetbrains/logo.png)](https://www.jetbrains.com/)
|
|
||||||
[![crowdin](assets/thanks/crowdin/logo.png)](https://crowdin.com/)
|
|
||||||
[![balsamiq](assets/thanks/balsamiq/logo.jpg)](https://balsamiq.com/)
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
|
||||||
|
|
||||||
[![contributors](https://opencollective.com/verdaccio/contributors.svg?width=890&button=true)](../../graphs/contributors)
|
|
||||||
|
|
||||||
### FAQ / Contact / Troubleshoot
|
|
||||||
|
|
||||||
If you have any issue you can try the following options, do no desist to ask or check our issues database, perhaps someone has asked already what you are looking for.
|
|
||||||
|
|
||||||
- [Blog](https://verdaccio.org/blog/)
|
|
||||||
- [Donations](https://opencollective.com/verdaccio)
|
|
||||||
- [Reporting an issue](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md#reporting-a-bug)
|
|
||||||
- [Running discussions](https://github.com/verdaccio/verdaccio/issues?q=is%3Aissue+is%3Aopen+label%3Adiscuss)
|
|
||||||
- [Chat](http://chat.verdaccio.org/)
|
|
||||||
- [Logos](https://verdaccio.org/docs/en/logo)
|
|
||||||
- [Docker Examples](https://github.com/verdaccio/docker-examples)
|
|
||||||
- [FAQ](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20)
|
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
||||||
|
|
|
@ -173,12 +173,14 @@ export async function initServer(
|
||||||
/**
|
/**
|
||||||
* Exposes a server factory to be instantiated programmatically.
|
* Exposes a server factory to be instantiated programmatically.
|
||||||
*
|
*
|
||||||
|
```ts
|
||||||
const app = await runServer(); // default configuration
|
const app = await runServer(); // default configuration
|
||||||
const app = await runServer('./config/config.yaml');
|
const app = await runServer('./config/config.yaml');
|
||||||
const app = await runServer({ configuration });
|
const app = await runServer({ configuration });
|
||||||
app.listen(4000, (event) => {
|
app.listen(4000, (event) => {
|
||||||
// do something
|
// do something
|
||||||
});
|
});
|
||||||
|
```
|
||||||
* @param config
|
* @param config
|
||||||
*/
|
*/
|
||||||
export async function runServer(config?: string | ConfigYaml): Promise<any> {
|
export async function runServer(config?: string | ConfigYaml): Promise<any> {
|
||||||
|
|
|
@ -15,7 +15,7 @@ describe('startServer via API', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should fail on start with null as entry', async () => {
|
test('should fail on start with null as entry', async () => {
|
||||||
// @ts-expected-error
|
// @ts-expect-error
|
||||||
await expect(runServer(null)).rejects.toThrow();
|
await expect(runServer(null)).rejects.toThrow();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,6 +4,5 @@
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts", "types/*.d.ts"]
|
||||||
"exclude": ["src/**/*.test.ts"]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,21 +4,15 @@
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*.ts", "types/*.d.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "../config"
|
"path": "../config"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../core/cli-ui"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../logger"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../mock"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../server/express"
|
"path": "../server/express"
|
||||||
},
|
},
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
"npm": ">=6"
|
"npm": ">=6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@verdaccio/core": "workspace:6.0.0-6-next.48",
|
||||||
|
"@verdaccio/config": "workspace:6.0.0-6-next.48",
|
||||||
|
"@verdaccio/logger": "workspace:6.0.0-6-next.16",
|
||||||
"express": "4.18.1",
|
"express": "4.18.1",
|
||||||
"body-parser": "1.20.0",
|
"body-parser": "1.20.0",
|
||||||
"https-proxy-agent": "5.0.1",
|
"https-proxy-agent": "5.0.1",
|
||||||
|
@ -38,8 +41,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@verdaccio/types": "workspace:11.0.0-6-next.17",
|
"@verdaccio/types": "workspace:11.0.0-6-next.17",
|
||||||
"@verdaccio/config": "workspace:6.0.0-6-next.48",
|
"@verdaccio/auth": "workspace:6.0.0-6-next.27",
|
||||||
"@verdaccio/logger": "workspace:6.0.0-6-next.16",
|
|
||||||
"nock": "13.2.9",
|
"nock": "13.2.9",
|
||||||
"supertest": "6.2.4"
|
"supertest": "6.2.4"
|
||||||
},
|
},
|
||||||
|
|
|
@ -4,25 +4,31 @@ import https from 'https';
|
||||||
import createHttpsProxyAgent from 'https-proxy-agent';
|
import createHttpsProxyAgent from 'https-proxy-agent';
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
|
|
||||||
import { IBasicAuth, IPluginMiddleware, Logger, PluginOptions } from '@verdaccio/types';
|
import type { Auth } from '@verdaccio/auth';
|
||||||
|
import { pluginUtils } from '@verdaccio/core';
|
||||||
|
import { Logger } from '@verdaccio/types';
|
||||||
|
|
||||||
import { ConfigAudit } from './types';
|
import { ConfigAudit } from './types';
|
||||||
|
|
||||||
// FUTURE: we should be able to overwrite this
|
// FUTURE: we should be able to overwrite this
|
||||||
export const REGISTRY_DOMAIN = 'https://registry.npmjs.org';
|
export const REGISTRY_DOMAIN = 'https://registry.npmjs.org';
|
||||||
|
|
||||||
export default class ProxyAudit implements IPluginMiddleware<{}, {}> {
|
export default class ProxyAudit
|
||||||
|
extends pluginUtils.Plugin<ConfigAudit>
|
||||||
|
implements pluginUtils.IPluginMiddleware<ConfigAudit, {}, Auth>
|
||||||
|
{
|
||||||
public enabled: boolean;
|
public enabled: boolean;
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
public strict_ssl: boolean;
|
public strict_ssl: boolean;
|
||||||
|
|
||||||
public constructor(config: ConfigAudit, options: PluginOptions) {
|
public constructor(config: ConfigAudit, options: pluginUtils.PluginOptions) {
|
||||||
|
super(config, options);
|
||||||
this.enabled = config.enabled || false;
|
this.enabled = config.enabled || false;
|
||||||
this.strict_ssl = config.strict_ssl !== undefined ? config.strict_ssl : true;
|
this.strict_ssl = config.strict_ssl !== undefined ? config.strict_ssl : true;
|
||||||
this.logger = options.logger;
|
this.logger = options.logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public register_middlewares(app: any, auth: IBasicAuth<ConfigAudit>): void {
|
public register_middlewares(app: any, auth: Auth): void {
|
||||||
const fetchAudit = async (
|
const fetchAudit = async (
|
||||||
req: Request,
|
req: Request,
|
||||||
res: Response & { report_error?: Function }
|
res: Response & { report_error?: Function }
|
||||||
|
|
|
@ -8,10 +8,16 @@
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "../config"
|
"path": "../../config"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../../auth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "../../logger"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "../../core/core"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,23 @@
|
||||||
import buildDebug from 'debug';
|
import buildDebug from 'debug';
|
||||||
|
|
||||||
import { API_ERROR, errorUtils } from '@verdaccio/core';
|
import { API_ERROR, errorUtils, pluginUtils } from '@verdaccio/core';
|
||||||
import {
|
import { Callback, Config, Logger, PackageAccess, RemoteUser } from '@verdaccio/types';
|
||||||
Callback,
|
|
||||||
Config,
|
|
||||||
IPluginAuth,
|
|
||||||
Logger,
|
|
||||||
PackageAccess,
|
|
||||||
PluginOptions,
|
|
||||||
RemoteUser,
|
|
||||||
} from '@verdaccio/types';
|
|
||||||
|
|
||||||
import { UserMemory, Users, VerdaccioMemoryConfig } from './types';
|
import { UserMemory, Users, VerdaccioMemoryConfig } from './types';
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:plugin:auth:memory:user');
|
const debug = buildDebug('verdaccio:plugin:auth:memory:user');
|
||||||
|
|
||||||
export default class Memory implements IPluginAuth<VerdaccioMemoryConfig> {
|
export default class Memory
|
||||||
|
extends pluginUtils.Plugin<VerdaccioMemoryConfig>
|
||||||
|
implements pluginUtils.IPluginAuth<VerdaccioMemoryConfig>
|
||||||
|
{
|
||||||
public _logger: Logger;
|
public _logger: Logger;
|
||||||
public _users: Users;
|
public _users: Users;
|
||||||
public _config: {};
|
public _config: {};
|
||||||
public _app_config: Config;
|
public _app_config: Config;
|
||||||
|
|
||||||
public constructor(config: VerdaccioMemoryConfig, appOptions: PluginOptions) {
|
public constructor(config: VerdaccioMemoryConfig, appOptions: pluginUtils.PluginOptions) {
|
||||||
|
super(config, appOptions);
|
||||||
this._users = config.users || {};
|
this._users = config.users || {};
|
||||||
this._config = config;
|
this._config = config;
|
||||||
this._logger = appOptions.logger;
|
this._logger = appOptions.logger;
|
||||||
|
|
|
@ -5,10 +5,5 @@
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*", "types/*.d.ts"],
|
"include": ["src/**/*", "types/*.d.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"]
|
||||||
"references": [
|
|
||||||
{
|
|
||||||
"path": "../../core/streams"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,5 @@
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*", "types/*.d.ts"],
|
"include": ["src/**/*", "types/*.d.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"]
|
||||||
"references": [
|
|
||||||
{
|
|
||||||
"path": "../../core/streams"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,9 @@ import buildDebug from 'debug';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { dirname, join, resolve } from 'path';
|
import { dirname, join, resolve } from 'path';
|
||||||
|
|
||||||
|
import { pluginUtils } from '@verdaccio/core';
|
||||||
import { unlockFile } from '@verdaccio/file-locking';
|
import { unlockFile } from '@verdaccio/file-locking';
|
||||||
import { Callback, IPluginAuth, Logger, PluginOptions } from '@verdaccio/types';
|
import { Callback, Logger } from '@verdaccio/types';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
HtpasswdHashAlgorithm,
|
HtpasswdHashAlgorithm,
|
||||||
|
@ -32,7 +33,10 @@ export const DEFAULT_SLOW_VERIFY_MS = 200;
|
||||||
/**
|
/**
|
||||||
* HTPasswd - Verdaccio auth class
|
* HTPasswd - Verdaccio auth class
|
||||||
*/
|
*/
|
||||||
export default class HTPasswd implements IPluginAuth<HTPasswdConfig> {
|
export default class HTPasswd
|
||||||
|
extends pluginUtils.Plugin<HTPasswdConfig>
|
||||||
|
implements pluginUtils.IPluginAuth<HTPasswdConfig>
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {*} config htpasswd file
|
* @param {*} config htpasswd file
|
||||||
|
@ -46,7 +50,8 @@ export default class HTPasswd implements IPluginAuth<HTPasswdConfig> {
|
||||||
private logger: Logger;
|
private logger: Logger;
|
||||||
private lastTime: any;
|
private lastTime: any;
|
||||||
// constructor
|
// constructor
|
||||||
public constructor(config: HTPasswdConfig, options: PluginOptions) {
|
public constructor(config: HTPasswdConfig, options: pluginUtils.PluginOptions) {
|
||||||
|
super(config, options);
|
||||||
this.users = {};
|
this.users = {};
|
||||||
|
|
||||||
// verdaccio logger
|
// verdaccio logger
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { PluginOptions } from '@verdaccio/types';
|
import type { pluginUtils } from '@verdaccio/core';
|
||||||
|
|
||||||
import HTPasswd, { HTPasswdConfig } from './htpasswd';
|
import HTPasswd, { HTPasswdConfig } from './htpasswd';
|
||||||
|
|
||||||
export default function (config: HTPasswdConfig, params: PluginOptions): HTPasswd {
|
export default function (config: HTPasswdConfig, params: pluginUtils.PluginOptions): HTPasswd {
|
||||||
return new HTPasswd(config, params);
|
return new HTPasswd(config, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,22 @@
|
||||||
// import LRU from 'lru-cache';
|
// import LRU from 'lru-cache';
|
||||||
import buildDebug from 'debug';
|
import buildDebug from 'debug';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
import low from 'lowdb';
|
||||||
|
import FileAsync from 'lowdb/adapters/FileAsync';
|
||||||
|
import FileMemory from 'lowdb/adapters/Memory';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
import { errorUtils, fileUtils, pluginUtils, searchUtils } from '@verdaccio/core';
|
import { errorUtils, fileUtils, pluginUtils, searchUtils } from '@verdaccio/core';
|
||||||
import { Config, IPackageStorage, LocalStorage, Logger } from '@verdaccio/types';
|
import { Config, Logger, Token, TokenFilter } from '@verdaccio/types';
|
||||||
import { getMatchedPackagesSpec } from '@verdaccio/utils';
|
import { getMatchedPackagesSpec } from '@verdaccio/utils';
|
||||||
|
|
||||||
import { searchOnStorage } from './dir-utils';
|
import { searchOnStorage } from './dir-utils';
|
||||||
import { mkdirPromise, writeFilePromise } from './fs';
|
import { mkdirPromise, writeFilePromise } from './fs';
|
||||||
import LocalDriver, { noSuchFile } from './local-fs';
|
import LocalDriver, { noSuchFile } from './local-fs';
|
||||||
import { loadPrivatePackages } from './pkg-utils';
|
import { LocalStorage, loadPrivatePackages } from './pkg-utils';
|
||||||
import TokenActions from './token';
|
|
||||||
import { _dbGenPath } from './utils';
|
import { _dbGenPath } from './utils';
|
||||||
|
|
||||||
|
const TOKEN_DB_NAME = '.token-db.json';
|
||||||
const DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;
|
const DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:plugin:local-storage');
|
const debug = buildDebug('verdaccio:plugin:local-storage');
|
||||||
|
@ -23,16 +26,19 @@ export const ERROR_DB_LOCKED =
|
||||||
|
|
||||||
type IPluginStorage = pluginUtils.IPluginStorage<{}>;
|
type IPluginStorage = pluginUtils.IPluginStorage<{}>;
|
||||||
|
|
||||||
class LocalDatabase extends TokenActions implements IPluginStorage {
|
class LocalDatabase extends pluginUtils.Plugin<{}> implements IPluginStorage {
|
||||||
private readonly path: string;
|
private readonly path: string;
|
||||||
private readonly logger: Logger;
|
private readonly logger: Logger;
|
||||||
public readonly config: Config;
|
public readonly config: Config;
|
||||||
public readonly storages: Map<string, string>;
|
public readonly storages: Map<string, string>;
|
||||||
public data: LocalStorage | undefined;
|
public data: LocalStorage | undefined;
|
||||||
public locked: boolean;
|
public locked: boolean;
|
||||||
|
public tokenDb: low.LowdbAsync<any> | null;
|
||||||
|
|
||||||
public constructor(config: Config, logger: Logger) {
|
public constructor(config: Config, logger: Logger) {
|
||||||
super(config);
|
// TODO: fix double config
|
||||||
|
super(config, { config, logger });
|
||||||
|
this.tokenDb = null;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.locked = false;
|
this.locked = false;
|
||||||
|
@ -183,7 +189,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage {
|
||||||
return Promise.resolve(list);
|
return Promise.resolve(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getPackageStorage(packageName: string): IPackageStorage {
|
public getPackageStorage(packageName: string): pluginUtils.IPackageStorage {
|
||||||
const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);
|
const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);
|
||||||
|
|
||||||
const packagePath: string = this._getLocalStoragePath(
|
const packagePath: string = this._getLocalStoragePath(
|
||||||
|
@ -192,7 +198,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage {
|
||||||
debug('storage path selected: ', packagePath);
|
debug('storage path selected: ', packagePath);
|
||||||
if (_.isString(packagePath) === false) {
|
if (_.isString(packagePath) === false) {
|
||||||
debug('the package %o has no storage defined ', packageName);
|
debug('the package %o has no storage defined ', packageName);
|
||||||
return;
|
throw errorUtils.getInternalError('storage not found or implemented');
|
||||||
}
|
}
|
||||||
|
|
||||||
const packageStoragePath: string = path.join(
|
const packageStoragePath: string = path.join(
|
||||||
|
@ -292,6 +298,65 @@ class LocalDatabase extends TokenActions implements IPluginStorage {
|
||||||
return { list: [], secret: '' };
|
return { list: [], secret: '' };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async getTokenDb(): Promise<low.LowdbAsync<any>> {
|
||||||
|
if (!this.tokenDb) {
|
||||||
|
debug('token database is not defined');
|
||||||
|
let adapter;
|
||||||
|
if (process.env.NODE_ENV === 'test') {
|
||||||
|
debug('token memory adapter');
|
||||||
|
adapter = new FileMemory('');
|
||||||
|
} else {
|
||||||
|
debug('token async adapter');
|
||||||
|
const pathDb = _dbGenPath(TOKEN_DB_NAME, this.config);
|
||||||
|
adapter = new FileAsync(pathDb);
|
||||||
|
}
|
||||||
|
debug('token bd generated');
|
||||||
|
this.tokenDb = await low(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.tokenDb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async saveToken(token: Token): Promise<void> {
|
||||||
|
debug('token key %o', token.key);
|
||||||
|
const db = await this.getTokenDb();
|
||||||
|
const userData = await db.get(token.user).value();
|
||||||
|
debug('user data %o', userData);
|
||||||
|
if (_.isNil(userData)) {
|
||||||
|
await db.set(token.user, [token]).write();
|
||||||
|
debug('token user %o new database', token.user);
|
||||||
|
} else {
|
||||||
|
// types does not match with valid implementation
|
||||||
|
// @ts-ignore
|
||||||
|
await db.get(token.user).push(token).write();
|
||||||
|
}
|
||||||
|
debug('data %o', await db.getState());
|
||||||
|
debug('token saved %o', token.user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async deleteToken(user: string, tokenKey: string): Promise<void> {
|
||||||
|
const db = await this.getTokenDb();
|
||||||
|
const userTokens = await db.get(user).value();
|
||||||
|
if (_.isNil(userTokens)) {
|
||||||
|
throw new Error('user not found');
|
||||||
|
}
|
||||||
|
debug('tokens %o - %o', userTokens, userTokens.length);
|
||||||
|
const remainingTokens = userTokens.filter(({ key }) => {
|
||||||
|
debug('key %o', key);
|
||||||
|
return key !== tokenKey;
|
||||||
|
});
|
||||||
|
await db.set(user, remainingTokens).write();
|
||||||
|
debug('removed tokens key %o', tokenKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async readTokens(filter: TokenFilter): Promise<Token[]> {
|
||||||
|
const { user } = filter;
|
||||||
|
debug('read tokens with %o', user);
|
||||||
|
const db = await this.getTokenDb();
|
||||||
|
const tokens = await db.get(user).value();
|
||||||
|
return tokens || [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default LocalDatabase;
|
export default LocalDatabase;
|
||||||
|
|
|
@ -5,9 +5,9 @@ import path from 'path';
|
||||||
import sanitzers from 'sanitize-filename';
|
import sanitzers from 'sanitize-filename';
|
||||||
import { Readable, Writable, addAbortSignal } from 'stream';
|
import { Readable, Writable, addAbortSignal } from 'stream';
|
||||||
|
|
||||||
import { VerdaccioError, errorUtils } from '@verdaccio/core';
|
import { VerdaccioError, errorUtils, pluginUtils } from '@verdaccio/core';
|
||||||
import { readFileNext, unlockFileNext } from '@verdaccio/file-locking';
|
import { readFileNext, unlockFileNext } from '@verdaccio/file-locking';
|
||||||
import { ILocalPackageManager, Logger, Manifest } from '@verdaccio/types';
|
import { Logger, Manifest } from '@verdaccio/types';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
accessPromise,
|
accessPromise,
|
||||||
|
@ -27,7 +27,7 @@ export const noSuchFile = 'ENOENT';
|
||||||
export const resourceNotAvailable = 'EAGAIN';
|
export const resourceNotAvailable = 'EAGAIN';
|
||||||
export const packageJSONFileName = 'package.json';
|
export const packageJSONFileName = 'package.json';
|
||||||
|
|
||||||
export type ILocalFSPackageManager = ILocalPackageManager & { path: string };
|
export type ILocalFSPackageManager = pluginUtils.IPackageStorage & { path: string };
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:plugin:local-storage:local-fs');
|
const debug = buildDebug('verdaccio:plugin:local-storage:local-fs');
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
||||||
import { LocalStorage, Logger, StorageList } from '@verdaccio/types';
|
import { Logger, StorageList } from '@verdaccio/types';
|
||||||
|
|
||||||
import { readFilePromise } from './fs';
|
import { readFilePromise } from './fs';
|
||||||
|
|
||||||
|
export type LocalStorage = {
|
||||||
|
list: any;
|
||||||
|
secret: string;
|
||||||
|
};
|
||||||
|
|
||||||
export async function loadPrivatePackages(path: string, logger: Logger): Promise<LocalStorage> {
|
export async function loadPrivatePackages(path: string, logger: Logger): Promise<LocalStorage> {
|
||||||
const list: StorageList = [];
|
const list: StorageList = [];
|
||||||
const emptyDatabase = { list, secret: '' };
|
const emptyDatabase = { list, secret: '' };
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
import buildDebug from 'debug';
|
|
||||||
import _ from 'lodash';
|
|
||||||
import low from 'lowdb';
|
|
||||||
import FileAsync from 'lowdb/adapters/FileAsync';
|
|
||||||
import FileMemory from 'lowdb/adapters/Memory';
|
|
||||||
|
|
||||||
import { Config, ITokenActions, Token, TokenFilter } from '@verdaccio/types';
|
|
||||||
|
|
||||||
import { _dbGenPath } from './utils';
|
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:plugin:local-storage:token');
|
|
||||||
|
|
||||||
const TOKEN_DB_NAME = '.token-db.json';
|
|
||||||
|
|
||||||
export default class TokenActions implements ITokenActions {
|
|
||||||
public config: Config;
|
|
||||||
public tokenDb: low.LowdbAsync<any> | null;
|
|
||||||
|
|
||||||
public constructor(config: Config) {
|
|
||||||
this.config = config;
|
|
||||||
this.tokenDb = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async getTokenDb(): Promise<low.LowdbAsync<any>> {
|
|
||||||
if (!this.tokenDb) {
|
|
||||||
debug('token database is not defined');
|
|
||||||
let adapter;
|
|
||||||
if (process.env.NODE_ENV === 'test') {
|
|
||||||
debug('token memory adapter');
|
|
||||||
adapter = new FileMemory('');
|
|
||||||
} else {
|
|
||||||
debug('token async adapter');
|
|
||||||
const pathDb = _dbGenPath(TOKEN_DB_NAME, this.config);
|
|
||||||
adapter = new FileAsync(pathDb);
|
|
||||||
}
|
|
||||||
debug('token bd generated');
|
|
||||||
this.tokenDb = await low(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.tokenDb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async saveToken(token: Token): Promise<void> {
|
|
||||||
debug('token key %o', token.key);
|
|
||||||
const db = await this.getTokenDb();
|
|
||||||
const userData = await db.get(token.user).value();
|
|
||||||
debug('user data %o', userData);
|
|
||||||
if (_.isNil(userData)) {
|
|
||||||
await db.set(token.user, [token]).write();
|
|
||||||
debug('token user %o new database', token.user);
|
|
||||||
} else {
|
|
||||||
// types does not match with valid implementation
|
|
||||||
// @ts-ignore
|
|
||||||
await db.get(token.user).push(token).write();
|
|
||||||
}
|
|
||||||
debug('data %o', await db.getState());
|
|
||||||
debug('token saved %o', token.user);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async deleteToken(user: string, tokenKey: string): Promise<void> {
|
|
||||||
const db = await this.getTokenDb();
|
|
||||||
const userTokens = await db.get(user).value();
|
|
||||||
if (_.isNil(userTokens)) {
|
|
||||||
throw new Error('user not found');
|
|
||||||
}
|
|
||||||
debug('tokens %o - %o', userTokens, userTokens.length);
|
|
||||||
const remainingTokens = userTokens.filter(({ key }) => {
|
|
||||||
debug('key %o', key);
|
|
||||||
return key !== tokenKey;
|
|
||||||
});
|
|
||||||
await db.set(user, remainingTokens).write();
|
|
||||||
debug('removed tokens key %o', tokenKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async readTokens(filter: TokenFilter): Promise<Token[]> {
|
|
||||||
const { user } = filter;
|
|
||||||
debug('read tokens with %o', user);
|
|
||||||
const db = await this.getTokenDb();
|
|
||||||
const tokens = await db.get(user).value();
|
|
||||||
return tokens || [];
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,23 +4,19 @@
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "../file-locking"
|
"path": "../../core/file-locking"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../streams"
|
"path": "../../config"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../config"
|
"path": "../../logger"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../../core/core"
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "../core"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import buildDebug from 'debug';
|
import buildDebug from 'debug';
|
||||||
|
|
||||||
import { errorUtils } from '@verdaccio/core';
|
import { errorUtils, pluginUtils, searchUtils } from '@verdaccio/core';
|
||||||
import { Callback, IPluginStorage, Logger, PluginOptions, Token } from '@verdaccio/types';
|
import { Logger, Token } from '@verdaccio/types';
|
||||||
|
|
||||||
import MemoryHandler, { DataHandler } from './memory-handler';
|
import MemoryHandler, { DataHandler } from './memory-handler';
|
||||||
|
|
||||||
|
@ -15,14 +15,19 @@ export interface MemoryLocalStorage {
|
||||||
const debug = buildDebug('verdaccio:plugin:storage:local-memory');
|
const debug = buildDebug('verdaccio:plugin:storage:local-memory');
|
||||||
|
|
||||||
const DEFAULT_LIMIT = 1000;
|
const DEFAULT_LIMIT = 1000;
|
||||||
class LocalMemory implements IPluginStorage<ConfigMemory> {
|
class LocalMemory
|
||||||
|
extends pluginUtils.Plugin<ConfigMemory>
|
||||||
|
implements pluginUtils.IPluginStorage<ConfigMemory>
|
||||||
|
{
|
||||||
private path: string;
|
private path: string;
|
||||||
private limit: number;
|
private limit: number;
|
||||||
public logger: Logger;
|
public logger: Logger;
|
||||||
private data: MemoryLocalStorage;
|
private data: MemoryLocalStorage;
|
||||||
|
// @ts-ignore
|
||||||
public config: ConfigMemory;
|
public config: ConfigMemory;
|
||||||
|
|
||||||
public constructor(config: ConfigMemory, options: PluginOptions) {
|
public constructor(config: ConfigMemory, options: pluginUtils.PluginOptions) {
|
||||||
|
super(config, options);
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.limit = config.limit || DEFAULT_LIMIT;
|
this.limit = config.limit || DEFAULT_LIMIT;
|
||||||
this.logger = options.logger;
|
this.logger = options.logger;
|
||||||
|
@ -66,9 +71,9 @@ class LocalMemory implements IPluginStorage<ConfigMemory> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
public search(onPackage: Callback, onEnd: Callback): void {
|
public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {
|
||||||
this.logger.warn('[verdaccio/memory]: search method not implemented, PR is welcome');
|
this.logger.warn('[verdaccio/memory]: search method not implemented, PR is welcome');
|
||||||
onEnd();
|
return Promise.reject('not implemented');
|
||||||
}
|
}
|
||||||
|
|
||||||
async remove(name: string): Promise<void> {
|
async remove(name: string): Promise<void> {
|
||||||
|
|
|
@ -6,8 +6,8 @@ import path from 'path';
|
||||||
import { PassThrough, Writable, addAbortSignal } from 'stream';
|
import { PassThrough, Writable, addAbortSignal } from 'stream';
|
||||||
import { pipeline } from 'stream/promises';
|
import { pipeline } from 'stream/promises';
|
||||||
|
|
||||||
import { errorUtils } from '@verdaccio/core';
|
import { errorUtils, pluginUtils } from '@verdaccio/core';
|
||||||
import { IPackageStorageManager, Logger, Manifest } from '@verdaccio/types';
|
import { Logger, Manifest } from '@verdaccio/types';
|
||||||
|
|
||||||
import { parsePackage, stringifyPackage } from './utils';
|
import { parsePackage, stringifyPackage } from './utils';
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ export type DataHandler = {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MemoryHandler implements IPackageStorageManager {
|
class MemoryHandler implements pluginUtils.IPackageStorage {
|
||||||
private data: DataHandler;
|
private data: DataHandler;
|
||||||
private name: string;
|
private name: string;
|
||||||
private path: string;
|
private path: string;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "../../core/streams"
|
"path": "../../core/core"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "16.11.62",
|
"@types/node": "16.11.62",
|
||||||
|
"p-cancelable": "2.1.1",
|
||||||
"@verdaccio/types": "workspace:11.0.0-6-next.17",
|
"@verdaccio/types": "workspace:11.0.0-6-next.17",
|
||||||
"get-stream": "^6.0.1",
|
"get-stream": "^6.0.1",
|
||||||
"nock": "13.2.9",
|
"nock": "13.2.9",
|
||||||
|
|
|
@ -2,17 +2,14 @@
|
||||||
"extends": "../../tsconfig.reference.json",
|
"extends": "../../tsconfig.reference.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"outDir": "./build"
|
"outDir": "./build",
|
||||||
|
"noImplicitAny": false
|
||||||
},
|
},
|
||||||
"include": ["src/**/*", "types/*.d.ts"],
|
"include": ["src/**/*.ts", "types/*.d.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "../config"
|
"path": "../config"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../core/streams"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../core/core"
|
"path": "../core/core"
|
||||||
},
|
},
|
||||||
|
|
10
packages/proxy/types/patch.d.ts
vendored
Normal file
10
packages/proxy/types/patch.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
declare module 'jest-matcher-utils';
|
||||||
|
declare module 'pretty-format' {
|
||||||
|
export type Plugin = any;
|
||||||
|
export type CompareKeys = any;
|
||||||
|
}
|
||||||
|
declare module '@jest/schemas' {
|
||||||
|
export type SnapshotFormat = any;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '@szmarczak/http-timer';
|
|
@ -8,25 +8,21 @@ import _ from 'lodash';
|
||||||
import AuditMiddleware from 'verdaccio-audit';
|
import AuditMiddleware from 'verdaccio-audit';
|
||||||
|
|
||||||
import apiEndpoint from '@verdaccio/api';
|
import apiEndpoint from '@verdaccio/api';
|
||||||
import { Auth, IBasicAuth } from '@verdaccio/auth';
|
import { Auth } from '@verdaccio/auth';
|
||||||
import { Config as AppConfig } from '@verdaccio/config';
|
import { Config as AppConfig } from '@verdaccio/config';
|
||||||
import { API_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';
|
import { API_ERROR, HTTP_STATUS, errorUtils, pluginUtils } from '@verdaccio/core';
|
||||||
import { asyncLoadPlugin } from '@verdaccio/loaders';
|
import { asyncLoadPlugin } from '@verdaccio/loaders';
|
||||||
import { logger } from '@verdaccio/logger';
|
import { logger } from '@verdaccio/logger';
|
||||||
import { errorReportingMiddleware, final, log } from '@verdaccio/middleware';
|
import { errorReportingMiddleware, final, log } from '@verdaccio/middleware';
|
||||||
import { Storage } from '@verdaccio/store';
|
import { Storage } from '@verdaccio/store';
|
||||||
import { ConfigYaml } from '@verdaccio/types';
|
import { ConfigYaml } from '@verdaccio/types';
|
||||||
import { Config as IConfig, IPlugin } from '@verdaccio/types';
|
import { Config as IConfig } from '@verdaccio/types';
|
||||||
import webMiddleware from '@verdaccio/web';
|
import webMiddleware from '@verdaccio/web';
|
||||||
|
|
||||||
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';
|
import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';
|
||||||
import hookDebug from './debug';
|
import hookDebug from './debug';
|
||||||
import { getUserAgent } from './utils';
|
import { getUserAgent } from './utils';
|
||||||
|
|
||||||
export interface IPluginMiddleware<T> extends IPlugin<T> {
|
|
||||||
register_middlewares(app: any, auth: IBasicAuth<T>, storage: Storage): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
const debug = buildDebug('verdaccio:server');
|
const debug = buildDebug('verdaccio:server');
|
||||||
|
|
||||||
const defineAPI = async function (config: IConfig, storage: Storage): Promise<any> {
|
const defineAPI = async function (config: IConfig, storage: Storage): Promise<any> {
|
||||||
|
@ -63,25 +59,24 @@ const defineAPI = async function (config: IConfig, storage: Storage): Promise<an
|
||||||
hookDebug(app, config.configPath);
|
hookDebug(app, config.configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
const plugins: IPluginMiddleware<IConfig>[] = await asyncLoadPlugin(
|
const plugins: pluginUtils.IPluginMiddleware<IConfig, {}, Auth>[] = await asyncLoadPlugin(
|
||||||
config.middlewares,
|
config.middlewares,
|
||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
logger,
|
logger,
|
||||||
},
|
},
|
||||||
function (plugin: IPluginMiddleware<IConfig>) {
|
function (plugin: pluginUtils.IPluginMiddleware<IConfig, {}, Auth>) {
|
||||||
return plugin.register_middlewares;
|
return plugin.register_middlewares;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (plugins.length === 0) {
|
if (plugins.length === 0) {
|
||||||
logger.info('none middleware plugins has been defined, adding audit middleware by default');
|
logger.info('none middleware plugins has been defined, adding audit middleware by default');
|
||||||
plugins.push(
|
// @ts-ignore
|
||||||
new AuditMiddleware({ ...config, enabled: true, strict_ssl: true }, { config, logger })
|
plugins.push(new AuditMiddleware({ enabled: true, strict_ssl: true }, { config, logger }));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.forEach((plugin: IPluginMiddleware<IConfig>) => {
|
plugins.forEach((plugin: pluginUtils.IPluginMiddleware<IConfig, {}, Auth>) => {
|
||||||
plugin.register_middlewares(app, auth, storage);
|
plugin.register_middlewares(app, auth, storage);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
{
|
{
|
||||||
"path": "../../config"
|
"path": "../../config"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../../core/commons-api"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../../loaders"
|
"path": "../../loaders"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import { FastifyInstance } from 'fastify';
|
import { FastifyInstance } from 'fastify';
|
||||||
import fp from 'fastify-plugin';
|
import fp from 'fastify-plugin';
|
||||||
|
|
||||||
import { Auth, IAuth } from '@verdaccio/auth';
|
import { Auth } from '@verdaccio/auth';
|
||||||
import { Config as IConfig } from '@verdaccio/types';
|
import { Config as IConfig } from '@verdaccio/types';
|
||||||
|
|
||||||
export default fp(
|
export default fp(
|
||||||
async function (fastify: FastifyInstance, opts: { config: IConfig; filters?: unknown }) {
|
async function (fastify: FastifyInstance, opts: { config: IConfig; filters?: unknown }) {
|
||||||
const { config } = opts;
|
const { config } = opts;
|
||||||
const auth: IAuth = new Auth(config);
|
const auth = new Auth(config);
|
||||||
await auth.init();
|
await auth.init();
|
||||||
fastify.decorate('auth', auth);
|
fastify.decorate('auth', auth);
|
||||||
},
|
},
|
||||||
|
@ -18,6 +18,6 @@ export default fp(
|
||||||
|
|
||||||
declare module 'fastify' {
|
declare module 'fastify' {
|
||||||
interface FastifyInstance {
|
interface FastifyInstance {
|
||||||
auth: IAuth;
|
auth: Auth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ class LocalStorage {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadStorePlugin(): Promise<IPluginStorage | undefined> {
|
private async loadStorePlugin(): Promise<IPluginStorage | undefined> {
|
||||||
const plugins: IPluginStorage[] = await asyncLoadPlugin<IPluginStorage>(
|
const plugins: IPluginStorage[] = await asyncLoadPlugin<pluginUtils.IPluginStorage<any>>(
|
||||||
this.config.store,
|
this.config.store,
|
||||||
{
|
{
|
||||||
config: this.config,
|
config: this.config,
|
||||||
|
|
|
@ -17,6 +17,7 @@ import {
|
||||||
USERS,
|
USERS,
|
||||||
errorUtils,
|
errorUtils,
|
||||||
pkgUtils,
|
pkgUtils,
|
||||||
|
pluginUtils,
|
||||||
searchUtils,
|
searchUtils,
|
||||||
validatioUtils,
|
validatioUtils,
|
||||||
} from '@verdaccio/core';
|
} from '@verdaccio/core';
|
||||||
|
@ -34,8 +35,6 @@ import {
|
||||||
Config,
|
Config,
|
||||||
DistFile,
|
DistFile,
|
||||||
GenericBody,
|
GenericBody,
|
||||||
IPackageStorage,
|
|
||||||
IPluginStorageFilter,
|
|
||||||
Logger,
|
Logger,
|
||||||
Manifest,
|
Manifest,
|
||||||
MergeTags,
|
MergeTags,
|
||||||
|
@ -174,7 +173,7 @@ class Storage {
|
||||||
public async removeTarball(name: string, filename: string, _revision: string): Promise<Manifest> {
|
public async removeTarball(name: string, filename: string, _revision: string): Promise<Manifest> {
|
||||||
debug('remove tarball %s for %s', filename, name);
|
debug('remove tarball %s for %s', filename, name);
|
||||||
assert(validatioUtils.validateName(filename));
|
assert(validatioUtils.validateName(filename));
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(name);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(name);
|
||||||
if (!storage) {
|
if (!storage) {
|
||||||
debug(`method not implemented for storage`);
|
debug(`method not implemented for storage`);
|
||||||
this.logger.error('method for remove tarball not implemented');
|
this.logger.error('method for remove tarball not implemented');
|
||||||
|
@ -200,7 +199,7 @@ class Storage {
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(name);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(name);
|
||||||
if (!storage) {
|
if (!storage) {
|
||||||
debug(`method not implemented for storage`);
|
debug(`method not implemented for storage`);
|
||||||
this.logger.error('method for remove tarball not implemented');
|
this.logger.error('method for remove tarball not implemented');
|
||||||
|
@ -664,7 +663,7 @@ class Storage {
|
||||||
debug('storage has been already initialized');
|
debug('storage has been already initialized');
|
||||||
}
|
}
|
||||||
if (!this.filters) {
|
if (!this.filters) {
|
||||||
this.filters = await asyncLoadPlugin<IPluginStorageFilter<any>>(
|
this.filters = await asyncLoadPlugin<pluginUtils.IPluginStorageFilter<any>>(
|
||||||
this.config.filters,
|
this.config.filters,
|
||||||
{
|
{
|
||||||
config: this.config,
|
config: this.config,
|
||||||
|
@ -707,7 +706,7 @@ class Storage {
|
||||||
* @param {Object} pkgName package name.
|
* @param {Object} pkgName package name.
|
||||||
* @return {Object}
|
* @return {Object}
|
||||||
*/
|
*/
|
||||||
private getPrivatePackageStorage(pkgName: string): IPackageStorage {
|
private getPrivatePackageStorage(pkgName: string): pluginUtils.IPackageStorage {
|
||||||
debug('get local storage for %o', pkgName);
|
debug('get local storage for %o', pkgName);
|
||||||
return this.localStorage.getStoragePlugin().getPackageStorage(pkgName);
|
return this.localStorage.getStoragePlugin().getPackageStorage(pkgName);
|
||||||
}
|
}
|
||||||
|
@ -725,7 +724,7 @@ class Storage {
|
||||||
{ signal }: { signal: AbortSignal }
|
{ signal }: { signal: AbortSignal }
|
||||||
): Promise<Readable> {
|
): Promise<Readable> {
|
||||||
assert(validatioUtils.validateName(filename));
|
assert(validatioUtils.validateName(filename));
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
||||||
if (typeof storage === 'undefined') {
|
if (typeof storage === 'undefined') {
|
||||||
return this.createFailureStreamResponseNext();
|
return this.createFailureStreamResponseNext();
|
||||||
}
|
}
|
||||||
|
@ -776,7 +775,7 @@ class Storage {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async removePackageByRevision(pkgName: string, revision: string): Promise<void> {
|
private async removePackageByRevision(pkgName: string, revision: string): Promise<void> {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
||||||
debug('get package metadata for %o', pkgName);
|
debug('get package metadata for %o', pkgName);
|
||||||
if (typeof storage === 'undefined') {
|
if (typeof storage === 'undefined') {
|
||||||
throw errorUtils.getServiceUnavailable('storage not initialized');
|
throw errorUtils.getServiceUnavailable('storage not initialized');
|
||||||
|
@ -831,7 +830,7 @@ class Storage {
|
||||||
*/
|
*/
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
public async getPackageLocalMetadata(name: string, _revision?: string): Promise<Manifest> {
|
public async getPackageLocalMetadata(name: string, _revision?: string): Promise<Manifest> {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(name);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(name);
|
||||||
debug('get package metadata for %o', name);
|
debug('get package metadata for %o', name);
|
||||||
if (typeof storage === 'undefined') {
|
if (typeof storage === 'undefined') {
|
||||||
throw errorUtils.getServiceUnavailable('storage not initialized');
|
throw errorUtils.getServiceUnavailable('storage not initialized');
|
||||||
|
@ -1052,7 +1051,7 @@ class Storage {
|
||||||
* @returns boolean
|
* @returns boolean
|
||||||
*/
|
*/
|
||||||
private async hasPackage(pkgName: string): Promise<boolean> {
|
private async hasPackage(pkgName: string): Promise<boolean> {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(pkgName);
|
||||||
if (typeof storage === 'undefined') {
|
if (typeof storage === 'undefined') {
|
||||||
throw errorUtils.getNotFound();
|
throw errorUtils.getNotFound();
|
||||||
}
|
}
|
||||||
|
@ -1410,7 +1409,7 @@ class Storage {
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
private async createNewLocalCachePackage(name: string, latestVersion: string): Promise<void> {
|
private async createNewLocalCachePackage(name: string, latestVersion: string): Promise<void> {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(name);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(name);
|
||||||
|
|
||||||
if (!storage) {
|
if (!storage) {
|
||||||
debug(`storage is missing for %o package cannot be added`, name);
|
debug(`storage is missing for %o package cannot be added`, name);
|
||||||
|
@ -1518,7 +1517,7 @@ class Storage {
|
||||||
name: string,
|
name: string,
|
||||||
updateHandler: (manifest: Manifest) => Promise<Manifest>
|
updateHandler: (manifest: Manifest) => Promise<Manifest>
|
||||||
): Promise<Manifest> {
|
): Promise<Manifest> {
|
||||||
const storage: IPackageStorage = this.getPrivatePackageStorage(name);
|
const storage: pluginUtils.IPackageStorage = this.getPrivatePackageStorage(name);
|
||||||
|
|
||||||
if (!storage) {
|
if (!storage) {
|
||||||
throw errorUtils.getNotFound();
|
throw errorUtils.getNotFound();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
import { pluginUtils } from '@verdaccio/core';
|
||||||
import { FetchOptions } from '@verdaccio/proxy';
|
import { FetchOptions } from '@verdaccio/proxy';
|
||||||
import { Config, IPluginStorageFilter, Manifest, RemoteUser } from '@verdaccio/types';
|
import { Config, Manifest, RemoteUser } from '@verdaccio/types';
|
||||||
import { RequestOptions } from '@verdaccio/url';
|
import { RequestOptions } from '@verdaccio/url';
|
||||||
|
|
||||||
// @deprecated use IGetPackageOptionsNext
|
// @deprecated use IGetPackageOptionsNext
|
||||||
|
@ -57,7 +58,7 @@ export type UpdateManifestOptions = {
|
||||||
signal: AbortSignal;
|
signal: AbortSignal;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type IPluginFilters = IPluginStorageFilter<Config>[];
|
export type IPluginFilters = pluginUtils.IPluginStorageFilter<Config>[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When the command `npm star` is executed, the body only contains the following
|
* When the command `npm star` is executed, the body only contains the following
|
||||||
|
|
|
@ -13,9 +13,6 @@
|
||||||
{
|
{
|
||||||
"path": "../plugins/local-storage"
|
"path": "../plugins/local-storage"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../core/streams"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../core/url"
|
"path": "../core/url"
|
||||||
},
|
},
|
||||||
|
@ -31,9 +28,6 @@
|
||||||
{
|
{
|
||||||
"path": "../logger"
|
"path": "../logger"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "../mock"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "../proxy"
|
"path": "../proxy"
|
||||||
},
|
},
|
||||||
|
|
12
packages/store/types/patch.d.ts
vendored
Normal file
12
packages/store/types/patch.d.ts
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
declare module 'jest-matcher-utils';
|
||||||
|
declare module 'pretty-format' {
|
||||||
|
export type Plugin = any;
|
||||||
|
export type CompareKeys = any;
|
||||||
|
}
|
||||||
|
declare module '@jest/schemas' {
|
||||||
|
export type SnapshotFormat = any;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '@szmarczak/http-timer';
|
||||||
|
declare module 'cacheable-lookup';
|
||||||
|
// declare module 'p-cancelable';
|
|
@ -9,10 +9,5 @@
|
||||||
"declarationMap": true
|
"declarationMap": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
"exclude": ["src/**/*.test.ts"],
|
"exclude": ["src/**/*.test.ts"]
|
||||||
"references": [
|
|
||||||
{
|
|
||||||
"path": "../core/commons-api"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,73 +4,6 @@
|
||||||
npm install --global verdaccio
|
npm install --global verdaccio
|
||||||
```
|
```
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)
|
|
||||||
[![stackshare](https://img.shields.io/badge/Follow%20on-StackShare-blue.svg?logo=stackshare&style=flat)](https://stackshare.io/verdaccio)
|
|
||||||
[![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
|
||||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/verdaccio/localized.svg)](https://crowdin.com/project/verdaccio)
|
|
||||||
[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/verdaccio/verdaccio)](https://www.tickgit.com/browse?repo=github.com/verdaccio/verdaccio)
|
|
||||||
|
|
||||||
[![Twitter followers](https://img.shields.io/twitter/follow/verdaccio_npm.svg?style=social&label=Follow)](https://twitter.com/verdaccio_npm)
|
|
||||||
[![Github](https://img.shields.io/github/stars/verdaccio/verdaccio.svg?style=social&label=Stars)](https://github.com/verdaccio/verdaccio/stargazers)
|
|
||||||
|
|
||||||
## Donations
|
|
||||||
|
|
||||||
Verdaccio is run by **volunteers**; nobody is working full-time on it. If you find this project to be useful and would like to support its development, consider making a donation - **your logo might end up in this readme.** 😉
|
|
||||||
|
|
||||||
**[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\$1/month_ or just one single contribution.
|
|
||||||
|
|
||||||
## Report a vulnerability
|
|
||||||
|
|
||||||
If you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).
|
|
||||||
|
|
||||||
## Open Collective Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio#sponsor)]
|
|
||||||
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.svg)](https://opencollective.com/verdaccio/sponsor/0/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.svg)](https://opencollective.com/verdaccio/sponsor/1/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.svg)](https://opencollective.com/verdaccio/sponsor/2/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.svg)](https://opencollective.com/verdaccio/sponsor/3/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.svg)](https://opencollective.com/verdaccio/sponsor/4/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.svg)](https://opencollective.com/verdaccio/sponsor/5/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.svg)](https://opencollective.com/verdaccio/sponsor/6/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.svg)](https://opencollective.com/verdaccio/sponsor/7/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.svg)](https://opencollective.com/verdaccio/sponsor/8/website)
|
|
||||||
[![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.svg)](https://opencollective.com/verdaccio/sponsor/9/website)
|
|
||||||
|
|
||||||
## Open Collective Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio#backer)]
|
|
||||||
|
|
||||||
[![backers](https://opencollective.com/verdaccio/backers.svg?width=890)](https://opencollective.com/verdaccio#backers)
|
|
||||||
|
|
||||||
## Special Thanks
|
|
||||||
|
|
||||||
Thanks to the following companies to help us to achieve our goals providing free open source licenses.
|
|
||||||
|
|
||||||
[![jetbrain](assets/thanks/jetbrains/logo.png)](https://www.jetbrains.com/)
|
|
||||||
[![crowdin](assets/thanks/crowdin/logo.png)](https://crowdin.com/)
|
|
||||||
[![balsamiq](assets/thanks/balsamiq/logo.jpg)](https://balsamiq.com/)
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
|
||||||
|
|
||||||
[![contributors](https://opencollective.com/verdaccio/contributors.svg?width=890&button=true)](../../graphs/contributors)
|
|
||||||
|
|
||||||
### FAQ / Contact / Troubleshoot
|
|
||||||
|
|
||||||
If you have any issue you can try the following options, do no desist to ask or check our issues database, perhaps someone has asked already what you are looking for.
|
|
||||||
|
|
||||||
- [Blog](https://verdaccio.org/blog/)
|
|
||||||
- [Donations](https://opencollective.com/verdaccio)
|
|
||||||
- [Reporting an issue](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md#reporting-a-bug)
|
|
||||||
- [Running discussions](https://github.com/verdaccio/verdaccio/issues?q=is%3Aissue+is%3Aopen+label%3Adiscuss)
|
|
||||||
- [Chat](http://chat.verdaccio.org/)
|
|
||||||
- [Logos](https://verdaccio.org/docs/en/logo)
|
|
||||||
- [Docker Examples](https://github.com/verdaccio/docker-examples)
|
|
||||||
- [FAQ](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20)
|
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
"clean": "rimraf ./build",
|
"clean": "rimraf ./build",
|
||||||
"lint": "eslint . --ext .js,.ts",
|
"lint": "eslint . --ext .js,.ts",
|
||||||
"test": "jest --detectOpenHandles",
|
"test": "jest --detectOpenHandles",
|
||||||
|
"ge:docs": "typedoc src/index.ts --tsconfig tsconfig.build.json --plugin typedoc-plugin-markdown",
|
||||||
"test:debug": "node --inspect-brk ../../node_modules/jest/bin/jest.js --config ./test/jest.config.functional.js --testPathPattern ./test/unit/* --passWithNoTests",
|
"test:debug": "node --inspect-brk ../../node_modules/jest/bin/jest.js --config ./test/jest.config.functional.js --testPathPattern ./test/unit/* --passWithNoTests",
|
||||||
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
||||||
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
||||||
|
@ -58,7 +59,9 @@
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"node-mocks-http": "1.11.0",
|
"node-mocks-http": "1.11.0",
|
||||||
"get-port": "5.1.1",
|
"get-port": "5.1.1",
|
||||||
"nock": "13.2.9"
|
"nock": "13.2.9",
|
||||||
|
"typedoc-plugin-missing-exports": "1.0.0",
|
||||||
|
"typedoc-plugin-markdown": "3.13.6"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"private",
|
"private",
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"outDir": "./build"
|
"outDir": "./build"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"]
|
"include": ["src/**/*.ts", "types/*.d.ts"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
"path": "../config"
|
"path": "../config"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../core/htpasswd"
|
"path": "../plugins/htpasswd"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "../tools/helper"
|
"path": "../tools/helper"
|
||||||
|
|
8
packages/verdaccio/types/patch.d.ts
vendored
Normal file
8
packages/verdaccio/types/patch.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
declare module 'jest-matcher-utils';
|
||||||
|
declare module 'pretty-format' {
|
||||||
|
export type Plugin = any;
|
||||||
|
export type CompareKeys = any;
|
||||||
|
}
|
||||||
|
declare module '@jest/schemas' {
|
||||||
|
export type SnapshotFormat = any;
|
||||||
|
}
|
265
pnpm-lock.yaml
265
pnpm-lock.yaml
|
@ -1,5 +1,9 @@
|
||||||
lockfileVersion: 5.3
|
lockfileVersion: 5.3
|
||||||
|
|
||||||
|
overrides:
|
||||||
|
got: 11.8.5
|
||||||
|
p-cancelable: 2.1.1
|
||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
.:
|
.:
|
||||||
|
@ -258,7 +262,7 @@ importers:
|
||||||
pnpm: next-7
|
pnpm: next-7
|
||||||
dependencies:
|
dependencies:
|
||||||
'@verdaccio/test-cli-commons': link:../cli-commons
|
'@verdaccio/test-cli-commons': link:../cli-commons
|
||||||
pnpm: 7.12.2
|
pnpm: 7.13.3
|
||||||
|
|
||||||
e2e/cli/e2e-yarn1:
|
e2e/cli/e2e-yarn1:
|
||||||
specifiers:
|
specifiers:
|
||||||
|
@ -499,12 +503,10 @@ importers:
|
||||||
packages/core/types:
|
packages/core/types:
|
||||||
specifiers:
|
specifiers:
|
||||||
'@types/node': 16.11.62
|
'@types/node': 16.11.62
|
||||||
typedoc: beta
|
typedoc: 0.23.15
|
||||||
typedoc-plugin-missing-exports: 1.0.0
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@types/node': 16.11.62
|
'@types/node': 16.11.62
|
||||||
typedoc: 0.23.0-beta.7_typescript@4.8.4
|
typedoc: 0.23.15_typescript@4.8.4
|
||||||
typedoc-plugin-missing-exports: 1.0.0_typedoc@0.23.0-beta.7
|
|
||||||
|
|
||||||
packages/core/url:
|
packages/core/url:
|
||||||
specifiers:
|
specifiers:
|
||||||
|
@ -656,7 +658,9 @@ importers:
|
||||||
|
|
||||||
packages/plugins/audit:
|
packages/plugins/audit:
|
||||||
specifiers:
|
specifiers:
|
||||||
|
'@verdaccio/auth': workspace:6.0.0-6-next.27
|
||||||
'@verdaccio/config': workspace:6.0.0-6-next.48
|
'@verdaccio/config': workspace:6.0.0-6-next.48
|
||||||
|
'@verdaccio/core': workspace:6.0.0-6-next.48
|
||||||
'@verdaccio/logger': workspace:6.0.0-6-next.16
|
'@verdaccio/logger': workspace:6.0.0-6-next.16
|
||||||
'@verdaccio/types': workspace:11.0.0-6-next.17
|
'@verdaccio/types': workspace:11.0.0-6-next.17
|
||||||
body-parser: 1.20.0
|
body-parser: 1.20.0
|
||||||
|
@ -666,13 +670,15 @@ importers:
|
||||||
node-fetch: cjs
|
node-fetch: cjs
|
||||||
supertest: 6.2.4
|
supertest: 6.2.4
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@verdaccio/config': link:../../config
|
||||||
|
'@verdaccio/core': link:../../core/core
|
||||||
|
'@verdaccio/logger': link:../../logger
|
||||||
body-parser: 1.20.0
|
body-parser: 1.20.0
|
||||||
express: 4.18.1
|
express: 4.18.1
|
||||||
https-proxy-agent: 5.0.1
|
https-proxy-agent: 5.0.1
|
||||||
node-fetch: 2.6.7
|
node-fetch: 2.6.7
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@verdaccio/config': link:../../config
|
'@verdaccio/auth': link:../../auth
|
||||||
'@verdaccio/logger': link:../../logger
|
|
||||||
'@verdaccio/types': link:../../core/types
|
'@verdaccio/types': link:../../core/types
|
||||||
nock: 13.2.9
|
nock: 13.2.9
|
||||||
supertest: 6.2.4
|
supertest: 6.2.4
|
||||||
|
@ -956,6 +962,7 @@ importers:
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
nock: 13.2.9
|
nock: 13.2.9
|
||||||
node-mocks-http: 1.11.0
|
node-mocks-http: 1.11.0
|
||||||
|
p-cancelable: 2.1.1
|
||||||
semver: 7.3.7
|
semver: 7.3.7
|
||||||
undici: 4.16.0
|
undici: 4.16.0
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -976,6 +983,7 @@ importers:
|
||||||
get-stream: 6.0.1
|
get-stream: 6.0.1
|
||||||
nock: 13.2.9
|
nock: 13.2.9
|
||||||
node-mocks-http: 1.11.0
|
node-mocks-http: 1.11.0
|
||||||
|
p-cancelable: 2.1.1
|
||||||
semver: 7.3.7
|
semver: 7.3.7
|
||||||
|
|
||||||
packages/server/express:
|
packages/server/express:
|
||||||
|
@ -1273,6 +1281,8 @@ importers:
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
nock: 13.2.9
|
nock: 13.2.9
|
||||||
node-mocks-http: 1.11.0
|
node-mocks-http: 1.11.0
|
||||||
|
typedoc-plugin-markdown: 3.13.6
|
||||||
|
typedoc-plugin-missing-exports: 1.0.0
|
||||||
verdaccio-audit: workspace:11.0.0-6-next.11
|
verdaccio-audit: workspace:11.0.0-6-next.11
|
||||||
verdaccio-htpasswd: workspace:11.0.0-6-next.18
|
verdaccio-htpasswd: workspace:11.0.0-6-next.18
|
||||||
yaml: 2.1.1
|
yaml: 2.1.1
|
||||||
|
@ -1297,6 +1307,8 @@ importers:
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
nock: 13.2.9
|
nock: 13.2.9
|
||||||
node-mocks-http: 1.11.0
|
node-mocks-http: 1.11.0
|
||||||
|
typedoc-plugin-markdown: 3.13.6
|
||||||
|
typedoc-plugin-missing-exports: 1.0.0
|
||||||
yaml: 2.1.1
|
yaml: 2.1.1
|
||||||
|
|
||||||
packages/web:
|
packages/web:
|
||||||
|
@ -1380,8 +1392,10 @@ importers:
|
||||||
docusaurus-plugin-contributors: workspace:1.0.1-6-next.0
|
docusaurus-plugin-contributors: workspace:1.0.1-6-next.0
|
||||||
docusaurus-plugin-sass: ^0.2.1
|
docusaurus-plugin-sass: ^0.2.1
|
||||||
docusaurus-plugin-sentry: 1.0.0
|
docusaurus-plugin-sentry: 1.0.0
|
||||||
|
docusaurus-plugin-typedoc: latest
|
||||||
esbuild: 0.14.10
|
esbuild: 0.14.10
|
||||||
esbuild-loader: 2.16.0
|
esbuild-loader: 2.16.0
|
||||||
|
p-cancelable: 2.1.1
|
||||||
prism-react-renderer: ^1.2.1
|
prism-react-renderer: ^1.2.1
|
||||||
react: 17.0.2
|
react: 17.0.2
|
||||||
react-dom: 17.0.2
|
react-dom: 17.0.2
|
||||||
|
@ -1389,6 +1403,9 @@ importers:
|
||||||
react-twitter-widgets: ^1.10.0
|
react-twitter-widgets: ^1.10.0
|
||||||
sass: 1.55.0
|
sass: 1.55.0
|
||||||
sass-loader: ^12.1.0
|
sass-loader: ^12.1.0
|
||||||
|
typedoc: 0.23.15
|
||||||
|
typedoc-github-wiki-theme: ^1.0.1
|
||||||
|
typedoc-plugin-markdown: 3.13.6
|
||||||
url-loader: 4.1.1
|
url-loader: 4.1.1
|
||||||
use-is-in-viewport: ^1.0.9
|
use-is-in-viewport: ^1.0.9
|
||||||
usehooks-ts: 2.7.1
|
usehooks-ts: 2.7.1
|
||||||
|
@ -1409,10 +1426,14 @@ importers:
|
||||||
copy-text-to-clipboard: 3.0.1
|
copy-text-to-clipboard: 3.0.1
|
||||||
docusaurus-plugin-contributors: link:../packages/tools/docusaurus-plugin-contributors
|
docusaurus-plugin-contributors: link:../packages/tools/docusaurus-plugin-contributors
|
||||||
docusaurus-plugin-sentry: 1.0.0_6cc73cc048a6f0dd8d2f9ff95b1ea0d9
|
docusaurus-plugin-sentry: 1.0.0_6cc73cc048a6f0dd8d2f9ff95b1ea0d9
|
||||||
|
docusaurus-plugin-typedoc: 0.17.5_fe401e7e42cf7649fa36d66d5c1ce51f
|
||||||
|
p-cancelable: 2.1.1
|
||||||
react: 17.0.2
|
react: 17.0.2
|
||||||
react-dom: 17.0.2_react@17.0.2
|
react-dom: 17.0.2_react@17.0.2
|
||||||
react-player: 2.11.0_react@17.0.2
|
react-player: 2.11.0_react@17.0.2
|
||||||
react-twitter-widgets: 1.10.0_react@17.0.2
|
react-twitter-widgets: 1.10.0_react@17.0.2
|
||||||
|
typedoc: 0.23.15_typescript@4.8.4
|
||||||
|
typedoc-plugin-markdown: 3.13.6_typedoc@0.23.15
|
||||||
use-is-in-viewport: 1.0.9_react@17.0.2
|
use-is-in-viewport: 1.0.9_react@17.0.2
|
||||||
usehooks-ts: 2.7.1_react-dom@17.0.2+react@17.0.2
|
usehooks-ts: 2.7.1_react-dom@17.0.2+react@17.0.2
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
@ -1425,6 +1446,7 @@ importers:
|
||||||
prism-react-renderer: 1.2.1_react@17.0.2
|
prism-react-renderer: 1.2.1_react@17.0.2
|
||||||
sass: 1.55.0
|
sass: 1.55.0
|
||||||
sass-loader: 12.1.0_sass@1.55.0
|
sass-loader: 12.1.0_sass@1.55.0
|
||||||
|
typedoc-github-wiki-theme: 1.0.1_fe401e7e42cf7649fa36d66d5c1ce51f
|
||||||
url-loader: 4.1.1
|
url-loader: 4.1.1
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
@ -5953,7 +5975,7 @@ packages:
|
||||||
wait-on: 6.0.1_debug@4.3.4
|
wait-on: 6.0.1_debug@4.3.4
|
||||||
webpack: 5.74.0_esbuild@0.14.10
|
webpack: 5.74.0_esbuild@0.14.10
|
||||||
webpack-bundle-analyzer: 4.6.1
|
webpack-bundle-analyzer: 4.6.1
|
||||||
webpack-dev-server: 4.9.3_webpack@5.74.0
|
webpack-dev-server: 4.9.3_debug@4.3.4+webpack@5.74.0
|
||||||
webpack-merge: 5.8.0
|
webpack-merge: 5.8.0
|
||||||
webpackbar: 5.0.2_webpack@5.74.0
|
webpackbar: 5.0.2_webpack@5.74.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -6050,7 +6072,7 @@ packages:
|
||||||
wait-on: 6.0.1_debug@4.3.4
|
wait-on: 6.0.1_debug@4.3.4
|
||||||
webpack: 5.74.0_esbuild@0.14.10
|
webpack: 5.74.0_esbuild@0.14.10
|
||||||
webpack-bundle-analyzer: 4.6.1
|
webpack-bundle-analyzer: 4.6.1
|
||||||
webpack-dev-server: 4.9.3_webpack@5.74.0
|
webpack-dev-server: 4.9.3_debug@4.3.4+webpack@5.74.0
|
||||||
webpack-merge: 5.8.0
|
webpack-merge: 5.8.0
|
||||||
webpackbar: 5.0.2_webpack@5.74.0
|
webpackbar: 5.0.2_webpack@5.74.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -8352,10 +8374,6 @@ packages:
|
||||||
/@sinclair/typebox/0.24.34:
|
/@sinclair/typebox/0.24.34:
|
||||||
resolution: {integrity: sha512-x3ejWKw7rpy30Bvm6U0AQMOHdjqe2E3YJrBHlTxH0KFsp77bBa+MH324nJxtXZFpnTy/JW2h5HPYVm0vG2WPnw==}
|
resolution: {integrity: sha512-x3ejWKw7rpy30Bvm6U0AQMOHdjqe2E3YJrBHlTxH0KFsp77bBa+MH324nJxtXZFpnTy/JW2h5HPYVm0vG2WPnw==}
|
||||||
|
|
||||||
/@sindresorhus/is/0.14.0:
|
|
||||||
resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
|
|
||||||
/@sindresorhus/is/4.6.0:
|
/@sindresorhus/is/4.6.0:
|
||||||
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
|
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
@ -8624,12 +8642,6 @@ packages:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
/@szmarczak/http-timer/1.1.2:
|
|
||||||
resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
dependencies:
|
|
||||||
defer-to-connect: 1.1.3
|
|
||||||
|
|
||||||
/@szmarczak/http-timer/4.0.6:
|
/@szmarczak/http-timer/4.0.6:
|
||||||
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
|
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
@ -9162,7 +9174,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/prop-types': 15.7.5
|
'@types/prop-types': 15.7.5
|
||||||
'@types/scheduler': 0.16.2
|
'@types/scheduler': 0.16.2
|
||||||
csstype: 3.1.0
|
csstype: 3.1.1
|
||||||
|
|
||||||
/@types/redux/3.6.0:
|
/@types/redux/3.6.0:
|
||||||
resolution: {integrity: sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=}
|
resolution: {integrity: sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=}
|
||||||
|
@ -10294,7 +10306,7 @@ packages:
|
||||||
/axios/0.21.1_debug@4.3.4:
|
/axios/0.21.1_debug@4.3.4:
|
||||||
resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==}
|
resolution: {integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: 1.14.9_debug@4.3.4
|
follow-redirects: 1.14.9_debug@4.3.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- debug
|
- debug
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -10302,7 +10314,7 @@ packages:
|
||||||
/axios/0.21.3_debug@4.3.4:
|
/axios/0.21.3_debug@4.3.4:
|
||||||
resolution: {integrity: sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==}
|
resolution: {integrity: sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: 1.14.9_debug@4.3.4
|
follow-redirects: 1.14.9_debug@4.3.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- debug
|
- debug
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -10310,7 +10322,7 @@ packages:
|
||||||
/axios/0.25.0_debug@4.3.4:
|
/axios/0.25.0_debug@4.3.4:
|
||||||
resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
|
resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: 1.14.9_debug@4.3.4
|
follow-redirects: 1.14.9_debug@4.3.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- debug
|
- debug
|
||||||
|
|
||||||
|
@ -10794,7 +10806,6 @@ packages:
|
||||||
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
|
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
balanced-match: 1.0.2
|
balanced-match: 1.0.2
|
||||||
dev: true
|
|
||||||
|
|
||||||
/braces/2.3.2:
|
/braces/2.3.2:
|
||||||
resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
|
resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
|
||||||
|
@ -10952,18 +10963,6 @@ packages:
|
||||||
resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
|
resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
|
||||||
engines: {node: '>=10.6.0'}
|
engines: {node: '>=10.6.0'}
|
||||||
|
|
||||||
/cacheable-request/6.1.0:
|
|
||||||
resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
|
|
||||||
engines: {node: '>=8'}
|
|
||||||
dependencies:
|
|
||||||
clone-response: 1.0.2
|
|
||||||
get-stream: 5.2.0
|
|
||||||
http-cache-semantics: 4.1.0
|
|
||||||
keyv: 3.1.0
|
|
||||||
lowercase-keys: 2.0.0
|
|
||||||
normalize-url: 4.5.1
|
|
||||||
responselike: 1.0.2
|
|
||||||
|
|
||||||
/cacheable-request/7.0.2:
|
/cacheable-request/7.0.2:
|
||||||
resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
|
resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -12460,12 +12459,6 @@ packages:
|
||||||
resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=}
|
resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
|
|
||||||
/decompress-response/3.3.0:
|
|
||||||
resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=}
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
dependencies:
|
|
||||||
mimic-response: 1.0.1
|
|
||||||
|
|
||||||
/decompress-response/6.0.0:
|
/decompress-response/6.0.0:
|
||||||
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
|
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
@ -12515,9 +12508,6 @@ packages:
|
||||||
clone: 1.0.4
|
clone: 1.0.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/defer-to-connect/1.1.3:
|
|
||||||
resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
|
|
||||||
|
|
||||||
/defer-to-connect/2.0.1:
|
/defer-to-connect/2.0.1:
|
||||||
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
|
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
@ -12767,6 +12757,16 @@ packages:
|
||||||
- webpack-cli
|
- webpack-cli
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/docusaurus-plugin-typedoc/0.17.5_fe401e7e42cf7649fa36d66d5c1ce51f:
|
||||||
|
resolution: {integrity: sha512-mMTk4lRy2+wQ7fmMOv6RLfKkoGnHkBLE8qUoPfWFoqUYDDDInwVQKxz12FNnQx86eJSLgBiZmuY/zB/bYsZQlQ==}
|
||||||
|
peerDependencies:
|
||||||
|
typedoc: '>=0.22.0'
|
||||||
|
typedoc-plugin-markdown: '>=3.11.10'
|
||||||
|
dependencies:
|
||||||
|
typedoc: 0.23.15_typescript@4.8.4
|
||||||
|
typedoc-plugin-markdown: 3.13.6_typedoc@0.23.15
|
||||||
|
dev: false
|
||||||
|
|
||||||
/dom-accessibility-api/0.5.9:
|
/dom-accessibility-api/0.5.9:
|
||||||
resolution: {integrity: sha512-+KPF4o71fl6NrdnqIrJc6m44NA+Rhf1h7In2MRznejSQasWkjqmHOBUlk+pXJ77cVOSYyZeNHFwn/sjotB6+Sw==}
|
resolution: {integrity: sha512-+KPF4o71fl6NrdnqIrJc6m44NA+Rhf1h7In2MRznejSQasWkjqmHOBUlk+pXJ77cVOSYyZeNHFwn/sjotB6+Sw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -12888,9 +12888,6 @@ packages:
|
||||||
/duplexer/0.1.2:
|
/duplexer/0.1.2:
|
||||||
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
|
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
|
||||||
|
|
||||||
/duplexer3/0.1.4:
|
|
||||||
resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=}
|
|
||||||
|
|
||||||
/eastasianwidth/0.2.0:
|
/eastasianwidth/0.2.0:
|
||||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||||
|
|
||||||
|
@ -14337,9 +14334,16 @@ packages:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
|
|
||||||
/follow-redirects/1.14.9:
|
/follow-redirects/1.14.9_debug@4.3.3:
|
||||||
resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==}
|
resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==}
|
||||||
engines: {node: '>=4.0'}
|
engines: {node: '>=4.0'}
|
||||||
|
peerDependencies:
|
||||||
|
debug: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
debug:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
debug: 4.3.3_supports-color@6.1.0
|
||||||
|
|
||||||
/follow-redirects/1.14.9_debug@4.3.4:
|
/follow-redirects/1.14.9_debug@4.3.4:
|
||||||
resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==}
|
resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==}
|
||||||
|
@ -14783,24 +14787,6 @@ packages:
|
||||||
p-cancelable: 2.1.1
|
p-cancelable: 2.1.1
|
||||||
responselike: 2.0.0
|
responselike: 2.0.0
|
||||||
|
|
||||||
/got/9.6.0:
|
|
||||||
resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
|
|
||||||
engines: {node: '>=8.6'}
|
|
||||||
dependencies:
|
|
||||||
'@sindresorhus/is': 0.14.0
|
|
||||||
'@szmarczak/http-timer': 1.1.2
|
|
||||||
'@types/keyv': 3.1.4
|
|
||||||
'@types/responselike': 1.0.0
|
|
||||||
cacheable-request: 6.1.0
|
|
||||||
decompress-response: 3.3.0
|
|
||||||
duplexer3: 0.1.4
|
|
||||||
get-stream: 4.1.0
|
|
||||||
lowercase-keys: 1.0.1
|
|
||||||
mimic-response: 1.0.1
|
|
||||||
p-cancelable: 1.1.0
|
|
||||||
to-readable-stream: 1.0.0
|
|
||||||
url-parse-lax: 3.0.0
|
|
||||||
|
|
||||||
/graceful-fs/4.2.6:
|
/graceful-fs/4.2.6:
|
||||||
resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
|
resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -14853,7 +14839,6 @@ packages:
|
||||||
wordwrap: 1.0.0
|
wordwrap: 1.0.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
uglify-js: 3.12.4
|
uglify-js: 3.12.4
|
||||||
dev: false
|
|
||||||
|
|
||||||
/hard-rejection/2.1.0:
|
/hard-rejection/2.1.0:
|
||||||
resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
|
resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
|
||||||
|
@ -15264,18 +15249,19 @@ packages:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/http-proxy-middleware/0.19.1_supports-color@6.1.0:
|
/http-proxy-middleware/0.19.1_debug@4.3.3+supports-color@6.1.0:
|
||||||
resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==}
|
resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==}
|
||||||
engines: {node: '>=4.0.0'}
|
engines: {node: '>=4.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
http-proxy: 1.18.1
|
http-proxy: 1.18.1_debug@4.3.3
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
micromatch: 3.1.10_supports-color@6.1.0
|
micromatch: 3.1.10_supports-color@6.1.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
/http-proxy-middleware/2.0.3_@types+express@4.17.13:
|
/http-proxy-middleware/2.0.3_adbe487640bba2b97136947cd1213f1b:
|
||||||
resolution: {integrity: sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==}
|
resolution: {integrity: sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
@ -15286,18 +15272,32 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/express': 4.17.13
|
'@types/express': 4.17.13
|
||||||
'@types/http-proxy': 1.17.8
|
'@types/http-proxy': 1.17.8
|
||||||
http-proxy: 1.18.1
|
http-proxy: 1.18.1_debug@4.3.4
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
is-plain-obj: 3.0.0
|
is-plain-obj: 3.0.0
|
||||||
micromatch: 4.0.5
|
micromatch: 4.0.5
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
/http-proxy/1.18.1:
|
/http-proxy/1.18.1_debug@4.3.3:
|
||||||
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
|
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
eventemitter3: 4.0.6
|
eventemitter3: 4.0.6
|
||||||
follow-redirects: 1.14.9
|
follow-redirects: 1.14.9_debug@4.3.3
|
||||||
requires-port: 1.0.0
|
requires-port: 1.0.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
|
/http-proxy/1.18.1_debug@4.3.4:
|
||||||
|
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
|
||||||
|
engines: {node: '>=8.0.0'}
|
||||||
|
dependencies:
|
||||||
|
eventemitter3: 4.0.6
|
||||||
|
follow-redirects: 1.14.9_debug@4.3.4
|
||||||
|
requires-port: 1.0.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
/http-status-codes/2.2.0:
|
/http-status-codes/2.2.0:
|
||||||
resolution: {integrity: sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==}
|
resolution: {integrity: sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==}
|
||||||
|
@ -16661,9 +16661,6 @@ packages:
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
/json-buffer/3.0.0:
|
|
||||||
resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
|
|
||||||
|
|
||||||
/json-buffer/3.0.1:
|
/json-buffer/3.0.1:
|
||||||
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
|
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
|
||||||
|
|
||||||
|
@ -16717,7 +16714,6 @@ packages:
|
||||||
|
|
||||||
/jsonc-parser/3.1.0:
|
/jsonc-parser/3.1.0:
|
||||||
resolution: {integrity: sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==}
|
resolution: {integrity: sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==}
|
||||||
dev: true
|
|
||||||
|
|
||||||
/jsonfile/4.0.0:
|
/jsonfile/4.0.0:
|
||||||
resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=}
|
resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=}
|
||||||
|
@ -16846,11 +16842,6 @@ packages:
|
||||||
tsscmp: 1.0.6
|
tsscmp: 1.0.6
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/keyv/3.1.0:
|
|
||||||
resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
|
|
||||||
dependencies:
|
|
||||||
json-buffer: 3.0.0
|
|
||||||
|
|
||||||
/keyv/4.1.1:
|
/keyv/4.1.1:
|
||||||
resolution: {integrity: sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==}
|
resolution: {integrity: sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -17220,10 +17211,6 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.4.0
|
tslib: 2.4.0
|
||||||
|
|
||||||
/lowercase-keys/1.0.1:
|
|
||||||
resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
|
|
||||||
engines: {node: '>=0.10.0'}
|
|
||||||
|
|
||||||
/lowercase-keys/2.0.0:
|
/lowercase-keys/2.0.0:
|
||||||
resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
|
resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -17326,11 +17313,10 @@ packages:
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/marked/4.0.18:
|
/marked/4.1.1:
|
||||||
resolution: {integrity: sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==}
|
resolution: {integrity: sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
|
||||||
|
|
||||||
/mathml-tag-names/2.1.3:
|
/mathml-tag-names/2.1.3:
|
||||||
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
|
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
|
||||||
|
@ -18003,7 +17989,6 @@ packages:
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion: 2.0.1
|
brace-expansion: 2.0.1
|
||||||
dev: true
|
|
||||||
|
|
||||||
/minimist-options/4.1.0:
|
/minimist-options/4.1.0:
|
||||||
resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
|
resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
|
||||||
|
@ -18364,10 +18349,6 @@ packages:
|
||||||
resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=}
|
resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
/normalize-url/4.5.1:
|
|
||||||
resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
|
|
||||||
engines: {node: '>=8'}
|
|
||||||
|
|
||||||
/normalize-url/6.1.0:
|
/normalize-url/6.1.0:
|
||||||
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
|
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
@ -19019,10 +19000,6 @@ packages:
|
||||||
resolution: {integrity: sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==}
|
resolution: {integrity: sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/p-cancelable/1.1.0:
|
|
||||||
resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
|
|
||||||
/p-cancelable/2.1.1:
|
/p-cancelable/2.1.1:
|
||||||
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
|
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
@ -19118,7 +19095,7 @@ packages:
|
||||||
resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
|
resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dependencies:
|
dependencies:
|
||||||
got: 9.6.0
|
got: 11.8.5
|
||||||
registry-auth-token: 4.2.1
|
registry-auth-token: 4.2.1
|
||||||
registry-url: 5.1.0
|
registry-url: 5.1.0
|
||||||
semver: 6.3.0
|
semver: 6.3.0
|
||||||
|
@ -19382,8 +19359,8 @@ packages:
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/pnpm/7.12.2:
|
/pnpm/7.13.3:
|
||||||
resolution: {integrity: sha512-8QvnKANKN+YZXDmVYGI7zRJysdKldZI+w3AYnxu9IwtnLv1x6WuzrJr0nxMcTeuUAT908RjDqK+/6KJB9wNqxA==}
|
resolution: {integrity: sha512-6avqSfzfAr/9w1ZleaMI276ZuZUu88eOIe6v2mTCuwtSjUEqheboH1G4m7jgF+4arMUfnBrz371UAU+DCeCiSA==}
|
||||||
engines: {node: '>=14.6'}
|
engines: {node: '>=14.6'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -20194,10 +20171,6 @@ packages:
|
||||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
|
|
||||||
/prepend-http/2.0.0:
|
|
||||||
resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=}
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
|
|
||||||
/prettier-linter-helpers/1.0.0:
|
/prettier-linter-helpers/1.0.0:
|
||||||
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
|
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
|
@ -21340,11 +21313,6 @@ packages:
|
||||||
path-parse: 1.0.7
|
path-parse: 1.0.7
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/responselike/1.0.2:
|
|
||||||
resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=}
|
|
||||||
dependencies:
|
|
||||||
lowercase-keys: 1.0.1
|
|
||||||
|
|
||||||
/responselike/2.0.0:
|
/responselike/2.0.0:
|
||||||
resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==}
|
resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -21830,13 +21798,12 @@ packages:
|
||||||
interpret: 1.4.0
|
interpret: 1.4.0
|
||||||
rechoir: 0.6.2
|
rechoir: 0.6.2
|
||||||
|
|
||||||
/shiki/0.10.1:
|
/shiki/0.11.1:
|
||||||
resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==}
|
resolution: {integrity: sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
jsonc-parser: 3.1.0
|
jsonc-parser: 3.1.0
|
||||||
vscode-oniguruma: 1.6.2
|
vscode-oniguruma: 1.6.2
|
||||||
vscode-textmate: 5.2.0
|
vscode-textmate: 6.0.0
|
||||||
dev: true
|
|
||||||
|
|
||||||
/side-channel/1.0.4:
|
/side-channel/1.0.4:
|
||||||
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
|
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
|
||||||
|
@ -22937,10 +22904,6 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
kind-of: 3.2.2
|
kind-of: 3.2.2
|
||||||
|
|
||||||
/to-readable-stream/1.0.0:
|
|
||||||
resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
|
|
||||||
engines: {node: '>=6'}
|
|
||||||
|
|
||||||
/to-regex-range/2.1.1:
|
/to-regex-range/2.1.1:
|
||||||
resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=}
|
resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
@ -23195,27 +23158,50 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-typedarray: 1.0.0
|
is-typedarray: 1.0.0
|
||||||
|
|
||||||
/typedoc-plugin-missing-exports/1.0.0_typedoc@0.23.0-beta.7:
|
/typedoc-github-wiki-theme/1.0.1_fe401e7e42cf7649fa36d66d5c1ce51f:
|
||||||
|
resolution: {integrity: sha512-FaO7fENGK6IJLpkddbNXxJfNbooF9KBC7xfk7Lj4uqG5SCC7YQFPTLDyNmbpJKO93QEenRYgqBwI5E5d/bKrHw==}
|
||||||
|
peerDependencies:
|
||||||
|
typedoc: '>=0.22.9'
|
||||||
|
typedoc-plugin-markdown: '>=3.11.10'
|
||||||
|
dependencies:
|
||||||
|
typedoc: 0.23.15_typescript@4.8.4
|
||||||
|
typedoc-plugin-markdown: 3.13.6_typedoc@0.23.15
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/typedoc-plugin-markdown/3.13.6:
|
||||||
|
resolution: {integrity: sha512-ISSc9v3BK7HkokxSBuJPttXox4tJ6hP0N9wfSIk0fmLN67+eqtAxbk97gs2nDiuha+RTO5eW9gdeAb+RPP0mgg==}
|
||||||
|
peerDependencies:
|
||||||
|
typedoc: '>=0.23.0'
|
||||||
|
dependencies:
|
||||||
|
handlebars: 4.7.7
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/typedoc-plugin-markdown/3.13.6_typedoc@0.23.15:
|
||||||
|
resolution: {integrity: sha512-ISSc9v3BK7HkokxSBuJPttXox4tJ6hP0N9wfSIk0fmLN67+eqtAxbk97gs2nDiuha+RTO5eW9gdeAb+RPP0mgg==}
|
||||||
|
peerDependencies:
|
||||||
|
typedoc: '>=0.23.0'
|
||||||
|
dependencies:
|
||||||
|
handlebars: 4.7.7
|
||||||
|
typedoc: 0.23.15_typescript@4.8.4
|
||||||
|
|
||||||
|
/typedoc-plugin-missing-exports/1.0.0:
|
||||||
resolution: {integrity: sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==}
|
resolution: {integrity: sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typedoc: 0.22.x || 0.23.x
|
typedoc: 0.22.x || 0.23.x
|
||||||
dependencies:
|
|
||||||
typedoc: 0.23.0-beta.7_typescript@4.8.4
|
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/typedoc/0.23.0-beta.7_typescript@4.8.4:
|
/typedoc/0.23.15_typescript@4.8.4:
|
||||||
resolution: {integrity: sha512-k8GKXXY4z3HIs7HdSu92jcze1nl71cLiHR329ZflhiO4Ta1rJc4F5uEtwUjCSChXFQaVZUI2l3VaF9nWm1/p7A==}
|
resolution: {integrity: sha512-x9Zu+tTnwxb9YdVr+zvX7LYzyBl1nieOr6lrSHbHsA22/RJK2m4Y525WIg5Mj4jWCmfL47v6f4hUzY7EIuwS5w==}
|
||||||
engines: {node: '>= 14.14'}
|
engines: {node: '>= 14.14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: 4.6.x || 4.7.x
|
typescript: 4.6.x || 4.7.x || 4.8.x
|
||||||
dependencies:
|
dependencies:
|
||||||
lunr: 2.3.9
|
lunr: 2.3.9
|
||||||
marked: 4.0.18
|
marked: 4.1.1
|
||||||
minimatch: 5.1.0
|
minimatch: 5.1.0
|
||||||
shiki: 0.10.1
|
shiki: 0.11.1
|
||||||
typescript: 4.8.4
|
typescript: 4.8.4
|
||||||
dev: true
|
|
||||||
|
|
||||||
/typescript/4.8.4:
|
/typescript/4.8.4:
|
||||||
resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
|
resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
|
||||||
|
@ -23230,7 +23216,6 @@ packages:
|
||||||
engines: {node: '>=0.8.0'}
|
engines: {node: '>=0.8.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dev: false
|
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
/unbox-primitive/1.0.2:
|
/unbox-primitive/1.0.2:
|
||||||
|
@ -23620,12 +23605,6 @@ packages:
|
||||||
webpack: 5.74.0_webpack-cli@4.7.2
|
webpack: 5.74.0_webpack-cli@4.7.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/url-parse-lax/3.0.0:
|
|
||||||
resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=}
|
|
||||||
engines: {node: '>=4'}
|
|
||||||
dependencies:
|
|
||||||
prepend-http: 2.0.0
|
|
||||||
|
|
||||||
/url-parse/1.5.1:
|
/url-parse/1.5.1:
|
||||||
resolution: {integrity: sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==}
|
resolution: {integrity: sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -23867,11 +23846,9 @@ packages:
|
||||||
|
|
||||||
/vscode-oniguruma/1.6.2:
|
/vscode-oniguruma/1.6.2:
|
||||||
resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==}
|
resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==}
|
||||||
dev: true
|
|
||||||
|
|
||||||
/vscode-textmate/5.2.0:
|
/vscode-textmate/6.0.0:
|
||||||
resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==}
|
resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==}
|
||||||
dev: true
|
|
||||||
|
|
||||||
/w3c-hr-time/1.0.2:
|
/w3c-hr-time/1.0.2:
|
||||||
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
|
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
|
||||||
|
@ -24144,7 +24121,7 @@ packages:
|
||||||
del: 4.1.1
|
del: 4.1.1
|
||||||
express: 4.17.1_supports-color@6.1.0
|
express: 4.17.1_supports-color@6.1.0
|
||||||
html-entities: 1.3.1
|
html-entities: 1.3.1
|
||||||
http-proxy-middleware: 0.19.1_supports-color@6.1.0
|
http-proxy-middleware: 0.19.1_debug@4.3.3+supports-color@6.1.0
|
||||||
import-local: 2.0.0
|
import-local: 2.0.0
|
||||||
internal-ip: 4.3.0
|
internal-ip: 4.3.0
|
||||||
ip: 1.1.5
|
ip: 1.1.5
|
||||||
|
@ -24194,7 +24171,7 @@ packages:
|
||||||
del: 4.1.1
|
del: 4.1.1
|
||||||
express: 4.17.1_supports-color@6.1.0
|
express: 4.17.1_supports-color@6.1.0
|
||||||
html-entities: 1.3.1
|
html-entities: 1.3.1
|
||||||
http-proxy-middleware: 0.19.1_supports-color@6.1.0
|
http-proxy-middleware: 0.19.1_debug@4.3.3+supports-color@6.1.0
|
||||||
import-local: 2.0.0
|
import-local: 2.0.0
|
||||||
internal-ip: 4.3.0
|
internal-ip: 4.3.0
|
||||||
ip: 1.1.5
|
ip: 1.1.5
|
||||||
|
@ -24224,7 +24201,7 @@ packages:
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/webpack-dev-server/4.9.3_webpack@5.74.0:
|
/webpack-dev-server/4.9.3_debug@4.3.4+webpack@5.74.0:
|
||||||
resolution: {integrity: sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==}
|
resolution: {integrity: sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==}
|
||||||
engines: {node: '>= 12.13.0'}
|
engines: {node: '>= 12.13.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -24252,7 +24229,7 @@ packages:
|
||||||
express: 4.18.1
|
express: 4.18.1
|
||||||
graceful-fs: 4.2.9
|
graceful-fs: 4.2.9
|
||||||
html-entities: 2.3.2
|
html-entities: 2.3.2
|
||||||
http-proxy-middleware: 2.0.3_@types+express@4.17.13
|
http-proxy-middleware: 2.0.3_adbe487640bba2b97136947cd1213f1b
|
||||||
ipaddr.js: 2.0.1
|
ipaddr.js: 2.0.1
|
||||||
open: 8.4.0
|
open: 8.4.0
|
||||||
p-retry: 4.6.1
|
p-retry: 4.6.1
|
||||||
|
@ -24267,6 +24244,7 @@ packages:
|
||||||
ws: 8.8.0
|
ws: 8.8.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
|
- debug
|
||||||
- supports-color
|
- supports-color
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
|
|
||||||
|
@ -24655,7 +24633,6 @@ packages:
|
||||||
|
|
||||||
/wordwrap/1.0.0:
|
/wordwrap/1.0.0:
|
||||||
resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=}
|
resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=}
|
||||||
dev: false
|
|
||||||
|
|
||||||
/worker-rpc/0.1.1:
|
/worker-rpc/0.1.1:
|
||||||
resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==}
|
resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"esModuleInterop": true
|
"esModuleInterop": true
|
||||||
},
|
},
|
||||||
|
"include": ["src/**/*.ts", "types/*.d.ts"],
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"**/build",
|
"**/build",
|
||||||
"node_modules",
|
"node_modules",
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
"preserveSymlinks": true,
|
"preserveSymlinks": true,
|
||||||
"composite": true,
|
"composite": true,
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"declarationMap": true
|
"declarationMap": true,
|
||||||
|
"removeComments": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
types/patch.d.ts
vendored
Normal file
12
types/patch.d.ts
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
declare module 'jest-matcher-utils';
|
||||||
|
declare module 'pretty-format' {
|
||||||
|
export type Plugin = any;
|
||||||
|
export type CompareKeys = any;
|
||||||
|
}
|
||||||
|
declare module '@jest/schemas' {
|
||||||
|
export type SnapshotFormat = any;
|
||||||
|
}
|
||||||
|
|
||||||
|
// declare module '@szmarczak/http-timer';
|
||||||
|
// declare module 'cacheable-lookup';
|
||||||
|
// // declare module 'p-cancelable';
|
3
website/docs/api/index.md
Normal file
3
website/docs/api/index.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Verdaccio API
|
||||||
|
|
||||||
|
TBA
|
|
@ -7,9 +7,9 @@ Verdaccio is a Node.js private and proxy registry. To install it, you need a few
|
||||||
|
|
||||||
## Prerequisites {#prerequisites}
|
## Prerequisites {#prerequisites}
|
||||||
|
|
||||||
1. **Node.js** `v12` or higher.
|
1. **Node.js** `v16` or higher.
|
||||||
|
|
||||||
2. Your favorite Node Package Manager `npm`, `pnpm` or `yarn` (classic and berry).
|
2. Your favorite Node Package Manager `npm`, `pnpm` or `yarn` (classic and modern).
|
||||||
|
|
||||||
> We highly recommend to use the latest versions of Node Package Manager clients `> npm@6.x | yarn@1.x | | yarn@2.x | pnpm@6.x`. Don't support `npm@5.x` or older.
|
> We highly recommend to use the latest versions of Node Package Manager clients `> npm@6.x | yarn@1.x | | yarn@2.x | pnpm@6.x`. Don't support `npm@5.x` or older.
|
||||||
|
|
||||||
|
@ -17,8 +17,6 @@ Verdaccio is a Node.js private and proxy registry. To install it, you need a few
|
||||||
|
|
||||||
> Verdaccio will support latest Node.js version according the [Node.js Release Working Group](https://github.com/nodejs/Release) recomendations.
|
> Verdaccio will support latest Node.js version according the [Node.js Release Working Group](https://github.com/nodejs/Release) recomendations.
|
||||||
|
|
||||||
Are you still using **Verdaccio 4**?. Check the [migration guide](https://verdaccio.org/blog/2021/04/14/verdaccio-5-migration-guide).
|
|
||||||
|
|
||||||
### Quick Introduction {#quick-introduction}
|
### Quick Introduction {#quick-introduction}
|
||||||
|
|
||||||
Learn the basics before getting started, how to install, where is the location of the configuration file and more.
|
Learn the basics before getting started, how to install, where is the location of the configuration file and more.
|
||||||
|
@ -34,10 +32,10 @@ Learn the basics before getting started, how to install, where is the location o
|
||||||
Using `npm`
|
Using `npm`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install --location=global verdaccio
|
npm install --location=global verdaccio@6-next
|
||||||
```
|
```
|
||||||
|
|
||||||
or using `yarn`
|
or using `yarn@1.x` _classic_,
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn global add verdaccio
|
yarn global add verdaccio
|
||||||
|
@ -51,30 +49,17 @@ pnpm install -g verdaccio
|
||||||
|
|
||||||
![install verdaccio](/img/install_verdaccio.gif)
|
![install verdaccio](/img/install_verdaccio.gif)
|
||||||
|
|
||||||
### Next major release (verdaccio 6 alpha) {#next-major-release}
|
|
||||||
|
|
||||||
Next [major release is under development](https://github.com/verdaccio/verdaccio/discussions/2970), byt can try it out already, either for testing purposes or helping to catch any possible bug, if you find something report it under the label [6.x bugs](https://github.com/verdaccio/verdaccio/labels/6.x%20bugs).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install --location=global verdaccio@6-next
|
|
||||||
```
|
|
||||||
|
|
||||||
or with the docker image
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker pull verdaccio/verdaccio:nightly-master
|
|
||||||
```
|
|
||||||
|
|
||||||
> The docker image `verdaccio/verdaccio:nightly-master` is alinged with the latest commits in master branch, while the npmjs version has a longer release cycle. **It is highly recommended don't use alpha versions for production**.
|
|
||||||
|
|
||||||
## Basic Usage {#basic-usage}
|
## Basic Usage {#basic-usage}
|
||||||
|
|
||||||
Once it has been installed, you only need to execute the CLI command:
|
Once it has been installed, you only need to execute the CLI command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$> verdaccio
|
$> verdaccio
|
||||||
warn --- config file - /home/.config/verdaccio/config.yaml
|
info -=- local storage path /Users/user/.local/share/verdaccio/storage/.verdaccio-db.json
|
||||||
warn --- http address - http://localhost:4873/ - verdaccio/5.0.0
|
info --- using htpasswd file: /Users/user/.config/verdaccio/htpasswd
|
||||||
|
info --- http address http://localhost:4873/
|
||||||
|
info --- version: 6.0.0-6-next.48
|
||||||
|
info --- server started
|
||||||
```
|
```
|
||||||
|
|
||||||
For more information about the CLI, please [read the cli section](cli.md).
|
For more information about the CLI, please [read the cli section](cli.md).
|
||||||
|
@ -118,7 +103,7 @@ If you'd like a broader explanation, don't miss the tutorial created by [thedevl
|
||||||
## Docker Image {#docker-image}
|
## Docker Image {#docker-image}
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
|
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio:nightly-master
|
||||||
```
|
```
|
||||||
|
|
||||||
`Verdaccio` has an official docker image you can use, and in most cases, the default configuration is good enough. For more information about how to install the official image, [read the docker section](docker.md), furthermore you can learn more about combining Docker images in our [docker-examples](https://github.com/verdaccio/verdaccio/tree/master/docker-examples) repository.
|
`Verdaccio` has an official docker image you can use, and in most cases, the default configuration is good enough. For more information about how to install the official image, [read the docker section](docker.md), furthermore you can learn more about combining Docker images in our [docker-examples](https://github.com/verdaccio/verdaccio/tree/master/docker-examples) repository.
|
||||||
|
@ -128,17 +113,5 @@ docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
|
||||||
```bash
|
```bash
|
||||||
$ helm repo add verdaccio https://charts.verdaccio.org
|
$ helm repo add verdaccio https://charts.verdaccio.org
|
||||||
$ helm repo update
|
$ helm repo update
|
||||||
$ helm install verdaccio/verdaccio
|
$ helm install registry --set image.tag=nightly-master verdaccio/verdaccio
|
||||||
```
|
```
|
||||||
|
|
||||||
## Cloudron {#cloudron}
|
|
||||||
|
|
||||||
`Verdaccio` is also available as a 1-click install on [Cloudron](https://cloudron.io)
|
|
||||||
|
|
||||||
[![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=org.eggertsson.verdaccio)
|
|
||||||
|
|
||||||
## Heroku with Docker
|
|
||||||
|
|
||||||
For easy deployment you could use [Heroku](https://www.heroku.com/home), the _free_ dyno tier allows you to test their platform using a Docker container, check this example.
|
|
||||||
|
|
||||||
[https://github.com/juanpicado/verdaccio-heroku-example](https://github.com/juanpicado/verdaccio-heroku-example)
|
|
||||||
|
|
16
website/docs/third-party.md
Normal file
16
website/docs/third-party.md
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
id: third-party
|
||||||
|
title: "Third-party Integrations"
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cloudron {#cloudron}
|
||||||
|
|
||||||
|
`Verdaccio` is also available as a 1-click install on [Cloudron](https://cloudron.io)
|
||||||
|
|
||||||
|
[![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=org.eggertsson.verdaccio)
|
||||||
|
|
||||||
|
## Heroku with Docker
|
||||||
|
|
||||||
|
For easy deployment you could use [Heroku](https://www.heroku.com/home), the _free_ dyno tier allows you to test their platform using a Docker container, check this example.
|
||||||
|
|
||||||
|
[https://github.com/juanpicado/verdaccio-heroku-example](https://github.com/juanpicado/verdaccio-heroku-example)
|
|
@ -62,8 +62,68 @@ module.exports = {
|
||||||
plugins: [
|
plugins: [
|
||||||
'docusaurus-plugin-sass',
|
'docusaurus-plugin-sass',
|
||||||
"docusaurus-plugin-contributors",
|
"docusaurus-plugin-contributors",
|
||||||
isProductionDeployment && typeof process.env.SENTRY_KEY === 'string' && ['docusaurus-plugin-sentry', { DSN: process.env.SENTRY_KEY }]
|
isProductionDeployment && typeof process.env.SENTRY_KEY === 'string' && ['docusaurus-plugin-sentry', { DSN: process.env.SENTRY_KEY }],
|
||||||
].filter(Boolean),
|
[
|
||||||
|
'docusaurus-plugin-typedoc',
|
||||||
|
{
|
||||||
|
entryPoints: ['../packages/node-api/src/index.ts'],
|
||||||
|
tsconfig: '../packages/node-api/tsconfig.build.json',
|
||||||
|
id: 'api/node-api',
|
||||||
|
out: 'api/node-api',
|
||||||
|
// theme: 'default',
|
||||||
|
excludePrivate: false,
|
||||||
|
excludeProtected: true,
|
||||||
|
categorizeByGroup: false,
|
||||||
|
excludeInternal: true,
|
||||||
|
sidebar: {
|
||||||
|
categoryLabel: '@verdaccio/node-api',
|
||||||
|
// position: 1,
|
||||||
|
fullNames: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'docusaurus-plugin-typedoc',
|
||||||
|
{
|
||||||
|
entryPoints: ['../packages/config/src/index.ts'],
|
||||||
|
tsconfig: '../packages/config/tsconfig.build.json',
|
||||||
|
id: 'api/config',
|
||||||
|
out: 'api/config',
|
||||||
|
sidebar: {
|
||||||
|
categoryLabel: '@verdaccio/config',
|
||||||
|
fullNames: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'docusaurus-plugin-typedoc',
|
||||||
|
{
|
||||||
|
entryPoints: ['../packages/core/core/src/index.ts'],
|
||||||
|
tsconfig: '../packages/core/core/tsconfig.build.json',
|
||||||
|
id: 'api/core',
|
||||||
|
out: 'api/core',
|
||||||
|
sidebar: {
|
||||||
|
categoryLabel: '@verdaccio/core',
|
||||||
|
fullNames: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'docusaurus-plugin-typedoc',
|
||||||
|
{
|
||||||
|
entryPoints: ['../packages/core/types/src/types.ts'],
|
||||||
|
tsconfig: '../packages/core/types/tsconfig.build.json',
|
||||||
|
id: 'api/types',
|
||||||
|
out: 'api/types',
|
||||||
|
categorizeByGroup: false,
|
||||||
|
includeVersion: true,
|
||||||
|
sidebar: {
|
||||||
|
categoryLabel: '@verdaccio/types',
|
||||||
|
fullNames: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
webpack: {
|
webpack: {
|
||||||
jsLoader: (isServer) => ({
|
jsLoader: (isServer) => ({
|
||||||
loader: require.resolve('esbuild-loader'),
|
loader: require.resolve('esbuild-loader'),
|
||||||
|
@ -111,6 +171,12 @@ module.exports = {
|
||||||
position: 'left',
|
position: 'left',
|
||||||
label: 'Docs',
|
label: 'Docs',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'doc',
|
||||||
|
docId: 'api/node-api/index',
|
||||||
|
position: 'left',
|
||||||
|
label: 'API'
|
||||||
|
},
|
||||||
{ to: '/blog', label: 'Blog', position: 'left' },
|
{ to: '/blog', label: 'Blog', position: 'left' },
|
||||||
{ to: '/help', label: 'Help', position: 'left' },
|
{ to: '/help', label: 'Help', position: 'left' },
|
||||||
{
|
{
|
||||||
|
@ -265,7 +331,7 @@ module.exports = {
|
||||||
},
|
},
|
||||||
blog: {
|
blog: {
|
||||||
blogTitle: 'Verdaccio Official Blog',
|
blogTitle: 'Verdaccio Official Blog',
|
||||||
blogDescription: 'The official Verdaccio NPM proxy registry blog',
|
blogDescription: 'The official Verdaccio Node.js proxy registry blog',
|
||||||
showReadingTime: true,
|
showReadingTime: true,
|
||||||
postsPerPage: 3,
|
postsPerPage: 3,
|
||||||
feedOptions: {
|
feedOptions: {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"version": "5.15.4",
|
"version": "5.15.4",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"docusaurus": "docusaurus",
|
"docusaurus": "docusaurus",
|
||||||
"start": "docusaurus start",
|
"start": "docusaurus start --no-open",
|
||||||
"build": "docusaurus build",
|
"build": "docusaurus build",
|
||||||
"swizzle": "docusaurus swizzle",
|
"swizzle": "docusaurus swizzle",
|
||||||
"deploy": "docusaurus deploy",
|
"deploy": "docusaurus deploy",
|
||||||
|
@ -22,27 +22,31 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@docusaurus/core": "2.1.0",
|
"@docusaurus/core": "2.1.0",
|
||||||
|
"@docusaurus/plugin-content-docs": "2.1.0",
|
||||||
"@docusaurus/plugin-google-analytics": "2.1.0",
|
"@docusaurus/plugin-google-analytics": "2.1.0",
|
||||||
"@docusaurus/preset-classic": "2.1.0",
|
"@docusaurus/preset-classic": "2.1.0",
|
||||||
"@docusaurus/remark-plugin-npm2yarn": "2.1.0",
|
"@docusaurus/remark-plugin-npm2yarn": "2.1.0",
|
||||||
"@docusaurus/theme-search-algolia": "2.1.0",
|
|
||||||
"@docusaurus/plugin-content-docs": "2.1.0",
|
|
||||||
"@docusaurus/theme-common": "2.1.0",
|
"@docusaurus/theme-common": "2.1.0",
|
||||||
"@mui/material": "5.10.7",
|
"@docusaurus/theme-search-algolia": "2.1.0",
|
||||||
"@mui/icons-material": "5.10.6",
|
|
||||||
"@mui/styles": "5.10.7",
|
|
||||||
"@mdx-js/react": "^1.6.22",
|
"@mdx-js/react": "^1.6.22",
|
||||||
"clsx": "1.2.1",
|
"@mui/icons-material": "5.10.6",
|
||||||
|
"@mui/material": "5.10.7",
|
||||||
|
"@mui/styles": "5.10.7",
|
||||||
"classnames": "2.3.2",
|
"classnames": "2.3.2",
|
||||||
|
"clsx": "1.2.1",
|
||||||
"copy-text-to-clipboard": "3.0.1",
|
"copy-text-to-clipboard": "3.0.1",
|
||||||
"docusaurus-plugin-contributors": "workspace:1.0.1-6-next.0",
|
"docusaurus-plugin-contributors": "workspace:1.0.1-6-next.0",
|
||||||
"docusaurus-plugin-sentry": "1.0.0",
|
"docusaurus-plugin-sentry": "1.0.0",
|
||||||
|
"docusaurus-plugin-typedoc": "latest",
|
||||||
"react": "17.0.2",
|
"react": "17.0.2",
|
||||||
"react-player": "2.11.0",
|
"p-cancelable": "2.1.1",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
"usehooks-ts": "2.7.1",
|
"react-player": "2.11.0",
|
||||||
"react-twitter-widgets": "^1.10.0",
|
"react-twitter-widgets": "^1.10.0",
|
||||||
"use-is-in-viewport": "^1.0.9"
|
"typedoc": "0.23.15",
|
||||||
|
"typedoc-plugin-markdown": "3.13.6",
|
||||||
|
"use-is-in-viewport": "^1.0.9",
|
||||||
|
"usehooks-ts": "2.7.1"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"production": [
|
"production": [
|
||||||
|
@ -66,6 +70,7 @@
|
||||||
"prism-react-renderer": "^1.2.1",
|
"prism-react-renderer": "^1.2.1",
|
||||||
"sass": "1.55.0",
|
"sass": "1.55.0",
|
||||||
"sass-loader": "^12.1.0",
|
"sass-loader": "^12.1.0",
|
||||||
|
"typedoc-github-wiki-theme": "^1.0.1",
|
||||||
"url-loader": "4.1.1"
|
"url-loader": "4.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,4 @@
|
||||||
// @ts-check
|
// @ts-check
|
||||||
/**
|
|
||||||
* Creating a sidebar enables you to:
|
|
||||||
- create an ordered group of docs
|
|
||||||
- render a sidebar for each doc of that group
|
|
||||||
- provide next/previous navigation
|
|
||||||
|
|
||||||
The sidebars can be generated from the filesystem, or explicitly defined here.
|
|
||||||
|
|
||||||
Create as many sidebars as you want.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
// By default, Docusaurus generates a sidebar from the docs folder structure
|
// By default, Docusaurus generates a sidebar from the docs folder structure
|
||||||
docs: [
|
docs: [
|
||||||
|
@ -17,8 +6,8 @@ module.exports = {
|
||||||
type: "category",
|
type: "category",
|
||||||
label: "Introduction",
|
label: "Introduction",
|
||||||
items: [
|
items: [
|
||||||
"what-is-verdaccio",
|
|
||||||
"installation",
|
"installation",
|
||||||
|
"what-is-verdaccio",
|
||||||
"cli",
|
"cli",
|
||||||
{
|
{
|
||||||
type: "category",
|
type: "category",
|
||||||
|
@ -33,10 +22,11 @@ module.exports = {
|
||||||
"verdaccio-programmatically",
|
"verdaccio-programmatically",
|
||||||
"security-policy",
|
"security-policy",
|
||||||
"logo",
|
"logo",
|
||||||
|
"third-party",
|
||||||
{
|
{
|
||||||
type: "category",
|
type: "category",
|
||||||
label: "Uses Cases",
|
label: "Uses Cases",
|
||||||
items: ["caching", "github-actions", "linking-remote-registry"]
|
items: ["caching", "linking-remote-registry"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "category",
|
type: "category",
|
||||||
|
@ -106,5 +96,17 @@ module.exports = {
|
||||||
label: "Guides",
|
label: "Guides",
|
||||||
items: ["aws"]
|
items: ["aws"]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
api: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
label: 'API Reference',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
type: 'autogenerated',
|
||||||
|
dirName: 'api'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
{
|
{
|
||||||
"extends": "@tsconfig/docusaurus/tsconfig.json",
|
"extends": "../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"allowJs": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"jsx": "react",
|
||||||
|
"lib": ["DOM"],
|
||||||
|
"noEmit": true,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"types": ["node", "@docusaurus/module-type-aliases"],
|
||||||
"downlevelIteration": true,
|
"downlevelIteration": true,
|
||||||
"plugins": [{ "name": "typescript-plugin-css-modules" }]
|
"plugins": [{ "name": "typescript-plugin-css-modules" }]
|
||||||
},
|
}
|
||||||
"include": ["src/**/*"]
|
|
||||||
}
|
}
|
8
website/types/patch.d.ts
vendored
Normal file
8
website/types/patch.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
declare module 'jest-matcher-utils';
|
||||||
|
declare module 'pretty-format' {
|
||||||
|
export type Plugin = any;
|
||||||
|
export type CompareKeys = any;
|
||||||
|
}
|
||||||
|
declare module '@jest/schemas' {
|
||||||
|
export type SnapshotFormat = any;
|
||||||
|
}
|
5
website/versioned_docs/version-5.x/api/node-api/index.md
Normal file
5
website/versioned_docs/version-5.x/api/node-api/index.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# 5.x API
|
||||||
|
|
||||||
|
Go to [Node-API](../../node-api.md).
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue