diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index be21b1c43..000000000 --- a/.eslintrc +++ /dev/null @@ -1,102 +0,0 @@ -{ - "extends": [ - "eslint:recommended", - "google", - "plugin:react/recommended", - "plugin:jest/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/typescript", - "plugin:jsx-a11y/recommended", - "prettier" - ], - "plugins": ["import", "jest", "jsx-a11y", "react-hooks"], - "env": { - "es6": true, - "node": true, - "jest": true - }, - "globals": { - "__APP_VERSION__": true - }, - "parserOptions": { - "allowImportExportEverywhere": true, - "sourceType": "module", - "ecmaVersion": 11, - "ecmaFeatures": { - "impliedStrict": true, - "jsx": true - } - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"] - } - } - }, - "parser": "@typescript-eslint/parser", - "rules": { - "curly": ["error", "all"], - "react/prop-types": 0, - "jest/no-export": 0, - "jest/no-test-callback": 0, - "jest/expect-expect": 0, - "jest/no-try-expect": 0, - "jest/no-done-callback": "off", - "jest/no-conditional-expect": "off", - "keyword-spacing": "off", - "no-tabs": "off", - "no-useless-escape": "off", - "padded-blocks": "off", - "require-jsdoc": "off", - "valid-jsdoc": "off", - "import/order": ["error"], - "eol-last": "error", - "no-irregular-whitespace": "error", - "no-mixed-spaces-and-tabs": ["error", "smart-tabs"], - "no-trailing-spaces": "error", - "camelcase": "off", - "guard-for-in": "error", - "new-cap": "error", - "max-len": ["error", 100], - "no-console": ["error", { "allow": ["warn"] }], - "no-constant-condition": "error", - "no-debugger": "error", - "no-empty": "error", - "no-fallthrough": "error", - "no-invalid-this": "error", - "no-new-require": "error", - "no-undef": "error", - "no-unreachable": "error", - "no-var": "error", - "one-var": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "handle-callback-err": 0, - "prefer-const": 0, - "@typescript-eslint/camelcase": 0, - "@typescript-eslint/ban-ts-ignore": 0, - "@typescript-eslint/no-var-requires": 0, - "@typescript-eslint/no-inferrable-types": 0, - "@typescript-eslint/no-empty-function": 0, - "@typescript-eslint/no-this-alias": 0, - "@typescript-eslint/no-use-before-define": 0, - "@typescript-eslint/array-type": ["error"], - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/indent": 0, - "@typescript-eslint/ban-ts-comment": 0, - "@typescript-eslint/ban-types": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - - // rules to fix - "no-unused-vars": ["warn", { "vars": "all", "args": "none" }], - "jest/no-identical-title": ["warn"], - "prefer-promise-reject-errors": ["warn"], - "jest/no-disabled-tests": ["warn"], - "jest/no-commented-out-tests": ["warn"], - "@typescript-eslint/prefer-optional-chain": ["warn"], - "@typescript-eslint/explicit-member-accessibility": ["warn"], - "@typescript-eslint/no-unused-vars": ["warn"] - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..773a15da6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@verdaccio/eslint-config'], +}; diff --git a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/index.js b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/index.js index 7144ba061..fb822ac68 100644 --- a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/index.js +++ b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/index.js @@ -10,7 +10,7 @@ let _localMemory = require('./local-memory'); let _localMemory2 = _interopRequireDefault(_localMemory); function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; + return obj && obj.__esModule ? obj : {default: obj}; } exports.LocalMemory = _localMemory2.default; diff --git a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/local-memory.js b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/local-memory.js index cffa40882..da93f0525 100644 --- a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/local-memory.js +++ b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/local-memory.js @@ -9,7 +9,7 @@ let _memoryHandler = require('./memory-handler'); let _memoryHandler2 = _interopRequireDefault(_memoryHandler); function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; + return obj && obj.__esModule ? obj : {default: obj}; } const DEFAULT_LIMIT = 1000; @@ -43,8 +43,8 @@ class LocalMemory { cb(null); } else { this.logger.info( - { limit: this.limit }, - 'Storage memory has reached limit of @{limit} packages' + {limit: this.limit}, + 'Storage memory has reached limit of @{limit} packages', ); cb(new Error('Storage memory has reached limit of limit packages')); } diff --git a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/memory-handler.js b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/memory-handler.js index f597aa887..39661e84a 100644 --- a/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/memory-handler.js +++ b/docker-examples/v4/docker-plugin-external/plugins/verdaccio-memory/lib/memory-handler.js @@ -16,7 +16,7 @@ let _memoryFs2 = _interopRequireDefault(_memoryFs); let _streams = require('@verdaccio/streams'); function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; + return obj && obj.__esModule ? obj : {default: obj}; } // $FlowFixMe @@ -111,8 +111,8 @@ class MemoryHandler { const uploadStream = new _streams.UploadTarball(); const temporalName = `/${name}`; - process.nextTick(function () { - fs.exists(temporalName, function (exists) { + process.nextTick(function() { + fs.exists(temporalName, function(exists) { if (exists) { return uploadStream.emit('error', fSError(fileExist)); } @@ -122,7 +122,7 @@ class MemoryHandler { uploadStream.pipe(file); - uploadStream.done = function () { + uploadStream.done = function() { const onEnd = function onEnd() { uploadStream.emit('success'); }; @@ -130,7 +130,7 @@ class MemoryHandler { uploadStream.on('end', onEnd); }; - uploadStream.abort = function () { + uploadStream.abort = function() { uploadStream.emit('error', fSError('transmision aborted', 400)); file.end(); }; @@ -150,8 +150,8 @@ class MemoryHandler { const readTarballStream = new _streams.ReadTarball(); - process.nextTick(function () { - fs.exists(pathName, function (exists) { + process.nextTick(function() { + fs.exists(pathName, function(exists) { if (!exists) { readTarballStream.emit('error', noPackageFoundError()); } else { @@ -164,7 +164,7 @@ class MemoryHandler { readTarballStream.emit('error', error); }); - readTarballStream.abort = function () { + readTarballStream.abort = function() { readStream.destroy(fSError('read has been aborted', 400)); }; } diff --git a/package.json b/package.json index e793f58e3..9a08b2170 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,8 @@ "@babel/register": "7.13.14", "@babel/runtime": "7.13.10", "@changesets/changelog-github": "^0.2.8", - "@changesets/cli": "^2.15.0", - "@changesets/get-dependents-graph": "^1.2.0", + "@changesets/cli": "^2.16.0", + "@changesets/get-dependents-graph": "^1.2.1", "@commitlint/cli": "8.3.5", "@commitlint/config-conventional": "8.2.0", "@octokit/rest": "17.0.0", @@ -71,6 +71,7 @@ "@typescript-eslint/parser": "4.13.0", "@verdaccio/types": "workspace:*", "@verdaccio/ui-theme": "workspace:*", + "@verdaccio/eslint-config": "workspace:*", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.1.0", "babel-jest": "26.6.3", @@ -78,20 +79,21 @@ "babel-plugin-emotion": "11.0.0", "codecov": "3.8.1", "concurrently": "^5.3.0", - "core-js": "^3.10.1", + "core-js": "^3.12.1", "cross-env": "7.0.3", "detect-secrets": "1.0.6", - "eslint": "7.19.0", + "eslint": "7.26.0", "eslint-config-google": "0.14.0", - "eslint-config-prettier": "7.2.0", + "eslint-config-prettier": "8.3.0", "eslint-plugin-babel": "5.3.1", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-jest": "24.1.3", + "eslint-plugin-import": "2.23.2", + "eslint-plugin-jest": "24.3.6", "eslint-plugin-jsx-a11y": "6.4.1", - "eslint-plugin-react": "7.22.0", + "eslint-plugin-react": "7.23.2", "eslint-plugin-react-hooks": "4.2.0", "eslint-plugin-simple-import-sort": "7.0.0", - "eslint-plugin-verdaccio": "9.6.1", + "eslint-plugin-verdaccio": "10.0.0", + "eslint-plugin-prettier": "3.4.0", "fs-extra": "9.1.0", "get-stdin": "7.0.0", "husky": "2.7.0", @@ -107,14 +109,14 @@ "nock": "12.0.3", "nodemon": "^2.0.7", "npm-run-all": "4.1.5", - "prettier": "2.2.1", + "prettier": "2.3.0", "rimraf": "3.0.2", "selfsigned": "1.10.8", "supertest": "4.0.2", "ts-node": "^9.1.1", "typescript": "^4.2.4", "update-ts-references": "2.3.0", - "verdaccio": "^5.0.1", + "verdaccio": "^5.0.4", "verdaccio-audit": "workspace:*", "verdaccio-auth-memory": "workspace:*", "verdaccio-htpasswd": "workspace:*", diff --git a/packages/api/src/v1/search.ts b/packages/api/src/v1/search.ts index dff705352..c274770a9 100644 --- a/packages/api/src/v1/search.ts +++ b/packages/api/src/v1/search.ts @@ -41,7 +41,7 @@ export default function (route, auth, storage): void { route.get('/-/v1/search', (req, res) => { // TODO: implement proper result scoring weighted by quality, popularity and // maintenance query parameters - let [text, size, from /* , quality, popularity, maintenance */] = [ + let [text, size, from] = [ 'text', 'size', 'from' /* , 'quality', 'popularity', 'maintenance' */, diff --git a/packages/api/test/integration/package.spec.ts b/packages/api/test/integration/package.spec.ts index ae12667de..cbe853064 100644 --- a/packages/api/test/integration/package.spec.ts +++ b/packages/api/test/integration/package.spec.ts @@ -5,10 +5,11 @@ import { $ResponseExtend, $RequestExtend } from '../../types/custom'; import { initializeServer, publishTaggedVersion, publishVersion } from './_helper'; const mockApiJWTmiddleware = jest.fn( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'foo', groups: [], real_groups: [] }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: [] }; + _next(); + } ); jest.mock('@verdaccio/auth', () => ({ diff --git a/packages/api/test/integration/publish.spec.ts b/packages/api/test/integration/publish.spec.ts index d47c59456..1e5b2f46b 100644 --- a/packages/api/test/integration/publish.spec.ts +++ b/packages/api/test/integration/publish.spec.ts @@ -11,10 +11,11 @@ import { $ResponseExtend, $RequestExtend } from '../../types/custom'; import { initializeServer, publishVersion } from './_helper'; const mockApiJWTmiddleware = jest.fn( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'foo', groups: [], real_groups: [] }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: [] }; + _next(); + } ); jest.setTimeout(50000000); diff --git a/packages/api/test/integration/user.spec.ts b/packages/api/test/integration/user.spec.ts index 82e7e1dc9..34afb49f7 100644 --- a/packages/api/test/integration/user.spec.ts +++ b/packages/api/test/integration/user.spec.ts @@ -16,10 +16,11 @@ import { $RequestExtend, $ResponseExtend } from '../../types/custom'; import { initializeServer } from './_helper'; const mockApiJWTmiddleware = jest.fn( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'test', groups: [], real_groups: [] }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test', groups: [], real_groups: [] }; + _next(); + } ); const mockAuthenticate = jest.fn(() => (_name, _password, callback): void => { @@ -53,10 +54,11 @@ describe('user', () => { test('should test add a new user', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: undefined }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined }; + _next(); + } ); mockAddUser.mockImplementationOnce(() => (_name, _password, callback): void => { @@ -85,10 +87,11 @@ describe('user', () => { test('should test fails on add a existing user with login', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: undefined }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined }; + _next(); + } ); supertest(await initializeServer('user.yaml')) .put('/-/user/org.couchdb.user:jotaNew') @@ -124,10 +127,11 @@ describe('user', () => { test('should test fails add a new user with missing name', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: undefined }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined }; + _next(); + } ); mockAddUser.mockImplementationOnce(() => (_name, _password, callback): void => { return callback(getBadRequest(API_ERROR.USERNAME_PASSWORD_REQUIRED)); @@ -153,10 +157,11 @@ describe('user', () => { test('should test fails add a new user with missing password', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: undefined }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: undefined }; + _next(); + } ); const credentialsShort = _.cloneDeep(credentials); delete credentialsShort.password; @@ -181,10 +186,11 @@ describe('user', () => { test('should test fails add a new user with wrong password', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'test' }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test' }; + _next(); + } ); mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => { return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD)); @@ -210,10 +216,11 @@ describe('user', () => { test('should be able to logout an user', async (done) => { mockApiJWTmiddleware.mockImplementationOnce( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'test' }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'test' }; + _next(); + } ); mockAuthenticate.mockImplementationOnce(() => (_name, _password, callback): void => { return callback(getUnauthorized(API_ERROR.BAD_USERNAME_PASSWORD)); diff --git a/packages/api/test/integration/whoami.spec.ts b/packages/api/test/integration/whoami.spec.ts index bf7a1f200..78dd47b95 100644 --- a/packages/api/test/integration/whoami.spec.ts +++ b/packages/api/test/integration/whoami.spec.ts @@ -6,10 +6,11 @@ import { $RequestExtend, $ResponseExtend } from '../../types/custom'; import { initializeServer } from './_helper'; const mockApiJWTmiddleware = jest.fn( - () => (req: $RequestExtend, res: $ResponseExtend, _next): void => { - req.remote_user = { name: 'foo', groups: [], real_groups: [] }; - _next(); - } + () => + (req: $RequestExtend, res: $ResponseExtend, _next): void => { + req.remote_user = { name: 'foo', groups: [], real_groups: [] }; + _next(); + } ); jest.mock('@verdaccio/auth', () => ({ diff --git a/packages/core/htpasswd/tests/htpasswd.test.ts b/packages/core/htpasswd/tests/htpasswd.test.ts index 4c0782dab..226e2d8e9 100644 --- a/packages/core/htpasswd/tests/htpasswd.test.ts +++ b/packages/core/htpasswd/tests/htpasswd.test.ts @@ -31,7 +31,7 @@ describe('HTPasswd', () => { let wrapper; beforeEach(() => { - wrapper = new HTPasswd(getDefaultConfig(), (stuff as unknown) as VerdaccioConfigApp); + wrapper = new HTPasswd(getDefaultConfig(), stuff as unknown as VerdaccioConfigApp); jest.resetModules(); crypto.randomBytes = jest.fn(() => { diff --git a/packages/loaders/src/plugin-loader.ts b/packages/loaders/src/plugin-loader.ts index 4f916e516..dff548ef1 100644 --- a/packages/loaders/src/plugin-loader.ts +++ b/packages/loaders/src/plugin-loader.ts @@ -59,86 +59,84 @@ export function loadPlugin>( sanityCheck: any, prefix: string = 'verdaccio' ): any[] { - return Object.keys(pluginConfigs).map( - (pluginId: string): IPlugin => { - let plugin; + return Object.keys(pluginConfigs).map((pluginId: string): IPlugin => { + let plugin; - const localPlugin = Path.resolve(__dirname + '/../plugins', pluginId); - // try local plugins first - plugin = tryLoad(localPlugin); + const localPlugin = Path.resolve(__dirname + '/../plugins', pluginId); + // try local plugins first + plugin = tryLoad(localPlugin); - // try the external plugin directory - if (plugin === null && config.plugins) { - const pluginDir = config.plugins; - const externalFilePlugin = Path.resolve(pluginDir, pluginId); - plugin = tryLoad(externalFilePlugin); - - // npm package - if (plugin === null && pluginId.match(/^[^\.\/]/)) { - plugin = tryLoad(Path.resolve(pluginDir, `${prefix}-${pluginId}`)); - // compatibility for old sinopia plugins - if (!plugin) { - plugin = tryLoad(Path.resolve(pluginDir, `sinopia-${pluginId}`)); - } - } - } + // try the external plugin directory + if (plugin === null && config.plugins) { + const pluginDir = config.plugins; + const externalFilePlugin = Path.resolve(pluginDir, pluginId); + plugin = tryLoad(externalFilePlugin); // npm package if (plugin === null && pluginId.match(/^[^\.\/]/)) { - plugin = tryLoad(`${prefix}-${pluginId}`); + plugin = tryLoad(Path.resolve(pluginDir, `${prefix}-${pluginId}`)); // compatibility for old sinopia plugins if (!plugin) { - plugin = tryLoad(`sinopia-${pluginId}`); + plugin = tryLoad(Path.resolve(pluginDir, `sinopia-${pluginId}`)); } } - - if (plugin === null) { - plugin = tryLoad(pluginId); - } - - // relative to config path - if (plugin === null && pluginId.match(/^\.\.?($|\/)/)) { - plugin = tryLoad(Path.resolve(Path.dirname(config.config_path), pluginId)); - } - - if (plugin === null) { - logger.error( - { content: pluginId, prefix }, - 'plugin not found. try npm install @{prefix}-@{content}' - ); - throw Error(` - ${prefix}-${pluginId} plugin not found. try "npm install ${prefix}-${pluginId}"`); - } - - if (!isValid(plugin)) { - logger.error( - { content: pluginId }, - '@{prefix}-@{content} plugin does not have the right code structure' - ); - throw Error(`"${pluginId}" plugin does not have the right code structure`); - } - - /* eslint new-cap:off */ - try { - plugin = isES6(plugin) - ? new plugin.default(mergeConfig(config, pluginConfigs[pluginId]), params) - : plugin(pluginConfigs[pluginId], params); - } catch (error) { - plugin = null; - logger.error({ error, pluginId }, 'error loading a plugin @{pluginId}: @{error}'); - } - /* eslint new-cap:off */ - - if (plugin === null || !sanityCheck(plugin)) { - logger.error( - { content: pluginId, prefix }, - "@{prefix}-@{content} doesn't look like a valid plugin" - ); - throw Error(`sanity check has failed, "${pluginId}" is not a valid plugin`); - } - - debug('Plugin successfully loaded: %o-%o', pluginId, prefix); - return plugin; } - ); + + // npm package + if (plugin === null && pluginId.match(/^[^\.\/]/)) { + plugin = tryLoad(`${prefix}-${pluginId}`); + // compatibility for old sinopia plugins + if (!plugin) { + plugin = tryLoad(`sinopia-${pluginId}`); + } + } + + if (plugin === null) { + plugin = tryLoad(pluginId); + } + + // relative to config path + if (plugin === null && pluginId.match(/^\.\.?($|\/)/)) { + plugin = tryLoad(Path.resolve(Path.dirname(config.config_path), pluginId)); + } + + if (plugin === null) { + logger.error( + { content: pluginId, prefix }, + 'plugin not found. try npm install @{prefix}-@{content}' + ); + throw Error(` + ${prefix}-${pluginId} plugin not found. try "npm install ${prefix}-${pluginId}"`); + } + + if (!isValid(plugin)) { + logger.error( + { content: pluginId }, + '@{prefix}-@{content} plugin does not have the right code structure' + ); + throw Error(`"${pluginId}" plugin does not have the right code structure`); + } + + /* eslint new-cap:off */ + try { + plugin = isES6(plugin) + ? new plugin.default(mergeConfig(config, pluginConfigs[pluginId]), params) + : plugin(pluginConfigs[pluginId], params); + } catch (error) { + plugin = null; + logger.error({ error, pluginId }, 'error loading a plugin @{pluginId}: @{error}'); + } + /* eslint new-cap:off */ + + if (plugin === null || !sanityCheck(plugin)) { + logger.error( + { content: pluginId, prefix }, + "@{prefix}-@{content} doesn't look like a valid plugin" + ); + throw Error(`sanity check has failed, "${pluginId}" is not a valid plugin`); + } + + debug('Plugin successfully loaded: %o-%o', pluginId, prefix); + return plugin; + }); } diff --git a/packages/plugins/active-directory/src/active-directory.ts b/packages/plugins/active-directory/src/active-directory.ts index 1e826c533..71a192175 100644 --- a/packages/plugins/active-directory/src/active-directory.ts +++ b/packages/plugins/active-directory/src/active-directory.ts @@ -51,7 +51,7 @@ class ActiveDirectoryPlugin implements IPluginAuth { connection.getGroupMembershipForUser(username, (err, groups: object[]): void => { if (err) { this.logger.warn(`AD - Active Directory group check failed with error: ${err}`); - return cb(getInternalError((err as unknown) as string)); + return cb(getInternalError(err as unknown as string)); } const requestedGroups = Array.isArray(groupName) ? groupName : [groupName]; diff --git a/packages/plugins/active-directory/tests/active-directory.test.ts b/packages/plugins/active-directory/tests/active-directory.test.ts index d474ee612..ceb690887 100644 --- a/packages/plugins/active-directory/tests/active-directory.test.ts +++ b/packages/plugins/active-directory/tests/active-directory.test.ts @@ -83,7 +83,7 @@ describe('Active Directory Plugin', () => { const errorMessage = 'Unknown error retrieving groups'; ActiveDirectory.prototype.authenticate = jest.fn((_1, _2, cb) => cb(null, true)); ActiveDirectory.prototype.getGroupMembershipForUser = jest.fn((_, cb) => - cb((errorMessage as unknown) as object, null) + cb(errorMessage as unknown as object, null) ) as jest.Mock; adPluginSingleGroup.authenticate('', '', (error, authUser) => { diff --git a/packages/plugins/aws-storage/src/s3PackageManager.ts b/packages/plugins/aws-storage/src/s3PackageManager.ts index 7fed951bd..878da484a 100644 --- a/packages/plugins/aws-storage/src/s3PackageManager.ts +++ b/packages/plugins/aws-storage/src/s3PackageManager.ts @@ -29,14 +29,8 @@ export default class S3PackageManager implements ILocalPackageManager { this.config = config; this.packageName = packageName; this.logger = logger; - const { - endpoint, - region, - s3ForcePathStyle, - accessKeyId, - secretAccessKey, - sessionToken, - } = config; + const { endpoint, region, s3ForcePathStyle, accessKeyId, secretAccessKey, sessionToken } = + config; this.s3 = new S3({ endpoint, diff --git a/packages/plugins/aws-storage/tests/s3PackageManager.test.ts b/packages/plugins/aws-storage/tests/s3PackageManager.test.ts index 26dba17cc..7343f6a0d 100644 --- a/packages/plugins/aws-storage/tests/s3PackageManager.test.ts +++ b/packages/plugins/aws-storage/tests/s3PackageManager.test.ts @@ -79,7 +79,7 @@ describe.skip('S3 package manager', () => { describe('savePackage() group', () => { test('savePackage()', (done) => { - const data = ('{data:5}' as unknown) as Package; + const data = '{data:5}' as unknown as Package; const packageManager = new S3PackageManager(config, 'first-package', logger); packageManager.savePackage('pkg.1.0.0.tar.gz', data, (err) => { diff --git a/packages/plugins/google-cloud-storage/src/data-storage.ts b/packages/plugins/google-cloud-storage/src/data-storage.ts index ec4f047f1..9eada5598 100644 --- a/packages/plugins/google-cloud-storage/src/data-storage.ts +++ b/packages/plugins/google-cloud-storage/src/data-storage.ts @@ -118,14 +118,12 @@ 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 { @@ -194,17 +192,15 @@ 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/packages/plugins/google-cloud-storage/src/storage.ts b/packages/plugins/google-cloud-storage/src/storage.ts index d23810e9f..b3b4000c5 100644 --- a/packages/plugins/google-cloud-storage/src/storage.ts +++ b/packages/plugins/google-cloud-storage/src/storage.ts @@ -90,16 +90,14 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { 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()); - } - ); + .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 { @@ -197,28 +195,26 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { /* 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) { + reject(getInternalError(err.message)); } - ); + }); } /* eslint-enable no-async-promise-executor */ @@ -244,48 +240,44 @@ class GoogleCloudStorageHandler implements IPackageStorageManager { /* 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 { - // @ts-ignore - const data = await file.exists(); - const exist = data[0]; + 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]; - 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}' - ); + 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}' + ); - reject(getInternalError(err.message)); - } + reject(getInternalError(err.message)); } - ); + }); } private async _readPackage(name: string): Promise { - return new Promise( - async (resolve, reject): Promise => { - const file = this.helper.buildFilePath(name, pkgFileName); + 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')); + 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()); - } + 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 */ diff --git a/packages/plugins/ui-theme/src/components/AutoComplete/useAutoComplete.tsx b/packages/plugins/ui-theme/src/components/AutoComplete/useAutoComplete.tsx index 8267e542f..33492ce19 100644 --- a/packages/plugins/ui-theme/src/components/AutoComplete/useAutoComplete.tsx +++ b/packages/plugins/ui-theme/src/components/AutoComplete/useAutoComplete.tsx @@ -21,8 +21,13 @@ export interface FilterOptionsState