diff --git a/.eslintrc.yml b/.eslintrc.yml index 93929a96..805981ea 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -22,6 +22,7 @@ extends: globals: BigInt: 'readonly' + NodeJS: 'readonly' rules: # 0 = off, 1 = warn, 2 = error diff --git a/.github/workflows/napi3.yaml b/.github/workflows/napi3.yaml index 37721219..f9ea7eb6 100644 --- a/.github/workflows/napi3.yaml +++ b/.github/workflows/napi3.yaml @@ -58,7 +58,7 @@ jobs: run: yarn add ava@2 --dev --ignore-engines - name: 'Build TypeScript' - run: yarn build + run: yarn --ignore-engines build - name: Check build uses: actions-rs/cargo@v1 @@ -75,8 +75,8 @@ jobs: - name: Unit tests run: | - yarn --cwd ./test_module build - yarn test + yarn --cwd ./test_module --ignore-engines build + yarn --ignore-engines test env: RUST_BACKTRACE: 1 diff --git a/package.json b/package.json index 63d33c68..e8155e9d 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "bin": { "napi": "scripts/index.js" }, + "engines": { + "node": ">= 10.15" + }, "repository": { "type": "git", "url": "git@github.com:Brooooooklyn/napi-rs.git" @@ -18,12 +21,12 @@ ], "license": "MIT", "scripts": { - "build": "tsc -p tsconfig.json", + "build": "tsc -p tsconfig.json && chmod 777 scripts/index.js", "format": "run-p format:md format:json format:yaml format:source format:rs", "format:md": "prettier --parser markdown --write './**/*.md'", "format:json": "prettier --parser json --write './**/*.json'", "format:rs": "cargo fmt", - "format:source": "prettier --config ./package.json --write './**/*.js'", + "format:source": "prettier --config ./package.json --write './**/*.{js,ts}'", "format:yaml": "prettier --parser yaml --write './**/*.{yml,yaml}'", "lint": "eslint -c .eslintrc.yml './src/**/*.ts' './test_module/**/*.{ts,js}'", "test": "ava" @@ -33,9 +36,16 @@ }, "homepage": "https://github.com/napi-rs/napi-rs#readme", "dependencies": { + "@octokit/rest": "^18.0.4", + "chalk": "^4.1.0", "clipanion": "^2.5.0", + "debug": "^4.1.1", + "fdir": "^4.1.0", "inquirer": "^7.3.3", - "toml": "^3.0.0" + "lodash": "^4.17.20", + "putasset": "^5.0.3", + "toml": "^3.0.0", + "tslib": "^2.0.1" }, "prettier": { "printWidth": 80, @@ -59,7 +69,9 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@swc-node/register": "^0.4.5", + "@types/debug": "^4.1.5", "@types/inquirer": "^7.3.1", + "@types/lodash": "^4.14.161", "@types/node": "^14.6.3", "@typescript-eslint/eslint-plugin": "^4.0.1", "@typescript-eslint/parser": "^4.0.1", @@ -78,7 +90,6 @@ "typescript": "^4.0.2" }, "optionalDependencies": { - "@swc-node/core-linux-musl": "^0.6.1", - "tslib": "^2.0.1" + "@swc-node/core-linux-musl": "^0.6.1" } } diff --git a/src/artifacts.ts b/src/artifacts.ts new file mode 100644 index 00000000..3d6248bf --- /dev/null +++ b/src/artifacts.ts @@ -0,0 +1,73 @@ +import { join, parse } from 'path' + +import chalk from 'chalk' +import { Command } from 'clipanion' +import { fdir } from 'fdir' + +import { debugFactory } from './debug' +import { readFileAsync, writeFileAsync } from './utils' + +const debug = debugFactory('artifacts') + +export class ArtifactsCommand extends Command { + @Command.String('-d,--dir') + sourceDir = 'artifacts' + + @Command.String('-t,--target') + targetDir = '.' + + @Command.Path('artifacts') + async execute() { + const api = new fdir() + .withFullPaths() + .exclude((dirPath) => dirPath.includes('node_modules')) + .filter((filePath) => filePath.endsWith('package.json')) + .crawl(join(process.cwd(), this.targetDir)) + const sourceApi = new fdir() + .withFullPaths() + .crawl(join(process.cwd(), this.sourceDir)) + const distDirs = await api.withPromise().then( + (output) => + (output as string[]) + .map((packageJsonPath) => { + const { dir } = parse(packageJsonPath) + const { napi } = require(packageJsonPath) + if (!napi) { + return null + } + const napiName: string = napi?.name ?? 'index' + debug( + `Scan dir: [${chalk.yellowBright( + dir, + )}], napi name: ${chalk.greenBright(napiName)}`, + ) + return { + dir, + name: napiName, + } + }) + .filter(Boolean) as { + name: string + dir: string + }[], + ) + + await sourceApi.withPromise().then((output) => + Promise.all( + (output as string[]).map(async (filePath) => { + debug(`Read [${chalk.yellowBright(filePath)}]`) + const sourceContent = await readFileAsync(filePath) + const parsedName = parse(filePath) + const [fileName] = parsedName.name.split('.') + const { dir } = distDirs.find(({ name }) => name === fileName) ?? {} + if (!dir) { + throw new TypeError(`No dist dir found for ${filePath}`) + } + const distFilePath = join(dir, parsedName.base) + debug(`Write file content to [${chalk.yellowBright(distFilePath)}]`) + await writeFileAsync(distFilePath, sourceContent) + }), + ), + ) + } +} diff --git a/src/build.ts b/src/build.ts index 4560ec9d..4f3e9b2c 100644 --- a/src/build.ts +++ b/src/build.ts @@ -1,22 +1,21 @@ -import { readFile, writeFile } from 'fs' import os from 'os' -import { join, parse } from 'path' -import { promisify } from 'util' +import { join, parse, sep } from 'path' +import chalk from 'chalk' import { Command } from 'clipanion' import toml from 'toml' -const readFileAsync = promisify(readFile) -const writeFileAsync = promisify(writeFile) +import { getNapiConfig } from './consts' +import { debugFactory } from './debug' +import { existsAsync, readFileAsync, writeFileAsync } from './utils' + +const debug = debugFactory('build') export class BuildCommand extends Command { static usage = Command.Usage({ description: 'Copy native module into specified dir', }) - @Command.String(`--name`) - name!: string - @Command.Boolean(`--platform`) appendPlatformToFilename!: boolean @@ -26,16 +25,21 @@ export class BuildCommand extends Command { @Command.Boolean('--musl') isMusl = false - @Command.String() - target?: string + @Command.String('--config,-c') + configFileName?: string + + @Command.String({ + required: false, + }) + target = '.' @Command.Path('build') async execute() { + const { binaryName } = getNapiConfig(this.configFileName) let tomlContentString: string let tomlContent: any - let moduleName: string - try { + debug('Start read toml') tomlContentString = await readFileAsync( join(process.cwd(), 'Cargo.toml'), 'utf-8', @@ -45,39 +49,44 @@ export class BuildCommand extends Command { } try { + debug('Start parse toml') tomlContent = toml.parse(tomlContentString) } catch { throw new TypeError('Could not parse the Cargo.toml') } + let dylibName + if (tomlContent.package ?? tomlContent.package.name) { - moduleName = tomlContent.package.name.replace(/-/g, '_') + dylibName = tomlContent.package.name.replace(/-/g, '_') } else { throw new TypeError('No package.name field in Cargo.toml') } + debug(`Dylib name: ${chalk.greenBright(dylibName)}`) + const platform = os.platform() let libExt - let dylibName = moduleName + + debug(`Platform: ${chalk.greenBright(platform)}`) // Platform based massaging for build commands switch (platform) { case 'darwin': libExt = '.dylib' - dylibName = `lib${moduleName}` + dylibName = `lib${dylibName}` break case 'win32': libExt = '.dll' break case 'linux': - dylibName = `lib${moduleName}` + dylibName = `lib${dylibName}` libExt = '.so' break default: - console.error( + throw new TypeError( 'Operating system not currently supported or recognized by the build script', ) - process.exit(1) } const targetDir = this.isRelease ? 'release' : 'debug' @@ -92,30 +101,47 @@ export class BuildCommand extends Command { : `.${platform}-musl` : '' - let distModulePath = - this.target ?? - join('target', targetDir, `${moduleName}${platformName}.node`) - const parsedDist = parse(distModulePath) + debug( + `Platform name: ${ + platformName || chalk.green('[Empty]') + }, musl: ${chalk.greenBright(this.isMusl)}`, + ) - if (!parsedDist.name || parsedDist.name === '.') { - distModulePath = moduleName - } + let distModulePath = this.target + ? join(this.target, `${binaryName}${platformName}.node`) + : join('target', targetDir, `${binaryName}${platformName}.node`) + const parsedDist = parse(distModulePath) if (!parsedDist.ext) { distModulePath = `${distModulePath}${platformName}.node` } - const pos = __dirname.indexOf('node_modules') + const dir = await findUp() - const dylibContent = await readFileAsync( - join( - __dirname.substring(0, pos), - 'target', - targetDir, - `${dylibName}${libExt}`, - ), - ) + if (!dir) { + throw new TypeError('No target dir found') + } + + const sourcePath = join(dir, 'target', targetDir, `${dylibName}${libExt}`) + debug(`Read [${chalk.yellowBright(sourcePath)}] content`) + + const dylibContent = await readFileAsync(sourcePath) + + debug(`Write binary content to [${chalk.yellowBright(distModulePath)}]`) await writeFileAsync(distModulePath, dylibContent) } } + +async function findUp(dir = process.cwd()): Promise { + const dist = join(dir, 'target') + if (await existsAsync(dist)) { + return dir + } + const dirs = dir.split(sep) + if (dirs.length < 2) { + return null + } + dirs.pop() + return findUp(dirs.join(sep)) +} diff --git a/src/consts.ts b/src/consts.ts new file mode 100644 index 00000000..576ca5b4 --- /dev/null +++ b/src/consts.ts @@ -0,0 +1,26 @@ +import { join } from 'path' + +export function getNapiConfig(packageJson = 'package.json') { + const packageJsonPath = join(process.cwd(), packageJson) + + const pkgJson = require(packageJsonPath) + const { version: packageVersion, os, napi, name } = pkgJson + const muslPlatforms: string[] = (napi?.musl ?? []).map( + (platform: string) => `${platform}-musl`, + ) + const platforms = os + const version = packageVersion + const packageName = name + + const binaryName = napi?.name ?? 'index' + + return { + muslPlatforms, + platforms, + version, + packageName, + binaryName, + packageJsonPath, + content: pkgJson, + } +} diff --git a/src/create-npm-dir.ts b/src/create-npm-dir.ts new file mode 100644 index 00000000..7940d7dd --- /dev/null +++ b/src/create-npm-dir.ts @@ -0,0 +1,76 @@ +import { join } from 'path' + +import chalk from 'chalk' +import { Command } from 'clipanion' +import { pick } from 'lodash' + +import { getNapiConfig } from './consts' +import { debugFactory } from './debug' +import { spawn } from './spawn' +import { writeFileAsync } from './utils' + +const debug = debugFactory('create-npm-dir') + +export class CreateNpmDirCommand extends Command { + @Command.String('-t,--target') + targetDir!: string + + @Command.Path('create-npm-dir') + async execute() { + const pkgJsonDir = join(this.targetDir, 'package.json') + debug(`Read content from [${chalk.yellowBright(pkgJsonDir)}]`) + const { + platforms, + muslPlatforms, + packageName, + version, + binaryName, + content, + } = getNapiConfig(pkgJsonDir) + + for (const platform of [...platforms, ...muslPlatforms]) { + const targetDir = join(process.cwd(), this.targetDir, 'npm', platform) + await spawn(`mkdir -p ${targetDir}`) + const binaryFileName = `${binaryName}.${platform}.node` + const targetPackageJson = join(targetDir, 'package.json') + debug(`Write file [${chalk.yellowBright(targetPackageJson)}]`) + await writeFileAsync( + targetPackageJson, + JSON.stringify( + { + name: `${packageName}-${platform}`, + version, + os: [platform], + main: binaryFileName, + files: [binaryFileName], + ...pick( + content, + 'description', + 'keywords', + 'author', + 'homepage', + 'license', + 'cpu', + 'engines', + 'publishConfig', + 'repository', + 'bugs', + ), + }, + null, + 2, + ), + ) + const targetReadme = join(targetDir, 'README.md') + debug(`Write target README.md [${chalk.yellowBright(targetReadme)}]`) + await writeFileAsync(targetReadme, readme(packageName, platform)) + } + } +} + +function readme(packageName: string, platform: string) { + return `\`#${packageName}-${platform}\` + +this is the **${platform}** 64-bit binary for \`${packageName}\` +` +} diff --git a/src/debug.ts b/src/debug.ts new file mode 100644 index 00000000..d15de10e --- /dev/null +++ b/src/debug.ts @@ -0,0 +1,3 @@ +import debug from 'debug' + +export const debugFactory = (namespace: string) => debug(`napi:${namespace}`) diff --git a/src/index.ts b/src/index.ts index 010624a0..7d8564c7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,19 +2,30 @@ import { Cli } from 'clipanion' +import { ArtifactsCommand } from './artifacts' import { BuildCommand } from './build' +import { CreateNpmDirCommand } from './create-npm-dir' +import { PrePublishCommand } from './pre-publish' +import { VersionCommand } from './version' const cli = new Cli({ binaryName: 'bin', binaryVersion: require('../package.json').version, }) +cli.register(ArtifactsCommand) cli.register(BuildCommand) +cli.register(CreateNpmDirCommand) +cli.register(PrePublishCommand) +cli.register(VersionCommand) cli .run(process.argv.slice(2), { ...Cli.defaultContext, }) + .then((status) => { + process.exit(status) + }) .catch((e) => { console.error(e) process.exit(1) diff --git a/src/pre-publish.ts b/src/pre-publish.ts new file mode 100644 index 00000000..b2cbfb4d --- /dev/null +++ b/src/pre-publish.ts @@ -0,0 +1,152 @@ +import { join } from 'path' + +import { Octokit } from '@octokit/rest' +import chalk from 'chalk' +import { Command } from 'clipanion' + +import { getNapiConfig } from './consts' +import { debugFactory } from './debug' +import { spawn } from './spawn' +import { updatePackageJson } from './update-package' +import { readFileAsync, writeFileAsync } from './utils' + +const debug = debugFactory('prepublish') + +interface PackageInfo { + name: string + version: string + tag: string +} + +export class PrePublishCommand extends Command { + static usage = Command.Usage({ + description: + 'Update package.json and copy addons into per platform packages', + }) + + @Command.String(`-p,--prefix`) + prefix = 'npm' + + @Command.String('--tagstyle,-t') + tagStyle: 'npm' | 'lerna' = 'lerna' + + @Command.String('-c,--config') + configFileName?: string + + @Command.Boolean('--dry-run') + isDryRun = false + + @Command.Path('prepublish') + async execute() { + const { + packageJsonPath, + platforms, + version, + muslPlatforms, + packageName, + binaryName, + } = getNapiConfig(this.configFileName) + debug(`Update optionalDependencies in [${packageJsonPath}]`) + if (!this.isDryRun) { + await updatePackageJson(packageJsonPath, { + optionalDependencies: platforms.reduce( + (acc: Record, cur: NodeJS.Platform) => { + acc[`${packageName}-${cur}`] = `^${version}` + return acc + }, + {}, + ), + }) + } + + const { owner, repo, pkgInfo } = await this.createGhRelease( + packageName, + version, + ) + + for (const name of [...platforms, ...muslPlatforms]) { + const pkgDir = join(process.cwd(), this.prefix, name) + const filename = `${binaryName}.${name}.node` + debug(`Read [${chalk.greenBright(filename)}] content`) + const bindingFile = await readFileAsync(join(process.cwd(), filename)) + const dstPath = join(pkgDir, filename) + await writeFileAsync(dstPath, bindingFile) + debug(`Write [${chalk.yellowBright(dstPath)}] content`) + if (!this.isDryRun) { + await spawn('npm publish', { + cwd: pkgDir, + env: process.env, + }) + } + debug( + `Start upload [${chalk.greenBright( + dstPath, + )}] to Github release, [${chalk.greenBright(pkgInfo.tag)}]`, + ) + if (!this.isDryRun) { + const putasset = require('putasset') + const downloadUrl = await putasset(process.env.GITHUB_TOKEN, { + owner, + repo, + tag: pkgInfo.tag, + filename: dstPath, + }) + console.info(`${chalk.green(dstPath)} upload success`) + console.info(`Download url: ${chalk.blueBright(downloadUrl)}`) + } + } + } + + private async createGhRelease(packageName: string, version: string) { + const headCommit = (await spawn('git log -1 --pretty=%B')) + .toString('utf8') + .trim() + const [owner, repo] = process.env.GITHUB_REPOSITORY!.split('/') + const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN, + }) + let pkgInfo: PackageInfo | undefined + if (this.tagStyle === 'lerna') { + const packagesToPublish = headCommit + .split('\n') + .map((line) => line.trim()) + .filter((line, index) => line.length && index) + .map((line) => line.substr(2)) + .map(this.parseTag) + pkgInfo = packagesToPublish.find( + (pkgInfo) => pkgInfo.name === packageName, + ) + if (!pkgInfo) { + throw new TypeError( + `No release commit found with ${packageName}, original commit info: ${headCommit}`, + ) + } + } else { + pkgInfo = { + tag: `v${headCommit}`, + version, + name: packageName, + } + } + if (!this.isDryRun) { + await octokit.repos.createRelease({ + owner, + repo, + tag_name: pkgInfo.tag, + }) + } + return { owner, repo, pkgInfo } + } + + private parseTag(tag: string) { + const segments = tag.split('@') + const version = segments.pop()! + const name = segments.join('@') + + return { + name, + version, + tag, + } + } +} diff --git a/src/spawn.ts b/src/spawn.ts new file mode 100644 index 00000000..d14eae8c --- /dev/null +++ b/src/spawn.ts @@ -0,0 +1,30 @@ +import { spawn as _spawn, SpawnOptionsWithoutStdio } from 'child_process' + +import { debugFactory } from './debug' + +const debug = debugFactory('spawn') + +export function spawn( + command: string, + options: SpawnOptionsWithoutStdio = {}, +): Promise { + const [cmd, ...args] = command.split(' ').map((s) => s.trim()) + debug(`execute ${cmd} ${args.join(' ')}`) + return new Promise((resolve, reject) => { + const spawnStream = _spawn(cmd, args, { ...options, shell: 'bash' }) + const chunks: Buffer[] = [] + process.stdin.pipe(spawnStream.stdin) + spawnStream.stdout?.on('data', (chunk) => { + chunks.push(chunk) + }) + spawnStream.stdout.pipe(process.stdout) + spawnStream.stderr.pipe(process.stderr) + spawnStream.on('close', (code) => { + if (code !== 0) { + reject() + } else { + resolve(Buffer.concat(chunks)) + } + }) + }) +} diff --git a/src/update-package.ts b/src/update-package.ts new file mode 100644 index 00000000..520e715b --- /dev/null +++ b/src/update-package.ts @@ -0,0 +1,9 @@ +import { writeFileAsync } from './utils' + +export async function updatePackageJson( + path: string, + partial: Record, +) { + const old = require(path) + await writeFileAsync(path, JSON.stringify({ ...old, ...partial }, null, 2)) +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..eaa547e9 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,6 @@ +import { readFile, writeFile, exists } from 'fs' +import { promisify } from 'util' + +export const readFileAsync = promisify(readFile) +export const writeFileAsync = promisify(writeFile) +export const existsAsync = promisify(exists) diff --git a/src/version.ts b/src/version.ts new file mode 100644 index 00000000..7a186655 --- /dev/null +++ b/src/version.ts @@ -0,0 +1,38 @@ +import { join } from 'path' + +import chalk from 'chalk' +import { Command } from 'clipanion' + +import { getNapiConfig } from './consts' +import { debugFactory } from './debug' +import { spawn } from './spawn' +import { updatePackageJson } from './update-package' + +const debug = debugFactory('version') + +export class VersionCommand extends Command { + @Command.String(`-p,--prefix`) + prefix = 'npm' + + @Command.String('-c,--config') + configFileName?: string + + @Command.Path('version') + async execute() { + const { muslPlatforms, version, platforms } = getNapiConfig( + this.configFileName, + ) + for (const name of [...platforms, ...muslPlatforms]) { + const pkgDir = join(process.cwd(), this.prefix, name) + debug( + `Update version to ${chalk.greenBright( + version, + )} in [${chalk.yellowBright(pkgDir)}]`, + ) + await updatePackageJson(join(pkgDir, 'package.json'), { + version, + }) + } + await spawn('git add .') + } +} diff --git a/test_module/package.json b/test_module/package.json index 1672b67a..f71ffd34 100644 --- a/test_module/package.json +++ b/test_module/package.json @@ -2,8 +2,8 @@ "name": "test-module", "version": "1.0.0", "scripts": { - "build": "cargo build && node ../scripts/index.js build ./index", - "build-release": "cargo build --release && node ../scripts/index.js build --release ./index", + "build": "cargo build && node ../scripts/index.js build", + "build-release": "cargo build --release && node ../scripts/index.js build --release", "test": "node ./index.js" } } diff --git a/yarn.lock b/yarn.lock index 145c8e9a..c8518b29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -250,6 +250,140 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" +"@octokit/auth-token@^2.4.0": + version "2.4.2" + resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a" + integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ== + dependencies: + "@octokit/types" "^5.0.0" + +"@octokit/core@^2.4.3": + version "2.5.4" + resolved "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz#f7fbf8e4f86c5cc2497a8887ba2561ec8d358054" + integrity sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.4.0" + "@octokit/types" "^5.0.0" + before-after-hook "^2.1.0" + universal-user-agent "^5.0.0" + +"@octokit/core@^3.0.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@octokit/core/-/core-3.1.2.tgz#c937d5f9621b764573068fcd2e5defcc872fd9cc" + integrity sha512-AInOFULmwOa7+NFi9F8DlDkm5qtZVmDQayi7TUgChE3yeIGPq0Y+6cAEXPexQ3Ea+uZy66hKEazR7DJyU+4wfw== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.4.0" + "@octokit/types" "^5.0.0" + before-after-hook "^2.1.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.5" + resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.5.tgz#43a6adee813c5ffd2f719e20cfd14a1fee7c193a" + integrity sha512-70K5u6zd45ItOny6aHQAsea8HHQjlQq85yqOMe+Aj8dkhN2qSJ9T+Q3YjUjEYfPRBcuUWNgMn62DQnP/4LAIiQ== + dependencies: + "@octokit/types" "^5.0.0" + is-plain-object "^4.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.3.1": + version "4.5.4" + resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.4.tgz#c9ef75b0406ebf195bf5f4ed2304a77ed7df27c7" + integrity sha512-ITpZ+dQc0cXAW1FmDkHJJM+8Lb6anUnin0VB5hLBilnYVdLC0ICFU/KIvT7OXfW9S81DE3U4Vx2EypDG1OYaPA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/plugin-paginate-rest@^2.2.0": + version "2.3.2" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.2.tgz#746fca42bc1c79639625dbcafe983e3581bdbfc7" + integrity sha512-PjHbMhKryxClCrmfvRpGaKCTxUcHIf2zirWRV9SMGf0EmxD/rFew/abSqbMiLl9uQgRZvqtTyCRMGMlUv1ZsBg== + dependencies: + "@octokit/types" "^5.3.0" + +"@octokit/plugin-request-log@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" + integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== + +"@octokit/plugin-rest-endpoint-methods@3.17.0": + version "3.17.0" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" + integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== + dependencies: + "@octokit/types" "^4.1.6" + deprecation "^2.3.1" + +"@octokit/plugin-rest-endpoint-methods@4.1.3": + version "4.1.3" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.1.3.tgz#44d9af35cd9fef63c7a4cf3b0e6b681886cc8d34" + integrity sha512-az3seq9yuc0OXlNLrZ0fWTNbFuL4sN8GN1sLmovELg3+LnpWmOs3GAn2KGa6E7SKMgpCuFvJwvsHEfYasTHUxQ== + dependencies: + "@octokit/types" "^5.1.1" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0": + version "2.0.2" + resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0" + integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw== + dependencies: + "@octokit/types" "^5.0.1" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.0": + version "5.4.7" + resolved "https://registry.npmjs.org/@octokit/request/-/request-5.4.7.tgz#fd703ee092e0463ceba49ff7a3e61cb4cf8a0fde" + integrity sha512-FN22xUDP0i0uF38YMbOfx6TotpcENP5W8yJM1e/LieGXn6IoRxDMnBf7tx5RKSW4xuUZ/1P04NFZy5iY3Rax1A== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^5.0.0" + deprecation "^2.0.0" + is-plain-object "^4.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^17.1.3": + version "17.11.2" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz#f3dbd46f9f06361c646230fd0ef8598e59183ead" + integrity sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ== + dependencies: + "@octokit/core" "^2.4.3" + "@octokit/plugin-paginate-rest" "^2.2.0" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "3.17.0" + +"@octokit/rest@^18.0.4": + version "18.0.4" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.4.tgz#3c7e7dba671ae2097c24086581a2dc2fdb039be0" + integrity sha512-l4PspvLvBG+bTDsji+XceDWuIf7qAZHLljbqJZ6UDdtACkW+MuFsprXicV5pEFAkxfPusyVDDPYJKRY1KJb7Zg== + dependencies: + "@octokit/core" "^3.0.0" + "@octokit/plugin-paginate-rest" "^2.2.0" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "4.1.3" + +"@octokit/types@^4.1.6": + version "4.1.10" + resolved "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz#e4029c11e2cc1335051775bc1600e7e740e4aca4" + integrity sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ== + dependencies: + "@types/node" ">= 8" + +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.1.1", "@octokit/types@^5.3.0": + version "5.4.1" + resolved "https://registry.npmjs.org/@octokit/types/-/types-5.4.1.tgz#d5d5f2b70ffc0e3f89467c3db749fa87fc3b7031" + integrity sha512-OlMlSySBJoJ6uozkr/i03nO5dlYQyE05vmQNZhAh9MyO4DPBP88QlwsDVLmVjIMFssvIZB6WO0ctIGMRG+xsJQ== + dependencies: + "@types/node" ">= 8" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -315,6 +449,11 @@ resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -341,6 +480,11 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash@^4.14.161": + version "4.14.161" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz#a21ca0777dabc6e4f44f3d07f37b765f54188b18" + integrity sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -351,6 +495,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-14.6.3.tgz#cc4f979548ca4d8e7b90bc0180052ab99ee64224" integrity sha512-pC/hkcREG6YfDfui1FBmj8e20jFU5Exjw4NYDm8kEdrW+mOh0T1Zve8DWKnS7ZIZvgncrctcNCXF4Q2I+loyww== +"@types/node@>= 8": + version "14.6.4" + resolved "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz#a145cc0bb14ef9c4777361b7bbafa5cf8e3acb5a" + integrity sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -675,6 +824,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +before-after-hook@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" + integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== + binary-extensions@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" @@ -782,6 +936,11 @@ chardet@^0.7.0: resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +checkup@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/checkup/-/checkup-1.3.0.tgz#d3800276fea5d0f247ffc951be78c8b02f8e0d76" + integrity sha1-04ACdv6l0PJH/8lRvnjIsC+ODXY= + chokidar@^3.4.2: version "3.4.2" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" @@ -999,7 +1158,7 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1119,6 +1278,11 @@ del@^5.1.0: rimraf "^3.0.0" slash "^3.0.0" +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -1410,6 +1574,19 @@ esutils@^2.0.2, esutils@^2.0.3: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" @@ -1473,6 +1650,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-4.1.0.tgz#f739ec79f61f69779a6430a622e5f54c57caf921" + integrity sha512-oOkohnPg4nUIkd6w22iGbFD7c7UvVnXB3a7/GHcPSsXDUGm6Jxp12bGI5O0gr0YuhDh5l/vDExdHOnrW/j9EqQ== + figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -1604,7 +1786,7 @@ get-stdin@^6.0.0: resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@^4.1.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -1974,7 +2156,7 @@ is-path-inside@^3.0.1: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^4.1.1: +is-plain-object@^4.0.0, is-plain-object@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz#1a14d6452cbd50790edc7fdaa0aed5a40a35ebb5" integrity sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA== @@ -1996,6 +2178,11 @@ is-regexp@^1.0.0: resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + is-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" @@ -2314,6 +2501,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +macos-release@^2.2.0: + version "2.4.1" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== + make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -2378,6 +2570,18 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.21: + version "2.1.27" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -2437,6 +2641,11 @@ nice-try@^1.0.4: resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch@^2.3.0: + version "2.6.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" @@ -2484,6 +2693,13 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + npm-run-path@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -2599,6 +2815,14 @@ ora@^5.0.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-name@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -2614,6 +2838,11 @@ p-defer@^1.0.0: resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2745,7 +2974,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -2908,6 +3137,19 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" +putasset@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/putasset/-/putasset-5.0.3.tgz#2fa82a8fc5e2333869df8ffb0e1f8618b1c87b9b" + integrity sha512-LGRp0SLOC4PDP/BawMaG3/hw6iKgQPRXcBF7WIzx2XTYwHVk2sS3gpvZqz6bf9GhKMal2phs+DF7J6eIAXEL4w== + dependencies: + "@octokit/rest" "^17.1.3" + checkup "^1.3.0" + mime-types "^2.1.21" + readjson "^2.0.1" + try-catch "^3.0.0" + try-to-catch "^3.0.0" + yargs-parser "^18.1.1" + rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -2961,6 +3203,13 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" +readjson@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/readjson/-/readjson-2.0.1.tgz#1822964dfd0bc0b49c8f983c192a9dd5309eb9e1" + integrity sha512-6WuJWYFKx9IVT0zogHlyRC6p+RttAC457garckmGQ8qKICT/xLVrpmvlwp8nTwPHzopbdXIJ593Df8AErIbgeQ== + dependencies: + try-catch "^3.0.0" + regexpp@^3.0.0, regexpp@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -3153,7 +3402,7 @@ shell-quote@^1.6.1: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -3340,6 +3589,11 @@ strip-bom@^4.0.0: resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -3458,6 +3712,16 @@ trim-off-newlines@^1.0.1: resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +try-catch@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/try-catch/-/try-catch-3.0.0.tgz#7996d8b89895e2e8ae62cbdbeb4fe17470f8131b" + integrity sha512-3uAqUnoemzca1ENvZ72EVimR+E8lqBbzwZ9v4CEbLjkaV3Q+FtdmPUt7jRtoSoTiYjyIMxEkf6YgUpe/voJ1ng== + +try-to-catch@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/try-to-catch/-/try-to-catch-3.0.0.tgz#a1903b44d13d5124c54d14a461d22ec1f52ea14b" + integrity sha512-eIm6ZXwR35jVF8By/HdbbkcaCDTBI5PpCPkejRKrYp0jyf/DbCCcRhHD7/O9jtFI3ewsqo9WctFEiJTS6i+CQA== + ts-node@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" @@ -3542,6 +3806,18 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universal-user-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" + integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== + dependencies: + os-name "^3.1.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + update-notifier@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746" @@ -3636,6 +3912,13 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +windows-release@^3.1.0: + version "3.3.3" + resolved "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== + dependencies: + execa "^1.0.0" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -3687,7 +3970,7 @@ yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^18.1.2: +yargs-parser@^18.1.1, yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==