diff --git a/README.md b/README.md index 31cfbbb..29e927d 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ USAGE * [`redmine-time-manager plugins:link PLUGIN`](#redmine-time-manager-pluginslink-plugin) * [`redmine-time-manager plugins:uninstall PLUGIN...`](#redmine-time-manager-pluginsuninstall-plugin) * [`redmine-time-manager plugins update`](#redmine-time-manager-plugins-update) +* [`redmine-time-manager save [FILE]`](#redmine-time-manager-save-file) ## `redmine-time-manager hello PERSON` @@ -244,4 +245,25 @@ FLAGS DESCRIPTION Update installed plugins. ``` + +## `redmine-time-manager save [FILE]` + +Save time entries to redmine + +``` +USAGE + $ redmine-time-manager save [FILE] [-n ] [-f] + +FLAGS + -f, --force + -n, --name= name to print + +DESCRIPTION + Save time entries to redmine + +EXAMPLES + $ redmine-time-manager save +``` + +_See code: [dist/commands/save.ts](https://github.com/pavel-g/redmine-time-manager-cli/blob/v0.0.0/dist/commands/save.ts)_ diff --git a/package.json b/package.json index c874de8..e03abf6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "redmine-time-manager-2", - "version": "0.0.0", - "description": "oclif example Hello World CLI", + "version": "0.1.0", + "description": "Redmine Time Manager", "author": "Pavel Gnedov @pavel-g", "bin": { "redmine-time-manager": "./bin/run" @@ -19,11 +19,17 @@ "dependencies": { "@oclif/core": "^1", "@oclif/plugin-help": "^5", - "@oclif/plugin-plugins": "^2.0.1" + "@oclif/plugin-plugins": "^2.0.1", + "alasql": "^1.7.3", + "axios": "^0.25.0", + "csv-parse": "^5.0.4", + "get-stdin": "^9.0.0", + "luxon": "^2.3.0" }, "devDependencies": { "@oclif/test": "^2", "@types/chai": "^4", + "@types/luxon": "^2.0.9", "@types/mocha": "^9.0.0", "@types/node": "^16.9.4", "chai": "^4", @@ -43,15 +49,8 @@ "dirname": "redmine-time-manager", "commands": "./dist/commands", "plugins": [ - "@oclif/plugin-help", - "@oclif/plugin-plugins" - ], - "topicSeparator": " ", - "topics": { - "hello": { - "description": "Say hello to the world and others" - } - } + "@oclif/plugin-help" + ] }, "scripts": { "build": "shx rm -rf dist && tsc -b", diff --git a/src/commands/hello/index.ts b/src/commands/hello/index.ts deleted file mode 100644 index 2b551c9..0000000 --- a/src/commands/hello/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {Command, Flags} from '@oclif/core' - -export default class Hello extends Command { - static description = 'Say hello' - - static examples = [ - `$ oex hello friend --from oclif -hello friend from oclif! (./src/commands/hello/index.ts) -`, - ] - - static flags = { - from: Flags.string({char: 'f', description: 'Whom is saying hello', required: true}), - } - - static args = [{name: 'person', description: 'Person to say hello to', required: true}] - - async run(): Promise { - const {args, flags} = await this.parse(Hello) - - this.log(`hello ${args.person} from ${flags.from}! (./src/commands/hello/index.ts)`) - } -} diff --git a/src/commands/hello/world.ts b/src/commands/hello/world.ts deleted file mode 100644 index c15a770..0000000 --- a/src/commands/hello/world.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {Command} from '@oclif/core' - -export default class World extends Command { - static description = 'Say hello world' - - static examples = [ - `$ oex hello world -hello world! (./src/commands/hello/world.ts) -`, - ] - - static flags = {} - - static args = [] - - async run(): Promise { - this.log('hello world! (./src/commands/hello/world.ts)') - } -} diff --git a/src/commands/save.ts b/src/commands/save.ts index 53bb5c1..5b24205 100644 --- a/src/commands/save.ts +++ b/src/commands/save.ts @@ -1,28 +1,35 @@ import {Command, Flags} from '@oclif/core' +import {args} from "../logic/args"; +import {save} from "../logic/save"; +import {getConfig} from "../logic/config"; export default class Save extends Command { - static description = 'Save time entries to redmine' + static description = "Save time entries to redmine. Full documentation in README."; static examples = [ - '<%= config.bin %> <%= command.id %>', + '$ <%= config.bin %> <%= command.id %> --config=config.json --date=2000-01-01 --rewrite --from-file=my-work-time.csv # reading from csv file', + '$ xsel -o | <%= config.bin %> <%= command.id %> --config=config.json --date=2000-01-01 --rewrite # reading csv from stdin from Xorg clipboard', ] static flags = { - // flag with a value (-n, --name=VALUE) - name: Flags.string({char: 'n', description: 'name to print'}), - // flag with no value (-f, --force) - force: Flags.boolean({char: 'f'}), + config: Flags.string({char: 'c', description: 'Json config', required: true, default: 'redmine-time-manager-config.json'}), + 'from-file': Flags.string({description: 'Csv file. If undefined, will use stdin', default: ''}), + date: Flags.string({description: 'Date. Must defined when config.date_source = "argument"', default: ''}), + dry: Flags.boolean({description: 'For testing calls. Delete and write operations will be disabled.', default: false}), + rewrite: Flags.boolean({description: 'Redmine data at choosed date will be rewrited.', default: false}) } - static args = [{name: 'file'}] + static args = [] public async run(): Promise { - const {args, flags} = await this.parse(Save) - - const name = flags.name ?? 'world' - this.log(`hello ${name} from`) - if (args.file && flags.force) { - this.log(`you input --force and --file: ${args.file}`) - } + const {flags} = await this.parse(Save) + args.cmd = 'save'; + args.dry = flags.dry; + args.date = flags.date; + args["from-file"] = flags["from-file"]; + args.config = flags.config; + args.rewrite = flags.rewrite; + getConfig(true); + await save(); } } diff --git a/src/logic/args.ts b/src/logic/args.ts new file mode 100644 index 0000000..b2d7b01 --- /dev/null +++ b/src/logic/args.ts @@ -0,0 +1,19 @@ +export type Args = { + config: string; + cmd: string; + help: boolean; + "from-file": string; + date: string; + dry: boolean; + rewrite: boolean; +}; + +export const args: Args = { + config: '', + cmd: '', + help: false, + "from-file": '', + date: '', + dry: true, + rewrite: false +}; diff --git a/src/logic/config.ts b/src/logic/config.ts new file mode 100644 index 0000000..906572a --- /dev/null +++ b/src/logic/config.ts @@ -0,0 +1,94 @@ +import * as fs from "fs"; +import * as Args from "./args"; + +export const defaultConfig: ConfigTypes.Config = { + csv: { + delimiter: "\t", + columns: true, + encoding: 'utf8', + quote: false + }, + rules: { + columns: { + "issue": "Задача", + "activity": "Действие", + "comment": "Комментарий", + "time": "Время", + "date": "Дата" + } + }, + date_format: 'yyyy-MM-dd', + time_type: 'hours', + date_source: "argument", + issue_regexp: "\\d+", + redmine: { + url: 'http://token@redmine.example.org', + user_id: 0, + default_issue: 0, + activities: { + "Design": 8, + "Code": 9, + "Code Review": 90, + "Analysis": 96, + "Discuss": 10, + "Test": 11, + "Management": 12, + "Documentation": 13, + "Support": 14 + }, + default_activity_code: 96 + } +}; + +export function getConfig(force: boolean = false): ConfigTypes.Config { + if (!force && !Args.args['config']) { + return defaultConfig; + } + const configFileName = Args.args['config']; + const configFileContent = fs.readFileSync(configFileName, {encoding: 'utf8'}); + const parsedConfig = JSON.parse(configFileContent); + Object.assign(config, parsedConfig); + return config; +} + +export const config = getConfig(); + +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace ConfigTypes { + export const COLUMN_KEYS = { + TIME: "time", + ISSUE: "issue", + ACTIVITY: "activity", + DATE: "date", + COMMENT: "comment" + }; + export type Time = "hours"|"minutes"|"time"; + export type DateSource = "argument"|"column"; + export type DateFormat = string; + export type Csv = { + delimiter: string; + columns: boolean; + encoding: string; + quote: boolean|string; + }; + export type Rules = { + columns: Record + }; + export type Redmine = { + url: string; + user_id: number; + default_issue: number; + activities: Record, + default_activity_code: number + }; + export type Config = { + csv: Csv; + rules: Rules; + time_type: Time; + date_source: DateSource; + redmine: Redmine; + date_format: DateFormat; + issue_regexp: string; + query?: string; + }; +} diff --git a/src/logic/csv.ts b/src/logic/csv.ts new file mode 100644 index 0000000..cdc0bc0 --- /dev/null +++ b/src/logic/csv.ts @@ -0,0 +1,144 @@ +import {config, ConfigTypes} from "./config"; +import {DateTime, Duration} from "luxon"; +import {args} from "./args"; +import {invert} from "./utils"; + +export function getFieldNameByKey(key: string): string { + if (!config.rules.columns[key]) { + console.warn(`Не удалось найти название колонки для поля ${key}`); + return ""; + } + return config.rules.columns[key]; +} + +export const DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + +export namespace ColumnConverter { + + let rules: Record|null = null; + + function getRules(): Record { + if (rules) return rules; + rules = invert(config.rules.columns); + return rules; + } + + function convertItem(item: Record): void { + const rules = getRules(); + let key: string; + for (key in item) { + if (rules.hasOwnProperty(key)) { + const newKey = rules[key]; + item[newKey] = item[key]; + } + } + } + + export function convert(data: Record[]): Record[] { + for (let i = 0; i < data.length; i++) { + convertItem(data[i]); + } + return data; + } + +} + +export const FRACTION_DIGITS = 2; + +export function getHours(src: string|number): number { + + if (typeof src === 'number') return Number(src.toFixed(FRACTION_DIGITS)); + + if (typeof src !== 'string') throw new Error(`Недопустимое значение ${src}`); + + // time, for example 12:34 + const timeParts = src.split(':'); + if (timeParts && timeParts.length >= 2) { + const [hours, minutes] = timeParts; + const interval = Duration.fromObject({hours: Number(hours), minutes: Number(minutes)}); + return Number(interval.as('hours').toFixed(FRACTION_DIGITS)); + } + + // hours, for example 12.34 or 12,34 + let s = Number(src.replace(',', '.')); + if (isFinite(s)) { + if (config.time_type === "minutes") { + s = s / 60; + } + return Number(s.toFixed(FRACTION_DIGITS)); + } + + throw new Error(`Не удалось определить время в часах из значения ${src}`); + +} + +export function getDate(src: string): string { + return DateTime + .fromFormat(src, config.date_format || DEFAULT_DATE_FORMAT) + .toFormat(DEFAULT_DATE_FORMAT); +} + +export async function filterByQuery(data: Record[]): Promise[]> { + if (!config.query) return data; + const alasql: any = await import('alasql'); + return alasql(config.query, [data]); +} + +export type TimeEntryForRedmine = { + issue: number; + activity: number; + comment: string; + time: number; + date: string; +} + +export function getItemForRedmine(item: Record): TimeEntryForRedmine|null { + + const KEYS = ConfigTypes.COLUMN_KEYS; + + let issue: number; + if (!item[KEYS.ISSUE]) { + issue = config.redmine.default_issue; + } else { + const rawIssue: string = item[KEYS.ISSUE]; + const parseIssueRe = new RegExp(config.issue_regexp); + const parsedResult = rawIssue.match(parseIssueRe); + if (!parsedResult) { + issue = config.redmine.default_issue; + } else if (parsedResult[0]) { + issue = Number(parsedResult[0]); + } else { + issue = config.redmine.default_issue; + } + } + + let activity: number; + if (!item[KEYS.ACTIVITY] || !config.redmine.activities[item[KEYS.ACTIVITY]]) { + activity = config.redmine.default_activity_code; + } else { + const activityName = item[KEYS.ACTIVITY]; + activity = config.redmine.activities[activityName]; + } + + const comment: string = item[KEYS.COMMENT] || ''; + + if (!item.hasOwnProperty(KEYS.TIME)) throw new Error(`Не указано время в записи ${JSON.stringify(item)}`); + + const time = getHours(item[KEYS.TIME]); + + let date: string; + if (config.date_source === "column") { + date = getDate(item[KEYS.DATE] || ''); + } else { + date = getDate(args['date']); + } + + return { + issue: issue, + activity: activity, + comment: comment, + time: time, + date: date + }; + +} diff --git a/src/logic/help.ts b/src/logic/help.ts new file mode 100644 index 0000000..b04b4ea --- /dev/null +++ b/src/logic/help.ts @@ -0,0 +1,57 @@ +// * --cmd=load +// * --date=YYYY-MM-DD +// * --to-file=$CSV_FILE_NAME если не указать, то вывод в stdout +// * --calc-sum-time +// +// * --cmd=calc-sum-time +// * --from-file=$CSV_FILE_NAME если не указать, то чтение из stdin + +import {ConfigTypes, defaultConfig} from "./config"; + +export const helpMsg = ` +* --help + +* --dry - в этом режиме вместо выполнения операций удаления и добавления записей + в redmine, будут выводиться сообщения в консоль + +* --config=$JSON_FILE_NAME + +* --cmd=save + * --date=YYYY-MM-DD - если в конфиге указано значение "date_source": "argument" + * --from-file=$CSV_FILE_NAME - если не указать, то чтение из stdin + * --rewrite + +--- + +Пример команды: + + + +--- + +Пример конфига: + +${JSON.stringify(defaultConfig, null, " ")} + +* csv - для этой секции более подробное описание по ссылке https://csv.js.org/parse/options/ +* rules.columns - правила мапинга полей к колонкам в csv-файле, должны быть указаны синонимы для ${Object.values(ConfigTypes.COLUMN_KEYS)} +* time_type - тип для времени "hours"/"minutes"/"time" +* date_source - где искать дату "column"/"argument" +* issue_regexp - регулярка для определения номера задачи, наверное достаточно будет указать такое значение - "\\\\d+" +* date_format - формат даты, например yyyy-MM-dd +* redmine - параметры для работы с redmine + * url + * user_id - идентификатор вашего пользователя в redmine + * default_issue - номер задачи по-умолчанию для трекинга времени + * activities - правила замены названий активностей на activity_id в вашем экземпляре Redmine + +Дополнительные параметры для конфига: + +* query - фильтр данных из csv-шки в sql подобном синтаксисе + например: select * from ? where category = 'Работа' +`; + +export function printHelpMsg(): void { + console.log(helpMsg); + process.exit(0); +} \ No newline at end of file diff --git a/src/logic/index.ts b/src/logic/index.ts new file mode 100644 index 0000000..622de53 --- /dev/null +++ b/src/logic/index.ts @@ -0,0 +1,24 @@ +import {printHelpMsg} from './help'; +import {args} from './args'; +import {save} from "./save"; + +async function main() { + try { + if (args['help']) { + printHelpMsg(); + } + + const cmd = args['cmd']; + if (cmd === 'save') { + await save(); + } else { + printHelpMsg(); + } + } catch (e) { + console.error('Ошибка при выполнении:', e); + process.exit(1); + } + process.exit(0); +} + +main(); \ No newline at end of file diff --git a/src/logic/open.ts b/src/logic/open.ts new file mode 100644 index 0000000..a01b33f --- /dev/null +++ b/src/logic/open.ts @@ -0,0 +1,16 @@ +import {config} from "./config"; +import axios from "axios"; + +export async function loadEntries(date: string): Promise> { + const url = `${config.redmine.url}/time_entries.json`; + const params = { + user_id: config.redmine.user_id, + from: date, + to: date + }; + const resp = await axios.get>(url, {params: params}); + if (!resp || resp.status !== 200 || !resp.data || !resp.data.time_entries) { + throw new Error('Не удалось загрузить записи за дату'); + } + return resp.data.time_entries; +} \ No newline at end of file diff --git a/src/logic/save.ts b/src/logic/save.ts new file mode 100644 index 0000000..35dbb10 --- /dev/null +++ b/src/logic/save.ts @@ -0,0 +1,130 @@ +import {Options, parse as CsvParse} from 'csv-parse/sync'; +import {args} from './args'; +import * as fs from 'fs'; +import {config} from "./config"; +import axios from "axios"; +import {loadEntries} from "./open"; +import {ColumnConverter, filterByQuery, getDate, getItemForRedmine, TimeEntryForRedmine} from "./csv"; +import {uniq} from "./utils"; + +function readContentFromFile(fileName: string): string { + return fs.readFileSync(fileName, {encoding: 'utf8'}); +} + +async function readContentFromStdin(): Promise { + const GetStdin = await import('get-stdin'); + return await GetStdin.default(); +} + +async function readContent(): Promise { + let content; + if (args['from-file']) { + content = readContentFromFile(args['from-file']); + } else { + content = await readContentFromStdin(); + } + return content; +} + +function backupEntries(entries: Record): void { + const fileName = `entries-${args['date']}.json`; + const content = JSON.stringify(entries); + fs.writeFileSync(fileName, content, {encoding: "utf8"}); +} + +async function deleteEntries(entries: Record): Promise { + await Promise.all( + entries.map(async (entry: Record) => { + const url = `${config.redmine.url}/time_entries/${entry.id}.xml`; + if (args['dry']) { + console.log('Delete time entry:', {url, entry}); + } else { + await axios.delete(url); + } + }) + ); +} + +async function cleanTimeEntries(items: TimeEntryForRedmine[]): Promise { + const dates = getUniqDates(items); + for (let i = 0; i < dates.length; i++) { + const date = dates[i]; + const entries = await loadEntries(date); + backupEntries(entries); + await deleteEntries(entries); + } +} + +async function saveItem(item: TimeEntryForRedmine): Promise { + const url = `${config.redmine.url}/time_entries.json`; + const data = { + time_entry: { + issue_id: item.issue, + spent_on: item.date, + hours: item.time, + activity_id: item.activity, + comments: item.comment, + } + }; + const params = { + user_id: config.redmine.user_id + }; + if (args['dry']) { + console.log('Save time entry:', {url, data, params: params}); + } else { + const resp = await axios.post(url, data, {params: params}); + if (!resp || !resp.data) { + console.error(`Не удалось сохранить в redmine запись `, item); + return false; + } + } + return true; +} + +async function saveCsv(csvData: TimeEntryForRedmine[]): Promise { + let successCount = 0; + for (let i = 0; i < csvData.length; i++) { + const item = csvData[i]; + if (!item) { + console.warn(`Не удалось получить данные для сохранения из записи:`, item); + continue; + } + const saveResult = await saveItem(item); + if (saveResult) successCount++; + } + console.log(`Сохранено записей: ${successCount}`); +} + +export async function save(): Promise { + const content = await readContent(); + + let csv: Record[] = CsvParse(content, config.csv as Options); + csv = ColumnConverter.convert(csv); + csv = await filterByQuery(csv) as Record[]; + + const items = csv + .map(item => { + return {item: getItemForRedmine(item), raw: item}; + }) + .filter(item => { + const exists = Boolean(item.item); + if (!exists) console.warn('Не удалось получить данные из исходной записи', item.raw); + return exists; + }) + .map(item => item.item) as TimeEntryForRedmine[]; + + if (args['rewrite']) await cleanTimeEntries(items); + await saveCsv(items); +} + +export function getUniqDates(items: TimeEntryForRedmine[]): string[] { + if (config.date_source === "argument") { + return [getDate(args['date'])]; + } else if (config.date_source === "column") { + const dates = items.map(item => { + return item.date; + }); + return uniq(dates); + } + return []; +} diff --git a/src/logic/utils.ts b/src/logic/utils.ts new file mode 100644 index 0000000..a99a682 --- /dev/null +++ b/src/logic/utils.ts @@ -0,0 +1,34 @@ +export function invert(obj: Record): Record { + const newObj = {}; + let key; + for (key in obj) { + if (!obj.hasOwnProperty(key)) continue; + const value = obj[key]; + // @ts-ignore + newObj[value] = key; + } + return newObj; +} + +export function uniq(src: T[]): T[] { + const res = []; + let i: number; + for (i = 0; i < src.length; i++) { + const value = src[i]; + if (res.indexOf(value) < 0) { + res.push(value); + } + } + return res; +} + +export function assign(target: Record, src: Record): Record { + let key: string; + for (key in src) { + if (src.hasOwnProperty(key)) { + console.debug('rewrite key:', key, ' with value:', src[key]); // DEBUG + target[key] = src[key]; + } + } + return target; +} diff --git a/yarn.lock b/yarn.lock index 6c41284..ba96f85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -742,6 +742,11 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz" integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== +"@types/luxon@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.0.9.tgz#782a0edfa6d699191292c13168bd496cd66b87c6" + integrity sha512-ZuzIc7aN+i2ZDMWIiSmMdubR9EMMSTdEzF6R+FckP4p6xdnOYKqknTo/k+xXQvciSXlNGIwA4OPU5X7JIFzYdA== + "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" @@ -882,6 +887,21 @@ acorn@^8.4.1: resolved "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz" integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +adler-32@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.0.tgz#3cad1b71cdfa69f6c8a91f3e3615d31a4fdedc72" + integrity sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g== + dependencies: + printj "~1.2.2" + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -906,7 +926,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -926,6 +946,18 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +alasql@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/alasql/-/alasql-1.7.3.tgz#ef9909e345b4ac8d5f00e7e6b772c7e419b41db4" + integrity sha512-YaMgHfoR4f7n05NXFVgD+WgmlNKlP4BGZpXSkJCYtniioK7DMJUoN6ZZmUpM0LAavPLXxHM+V+4gM+M/82sIoQ== + dependencies: + dom-storage "^2.1.0" + es6-promise "^4.2.6" + lodash "4.17.21" + request "2.88.2" + xlsx "0.17.0" + yargs "16.2.0" + ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" @@ -1072,6 +1104,18 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" @@ -1087,11 +1131,33 @@ async@0.9.x: resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -1102,6 +1168,13 @@ base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + before-after-hook@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" @@ -1247,6 +1320,20 @@ cardinal@^2.1.1: ansicolors "~0.3.2" redeyed "~2.1.0" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +cfb@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.1.tgz#209429e4c68efd30641f6fc74b2d6028bd202402" + integrity sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + printj "~1.3.0" + chai@^4: version "4.3.4" resolved "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz" @@ -1510,6 +1597,14 @@ code-point-at@^1.0.0: resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codepage@~1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99" + integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k= + dependencies: + commander "~2.14.1" + exit-on-epipe "~1.0.1" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -1549,6 +1644,13 @@ colors@^1.1.2: resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@2.6.0: version "2.6.0" resolved "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz" @@ -1559,6 +1661,16 @@ commander@7.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.1.0.tgz#f2eaecf131f10e36e07d894698226e36ae0eb5ff" integrity sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg== +commander@~2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw== + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -1616,6 +1728,11 @@ convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" @@ -1654,6 +1771,14 @@ cpy@^4.0.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" +crc-32@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" + integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.3.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -1696,6 +1821,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +csv-parse@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3" + integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" @@ -1708,6 +1838,13 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + date-fns@^1.23.0: version "1.30.1" resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz" @@ -1771,6 +1908,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -1823,6 +1965,19 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-storage@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" + integrity sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ejs@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" @@ -1883,6 +2038,11 @@ error@^10.4.0: resolved "https://registry.yarnpkg.com/error/-/error-10.4.0.tgz#6fcf0fd64bceb1e750f8ed9a3dd880f00e46a487" integrity sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw== +es6-promise@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" @@ -2173,6 +2333,16 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" @@ -2187,6 +2357,16 @@ extract-stack@^2.0.0: resolved "https://registry.npmjs.org/extract-stack/-/extract-stack-2.0.0.tgz" integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fancy-test@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/fancy-test/-/fancy-test-2.0.0.tgz" @@ -2257,6 +2437,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fflate@^0.3.8: + version "0.3.11" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.3.11.tgz#2c440d7180fdeb819e64898d8858af327b042a5d" + integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A== + figures@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -2354,6 +2539,30 @@ flatted@^3.1.0: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz" integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== +follow-redirects@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" @@ -2474,6 +2683,11 @@ get-stdin@^5.0.1: resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz" integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" @@ -2491,6 +2705,13 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + github-slugger@^1.2.1: version "1.4.0" resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz" @@ -2627,6 +2848,19 @@ growl@1.10.5: resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" @@ -2713,6 +2947,15 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -2969,7 +3212,7 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typedarray@^1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -3011,6 +3254,11 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + jake@^10.6.1: version "10.8.2" resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" @@ -3041,6 +3289,11 @@ js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -3066,6 +3319,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" @@ -3076,7 +3334,7 @@ json-stringify-nice@^1.1.4: resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -3109,6 +3367,16 @@ jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + just-diff-apply@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-4.0.1.tgz#da89c5a4ccb14aa8873c70e2c3b6695cef45dab5" @@ -3213,7 +3481,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.21, lodash@^4.5.1: +lodash@4.17.21, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.21, lodash@^4.5.1: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3249,6 +3517,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.3.0.tgz#bf16a7e642513c2a20a6230a6a41b0ab446d0045" + integrity sha512-gv6jZCV+gGIrVKhO90yrsn8qXPKD8HYZJtrUDSfEbow8Tkw84T9OnCyJhWvnJIaIF/tBuiAjZuQHUt1LddX2mg== + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" @@ -3370,6 +3643,18 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -3763,6 +4048,11 @@ number-is-nan@^1.0.0: resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -4066,6 +4356,11 @@ pathval@^1.1.1: resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" @@ -4135,6 +4430,21 @@ pretty-bytes@^5.3.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + +printj@~1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.2.3.tgz#2cfb2b192a1e5385dbbe5b46658ac34aa828508a" + integrity sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA== + +printj@~1.3.0, printj@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" + integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== + proc-log@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-1.0.0.tgz#0d927307401f69ed79341e83a0b2c9a13395eb77" @@ -4183,6 +4493,11 @@ pseudomap@^1.0.2: resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -4191,7 +4506,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -4215,6 +4530,11 @@ qqjs@^0.3.10: tmp "^0.1.0" write-json-file "^4.1.1" +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -4378,6 +4698,32 @@ replace-ext@^1.0.0: resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== +request@2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -4457,7 +4803,7 @@ rxjs@^7.2.0: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4474,7 +4820,7 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4652,6 +4998,28 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -4935,6 +5303,14 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" @@ -4997,6 +5373,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -5102,6 +5483,11 @@ uuid@^2.0.1: resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" @@ -5122,6 +5508,15 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vinyl-file@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz" @@ -5206,11 +5601,21 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + workerpool@6.1.5: version "6.1.5" resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz" @@ -5270,6 +5675,22 @@ write-json-file@^4.1.1: sort-keys "^4.0.0" write-file-atomic "^3.0.0" +xlsx@0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.17.0.tgz#028176a0140967dcee1817d221678461e47481c8" + integrity sha512-bZ36FSACiAyjoldey1+7it50PMlDp1pcAJrZKcVZHzKd8BC/z6TQ/QAN8onuqcepifqSznR6uKnjPhaGt6ig9A== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.14.0" + commander "~2.17.1" + crc-32 "~1.2.0" + exit-on-epipe "~1.0.1" + fflate "^0.3.8" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"