This commit is contained in:
Pavel Gnedov 2022-02-06 23:58:17 +07:00
parent d59183289f
commit 83fded6ab8
14 changed files with 1000 additions and 75 deletions

View file

@ -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 <value>] [-f]
FLAGS
-f, --force
-n, --name=<value> 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)_
<!-- commandsstop -->

View file

@ -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",

View file

@ -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<void> {
const {args, flags} = await this.parse(Hello)
this.log(`hello ${args.person} from ${flags.from}! (./src/commands/hello/index.ts)`)
}
}

View file

@ -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<void> {
this.log('hello world! (./src/commands/hello/world.ts)')
}
}

View file

@ -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<void> {
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();
}
}

19
src/logic/args.ts Normal file
View file

@ -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
};

94
src/logic/config.ts Normal file
View file

@ -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<string, string>
};
export type Redmine = {
url: string;
user_id: number;
default_issue: number;
activities: Record<string, number>,
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;
};
}

144
src/logic/csv.ts Normal file
View file

@ -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<string, string>|null = null;
function getRules(): Record<string, string> {
if (rules) return rules;
rules = invert(config.rules.columns);
return rules;
}
function convertItem(item: Record<string, any>): 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<string, any>[]): Record<string, any>[] {
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<string, any>[]): Promise<Record<string, any>[]> {
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<string, any>): 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
};
}

57
src/logic/help.ts Normal file
View file

@ -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);
}

24
src/logic/index.ts Normal file
View file

@ -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();

16
src/logic/open.ts Normal file
View file

@ -0,0 +1,16 @@
import {config} from "./config";
import axios from "axios";
export async function loadEntries(date: string): Promise<Record<string, any>> {
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<Record<string, any>>(url, {params: params});
if (!resp || resp.status !== 200 || !resp.data || !resp.data.time_entries) {
throw new Error('Не удалось загрузить записи за дату');
}
return resp.data.time_entries;
}

130
src/logic/save.ts Normal file
View file

@ -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<string> {
const GetStdin = await import('get-stdin');
return await GetStdin.default();
}
async function readContent(): Promise<string> {
let content;
if (args['from-file']) {
content = readContentFromFile(args['from-file']);
} else {
content = await readContentFromStdin();
}
return content;
}
function backupEntries(entries: Record<string, any>): void {
const fileName = `entries-${args['date']}.json`;
const content = JSON.stringify(entries);
fs.writeFileSync(fileName, content, {encoding: "utf8"});
}
async function deleteEntries(entries: Record<string, any>): Promise<void> {
await Promise.all(
entries.map(async (entry: Record<string, any>) => {
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<void> {
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<boolean> {
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<void> {
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<void> {
const content = await readContent();
let csv: Record<string, any>[] = CsvParse(content, config.csv as Options);
csv = ColumnConverter.convert(csv);
csv = await filterByQuery(csv) as Record<string, any>[];
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 [];
}

34
src/logic/utils.ts Normal file
View file

@ -0,0 +1,34 @@
export function invert(obj: Record<any, any>): Record<any, any> {
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<T>(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<string, any>, src: Record<string, any>): Record<string, any> {
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;
}

435
yarn.lock
View file

@ -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"