pkg-fetch: migrate to TypeScript (#139)

This commit is contained in:
Andrew Lisowski 2021-03-28 21:46:10 -07:00 committed by GitHub
parent f7a75173f9
commit 6dd43cfafd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 2706 additions and 240 deletions

View File

@ -1,13 +1,20 @@
{
"extends": ["airbnb-base", "prettier"],
"parser": "@babel/eslint-parser",
"parserOptions": {
"sourceType": "module"
"extends": [
"airbnb-base",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"parser": "@typescript-eslint/parser",
"settings": {
"import/resolver": {
"typescript": {}
}
},
"rules": {
"wrap-iife": "off",
"max-classes-per-file": "off",
"no-bitwise": "off",
"no-continue": "off",
"no-nested-ternary": "off",
"class-methods-use-this": "off",
"no-await-in-loop": "off",
"no-constant-condition": "off",
@ -15,6 +22,17 @@
"consistent-return": "off",
"no-restricted-syntax": "off",
"import/prefer-default-export": "off",
"camelcase": "off"
"camelcase": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"import/extensions": [
"error",
"ignorePackages",
{
"js": "never",
"jsx": "never",
"ts": "never",
"tsx": "never"
}
]
}
}

1
.gitignore vendored
View File

@ -6,3 +6,4 @@
# logs
npm-debug.log
yarn-error.log

View File

@ -8,8 +8,10 @@ import { log } from './log';
import patchesJson from '../patches/patches.json';
import { tempPath } from './temp-path';
import thresholds from './thresholds';
import { getMajor } from './get-major';
let buildPath: string;
let buildPath;
if (process.env.GITHUB_USERNAME) {
buildPath = path.join(__dirname, '..', 'precompile');
} else {
@ -20,8 +22,9 @@ const nodePath = path.join(buildPath, 'node');
const patchesPath = path.resolve(__dirname, '../patches');
const nodeRepo = 'https://github.com/nodejs/node';
async function gitClone(nodeVersion) {
async function gitClone(nodeVersion: string) {
log.info('Cloning Node.js repository from GitHub...');
const args = [
'clone',
'-b',
@ -36,22 +39,38 @@ async function gitClone(nodeVersion) {
];
const promise = spawn('git', args, { cwd: buildPath });
progress(promise, thresholds('clone'));
await promise;
}
async function gitResetHard(nodeVersion) {
async function gitResetHard(nodeVersion: string) {
log.info(`Checking out ${nodeVersion}`);
const patches = patchesJson[nodeVersion];
const commit = patches.commit || nodeVersion;
const patches = patchesJson[nodeVersion as keyof typeof patchesJson] as
| string[]
| { commit?: string };
const commit =
'commit' in patches && patches.commit ? patches.commit : nodeVersion;
const args = ['--work-tree', '.', 'reset', '--hard', commit];
await spawn('git', args, { cwd: nodePath });
}
async function applyPatches(nodeVersion) {
async function applyPatches(nodeVersion: string) {
log.info('Applying patches');
let patches = patchesJson[nodeVersion];
patches = patches.patches || patches;
if (patches.sameAs) patches = patchesJson[patches.sameAs];
const storedPatches = patchesJson[nodeVersion as keyof typeof patchesJson] as
| string[]
| { patches: string[] }
| { sameAs: string };
const storedPatch =
'patches' in storedPatches ? storedPatches.patches : storedPatches;
const patches =
'sameAs' in storedPatch
? patchesJson[storedPatch.sameAs as keyof typeof patchesJson]
: storedPatch;
for (const patch of patches) {
const patchPath = path.join(patchesPath, patch);
const args = ['-p1', '-i', patchPath];
@ -59,21 +78,29 @@ async function applyPatches(nodeVersion) {
}
}
async function compileOnWindows(nodeVersion, targetArch) {
async function compileOnWindows(nodeVersion: string, targetArch: string) {
const args = [];
args.push('/c', 'vcbuild.bat', targetArch, 'noetw');
const major = nodeVersion.match(/^v?(\d+)/)[1] | 0;
if (major <= 10) args.push('nosign', 'noperfctr');
const major = getMajor(nodeVersion);
if (major <= 10) {
args.push('nosign', 'noperfctr');
}
const promise = spawn('cmd', args, { cwd: nodePath });
progress(promise, thresholds('vcbuild', nodeVersion));
await promise;
if (major <= 10) return path.join(nodePath, 'Release/node.exe');
if (major <= 10) {
return path.join(nodePath, 'Release/node.exe');
}
return path.join(nodePath, 'out/Release/node.exe');
}
const { MAKE_JOB_COUNT = os.cpus().length } = process.env;
async function compileOnUnix(nodeVersion, targetArch) {
async function compileOnUnix(nodeVersion: string, targetArch: string) {
const args = [];
const cpu = {
x86: 'ia32',
@ -84,36 +111,61 @@ async function compileOnUnix(nodeVersion, targetArch) {
ppc64: 'ppc64',
s390x: 's390x',
}[targetArch];
args.push('--dest-cpu', cpu);
if (cpu) {
args.push('--dest-cpu', cpu);
}
// first of all v8_inspector introduces the use
// of `prime_rehash_policy` symbol that requires
// GLIBCXX_3.4.18 on some systems
// also we don't support any kind of debugging
// against packaged apps, hence v8_inspector is useless
const major = nodeVersion.match(/^v?(\d+)/)[1] | 0;
if (major >= 6) args.push('--without-inspector');
const major = getMajor(nodeVersion);
if (major >= 6) {
args.push('--without-inspector');
}
// https://github.com/mhart/alpine-node/blob/base-7.4.0/Dockerfile#L33
if (hostPlatform === 'alpine') args.push('--without-snapshot');
if (hostPlatform === 'alpine') {
args.push('--without-snapshot');
}
// TODO same for windows?
await spawn('./configure', args, { cwd: nodePath });
const make = hostPlatform === 'freebsd' ? 'gmake' : 'make';
const promise = spawn(make, ['-j', MAKE_JOB_COUNT], { cwd: nodePath });
const promise = spawn(make, ['-j', String(MAKE_JOB_COUNT)], {
cwd: nodePath,
});
progress(promise, thresholds('make', nodeVersion));
await promise;
const output = path.join(nodePath, 'out/Release/node');
// https://github.com/mhart/alpine-node/blob/base-7.4.0/Dockerfile#L36
if (hostPlatform === 'alpine') await spawn('paxctl', ['-cm', output]);
if (hostPlatform === 'alpine') {
await spawn('paxctl', ['-cm', output]);
}
return output;
}
async function compile(nodeVersion, targetArch) {
async function compile(nodeVersion: string, targetArch: string) {
log.info('Compiling Node.js from sources...');
const win = hostPlatform === 'win';
if (win) return compileOnWindows(nodeVersion, targetArch);
if (win) {
return compileOnWindows(nodeVersion, targetArch);
}
return compileOnUnix(nodeVersion, targetArch);
}
export default async function build(nodeVersion, targetArch, local) {
export default async function build(
nodeVersion: string,
targetArch: string,
local: string
) {
await remove(buildPath);
await mkdirp(buildPath);
await gitClone(nodeVersion);

View File

@ -1,6 +1,6 @@
import { chmod, stat } from 'fs-extra';
export async function plusx(file) {
export async function plusx(file: string) {
const s = await stat(file);
const newMode = s.mode | 64 | 8 | 1;
if (s.mode === newMode) return;

View File

@ -6,80 +6,118 @@ import path from 'path';
import { GitHub } from './github';
import { moveFile } from './copy-file';
function uniqueName(name, names) {
if (names.indexOf(name) < 0) return name;
function uniqueName(name: string, names: string[]) {
if (names.indexOf(name) < 0) {
return name;
}
let newName;
let counter = 0;
while (true) {
newName = `${name}-new-${counter}`;
if (names.indexOf(newName) < 0) return newName;
if (names.indexOf(newName) < 0) {
return newName;
}
counter += 1;
}
}
interface Remote {
tag: string;
name: string;
}
interface CloudOptions {
owner: string;
repo: string;
}
interface NodeCompilation {
local: string;
remote: Remote;
}
export class Cloud {
constructor({ owner, repo }) {
private gh: GitHub;
constructor({ owner, repo }: CloudOptions) {
this.gh = new GitHub({ owner, repo });
}
async _findRelease(tag) {
private async findRelease(tag: string) {
let release = await this.gh.getRelease(tag);
if (!release) release = await this.gh.getReleaseDraft(tag);
if (!release) release = await this.gh.createRelease(tag);
return release;
}
async alreadyUploaded(remote) {
const release = await this._findRelease(remote.tag);
async alreadyUploaded(remote: Remote) {
const release = await this.findRelease(remote.tag);
return release.assets.some(({ name }) => {
assert(name);
return remote.name === name;
});
}
async upload(local, remote) {
const release = await this._findRelease(remote.tag);
async upload(local: string, remote: Remote) {
const release = await this.findRelease(remote.tag);
const names = release.assets.map(({ name }) => {
assert(name);
return name;
});
const name = uniqueName(remote.name, names);
await this.gh.uploadAsset(local, release, name);
}
async uploadMany(items) {
async uploadMany(items: NodeCompilation[]) {
for (const item of items) {
const { local, remote } = item;
await this.upload(local, remote);
}
}
async download(remote, local) {
async download(remote: Remote, local: string) {
const { tag } = remote;
const tempFile = `${local}.downloading`;
await mkdirp(path.dirname(tempFile));
const short = path.basename(local);
const ok = await this.gh.tryDirectly(tag, remote.name, tempFile, short);
if (!ok) {
let release = await this.gh.getRelease(tag);
if (!release) release = await this.gh.getReleaseDraft(tag);
if (!release) return false;
const assets = release.assets.filter(({ name }) => {
assert(name);
return name === remote.name;
});
if (!assets.length) return false;
if (!assets.length) {
return false;
}
assert(assets.length === 1);
const asset = assets[0];
await this.gh.downloadUrl(asset.url, tempFile, short);
}
await remove(local);
await moveFile(tempFile, local);
await remove(tempFile);
return true;
}
async downloadMany(items) {
async downloadMany(items: NodeCompilation[]) {
for (const item of items) {
const { remote, local } = item;
await this.download(remote, local);

View File

@ -1,9 +0,0 @@
import fs from 'fs-extra';
export function copyFile(src, dest) {
return fs.copy(src, dest);
}
export function moveFile(src, dest) {
return fs.move(src, dest);
}

9
lib/copy-file.ts Normal file
View File

@ -0,0 +1,9 @@
import fs from 'fs-extra';
export function copyFile(src: string, dest: string) {
return fs.copy(src, dest);
}
export function moveFile(src: string, dest: string) {
return fs.move(src, dest);
}

4
lib/get-major.ts Normal file
View File

@ -0,0 +1,4 @@
export function getMajor(nodeVersion: string) {
const [, version] = nodeVersion.match(/^v?(\d+)/) || ['', 0];
return Number(version) | 0;
}

View File

@ -1,17 +1,37 @@
/* eslint-disable camelcase */
import { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';
import assert from 'assert';
import fs from 'fs';
import progress from 'request-progress';
import request from 'request';
import { log, wasReported } from './log';
type GithubRelease = RestEndpointMethodTypes['repos']['getRelease']['response']['data'];
interface GitHubOptions {
owner: string;
repo: string;
}
export class GitHub {
constructor({ owner, repo }) {
private owner: string;
private repo: string;
private request: request.RequestAPI<
request.Request,
request.CoreOptions,
request.RequiredUriUrl
>;
constructor({ owner, repo }: GitHubOptions) {
this.owner = owner;
this.repo = repo;
const { GITHUB_USERNAME, GITHUB_PASSWORD } = process.env;
const auth = { user: GITHUB_USERNAME, pass: GITHUB_PASSWORD };
this.request = request.defaults({
auth: auth.user ? auth : undefined,
headers: {
@ -21,41 +41,66 @@ export class GitHub {
});
}
getRelease(tag) {
return new Promise((resolve, reject) => {
getRelease(tag: string) {
return new Promise<GithubRelease | undefined>((resolve, reject) => {
const url = `https://api.github.com/repos/${this.owner}/${this.repo}/releases/tags/${tag}`;
this.request(url, (error, response, body) => {
if (error) return reject(wasReported(error.message));
this.request(url, (error, _, body) => {
if (error) {
return reject(wasReported(error.message));
}
const release = JSON.parse(body);
const { message } = release;
if (message === 'Not Found') return resolve(undefined);
if (message) return reject(wasReported(message));
if (message === 'Not Found') {
return resolve(undefined);
}
if (message) {
return reject(wasReported(message));
}
resolve(release);
});
});
}
getReleaseDraft(tag) {
return new Promise((resolve, reject) => {
getReleaseDraft(tag: string) {
return new Promise<GithubRelease | undefined>((resolve, reject) => {
const url = `https://api.github.com/repos/${this.owner}/${this.repo}/releases`;
this.request(url, (error, response, body) => {
if (error) return reject(wasReported(error.message));
this.request(url, (error, _, body) => {
if (error) {
return reject(wasReported(error.message));
}
// here we use `get release by tag` endpoint
// because draft releases are really `untagged`.
// seems that `get release by tag` is for non-drafts.
// hence listing all releases and looking through them
const releases = JSON.parse(body);
if (releases.message) return reject(wasReported(releases.message));
const releases = JSON.parse(body) as
| GithubRelease[]
| { message: string };
if ('message' in releases) {
return reject(wasReported(releases.message));
}
const found = releases.filter(({ tag_name }) => tag_name === tag); // eslint-disable-line camelcase
assert(found.length <= 1);
if (!found.length) return resolve(undefined);
if (!found.length) {
return resolve(undefined);
}
resolve(found[0]);
});
});
}
createRelease(tag) {
return new Promise((resolve, reject) => {
createRelease(tag: string) {
return new Promise<GithubRelease>((resolve, reject) => {
const form = JSON.stringify({
tag_name: tag,
target_commitish: 'master', // TODO maybe git rev-parse HEAD
@ -64,8 +109,11 @@ export class GitHub {
prerelease: true,
});
const url = `https://api.github.com/repos/${this.owner}/${this.repo}/releases`;
this.request.post(url, { form }, (error, response, body) => {
if (error) return reject(wasReported(error.message));
this.request.post(url, { form }, (error, _, body) => {
if (error) {
return reject(wasReported(error.message));
}
const release = JSON.parse(body);
if (release.message) return reject(wasReported(release.message));
resolve(release);
@ -73,8 +121,9 @@ export class GitHub {
});
}
uploadAsset(file, release, name) {
uploadAsset(file: string, release: GithubRelease, name: string) {
assert(!/[\\/]/.test(name));
return new Promise((resolve, reject) => {
fs.stat(file, (error, stat) => {
if (error) return reject(error);
@ -91,7 +140,7 @@ export class GitHub {
headers,
timeout: 30 * 60 * 1000,
},
(error2, response, body) => {
(error2, _, body) => {
if (error2) return reject(wasReported(error2.message));
const asset = JSON.parse(body);
const { errors } = asset;
@ -100,18 +149,21 @@ export class GitHub {
resolve(asset);
}
);
rs.pipe(req);
});
});
}
downloadUrl(url, file, short) {
downloadUrl(url: string, file: string, short: string) {
log.enableProgress(short);
log.showProgress(0);
return new Promise((resolve, reject) => {
return new Promise<request.Response>((resolve, reject) => {
const headers = { Accept: 'application/octet-stream' };
const ws = fs.createWriteStream(file);
let result;
let result: request.Response;
const req = progress(
this.request.get(
url,
@ -132,19 +184,25 @@ export class GitHub {
}
)
);
req.on('progress', (state) => {
let p;
if (state.size && state.size.transferred && state.size.total) {
p = state.size.transferred / state.size.total;
} else {
p = state.percentage;
}
log.showProgress(p * 100);
});
req.pipe(ws);
ws.on('close', () => {
log.showProgress(100);
log.disableProgress();
resolve(result);
}).on('error', (error) => {
log.disableProgress();
@ -153,7 +211,7 @@ export class GitHub {
});
}
async tryDirectly(tag, name, file, short) {
async tryDirectly(tag: string, name: string, file: string, short: string) {
try {
const url = `https://github.com/${this.owner}/${this.repo}/releases/download/${tag}/${name}`;
await this.downloadUrl(url, file, short);

View File

@ -1,4 +1,4 @@
import { exists } from 'fs-extra';
import { stat } from 'fs-extra';
import path from 'path';
import semver from 'semver';
import {
@ -20,18 +20,39 @@ import { version } from '../package.json';
const cloud = new Cloud({ owner: 'zeit', repo: 'pkg-fetch' });
export async function need(opts = {}) {
async function exists(file: string) {
try {
await stat(file);
return true;
} catch (error) {
return false;
}
}
interface NeedOptions {
forceFetch?: boolean;
forceBuild?: boolean;
dryRun?: boolean;
nodeRange: string;
platform: string;
arch: string;
}
export async function need(opts: NeedOptions) {
// eslint-disable-line complexity
const { forceFetch, forceBuild, dryRun } = opts;
let { nodeRange, platform, arch } = opts;
const { forceFetch, forceBuild, dryRun } = opts || {};
let { nodeRange, platform, arch } = opts || {};
if (!nodeRange) throw wasReported('nodeRange not specified');
if (!platform) throw wasReported('platform not specified');
if (!arch) throw wasReported('arch not specified');
nodeRange = abiToNodeRange(nodeRange); // 'm48' -> 'node6'
if (!isValidNodeRange(nodeRange)) {
throw wasReported("nodeRange must start with 'node'");
}
if (nodeRange !== 'latest') {
nodeRange = `v${nodeRange.slice(4)}`; // 'node6' -> 'v6' for semver
}
@ -43,10 +64,12 @@ export async function need(opts = {}) {
const versions = Object.keys(patchesJson)
.filter((nv) => semver.satisfies(nv, nodeRange) || nodeRange === 'latest')
.sort((nv1, nv2) => (semver.gt(nv1, nv2) ? 1 : -1));
return versions.pop();
}
const nodeVersion = satisfyingNodeVersion();
if (!nodeVersion) {
throw wasReported(
`No available node version satisfies '${opts.nodeRange}'`
@ -70,47 +93,59 @@ export async function need(opts = {}) {
const remote = remotePlace({ arch, nodeVersion, platform, version });
let fetchFailed;
if (!forceBuild) {
if (await exists(fetched)) {
if (dryRun) return 'exists';
return fetched;
return dryRun ? 'exists' : fetched;
}
}
if (!forceFetch) {
if (await exists(built)) {
if (dryRun) return 'exists';
if (forceBuild) log.info('Reusing base binaries built locally:', built);
return built;
}
}
if (!forceBuild) {
if (dryRun) return 'fetched';
if (await cloud.download(remote, fetched)) return fetched;
fetchFailed = true;
}
if (!dryRun && fetchFailed) {
log.info('Not found in GitHub releases:', JSON.stringify(remote));
}
if (!dryRun) {
log.info('Building base binary from source:', path.basename(built));
}
if (hostPlatform !== platform) {
throw wasReported(
`Not able to build for '${opts.platform}' here, only for '${hostPlatform}'`
);
}
if (hostArch !== arch) {
throw wasReported(
`Not able to build for '${opts.arch}' here, only for '${hostArch}'`
);
}
if (knownArchs.indexOf(arch) < 0) {
throw wasReported(
`Unknown arch '${opts.arch}'. Specify ${knownArchs.join(', ')}`
);
}
if (dryRun) return 'built';
if (dryRun) {
return 'built';
}
await build(nodeVersion, arch, built);
return built;
}

View File

@ -1,79 +0,0 @@
/* eslint-disable no-underscore-dangle, no-console */
import Progress from 'progress';
import assert from 'assert';
import chalk from 'chalk';
class Log {
_lines(lines) {
if (lines === undefined) return;
if (!Array.isArray(lines)) {
console.log(` ${lines}`);
return;
}
for (const line of lines) {
console.log(` ${line}`);
}
}
debug(text, lines) {
if (!this.debugMode) return;
console.log(`> ${chalk.green('[debug]')} ${text}`);
this._lines(lines);
}
info(text, lines) {
console.log(`> ${text}`);
this._lines(lines);
}
warn(text, lines) {
console.log(`> ${chalk.blue('Warning')} ${text}`);
this._lines(lines);
}
error(text, lines) {
if (text.stack) text = text.stack;
console.log(`> ${chalk.red('Error!')} ${text}`);
this._lines(lines);
}
enableProgress(text) {
assert(!this.bar);
text += ' '.repeat(28 - text.length);
this.bar = new Progress(` ${text} [:bar] :percent`, {
stream: process.stdout,
width: 20,
complete: '=',
incomplete: ' ',
total: 100,
});
}
showProgress(percentage) {
if (!this.bar) return;
this.bar.update(percentage / 100);
}
disableProgress() {
if (!this.bar) return;
// avoid empty line
if (!this.bar.complete) {
this.bar.terminate();
}
delete this.bar;
}
}
export const log = new Log();
export function wasReported(error, lines) {
if (error === undefined) {
error = new Error('No message');
} else if (typeof error === 'string') {
log.error(error, lines);
error = new Error(error);
}
error.wasReported = true;
return error;
}

104
lib/log.ts Normal file
View File

@ -0,0 +1,104 @@
/* eslint-disable no-underscore-dangle, no-console */
import Progress from 'progress';
import assert from 'assert';
import chalk from 'chalk';
class Log {
debugMode = false;
private bar?: Progress;
private lines(lines?: string[] | string) {
if (lines === undefined) {
return;
}
if (!Array.isArray(lines)) {
console.log(` ${lines}`);
return;
}
for (const line of lines) {
console.log(` ${line}`);
}
}
debug(text: string, lines?: string[] | string) {
if (!this.debugMode) {
return;
}
console.log(`> ${chalk.green('[debug]')} ${text}`);
this.lines(lines);
}
info(text: string, lines?: string[] | string) {
console.log(`> ${text}`);
this.lines(lines);
}
warn(text: string, lines?: string[] | string) {
console.log(`> ${chalk.blue('Warning')} ${text}`);
this.lines(lines);
}
error(text: Error | string, lines?: string[] | string) {
const message = text instanceof Error ? text.stack : text;
console.log(`> ${chalk.red('Error!')} ${message}`);
this.lines(lines);
}
enableProgress(text: string) {
assert(!this.bar);
text += ' '.repeat(28 - text.length);
this.bar = new Progress(` ${text} [:bar] :percent`, {
stream: process.stdout,
width: 20,
complete: '=',
incomplete: ' ',
total: 100,
});
}
showProgress(percentage: number) {
if (!this.bar) {
return;
}
this.bar.update(percentage / 100);
}
disableProgress() {
if (!this.bar) {
return;
}
// avoid empty line
if (!this.bar.complete) {
this.bar.terminate();
}
delete this.bar;
}
}
export const log = new Log();
class ReportedError extends Error {
name = 'ReportedError';
wasReported = true;
}
export function wasReported(error?: string, lines?: string[] | string | string) {
let reportedError = new ReportedError('No message');
if (typeof error === 'string') {
log.error(error, lines);
reportedError = new ReportedError(error);
}
return reportedError;
}

View File

@ -11,22 +11,38 @@ const IGNORE_TAG = Boolean(process.env.PKG_IGNORE_TAG);
const cachePath = PKG_CACHE_PATH || path.join(os.homedir(), '.pkg-cache');
function tagFromVersion(version) {
function tagFromVersion(version: string) {
const mj = major(version);
const mn = minor(version);
return `v${mj}.${mn}`;
}
export function localPlace(opts) {
interface PlaceOptions {
version: string;
nodeVersion: string;
platform: string;
arch: string;
}
interface LocalPlaceOptions extends PlaceOptions {
from: string;
}
export function localPlace(opts: LocalPlaceOptions) {
const p = placesJson.localPlace;
const { version } = opts;
const atHome = IGNORE_TAG
? path.join(cachePath, p)
: path.join(cachePath, tagFromVersion(version), p);
return expand(path.resolve(atHome), opts);
}
export function remotePlace(opts) {
interface RemotePlaceOptions extends PlaceOptions {
tag?: string;
}
export function remotePlace(opts: RemotePlaceOptions) {
const p = placesJson.remotePlace;
const { version } = opts;
const tag = tagFromVersion(version);

View File

@ -2,32 +2,50 @@ import byline from 'byline';
import chip from 'child_process';
import fs from 'fs';
import { log } from './log';
import getThresholds from './thresholds';
const MAX_LINES = 20;
const DEBUG_THRESHOLDS = false;
function errorLines(lines) {
type OutputLine = [number, string];
function errorLines(lines: OutputLine[]) {
return lines
.slice(-MAX_LINES)
.map((line) => line[1])
.join('\n');
}
export function spawn(cmd, args, opts) {
const child = chip.spawn(cmd, args, opts);
const stdout = byline(child.stdout);
const stderr = byline(child.stderr);
const lines = [];
class ObservablePromise extends Promise<void> {
thresholds?: ReturnType<typeof getThresholds>;
let onData = (data) => {
child!: chip.ChildProcess;
lines: OutputLine[] = [];
}
export function spawn(cmd: string, args: (string)[], opts: chip.SpawnOptions = {}) {
const child = chip.spawn(cmd, args, opts);
const stdout = child.stdout && byline(child.stdout);
const stderr = child.stderr && byline(child.stderr);
const lines: OutputLine[] = [];
let onData = (data: string) => {
const time = new Date().getTime();
lines.push([time, data.toString()]); // TODO chalk stdout/stderr?
const { thresholds } = this; // eslint-disable-line no-invalid-this
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const { thresholds } = this as ObservablePromise;
if (thresholds) {
for (const key in thresholds) {
if (data.indexOf(key) >= 0) {
const p = thresholds[key];
log.showProgress(p);
const p = thresholds[key as keyof typeof thresholds];
if (p !== undefined) {
log.showProgress(p);
}
if (DEBUG_THRESHOLDS) {
lines.push([time, '************']);
lines.push([time, `${p}: ${key}`]);
@ -38,7 +56,7 @@ export function spawn(cmd, args, opts) {
}
};
const promise = new Promise((resolve, reject) => {
const promise = new ObservablePromise((resolve, reject) => {
child.on('error', (error) => {
// eslint-disable-next-line no-console
console.error(errorLines(lines)); // dont use `log` here
@ -55,19 +73,26 @@ export function spawn(cmd, args, opts) {
});
onData = onData.bind(promise);
if (stdout) stdout.on('data', onData);
if (stderr) stderr.on('data', onData);
promise.child = child;
promise.lines = lines;
return promise;
}
export function progress(promise, thresholds) {
export function progress(
promise: ObservablePromise,
thresholds: ReturnType<typeof getThresholds>
) {
promise.thresholds = thresholds;
const { child, lines } = promise;
log.enableProgress(promise.child.spawnfile);
log.enableProgress(child.spawnfile);
log.showProgress(0);
const start = new Date().getTime();
child.on('close', () => {
if (DEBUG_THRESHOLDS) {
@ -78,8 +103,10 @@ export function progress(promise, thresholds) {
`${((100 * (line[0] - start)) / (finish - start)) | 0}: ${line[1]}`
)
.join('\n');
fs.writeFileSync(`${child.spawnfile}.debug`, content);
}
log.showProgress(100);
log.disableProgress();
});

View File

@ -5,7 +5,7 @@ function getHostAbi() {
return `m${process.versions.modules}`;
}
export function abiToNodeRange(abi) {
export function abiToNodeRange(abi: string) {
if (/^m?14/.test(abi)) return 'node0.12';
if (/^m?46/.test(abi)) return 'node4';
if (/^m?47/.test(abi)) return 'node5';
@ -21,13 +21,13 @@ export function abiToNodeRange(abi) {
return abi;
}
export function isValidNodeRange(nodeRange) {
export function isValidNodeRange(nodeRange: string) {
if (nodeRange === 'latest') return true;
if (!/^node/.test(nodeRange)) return false;
return true;
}
export function toFancyPlatform(platform) {
export function toFancyPlatform(platform: string) {
if (platform === 'darwin') return 'macos';
if (platform === 'lin') return 'linux';
if (platform === 'mac') return 'macos';
@ -39,10 +39,18 @@ export function toFancyPlatform(platform) {
function detectAlpine() {
const { platform } = process;
if (platform !== 'linux') return false;
if (platform !== 'linux') {
return false;
}
// https://github.com/sass/node-sass/issues/1589#issuecomment-265292579
const ldd = spawnSync('ldd').stderr.toString();
if (/\bmusl\b/.test(ldd)) return true;
if (/\bmusl\b/.test(ldd)) {
return true;
}
const lddNode = spawnSync('ldd', [process.execPath]).stdout.toString();
return /\bmusl\b/.test(lddNode);
}
@ -51,7 +59,11 @@ const isAlpine = detectAlpine();
function getHostPlatform() {
const { platform } = process;
if (isAlpine) return 'alpine';
if (isAlpine) {
return 'alpine';
}
return toFancyPlatform(platform);
}
@ -59,7 +71,7 @@ function getKnownPlatforms() {
return ['alpine', 'freebsd', 'linux', 'macos', 'win'];
}
export function toFancyArch(arch) {
export function toFancyArch(arch: string) {
if (arch === 'ia32') return 'x86';
if (arch === 'x86_64') return 'x64';
return arch;
@ -67,34 +79,54 @@ export function toFancyArch(arch) {
function getArmUnameArch() {
const uname = spawnSync('uname', ['-a']);
if (uname.error) return '';
if (uname.error) {
return '';
}
let unameOut = uname.stdout && uname.stdout.toString();
unameOut = (unameOut || '').toLowerCase();
if (unameOut.includes('aarch64')) return 'arm64';
if (unameOut.includes('arm64')) return 'arm64';
if (unameOut.includes('armv7')) return 'armv7';
return '';
}
function getArmHostArch() {
const cpu = fs.readFileSync('/proc/cpuinfo', 'utf8');
if (cpu.indexOf('vfpv3') >= 0) return 'armv7';
if (cpu.indexOf('vfpv3') >= 0) {
return 'armv7';
}
let name = cpu.split('model name')[1];
if (name) [, name] = name.split(':');
if (name) [name] = name.split('\n');
if (name && name.indexOf('ARMv7') >= 0) return 'armv7';
return 'armv6';
}
function getHostArch() {
const { arch } = process;
if (arch === 'arm') return getArmUnameArch() || getArmHostArch();
if (arch === 'arm') {
return getArmUnameArch() || getArmHostArch();
}
return toFancyArch(arch);
}
function getTargetArchs() {
const arch = getHostArch();
if (arch === 'x64') return ['x64', 'x86'];
if (arch === 'x64') {
return ['x64', 'x86'];
}
return [arch];
}

View File

@ -1,5 +1,5 @@
import uniqueTempDir from 'unique-temp-dir';
export function tempPath(...args) {
export function tempPath(...args: Parameters<typeof uniqueTempDir>) {
return uniqueTempDir(...args);
}

View File

@ -3,7 +3,7 @@
import assert from 'assert';
export default function thresholds(cmd, nodeVersion) {
export default function thresholds(cmd: string, nodeVersion = '') {
if (cmd === 'clone') {
return {
'ving objects: 0%': 0,

9
lib/tsconfig.json Normal file
View File

@ -0,0 +1,9 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"rootDir": ".",
"outDir": "../lib-es5"
},
"include": ["**/*", "../typings/**/*"],
"references": [{ "path": "../" }]
}

View File

@ -7,21 +7,31 @@ import build from './build';
import patchesJson from '../patches/patches.json';
import { verify } from './verify';
import { version } from '../package.json';
import { getMajor } from './get-major';
const cloud = new Cloud({ owner: 'zeit', repo: 'pkg-fetch' });
export function dontBuild(nodeVersion, targetPlatform, targetArch) {
export function dontBuild(
nodeVersion: string,
targetPlatform: string,
targetArch: string
) {
// binaries are not provided for x86 anymore
if (targetPlatform !== 'win' && targetArch === 'x86') return true;
if (targetPlatform !== 'win' && targetArch === 'x86') {
return true;
}
// https://support.apple.com/en-us/HT201948
// don't disable macos-x86 because it is not possible
// to cross-compile for x86 from macos otherwise
const major = nodeVersion.match(/^v?(\d+)/)[1] | 0;
const major = getMajor(nodeVersion);
// node 0.12 does not compile on arm
if (/^arm/.test(targetArch) && major === 0) return true;
if (targetPlatform === 'freebsd' && major < 4) return true;
if (targetPlatform === 'alpine' && (targetArch !== 'x64' || major < 6))
return true;
return false;
}
@ -31,7 +41,7 @@ export async function main() {
}
for (const nodeVersion in patchesJson) {
if (!patchesJson[nodeVersion]) {
if (!patchesJson[nodeVersion as keyof typeof patchesJson]) {
continue;
}

View File

@ -93,7 +93,7 @@ const script = `
console.log('ok');
`;
export async function verify(local) {
export async function verify(local: string) {
await plusx(local);
await spawn(local, ['-e', script], {
env: { PKG_EXECPATH: 'PKG_INVOKE_NODEJS' },

View File

@ -32,14 +32,15 @@
"dependencies": {
"@babel/runtime": "^7.9.2",
"byline": "^5.0.0",
"chalk": "^3.0.0",
"chalk": "^4.1.0",
"expand-template": "^2.0.3",
"fs-extra": "^8.1.0",
"fs-extra": "^9.1.0",
"isomorphic-fetch": "^3.0.0",
"minimist": "^1.2.5",
"progress": "^2.0.3",
"request": "^2.88.0",
"request": "^2.88.2",
"request-progress": "^3.0.0",
"semver": "^6.3.0",
"semver": "^7.3.5",
"unique-temp-dir": "^1.0.0"
},
"devDependencies": {
@ -50,18 +51,33 @@
"@babel/plugin-transform-runtime": "^7.13.10",
"@babel/preset-env": "^7.13.12",
"@babel/register": "^7.13.8",
"@octokit/core": "^3.3.1",
"@octokit/plugin-rest-endpoint-methods": "^5.0.0",
"@types/byline": "^4.2.32",
"@types/fs-extra": "^9.0.9",
"@types/isomorphic-fetch": "^0.0.35",
"@types/minimist": "^1.2.1",
"@types/node": "^14.14.37",
"@types/progress": "^2.0.3",
"@types/request": "^2.48.5",
"@types/semver": "^7.3.4",
"@typescript-eslint/eslint-plugin": "^4.19.0",
"@typescript-eslint/parser": "^4.19.0",
"ava": "^2.4.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.22.0",
"eslint-config-airbnb-base": "^14.2.1",
"eslint-config-prettier": "^8.1.0",
"eslint-import-resolver-typescript": "^2.4.0",
"eslint-plugin-import": "^2.22.1",
"lint-staged": ">=10",
"prettier": "^2.2.1",
"simple-git-hooks": ">=2.0.3"
"rimraf": "^3.0.2",
"simple-git-hooks": ">=2.0.3",
"typescript": "^4.2.3"
},
"scripts": {
"build": "node test/rimraf-es5.js && babel lib --out-dir lib-es5",
"build": "rimraf lib-es5 && tsc --build lib",
"bin": "node lib-es5/bin.js",
"lint": "eslint lib || true",
"prepare": "npm run build",

View File

@ -1,3 +0,0 @@
const path = require('path');
const remove = require('fs-extra').remove;
remove(path.join(__dirname, '../lib-es5/*'));

View File

@ -34,9 +34,9 @@ for (const nodeVersion in newPatchesJson) {
}
}
require('../lib/log.js').log = new LogMock(actions);
require('../lib-es5/log.js').log = new LogMock(actions);
require('../lib/spawn.js').spawn = (cmd, args, opts) => {
require('../lib-es5/spawn.js').spawn = (cmd, args, opts) => {
assert(opts);
assert(opts.cwd);
if (cmd === 'git' && args[0] === 'clone') {
@ -60,13 +60,13 @@ require('../lib/spawn.js').spawn = (cmd, args, opts) => {
actions.push([cmd, args.join(' '), JSON.stringify(opts)].join(' '));
};
require('../lib/spawn.js').progress = () => {};
require('../lib-es5/spawn.js').progress = () => {};
require('../lib/verify.js').verify = () => {
require('../lib-es5/verify.js').verify = () => {
actions.push('verify');
};
require('../lib/copy-file.js').copyFile = (src, dest) => {
require('../lib-es5/copy-file.js').copyFile = (src, dest) => {
src = relative(src);
const shortDest = `${path.basename(path.dirname(dest))}/${path.basename(
dest
@ -75,7 +75,7 @@ require('../lib/copy-file.js').copyFile = (src, dest) => {
lastLocal = dest;
};
require('../lib/github.js').GitHub = class {
require('../lib-es5/github.js').GitHub = class {
getRelease(tag) {
actions.push(['getRelease', tag].join(' '));
return undefined;
@ -105,7 +105,7 @@ test('upload', async (t) => {
process.env.MAKE_JOB_COUNT = 1;
// eslint-disable-next-line global-require
const { main } = require('../lib/upload');
const { main } = require('../lib-es5/upload');
await main();
const mustBe = [

18
tsconfig.json Normal file
View File

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"allowJs": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true,
"esModuleInterop": true,
"incremental": true,
"resolveJsonModule": true,
"rootDir": ".",
"outDir": ".",
"composite": true
},
"files": ["package.json", "places.json", "patches/patches.json"]
}

1760
tsconfig.tsbuildinfo Normal file

File diff suppressed because it is too large Load Diff

9
typings/expand-template.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
declare module 'expand-template' {
function expandTemplate(): (
template: string,
// eslint-disable-next-line @typescript-eslint/ban-types
variables: object
) => string;
export default expandTemplate;
}

7
typings/request-progress.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
declare module 'request-progress' {
import request from 'request';
function progress(req: request.Request): request.Request;
export default progress;
}

13
typings/unique-temp-dir.d.ts vendored Normal file
View File

@ -0,0 +1,13 @@
declare module 'unique-temp-dir' {
interface UniqueTempDirOptions {
create?: boolean;
length?: number;
thunk?: boolean;
}
function uniqueTempDir(
options?: UniqueTempDirOptions
): string;
export default uniqueTempDir;
}

377
yarn.lock
View File

@ -1248,6 +1248,87 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"
"@octokit/auth-token@^2.4.4":
version "2.4.5"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3"
integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==
dependencies:
"@octokit/types" "^6.0.3"
"@octokit/core@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.3.1.tgz#c6bb6ba171ad84a5f430853a98892cfe8f93d8cd"
integrity sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==
dependencies:
"@octokit/auth-token" "^2.4.4"
"@octokit/graphql" "^4.5.8"
"@octokit/request" "^5.4.12"
"@octokit/request-error" "^2.0.5"
"@octokit/types" "^6.0.3"
before-after-hook "^2.2.0"
universal-user-agent "^6.0.0"
"@octokit/endpoint@^6.0.1":
version "6.0.11"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1"
integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==
dependencies:
"@octokit/types" "^6.0.3"
is-plain-object "^5.0.0"
universal-user-agent "^6.0.0"
"@octokit/graphql@^4.5.8":
version "4.6.1"
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.1.tgz#f975486a46c94b7dbe58a0ca751935edc7e32cc9"
integrity sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==
dependencies:
"@octokit/request" "^5.3.0"
"@octokit/types" "^6.0.3"
universal-user-agent "^6.0.0"
"@octokit/openapi-types@^6.0.0":
version "6.0.0"
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-6.0.0.tgz#7da8d7d5a72d3282c1a3ff9f951c8133a707480d"
integrity sha512-CnDdK7ivHkBtJYzWzZm7gEkanA7gKH6a09Eguz7flHw//GacPJLmkHA3f3N++MJmlxD1Fl+mB7B32EEpSCwztQ==
"@octokit/plugin-rest-endpoint-methods@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.0.0.tgz#cf2cdeb24ea829c31688216a5b165010b61f9a98"
integrity sha512-Jc7CLNUueIshXT+HWt6T+M0sySPjF32mSFQAK7UfAg8qGeRI6OM1GSBxDLwbXjkqy2NVdnqCedJcP1nC785JYg==
dependencies:
"@octokit/types" "^6.13.0"
deprecation "^2.3.1"
"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143"
integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==
dependencies:
"@octokit/types" "^6.0.3"
deprecation "^2.0.0"
once "^1.4.0"
"@octokit/request@^5.3.0", "@octokit/request@^5.4.12":
version "5.4.14"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96"
integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==
dependencies:
"@octokit/endpoint" "^6.0.1"
"@octokit/request-error" "^2.0.0"
"@octokit/types" "^6.7.1"
deprecation "^2.0.0"
is-plain-object "^5.0.0"
node-fetch "^2.6.1"
once "^1.4.0"
universal-user-agent "^6.0.0"
"@octokit/types@^6.0.3", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1":
version "6.13.0"
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.13.0.tgz#779e5b7566c8dde68f2f6273861dd2f0409480d0"
integrity sha512-W2J9qlVIU11jMwKHUp5/rbVUeErqelCsO5vW5PKNb7wAXQVUz87Rc+imjlEvpvbH8yUb+KHmv8NEjVZdsdpyxA==
dependencies:
"@octokit/openapi-types" "^6.0.0"
"@sindresorhus/is@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@ -1260,6 +1341,18 @@
dependencies:
defer-to-connect "^1.0.1"
"@types/byline@^4.2.32":
version "4.2.32"
resolved "https://registry.yarnpkg.com/@types/byline/-/byline-4.2.32.tgz#9d35ec15968056118548412ee24c2c3026c997dc"
integrity sha512-qtlm/J6XOO9p+Ep/ZB5+mCFEDhzWDDHWU4a1eReN7lkPZXW9rkloq2jcAhvKKmlO5tL2GSvKROb+PTsNVhBiyQ==
dependencies:
"@types/node" "*"
"@types/caseless@*":
version "0.12.2"
resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8"
integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
@ -1270,6 +1363,13 @@
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
"@types/fs-extra@^9.0.9":
version "9.0.9"
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.9.tgz#11ed43b3f3c6b3490f1ef9bd17f58da896e2d861"
integrity sha512-5TqDycCl0oMzwzd1cIjSJWMKMvLCDVErle4ZTjU4EmHDURR/+yZghe6GDHMCpHtcVfq0x0gMoOM546/5TbYHrg==
dependencies:
"@types/node" "*"
"@types/glob@^7.1.1":
version "7.1.1"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
@ -1279,6 +1379,16 @@
"@types/minimatch" "*"
"@types/node" "*"
"@types/isomorphic-fetch@^0.0.35":
version "0.0.35"
resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz#c1c0d402daac324582b6186b91f8905340ea3361"
integrity sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw==
"@types/json-schema@^7.0.3":
version "7.0.7"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@ -1289,16 +1399,123 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/minimist@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
"@types/node@*":
version "13.11.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b"
integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==
"@types/node@^14.14.37":
version "14.14.37"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
"@types/progress@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/progress/-/progress-2.0.3.tgz#7ccbd9c6d4d601319126c469e73b5bb90dfc8ccc"
integrity sha512-bPOsfCZ4tsTlKiBjBhKnM8jpY5nmIll166IPD58D92hR7G7kZDfx5iB9wGF4NfZrdKolebjeAr3GouYkSGoJ/A==
dependencies:
"@types/node" "*"
"@types/request@^2.48.5":
version "2.48.5"
resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.5.tgz#019b8536b402069f6d11bee1b2c03e7f232937a0"
integrity sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==
dependencies:
"@types/caseless" "*"
"@types/node" "*"
"@types/tough-cookie" "*"
form-data "^2.5.0"
"@types/semver@^7.3.4":
version "7.3.4"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb"
integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==
"@types/tough-cookie@*":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d"
integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==
"@typescript-eslint/eslint-plugin@^4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz#56f8da9ee118fe9763af34d6a526967234f6a7f0"
integrity sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==
dependencies:
"@typescript-eslint/experimental-utils" "4.19.0"
"@typescript-eslint/scope-manager" "4.19.0"
debug "^4.1.1"
functional-red-black-tree "^1.0.1"
lodash "^4.17.15"
regexpp "^3.0.0"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz#9ca379919906dc72cb0fcd817d6cb5aa2d2054c6"
integrity sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/scope-manager" "4.19.0"
"@typescript-eslint/types" "4.19.0"
"@typescript-eslint/typescript-estree" "4.19.0"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@^4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.19.0.tgz#4ae77513b39f164f1751f21f348d2e6cb2d11128"
integrity sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==
dependencies:
"@typescript-eslint/scope-manager" "4.19.0"
"@typescript-eslint/types" "4.19.0"
"@typescript-eslint/typescript-estree" "4.19.0"
debug "^4.1.1"
"@typescript-eslint/scope-manager@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz#5e0b49eca4df7684205d957c9856f4e720717a4f"
integrity sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==
dependencies:
"@typescript-eslint/types" "4.19.0"
"@typescript-eslint/visitor-keys" "4.19.0"
"@typescript-eslint/types@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.19.0.tgz#5181d5d2afd02e5b8f149ebb37ffc8bd7b07a568"
integrity sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==
"@typescript-eslint/typescript-estree@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz#8a709ffa400284ab72df33376df085e2e2f61147"
integrity sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==
dependencies:
"@typescript-eslint/types" "4.19.0"
"@typescript-eslint/visitor-keys" "4.19.0"
debug "^4.1.1"
globby "^11.0.1"
is-glob "^4.0.1"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/visitor-keys@4.19.0":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz#cbea35109cbd9b26e597644556be4546465d8f7f"
integrity sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==
dependencies:
"@typescript-eslint/types" "4.19.0"
eslint-visitor-keys "^2.0.0"
acorn-jsx@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
@ -1535,6 +1752,11 @@ asynckit@^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.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@ -1717,6 +1939,11 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
before-after-hook@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.0.tgz#09c40d92e936c64777aa385c4e9b904f8147eaf0"
integrity sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==
binary-extensions@^1.0.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
@ -1897,14 +2124,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@^4.0.0, chalk@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
@ -2364,6 +2583,11 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
deprecation@^2.0.0, deprecation@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@ -2557,6 +2781,17 @@ eslint-import-resolver-node@^0.3.4:
debug "^2.6.9"
resolve "^1.13.1"
eslint-import-resolver-typescript@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.4.0.tgz#ec1e7063ebe807f0362a7320543aaed6fe1100e1"
integrity sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA==
dependencies:
debug "^4.1.1"
glob "^7.1.6"
is-glob "^4.0.1"
resolve "^1.17.0"
tsconfig-paths "^3.9.0"
eslint-module-utils@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
@ -2592,7 +2827,7 @@ eslint-scope@5.1.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-scope@^5.1.1:
eslint-scope@^5.0.0, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@ -2600,7 +2835,7 @@ eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
eslint-utils@^2.1.0:
eslint-utils@^2.0.0, eslint-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
@ -2842,6 +3077,18 @@ fast-glob@^3.0.3:
micromatch "^4.0.2"
picomatch "^2.2.1"
fast-glob@^3.1.1:
version "3.2.5"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.0"
merge2 "^1.3.0"
micromatch "^4.0.2"
picomatch "^2.2.1"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@ -2944,6 +3191,15 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@^2.5.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@ -2960,14 +3216,15 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0"
jsonfile "^4.0.0"
universalify "^0.1.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-readdir-recursive@^1.1.0:
version "1.1.0"
@ -3081,7 +3338,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0:
dependencies:
is-glob "^4.0.1"
glob@^7.0.0, glob@^7.0.3, glob@^7.1.3:
glob@^7.0.0, glob@^7.0.3, glob@^7.1.3, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -3133,6 +3390,18 @@ globby@^10.0.1:
merge2 "^1.2.3"
slash "^3.0.0"
globby@^11.0.1:
version "11.0.3"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.1.1"
ignore "^5.1.4"
merge2 "^1.3.0"
slash "^3.0.0"
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@ -3294,6 +3563,11 @@ ignore@^5.1.1:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
ignore@^5.1.4:
version "5.1.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
import-fresh@^3.0.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
@ -3618,6 +3892,11 @@ is-plain-object@^3.0.0:
dependencies:
isobject "^4.0.0"
is-plain-object@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@ -3722,6 +4001,14 @@ isobject@^4.0.0:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
isomorphic-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4"
integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==
dependencies:
node-fetch "^2.6.1"
whatwg-fetch "^3.4.1"
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@ -3814,10 +4101,12 @@ json5@^2.1.2:
dependencies:
minimist "^1.2.5"
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
universalify "^2.0.0"
optionalDependencies:
graceful-fs "^4.1.6"
@ -4289,6 +4578,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
node-fetch@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
node-modules-regexp@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
@ -4970,7 +5264,7 @@ regexp.prototype.flags@^1.2.0:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
regexpp@^3.1.0:
regexpp@^3.0.0, regexpp@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
@ -5054,7 +5348,7 @@ request-progress@^3.0.0:
dependencies:
throttleit "^1.0.0"
request@^2.88.0:
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==
@ -5235,7 +5529,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.2.1:
semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@ -5746,11 +6040,23 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0"
strip-bom "^3.0.0"
tslib@^1.8.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^1.9.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
tsutils@^3.17.1:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
dependencies:
tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@ -5802,6 +6108,11 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
typescript@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
uid2@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
@ -5866,10 +6177,15 @@ unique-temp-dir@^1.0.0:
os-tmpdir "^1.0.1"
uid2 "0.0.3"
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
universal-user-agent@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
unset-value@^1.0.0:
version "1.0.0"
@ -5970,6 +6286,11 @@ well-known-symbols@^2.0.0:
resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5"
integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==
whatwg-fetch@^3.4.1:
version "3.6.2"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"