From 7d6e1d3e3deac93fa11f3247c1ac71c06a0abdeb Mon Sep 17 00:00:00 2001 From: whyour Date: Sat, 19 Feb 2022 17:36:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=9A=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/data/cron.ts | 2 +- back/loaders/initData.ts | 18 +++++++ back/services/schedule.ts | 82 +++++++++++++++++++++++++++++--- back/services/system.ts | 10 ++-- back/services/user.ts | 4 +- package.json | 1 + src/pages/setting/index.less | 6 ++- src/pages/setting/index.tsx | 28 +++++++---- yarn.lock | 91 +++++++++--------------------------- 9 files changed, 146 insertions(+), 96 deletions(-) diff --git a/back/data/cron.ts b/back/data/cron.ts index d6f829cf..b73624ba 100644 --- a/back/data/cron.ts +++ b/back/data/cron.ts @@ -4,7 +4,7 @@ import { DataTypes, Model, ModelDefined } from 'sequelize'; export class Crontab { name?: string; command: string; - schedule: string; + schedule?: string; timestamp?: string; saved?: boolean; id?: number; diff --git a/back/loaders/initData.ts b/back/loaders/initData.ts index 9c7ab534..1d429ae5 100644 --- a/back/loaders/initData.ts +++ b/back/loaders/initData.ts @@ -7,11 +7,15 @@ import EnvService from '../services/env'; import _ from 'lodash'; import { DependenceModel } from '../data/dependence'; import { Op } from 'sequelize'; +import SystemService from '../services/system'; +import ScheduleService from '../services/schedule'; export default async () => { const cronService = Container.get(CronService); const envService = Container.get(EnvService); const dependenceService = Container.get(DependenceService); + const systemService = Container.get(SystemService); + const scheduleService = Container.get(ScheduleService); // 初始化更新所有任务状态为空闲 await CrontabModel.update( @@ -53,6 +57,20 @@ export default async () => { // 初始化保存一次ck和定时任务数据 await cronService.autosave_crontab(); await envService.set_envs(); + + // 运行删除日志任务 + const data = await systemService.getLogRemoveFrequency(); + if (data && data.info && data.info.frequency) { + const cron = { + id: data.id, + name: '删除日志', + command: `ql rmlog ${data.info.frequency}`, + }; + await scheduleService.createIntervalTask(cron, { + days: data.info.frequency, + runImmediately: true, + }); + } }; function randomSchedule(from: number, to: number) { diff --git a/back/services/schedule.ts b/back/services/schedule.ts index 419906ea..fb884414 100644 --- a/back/services/schedule.ts +++ b/back/services/schedule.ts @@ -3,24 +3,33 @@ import winston from 'winston'; import nodeSchedule from 'node-schedule'; import { Crontab } from '../data/cron'; import { exec } from 'child_process'; +import { + ToadScheduler, + SimpleIntervalJob, + Task, + SimpleIntervalSchedule, +} from 'toad-scheduler'; @Service() export default class ScheduleService { - private scheduleStacks = new Map(); + private scheduleStacks = new Map(); + + private intervalSchedule = new ToadScheduler(); constructor(@Inject('logger') private logger: winston.Logger) {} - async generateSchedule({ id = 0, command, name, schedule }: Crontab) { + async createCronTask({ id = 0, command, name, schedule = '' }: Crontab) { + const _id = this.formatId(id); this.logger.info( - '[创建定时任务],任务ID: %s,cron: %s,任务名: %s,执行命令: %s', - id, + '[创建cron任务],任务ID: %s,cron: %s,任务名: %s,执行命令: %s', + _id, schedule, name, command, ); this.scheduleStacks.set( - id, + _id, nodeSchedule.scheduleJob(id + '', schedule, async () => { try { exec(command, async (error, stdout, stderr) => { @@ -55,8 +64,67 @@ export default class ScheduleService { ); } - async cancelSchedule({ id = 0, name }: Crontab) { + async cancelCronTask({ id = 0, name }: Crontab) { + const _id = this.formatId(id); this.logger.info('[取消定时任务],任务名:%s', name); - this.scheduleStacks.has(id) && this.scheduleStacks.get(id)?.cancel(); + this.scheduleStacks.has(_id) && this.scheduleStacks.get(_id)?.cancel(); + } + + async createIntervalTask( + { id = 0, command, name = '' }: Crontab, + schedule: SimpleIntervalSchedule, + ) { + const _id = this.formatId(id); + this.logger.info( + '[创建interval任务],任务ID: %s,任务名: %s,执行命令: %s', + _id, + name, + command, + ); + const task = new Task(name, async () => { + try { + exec(command, async (error, stdout, stderr) => { + if (error) { + await this.logger.info( + '执行任务%s失败,时间:%s, 错误信息:%j', + command, + new Date().toLocaleString(), + error, + ); + } + + if (stderr) { + await this.logger.info( + '执行任务%s失败,时间:%s, 错误信息:%j', + command, + new Date().toLocaleString(), + stderr, + ); + } + }); + } catch (error) { + await this.logger.info( + '执行任务%s失败,时间:%s, 错误信息:%j', + command, + new Date().toLocaleString(), + error, + ); + } finally { + } + }); + + const job = new SimpleIntervalJob({ ...schedule }, task, _id); + + this.intervalSchedule.addIntervalJob(job); + } + + async cancelIntervalTask({ id = 0, name }: Crontab) { + const _id = this.formatId(id); + this.logger.info('[取消interval任务],任务ID: %s,任务名:%s', _id, name); + this.intervalSchedule.removeById(_id); + } + + private formatId(id: number): string { + return String(id); } } diff --git a/back/services/system.ts b/back/services/system.ts index 59d05d55..dc633226 100644 --- a/back/services/system.ts +++ b/back/services/system.ts @@ -24,7 +24,7 @@ export default class SystemService { public async getLogRemoveFrequency() { const doc = await this.getDb({ type: AuthDataType.removeLogFrequency }); - return (doc && doc.info) || {}; + return doc || {}; } private async updateAuthDb(payload: AuthInfo): Promise { @@ -65,11 +65,13 @@ export default class SystemService { id: result.id, name: '删除日志', command: `ql rmlog ${frequency}`, - schedule: `5 23 */${frequency} * *`, }; - await this.scheduleService.cancelSchedule(cron); + await this.scheduleService.cancelIntervalTask(cron); if (frequency > 0) { - await this.scheduleService.generateSchedule(cron); + await this.scheduleService.createIntervalTask(cron, { + days: frequency, + runImmediately: true, + }); } return { code: 200, data: { ...cron } }; } diff --git a/back/services/user.ts b/back/services/user.ts index 33ee3f83..be672a7f 100644 --- a/back/services/user.ts +++ b/back/services/user.ts @@ -360,9 +360,9 @@ export default class UserService { command: `ql rmlog ${frequency}`, schedule: `5 23 */${frequency} * *`, }; - await this.scheduleService.cancelSchedule(cron); + await this.scheduleService.cancelCronTask(cron); if (frequency > 0) { - await this.scheduleService.generateSchedule(cron); + await this.scheduleService.createCronTask(cron); } return { code: 200, data: { ...cron } }; } diff --git a/package.json b/package.json index d3748b94..4de35974 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "serve-handler": "^6.1.3", "sockjs": "^0.3.21", "sqlite3": "^5.0.2", + "toad-scheduler": "^1.6.0", "typedi": "^0.8.0", "uuid": "^8.3.2", "winston": "^3.3.3", diff --git a/src/pages/setting/index.less b/src/pages/setting/index.less index 3e02b2dc..55aeb3ad 100644 --- a/src/pages/setting/index.less +++ b/src/pages/setting/index.less @@ -1,8 +1,10 @@ .container { display: flex; justify-content: center; - align-items: center; - padding: 50px 130px; + flex-wrap: wrap; + max-width: 800px; + margin: 20px auto; + .right { display: flex; justify-content: center; diff --git a/src/pages/setting/index.tsx b/src/pages/setting/index.tsx index f86d4b77..7894375e 100644 --- a/src/pages/setting/index.tsx +++ b/src/pages/setting/index.tsx @@ -12,6 +12,7 @@ import { Modal, message, Typography, + Input, } from 'antd'; import config from '@/utils/config'; import { PageContainer } from '@ant-design/pro-layout'; @@ -273,8 +274,10 @@ const Setting = ({ request .get(`${config.apiPrefix}system/log/remove`) .then((data: any) => { - setLogRemoveFrequency(data.data.frequency); - form.setFieldsValue({ frequency: data.data.frequency }); + if (data.data.info) { + const { frequency } = data.data.info; + setLogRemoveFrequency(frequency); + } }) .catch((error: any) => { console.log(error); @@ -367,14 +370,19 @@ const Setting = ({ name="frequency" tooltip="每x天自动删除x天以前的日志" > - setLogRemoveFrequency(value)} - /> + + setLogRemoveFrequency(value)} + /> + + diff --git a/yarn.lock b/yarn.lock index 3a0c96f5..f0ceae5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -868,7 +868,7 @@ "@sentry/browser@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.17.2.tgz#8e794b846f43a341068c83420918d896683d903e" + resolved "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.2.tgz" integrity sha512-4Ow5z9GxK5dG9+stBNKb7s6NoxE4wgEcHRmO66QTK4gH2NNmzV4R/aaZ7iDoS/lD86sH0M86jm76dpg9uiJPmw== dependencies: "@sentry/core" "6.17.2" @@ -878,7 +878,7 @@ "@sentry/core@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.17.2.tgz#f218920f269ccdbaee20a092bbc90a71a007cc88" + resolved "https://registry.npmjs.org/@sentry/core/-/core-6.17.2.tgz" integrity sha512-Uew0CNMr+QvowrF4EJYjOUgHep/sZJ3l5zevPEELugIgqWBodd+ZDCV3fQFR7cr6KOqx1rMgVrgcKIkLl0l+RA== dependencies: "@sentry/hub" "6.17.2" @@ -889,7 +889,7 @@ "@sentry/hub@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.17.2.tgz#d92accada845fa21fff1b2b491d3c6964851693b" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.2.tgz" integrity sha512-CMi6jU920bTwRTmGHjP4u8toOx4gm1dsx+rsxvp+FKzqRwpwoyi9mOw8oEYERVzaqaYceGdFylyRUrjdf0f77g== dependencies: "@sentry/types" "6.17.2" @@ -898,7 +898,7 @@ "@sentry/minimal@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.17.2.tgz#3b482a0d76aa33b6c9441dd21acbcc3a113e5120" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.2.tgz" integrity sha512-Cdh+iM6QhLKfxwUWWP4mk2K7+EsQj4tuF2dGQke4Zcbp7zQ7wbcMruUcZHiZfvg5kiSYxwNVkH7cXMzcO7AJsg== dependencies: "@sentry/hub" "6.17.2" @@ -907,7 +907,7 @@ "@sentry/node@^6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.17.2.tgz#32a5fa00b64a331073daf1e44f500c8c57184eb1" + resolved "https://registry.npmjs.org/@sentry/node/-/node-6.17.2.tgz" integrity sha512-358z45WaejnsE8RZVpuLJJiFVCSEi0TRY7P60CljZuz8rnvniD3G0tuXChvu4djVty8NScWZHT/QoxvuJdTHgQ== dependencies: "@sentry/core" "6.17.2" @@ -922,7 +922,7 @@ "@sentry/react@^6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.17.2.tgz#ba2a65141ef3f3c2416313b448e06f6764a9f274" + resolved "https://registry.npmjs.org/@sentry/react/-/react-6.17.2.tgz" integrity sha512-/5mcHLxBhdh67EI6mGj20NwGCZbBjJdEOmTNTUydvNGXa9Rvrluf1iz2hNSH4sju0d/Qt1rakxC5y8gWy1E5Kw== dependencies: "@sentry/browser" "6.17.2" @@ -934,7 +934,7 @@ "@sentry/tracing@6.17.2", "@sentry/tracing@^6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.17.2.tgz#437337071fdeffa319746905b3706518b099ec6b" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.2.tgz" integrity sha512-oWY2Ga+5D5f90utvfF2Y0eQvme+eS768ZWjR+klRYgZWoY8r1v8uWwWsvroYU1g+h6X0G/xh3giFjsdOWtRENw== dependencies: "@sentry/hub" "6.17.2" @@ -945,12 +945,12 @@ "@sentry/types@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.17.2.tgz#4dde3423db5953e798b19ed29618c28fc7bf2e30" + resolved "https://registry.npmjs.org/@sentry/types/-/types-6.17.2.tgz" integrity sha512-UrFLRDz5mn253O8k/XftLxoldF+NyZdkqKLGIQmST5HEVr7ub9nQJ4Y5ZFA3zJYWpraaW8faIbuw+pgetC8hmQ== "@sentry/utils@6.17.2": version "6.17.2" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.17.2.tgz#e8044e753b47f86068053c8d79e4ae61a39b6732" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.2.tgz" integrity sha512-ePWtO44KJQwUULOiU86fa1WU3Ird2TH0i39gqB2d3zNS3QyVp9qPlzSdPKSPJ9LdgadzBHw7ikEuE+GY8JTrhA== dependencies: "@sentry/types" "6.17.2" @@ -1219,13 +1219,6 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/nedb@^1.8.11": - version "1.8.12" - resolved "https://registry.npmjs.org/@types/nedb/-/nedb-1.8.12.tgz" - integrity sha512-ICDoQMORMjOSqfNFXT4ENXfwwCir1BPblXNm0SPH7C4Q10ou+pvVagcFAJ+rrzf3A47tGU4K/KbzKu7wO9j45Q== - dependencies: - "@types/node" "*" - "@types/node-fetch@^2.5.8": version "2.5.11" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz" @@ -2290,11 +2283,6 @@ async-validator@^4.0.2: resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.0.3.tgz" integrity sha512-LVoIbJNHPKsO7FMLamo88uxdrvayGkF3vLTMTeiN3CqAbP3qSafLRc6yx3Sq9lHkiEOLNpoA2jwwnfGDdu1SMQ== -async@0.2.10: - version "0.2.10" - resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - async@^1.5.0: version "1.5.2" resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" @@ -2492,13 +2480,6 @@ binary-extensions@^2.0.0: resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binary-search-tree@0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz" - integrity sha1-fbs7IQ/coIJFDa0jNMMErzm9x4Q= - dependencies: - underscore "~1.4.4" - bindings@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" @@ -3169,7 +3150,7 @@ concat-map@0.0.1: concurrently@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.0.0.tgz#78d31b441cec338dab03316c221a2f9a67c529b0" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz" integrity sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw== dependencies: chalk "^4.1.0" @@ -3523,7 +3504,7 @@ csstype@^3.0.2: darkreader@4.9.40: version "4.9.40" - resolved "https://registry.yarnpkg.com/darkreader/-/darkreader-4.9.40.tgz#9217a2ae83d8aca0b4dc129bba78a0617aca5bce" + resolved "https://registry.npmjs.org/darkreader/-/darkreader-4.9.40.tgz" integrity sha512-Dm8S5jkXSIxvq9WitcvuH4KexV9ZuzGqDMsFOm2VwXzRkMo9VIg8udjq2Mm7cM6SaQSp/zzH4VIWioX93iWayQ== dashdash@^1.12.0: @@ -3558,7 +3539,7 @@ date-fns@2.x: date-fns@^2.16.1: version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== dayjs@1.x: @@ -4957,11 +4938,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" @@ -6224,13 +6200,6 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" - integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= - dependencies: - immediate "~3.0.5" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" @@ -6294,13 +6263,6 @@ loader-utils@^1.1.0: emojis-list "^3.0.0" json5 "^1.0.1" -localforage@^1.3.0: - version "1.9.0" - resolved "https://registry.npmjs.org/localforage/-/localforage-1.9.0.tgz" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== - dependencies: - lie "3.1.1" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" @@ -6690,7 +6652,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -6761,17 +6723,6 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nedb@^1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz" - integrity sha1-DjUCzYLABNU1WkPJ5VV3vXvZHYg= - dependencies: - async "0.2.10" - binary-search-tree "0.2.5" - localforage "^1.3.0" - mkdirp "~0.5.1" - underscore "~1.4.4" - needle@^2.2.1: version "2.9.1" resolved "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz" @@ -9807,7 +9758,7 @@ source-map@^0.7.3, source-map@~0.7.2: spawn-command@^0.0.2-1: version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz" integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= spdx-correct@^3.0.0: @@ -10348,6 +10299,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toad-scheduler@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/toad-scheduler/-/toad-scheduler-1.6.0.tgz#717b867d2f5da67d13d166ec16adc39d0506c537" + integrity sha512-+TdQhHTYLKfjXxLrAi4DgEptoQd99jUcr2teJnQrGlb70MEVrwP4SlVsaQO/dxCsNIM5qmYwZmynQd9tOPDRLQ== + toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" @@ -10403,7 +10359,7 @@ tr46@^2.1.0: tree-kill@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== triple-beam@^1.2.0, triple-beam@^1.3.0: @@ -10548,11 +10504,6 @@ undefsafe@^2.0.3: dependencies: debug "^2.2.0" -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz" - integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= - union-value@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" @@ -11173,7 +11124,7 @@ yargs@^15.4.1: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2"