diff --git a/.changeset/stupid-rocks-fry.md b/.changeset/stupid-rocks-fry.md new file mode 100644 index 00000000..ae8d7e9d --- /dev/null +++ b/.changeset/stupid-rocks-fry.md @@ -0,0 +1,10 @@ +--- +'@verdaccio/file-locking': minor +'@verdaccio/types': minor +'verdaccio-aws-s3-storage': minor +'verdaccio-google-cloud': minor +'@verdaccio/local-storage': minor +'verdaccio-memory': minor +--- + +feat: refactor types and typescript 4 diff --git a/core/file-locking/src/utils.ts b/core/file-locking/src/utils.ts index 3a3a3e02..c173211a 100644 --- a/core/file-locking/src/utils.ts +++ b/core/file-locking/src/utils.ts @@ -7,7 +7,7 @@ export const statDir = (name: string): Promise => { return new Promise((resolve, reject): void => { // test to see if the directory exists const dirPath = path.dirname(name); - fs.stat(dirPath, function(err, stats) { + fs.stat(dirPath, function (err, stats) { if (err) { return reject(err); } else if (!stats.isDirectory()) { @@ -22,7 +22,7 @@ export const statDir = (name: string): Promise => { export const statfile = (name: string): Promise => { return new Promise((resolve, reject): void => { // test to see if the directory exists - fs.stat(name, function(err, stats) { + fs.stat(name, function (err, stats) { if (err) { return reject(err); } else if (!stats.isFile()) { @@ -50,7 +50,7 @@ export const lockfile = (name: string): Promise => { }; const lockFileName = `${name}.lock`; locker.lock(lockFileName, lockOpts, () => { - resolve(); + resolve(undefined); }); }); }; diff --git a/core/types/.gitignore b/core/types/.gitignore new file mode 100644 index 00000000..17c34101 --- /dev/null +++ b/core/types/.gitignore @@ -0,0 +1,2 @@ +docs/ +lib/ diff --git a/core/types/README.md b/core/types/README.md index 21b7141e..fe1425a5 100644 --- a/core/types/README.md +++ b/core/types/README.md @@ -1,8 +1,9 @@ -# Typescript types for Verdaccio +# Typescript types Typescript definitions for verdaccio plugins and internal code -# Typescript +## Usage + For usage with the library, the `tsconfig.json` should looks like this. ``` @@ -29,9 +30,9 @@ For usage with the library, the `tsconfig.json` should looks like this. } ``` -### Imports +### Example -``` +```typescript import type {ILocalData, LocalStorage, Logger, Config} from '@verdaccio/types'; class LocalData implements ILocalData { @@ -45,4 +46,4 @@ import type {ILocalData, LocalStorage, Logger, Config} from '@verdaccio/types'; } ``` - +#### Plugins diff --git a/core/types/index.d.ts b/core/types/index.d.ts deleted file mode 100644 index 912ff446..00000000 --- a/core/types/index.d.ts +++ /dev/null @@ -1,578 +0,0 @@ -// - -import { PassThrough } from 'stream'; - -declare module '@verdaccio/types' { - type StringValue = string | void | null; - - type StorageList = string[]; - type Callback = Function; - // FIXME: err should be something flexible enough for any implementation - type CallbackAction = (err: any | null) => void; - type CallbackError = (err: NodeJS.ErrnoException) => void; - interface Author { - name: string; - email?: string; - url?: string; - } - - interface Dist { - integrity?: string; - shasum: string; - tarball: string; - } - - interface RemoteUser { - real_groups: string[]; - groups: string[]; - name: string | void; - error?: string; - } - - interface LocalStorage { - list: any; - secret: string; - } - - interface Version { - name: string; - version: string; - devDependencies?: string; - directories?: any; - dist: Dist; - author: string | Author; - main: string; - homemage?: string; - license?: string; - readme: string; - readmeFileName?: string; - readmeFilename?: string; - description: string; - bin?: string; - bugs?: any; - files?: string[]; - gitHead?: string; - maintainers?: Author[]; - contributors?: Author[]; - repository?: string | any; - scripts?: any; - homepage?: string; - etag?: string; - dependencies: any; - keywords?: string | string[]; - nodeVersion?: string; - _id: string; - _npmVersion?: string; - _npmUser: Author; - _hasShrinkwrap?: boolean; - deprecated?: string; - } - - interface Logger { - child: (conf: any) => any; - debug: (conf: any, template?: string) => void; - error: (conf: any, template?: string) => void; - http: (conf: any, template?: string) => void; - trace: (conf: any, template?: string) => void; - warn: (conf: any, template?: string) => void; - info: (conf: any, template?: string) => void; - } - - interface Versions { - [key: string]: Version; - } - - interface DistFile { - url: string; - sha: string; - registry?: string; - } - - interface MergeTags { - [key: string]: string; - } - - interface DistFiles { - [key: string]: DistFile; - } - - interface AttachMents { - [key: string]: AttachMentsItem; - } - - interface AttachMentsItem { - content_type?: string; - data?: string; - length?: number; - shasum?: string; - version?: string; - } - - interface GenericBody { - [key: string]: string; - } - - interface UpLinkMetadata { - etag: string; - fetched: number; - } - - interface UpLinks { - [key: string]: UpLinkMetadata; - } - - interface Tags { - [key: string]: Version; - } - - interface Headers { - [key: string]: string; - } - - interface PackageUsers { - [key: string]: boolean; - } - - interface Package { - _id?: string; - name: string; - versions: Versions; - 'dist-tags': GenericBody; - time?: GenericBody; - readme?: string; - users?: PackageUsers; - _distfiles: DistFiles; - _attachments: AttachMents; - _uplinks: UpLinks; - _rev: string; - } - - class IUploadTarball extends PassThrough { - abort(): void; - done(): void; - } - - class IReadTarball extends PassThrough { - abort(): void; - } - - interface UpLinkTokenConf { - type: 'Bearer' | 'Basic'; - token?: string; - token_env?: boolean | string; - } - - interface UpLinkConf { - url: string; - ca?: string; - cache?: boolean; - timeout?: string | void; - maxage?: string | void; - max_fails?: number | void; - fail_timeout?: string | void; - headers?: Headers; - auth?: UpLinkTokenConf; - strict_ssl?: boolean | void; - _autogenerated?: boolean; - } - - interface AuthPluginPackage { - packageName: string; - packageVersion?: string; - tag?: string; - } - - interface PackageAccess { - storage?: string; - publish?: string[]; - proxy?: string[]; - access?: string[]; - } - - interface PackageList { - [key: string]: PackageAccess; - } - - interface UpLinksConfList { - [key: string]: UpLinkConf; - } - - type LoggerType = 'stdout' | 'stderr' | 'file'; - type LoggerFormat = 'pretty' | 'pretty-timestamped' | 'file'; - type LoggerLevel = 'http' | 'fatal' | 'warn' | 'info' | 'debug' | 'trace'; - - interface LoggerConfItem { - type: LoggerType; - format: LoggerFormat; - level: LoggerLevel; - } - - interface PublishOptions { - allow_offline: boolean; - } - - type AuthConf = any | AuthHtpasswd; - - interface AuthHtpasswd { - file: string; - max_users: number; - } - - interface Notifications { - method: string; - packagePattern: RegExp; - packagePatternFlags: string; - endpoint: string; - content: string; - headers: Headers; - } - - interface ConfigFile { - storage: string; - plugins: string; - self_path: string; - packages: PackageList; - uplinks: UpLinksConfList; - logs: LoggerConf[]; - web: WebConf; - auth: AuthConf; - publish?: PublishOptions; - url_prefix?: string; - listen?: ListenAddress; - https?: HttpsConf; - http_proxy?: string; - https_proxy?: string; - no_proxy?: string; - max_body_size?: string; - notifications: Notifications; - } - - interface Token { - user: string; - token: string; - key: string; - cidr?: string[]; - readonly: boolean; - created: number | string; - updated?: number | string; - } - - interface TokenFilter { - user: string; - } - - type SyncReturn = Error | void; - type IPackageStorage = ILocalPackageManager | void; - type IPackageStorageManager = ILocalPackageManager; - type IPluginStorage = ILocalData; - - interface AuthHtpasswd { - file: string; - max_users: number; - } - - interface ILocalStorage { - add(name: string): void; - remove(name: string): void; - get(): StorageList; - sync(): void; - } - - interface LoggerConf { - [key: string]: LoggerConfItem; - } - - interface ListenAddress { - [key: string]: string; - } - - interface WebConf { - enable?: boolean; - title?: string; - logo?: string; - favicon?: string; - gravatar?: boolean; - sort_packages?: string; - rateLimit?: RateLimit; - } - - interface HttpsConfKeyCert { - key: string; - cert: string; - ca?: string; - } - - interface HttpsConfPfx { - pfx: string; - passphrase?: string; - } - - type HttpsConf = HttpsConfKeyCert | HttpsConfPfx; - - interface JWTOptions { - sign: JWTSignOptions; - verify: JWTVerifyOptions; - } - - interface JWTVerifyOptions { - algorithm?: string; - expiresIn?: string; - notBefore?: string | number; - ignoreExpiration?: boolean; - maxAge?: string | number; - clockTimestamp?: number; - } - - interface JWTSignOptions { - algorithm?: string; - expiresIn?: string; - notBefore?: string; - ignoreExpiration?: boolean; - maxAge?: string | number; - clockTimestamp?: number; - } - - interface APITokenOptions { - legacy: boolean; - jwt?: JWTOptions; - } - - type RateLimit = { - windowMs?: number; - max?: number; - }; - - interface Security { - web: JWTOptions; - api: APITokenOptions; - } - - export type ServerSettingsConf = { - // express-rate-limit settings - rateLimit: RateLimit; - keepAliveTimeout?: number; - }; - - interface ConfigYaml { - _debug?: boolean; - storage?: string | void; - packages: PackageList; - uplinks: UpLinksConfList; - // FUTURE: log should be mandatory - logs?: LoggerConfItem; - web?: WebConf; - auth?: AuthConf; - security: Security; - publish?: PublishOptions; - store?: any; - listen?: ListenAddress; - https?: HttpsConf; - http_proxy?: string; - plugins?: string | void; - https_proxy?: string; - no_proxy?: string; - max_body_size?: string; - notifications?: Notifications; - notify?: Notifications | Notifications[]; - middlewares?: any; - filters?: any; - url_prefix?: string; - server?: ServerSettingsConf; - } - - interface ConfigRuntime extends ConfigYaml { - // @deprecated on v6 this is config_path - self_path: string; - } - - interface Config extends ConfigYaml, ConfigRuntime { - user_agent?: string | boolean; - server_id: string; - secret: string; - // deprecated - checkSecretKey(token: string): string; - getMatchedPackagesSpec(storage: string): PackageAccess | void; - [key: string]: any; - } - - interface ConfigWithHttps extends Config { - https: HttpsConf; - } - - interface ITokenActions { - saveToken(token: Token): Promise; - deleteToken(user: string, tokenKey: string): Promise; - readTokens(filter: TokenFilter): Promise; - } - - /** - * This method expect return a Package object - * eg: - * { - * name: string; - * time: number; - * ... and other props - * } - * - * The `cb` callback object will be executed if: - * - it might return object (truly) - * - it might reutrn null - */ - type onSearchPackage = (item: Package, cb: CallbackAction) => void; - // FIXME: error should be export type `VerdaccioError = HttpError & { code: number };` - // but this type is on @verdaccio/commons-api and cannot be used here yet - type onEndSearchPackage = (error?: any) => void; - type onValidatePackage = (name: string) => boolean; - - interface ILocalData extends IPlugin, ITokenActions { - logger: Logger; - config: T & Config; - add(name: string, callback: Callback): void; - remove(name: string, callback: Callback): void; - get(callback: Callback): void; - getSecret(): Promise; - setSecret(secret: string): Promise; - getPackageStorage(packageInfo: string): IPackageStorage; - search( - onPackage: onSearchPackage, - onEnd: onEndSearchPackage, - validateName: onValidatePackage - ): void; - } - - type StorageUpdateCallback = (data: Package, cb: CallbackAction) => void; - type StorageUpdateHandler = (name: string, cb: StorageUpdateCallback) => void; - type StorageWriteCallback = (name: string, json: Package, callback: Callback) => void; - type PackageTransformer = (pkg: Package) => Package; - type ReadPackageCallback = (err: any | null, data?: Package) => void; - - interface ILocalPackageManager { - logger: Logger; - writeTarball(pkgName: string): IUploadTarball; - readTarball(pkgName: string): IReadTarball; - readPackage(fileName: string, callback: ReadPackageCallback): void; - createPackage(pkgName: string, value: Package, cb: CallbackAction): void; - deletePackage(fileName: string, callback: CallbackAction): void; - removePackage(callback: CallbackAction): void; - updatePackage( - pkgFileName: string, - updateHandler: StorageUpdateCallback, - onWrite: StorageWriteCallback, - transformPackage: PackageTransformer, - onEnd: CallbackAction - ): void; - savePackage(fileName: string, json: Package, callback: CallbackAction): void; - } - - interface TarballActions { - addTarball(name: string, filename: string): IUploadTarball; - getTarball(name: string, filename: string): IReadTarball; - removeTarball(name: string, filename: string, revision: string, callback: Callback): void; - } - - interface StoragePackageActions extends TarballActions { - addVersion( - name: string, - version: string, - metadata: Version, - tag: StringValue, - callback: Callback - ): void; - mergeTags(name: string, tags: MergeTags, callback: Callback): void; - removePackage(name: string, callback: Callback): void; - changePackage(name: string, metadata: Package, revision: string, callback: Callback): void; - } - - interface IStorageManager extends StoragePackageActions { - config: T & Config; - logger: Logger; - init(config: T & Config, filters: any): Promise; - addPackage(name: string, metadata: any, callback: Callback): Promise; - getPackage(options: any): void; - search(startkey: string, options: any): IReadTarball; - getLocalDatabase(callback: Callback): void; - } - - interface IBasicStorage extends StoragePackageActions { - addPackage(name: string, info: Package, callback: Callback): void; - updateVersions(name: string, packageInfo: Package, callback: Callback): void; - getPackageMetadata(name: string, callback: Callback): void; - search(startKey: string, options: any): IReadTarball; - getSecret(config: T & Config): Promise; - } - - interface IBasicAuth { - 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; - } - - class Plugin { - constructor(config: T, options: PluginOptions); - } - - interface IPlugin { - version?: string; - // In case a plugin needs to be cleaned up/removed - close?(): void; - } - - interface PluginOptions { - config: T & Config; - logger: Logger; - } - - interface AllowAccess { - name: string; - version?: string; - tag?: string; - } - - // FIXME: error should be export type `VerdaccioError = HttpError & { code: number };` instead of AuthError - // but this type is on @verdaccio/commons-api and cannot be used here yet (I don't know why) - interface HttpError extends Error { - status: number; - statusCode: number; - expose: boolean; - headers?: { - [key: string]: string; - }; - [key: string]: any; - } - - type AuthError = HttpError & { code: number }; - type AuthAccessCallback = (error: AuthError | null, access: boolean) => void; - type AuthCallback = (error: AuthError | null, groups: string[] | false) => void; - - interface IPluginAuth extends IPlugin { - 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; - } - - interface IPluginMiddleware extends IPlugin { - register_middlewares(app: any, auth: IBasicAuth, storage: IStorageManager): void; - } - - interface IPluginStorageFilter extends IPlugin { - filter_metadata(packageInfo: Package): Promise; - } -} diff --git a/core/types/package.json b/core/types/package.json index 4140958c..9efae36e 100644 --- a/core/types/package.json +++ b/core/types/package.json @@ -10,6 +10,7 @@ "author": "Juan Picado ", "license": "MIT", "homepage": "https://verdaccio.org", + "files": ["./build"], "repository": { "type": "git", "url": "https://github.com/verdaccio/monorepo", @@ -21,14 +22,19 @@ "publishConfig": { "access": "public" }, - "main": "index.d.ts", - "types": "index.d.ts", + "main": "build/types.d.ts", + "types": "build/types.d.ts", "scripts": { + "clean": "rimraf ./build", "test": "exit 0", - "build": "exit 0" + "build": "tsc --emitDeclarationOnly -p tsconfig.json", + "docs": "typedoc --options ./typedoc.json --excludeExternals" }, "devDependencies": { - "@types/node": "14.18.0" + "@types/node": "12.12.6", + "typedoc": "^0.22.17", + "typedoc-plugin-missing-exports": "^0.22.6", + "typedoc-umlclass": "^0.6.1" }, "funding": { "type": "opencollective", diff --git a/core/types/src/commons.ts b/core/types/src/commons.ts new file mode 100644 index 00000000..e5d4cb68 --- /dev/null +++ b/core/types/src/commons.ts @@ -0,0 +1,25 @@ +export type Callback = Function; +// FIXME: err should be something flexible enough for any implementation +export type CallbackAction = (err: any | null) => void; +export type CallbackError = (err: NodeJS.ErrnoException) => void; + +export interface RemoteUser { + real_groups: string[]; + groups: string[]; + name: string | void; + error?: string; +} + +export type StringValue = string | void | null; + +// FIXME: error should be export type `VerdaccioError = HttpError & { code: number };` instead of AuthError +// but this type is on @verdaccio/commons-api and cannot be used here yet (I don't know why) +export interface HttpError extends Error { + status: number; + statusCode: number; + expose: boolean; + headers?: { + [key: string]: string; + }; + [key: string]: any; +} diff --git a/core/types/src/configuration.ts b/core/types/src/configuration.ts new file mode 100644 index 00000000..9465126c --- /dev/null +++ b/core/types/src/configuration.ts @@ -0,0 +1,188 @@ +import { PackageAccess, PackageList } from './manifest'; + +export type TypeToken = 'Bearer' | 'Basic'; + +export interface Logger { + child: (conf: any) => any; + debug: (conf: any, template?: string) => void; + error: (conf: any, template?: string) => void; + http: (conf: any, template?: string) => void; + trace: (conf: any, template?: string) => void; + warn: (conf: any, template?: string) => void; + info: (conf: any, template?: string) => void; +} + +export type LoggerType = 'stdout' | 'stderr' | 'file'; +export type LoggerFormat = 'pretty' | 'pretty-timestamped' | 'file'; +export type LoggerLevel = 'http' | 'fatal' | 'warn' | 'info' | 'debug' | 'trace'; + +export interface ConfigWithHttps extends Config { + https: HttpsConf; +} + +export interface LoggerConfItem { + type: LoggerType; + format: LoggerFormat; + level: LoggerLevel; +} + +export interface Headers { + [key: string]: string; +} + +export interface UpLinkTokenConf { + type: TypeToken; + token?: string; + token_env?: boolean | string; +} + +export interface UpLinkConf { + url: string; + ca?: string; + cache?: boolean; + timeout?: string | void; + maxage?: string | void; + max_fails?: number | void; + fail_timeout?: string | void; + headers?: Headers; + auth?: UpLinkTokenConf; + strict_ssl?: boolean | void; + _autogenerated?: boolean; +} + +export type RateLimit = { + windowMs?: number; + max?: number; +}; + +export interface WebConf { + enable?: boolean; + title?: string; + logo?: string; + favicon?: string; + gravatar?: boolean; + sort_packages?: string; + rateLimit?: RateLimit; +} + +export interface UpLinksConfList { + [key: string]: UpLinkConf; +} + +export interface AuthHtpasswd { + file: string; + max_users: number; +} + +export type AuthConf = any | AuthHtpasswd; + +export interface JWTOptions { + sign: JWTSignOptions; + verify: JWTVerifyOptions; +} + +export interface JWTSignOptions { + algorithm?: string; + expiresIn?: string; + notBefore?: string; + ignoreExpiration?: boolean; + maxAge?: string | number; + clockTimestamp?: number; +} + +export interface JWTVerifyOptions { + algorithm?: string; + expiresIn?: string; + notBefore?: string | number; + ignoreExpiration?: boolean; + maxAge?: string | number; + clockTimestamp?: number; +} + +export interface APITokenOptions { + legacy: boolean; + jwt?: JWTOptions; +} + +export interface Security { + web: JWTOptions; + api: APITokenOptions; +} + +export interface PublishOptions { + allow_offline: boolean; +} + +export interface ListenAddress { + [key: string]: string; +} + +export interface HttpsConfKeyCert { + key: string; + cert: string; + ca?: string; +} + +export interface HttpsConfPfx { + pfx: string; + passphrase?: string; +} + +export type HttpsConf = HttpsConfKeyCert | HttpsConfPfx; + +export interface Notifications { + method: string; + packagePattern: RegExp; + packagePatternFlags: string; + endpoint: string; + content: string; + headers: Headers; +} + +export type ServerSettingsConf = { + // express-rate-limit settings + rateLimit: RateLimit; + keepAliveTimeout?: number; +}; + +export interface ConfigYaml { + _debug?: boolean; + storage?: string | void; + packages: PackageList; + uplinks: UpLinksConfList; + // FUTURE: log should be mandatory + logs?: LoggerConfItem; + web?: WebConf; + auth?: AuthConf; + security: Security; + publish?: PublishOptions; + store?: any; + listen?: ListenAddress; + https?: HttpsConf; + http_proxy?: string; + plugins?: string | void; + https_proxy?: string; + no_proxy?: string; + max_body_size?: string; + notifications?: Notifications; + notify?: Notifications | Notifications[]; + middlewares?: any; + filters?: any; + url_prefix?: string; + server?: ServerSettingsConf; +} + +export interface ConfigRuntime extends ConfigYaml { + // @deprecated on v6 this is config_path + self_path: string; +} + +export interface Config extends ConfigYaml, ConfigRuntime { + user_agent?: string | boolean; + server_id: string; + secret: string; + // deprecated + checkSecretKey(token: string): string; + getMatchedPackagesSpec(storage: string): PackageAccess | void; + [key: string]: any; +} diff --git a/core/types/src/manifest.ts b/core/types/src/manifest.ts new file mode 100644 index 00000000..2aab2955 --- /dev/null +++ b/core/types/src/manifest.ts @@ -0,0 +1,130 @@ +export interface PackageAccess { + storage?: string; + publish?: string[]; + proxy?: string[]; + access?: string[]; +} + +export interface PackageList { + [key: string]: PackageAccess; +} + +export interface MergeTags { + [key: string]: string; +} + +export interface DistFile { + url: string; + sha: string; + registry?: string; +} + +export interface DistFiles { + [key: string]: DistFile; +} + +export interface Token { + user: string; + token: string; + key: string; + cidr?: string[]; + readonly: boolean; + created: number | string; + updated?: number | string; +} + +export interface AttachMents { + [key: string]: AttachMentsItem; +} + +export interface AttachMentsItem { + content_type?: string; + data?: string; + length?: number; + shasum?: string; + version?: string; +} + +export interface GenericBody { + [key: string]: string; +} + +export interface UpLinkMetadata { + etag: string; + fetched: number; +} + +export interface UpLinks { + [key: string]: UpLinkMetadata; +} + +export interface Dist { + integrity?: string; + shasum: string; + tarball: string; +} + +export interface Author { + name: string; + email?: string; + url?: string; +} + +export interface PackageUsers { + [key: string]: boolean; +} + +export interface Version { + name: string; + version: string; + devDependencies?: string; + directories?: any; + dist: Dist; + author: string | Author; + main: string; + homemage?: string; + license?: string; + readme: string; + readmeFileName?: string; + readmeFilename?: string; + description: string; + bin?: string; + bugs?: any; + files?: string[]; + gitHead?: string; + maintainers?: Author[]; + contributors?: Author[]; + repository?: string | any; + scripts?: any; + homepage?: string; + etag?: string; + dependencies: any; + keywords?: string | string[]; + nodeVersion?: string; + _id: string; + _npmVersion?: string; + _npmUser: Author; + _hasShrinkwrap?: boolean; + deprecated?: string; +} + +export interface Versions { + [key: string]: Version; +} + +// @deprecated +export type Package = Manifest; + +export interface Manifest { + _id?: string; + name: string; + versions: Versions; + 'dist-tags': GenericBody; + time?: GenericBody; + readme?: string; + users?: PackageUsers; + _distfiles: DistFiles; + _attachments: AttachMents; + _uplinks: UpLinks; + _rev: string; +} diff --git a/core/types/src/plugins/auth.ts b/core/types/src/plugins/auth.ts new file mode 100644 index 00000000..d1df0f42 --- /dev/null +++ b/core/types/src/plugins/auth.ts @@ -0,0 +1,21 @@ +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; + +export interface IBasicAuth { + 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; +} diff --git a/core/types/src/plugins/commons.ts b/core/types/src/plugins/commons.ts new file mode 100644 index 00000000..6d415ce2 --- /dev/null +++ b/core/types/src/plugins/commons.ts @@ -0,0 +1,15 @@ +import { Config, Logger } from '../configuration'; + +export class Plugin { + public constructor(config: T, options: PluginOptions) {} +} + +export interface IPlugin { + // TODO: not used on core yet + version?: string; +} + +export interface PluginOptions { + config: T & Config; + logger: Logger; +} diff --git a/core/types/src/plugins/filter.ts b/core/types/src/plugins/filter.ts new file mode 100644 index 00000000..f63e2870 --- /dev/null +++ b/core/types/src/plugins/filter.ts @@ -0,0 +1,6 @@ +import { Package } from '../manifest'; +import { IPlugin } from './commons'; + +export interface IPluginStorageFilter extends IPlugin { + filter_metadata(packageInfo: Package): Promise; +} diff --git a/core/types/src/plugins/index.ts b/core/types/src/plugins/index.ts new file mode 100644 index 00000000..43f69281 --- /dev/null +++ b/core/types/src/plugins/index.ts @@ -0,0 +1,41 @@ +import { RemoteUser } from '../commons'; +import { PackageAccess } from '../manifest'; +import { AuthAccessCallback, AuthCallback } from './auth'; +import { IPlugin } from './commons'; + +export interface AllowAccess { + name: string; + version?: string; + tag?: string; +} + +/** + * ```typescript + * dasdsadsa() + * ``` + */ +export interface IPluginAuth extends IPlugin { + /** + * @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 './middleware'; +export * from './commons'; +export * from './filter'; diff --git a/core/types/src/plugins/middleware.ts b/core/types/src/plugins/middleware.ts new file mode 100644 index 00000000..831d2454 --- /dev/null +++ b/core/types/src/plugins/middleware.ts @@ -0,0 +1,8 @@ +import { Config } from '../configuration'; +import { IBasicAuth } from './auth'; +import { IPlugin } from './commons'; +import { IStorageManager } from './storage'; + +export interface IPluginMiddleware extends IPlugin { + register_middlewares(app: any, auth: IBasicAuth, storage: IStorageManager): void; +} diff --git a/core/types/src/plugins/storage.ts b/core/types/src/plugins/storage.ts new file mode 100644 index 00000000..13d3b784 --- /dev/null +++ b/core/types/src/plugins/storage.ts @@ -0,0 +1,138 @@ +import { PassThrough } from 'stream'; +import { Callback, CallbackAction, StringValue } from '../commons'; +import { Config, Logger } from '../configuration'; +import { MergeTags, Package, Token, Version } from '../manifest'; +import { IPlugin } from './commons'; + +export class IUploadTarball extends PassThrough { + public abort(): void {} + public done(): void {} +} + +export class IReadTarball extends PassThrough { + public abort(): void {} +} + +export type StorageList = string[]; + +export interface LocalStorage { + list: any; + secret: string; +} + +export interface ILocalStorage { + add(name: string): void; + remove(name: string): void; + get(): StorageList; + sync(): void; +} + +interface TarballActions { + addTarball(name: string, filename: string): IUploadTarball; + getTarball(name: string, filename: string): IReadTarball; + removeTarball(name: string, filename: string, revision: string, callback: Callback): void; +} + +interface StoragePackageActions extends TarballActions { + addVersion( + name: string, + version: string, + metadata: Version, + tag: StringValue, + callback: Callback + ): void; + mergeTags(name: string, tags: MergeTags, callback: Callback): void; + removePackage(name: string, callback: Callback): void; + changePackage(name: string, metadata: Package, revision: string, callback: Callback): void; +} + +export interface IStorageManager extends StoragePackageActions { + config: T & Config; + logger: Logger; + init(config: T & Config, filters: any): Promise; + addPackage(name: string, metadata: any, callback: Callback): Promise; + getPackage(options: any): void; + search(startkey: string, options: any): IReadTarball; + getLocalDatabase(callback: Callback): void; +} + +export interface IBasicStorage extends StoragePackageActions { + addPackage(name: string, info: Package, callback: Callback): void; + updateVersions(name: string, packageInfo: Package, callback: Callback): void; + getPackageMetadata(name: string, callback: Callback): void; + search(startKey: string, options: any): IReadTarball; + getSecret(config: T & Config): Promise; +} + +export interface TokenFilter { + user: string; +} + +export interface ITokenActions { + saveToken(token: Token): Promise; + deleteToken(user: string, tokenKey: string): Promise; + readTokens(filter: TokenFilter): Promise; +} +/** + * This method expect return a Package object + * eg: + * { + * name: string; + * time: number; + * ... and other props + * } + * + * The `cb` callback object will be executed if: + * - it might return object (truly) + * - it might reutrn null + */ +export type onSearchPackage = (item: Package, cb: CallbackAction) => void; +// FIXME: error should be export type `VerdaccioError = HttpError & { code: number };` +// but this type is on @verdaccio/commons-api and cannot be used here yet +export type onEndSearchPackage = (error?: any) => void; +export type onValidatePackage = (name: string) => boolean; + +export type StorageUpdateCallback = (data: Package, cb: CallbackAction) => void; + +export type StorageWriteCallback = (name: string, json: Package, callback: Callback) => void; +export type PackageTransformer = (pkg: Package) => Package; +export type ReadPackageCallback = (err: any | null, data?: Package) => void; + +export interface ILocalPackageManager { + logger: Logger; + writeTarball(pkgName: string): IUploadTarball; + readTarball(pkgName: string): IReadTarball; + readPackage(fileName: string, callback: ReadPackageCallback): void; + createPackage(pkgName: string, value: Package, cb: CallbackAction): void; + deletePackage(fileName: string, callback: CallbackAction): void; + removePackage(callback: CallbackAction): void; + updatePackage( + pkgFileName: string, + updateHandler: StorageUpdateCallback, + onWrite: StorageWriteCallback, + transformPackage: PackageTransformer, + onEnd: CallbackAction + ): void; + savePackage(fileName: string, json: Package, callback: CallbackAction): void; +} + +export type IPackageStorage = ILocalPackageManager | void; + +export type IPluginStorage = ILocalData; +export type IPackageStorageManager = ILocalPackageManager; + +export interface ILocalData extends IPlugin, ITokenActions { + logger: Logger; + config: T & Config; + add(name: string, callback: Callback): void; + remove(name: string, callback: Callback): void; + get(callback: Callback): void; + getSecret(): Promise; + setSecret(secret: string): Promise; + getPackageStorage(packageInfo: string): IPackageStorage; + search( + onPackage: onSearchPackage, + onEnd: onEndSearchPackage, + validateName: onValidatePackage + ): void; +} diff --git a/core/types/src/plugins/theme.ts b/core/types/src/plugins/theme.ts new file mode 100644 index 00000000..e69de29b diff --git a/core/types/src/types.ts b/core/types/src/types.ts new file mode 100644 index 00000000..cf18c6b0 --- /dev/null +++ b/core/types/src/types.ts @@ -0,0 +1,4 @@ +export * from './plugins'; +export * from './manifest'; +export * from './commons'; +export * from './configuration'; diff --git a/core/types/tsconfig.json b/core/types/tsconfig.json new file mode 100644 index 00000000..086613ea --- /dev/null +++ b/core/types/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "noImplicitAny": false, + "strict": true, + "declaration": true, + "strictNullChecks": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "rootDir": "./src", + "outDir": "./build" + } +} diff --git a/core/types/typedoc.json b/core/types/typedoc.json new file mode 100644 index 00000000..3e320f06 --- /dev/null +++ b/core/types/typedoc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["src/types.ts"], + "sort": ["source-order"] +} diff --git a/package.json b/package.json index a1ca5bf1..de3c1e9f 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "lodash": "4.17.21", "prettier": "2.6.2", "snyk": "1.946.0", - "typescript": "3.9.10" + "typescript": "4.7.3" }, "scripts": { "changeset": "changeset", diff --git a/plugins/aws-s3-storage/src/index.ts b/plugins/aws-s3-storage/src/index.ts index 392a82b1..a8f038fb 100644 --- a/plugins/aws-s3-storage/src/index.ts +++ b/plugins/aws-s3-storage/src/index.ts @@ -47,7 +47,10 @@ export default class S3Database implements IPluginStorage { this._localData = null; this.config.keyPrefix = addTrailingSlash(configKeyPrefix); - this.logger.debug({ config: JSON.stringify(this.config, null, 4) }, 's3: configuration: @{config}'); + this.logger.debug( + { config: JSON.stringify(this.config, null, 4) }, + 's3: configuration: @{config}' + ); this.s3 = new S3({ endpoint: this.config.endpoint, @@ -70,7 +73,7 @@ export default class S3Database implements IPluginStorage { public add(name: string, callback: Callback): void { this.logger.debug({ name }, 's3: [add] private package @{name}'); - this._getData().then(async data => { + this._getData().then(async (data) => { if (data.list.indexOf(name) === -1) { data.list.push(name); this.logger.trace({ name }, 's3: [add] @{name} has been added'); @@ -98,7 +101,10 @@ export default class S3Database implements IPluginStorage { private async _fetchPackageInfo(onPackage: Function, packageName: string): Promise { const { bucket, keyPrefix } = this.config; this.logger.debug({ packageName }, 's3: [_fetchPackageInfo] @{packageName}'); - this.logger.trace({ keyPrefix, bucket }, 's3: [_fetchPackageInfo] bucket: @{bucket} prefix: @{keyPrefix}'); + this.logger.trace( + { keyPrefix, bucket }, + 's3: [_fetchPackageInfo] bucket: @{bucket} prefix: @{keyPrefix}' + ); return new Promise((resolve): void => { this.s3.headObject( { @@ -112,7 +118,10 @@ export default class S3Database implements IPluginStorage { } if (response.LastModified) { const { LastModified } = response; - this.logger.trace({ LastModified }, 's3: [_fetchPackageInfo] LastModified: @{LastModified}'); + this.logger.trace( + { LastModified }, + 's3: [_fetchPackageInfo] LastModified: @{LastModified}' + ); return onPackage( { name: packageName, @@ -157,28 +166,31 @@ export default class S3Database implements IPluginStorage { public get(callback: Callback): void { this.logger.debug('s3: [get]'); - this._getData().then(data => callback(null, data.list)); + this._getData().then((data) => callback(null, data.list)); } // Create/write database file to s3 private async _sync(): Promise { await new Promise((resolve, reject): void => { const { bucket, keyPrefix } = this.config; - this.logger.debug({ keyPrefix, bucket }, 's3: [_sync] bucket: @{bucket} prefix: @{keyPrefix}'); + this.logger.debug( + { keyPrefix, bucket }, + 's3: [_sync] bucket: @{bucket} prefix: @{keyPrefix}' + ); this.s3.putObject( { Bucket: this.config.bucket, Key: `${this.config.keyPrefix}verdaccio-s3-db.json`, Body: JSON.stringify(this._localData), }, - err => { + (err) => { if (err) { this.logger.error({ err }, 's3: [_sync] error: @{err}'); reject(err); return; } this.logger.debug('s3: [_sync] sucess'); - resolve(); + resolve(undefined); } ); }); @@ -195,7 +207,10 @@ export default class S3Database implements IPluginStorage { if (!this._localData) { this._localData = await new Promise((resolve, reject): void => { const { bucket, keyPrefix } = this.config; - this.logger.debug({ keyPrefix, bucket }, 's3: [_getData] bucket: @{bucket} prefix: @{keyPrefix}'); + this.logger.debug( + { keyPrefix, bucket }, + 's3: [_getData] bucket: @{bucket} prefix: @{keyPrefix}' + ); this.logger.trace('s3: [_getData] get database object'); this.s3.getObject( { diff --git a/plugins/aws-s3-storage/src/s3PackageManager.ts b/plugins/aws-s3-storage/src/s3PackageManager.ts index edc0cca6..26a365d2 100644 --- a/plugins/aws-s3-storage/src/s3PackageManager.ts +++ b/plugins/aws-s3-storage/src/s3PackageManager.ts @@ -1,7 +1,14 @@ import { S3, AWSError } from 'aws-sdk'; import { UploadTarball, ReadTarball } from '@verdaccio/streams'; import { HEADERS, HTTP_STATUS, VerdaccioError } from '@verdaccio/commons-api'; -import { Callback, Logger, Package, ILocalPackageManager, CallbackAction, ReadPackageCallback } from '@verdaccio/types'; +import { + Callback, + Logger, + Package, + ILocalPackageManager, + CallbackAction, + ReadPackageCallback, +} from '@verdaccio/types'; import { HttpError } from 'http-errors'; import { is404Error, convertS3Error, create409Error } from './s3Errors'; @@ -23,18 +30,51 @@ export default class S3PackageManager implements ILocalPackageManager { this.config = config; this.packageName = packageName; this.logger = logger; - const { endpoint, region, s3ForcePathStyle, accessKeyId, secretAccessKey, sessionToken, tarballACL } = config; + const { + endpoint, + region, + s3ForcePathStyle, + accessKeyId, + secretAccessKey, + sessionToken, + tarballACL, + } = config; this.tarballACL = tarballACL || 'private'; - this.s3 = new S3({ endpoint, region, s3ForcePathStyle, accessKeyId, secretAccessKey, sessionToken }); - this.logger.trace({ packageName }, 's3: [S3PackageManager constructor] packageName @{packageName}'); + this.s3 = new S3({ + endpoint, + region, + s3ForcePathStyle, + accessKeyId, + secretAccessKey, + sessionToken, + }); + this.logger.trace( + { packageName }, + 's3: [S3PackageManager constructor] packageName @{packageName}' + ); this.logger.trace({ endpoint }, 's3: [S3PackageManager constructor] endpoint @{endpoint}'); this.logger.trace({ region }, 's3: [S3PackageManager constructor] region @{region}'); - this.logger.trace({ s3ForcePathStyle }, 's3: [S3PackageManager constructor] s3ForcePathStyle @{s3ForcePathStyle}'); - this.logger.trace({ tarballACL }, 's3: [S3PackageManager constructor] tarballACL @{tarballACL}'); - this.logger.trace({ accessKeyId }, 's3: [S3PackageManager constructor] accessKeyId @{accessKeyId}'); - this.logger.trace({ secretAccessKey }, 's3: [S3PackageManager constructor] secretAccessKey @{secretAccessKey}'); - this.logger.trace({ sessionToken }, 's3: [S3PackageManager constructor] sessionToken @{sessionToken}'); + this.logger.trace( + { s3ForcePathStyle }, + 's3: [S3PackageManager constructor] s3ForcePathStyle @{s3ForcePathStyle}' + ); + this.logger.trace( + { tarballACL }, + 's3: [S3PackageManager constructor] tarballACL @{tarballACL}' + ); + this.logger.trace( + { accessKeyId }, + 's3: [S3PackageManager constructor] accessKeyId @{accessKeyId}' + ); + this.logger.trace( + { secretAccessKey }, + 's3: [S3PackageManager constructor] secretAccessKey @{secretAccessKey}' + ); + this.logger.trace( + { sessionToken }, + 's3: [S3PackageManager constructor] sessionToken @{sessionToken}' + ); const packageAccess = this.config.getMatchedPackagesSpec(packageName); if (packageAccess) { @@ -57,9 +97,12 @@ export default class S3PackageManager implements ILocalPackageManager { (async (): Promise => { try { const json = await this._getData(); - updateHandler(json, err => { + updateHandler(json, (err) => { if (err) { - this.logger.error({ err }, 's3: [S3PackageManager updatePackage updateHandler onEnd] @{err}'); + this.logger.error( + { err }, + 's3: [S3PackageManager updatePackage updateHandler onEnd] @{err}' + ); onEnd(err); } else { const transformedPackage = transformPackage(json); @@ -71,7 +114,10 @@ export default class S3PackageManager implements ILocalPackageManager { } }); } catch (err) { - this.logger.error({ err }, 's3: [S3PackageManager updatePackage updateHandler onEnd catch] @{err}'); + this.logger.error( + { err }, + 's3: [S3PackageManager updatePackage updateHandler onEnd catch] @{err}' + ); return onEnd(err); } @@ -118,7 +164,7 @@ export default class S3PackageManager implements ILocalPackageManager { Bucket: this.config.bucket, Key: `${this.packagePath}/${fileName}`, }, - err => { + (err) => { if (err) { callback(err); } else { @@ -135,7 +181,7 @@ export default class S3PackageManager implements ILocalPackageManager { Bucket: this.config.bucket, Prefix: addTrailingSlash(this.packagePath), }, - function(err) { + function (err) { if (err && is404Error(err as VerdaccioError)) { callback(null); } else { @@ -161,11 +207,20 @@ export default class S3PackageManager implements ILocalPackageManager { const s3Err = convertS3Error(err); // only allow saving if this file doesn't exist already if (is404Error(s3Err)) { - this.logger.debug({ s3Err }, 's3: [S3PackageManager createPackage] 404 package not found]'); + this.logger.debug( + { s3Err }, + 's3: [S3PackageManager createPackage] 404 package not found]' + ); this.savePackage(name, value, callback); - this.logger.trace({ data }, 's3: [S3PackageManager createPackage] package saved data from s3: @{data}'); + this.logger.trace( + { data }, + 's3: [S3PackageManager createPackage] package saved data from s3: @{data}' + ); } else { - this.logger.error({ s3Err: s3Err.message }, 's3: [S3PackageManager createPackage error] @s3Err'); + this.logger.error( + { s3Err: s3Err.message }, + 's3: [S3PackageManager createPackage error] @s3Err' + ); callback(s3Err); } } else { @@ -206,7 +261,7 @@ export default class S3PackageManager implements ILocalPackageManager { 's3: [S3PackageManager readPackage] packageName: @{packageName} / data @{data}' ); callback(null, data); - } catch (err) { + } catch (err: any) { this.logger.error({ err: err.message }, 's3: [S3PackageManager readPackage] @{err}'); callback(err); } @@ -242,10 +297,13 @@ export default class S3PackageManager implements ILocalPackageManager { Bucket: this.config.bucket, Key: `${this.packagePath}/${name}`, }, - err => { + (err) => { if (err) { const convertedErr = convertS3Error(err); - this.logger.error({ error: convertedErr.message }, 's3: [S3PackageManager writeTarball headObject] @{error}'); + this.logger.error( + { error: convertedErr.message }, + 's3: [S3PackageManager writeTarball headObject] @{error}' + ); if (is404Error(convertedErr) === false) { this.logger.error( @@ -279,11 +337,14 @@ export default class S3PackageManager implements ILocalPackageManager { 's3: [S3PackageManager writeTarball managedUpload send] response @{data}' ); - resolve(); + resolve(undefined); } }); - this.logger.debug({ name }, 's3: [S3PackageManager writeTarball uploadStream] emit open @{name}'); + this.logger.debug( + { name }, + 's3: [S3PackageManager writeTarball uploadStream] emit open @{name}' + ); uploadStream.emit('open'); }); @@ -292,12 +353,17 @@ export default class S3PackageManager implements ILocalPackageManager { try { await promise; - this.logger.debug('s3: [S3PackageManager writeTarball uploadStream done] emit success'); + this.logger.debug( + 's3: [S3PackageManager writeTarball uploadStream done] emit success' + ); uploadStream.emit('success'); } catch (err) { // already emitted in the promise above, necessary because of some issues // with promises in jest - this.logger.error({ err }, 's3: [S3PackageManager writeTarball uploadStream done] error @{err}'); + this.logger.error( + { err }, + 's3: [S3PackageManager writeTarball uploadStream done] error @{err}' + ); } }; if (streamEnded) { @@ -320,7 +386,7 @@ export default class S3PackageManager implements ILocalPackageManager { try { this.logger.debug('s3: [S3PackageManager writeTarball managedUpload abort]'); managedUpload.abort(); - } catch (err) { + } catch (err: any) { const error: HttpError = convertS3Error(err); uploadStream.emit('error', error); @@ -339,7 +405,10 @@ export default class S3PackageManager implements ILocalPackageManager { }; } } else { - this.logger.debug({ name }, 's3: [S3PackageManager writeTarball headObject] emit error @{name} 409'); + this.logger.debug( + { name }, + 's3: [S3PackageManager writeTarball headObject] emit error @{name} 409' + ); uploadStream.emit('error', create409Error()); } @@ -375,7 +444,10 @@ export default class S3PackageManager implements ILocalPackageManager { { name, packageName: this.packageName }, 's3: [S3PackageManager readTarball httpHeaders] name @{name}/@{packageName}' ); - this.logger.trace({ headers }, 's3: [S3PackageManager readTarball httpHeaders event] headers @headers'); + this.logger.trace( + { headers }, + 's3: [S3PackageManager readTarball httpHeaders event] headers @headers' + ); this.logger.trace( { statusCode }, 's3: [S3PackageManager readTarball httpHeaders event] statusCode @{statusCode}' @@ -391,19 +463,25 @@ export default class S3PackageManager implements ILocalPackageManager { headersSent = true; - this.logger.debug('s3: [S3PackageManager readTarball readTarballStream event] emit content-length'); + this.logger.debug( + 's3: [S3PackageManager readTarball readTarballStream event] emit content-length' + ); readTarballStream.emit(HEADERS.CONTENT_LENGTH, contentLength); // we know there's content, so open the stream readTarballStream.emit('open'); - this.logger.debug('s3: [S3PackageManager readTarball readTarballStream event] emit open'); + this.logger.debug( + 's3: [S3PackageManager readTarball readTarballStream event] emit open' + ); } } else { - this.logger.trace('s3: [S3PackageManager readTarball httpHeaders event] not found, avoid emit open file'); + this.logger.trace( + 's3: [S3PackageManager readTarball httpHeaders event] not found, avoid emit open file' + ); } }) .createReadStream(); - readStream.on('error', err => { + readStream.on('error', (err) => { const error: HttpError = convertS3Error(err as AWSError); readTarballStream.emit('error', error); @@ -419,7 +497,9 @@ export default class S3PackageManager implements ILocalPackageManager { readTarballStream.abort = (): void => { this.logger.debug('s3: [S3PackageManager readTarball readTarballStream event] request abort'); request.abort(); - this.logger.debug('s3: [S3PackageManager readTarball readTarballStream event] request destroy'); + this.logger.debug( + 's3: [S3PackageManager readTarball readTarballStream event] request destroy' + ); readStream.destroy(); }; diff --git a/plugins/google-cloud/src/data-storage.ts b/plugins/google-cloud/src/data-storage.ts index ba89085e..4bf11a12 100644 --- a/plugins/google-cloud/src/data-storage.ts +++ b/plugins/google-cloud/src/data-storage.ts @@ -1,7 +1,14 @@ import { Storage } from '@google-cloud/storage'; import { Datastore, DatastoreOptions } from '@google-cloud/datastore'; import { getServiceUnavailable, getInternalError, VerdaccioError } from '@verdaccio/commons-api'; -import { Logger, Callback, IPluginStorage, Token, TokenFilter, IPackageStorageManager } from '@verdaccio/types'; +import { + Logger, + Callback, + IPluginStorage, + Token, + TokenFilter, + IPackageStorageManager, +} from '@verdaccio/types'; import { CommitResponse } from '@google-cloud/datastore/build/src/request'; import { RunQueryResponse } from '@google-cloud/datastore/build/src/query'; import { entity } from '@google-cloud/datastore/build/src/entity'; @@ -11,7 +18,8 @@ import StorageHelper, { IStorageHelper } from './storage-helper'; import GoogleCloudStorageHandler from './storage'; type Key = entity.Key; -export const ERROR_MISSING_CONFIG = 'google cloud storage missing config. Add `store.google-cloud` to your config file'; +export const ERROR_MISSING_CONFIG = + 'google cloud storage missing config. Add `store.google-cloud` to your config file'; class GoogleCloudDatabase implements IPluginStorage { private helper: IStorageHelper; @@ -47,17 +55,23 @@ class GoogleCloudDatabase implements IPluginStorage => { - const error: VerdaccioError = getInternalError(err.message); + .catch((err: Error): Promise => { + const error: VerdaccioError = getInternalError(err.message); - this.logger.warn({ error }, 'gcloud: [datastore getSecret] init error @{error}'); - return Promise.reject(getServiceUnavailable('[getSecret] permissions error')); - } - ); + this.logger.warn({ error }, 'gcloud: [datastore getSecret] init error @{error}'); + return Promise.reject(getServiceUnavailable('[getSecret] permissions error')); + }); } public setSecret(secret: string): Promise { @@ -156,7 +168,7 @@ class GoogleCloudDatabase implements IPluginStorage => { - for (const item of entities) { - if (item.name === name) { - await this._deleteItem(name, item); - // deletedItems.push(deletedItem); - } + .then(async (entities: any): Promise => { + for (const item of entities) { + if (item.name === name) { + await this._deleteItem(name, item); + // deletedItems.push(deletedItem); } - cb(null); } - ) + cb(null); + }) .catch((err: Error): void => { cb(getInternalError(err.message)); }); diff --git a/plugins/google-cloud/src/storage.ts b/plugins/google-cloud/src/storage.ts index 1d561b15..aba3e1ff 100644 --- a/plugins/google-cloud/src/storage.ts +++ b/plugins/google-cloud/src/storage.ts @@ -29,7 +29,7 @@ import { VerdaccioConfigGoogleStorage } from './types'; export const pkgFileName = 'package.json'; export const defaultValidation = 'crc32c'; -const packageAlreadyExist = function(name: string): VerdaccioError { +const packageAlreadyExist = function (name: string): VerdaccioError { return getConflict(`${name} package already exist`); }; @@ -40,7 +40,12 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { private helper: IStorageHelper; private name: string; - public constructor(name: string, helper: IStorageHelper, config: VerdaccioConfigGoogleStorage, logger: Logger) { + public constructor( + name: string, + helper: IStorageHelper, + config: VerdaccioConfigGoogleStorage, + logger: Logger + ) { this.name = name; this.logger = logger; this.helper = helper; @@ -68,7 +73,7 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { } try { onWrite(name, transformPackage(metadata), onEnd); - } catch (err) { + } catch (err: any) { this.logger.error( { name: name, err: err.message }, 'gcloud: on write update @{name} package has failed err: @{err}' @@ -78,31 +83,38 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { }); }, (err: Error): void => { - this.logger.error({ name: name, err: err.message }, 'gcloud: update @{name} package has failed err: @{err}'); - onEnd(getInternalError(err.message)); - } - ) - .catch( - (err: Error): Callback => { this.logger.error( - { name, error: err }, - 'gcloud: trying to update @{name} and was not found on storage err: @{error}' + { name: name, err: err.message }, + 'gcloud: update @{name} package has failed err: @{err}' ); - // @ts-ignore - return onEnd(getNotFound()); + onEnd(getInternalError(err.message)); } - ); + ) + .catch((err: Error): Callback => { + this.logger.error( + { name, error: err }, + 'gcloud: trying to update @{name} and was not found on storage err: @{error}' + ); + // @ts-ignore + return onEnd(getNotFound()); + }); } public deletePackage(fileName: string, cb: CallbackAction): void { const file = this.helper.buildFilePath(this.name, fileName); this.logger.debug({ name: file.name }, 'gcloud: deleting @{name} from storage'); try { + // @ts-ignore file + // @ts-ignore .delete() // @ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unused-vars .then((_data: [Response]): void => { - this.logger.debug({ name: file.name }, 'gcloud: @{name} was deleted successfully from storage'); + this.logger.debug( + { name: file.name }, + 'gcloud: @{name} was deleted successfully from storage' + ); cb(null); }) .catch((err: Error): void => { @@ -112,8 +124,11 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { ); cb(getInternalError(err.message)); }); - } catch (err) { - this.logger.error({ name: file.name, err: err.message }, 'gcloud: delete @{name} file has failed err: @{err}'); + } catch (err: any) { + this.logger.error( + { name: file.name, err: err.message }, + 'gcloud: delete @{name} file has failed err: @{err}' + ); cb(getInternalError('something went wrong')); } } @@ -122,9 +137,13 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { // remove all files from storage const file = this.helper.getBucket().file(`${this.name}`); this.logger.debug({ name: file.name }, 'gcloud: removing the package @{name} from storage'); + // @ts-ignore file.delete().then( (): void => { - this.logger.debug({ name: file.name }, 'gcloud: package @{name} was deleted successfully from storage'); + this.logger.debug( + { name: file.name }, + 'gcloud: package @{name} was deleted successfully from storage' + ); callback(null); }, (err: Error): void => { @@ -150,7 +169,10 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { } }, (err: Error): void => { - this.logger.error({ name: name, err: err.message }, 'gcloud: create package @{name} has failed err: @{err}'); + this.logger.error( + { name: name, err: err.message }, + 'gcloud: create package @{name} has failed err: @{err}' + ); cb(getInternalError(err.message)); } ); @@ -164,32 +186,33 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { cb(null); }) .catch((err: Error): void => { - this.logger.error({ name: name, err: err.message }, 'gcloud: save package @{name} has failed err: @{err}'); + this.logger.error( + { name: name, err: err.message }, + 'gcloud: save package @{name} has failed err: @{err}' + ); return cb(err); }); } /* eslint-disable no-async-promise-executor */ private _savePackage(name: string, metadata: Package): Promise { - return new Promise( - async (resolve, reject): Promise => { - const file = this.helper.buildFilePath(name, pkgFileName); - try { - await file.save(this._convertToString(metadata), { - validation: this.config.validation || defaultValidation, - /** - * When resumable is `undefined` - it will default to `true`as per GC Storage documentation: - * `Resumable uploads are automatically enabled and must be shut off explicitly by setting options.resumable to false` - * @see https://cloud.google.com/nodejs/docs/reference/storage/2.5.x/File#createWriteStream - */ - resumable: this.config.resumable, - }); - resolve(null); - } catch (err) { - reject(getInternalError(err.message)); - } + return new Promise(async (resolve, reject): Promise => { + const file = this.helper.buildFilePath(name, pkgFileName); + try { + await file.save(this._convertToString(metadata), { + validation: this.config.validation || defaultValidation, + /** + * When resumable is `undefined` - it will default to `true`as per GC Storage documentation: + * `Resumable uploads are automatically enabled and must be shut off explicitly by setting options.resumable to false` + * @see https://cloud.google.com/nodejs/docs/reference/storage/2.5.x/File#createWriteStream + */ + resumable: this.config.resumable, + }); + resolve(null); + } catch (err: any) { + reject(getInternalError(err.message)); } - ); + }); } /* eslint-enable no-async-promise-executor */ @@ -205,51 +228,54 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { cb(null, json); }) .catch((err: Error): void => { - this.logger.debug({ name: name, err: err.message }, 'gcloud: read package @{name} has failed err: @{err}'); + this.logger.debug( + { name: name, err: err.message }, + 'gcloud: read package @{name} has failed err: @{err}' + ); cb(err); }); } /* eslint-disable no-async-promise-executor */ private _fileExist(name: string, fileName: string): Promise { - return new Promise( - async (resolve, reject): Promise => { - const file: File = this.helper.buildFilePath(name, fileName); - try { - const data = await file.exists(); - const exist = data[0]; - - resolve(exist); - this.logger.debug({ name: name, exist }, 'gcloud: check whether @{name} exist successfully: @{exist}'); - } catch (err) { - this.logger.error( - { name: file.name, err: err.message }, - 'gcloud: check exist package @{name} has failed, cause: @{err}' - ); + return new Promise(async (resolve, reject): Promise => { + const file: File = this.helper.buildFilePath(name, fileName); + try { + // @ts-ignore + const data = await file.exists(); + const exist = data[0]; - reject(getInternalError(err.message)); - } + resolve(exist); + this.logger.debug( + { name: name, exist }, + 'gcloud: check whether @{name} exist successfully: @{exist}' + ); + } catch (err: any) { + this.logger.error( + { name: file.name, err: err.message }, + 'gcloud: check exist package @{name} has failed, cause: @{err}' + ); + + reject(getInternalError(err.message)); } - ); + }); } private async _readPackage(name: string): Promise { - return new Promise( - async (resolve, reject): Promise => { - const file = this.helper.buildFilePath(name, pkgFileName); - - try { - const content: DownloadResponse = await file.download(); - this.logger.debug({ name: this.name }, 'gcloud: @{name} was found on storage'); - const response: Package = JSON.parse(content[0].toString('utf8')); - - resolve(response); - } catch (err) { - this.logger.debug({ name: this.name }, 'gcloud: @{name} package not found on storage'); - reject(getNotFound()); - } + return new Promise(async (resolve, reject): Promise => { + const file = this.helper.buildFilePath(name, pkgFileName); + + try { + const content: DownloadResponse = await file.download(); + this.logger.debug({ name: this.name }, 'gcloud: @{name} was found on storage'); + const response: Package = JSON.parse(content[0].toString('utf8')); + + resolve(response); + } catch (err) { + this.logger.debug({ name: this.name }, 'gcloud: @{name} package not found on storage'); + reject(getNotFound()); } - ); + }); } /* eslint-disable no-async-promise-executor */ @@ -260,24 +286,33 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { this._fileExist(this.name, name).then( (exist: boolean): void => { if (exist) { - this.logger.debug({ url: this.name }, 'gcloud: @{url} package already exist on storage'); + this.logger.debug( + { url: this.name }, + 'gcloud: @{url} package already exist on storage' + ); uploadStream.emit('error', packageAlreadyExist(name)); } else { const file = this.helper.getBucket().file(`${this.name}/${name}`); - this.logger.info({ url: file.name }, 'gcloud: the @{url} is being uploaded to the storage'); + this.logger.info( + { url: file.name }, + 'gcloud: the @{url} is being uploaded to the storage' + ); const fileStream = file.createWriteStream({ validation: this.config.validation || defaultValidation, }); uploadStream.done = (): void => { uploadStream.on('end', (): void => { fileStream.on('response', (): void => { - this.logger.debug({ url: file.name }, 'gcloud: @{url} has been successfully uploaded to the storage'); + this.logger.debug( + { url: file.name }, + 'gcloud: @{url} has been successfully uploaded to the storage' + ); uploadStream.emit('success'); }); }); }; - fileStream._destroy = function(err: Error): void { + fileStream._destroy = function (err: Error): void { // this is an error when user is not authenticated // [BadRequestError: Could not authenticate request // getaddrinfo ENOTFOUND www.googleapis.com www.googleapis.com:443] @@ -288,7 +323,10 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { }; fileStream.on('open', (): void => { - this.logger.debug({ url: file.name }, 'gcloud: upload streem has been opened for @{url}'); + this.logger.debug( + { url: file.name }, + 'gcloud: upload streem has been opened for @{url}' + ); uploadStream.emit('open'); }); @@ -299,7 +337,10 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { }); uploadStream.abort = (): void => { - this.logger.warn({ url: file.name }, 'gcloud: upload stream has been aborted for @{url}'); + this.logger.warn( + { url: file.name }, + 'gcloud: upload stream has been aborted for @{url}' + ); fileStream.destroy(undefined); }; @@ -333,7 +374,10 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { this.logger.debug({ url: file.name }, 'gcloud: tarball @{url} do not found on storage'); localReadStream.emit('error', getNotFound()); } else { - this.logger.error({ url: file.name }, 'gcloud: tarball @{url} has failed to be retrieved from storage'); + this.logger.error( + { url: file.name }, + 'gcloud: tarball @{url} has failed to be retrieved from storage' + ); localReadStream.emit('error', getBadRequest(err.message)); } }) @@ -346,7 +390,10 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { } if (parseInt(size, 10) === 0) { - this.logger.error({ url: file.name }, 'gcloud: tarball @{url} was fetched from storage and it is empty'); + this.logger.error( + { url: file.name }, + 'gcloud: tarball @{url} was fetched from storage and it is empty' + ); localReadStream.emit('error', getInternalError('file content empty')); } else if (parseInt(size, 10) > 0 && statusCode === HTTP_STATUS.OK) { localReadStream.emit('content-length', response.headers['content-length']); diff --git a/plugins/local-storage/src/local-database.ts b/plugins/local-storage/src/local-database.ts index e33cfae4..503b9131 100644 --- a/plugins/local-storage/src/local-database.ts +++ b/plugins/local-storage/src/local-database.ts @@ -5,7 +5,15 @@ import buildDebug from 'debug'; import _ from 'lodash'; import async from 'async'; import mkdirp from 'mkdirp'; -import { Callback, Config, IPackageStorage, IPluginStorage, LocalStorage, Logger, StorageList } from '@verdaccio/types'; +import { + Callback, + Config, + IPackageStorage, + IPluginStorage, + LocalStorage, + Logger, + StorageList, +} from '@verdaccio/types'; import { getInternalError } from '@verdaccio/commons-api'; import LocalDriver, { noSuchFile } from './local-fs'; @@ -58,7 +66,11 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { } } - public search(onPackage: Callback, onEnd: Callback, validateName: (name: string) => boolean): void { + public search( + onPackage: Callback, + onEnd: Callback, + validateName: (name: string) => boolean + ): void { const storages = this._getCustomPackageLocalStorages(); debug(`search custom local packages: %o`, JSON.stringify(storages)); const base = Path.dirname(this.config.self_path); @@ -68,7 +80,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { async.eachSeries( storageKeys, - function(storage, cb) { + function (storage, cb) { const position = storageKeys.indexOf(storage); const base2 = Path.join(position !== 0 ? storageKeys[0] : ''); const storagePath: string = Path.resolve(base, base2, storage); @@ -80,7 +92,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { async.eachSeries( files, - function(file, cb) { + function (file, cb) { debug('local-storage: [search] search file path: %o', file); if (storageKeys.includes(file)) { return cb(); @@ -90,7 +102,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { // scoped const fileLocation = Path.resolve(base, storage, file); debug('search scoped file location: %o', fileLocation); - fs.readdir(fileLocation, function(err, files) { + fs.readdir(fileLocation, function (err, files) { if (err) { return cb(err); } @@ -153,7 +165,10 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { this.get((err, data) => { if (err) { cb(getInternalError('error remove private package')); - this.logger.error({ err }, '[local-storage/remove]: remove the private package has failed @{err}'); + this.logger.error( + { err }, + '[local-storage/remove]: remove the private package has failed @{err}' + ); debug('error on remove package %o', name); } @@ -184,7 +199,9 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { public getPackageStorage(packageName: string): IPackageStorage { const packageAccess = this.config.getMatchedPackagesSpec(packageName); - const packagePath: string = this._getLocalStoragePath(packageAccess ? packageAccess.storage : undefined); + const packagePath: string = this._getLocalStoragePath( + packageAccess ? packageAccess.storage : undefined + ); debug('storage path selected: ', packagePath); if (_.isString(packagePath) === false) { @@ -223,7 +240,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { if (packages) { const listPackagesConf = Object.keys(packages || {}); - listPackagesConf.map(pkg => { + listPackagesConf.map((pkg) => { const storage = packages[pkg].storage; if (storage) { storages[storage] = false; @@ -243,7 +260,8 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { if (this.locked) { this.logger.error( - 'Database is locked, please check error message printed during startup to ' + 'prevent data loss.' + 'Database is locked, please check error message printed during startup to ' + + 'prevent data loss.' ); return new Error( 'Verdaccio database is locked, please contact your administrator to checkout ' + @@ -266,7 +284,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { debug('sync write succeed'); return null; - } catch (err) { + } catch (err: any) { debug('sync failed %o', err); return err; @@ -308,7 +326,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { detail: `Please rename database name from ${DEPRECATED_DB_NAME} to ${DB_NAME}`, }); return sinopiadbPath; - } catch (err) { + } catch (err: any) { if (err.code === noSuchFile) { return this._dbGenPath(DB_NAME, config); } @@ -328,7 +346,7 @@ class LocalDatabase extends TokenActions implements IPluginStorage<{}> { try { return loadPrivatePackages(this.path, this.logger); - } catch (err) { + } catch (err: any) { // readFileSync is platform specific, macOS, Linux and Windows thrown an error // Only recreate if file not found to prevent data loss if (err.code !== noSuchFile) { diff --git a/plugins/local-storage/src/pkg-utils.ts b/plugins/local-storage/src/pkg-utils.ts index 6b869c23..b7d49524 100644 --- a/plugins/local-storage/src/pkg-utils.ts +++ b/plugins/local-storage/src/pkg-utils.ts @@ -16,10 +16,13 @@ export function loadPrivatePackages(path: string, logger: Logger): LocalStorage let db; try { db = JSON.parse(data); - } catch (err) { + } catch (err: any) { logger.error( - `Package database file corrupted (invalid JSON), please check the error` + ` printed below.\nFile Path: ${path}`, - err + { + err: err.mesage, + path, + }, // eslint-disable-next-line max-len + `Package database file corrupted (invalid JSON), please check the error @{err}.\nFile Path: @{path}` ); throw Error('Package database file corrupted (invalid JSON)'); } diff --git a/plugins/memory/src/memory-handler.ts b/plugins/memory/src/memory-handler.ts index 6317432b..2d9a83bd 100644 --- a/plugins/memory/src/memory-handler.ts +++ b/plugins/memory/src/memory-handler.ts @@ -91,7 +91,7 @@ class MemoryHandler implements IPackageStorageManager { this.data[name] = json; return cb(null); - } catch (err) { + } catch (err: any) { return cb(getInternalError(err.message)); } } @@ -111,12 +111,12 @@ class MemoryHandler implements IPackageStorageManager { const uploadStream: IUploadTarball = new UploadTarball({}); const temporalName = `${this.path}/${name}`; - process.nextTick(function() { - fs.mkdirp(path.dirname(temporalName), function(mkdirpError) { + process.nextTick(function () { + fs.mkdirp(path.dirname(temporalName), function (mkdirpError) { if (mkdirpError) { return uploadStream.emit('error', mkdirpError); } - fs.stat(temporalName, function(fileError, stats) { + fs.stat(temporalName, function (fileError, stats) { if (!fileError && stats) { return uploadStream.emit('error', getConflict()); } @@ -126,15 +126,15 @@ class MemoryHandler implements IPackageStorageManager { uploadStream.pipe(file); - uploadStream.done = function(): void { - const onEnd = function(): void { + uploadStream.done = function (): void { + const onEnd = function (): void { uploadStream.emit('success'); }; uploadStream.on('end', onEnd); }; - uploadStream.abort = function(): void { + uploadStream.abort = function (): void { uploadStream.emit('error', getBadRequest('transmision aborted')); file.end(); }; @@ -157,8 +157,8 @@ class MemoryHandler implements IPackageStorageManager { const readTarballStream: IReadTarball = new ReadTarball({}); - process.nextTick(function() { - fs.stat(pathName, function(fileError, stats) { + process.nextTick(function () { + fs.stat(pathName, function (fileError, stats) { if (fileError && !stats) { return readTarballStream.emit('error', getNotFound()); } @@ -175,7 +175,7 @@ class MemoryHandler implements IPackageStorageManager { readTarballStream.emit('error', error); }); - readTarballStream.abort = function(): void { + readTarballStream.abort = function (): void { readStream.destroy(getBadRequest('read has been aborted')); }; return; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 564cbf18..e6d23356 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: prettier: 2.6.2 rimraf: 3.0.2 snyk: 1.946.0 - typescript: 3.9.10 + typescript: 4.7.3 update-ts-references: 2.4.1 devDependencies: '@babel/cli': 7.17.10_@babel+core@7.18.2 @@ -106,8 +106,8 @@ importers: '@types/memory-fs': 0.3.3 '@types/node': 14.18.0 '@types/request': 2.48.8 - '@typescript-eslint/eslint-plugin': 5.27.0_94ad863b5f5f143c3e71f02cf3f72a7f - '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/eslint-plugin': 5.27.0_53a3a26d566b734365db03aac28a1a58 + '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@4.7.3 '@verdaccio/types': link:core/types babel-core: 7.0.0-bridge.0_@babel+core@7.18.2 babel-eslint: 10.1.0_eslint@8.17.0 @@ -121,7 +121,7 @@ importers: eslint-config-prettier: 8.5.0_eslint@8.17.0 eslint-plugin-babel: 5.3.1_eslint@8.17.0 eslint-plugin-import: 2.26.0_24765f17c222830e2ecdab7e02a2c76f - eslint-plugin-jest: 26.5.3_86fb7fa9d92ffdfd0e7130bc99e013de + eslint-plugin-jest: 26.5.3_3c946d474d1d8062c66f8428d84ab293 eslint-plugin-jsx-a11y: 6.5.1_eslint@8.17.0 eslint-plugin-react: 7.30.0_eslint@8.17.0 eslint-plugin-react-hooks: 4.5.0_eslint@8.17.0 @@ -135,8 +135,8 @@ importers: prettier: 2.6.2 rimraf: 3.0.2 snyk: 1.946.0 - typescript: 3.9.10 - update-ts-references: 2.4.1_typescript@3.9.10 + typescript: 4.7.3 + update-ts-references: 2.4.1_typescript@4.7.3 core/commons-api: specifiers: @@ -176,9 +176,15 @@ importers: core/types: specifiers: - '@types/node': 14.18.0 + '@types/node': 12.12.6 + typedoc: ^0.22.17 + typedoc-plugin-missing-exports: ^0.22.6 + typedoc-umlclass: ^0.6.1 devDependencies: - '@types/node': 14.18.0 + '@types/node': 12.12.6 + typedoc: 0.22.17_typescript@4.7.3 + typedoc-plugin-missing-exports: 0.22.6_typedoc@0.22.17 + typedoc-umlclass: 0.6.1_typedoc@0.22.17 plugins/active-directory: specifiers: @@ -2097,7 +2103,7 @@ packages: lodash: 4.17.21 loud-rejection: 2.2.0 tslib: 2.3.1 - typescript: 4.4.4 + typescript: 4.7.3 transitivePeerDependencies: - ts-jest dev: true @@ -2118,7 +2124,7 @@ packages: dependencies: intl-messageformat-parser: 6.1.2 tslib: 2.3.1 - typescript: 4.4.4 + typescript: 4.7.3 dev: true /@google-cloud/common/2.4.0: @@ -2785,6 +2791,10 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true + /@types/node/12.12.6: + resolution: {integrity: sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA==} + dev: true + /@types/node/12.20.37: resolution: {integrity: sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA==} dev: true @@ -2854,7 +2864,7 @@ packages: '@types/yargs-parser': 20.2.1 dev: true - /@typescript-eslint/eslint-plugin/5.27.0_94ad863b5f5f143c3e71f02cf3f72a7f: + /@typescript-eslint/eslint-plugin/5.27.0_53a3a26d566b734365db03aac28a1a58: resolution: {integrity: sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2865,23 +2875,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@4.7.3 '@typescript-eslint/scope-manager': 5.27.0 - '@typescript-eslint/type-utils': 5.27.0_eslint@8.17.0+typescript@3.9.10 - '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/type-utils': 5.27.0_eslint@8.17.0+typescript@4.7.3 + '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@4.7.3 debug: 4.3.4 eslint: 8.17.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0_typescript@3.9.10 - typescript: 3.9.10 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.27.0_eslint@8.17.0+typescript@3.9.10: + /@typescript-eslint/parser/5.27.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2893,10 +2903,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.27.0 '@typescript-eslint/types': 5.27.0 - '@typescript-eslint/typescript-estree': 5.27.0_typescript@3.9.10 + '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.3 debug: 4.3.4 eslint: 8.17.0 - typescript: 3.9.10 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true @@ -2909,7 +2919,7 @@ packages: '@typescript-eslint/visitor-keys': 5.27.0 dev: true - /@typescript-eslint/type-utils/5.27.0_eslint@8.17.0+typescript@3.9.10: + /@typescript-eslint/type-utils/5.27.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2919,11 +2929,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@4.7.3 debug: 4.3.4 eslint: 8.17.0 - tsutils: 3.21.0_typescript@3.9.10 - typescript: 3.9.10 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true @@ -2933,7 +2943,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.27.0_typescript@3.9.10: + /@typescript-eslint/typescript-estree/5.27.0_typescript@4.7.3: resolution: {integrity: sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2948,13 +2958,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@3.9.10 - typescript: 3.9.10 + tsutils: 3.21.0_typescript@4.7.3 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.27.0_eslint@8.17.0+typescript@3.9.10: + /@typescript-eslint/utils/5.27.0_eslint@8.17.0+typescript@4.7.3: resolution: {integrity: sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2963,7 +2973,7 @@ packages: '@types/json-schema': 7.0.9 '@typescript-eslint/scope-manager': 5.27.0 '@typescript-eslint/types': 5.27.0 - '@typescript-eslint/typescript-estree': 5.27.0_typescript@3.9.10 + '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.3 eslint: 8.17.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.17.0 @@ -3564,6 +3574,12 @@ packages: dev: true optional: true + /binary-split/1.0.5: + resolution: {integrity: sha512-AQ5fcBrUU5hoIafkEvNKqxT+2xbqlSqAXef6IdCQr5wpHu9E7NGM6rTAlYJYbtxvAvjfx8nJkBy6rNlbPPI+Pw==} + dependencies: + through2: 2.0.5 + dev: true + /bindings/1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: @@ -3611,6 +3627,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -4156,6 +4178,12 @@ packages: resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} dev: true + /dbly-linked-list/0.3.4: + resolution: {integrity: sha512-327vOlwspi9i1T3Kc9yZhRUR8qDdgMQ4HmXsFDDCQ/HTc3sNe7gnF5b0UrsnaOJ0rvmG7yBZpK0NoOux9rKYKw==} + dependencies: + lodash.isequal: 4.5.0 + dev: true + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4608,7 +4636,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@4.7.3 debug: 3.2.7 eslint-import-resolver-node: 0.3.6 find-up: 2.1.0 @@ -4636,7 +4664,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/parser': 5.27.0_eslint@8.17.0+typescript@4.7.3 array-includes: 3.1.4 array.prototype.flat: 1.2.5 debug: 2.6.9 @@ -4657,7 +4685,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest/26.5.3_86fb7fa9d92ffdfd0e7130bc99e013de: + /eslint-plugin-jest/26.5.3_3c946d474d1d8062c66f8428d84ab293: resolution: {integrity: sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4670,8 +4698,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.27.0_94ad863b5f5f143c3e71f02cf3f72a7f - '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@3.9.10 + '@typescript-eslint/eslint-plugin': 5.27.0_53a3a26d566b734365db03aac28a1a58 + '@typescript-eslint/utils': 5.27.0_eslint@8.17.0+typescript@4.7.3 eslint: 8.17.0 jest: 27.5.1 transitivePeerDependencies: @@ -5441,6 +5469,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/8.0.3: + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.0 + once: 1.4.0 + dev: true + /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -6781,6 +6820,10 @@ packages: hasBin: true dev: true + /jsonc-parser/3.0.0: + resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + dev: true + /jsonfile/4.0.0: resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} optionalDependencies: @@ -7051,6 +7094,10 @@ packages: resolution: {integrity: sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=} dev: false + /lodash.isequal/4.5.0: + resolution: {integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA=} + dev: true + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -7139,6 +7186,10 @@ packages: yallist: 4.0.0 dev: true + /lunr/2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true + /magic-string/0.25.7: resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} dependencies: @@ -7179,7 +7230,6 @@ packages: resolution: {integrity: sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA==} engines: {node: '>= 12'} hasBin: true - dev: false /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} @@ -7303,6 +7353,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -7816,6 +7873,18 @@ packages: find-up: 4.1.0 dev: true + /plantuml-encoder/1.4.0: + resolution: {integrity: sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==} + dev: true + + /plantuml-pipe/1.4.0: + resolution: {integrity: sha512-9FGqUG0TUwZCGFgKU7PyRxlfDqO99iFb7I40Vwk3Akt2SSdxI9Y1yicfZHeW8/3V6/4meVfCSQ/le7ldWdIX0Q==} + requiresBuild: true + dependencies: + binary-split: 1.0.5 + split2: 4.1.0 + dev: true + /please-upgrade-node/3.2.0: resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} dependencies: @@ -7883,6 +7952,11 @@ packages: /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /prompts/2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -7975,6 +8049,12 @@ packages: engines: {node: '>=0.4.x'} dev: false + /queue-fifo/0.2.6: + resolution: {integrity: sha512-rwlnZHAaTmWEGKC7ziasK8u4QnZW/uN6kSiG+tHNf/1GA+R32FArZi18s3SYUpKcA0Y6jJoUDn5GT3Anoc2mWw==} + dependencies: + dbly-linked-list: 0.3.4 + dev: true + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -8443,6 +8523,14 @@ packages: resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} dev: true + /shiki/0.10.1: + resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} + dependencies: + jsonc-parser: 3.0.0 + vscode-oniguruma: 1.6.2 + vscode-textmate: 5.2.0 + dev: true + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -8559,6 +8647,11 @@ packages: is-stream-ended: 0.1.4 dev: false + /split2/4.1.0: + resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + engines: {node: '>= 10.x'} + dev: true + /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true @@ -8904,6 +8997,13 @@ packages: resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} dev: true + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + /through2/3.0.2: resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} dependencies: @@ -9003,14 +9103,14 @@ packages: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: true - /tsutils/3.21.0_typescript@3.9.10: + /tsutils/3.21.0_typescript@4.7.3: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 3.9.10 + typescript: 4.7.3 dev: true /tty-table/2.8.13: @@ -9096,14 +9196,43 @@ packages: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} dev: false - /typescript/3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} + /typedoc-plugin-missing-exports/0.22.6_typedoc@0.22.17: + resolution: {integrity: sha512-1uguGQqa+c5f33nWS3v1mm0uAx4Ii1lw4Kx2zQksmYFKNEWTmrmMXbMNBoBg4wu0p4dFCNC7JIWPoRzpNS6pFA==} + peerDependencies: + typedoc: 0.22.x + dependencies: + typedoc: 0.22.17_typescript@4.7.3 + dev: true + + /typedoc-umlclass/0.6.1_typedoc@0.22.17: + resolution: {integrity: sha512-e4KecqOfuZKhpgad60U51U7ytrZBj8eYd5FWLXEccP53NZdAJwIkYzTKel/wMEt2n3UIl2G3Kuo7r5wbmYe98g==} + peerDependencies: + typedoc: 0.22.x + dependencies: + plantuml-encoder: 1.4.0 + plantuml-pipe: 1.4.0 + progress: 2.0.3 + queue-fifo: 0.2.6 + typedoc: 0.22.17_typescript@4.7.3 + dev: true + + /typedoc/0.22.17_typescript@4.7.3: + resolution: {integrity: sha512-h6+uXHVVCPDaANzjwzdsj9aePBjZiBTpiMpBBeyh1zcN2odVsDCNajz8zyKnixF93HJeGpl34j/70yoEE5BfNg==} + engines: {node: '>= 12.10.0'} hasBin: true + peerDependencies: + typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x + dependencies: + glob: 8.0.3 + lunr: 2.3.9 + marked: 4.0.16 + minimatch: 5.1.0 + shiki: 0.10.1 + typescript: 4.7.3 dev: true - /typescript/4.4.4: - resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} + /typescript/4.7.3: + resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -9175,7 +9304,7 @@ packages: engines: {node: '>= 0.8'} dev: false - /update-ts-references/2.4.1_typescript@3.9.10: + /update-ts-references/2.4.1_typescript@4.7.3: resolution: {integrity: sha512-t5o/ijSiFhm67hmVN0m+lOkUopV3MYYZE/lhd3bYaGTCkU+3TpnfRxP/OoxRdapzPOuZaxVBmMwjtW1lN8WoqA==} engines: {node: '>=10.0.0'} hasBin: true @@ -9189,7 +9318,7 @@ packages: minimist: 1.2.5 mkdirp: 1.0.4 readline-sync: 1.4.10 - typescript: 3.9.10 + typescript: 4.7.3 transitivePeerDependencies: - ts-jest dev: true @@ -9293,6 +9422,14 @@ packages: extsprintf: 1.4.1 dev: false + /vscode-oniguruma/1.6.2: + resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==} + dev: true + + /vscode-textmate/5.2.0: + resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} + dev: true + /w3c-hr-time/1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: @@ -9498,6 +9635,11 @@ packages: /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + /y18n/4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true