enhance: Perform port diagnosis at startup only when Listen fails (#8698)
* Change port check * Comment: disableClustering * CHANGELOG * Smart message
This commit is contained in:
		
							parent
							
								
									e3f2d469c0
								
							
						
					
					
						commit
						b6794b614b
					
				
					 7 changed files with 29 additions and 96 deletions
				
			
		|  | @ -22,6 +22,7 @@ You should also include the user name that made the change. | ||||||
| - update dependencies @syuilo | - update dependencies @syuilo | ||||||
| - enhance: display URL of QR code for TOTP registration @syuilo | - enhance: display URL of QR code for TOTP registration @syuilo | ||||||
| - make CAPTCHA required for signin to improve security @syuilo | - make CAPTCHA required for signin to improve security @syuilo | ||||||
|  | - Perform port diagnosis at startup only when Listen fails @mei23 | ||||||
| 
 | 
 | ||||||
| ### Bugfixes | ### Bugfixes | ||||||
| - Client: fix settings page @tamaina | - Client: fix settings page @tamaina | ||||||
|  |  | ||||||
|  | @ -77,7 +77,6 @@ | ||||||
| 		"os-utils": "0.0.14", | 		"os-utils": "0.0.14", | ||||||
| 		"parse5": "6.0.1", | 		"parse5": "6.0.1", | ||||||
| 		"pg": "8.7.3", | 		"pg": "8.7.3", | ||||||
| 		"portscanner": "2.2.0", |  | ||||||
| 		"private-ip": "2.3.3", | 		"private-ip": "2.3.3", | ||||||
| 		"probe-image-size": "7.2.3", | 		"probe-image-size": "7.2.3", | ||||||
| 		"promise-limit": "2.7.0", | 		"promise-limit": "2.7.0", | ||||||
|  | @ -151,7 +150,6 @@ | ||||||
| 		"@types/nodemailer": "6.4.4", | 		"@types/nodemailer": "6.4.4", | ||||||
| 		"@types/oauth": "0.9.1", | 		"@types/oauth": "0.9.1", | ||||||
| 		"@types/parse5": "6.0.3", | 		"@types/parse5": "6.0.3", | ||||||
| 		"@types/portscanner": "2.1.1", |  | ||||||
| 		"@types/pug": "2.0.6", | 		"@types/pug": "2.0.6", | ||||||
| 		"@types/punycode": "2.1.0", | 		"@types/punycode": "2.1.0", | ||||||
| 		"@types/qrcode": "1.4.2", | 		"@types/qrcode": "1.4.2", | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ import * as os from 'node:os'; | ||||||
| import cluster from 'node:cluster'; | import cluster from 'node:cluster'; | ||||||
| import chalk from 'chalk'; | import chalk from 'chalk'; | ||||||
| import chalkTemplate from 'chalk-template'; | import chalkTemplate from 'chalk-template'; | ||||||
| import * as portscanner from 'portscanner'; |  | ||||||
| import semver from 'semver'; | import semver from 'semver'; | ||||||
| 
 | 
 | ||||||
| import Logger from '@/services/logger.js'; | import Logger from '@/services/logger.js'; | ||||||
|  | @ -48,11 +47,6 @@ function greet() { | ||||||
| 	bootLogger.info(`Misskey v${meta.version}`, null, true); | 	bootLogger.info(`Misskey v${meta.version}`, null, true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function isRoot() { |  | ||||||
| 	// maybe process.getuid will be undefined under not POSIX environment (e.g. Windows)
 |  | ||||||
| 	return process.getuid != null && process.getuid() === 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** | /** | ||||||
|  * Init master process |  * Init master process | ||||||
|  */ |  */ | ||||||
|  | @ -67,7 +61,6 @@ export async function masterMain() { | ||||||
| 		showNodejsVersion(); | 		showNodejsVersion(); | ||||||
| 		config = loadConfigBoot(); | 		config = loadConfigBoot(); | ||||||
| 		await connectDb(); | 		await connectDb(); | ||||||
| 		await validatePort(config); |  | ||||||
| 	} catch (e) { | 	} catch (e) { | ||||||
| 		bootLogger.error('Fatal error occurred during initialization', null, true); | 		bootLogger.error('Fatal error occurred during initialization', null, true); | ||||||
| 		process.exit(1); | 		process.exit(1); | ||||||
|  | @ -97,8 +90,6 @@ function showEnvironment(): void { | ||||||
| 		logger.warn('The environment is not in production mode.'); | 		logger.warn('The environment is not in production mode.'); | ||||||
| 		logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true); | 		logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', null, true); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	logger.info(`You ${isRoot() ? '' : 'do not '}have root privileges`); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function showNodejsVersion(): void { | function showNodejsVersion(): void { | ||||||
|  | @ -152,29 +143,6 @@ async function connectDb(): Promise<void> { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function validatePort(config: Config): Promise<void> { |  | ||||||
| 	const isWellKnownPort = (port: number) => port < 1024; |  | ||||||
| 
 |  | ||||||
| 	async function isPortAvailable(port: number): Promise<boolean> { |  | ||||||
| 		return await portscanner.checkPortStatus(port, '127.0.0.1') === 'closed'; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (config.port == null || Number.isNaN(config.port)) { |  | ||||||
| 		bootLogger.error('The port is not configured. Please configure port.', null, true); |  | ||||||
| 		process.exit(1); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (process.platform === 'linux' && isWellKnownPort(config.port) && !isRoot()) { |  | ||||||
| 		bootLogger.error('You need root privileges to listen on well-known port on Linux', null, true); |  | ||||||
| 		process.exit(1); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (!await isPortAvailable(config.port)) { |  | ||||||
| 		bootLogger.error(`Port ${config.port} is already in use`, null, true); |  | ||||||
| 		process.exit(1); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| async function spawnWorkers(limit: number = 1) { | async function spawnWorkers(limit: number = 1) { | ||||||
| 	const workers = Math.min(limit, os.cpus().length); | 	const workers = Math.min(limit, os.cpus().length); | ||||||
| 	bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`); | 	bootLogger.info(`Starting ${workers} worker${workers === 1 ? '' : 's'}...`); | ||||||
|  | @ -186,6 +154,10 @@ function spawnWorker(): Promise<void> { | ||||||
| 	return new Promise(res => { | 	return new Promise(res => { | ||||||
| 		const worker = cluster.fork(); | 		const worker = cluster.fork(); | ||||||
| 		worker.on('message', message => { | 		worker.on('message', message => { | ||||||
|  | 			if (message === 'listenFailed') { | ||||||
|  | 				bootLogger.error(`The server Listen failed due to the previous error.`); | ||||||
|  | 				process.exit(1); | ||||||
|  | 			} | ||||||
| 			if (message !== 'ready') return; | 			if (message !== 'ready') return; | ||||||
| 			res(); | 			res(); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  * Core Server |  * Core Server | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | import cluster from 'node:cluster'; | ||||||
| import * as fs from 'node:fs'; | import * as fs from 'node:fs'; | ||||||
| import * as http from 'node:http'; | import * as http from 'node:http'; | ||||||
| import Koa from 'koa'; | import Koa from 'koa'; | ||||||
|  | @ -142,5 +143,26 @@ export default () => new Promise(resolve => { | ||||||
| 
 | 
 | ||||||
| 	initializeStreamingServer(server); | 	initializeStreamingServer(server); | ||||||
| 
 | 
 | ||||||
|  | 	server.on('error', e => { | ||||||
|  | 		switch ((e as any).code) { | ||||||
|  | 			case 'EACCES': | ||||||
|  | 				serverLogger.error(`You do not have permission to listen on port ${config.port}.`); | ||||||
|  | 				break; | ||||||
|  | 			case 'EADDRINUSE': | ||||||
|  | 				serverLogger.error(`Port ${config.port} is already in use by another process.`); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				serverLogger.error(e); | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (cluster.isWorker) { | ||||||
|  | 			process.send!('listenFailed'); | ||||||
|  | 		} else { | ||||||
|  | 			// disableClustering
 | ||||||
|  | 			process.exit(1); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
| 	server.listen(config.port, resolve); | 	server.listen(config.port, resolve); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | @ -705,11 +705,6 @@ | ||||||
|   resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" |   resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" | ||||||
|   integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== |   integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== | ||||||
| 
 | 
 | ||||||
| "@types/portscanner@2.1.1": |  | ||||||
|   version "2.1.1" |  | ||||||
|   resolved "https://registry.yarnpkg.com/@types/portscanner/-/portscanner-2.1.1.tgz#89d5094e16f3d941f20f3889dfa5d3a164b3dd3b" |  | ||||||
|   integrity sha512-1NsVIbgBKvrqxwtMN0V6CLji1ERwKSI/RWz0J3y++CzSwYNGBStCfpIFgxV3ZwxsDR5PoZqoUWhwraDm+Ztn0Q== |  | ||||||
| 
 |  | ||||||
| "@types/pug@2.0.6": | "@types/pug@2.0.6": | ||||||
|   version "2.0.6" |   version "2.0.6" | ||||||
|   resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" |   resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" | ||||||
|  | @ -1254,13 +1249,6 @@ async@>=0.2.9: | ||||||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" |   resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" | ||||||
|   integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== |   integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== | ||||||
| 
 | 
 | ||||||
| async@^2.6.0: |  | ||||||
|   version "2.6.3" |  | ||||||
|   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" |  | ||||||
|   integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== |  | ||||||
|   dependencies: |  | ||||||
|     lodash "^4.17.14" |  | ||||||
| 
 |  | ||||||
| async@^3.2.3: | async@^3.2.3: | ||||||
|   version "3.2.3" |   version "3.2.3" | ||||||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" |   resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" | ||||||
|  | @ -3861,13 +3849,6 @@ is-negative-zero@^2.0.1: | ||||||
|   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" |   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" | ||||||
|   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== |   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== | ||||||
| 
 | 
 | ||||||
| is-number-like@^1.0.3: |  | ||||||
|   version "1.0.8" |  | ||||||
|   resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" |  | ||||||
|   integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== |  | ||||||
|   dependencies: |  | ||||||
|     lodash.isfinite "^3.3.2" |  | ||||||
| 
 |  | ||||||
| is-number-object@^1.0.4: | is-number-object@^1.0.4: | ||||||
|   version "1.0.6" |   version "1.0.6" | ||||||
|   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" |   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" | ||||||
|  | @ -4498,11 +4479,6 @@ lodash.isequal@^4.5.0: | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" |   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" | ||||||
|   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= |   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= | ||||||
| 
 | 
 | ||||||
| lodash.isfinite@^3.3.2: |  | ||||||
|   version "3.3.2" |  | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" |  | ||||||
|   integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= |  | ||||||
| 
 |  | ||||||
| lodash.isplainobject@^4.0.6: | lodash.isplainobject@^4.0.6: | ||||||
|   version "4.0.6" |   version "4.0.6" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" |   resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" | ||||||
|  | @ -4548,7 +4524,7 @@ lodash.union@^4.6.0: | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" |   resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" | ||||||
|   integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= |   integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= | ||||||
| 
 | 
 | ||||||
| lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: | lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.21: | ||||||
|   version "4.17.21" |   version "4.17.21" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" |   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||||
|   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== |   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== | ||||||
|  | @ -5541,14 +5517,6 @@ pngjs@^5.0.0: | ||||||
|   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" |   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" | ||||||
|   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== |   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== | ||||||
| 
 | 
 | ||||||
| portscanner@2.2.0: |  | ||||||
|   version "2.2.0" |  | ||||||
|   resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" |  | ||||||
|   integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== |  | ||||||
|   dependencies: |  | ||||||
|     async "^2.6.0" |  | ||||||
|     is-number-like "^1.0.3" |  | ||||||
| 
 |  | ||||||
| postcss@^8.3.11: | postcss@^8.3.11: | ||||||
|   version "8.3.11" |   version "8.3.11" | ||||||
|   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" |   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" | ||||||
|  |  | ||||||
|  | @ -42,7 +42,6 @@ | ||||||
| 		"nested-property": "4.0.0", | 		"nested-property": "4.0.0", | ||||||
| 		"parse5": "6.0.1", | 		"parse5": "6.0.1", | ||||||
| 		"photoswipe": "5.2.7", | 		"photoswipe": "5.2.7", | ||||||
| 		"portscanner": "2.2.0", |  | ||||||
| 		"prismjs": "1.28.0", | 		"prismjs": "1.28.0", | ||||||
| 		"private-ip": "2.3.3", | 		"private-ip": "2.3.3", | ||||||
| 		"promise-limit": "2.7.0", | 		"promise-limit": "2.7.0", | ||||||
|  |  | ||||||
|  | @ -751,13 +751,6 @@ astral-regex@^2.0.0: | ||||||
|   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" |   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" | ||||||
|   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== |   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== | ||||||
| 
 | 
 | ||||||
| async@^2.6.0: |  | ||||||
|   version "2.6.3" |  | ||||||
|   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" |  | ||||||
|   integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== |  | ||||||
|   dependencies: |  | ||||||
|     lodash "^4.17.14" |  | ||||||
| 
 |  | ||||||
| async@^3.2.0: | async@^3.2.0: | ||||||
|   version "3.2.1" |   version "3.2.1" | ||||||
|   resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" |   resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" | ||||||
|  | @ -2519,13 +2512,6 @@ is-negative-zero@^2.0.1: | ||||||
|   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" |   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" | ||||||
|   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== |   integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== | ||||||
| 
 | 
 | ||||||
| is-number-like@^1.0.3: |  | ||||||
|   version "1.0.8" |  | ||||||
|   resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" |  | ||||||
|   integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== |  | ||||||
|   dependencies: |  | ||||||
|     lodash.isfinite "^3.3.2" |  | ||||||
| 
 |  | ||||||
| is-number-object@^1.0.4: | is-number-object@^1.0.4: | ||||||
|   version "1.0.6" |   version "1.0.6" | ||||||
|   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" |   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" | ||||||
|  | @ -2789,11 +2775,6 @@ locate-path@^6.0.0: | ||||||
|   dependencies: |   dependencies: | ||||||
|     p-locate "^5.0.0" |     p-locate "^5.0.0" | ||||||
| 
 | 
 | ||||||
| lodash.isfinite@^3.3.2: |  | ||||||
|   version "3.3.2" |  | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" |  | ||||||
|   integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= |  | ||||||
| 
 |  | ||||||
| lodash.merge@^4.6.2: | lodash.merge@^4.6.2: | ||||||
|   version "4.6.2" |   version "4.6.2" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" |   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" | ||||||
|  | @ -2804,7 +2785,7 @@ lodash.once@^4.1.1: | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" |   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" | ||||||
|   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= |   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= | ||||||
| 
 | 
 | ||||||
| lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: | lodash@^4.17.19, lodash@^4.17.21: | ||||||
|   version "4.17.21" |   version "4.17.21" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" |   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||||
|   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== |   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== | ||||||
|  | @ -3303,14 +3284,6 @@ pngjs@^5.0.0: | ||||||
|   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" |   resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" | ||||||
|   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== |   integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== | ||||||
| 
 | 
 | ||||||
| portscanner@2.2.0: |  | ||||||
|   version "2.2.0" |  | ||||||
|   resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" |  | ||||||
|   integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== |  | ||||||
|   dependencies: |  | ||||||
|     async "^2.6.0" |  | ||||||
|     is-number-like "^1.0.3" |  | ||||||
| 
 |  | ||||||
| postcss-selector-parser@^6.0.9: | postcss-selector-parser@^6.0.9: | ||||||
|   version "6.0.9" |   version "6.0.9" | ||||||
|   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" |   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue