dev
This commit is contained in:
parent
d59183289f
commit
83fded6ab8
14 changed files with 1000 additions and 75 deletions
22
README.md
22
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 <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 -->
|
||||
|
|
|
|||
23
package.json
23
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",
|
||||
|
|
|
|||
|
|
@ -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)`)
|
||||
}
|
||||
}
|
||||
|
|
@ -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)')
|
||||
}
|
||||
}
|
||||
|
|
@ -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
19
src/logic/args.ts
Normal 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
94
src/logic/config.ts
Normal 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
144
src/logic/csv.ts
Normal 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
57
src/logic/help.ts
Normal 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
24
src/logic/index.ts
Normal 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
16
src/logic/open.ts
Normal 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
130
src/logic/save.ts
Normal 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
34
src/logic/utils.ts
Normal 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
435
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"
|
||||
|
|
|
|||
Loading…
Reference in a new issue