From 7559524a5855093f0c0b9340d34bec975007d64a Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 16 Aug 2024 00:53:56 -0700 Subject: [PATCH 1/5] refactor: rewrite to typescript retaining API --- .circleci/config.yml | 1 + .gitattributes | 1 + .gitignore | 1 + .prettierrc.json | 15 ++ lib/asar.js | 229 --------------------------- lib/crawlfs.js | 41 ----- lib/disk.js | 123 --------------- lib/filesystem.js | 161 ------------------- lib/index.d.ts | 250 ------------------------------ lib/integrity.js | 62 -------- lib/pickle.js | 230 --------------------------- lib/wrapped-fs.js | 26 ---- package.json | 34 ++-- snapcraft.yaml | 18 --- src/asar.ts | 266 ++++++++++++++++++++++++++++++++ src/crawlfs.ts | 55 +++++++ src/disk.ts | 150 ++++++++++++++++++ src/filesystem.ts | 214 +++++++++++++++++++++++++ src/integrity.ts | 67 ++++++++ src/pickle.ts | 238 ++++++++++++++++++++++++++++ src/wrapped-fs.ts | 28 ++++ test/api-spec.js | 212 +++++++++++++++---------- test/cli-spec.js | 227 ++++++++++++++++----------- test/filesystem-spec.js | 46 +++--- test/index.test-d.ts | 9 +- test/pickle-spec.js | 16 +- test/util/compareDirectories.js | 67 ++++---- test/util/compareFileLists.js | 14 +- test/util/compareFiles.js | 37 +++-- test/util/transformStream.js | 30 ++-- tsconfig.json | 23 +++ yarn.lock | 33 ++++ 32 files changed, 1493 insertions(+), 1431 deletions(-) create mode 100644 .prettierrc.json delete mode 100644 lib/asar.js delete mode 100644 lib/crawlfs.js delete mode 100644 lib/disk.js delete mode 100644 lib/filesystem.js delete mode 100644 lib/index.d.ts delete mode 100644 lib/integrity.js delete mode 100644 lib/pickle.js delete mode 100644 lib/wrapped-fs.js delete mode 100644 snapcraft.yaml create mode 100644 src/asar.ts create mode 100644 src/crawlfs.ts create mode 100644 src/disk.ts create mode 100644 src/filesystem.ts create mode 100644 src/integrity.ts create mode 100644 src/pickle.ts create mode 100644 src/wrapped-fs.ts create mode 100644 tsconfig.json diff --git a/.circleci/config.yml b/.circleci/config.yml index ef942c1..9d0f8ea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,6 +10,7 @@ workflows: jobs: - node/test: name: test-<< matrix.executor >>-<< matrix.node-version >> + override-ci-command: yarn install --frozen-lockfile --ignore-engines pre-steps: - when: condition: diff --git a/.gitattributes b/.gitattributes index b6fcc92..57140a2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ test/input/**/*.txt text eol=lf +* text=auto eol=lf diff --git a/.gitignore b/.gitignore index 9167122..2001b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ .node-version npm-debug.log .idea +lib diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..e868094 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "parser": "typescript", + "overrides": [ + { + "files": ["*.json", "*.jsonc", "*.json5"], + "options": { + "parser": "json" + } + } + ] +} \ No newline at end of file diff --git a/lib/asar.js b/lib/asar.js deleted file mode 100644 index a0c4563..0000000 --- a/lib/asar.js +++ /dev/null @@ -1,229 +0,0 @@ -'use strict' - -const fs = require('./wrapped-fs') -const path = require('path') -const minimatch = require('minimatch') - -const Filesystem = require('./filesystem') -const disk = require('./disk') -const crawlFilesystem = require('./crawlfs') - -/** - * Whether a directory should be excluded from packing due to the `--unpack-dir" option. - * - * @param {string} dirPath - directory path to check - * @param {string} pattern - literal prefix [for backward compatibility] or glob pattern - * @param {array} unpackDirs - Array of directory paths previously marked as unpacked - */ -function isUnpackedDir (dirPath, pattern, unpackDirs) { - if (dirPath.startsWith(pattern) || minimatch(dirPath, pattern)) { - if (!unpackDirs.includes(dirPath)) { - unpackDirs.push(dirPath) - } - return true - } else { - return unpackDirs.some(unpackDir => dirPath.startsWith(unpackDir)) - } -} - -module.exports.createPackage = async function (src, dest) { - return module.exports.createPackageWithOptions(src, dest, {}) -} - -module.exports.createPackageWithOptions = async function (src, dest, options) { - const globOptions = options.globOptions ? options.globOptions : {} - globOptions.dot = options.dot === undefined ? true : options.dot - - const pattern = src + (options.pattern ? options.pattern : '/**/*') - - const [filenames, metadata] = await crawlFilesystem(pattern, globOptions) - return module.exports.createPackageFromFiles(src, dest, filenames, metadata, options) -} - -/** - * Create an ASAR archive from a list of filenames. - * - * @param {string} src: Base path. All files are relative to this. - * @param {string} dest: Archive filename (& path). - * @param {array} filenames: List of filenames relative to src. - * @param {object} metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) - * @param {object} options: Options passed to `createPackageWithOptions`. -*/ -module.exports.createPackageFromFiles = async function (src, dest, filenames, metadata, options) { - if (typeof metadata === 'undefined' || metadata === null) { metadata = {} } - if (typeof options === 'undefined' || options === null) { options = {} } - - src = path.normalize(src) - dest = path.normalize(dest) - filenames = filenames.map(function (filename) { return path.normalize(filename) }) - - const filesystem = new Filesystem(src) - const files = [] - const unpackDirs = [] - - let filenamesSorted = [] - if (options.ordering) { - const orderingFiles = (await fs.readFile(options.ordering)).toString().split('\n').map(line => { - if (line.includes(':')) { line = line.split(':').pop() } - line = line.trim() - if (line.startsWith('/')) { line = line.slice(1) } - return line - }) - - const ordering = [] - for (const file of orderingFiles) { - const pathComponents = file.split(path.sep) - let str = src - for (const pathComponent of pathComponents) { - str = path.join(str, pathComponent) - ordering.push(str) - } - } - - let missing = 0 - const total = filenames.length - - for (const file of ordering) { - if (!filenamesSorted.includes(file) && filenames.includes(file)) { - filenamesSorted.push(file) - } - } - - for (const file of filenames) { - if (!filenamesSorted.includes(file)) { - filenamesSorted.push(file) - missing += 1 - } - } - - console.log(`Ordering file has ${((total - missing) / total) * 100}% coverage.`) - } else { - filenamesSorted = filenames - } - - const handleFile = async function (filename) { - if (!metadata[filename]) { - metadata[filename] = await crawlFilesystem.determineFileType(filename) - } - const file = metadata[filename] - - let shouldUnpack - switch (file.type) { - case 'directory': - if (options.unpackDir) { - shouldUnpack = isUnpackedDir(path.relative(src, filename), options.unpackDir, unpackDirs) - } else { - shouldUnpack = false - } - filesystem.insertDirectory(filename, shouldUnpack) - break - case 'file': - shouldUnpack = false - if (options.unpack) { - shouldUnpack = minimatch(filename, options.unpack, { matchBase: true }) - } - if (!shouldUnpack && options.unpackDir) { - const dirName = path.relative(src, path.dirname(filename)) - shouldUnpack = isUnpackedDir(dirName, options.unpackDir, unpackDirs) - } - files.push({ filename: filename, unpack: shouldUnpack }) - return filesystem.insertFile(filename, shouldUnpack, file, options) - case 'link': - filesystem.insertLink(filename) - break - } - return Promise.resolve() - } - - const insertsDone = async function () { - await fs.mkdirp(path.dirname(dest)) - return disk.writeFilesystem(dest, filesystem, files, metadata) - } - - const names = filenamesSorted.slice() - - const next = async function (name) { - if (!name) { return insertsDone() } - - await handleFile(name) - return next(names.shift()) - } - - return next(names.shift()) -} - -module.exports.statFile = function (archive, filename, followLinks) { - const filesystem = disk.readFilesystemSync(archive) - return filesystem.getFile(filename, followLinks) -} - -module.exports.getRawHeader = function (archive) { - return disk.readArchiveHeaderSync(archive) -} - -module.exports.listPackage = function (archive, options) { - return disk.readFilesystemSync(archive).listFiles(options) -} - -module.exports.extractFile = function (archive, filename) { - const filesystem = disk.readFilesystemSync(archive) - return disk.readFileSync(filesystem, filename, filesystem.getFile(filename)) -} - -module.exports.extractAll = function (archive, dest) { - const filesystem = disk.readFilesystemSync(archive) - const filenames = filesystem.listFiles() - - // under windows just extract links as regular files - const followLinks = process.platform === 'win32' - - // create destination directory - fs.mkdirpSync(dest) - - const extractionErrors = [] - for (const fullPath of filenames) { - // Remove leading slash - const filename = fullPath.substr(1) - const destFilename = path.join(dest, filename) - const file = filesystem.getFile(filename, followLinks) - if (file.files) { - // it's a directory, create it and continue with the next entry - fs.mkdirpSync(destFilename) - } else if (file.link) { - // it's a symlink, create a symlink - const linkSrcPath = path.dirname(path.join(dest, file.link)) - const linkDestPath = path.dirname(destFilename) - const relativePath = path.relative(linkDestPath, linkSrcPath) - // try to delete output file, because we can't overwrite a link - try { - fs.unlinkSync(destFilename) - } catch {} - const linkTo = path.join(relativePath, path.basename(file.link)) - fs.symlinkSync(linkTo, destFilename) - } else { - // it's a file, try to extract it - try { - const content = disk.readFileSync(filesystem, filename, file) - fs.writeFileSync(destFilename, content) - if (file.executable) { - fs.chmodSync(destFilename, '755') - } - } catch (e) { - extractionErrors.push(e) - } - } - } - if (extractionErrors.length) { - throw new Error( - 'Unable to extract some files:\n\n' + - extractionErrors.map(error => error.stack).join('\n\n')) - } -} - -module.exports.uncache = function (archive) { - return disk.uncacheFilesystem(archive) -} - -module.exports.uncacheAll = function () { - disk.uncacheAll() -} diff --git a/lib/crawlfs.js b/lib/crawlfs.js deleted file mode 100644 index a26c3eb..0000000 --- a/lib/crawlfs.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const { promisify } = require('util') - -const fs = require('./wrapped-fs') -const glob = promisify(require('glob')) - -async function determineFileType (filename) { - const stat = await fs.lstat(filename) - if (stat.isFile()) { - return { type: 'file', stat } - } else if (stat.isDirectory()) { - return { type: 'directory', stat } - } else if (stat.isSymbolicLink()) { - return { type: 'link', stat } - } -} - -module.exports = async function (dir, options) { - const metadata = {} - const crawled = await glob(dir, options) - const results = await Promise.all(crawled.map(async filename => [filename, await determineFileType(filename)])) - const links = [] - const filenames = results.map(([filename, type]) => { - if (type) { - metadata[filename] = type - if (type.type === 'link') links.push(filename) - } - return filename - }).filter((filename) => { - // Newer glob can return files inside symlinked directories, to avoid - // those appearing in archives we need to manually exclude theme here - const exactLinkIndex = links.findIndex(link => filename === link) - return links.every((link, index) => { - if (index === exactLinkIndex) return true - return !filename.startsWith(link) - }) - }) - return [filenames, metadata] -} -module.exports.determineFileType = determineFileType diff --git a/lib/disk.js b/lib/disk.js deleted file mode 100644 index ad06182..0000000 --- a/lib/disk.js +++ /dev/null @@ -1,123 +0,0 @@ -'use strict' - -const fs = require('./wrapped-fs') -const path = require('path') -const pickle = require('./pickle') - -const Filesystem = require('./filesystem') -let filesystemCache = {} - -async function copyFile (dest, src, filename) { - const srcFile = path.join(src, filename) - const targetFile = path.join(dest, filename) - - const [content, stats] = await Promise.all([fs.readFile(srcFile), fs.stat(srcFile), fs.mkdirp(path.dirname(targetFile))]) - return fs.writeFile(targetFile, content, { mode: stats.mode }) -} - -async function streamTransformedFile (originalFilename, outStream, transformed) { - return new Promise((resolve, reject) => { - const stream = fs.createReadStream(transformed ? transformed.path : originalFilename) - stream.pipe(outStream, { end: false }) - stream.on('error', reject) - stream.on('end', () => resolve()) - }) -} - -const writeFileListToStream = async function (dest, filesystem, out, list, metadata) { - for (const file of list) { - if (file.unpack) { // the file should not be packed into archive - const filename = path.relative(filesystem.src, file.filename) - await copyFile(`${dest}.unpacked`, filesystem.src, filename) - } else { - await streamTransformedFile(file.filename, out, metadata[file.filename].transformed) - } - } - return out.end() -} - -module.exports.writeFilesystem = async function (dest, filesystem, files, metadata) { - const headerPickle = pickle.createEmpty() - headerPickle.writeString(JSON.stringify(filesystem.header)) - const headerBuf = headerPickle.toBuffer() - - const sizePickle = pickle.createEmpty() - sizePickle.writeUInt32(headerBuf.length) - const sizeBuf = sizePickle.toBuffer() - - const out = fs.createWriteStream(dest) - await new Promise((resolve, reject) => { - out.on('error', reject) - out.write(sizeBuf) - return out.write(headerBuf, () => resolve()) - }) - return writeFileListToStream(dest, filesystem, out, files, metadata) -} - -module.exports.readArchiveHeaderSync = function (archive) { - const fd = fs.openSync(archive, 'r') - let size - let headerBuf - try { - const sizeBuf = Buffer.alloc(8) - if (fs.readSync(fd, sizeBuf, 0, 8, null) !== 8) { - throw new Error('Unable to read header size') - } - - const sizePickle = pickle.createFromBuffer(sizeBuf) - size = sizePickle.createIterator().readUInt32() - headerBuf = Buffer.alloc(size) - if (fs.readSync(fd, headerBuf, 0, size, null) !== size) { - throw new Error('Unable to read header') - } - } finally { - fs.closeSync(fd) - } - - const headerPickle = pickle.createFromBuffer(headerBuf) - const header = headerPickle.createIterator().readString() - return { headerString: header, header: JSON.parse(header), headerSize: size } -} - -module.exports.readFilesystemSync = function (archive) { - if (!filesystemCache[archive]) { - const header = this.readArchiveHeaderSync(archive) - const filesystem = new Filesystem(archive) - filesystem.header = header.header - filesystem.headerSize = header.headerSize - filesystemCache[archive] = filesystem - } - return filesystemCache[archive] -} - -module.exports.uncacheFilesystem = function (archive) { - if (filesystemCache[archive]) { - filesystemCache[archive] = undefined - return true - } - return false -} - -module.exports.uncacheAll = function () { - filesystemCache = {} -} - -module.exports.readFileSync = function (filesystem, filename, info) { - let buffer = Buffer.alloc(info.size) - if (info.size <= 0) { return buffer } - if (info.unpacked) { - // it's an unpacked file, copy it. - buffer = fs.readFileSync(path.join(`${filesystem.src}.unpacked`, filename)) - } else { - // Node throws an exception when reading 0 bytes into a 0-size buffer, - // so we short-circuit the read in this case. - const fd = fs.openSync(filesystem.src, 'r') - try { - const offset = 8 + filesystem.headerSize + parseInt(info.offset) - fs.readSync(fd, buffer, 0, info.size, offset) - } finally { - fs.closeSync(fd) - } - } - return buffer -} diff --git a/lib/filesystem.js b/lib/filesystem.js deleted file mode 100644 index d921c50..0000000 --- a/lib/filesystem.js +++ /dev/null @@ -1,161 +0,0 @@ -'use strict' - -const fs = require('./wrapped-fs') -const os = require('os') -const path = require('path') -const { promisify } = require('util') -const stream = require('stream') -const getFileIntegrity = require('./integrity') - -const UINT32_MAX = 2 ** 32 - 1 - -const pipeline = promisify(stream.pipeline) - -class Filesystem { - constructor (src) { - this.src = path.resolve(src) - this.header = { files: Object.create(null) } - this.offset = BigInt(0) - } - - searchNodeFromDirectory (p) { - let json = this.header - const dirs = p.split(path.sep) - for (const dir of dirs) { - if (dir !== '.') { - if (!json.files[dir]) { - json.files[dir] = { files: Object.create(null) } - } - json = json.files[dir] - } - } - return json - } - - searchNodeFromPath (p) { - p = path.relative(this.src, p) - if (!p) { return this.header } - const name = path.basename(p) - const node = this.searchNodeFromDirectory(path.dirname(p)) - if (node.files == null) { - node.files = Object.create(null) - } - if (node.files[name] == null) { - node.files[name] = Object.create(null) - } - return node.files[name] - } - - insertDirectory (p, shouldUnpack) { - const node = this.searchNodeFromPath(p) - if (shouldUnpack) { - node.unpacked = shouldUnpack - } - node.files = node.files || Object.create(null) - return node.files - } - - async insertFile (p, shouldUnpack, file, options) { - const dirNode = this.searchNodeFromPath(path.dirname(p)) - const node = this.searchNodeFromPath(p) - if (shouldUnpack || dirNode.unpacked) { - node.size = file.stat.size - node.unpacked = true - node.integrity = await getFileIntegrity(p) - return Promise.resolve() - } - - let size - - const transformed = options.transform && options.transform(p) - if (transformed) { - const tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'asar-')) - const tmpfile = path.join(tmpdir, path.basename(p)) - const out = fs.createWriteStream(tmpfile) - const readStream = fs.createReadStream(p) - - await pipeline(readStream, transformed, out) - file.transformed = { - path: tmpfile, - stat: await fs.lstat(tmpfile) - } - size = file.transformed.stat.size - } else { - size = file.stat.size - } - - // JavaScript cannot precisely present integers >= UINT32_MAX. - if (size > UINT32_MAX) { - throw new Error(`${p}: file size can not be larger than 4.2GB`) - } - - node.size = size - node.offset = this.offset.toString() - node.integrity = await getFileIntegrity(p) - if (process.platform !== 'win32' && (file.stat.mode & 0o100)) { - node.executable = true - } - this.offset += BigInt(size) - } - - insertLink (p) { - const symlink = fs.readlinkSync(p) - // /var => /private/var - const parentPath = fs.realpathSync(path.dirname(p)) - const link = path.relative(fs.realpathSync(this.src), path.join(parentPath, symlink)) - if (link.startsWith('..')) { - throw new Error(`${p}: file "${link}" links out of the package`) - } - const node = this.searchNodeFromPath(p) - node.link = link - return link - } - - listFiles (options) { - const files = [] - - const fillFilesFromMetadata = function (basePath, metadata) { - if (!metadata.files) { - return - } - - for (const [childPath, childMetadata] of Object.entries(metadata.files)) { - const fullPath = path.join(basePath, childPath) - const packState = childMetadata.unpacked ? 'unpack' : 'pack ' - files.push((options && options.isPack) ? `${packState} : ${fullPath}` : fullPath) - fillFilesFromMetadata(fullPath, childMetadata) - } - } - - fillFilesFromMetadata('/', this.header) - return files - } - - getNode (p) { - const node = this.searchNodeFromDirectory(path.dirname(p)) - const name = path.basename(p) - if (name) { - return node.files[name] - } else { - return node - } - } - - getFile (p, followLinks) { - followLinks = typeof followLinks === 'undefined' ? true : followLinks - const info = this.getNode(p) - - if (!info) { - throw new Error(`"${p}" was not found in this archive`) - } - - // if followLinks is false we don't resolve symlinks - if (info.link && followLinks) { - return this.getFile(info.link) - } else { - return info - } - } -} - -module.exports = Filesystem diff --git a/lib/index.d.ts b/lib/index.d.ts deleted file mode 100644 index b79528b..0000000 --- a/lib/index.d.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { Stats } from "fs"; - -interface IMinimatchOptions { - /** - * Dump a ton of stuff to stderr. - * - * @default false - */ - debug?: boolean | undefined; - - /** - * Do not expand `{a,b}` and `{1..3}` brace sets. - * - * @default false - */ - nobrace?: boolean | undefined; - - /** - * Disable `**` matching against multiple folder names. - * - * @default false - */ - noglobstar?: boolean | undefined; - - /** - * Allow patterns to match filenames starting with a period, - * even if the pattern does not explicitly have a period in that spot. - * - * Note that by default, `'a/**' + '/b'` will **not** match `a/.d/b`, unless `dot` is set. - * - * @default false - */ - dot?: boolean | undefined; - - /** - * Disable "extglob" style patterns like `+(a|b)`. - * - * @default false - */ - noext?: boolean | undefined; - - /** - * Perform a case-insensitive match. - * - * @default false - */ - nocase?: boolean | undefined; - - /** - * When a match is not found by `minimatch.match`, - * return a list containing the pattern itself if this option is set. - * Otherwise, an empty list is returned if there are no matches. - * - * @default false - */ - nonull?: boolean | undefined; - - /** - * If set, then patterns without slashes will be matched - * against the basename of the path if it contains slashes. For example, - * `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - * - * @default false - */ - matchBase?: boolean | undefined; - - /** - * Suppress the behavior of treating `#` at the start of a pattern as a comment. - * - * @default false - */ - nocomment?: boolean | undefined; - - /** - * Suppress the behavior of treating a leading `!` character as negation. - * - * @default false - */ - nonegate?: boolean | undefined; - - /** - * Returns from negate expressions the same as if they were not negated. - * (Ie, true on a hit, false on a miss.) - * - * @default false - */ - flipNegate?: boolean | undefined; - - /** - * Compare a partial path to a pattern. As long as the parts of the path that - * are present are not contradicted by the pattern, it will be treated as a - * match. This is useful in applications where you're walking through a - * folder structure, and don't yet have the full path, but want to ensure that - * you do not walk down paths that can never be a match. - * - * @default false - * - * @example - * import minimatch = require("minimatch"); - * - * minimatch('/a/b', '/a/*' + '/c/d', { partial: true }) // true, might be /a/b/c/d - * minimatch('/a/b', '/**' + '/d', { partial: true }) // true, might be /a/b/.../d - * minimatch('/x/y/z', '/a/**' + '/z', { partial: true }) // false, because x !== a - */ - partial?: boolean; - - /** - * Use `\\` as a path separator _only_, and _never_ as an escape - * character. If set, all `\\` characters are replaced with `/` in - * the pattern. Note that this makes it **impossible** to match - * against paths containing literal glob pattern characters, but - * allows matching with patterns constructed using `path.join()` and - * `path.resolve()` on Windows platforms, mimicking the (buggy!) - * behavior of earlier versions on Windows. Please use with - * caution, and be mindful of the caveat about Windows paths - * - * For legacy reasons, this is also set if - * `options.allowWindowsEscape` is set to the exact value `false`. - * - * @default false - */ - windowsPathsNoEscape?: boolean; -} - -import fs = require("fs"); -interface IGlobOptions extends IMinimatchOptions { - cwd?: string | undefined; - root?: string | undefined; - dot?: boolean | undefined; - nomount?: boolean | undefined; - mark?: boolean | undefined; - nosort?: boolean | undefined; - stat?: boolean | undefined; - silent?: boolean | undefined; - strict?: boolean | undefined; - cache?: - | { [path: string]: boolean | "DIR" | "FILE" | ReadonlyArray } - | undefined; - statCache?: - | { [path: string]: false | { isDirectory(): boolean } | undefined } - | undefined; - symlinks?: { [path: string]: boolean | undefined } | undefined; - realpathCache?: { [path: string]: string } | undefined; - sync?: boolean | undefined; - nounique?: boolean | undefined; - nonull?: boolean | undefined; - debug?: boolean | undefined; - nobrace?: boolean | undefined; - noglobstar?: boolean | undefined; - noext?: boolean | undefined; - nocase?: boolean | undefined; - matchBase?: any; - nodir?: boolean | undefined; - ignore?: string | ReadonlyArray | undefined; - follow?: boolean | undefined; - realpath?: boolean | undefined; - nonegate?: boolean | undefined; - nocomment?: boolean | undefined; - absolute?: boolean | undefined; - allowWindowsEscape?: boolean | undefined; - fs?: typeof fs; -} - -export type CreateOptions = { - dot?: boolean; - globOptions?: IGlobOptions; - ordering?: string; - pattern?: string; - transform?: (filePath: string) => NodeJS.ReadWriteStream | void; - unpack?: string; - unpackDir?: string; -}; - -export type ListOptions = { - isPack: boolean; -}; - -export type EntryMetadata = { - unpacked: boolean; -}; - -export type DirectoryMetadata = EntryMetadata & { - files: { [property: string]: EntryMetadata }; -}; - -export type FileMetadata = EntryMetadata & { - executable?: true; - offset?: number; - size?: number; -}; - -export type LinkMetadata = { - link: string; -}; - -export type Metadata = DirectoryMetadata | FileMetadata | LinkMetadata; - -export type InputMetadataType = 'directory' | 'file' | 'link'; - -export type InputMetadata = { - [property: string]: { - type: InputMetadataType; - stat: Stats; - } -}; - -export type DirectoryRecord = { - files: Record; -}; - -export type FileRecord = { - offset: string; - size: number; - executable?: boolean; - integrity: { - hash: string; - algorithm: 'SHA256'; - blocks: string[]; - blockSize: number; - }; -} - -export type ArchiveHeader = { - // The JSON parsed header string - header: DirectoryRecord; - headerString: string; - headerSize: number; -} - -export function createPackage(src: string, dest: string): Promise; -export function createPackageWithOptions( - src: string, - dest: string, - options: CreateOptions -): Promise; -export function createPackageFromFiles( - src: string, - dest: string, - filenames: string[], - metadata?: InputMetadata, - options?: CreateOptions -): Promise; - -export function statFile(archive: string, filename: string, followLinks?: boolean): Metadata; -export function getRawHeader(archive: string): ArchiveHeader; -export function listPackage(archive: string, options?: ListOptions): string[]; -export function extractFile(archive: string, filename: string): Buffer; -export function extractAll(archive: string, dest: string): void; -export function uncache(archive: string): boolean; -export function uncacheAll(): void; diff --git a/lib/integrity.js b/lib/integrity.js deleted file mode 100644 index 6fabee4..0000000 --- a/lib/integrity.js +++ /dev/null @@ -1,62 +0,0 @@ -const crypto = require('crypto') -const fs = require('fs') -const stream = require('stream') -const { promisify } = require('util') - -const ALGORITHM = 'SHA256' -// 4MB default block size -const BLOCK_SIZE = 4 * 1024 * 1024 - -const pipeline = promisify(stream.pipeline) - -function hashBlock (block) { - return crypto.createHash(ALGORITHM).update(block).digest('hex') -} - -async function getFileIntegrity (path) { - const fileHash = crypto.createHash(ALGORITHM) - - const blocks = [] - let currentBlockSize = 0 - let currentBlock = [] - - await pipeline( - fs.createReadStream(path), - new stream.PassThrough({ - decodeStrings: false, - transform (_chunk, encoding, callback) { - fileHash.update(_chunk) - - function handleChunk (chunk) { - const diffToSlice = Math.min(BLOCK_SIZE - currentBlockSize, chunk.byteLength) - currentBlockSize += diffToSlice - currentBlock.push(chunk.slice(0, diffToSlice)) - if (currentBlockSize === BLOCK_SIZE) { - blocks.push(hashBlock(Buffer.concat(currentBlock))) - currentBlock = [] - currentBlockSize = 0 - } - if (diffToSlice < chunk.byteLength) { - handleChunk(chunk.slice(diffToSlice)) - } - } - handleChunk(_chunk) - callback() - }, - flush (callback) { - blocks.push(hashBlock(Buffer.concat(currentBlock))) - currentBlock = [] - callback() - } - }) - ) - - return { - algorithm: ALGORITHM, - hash: fileHash.digest('hex'), - blockSize: BLOCK_SIZE, - blocks: blocks - } -} - -module.exports = getFileIntegrity diff --git a/lib/pickle.js b/lib/pickle.js deleted file mode 100644 index 6943655..0000000 --- a/lib/pickle.js +++ /dev/null @@ -1,230 +0,0 @@ -// sizeof(T). -const SIZE_INT32 = 4 -const SIZE_UINT32 = 4 -const SIZE_INT64 = 8 -const SIZE_UINT64 = 8 -const SIZE_FLOAT = 4 -const SIZE_DOUBLE = 8 - -// The allocation granularity of the payload. -const PAYLOAD_UNIT = 64 - -// Largest JS number. -const CAPACITY_READ_ONLY = 9007199254740992 - -// Aligns 'i' by rounding it up to the next multiple of 'alignment'. -const alignInt = function (i, alignment) { - return i + (alignment - (i % alignment)) % alignment -} - -// PickleIterator reads data from a Pickle. The Pickle object must remain valid -// while the PickleIterator object is in use. -const PickleIterator = (function () { - function PickleIterator (pickle) { - this.payload = pickle.header - this.payloadOffset = pickle.headerSize - this.readIndex = 0 - this.endIndex = pickle.getPayloadSize() - } - - PickleIterator.prototype.readBool = function () { - return this.readInt() !== 0 - } - - PickleIterator.prototype.readInt = function () { - return this.readBytes(SIZE_INT32, Buffer.prototype.readInt32LE) - } - - PickleIterator.prototype.readUInt32 = function () { - return this.readBytes(SIZE_UINT32, Buffer.prototype.readUInt32LE) - } - - PickleIterator.prototype.readInt64 = function () { - return this.readBytes(SIZE_INT64, Buffer.prototype.readInt64LE) - } - - PickleIterator.prototype.readUInt64 = function () { - return this.readBytes(SIZE_UINT64, Buffer.prototype.readUInt64LE) - } - - PickleIterator.prototype.readFloat = function () { - return this.readBytes(SIZE_FLOAT, Buffer.prototype.readFloatLE) - } - - PickleIterator.prototype.readDouble = function () { - return this.readBytes(SIZE_DOUBLE, Buffer.prototype.readDoubleLE) - } - - PickleIterator.prototype.readString = function () { - return this.readBytes(this.readInt()).toString() - } - - PickleIterator.prototype.readBytes = function (length, method) { - const readPayloadOffset = this.getReadPayloadOffsetAndAdvance(length) - if (method != null) { - return method.call(this.payload, readPayloadOffset, length) - } else { - return this.payload.slice(readPayloadOffset, readPayloadOffset + length) - } - } - - PickleIterator.prototype.getReadPayloadOffsetAndAdvance = function (length) { - if (length > this.endIndex - this.readIndex) { - this.readIndex = this.endIndex - throw new Error('Failed to read data with length of ' + length) - } - const readPayloadOffset = this.payloadOffset + this.readIndex - this.advance(length) - return readPayloadOffset - } - - PickleIterator.prototype.advance = function (size) { - const alignedSize = alignInt(size, SIZE_UINT32) - if (this.endIndex - this.readIndex < alignedSize) { - this.readIndex = this.endIndex - } else { - this.readIndex += alignedSize - } - } - - return PickleIterator -})() - -// This class provides facilities for basic binary value packing and unpacking. -// -// The Pickle class supports appending primitive values (ints, strings, etc.) -// to a pickle instance. The Pickle instance grows its internal memory buffer -// dynamically to hold the sequence of primitive values. The internal memory -// buffer is exposed as the "data" of the Pickle. This "data" can be passed -// to a Pickle object to initialize it for reading. -// -// When reading from a Pickle object, it is important for the consumer to know -// what value types to read and in what order to read them as the Pickle does -// not keep track of the type of data written to it. -// -// The Pickle's data has a header which contains the size of the Pickle's -// payload. It can optionally support additional space in the header. That -// space is controlled by the header_size parameter passed to the Pickle -// constructor. -const Pickle = (function () { - function Pickle (buffer) { - if (buffer) { - this.initFromBuffer(buffer) - } else { - this.initEmpty() - } - } - - Pickle.prototype.initEmpty = function () { - this.header = Buffer.alloc(0) - this.headerSize = SIZE_UINT32 - this.capacityAfterHeader = 0 - this.writeOffset = 0 - this.resize(PAYLOAD_UNIT) - this.setPayloadSize(0) - } - - Pickle.prototype.initFromBuffer = function (buffer) { - this.header = buffer - this.headerSize = buffer.length - this.getPayloadSize() - this.capacityAfterHeader = CAPACITY_READ_ONLY - this.writeOffset = 0 - if (this.headerSize > buffer.length) { - this.headerSize = 0 - } - if (this.headerSize !== alignInt(this.headerSize, SIZE_UINT32)) { - this.headerSize = 0 - } - if (this.headerSize === 0) { - this.header = Buffer.alloc(0) - } - } - - Pickle.prototype.createIterator = function () { - return new PickleIterator(this) - } - - Pickle.prototype.toBuffer = function () { - return this.header.slice(0, this.headerSize + this.getPayloadSize()) - } - - Pickle.prototype.writeBool = function (value) { - return this.writeInt(value ? 1 : 0) - } - - Pickle.prototype.writeInt = function (value) { - return this.writeBytes(value, SIZE_INT32, Buffer.prototype.writeInt32LE) - } - - Pickle.prototype.writeUInt32 = function (value) { - return this.writeBytes(value, SIZE_UINT32, Buffer.prototype.writeUInt32LE) - } - - Pickle.prototype.writeInt64 = function (value) { - return this.writeBytes(value, SIZE_INT64, Buffer.prototype.writeInt64LE) - } - - Pickle.prototype.writeUInt64 = function (value) { - return this.writeBytes(value, SIZE_UINT64, Buffer.prototype.writeUInt64LE) - } - - Pickle.prototype.writeFloat = function (value) { - return this.writeBytes(value, SIZE_FLOAT, Buffer.prototype.writeFloatLE) - } - - Pickle.prototype.writeDouble = function (value) { - return this.writeBytes(value, SIZE_DOUBLE, Buffer.prototype.writeDoubleLE) - } - - Pickle.prototype.writeString = function (value) { - const length = Buffer.byteLength(value, 'utf8') - if (!this.writeInt(length)) { - return false - } - return this.writeBytes(value, length) - } - - Pickle.prototype.setPayloadSize = function (payloadSize) { - return this.header.writeUInt32LE(payloadSize, 0) - } - - Pickle.prototype.getPayloadSize = function () { - return this.header.readUInt32LE(0) - } - - Pickle.prototype.writeBytes = function (data, length, method) { - const dataLength = alignInt(length, SIZE_UINT32) - const newSize = this.writeOffset + dataLength - if (newSize > this.capacityAfterHeader) { - this.resize(Math.max(this.capacityAfterHeader * 2, newSize)) - } - if (method != null) { - method.call(this.header, data, this.headerSize + this.writeOffset) - } else { - this.header.write(data, this.headerSize + this.writeOffset, length) - } - const endOffset = this.headerSize + this.writeOffset + length - this.header.fill(0, endOffset, endOffset + dataLength - length) - this.setPayloadSize(newSize) - this.writeOffset = newSize - return true - } - - Pickle.prototype.resize = function (newCapacity) { - newCapacity = alignInt(newCapacity, PAYLOAD_UNIT) - this.header = Buffer.concat([this.header, Buffer.alloc(newCapacity)]) - this.capacityAfterHeader = newCapacity - } - - return Pickle -})() - -module.exports = { - createEmpty: function () { - return new Pickle() - }, - - createFromBuffer: function (buffer) { - return new Pickle(buffer) - } -} diff --git a/lib/wrapped-fs.js b/lib/wrapped-fs.js deleted file mode 100644 index 24f59d0..0000000 --- a/lib/wrapped-fs.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const fs = process.versions.electron ? require('original-fs') : require('fs') - -const promisifiedMethods = [ - 'lstat', - 'mkdtemp', - 'readFile', - 'stat', - 'writeFile' -] - -const promisified = {} - -for (const method of Object.keys(fs)) { - if (promisifiedMethods.includes(method)) { - promisified[method] = fs.promises[method] - } else { - promisified[method] = fs[method] - } -} -// To make it more like fs-extra -promisified.mkdirp = (dir) => fs.promises.mkdir(dir, { recursive: true }) -promisified.mkdirpSync = (dir) => fs.mkdirSync(dir, { recursive: true }) - -module.exports = promisified diff --git a/package.json b/package.json index b2460d8..e75e1a7 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,13 @@ "description": "Creating Electron app packages", "version": "0.0.0-development", "main": "./lib/asar.js", - "types": "./lib/index.d.ts", + "types": "./lib/asar.d.ts", "bin": { "asar": "./bin/asar.js" }, "files": [ "bin", - "lib", - "lib/index.d.ts" + "lib" ], "engines": { "node": ">=10.12.0" @@ -25,36 +24,31 @@ "url": "https://github.com/electron/asar/issues" }, "scripts": { + "build": "tsc", "mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec", - "test": "npm run lint && npm run mocha", - "lint": "tsd && standard", - "standard": "standard", - "tsd": "tsd" - }, - "standard": { - "env": { - "mocha": true - }, - "globals": [ - "BigInt" - ] - }, - "tsd": { - "directory": "test" + "test": "yarn lint && yarn mocha", + "lint": "yarn prettier:check", + "prettier": "prettier \"src/**/*.ts\" \"test/**/*.ts\" \"test/**/*.js\"", + "prettier:check": "yarn prettier --check", + "prettier:write": "yarn prettier --write", + "prepare": "tsc" }, "dependencies": { + "@types/glob": "^7.1.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "devDependencies": { + "@types/minimatch": "^3.0.5", + "@types/node": "^12.0.0", "electron": "^22.0.0", "electron-mocha": "^11.0.2", "lodash": "^4.17.15", "mocha": "^10.1.0", + "prettier": "^3.3.3", "rimraf": "^3.0.2", - "standard": "^14.3.3", - "tsd": "^0.25.0", + "typescript": "^5.5.4", "xvfb-maybe": "^0.2.1" } } diff --git a/snapcraft.yaml b/snapcraft.yaml deleted file mode 100644 index b3bbd06..0000000 --- a/snapcraft.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: asar -version: git -summary: Manipulate asar archive files -description: | - Asar is a simple extensive archive format, it works like tar that - concatenates all files together without compression, while having - random access support. - -confinement: classic - -parts: - asar: - plugin: nodejs - source: . - -apps: - asar: - command: lib/node_modules/asar/bin/asar.js diff --git a/src/asar.ts b/src/asar.ts new file mode 100644 index 0000000..a8735a8 --- /dev/null +++ b/src/asar.ts @@ -0,0 +1,266 @@ +import * as path from 'path'; +import * as minimatch from 'minimatch'; + +import fs from './wrapped-fs'; +import { Filesystem, FilesystemEntry } from './filesystem'; +import * as disk from './disk'; +import { CrawledFileType, crawl as crawlFilesystem, determineFileType } from './crawlfs'; +import { IOptions } from 'glob'; +import { Stats } from 'fs'; + +/** + * Whether a directory should be excluded from packing due to the `--unpack-dir" option. + * + * @param {string} dirPath - directory path to check + * @param {string} pattern - literal prefix [for backward compatibility] or glob pattern + * @param {array} unpackDirs - Array of directory paths previously marked as unpacked + */ +function isUnpackedDir(dirPath: string, pattern: string, unpackDirs: string[]) { + if (dirPath.startsWith(pattern) || minimatch(dirPath, pattern)) { + if (!unpackDirs.includes(dirPath)) { + unpackDirs.push(dirPath); + } + return true; + } else { + return unpackDirs.some((unpackDir) => dirPath.startsWith(unpackDir)); + } +} + +export async function createPackage(src: string, dest: string) { + return createPackageWithOptions(src, dest, {}); +} + +export type CreateOptions = { + dot?: boolean; + globOptions?: IOptions; + ordering?: string; + pattern?: string; + transform?: (filePath: string) => NodeJS.ReadWriteStream | void; + unpack?: string; + unpackDir?: string; +}; + +export async function createPackageWithOptions(src: string, dest: string, options: CreateOptions) { + const globOptions = options.globOptions ? options.globOptions : {}; + globOptions.dot = options.dot === undefined ? true : options.dot; + + const pattern = src + (options.pattern ? options.pattern : '/**/*'); + + const [filenames, metadata] = await crawlFilesystem(pattern, globOptions); + return module.exports.createPackageFromFiles(src, dest, filenames, metadata, options); +} + +/** + * Create an ASAR archive from a list of filenames. + * + * @param {string} src: Base path. All files are relative to this. + * @param {string} dest: Archive filename (& path). + * @param {array} filenames: List of filenames relative to src. + * @param {object} metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) + * @param {object} options: Options passed to `createPackageWithOptions`. + */ +export async function createPackageFromFiles( + src: string, + dest: string, + filenames: string[], + metadata: disk.InputMetadata = {}, + options: CreateOptions = {}, +) { + src = path.normalize(src); + dest = path.normalize(dest); + filenames = filenames.map(function (filename) { + return path.normalize(filename); + }); + + const filesystem = new Filesystem(src); + const files: { filename: string; unpack: boolean }[] = []; + const unpackDirs: string[] = []; + + let filenamesSorted: string[] = []; + if (options.ordering) { + const orderingFiles = (await fs.readFile(options.ordering)) + .toString() + .split('\n') + .map((line) => { + if (line.includes(':')) { + line = line.split(':').pop()!; + } + line = line.trim(); + if (line.startsWith('/')) { + line = line.slice(1); + } + return line; + }); + + const ordering: string[] = []; + for (const file of orderingFiles) { + const pathComponents = file.split(path.sep); + let str = src; + for (const pathComponent of pathComponents) { + str = path.join(str, pathComponent); + ordering.push(str); + } + } + + let missing = 0; + const total = filenames.length; + + for (const file of ordering) { + if (!filenamesSorted.includes(file) && filenames.includes(file)) { + filenamesSorted.push(file); + } + } + + for (const file of filenames) { + if (!filenamesSorted.includes(file)) { + filenamesSorted.push(file); + missing += 1; + } + } + + console.log(`Ordering file has ${((total - missing) / total) * 100}% coverage.`); + } else { + filenamesSorted = filenames; + } + + const handleFile = async function (filename: string) { + if (!metadata[filename]) { + const fileType = await determineFileType(filename); + if (!fileType) { + throw new Error('Unknown file type for file: ' + filename); + } + metadata[filename] = fileType; + } + const file = metadata[filename]; + + let shouldUnpack; + switch (file.type) { + case 'directory': + if (options.unpackDir) { + shouldUnpack = isUnpackedDir(path.relative(src, filename), options.unpackDir, unpackDirs); + } else { + shouldUnpack = false; + } + filesystem.insertDirectory(filename, shouldUnpack); + break; + case 'file': + shouldUnpack = false; + if (options.unpack) { + shouldUnpack = minimatch(filename, options.unpack, { matchBase: true }); + } + if (!shouldUnpack && options.unpackDir) { + const dirName = path.relative(src, path.dirname(filename)); + shouldUnpack = isUnpackedDir(dirName, options.unpackDir, unpackDirs); + } + files.push({ filename: filename, unpack: shouldUnpack }); + return filesystem.insertFile(filename, shouldUnpack, file, options); + case 'link': + filesystem.insertLink(filename); + break; + } + return Promise.resolve(); + }; + + const insertsDone = async function () { + await fs.mkdirp(path.dirname(dest)); + return disk.writeFilesystem(dest, filesystem, files, metadata); + }; + + const names = filenamesSorted.slice(); + + const next = async function (name?: string) { + if (!name) { + return insertsDone(); + } + + await handleFile(name); + return next(names.shift()); + }; + + return next(names.shift()); +} + +export function statFile( + archivePath: string, + filename: string, + followLinks: boolean = true, +): FilesystemEntry { + const filesystem = disk.readFilesystemSync(archivePath); + return filesystem.getFile(filename, followLinks); +} + +export function getRawHeader(archivePath: string) { + return disk.readArchiveHeaderSync(archivePath); +} + +export function listPackage(archivePath: string, options: { isPack: boolean }) { + return disk.readFilesystemSync(archivePath).listFiles(options); +} + +export function extractFile(archivePath: string, filename: string, followLinks: boolean = true) { + const filesystem = disk.readFilesystemSync(archivePath); + const fileInfo = filesystem.getFile(filename, followLinks); + if ('link' in fileInfo || 'files' in fileInfo) { + throw new Error('Expected to find file at: ' + filename + ' but found a directory or link'); + } + return disk.readFileSync(filesystem, filename, fileInfo); +} + +export function extractAll(archivePath: string, dest: string) { + const filesystem = disk.readFilesystemSync(archivePath); + const filenames = filesystem.listFiles(); + + // under windows just extract links as regular files + const followLinks = process.platform === 'win32'; + + // create destination directory + fs.mkdirpSync(dest); + + const extractionErrors: Error[] = []; + for (const fullPath of filenames) { + // Remove leading slash + const filename = fullPath.substr(1); + const destFilename = path.join(dest, filename); + const file = filesystem.getFile(filename, followLinks); + if ('files' in file) { + // it's a directory, create it and continue with the next entry + fs.mkdirpSync(destFilename); + } else if ('link' in file) { + // it's a symlink, create a symlink + const linkSrcPath = path.dirname(path.join(dest, file.link)); + const linkDestPath = path.dirname(destFilename); + const relativePath = path.relative(linkDestPath, linkSrcPath); + // try to delete output file, because we can't overwrite a link + try { + fs.unlinkSync(destFilename); + } catch {} + const linkTo = path.join(relativePath, path.basename(file.link)); + fs.symlinkSync(linkTo, destFilename); + } else { + // it's a file, try to extract it + try { + const content = disk.readFileSync(filesystem, filename, file); + fs.writeFileSync(destFilename, content); + if (file.executable) { + fs.chmodSync(destFilename, '755'); + } + } catch (e) { + extractionErrors.push(e as Error); + } + } + } + if (extractionErrors.length) { + throw new Error( + 'Unable to extract some files:\n\n' + + extractionErrors.map((error) => error.stack).join('\n\n'), + ); + } +} + +export function uncache(archivePath: string) { + return disk.uncacheFilesystem(archivePath); +} + +export function uncacheAll() { + disk.uncacheAll(); +} diff --git a/src/crawlfs.ts b/src/crawlfs.ts new file mode 100644 index 0000000..76dbc30 --- /dev/null +++ b/src/crawlfs.ts @@ -0,0 +1,55 @@ +import { promisify } from 'util'; +import { glob as _glob, IOptions } from 'glob'; + +import fs from './wrapped-fs'; +import { Stats } from 'fs'; + +const glob = promisify(_glob); + +export type CrawledFileType = { + type: 'file' | 'directory' | 'link'; + stat: Stats; + transformed?: { + path: string; + stat: Stats; + }; +}; + +export async function determineFileType(filename: string): Promise { + const stat = await fs.lstat(filename); + if (stat.isFile()) { + return { type: 'file', stat }; + } else if (stat.isDirectory()) { + return { type: 'directory', stat }; + } else if (stat.isSymbolicLink()) { + return { type: 'link', stat }; + } + return null; +} + +export async function crawl(dir: string, options: IOptions) { + const metadata: Record = {}; + const crawled = await glob(dir, options); + const results = await Promise.all( + crawled.map(async (filename) => [filename, await determineFileType(filename)]), + ); + const links: string[] = []; + const filenames = results + .map(([filename, type]) => { + if (type) { + metadata[filename] = type; + if (type.type === 'link') links.push(filename); + } + return filename; + }) + .filter((filename) => { + // Newer glob can return files inside symlinked directories, to avoid + // those appearing in archives we need to manually exclude theme here + const exactLinkIndex = links.findIndex((link) => filename === link); + return links.every((link, index) => { + if (index === exactLinkIndex) return true; + return !filename.startsWith(link); + }); + }); + return [filenames, metadata]; +} diff --git a/src/disk.ts b/src/disk.ts new file mode 100644 index 0000000..18f34ff --- /dev/null +++ b/src/disk.ts @@ -0,0 +1,150 @@ +import * as path from 'path'; +import fs from './wrapped-fs'; +import { Pickle } from './pickle'; +import { Filesystem, FilesystemEntry, FilesystemFileEntry } from './filesystem'; +import { CrawledFileType } from './crawlfs'; +import { Stats } from 'fs'; + +let filesystemCache: Record = Object.create(null); + +async function copyFile(dest: string, src: string, filename: string) { + const srcFile = path.join(src, filename); + const targetFile = path.join(dest, filename); + + const [content, stats] = await Promise.all([ + fs.readFile(srcFile), + fs.stat(srcFile), + fs.mkdirp(path.dirname(targetFile)), + ]); + return fs.writeFile(targetFile, content, { mode: stats.mode }); +} + +async function streamTransformedFile( + originalFilename: string, + outStream: NodeJS.WritableStream, + transformed: CrawledFileType['transformed'], +) { + return new Promise((resolve, reject) => { + const stream = fs.createReadStream(transformed ? transformed.path : originalFilename); + stream.pipe(outStream, { end: false }); + stream.on('error', reject); + stream.on('end', () => resolve()); + }); +} + +export type InputMetadata = { + [property: string]: CrawledFileType; +}; + +export type BasicFilesArray = { filename: string; unpack: boolean }[]; + +const writeFileListToStream = async function ( + dest: string, + filesystem: Filesystem, + out: NodeJS.WritableStream, + fileList: BasicFilesArray, + metadata: InputMetadata, +) { + for (const file of fileList) { + if (file.unpack) { + // the file should not be packed into archive + const filename = path.relative(filesystem.getRootPath(), file.filename); + await copyFile(`${dest}.unpacked`, filesystem.getRootPath(), filename); + } else { + await streamTransformedFile(file.filename, out, metadata[file.filename].transformed); + } + } + return out.end(); +}; + +export async function writeFilesystem( + dest: string, + filesystem: Filesystem, + fileList: BasicFilesArray, + metadata: InputMetadata, +) { + const headerPickle = Pickle.createEmpty(); + headerPickle.writeString(JSON.stringify(filesystem.getHeader())); + const headerBuf = headerPickle.toBuffer(); + + const sizePickle = Pickle.createEmpty(); + sizePickle.writeUInt32(headerBuf.length); + const sizeBuf = sizePickle.toBuffer(); + + const out = fs.createWriteStream(dest); + await new Promise((resolve, reject) => { + out.on('error', reject); + out.write(sizeBuf); + return out.write(headerBuf, () => resolve()); + }); + return writeFileListToStream(dest, filesystem, out, fileList, metadata); +} + +export function readArchiveHeaderSync(archivePath: string) { + const fd = fs.openSync(archivePath, 'r'); + let size; + let headerBuf; + try { + const sizeBuf = Buffer.alloc(8); + if (fs.readSync(fd, sizeBuf, 0, 8, null) !== 8) { + throw new Error('Unable to read header size'); + } + + const sizePickle = Pickle.createFromBuffer(sizeBuf); + size = sizePickle.createIterator().readUInt32(); + headerBuf = Buffer.alloc(size); + if (fs.readSync(fd, headerBuf, 0, size, null) !== size) { + throw new Error('Unable to read header'); + } + } finally { + fs.closeSync(fd); + } + + const headerPickle = Pickle.createFromBuffer(headerBuf); + const header = headerPickle.createIterator().readString(); + return { headerString: header, header: JSON.parse(header), headerSize: size }; +} + +export function readFilesystemSync(archivePath: string) { + if (!filesystemCache[archivePath]) { + const header = readArchiveHeaderSync(archivePath); + const filesystem = new Filesystem(archivePath); + filesystem.setHeader(header.header, header.headerSize); + filesystemCache[archivePath] = filesystem; + } + return filesystemCache[archivePath]; +} + +export function uncacheFilesystem(archivePath: string) { + if (filesystemCache[archivePath]) { + filesystemCache[archivePath] = undefined; + return true; + } + return false; +} + +export function uncacheAll() { + filesystemCache = {}; +} + +export function readFileSync(filesystem: Filesystem, filename: string, info: FilesystemFileEntry) { + let buffer = Buffer.alloc(info.size); + if (info.size <= 0) { + return buffer; + } + if (info.unpacked) { + // it's an unpacked file, copy it. + buffer = fs.readFileSync(path.join(`${filesystem.getRootPath()}.unpacked`, filename)); + } else { + // Node throws an exception when reading 0 bytes into a 0-size buffer, + // so we short-circuit the read in this case. + const fd = fs.openSync(filesystem.getRootPath(), 'r'); + try { + const offset = 8 + filesystem.getHeaderSize() + parseInt(info.offset); + fs.readSync(fd, buffer, 0, info.size, offset); + } finally { + fs.closeSync(fd); + } + } + return buffer; +} diff --git a/src/filesystem.ts b/src/filesystem.ts new file mode 100644 index 0000000..fbc4b66 --- /dev/null +++ b/src/filesystem.ts @@ -0,0 +1,214 @@ +import * as os from 'os'; +import * as path from 'path'; +import { promisify } from 'util'; +import * as stream from 'stream'; + +import { FileIntegrity, getFileIntegrity } from './integrity'; +import fs from './wrapped-fs'; +import { CrawledFileType } from './crawlfs'; + +const UINT32_MAX = 2 ** 32 - 1; + +const pipeline = promisify(stream.pipeline); + +export type FilesystemDirectoryEntry = { + files: Record; + unpacked?: boolean; +}; + +export type FilesystemFileEntry = { + unpacked: boolean; + executable: boolean; + offset: string; + size: number; + integrity: FileIntegrity; +}; + +export type FilesystemLinkEntry = { + link: string; +}; + +export type FilesystemEntry = FilesystemDirectoryEntry | FilesystemFileEntry | FilesystemLinkEntry; + +export class Filesystem { + private src: string; + private header: FilesystemEntry; + private headerSize: number; + private offset: bigint; + + constructor(src: string) { + this.src = path.resolve(src); + this.header = { files: Object.create(null) }; + this.headerSize = 0; + this.offset = BigInt(0); + } + + getRootPath() { + return this.src; + } + + getHeader() { + return this.header; + } + + getHeaderSize() { + return this.headerSize; + } + + setHeader(header: FilesystemEntry, headerSize: number) { + this.header = header; + this.headerSize = headerSize; + } + + searchNodeFromDirectory(p: string) { + let json = this.header; + const dirs = p.split(path.sep); + for (const dir of dirs) { + if (dir !== '.') { + if ('files' in json) { + if (!json.files[dir]) { + json.files[dir] = { files: Object.create(null) }; + } + json = json.files[dir]; + } else { + throw new Error('Unexpected directory state while traversing: ' + p); + } + } + } + return json; + } + + searchNodeFromPath(p: string) { + p = path.relative(this.src, p); + if (!p) { + return this.header; + } + const name = path.basename(p); + const node = this.searchNodeFromDirectory(path.dirname(p)) as FilesystemDirectoryEntry; + if (!node.files) { + node.files = Object.create(null); + } + if (!node.files[name]) { + node.files[name] = Object.create(null); + } + return node.files[name]; + } + + insertDirectory(p: string, shouldUnpack: boolean) { + const node = this.searchNodeFromPath(p) as FilesystemDirectoryEntry; + if (shouldUnpack) { + node.unpacked = shouldUnpack; + } + node.files = node.files || Object.create(null); + return node.files; + } + + async insertFile( + p: string, + shouldUnpack: boolean, + file: CrawledFileType, + options: { + transform?: (filePath: string) => NodeJS.ReadWriteStream | void; + } = {}, + ) { + const dirNode = this.searchNodeFromPath(path.dirname(p)) as FilesystemDirectoryEntry; + const node = this.searchNodeFromPath(p) as FilesystemFileEntry; + if (shouldUnpack || dirNode.unpacked) { + node.size = file.stat.size; + node.unpacked = true; + node.integrity = await getFileIntegrity(p); + return Promise.resolve(); + } + + let size; + + const transformed = options.transform && options.transform(p); + if (transformed) { + const tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'asar-')); + const tmpfile = path.join(tmpdir, path.basename(p)); + const out = fs.createWriteStream(tmpfile); + const readStream = fs.createReadStream(p); + + await pipeline(readStream, transformed, out); + file.transformed = { + path: tmpfile, + stat: await fs.lstat(tmpfile), + }; + size = file.transformed.stat.size; + } else { + size = file.stat.size; + } + + // JavaScript cannot precisely present integers >= UINT32_MAX. + if (size > UINT32_MAX) { + throw new Error(`${p}: file size can not be larger than 4.2GB`); + } + + node.size = size; + node.offset = this.offset.toString(); + node.integrity = await getFileIntegrity(p); + if (process.platform !== 'win32' && file.stat.mode & 0o100) { + node.executable = true; + } + this.offset += BigInt(size); + } + + insertLink(p: string) { + const symlink = fs.readlinkSync(p); + // /var => /private/var + const parentPath = fs.realpathSync(path.dirname(p)); + const link = path.relative(fs.realpathSync(this.src), path.join(parentPath, symlink)); + if (link.startsWith('..')) { + throw new Error(`${p}: file "${link}" links out of the package`); + } + const node = this.searchNodeFromPath(p) as FilesystemLinkEntry; + node.link = link; + return link; + } + + listFiles(options?: { isPack: boolean }) { + const files: string[] = []; + + const fillFilesFromMetadata = function (basePath: string, metadata: FilesystemEntry) { + if (!('files' in metadata)) { + return; + } + + for (const [childPath, childMetadata] of Object.entries(metadata.files)) { + const fullPath = path.join(basePath, childPath); + const packState = + 'unpacked' in childMetadata && childMetadata.unpacked ? 'unpack' : 'pack '; + files.push(options && options.isPack ? `${packState} : ${fullPath}` : fullPath); + fillFilesFromMetadata(fullPath, childMetadata); + } + }; + + fillFilesFromMetadata('/', this.header); + return files; + } + + getNode(p: string) { + const node = this.searchNodeFromDirectory(path.dirname(p)); + const name = path.basename(p); + if (name) { + return (node as FilesystemDirectoryEntry).files[name]; + } else { + return node; + } + } + + getFile(p: string, followLinks: boolean = true): FilesystemEntry { + const info = this.getNode(p); + + if (!info) { + throw new Error(`"${p}" was not found in this archive`); + } + + // if followLinks is false we don't resolve symlinks + if ('link' in info && followLinks) { + return this.getFile(info.link, followLinks); + } else { + return info; + } + } +} diff --git a/src/integrity.ts b/src/integrity.ts new file mode 100644 index 0000000..abc0799 --- /dev/null +++ b/src/integrity.ts @@ -0,0 +1,67 @@ +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import * as stream from 'stream'; +import { promisify } from 'util'; + +const ALGORITHM = 'SHA256'; +// 4MB default block size +const BLOCK_SIZE = 4 * 1024 * 1024; + +const pipeline = promisify(stream.pipeline); + +function hashBlock(block: Buffer) { + return crypto.createHash(ALGORITHM).update(block).digest('hex'); +} + +export type FileIntegrity = { + algorithm: 'SHA256'; + hash: string; + blockSize: number; + blocks: string[]; +}; + +export async function getFileIntegrity(path: string): Promise { + const fileHash = crypto.createHash(ALGORITHM); + + const blockHashes: string[] = []; + let currentBlockSize = 0; + let currentBlock: Buffer[] = []; + + await pipeline( + fs.createReadStream(path), + new stream.PassThrough({ + decodeStrings: false, + transform(_chunk, encoding, callback) { + fileHash.update(_chunk); + + function handleChunk(chunk: Buffer) { + const diffToSlice = Math.min(BLOCK_SIZE - currentBlockSize, chunk.byteLength); + currentBlockSize += diffToSlice; + currentBlock.push(chunk.slice(0, diffToSlice)); + if (currentBlockSize === BLOCK_SIZE) { + blockHashes.push(hashBlock(Buffer.concat(currentBlock))); + currentBlock = []; + currentBlockSize = 0; + } + if (diffToSlice < chunk.byteLength) { + handleChunk(chunk.slice(diffToSlice)); + } + } + handleChunk(_chunk); + callback(); + }, + flush(callback) { + blockHashes.push(hashBlock(Buffer.concat(currentBlock))); + currentBlock = []; + callback(); + }, + }), + ); + + return { + algorithm: ALGORITHM, + hash: fileHash.digest('hex'), + blockSize: BLOCK_SIZE, + blocks: blockHashes, + }; +} diff --git a/src/pickle.ts b/src/pickle.ts new file mode 100644 index 0000000..973f5d5 --- /dev/null +++ b/src/pickle.ts @@ -0,0 +1,238 @@ +// sizeof(T). +const SIZE_INT32 = 4; +const SIZE_UINT32 = 4; +const SIZE_INT64 = 8; +const SIZE_UINT64 = 8; +const SIZE_FLOAT = 4; +const SIZE_DOUBLE = 8; + +// The allocation granularity of the payload. +const PAYLOAD_UNIT = 64; + +// Largest JS number. +const CAPACITY_READ_ONLY = 9007199254740992; + +// Aligns 'i' by rounding it up to the next multiple of 'alignment'. +const alignInt = function (i: number, alignment: number) { + return i + ((alignment - (i % alignment)) % alignment); +}; + +// PickleIterator reads data from a Pickle. The Pickle object must remain valid +// while the PickleIterator object is in use. +class PickleIterator { + private payload: Buffer; + private payloadOffset: number; + private readIndex: number; + private endIndex: number; + + constructor(pickle: Pickle) { + this.payload = pickle.getHeader(); + this.payloadOffset = pickle.getHeaderSize(); + this.readIndex = 0; + this.endIndex = pickle.getPayloadSize(); + } + + readBool(): boolean { + return this.readInt() !== 0; + } + + readInt(): number { + return this.readBytes(SIZE_INT32, Buffer.prototype.readInt32LE); + } + + readUInt32(): number { + return this.readBytes(SIZE_UINT32, Buffer.prototype.readUInt32LE); + } + + readInt64(): bigint { + return this.readBytes(SIZE_INT64, Buffer.prototype.readBigInt64LE); + } + + readUInt64(): bigint { + return this.readBytes(SIZE_UINT64, Buffer.prototype.readBigUInt64LE); + } + + readFloat(): number { + return this.readBytes(SIZE_FLOAT, Buffer.prototype.readFloatLE); + } + + readDouble(): number { + return this.readBytes(SIZE_DOUBLE, Buffer.prototype.readDoubleLE); + } + + readString(): string { + return this.readBytes(this.readInt()).toString(); + } + + readBytes(length: number): Buffer; + readBytes R>(length: number, method: F): R; + readBytes R>(length: number, method?: F): R | Buffer { + const readPayloadOffset = this.getReadPayloadOffsetAndAdvance(length); + if (method != null) { + return method.call(this.payload, readPayloadOffset, length); + } else { + return this.payload.slice(readPayloadOffset, readPayloadOffset + length); + } + } + + getReadPayloadOffsetAndAdvance(length: number) { + if (length > this.endIndex - this.readIndex) { + this.readIndex = this.endIndex; + throw new Error('Failed to read data with length of ' + length); + } + const readPayloadOffset = this.payloadOffset + this.readIndex; + this.advance(length); + return readPayloadOffset; + } + + advance(size: number) { + const alignedSize = alignInt(size, SIZE_UINT32); + if (this.endIndex - this.readIndex < alignedSize) { + this.readIndex = this.endIndex; + } else { + this.readIndex += alignedSize; + } + } +} + +// This class provides facilities for basic binary value packing and unpacking. +// +// The Pickle class supports appending primitive values (ints, strings, etc.) +// to a pickle instance. The Pickle instance grows its internal memory buffer +// dynamically to hold the sequence of primitive values. The internal memory +// buffer is exposed as the "data" of the Pickle. This "data" can be passed +// to a Pickle object to initialize it for reading. +// +// When reading from a Pickle object, it is important for the consumer to know +// what value types to read and in what order to read them as the Pickle does +// not keep track of the type of data written to it. +// +// The Pickle's data has a header which contains the size of the Pickle's +// payload. It can optionally support additional space in the header. That +// space is controlled by the header_size parameter passed to the Pickle +// constructor. +export class Pickle { + private header: Buffer; + private headerSize: number; + private capacityAfterHeader: number; + private writeOffset: number; + + private constructor(buffer?: Buffer) { + if (buffer) { + this.header = buffer; + this.headerSize = buffer.length - this.getPayloadSize(); + this.capacityAfterHeader = CAPACITY_READ_ONLY; + this.writeOffset = 0; + if (this.headerSize > buffer.length) { + this.headerSize = 0; + } + if (this.headerSize !== alignInt(this.headerSize, SIZE_UINT32)) { + this.headerSize = 0; + } + if (this.headerSize === 0) { + this.header = Buffer.alloc(0); + } + } else { + this.header = Buffer.alloc(0); + this.headerSize = SIZE_UINT32; + this.capacityAfterHeader = 0; + this.writeOffset = 0; + this.resize(PAYLOAD_UNIT); + this.setPayloadSize(0); + } + } + + static createEmpty() { + return new Pickle(); + } + + static createFromBuffer(buffer: Buffer) { + return new Pickle(buffer); + } + + getHeader() { + return this.header; + } + + getHeaderSize() { + return this.headerSize; + } + + createIterator() { + return new PickleIterator(this); + } + + toBuffer() { + return this.header.slice(0, this.headerSize + this.getPayloadSize()); + } + + writeBool(value: boolean) { + return this.writeInt(value ? 1 : 0); + } + + writeInt(value: number) { + return this.writeBytes(value, SIZE_INT32, Buffer.prototype.writeInt32LE); + } + + writeUInt32(value: number) { + return this.writeBytes(value, SIZE_UINT32, Buffer.prototype.writeUInt32LE); + } + + writeInt64(value: number) { + return this.writeBytes(BigInt(value), SIZE_INT64, Buffer.prototype.writeBigInt64LE); + } + + writeUInt64(value: number) { + return this.writeBytes(BigInt(value), SIZE_UINT64, Buffer.prototype.writeBigUInt64LE); + } + + writeFloat(value: number) { + return this.writeBytes(value, SIZE_FLOAT, Buffer.prototype.writeFloatLE); + } + + writeDouble(value: number) { + return this.writeBytes(value, SIZE_DOUBLE, Buffer.prototype.writeDoubleLE); + } + + writeString(value: string) { + const length = Buffer.byteLength(value, 'utf8'); + if (!this.writeInt(length)) { + return false; + } + return this.writeBytes(value, length); + } + + setPayloadSize(payloadSize: number) { + return this.header.writeUInt32LE(payloadSize, 0); + } + + getPayloadSize() { + return this.header.readUInt32LE(0); + } + + writeBytes(data: string, length: number, method?: undefined): boolean; + writeBytes(data: number | BigInt, length: number, method: Function): boolean; + writeBytes(data: string | number | BigInt, length: number, method?: Function): boolean { + const dataLength = alignInt(length, SIZE_UINT32); + const newSize = this.writeOffset + dataLength; + if (newSize > this.capacityAfterHeader) { + this.resize(Math.max(this.capacityAfterHeader * 2, newSize)); + } + if (method) { + method.call(this.header, data, this.headerSize + this.writeOffset); + } else { + this.header.write(data as string, this.headerSize + this.writeOffset, length); + } + const endOffset = this.headerSize + this.writeOffset + length; + this.header.fill(0, endOffset, endOffset + dataLength - length); + this.setPayloadSize(newSize); + this.writeOffset = newSize; + return true; + } + + resize(newCapacity: number) { + newCapacity = alignInt(newCapacity, PAYLOAD_UNIT); + this.header = Buffer.concat([this.header, Buffer.alloc(newCapacity)]); + this.capacityAfterHeader = newCapacity; + } +} diff --git a/src/wrapped-fs.ts b/src/wrapped-fs.ts new file mode 100644 index 0000000..95c4ef7 --- /dev/null +++ b/src/wrapped-fs.ts @@ -0,0 +1,28 @@ +const fs = 'electron' in process.versions ? require('original-fs') : require('fs'); + +const promisifiedMethods = ['lstat', 'mkdtemp', 'readFile', 'stat', 'writeFile']; + +type AsarFS = typeof import('fs') & { + mkdirp(dir: string): Promise; + mkdirpSync(dir: string): void; + lstat: (typeof import('fs'))['promises']['lstat']; + mkdtemp: (typeof import('fs'))['promises']['mkdtemp']; + readFile: (typeof import('fs'))['promises']['readFile']; + stat: (typeof import('fs'))['promises']['stat']; + writeFile: (typeof import('fs'))['promises']['writeFile']; +}; + +const promisified: AsarFS = {} as any; + +for (const method of Object.keys(fs)) { + if (promisifiedMethods.includes(method)) { + (promisified as any)[method] = fs.promises[method]; + } else { + (promisified as any)[method] = fs[method]; + } +} +// To make it more like fs-extra +promisified.mkdirp = (dir) => fs.promises.mkdir(dir, { recursive: true }); +promisified.mkdirpSync = (dir) => fs.mkdirSync(dir, { recursive: true }); + +export default promisified; diff --git a/test/api-spec.js b/test/api-spec.js index 2239d1a..9b227b2 100644 --- a/test/api-spec.js +++ b/test/api-spec.js @@ -1,110 +1,158 @@ -'use strict' +'use strict'; -const assert = require('assert') -const fs = require('../lib/wrapped-fs') -const os = require('os') -const path = require('path') -const rimraf = require('rimraf') +const assert = require('assert'); +const fs = require('../lib/wrapped-fs').default; +const os = require('os'); +const path = require('path'); +const rimraf = require('rimraf'); -const asar = require('..') -const compDirs = require('./util/compareDirectories') -const compFileLists = require('./util/compareFileLists') -const compFiles = require('./util/compareFiles') -const transform = require('./util/transformStream') +const asar = require('..'); +const compDirs = require('./util/compareDirectories'); +const compFileLists = require('./util/compareFileLists'); +const compFiles = require('./util/compareFiles'); +const transform = require('./util/transformStream'); -async function assertPackageListEquals (actualList, expectedFilename) { - const expected = await fs.readFile(expectedFilename, 'utf8') - return compFileLists(actualList.join('\n'), expected) +async function assertPackageListEquals(actualList, expectedFilename) { + const expected = await fs.readFile(expectedFilename, 'utf8'); + return compFileLists(actualList.join('\n'), expected); } describe('api', function () { - beforeEach(() => { rimraf.sync(path.join(__dirname, '..', 'tmp'), fs) }) + beforeEach(() => { + rimraf.sync(path.join(__dirname, '..', 'tmp'), fs); + }); it('should create archive from directory', async () => { - await asar.createPackage('test/input/packthis/', 'tmp/packthis-api.asar') - return compFiles('tmp/packthis-api.asar', 'test/expected/packthis.asar') - }) + await asar.createPackage('test/input/packthis/', 'tmp/packthis-api.asar'); + return compFiles('tmp/packthis-api.asar', 'test/expected/packthis.asar'); + }); if (os.platform() === 'win32') { it('should create archive with windows-style path separators', async () => { - await asar.createPackage('test\\input\\packthis\\', 'tmp\\packthis-api.asar') - return compFiles('tmp/packthis-api.asar', 'test/expected/packthis.asar') - }) + await asar.createPackage('test\\input\\packthis\\', 'tmp\\packthis-api.asar'); + return compFiles('tmp/packthis-api.asar', 'test/expected/packthis.asar'); + }); } it('should create archive from directory (without hidden files)', async () => { - await asar.createPackageWithOptions('test/input/packthis/', 'tmp/packthis-without-hidden-api.asar', { dot: false }) - return compFiles('tmp/packthis-without-hidden-api.asar', 'test/expected/packthis-without-hidden.asar') - }) + await asar.createPackageWithOptions( + 'test/input/packthis/', + 'tmp/packthis-without-hidden-api.asar', + { dot: false }, + ); + return compFiles( + 'tmp/packthis-without-hidden-api.asar', + 'test/expected/packthis-without-hidden.asar', + ); + }); it('should create archive from directory (with transformed files)', async () => { - await asar.createPackageWithOptions('test/input/packthis/', 'tmp/packthis-api-transformed.asar', { transform }) - return compFiles('tmp/packthis-api-transformed.asar', 'test/expected/packthis-transformed.asar') - }) + await asar.createPackageWithOptions( + 'test/input/packthis/', + 'tmp/packthis-api-transformed.asar', + { transform }, + ); + return compFiles( + 'tmp/packthis-api-transformed.asar', + 'test/expected/packthis-transformed.asar', + ); + }); it('should create archive from directory (with nothing packed)', async () => { - await asar.createPackageWithOptions('test/input/packthis/', 'tmp/packthis-api-unpacked.asar', { unpackDir: '**' }) - await compFiles('tmp/packthis-api-unpacked.asar', 'test/expected/packthis-all-unpacked.asar') - return compDirs('tmp/packthis-api-unpacked.asar.unpacked', 'test/expected/extractthis') - }) + await asar.createPackageWithOptions('test/input/packthis/', 'tmp/packthis-api-unpacked.asar', { + unpackDir: '**', + }); + await compFiles('tmp/packthis-api-unpacked.asar', 'test/expected/packthis-all-unpacked.asar'); + return compDirs('tmp/packthis-api-unpacked.asar.unpacked', 'test/expected/extractthis'); + }); it('should list files/dirs in archive', async () => { - return assertPackageListEquals(asar.listPackage('test/input/extractthis.asar'), 'test/expected/extractthis-filelist.txt') - }) + return assertPackageListEquals( + asar.listPackage('test/input/extractthis.asar'), + 'test/expected/extractthis-filelist.txt', + ); + }); it('should list files/dirs in archive with option', async () => { - return assertPackageListEquals(asar.listPackage('test/input/extractthis-unpack-dir.asar', { isPack: true }), 'test/expected/extractthis-filelist-with-option.txt') - }) + return assertPackageListEquals( + asar.listPackage('test/input/extractthis-unpack-dir.asar', { isPack: true }), + 'test/expected/extractthis-filelist-with-option.txt', + ); + }); it('should extract a text file from archive', async () => { - const actual = asar.extractFile('test/input/extractthis.asar', 'dir1/file1.txt').toString('utf8') - const expected = await fs.readFile('test/expected/extractthis/dir1/file1.txt', 'utf8') - return compFileLists(actual, expected) - }) + const actual = asar + .extractFile('test/input/extractthis.asar', 'dir1/file1.txt') + .toString('utf8'); + const expected = await fs.readFile('test/expected/extractthis/dir1/file1.txt', 'utf8'); + return compFileLists(actual, expected); + }); it('should extract a binary file from archive', async () => { - const actual = asar.extractFile('test/input/extractthis.asar', 'dir2/file2.png') - const expected = await fs.readFile('test/expected/extractthis/dir2/file2.png') - return assert.strictEqual(actual.toString(), expected.toString()) - }) + const actual = asar.extractFile('test/input/extractthis.asar', 'dir2/file2.png'); + const expected = await fs.readFile('test/expected/extractthis/dir2/file2.png'); + return assert.strictEqual(actual.toString(), expected.toString()); + }); it('should extract a binary file from archive with unpacked files', async () => { - const actual = asar.extractFile('test/input/extractthis-unpack.asar', 'dir2/file2.png') - const expected = await fs.readFile('test/expected/extractthis/dir2/file2.png') - return assert.strictEqual(actual.toString(), expected.toString()) - }) + const actual = asar.extractFile('test/input/extractthis-unpack.asar', 'dir2/file2.png'); + const expected = await fs.readFile('test/expected/extractthis/dir2/file2.png'); + return assert.strictEqual(actual.toString(), expected.toString()); + }); it('should extract an archive', async () => { - asar.extractAll('test/input/extractthis.asar', 'tmp/extractthis-api/') - return compDirs('tmp/extractthis-api/', 'test/expected/extractthis') - }) + asar.extractAll('test/input/extractthis.asar', 'tmp/extractthis-api/'); + return compDirs('tmp/extractthis-api/', 'test/expected/extractthis'); + }); it('should extract an archive with unpacked files', async () => { - asar.extractAll('test/input/extractthis-unpack.asar', 'tmp/extractthis-unpack-api/') - return compDirs('tmp/extractthis-unpack-api/', 'test/expected/extractthis') - }) + asar.extractAll('test/input/extractthis-unpack.asar', 'tmp/extractthis-unpack-api/'); + return compDirs('tmp/extractthis-unpack-api/', 'test/expected/extractthis'); + }); it('should extract a binary file from archive with unpacked files', async () => { - const actual = asar.extractFile('test/input/extractthis-unpack-dir.asar', 'dir1/file1.txt') - const expected = await fs.readFile('test/expected/extractthis/dir1/file1.txt') - assert.strictEqual(actual.toString(), expected.toString()) - }) + const actual = asar.extractFile('test/input/extractthis-unpack-dir.asar', 'dir1/file1.txt'); + const expected = await fs.readFile('test/expected/extractthis/dir1/file1.txt'); + assert.strictEqual(actual.toString(), expected.toString()); + }); it('should extract an archive with unpacked dirs', async () => { - asar.extractAll('test/input/extractthis-unpack-dir.asar', 'tmp/extractthis-unpack-dir-api/') - return compDirs('tmp/extractthis-unpack-dir-api/', 'test/expected/extractthis') - }) + asar.extractAll('test/input/extractthis-unpack-dir.asar', 'tmp/extractthis-unpack-dir-api/'); + return compDirs('tmp/extractthis-unpack-dir-api/', 'test/expected/extractthis'); + }); it('should extract an archive with symlink', async () => { - await asar.createPackageWithOptions('test/input/packthis-with-symlink/', 'tmp/packthis-with-symlink.asar', { dot: false }) - asar.extractAll('tmp/packthis-with-symlink.asar', 'tmp/packthis-with-symlink/') - return compFiles('tmp/packthis-with-symlink/real.txt', 'test/input/packthis-with-symlink/real.txt') - }) + await asar.createPackageWithOptions( + 'test/input/packthis-with-symlink/', + 'tmp/packthis-with-symlink.asar', + { dot: false }, + ); + asar.extractAll('tmp/packthis-with-symlink.asar', 'tmp/packthis-with-symlink/'); + return compFiles( + 'tmp/packthis-with-symlink/real.txt', + 'test/input/packthis-with-symlink/real.txt', + ); + }); it('should handle multibyte characters in paths', async () => { - await asar.createPackageWithOptions('test/input/packthis-unicode-path/', 'tmp/packthis-unicode-path.asar', { - globOptions: { - nosort: true - } - }) - return compFiles('tmp/packthis-unicode-path.asar', 'test/expected/packthis-unicode-path.asar') - }) + await asar.createPackageWithOptions( + 'test/input/packthis-unicode-path/', + 'tmp/packthis-unicode-path.asar', + { + globOptions: { + nosort: true, + }, + }, + ); + return compFiles('tmp/packthis-unicode-path.asar', 'test/expected/packthis-unicode-path.asar'); + }); it('should extract a text file from archive with multibyte characters in path', async () => { - const actual = asar.extractFile('test/expected/packthis-unicode-path.asar', 'dir1/女の子.txt').toString('utf8') - const expected = await fs.readFile('test/input/packthis-unicode-path/dir1/女の子.txt', 'utf8') - return compFileLists(actual, expected) - }) + const actual = asar + .extractFile('test/expected/packthis-unicode-path.asar', 'dir1/女の子.txt') + .toString('utf8'); + const expected = await fs.readFile('test/input/packthis-unicode-path/dir1/女の子.txt', 'utf8'); + return compFileLists(actual, expected); + }); it('should create files/directories whose names are properties of Object.prototype', async () => { - await asar.createPackage('test/input/packthis-object-prototype/', 'tmp/packthis-object-prototype.asar') - return compFiles('tmp/packthis-object-prototype.asar', 'test/expected/packthis-object-prototype.asar') - }) + await asar.createPackage( + 'test/input/packthis-object-prototype/', + 'tmp/packthis-object-prototype.asar', + ); + return compFiles( + 'tmp/packthis-object-prototype.asar', + 'test/expected/packthis-object-prototype.asar', + ); + }); it('should extract files/directories whose names are properties of Object.prototype', () => { - asar.extractAll('test/expected/packthis-object-prototype.asar', 'tmp/packthis-object-prototype/') - return compDirs('test/input/packthis-object-prototype/', 'tmp/packthis-object-prototype') - }) -}) + asar.extractAll( + 'test/expected/packthis-object-prototype.asar', + 'tmp/packthis-object-prototype/', + ); + return compDirs('test/input/packthis-object-prototype/', 'tmp/packthis-object-prototype'); + }); +}); diff --git a/test/cli-spec.js b/test/cli-spec.js index 44952c5..b91d27a 100644 --- a/test/cli-spec.js +++ b/test/cli-spec.js @@ -1,59 +1,78 @@ -'use strict' +'use strict'; -const assert = require('assert') -const childProcess = require('child_process') -const fs = require('../lib/wrapped-fs') -const os = require('os') -const path = require('path') -const { promisify } = require('util') -const rimraf = require('rimraf') +const assert = require('assert'); +const childProcess = require('child_process'); +const fs = require('../lib/wrapped-fs').default; +const os = require('os'); +const path = require('path'); +const { promisify } = require('util'); +const rimraf = require('rimraf'); -const compDirs = require('./util/compareDirectories') -const compFileLists = require('./util/compareFileLists') -const compFiles = require('./util/compareFiles') +const compDirs = require('./util/compareDirectories'); +const compFileLists = require('./util/compareFileLists'); +const compFiles = require('./util/compareFiles'); -const exec = promisify(childProcess.exec) +const exec = promisify(childProcess.exec); -async function execAsar (args) { - return exec(`node bin/asar ${args}`) +async function execAsar(args) { + return exec(`node bin/asar ${args}`); } -async function assertAsarOutputMatches (args, expectedFilename) { - const [{ stdout }, expectedContents] = await Promise.all([execAsar(args), fs.readFile(expectedFilename, 'utf8')]) - return compFileLists(stdout, `${expectedContents}\n`) +async function assertAsarOutputMatches(args, expectedFilename) { + const [{ stdout }, expectedContents] = await Promise.all([ + execAsar(args), + fs.readFile(expectedFilename, 'utf8'), + ]); + return compFileLists(stdout, `${expectedContents}\n`); } describe('command line interface', function () { - beforeEach(() => { rimraf.sync(path.join(__dirname, '..', 'tmp'), fs) }) + beforeEach(() => { + rimraf.sync(path.join(__dirname, '..', 'tmp'), fs); + }); it('should create archive from directory', async () => { - await execAsar('p test/input/packthis/ tmp/packthis-cli.asar') - await compFiles('tmp/packthis-cli.asar', 'test/expected/packthis.asar') - }) + await execAsar('p test/input/packthis/ tmp/packthis-cli.asar'); + await compFiles('tmp/packthis-cli.asar', 'test/expected/packthis.asar'); + }); if (os.platform() === 'win32') { it('should create archive from directory with windows-style path separators', async () => { - await execAsar('p test\\input\\packthis\\ tmp\\packthis-cli.asar') - await compFiles('tmp/packthis-cli.asar', 'test/expected/packthis.asar') - }) + await execAsar('p test\\input\\packthis\\ tmp\\packthis-cli.asar'); + await compFiles('tmp/packthis-cli.asar', 'test/expected/packthis.asar'); + }); } it('should create archive from directory without hidden files', async () => { - await execAsar('p test/input/packthis/ tmp/packthis-without-hidden-cli.asar --exclude-hidden') - await compFiles('tmp/packthis-without-hidden-cli.asar', 'test/expected/packthis-without-hidden.asar') - }) + await execAsar('p test/input/packthis/ tmp/packthis-without-hidden-cli.asar --exclude-hidden'); + await compFiles( + 'tmp/packthis-without-hidden-cli.asar', + 'test/expected/packthis-without-hidden.asar', + ); + }); it('should create archive from directory with unpacked files', async () => { - await execAsar('p test/input/packthis/ tmp/packthis-unpack-cli.asar --unpack *.png --exclude-hidden') - assert.ok(fs.existsSync('tmp/packthis-unpack-cli.asar.unpacked/dir2/file2.png')) - await compFiles('tmp/packthis-unpack-cli.asar', 'test/expected/packthis-unpack.asar') - }) + await execAsar( + 'p test/input/packthis/ tmp/packthis-unpack-cli.asar --unpack *.png --exclude-hidden', + ); + assert.ok(fs.existsSync('tmp/packthis-unpack-cli.asar.unpacked/dir2/file2.png')); + await compFiles('tmp/packthis-unpack-cli.asar', 'test/expected/packthis-unpack.asar'); + }); it('should list files/dirs in archive', async () => { - return assertAsarOutputMatches('l test/input/extractthis.asar', 'test/expected/extractthis-filelist.txt') - }) + return assertAsarOutputMatches( + 'l test/input/extractthis.asar', + 'test/expected/extractthis-filelist.txt', + ); + }); it('should list files/dirs in archive with unpacked files', async () => { - return assertAsarOutputMatches('l test/input/extractthis-unpack.asar', 'test/expected/extractthis-filelist.txt') - }) + return assertAsarOutputMatches( + 'l test/input/extractthis-unpack.asar', + 'test/expected/extractthis-filelist.txt', + ); + }); it('should list files/dirs with multibyte characters in path', async () => { - return assertAsarOutputMatches('l test/expected/packthis-unicode-path.asar', 'test/expected/packthis-unicode-path-filelist.txt') - }) + return assertAsarOutputMatches( + 'l test/expected/packthis-unicode-path.asar', + 'test/expected/packthis-unicode-path-filelist.txt', + ); + }); // we need a way to set a path to extract to first, otherwise we pollute our project dir // or we fake it by setting our cwd, but I don't like that /* @@ -76,68 +95,92 @@ describe('command line interface', function () { }) */ it('should extract an archive', async () => { - await execAsar('e test/input/extractthis.asar tmp/extractthis-cli/') - return compDirs('tmp/extractthis-cli/', 'test/expected/extractthis') - }) + await execAsar('e test/input/extractthis.asar tmp/extractthis-cli/'); + return compDirs('tmp/extractthis-cli/', 'test/expected/extractthis'); + }); it('should extract an archive with unpacked files', async () => { - await execAsar('e test/input/extractthis-unpack.asar tmp/extractthis-unpack-cli/') - return compDirs('tmp/extractthis-unpack-cli/', 'test/expected/extractthis') - }) - it('should throw an error when trying to extract a file that doesn\'t exist in the archive', async () => { - await assert.rejects(execAsar('ef test/input/extractthis.asar this-file-doesnt-exist.404'), /"(.*?)" was not found in this archive/) - }) + await execAsar('e test/input/extractthis-unpack.asar tmp/extractthis-unpack-cli/'); + return compDirs('tmp/extractthis-unpack-cli/', 'test/expected/extractthis'); + }); + it("should throw an error when trying to extract a file that doesn't exist in the archive", async () => { + await assert.rejects( + execAsar('ef test/input/extractthis.asar this-file-doesnt-exist.404'), + /"(.*?)" was not found in this archive/, + ); + }); it('should create archive from directory with unpacked dirs', async () => { - await execAsar('p test/input/packthis/ tmp/packthis-unpack-dir-cli.asar --unpack-dir dir2 --exclude-hidden') - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file2.png')) - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file3.txt')) - return compFiles('tmp/packthis-unpack-dir-cli.asar', 'test/expected/packthis-unpack-dir.asar') - }) + await execAsar( + 'p test/input/packthis/ tmp/packthis-unpack-dir-cli.asar --unpack-dir dir2 --exclude-hidden', + ); + assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file2.png')); + assert.ok(fs.existsSync('tmp/packthis-unpack-dir-cli.asar.unpacked/dir2/file3.txt')); + return compFiles('tmp/packthis-unpack-dir-cli.asar', 'test/expected/packthis-unpack-dir.asar'); + }); it('should create archive from directory with unpacked dirs specified by glob pattern', async () => { - const tmpFile = 'tmp/packthis-unpack-dir-glob-cli.asar' - const tmpUnpacked = 'tmp/packthis-unpack-dir-glob-cli.asar.unpacked' - await execAsar(`p test/input/packthis-glob/ ${tmpFile} --unpack-dir "{x1,x2}" --exclude-hidden`) - assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')) - assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')) - return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-glob.asar') - }) + const tmpFile = 'tmp/packthis-unpack-dir-glob-cli.asar'; + const tmpUnpacked = 'tmp/packthis-unpack-dir-glob-cli.asar.unpacked'; + await execAsar( + `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "{x1,x2}" --exclude-hidden`, + ); + assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')); + assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')); + return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-glob.asar'); + }); it('should create archive from directory with unpacked dirs specified by globstar pattern', async () => { - const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar' - const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked' - await execAsar(`p test/input/packthis-glob/ ${tmpFile} --unpack-dir "**/{x1,x2}" --exclude-hidden`) - assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')) - assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')) - assert.ok(fs.existsSync(tmpUnpacked + '/y3/x1/file4.txt')) - assert.ok(fs.existsSync(tmpUnpacked + '/y3/z1/x2/file5.txt')) - return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-globstar.asar') - }) + const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar'; + const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked'; + await execAsar( + `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "**/{x1,x2}" --exclude-hidden`, + ); + assert.ok(fs.existsSync(tmpUnpacked + '/x1/file1.txt')); + assert.ok(fs.existsSync(tmpUnpacked + '/x2/file2.txt')); + assert.ok(fs.existsSync(tmpUnpacked + '/y3/x1/file4.txt')); + assert.ok(fs.existsSync(tmpUnpacked + '/y3/z1/x2/file5.txt')); + return compFiles(tmpFile, 'test/expected/packthis-unpack-dir-globstar.asar'); + }); it('should create archive from directory with unpacked dirs specified by foo/{bar,baz} style pattern', async () => { - const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar' - const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked' - await execAsar(`p test/input/packthis-glob/ ${tmpFile} --unpack-dir "y3/{x1,z1}" --exclude-hidden`) - assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/x1/file4.txt'))) - assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/z1/x2/file5.txt'))) - }) + const tmpFile = 'tmp/packthis-unpack-dir-globstar-cli.asar'; + const tmpUnpacked = 'tmp/packthis-unpack-dir-globstar-cli.asar.unpacked'; + await execAsar( + `p test/input/packthis-glob/ ${tmpFile} --unpack-dir "y3/{x1,z1}" --exclude-hidden`, + ); + assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/x1/file4.txt'))); + assert.ok(fs.existsSync(path.join(tmpUnpacked, 'y3/z1/x2/file5.txt'))); + }); it('should list files/dirs in archive with unpacked dirs', async () => { - return assertAsarOutputMatches('l test/expected/packthis-unpack-dir.asar', 'test/expected/extractthis-filelist.txt') - }) + return assertAsarOutputMatches( + 'l test/expected/packthis-unpack-dir.asar', + 'test/expected/extractthis-filelist.txt', + ); + }); it('should list files/dirs in archive with unpacked dirs & is-pack option', async () => { - return assertAsarOutputMatches('l --is-pack test/expected/packthis-unpack-dir.asar', 'test/expected/extractthis-filelist-with-option.txt') - }) + return assertAsarOutputMatches( + 'l --is-pack test/expected/packthis-unpack-dir.asar', + 'test/expected/extractthis-filelist-with-option.txt', + ); + }); it('should extract an archive with unpacked dirs', async () => { - await execAsar('e test/input/extractthis-unpack-dir.asar tmp/extractthis-unpack-dir/') - return compDirs('tmp/extractthis-unpack-dir/', 'test/expected/extractthis') - }) + await execAsar('e test/input/extractthis-unpack-dir.asar tmp/extractthis-unpack-dir/'); + return compDirs('tmp/extractthis-unpack-dir/', 'test/expected/extractthis'); + }); it('should create archive from directory with unpacked dirs and files', async () => { - await execAsar('p test/input/packthis/ tmp/packthis-unpack-dir-file-cli.asar --unpack *.png --unpack-dir dir2 --exclude-hidden') - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file2.png')) - assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file3.txt')) - return compFiles('tmp/packthis-unpack-dir-file-cli.asar', 'test/expected/packthis-unpack-dir.asar') - }) + await execAsar( + 'p test/input/packthis/ tmp/packthis-unpack-dir-file-cli.asar --unpack *.png --unpack-dir dir2 --exclude-hidden', + ); + assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file2.png')); + assert.ok(fs.existsSync('tmp/packthis-unpack-dir-file-cli.asar.unpacked/dir2/file3.txt')); + return compFiles( + 'tmp/packthis-unpack-dir-file-cli.asar', + 'test/expected/packthis-unpack-dir.asar', + ); + }); it('should create archive from directory with unpacked subdirs and files', async () => { - await execAsar('p test/input/packthis-subdir/ tmp/packthis-unpack-subdir-cli.asar --unpack *.txt --unpack-dir dir2/subdir --exclude-hidden') - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/file0.txt')) - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir1/file1.txt')) - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file2.png')) - assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file3.txt')) - }) -}) + await execAsar( + 'p test/input/packthis-subdir/ tmp/packthis-unpack-subdir-cli.asar --unpack *.txt --unpack-dir dir2/subdir --exclude-hidden', + ); + assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/file0.txt')); + assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir1/file1.txt')); + assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file2.png')); + assert.ok(fs.existsSync('tmp/packthis-unpack-subdir-cli.asar.unpacked/dir2/subdir/file3.txt')); + }); +}); diff --git a/test/filesystem-spec.js b/test/filesystem-spec.js index 8ac357d..cb33cf5 100644 --- a/test/filesystem-spec.js +++ b/test/filesystem-spec.js @@ -1,14 +1,16 @@ -'use strict' +'use strict'; -const assert = require('assert') -const fs = require('../lib/wrapped-fs') -const path = require('path') -const rimraf = require('rimraf') +const assert = require('assert'); +const fs = require('../lib/wrapped-fs').default; +const path = require('path'); +const rimraf = require('rimraf'); -const Filesystem = require('../lib/filesystem') +const Filesystem = require('../lib/filesystem').Filesystem; describe('filesystem', function () { - beforeEach(() => { rimraf.sync(path.join(__dirname, '..', 'tmp'), fs) }) + beforeEach(() => { + rimraf.sync(path.join(__dirname, '..', 'tmp'), fs); + }); it('should does not throw an error when the src path includes a symbol link', async () => { /** @@ -21,21 +23,21 @@ describe('filesystem', function () { * │ └── file.txt * └── var -> private/var */ - const tmpPath = path.join(__dirname, '..', 'tmp') - const privateVarPath = path.join(tmpPath, 'private', 'var') - const varPath = path.join(tmpPath, 'var') - fs.mkdirSync(privateVarPath, { recursive: true }) - fs.symlinkSync(path.relative(tmpPath, privateVarPath), varPath) + const tmpPath = path.join(__dirname, '..', 'tmp'); + const privateVarPath = path.join(tmpPath, 'private', 'var'); + const varPath = path.join(tmpPath, 'var'); + fs.mkdirSync(privateVarPath, { recursive: true }); + fs.symlinkSync(path.relative(tmpPath, privateVarPath), varPath); - const originFilePath = path.join(varPath, 'file.txt') - fs.writeFileSync(originFilePath, 'hello world') - const appPath = path.join(varPath, 'app') - fs.mkdirpSync(appPath) - fs.symlinkSync('../file.txt', path.join(appPath, 'file.txt')) + const originFilePath = path.join(varPath, 'file.txt'); + fs.writeFileSync(originFilePath, 'hello world'); + const appPath = path.join(varPath, 'app'); + fs.mkdirpSync(appPath); + fs.symlinkSync('../file.txt', path.join(appPath, 'file.txt')); - const filesystem = new Filesystem(varPath) + const filesystem = new Filesystem(varPath); assert.doesNotThrow(() => { - filesystem.insertLink(path.join(appPath, 'file.txt')) - }) - }) -}) + filesystem.insertLink(path.join(appPath, 'file.txt')); + }); + }); +}); diff --git a/test/index.test-d.ts b/test/index.test-d.ts index 504d05b..6646534 100644 --- a/test/index.test-d.ts +++ b/test/index.test-d.ts @@ -1,6 +1,6 @@ import * as asar from '..'; import * as fs from 'fs'; -import * as crypto from 'crypto' +import * as crypto from 'crypto'; import { expectType } from 'tsd'; await asar.createPackage('bin', 'tmp/foo.asar'); @@ -11,9 +11,12 @@ await asar.createPackageWithOptions('bin', 'tmp/foo.asar', { }, transform: (filePath: string) => { if (process.env.TRANSFORM_ASAR) { - return crypto.createCipheriv('aes-256-cbc', crypto.randomBytes(32), crypto.randomBytes(16)).setAutoPadding(true).setEncoding('base64') + return crypto + .createCipheriv('aes-256-cbc', crypto.randomBytes(32), crypto.randomBytes(16)) + .setAutoPadding(true) + .setEncoding('base64'); } - } + }, }); await asar.createPackageFromFiles('bin', 'tmp/foo.asar', ['bin/asar.js']); const stat = fs.statSync('bin/asar.js'); diff --git a/test/pickle-spec.js b/test/pickle-spec.js index 4696564..2bf1f04 100644 --- a/test/pickle-spec.js +++ b/test/pickle-spec.js @@ -1,12 +1,12 @@ -const assert = require('assert') -const Pickle = require('../lib/pickle') +const assert = require('assert'); +const { Pickle } = require('../lib/pickle'); describe('Pickle', function () { it('supports multi-byte characters', function () { - const write = Pickle.createEmpty() - write.writeString('女の子.txt') + const write = Pickle.createEmpty(); + write.writeString('女の子.txt'); - const read = Pickle.createFromBuffer(write.toBuffer()) - assert.strictEqual(read.createIterator().readString(), '女の子.txt') - }) -}) + const read = Pickle.createFromBuffer(write.toBuffer()); + assert.strictEqual(read.createIterator().readString(), '女の子.txt'); + }); +}); diff --git a/test/util/compareDirectories.js b/test/util/compareDirectories.js index 19a98ed..84fa170 100644 --- a/test/util/compareDirectories.js +++ b/test/util/compareDirectories.js @@ -1,49 +1,60 @@ -'use strict' +'use strict'; -const _ = require('lodash') -const fs = require('../../lib/wrapped-fs') -const path = require('path') -const crawlFilesystem = require('../../lib/crawlfs') +const _ = require('lodash'); +const fs = require('../../lib/wrapped-fs').default; +const path = require('path'); +const crawlFilesystem = require('../../lib/crawlfs').crawl; module.exports = async function (dirA, dirB) { - const [[pathsA, metadataA], [pathsB, metadataB]] = await Promise.all([crawlFilesystem(dirA, null), crawlFilesystem(dirB, null)]) - const relativeA = _.map(pathsA, pathAItem => path.relative(dirA, pathAItem)) - const relativeB = _.map(pathsB, pathBItem => path.relative(dirB, pathBItem)) - const onlyInA = _.difference(relativeA, relativeB) - const onlyInB = _.difference(relativeB, relativeA) - const inBoth = _.intersection(pathsA, pathsB) - const differentFiles = [] - const errorMsgBuilder = [] + const [[pathsA, metadataA], [pathsB, metadataB]] = await Promise.all([ + crawlFilesystem(dirA, null), + crawlFilesystem(dirB, null), + ]); + const relativeA = _.map(pathsA, (pathAItem) => path.relative(dirA, pathAItem)); + const relativeB = _.map(pathsB, (pathBItem) => path.relative(dirB, pathBItem)); + const onlyInA = _.difference(relativeA, relativeB); + const onlyInB = _.difference(relativeB, relativeA); + const inBoth = _.intersection(pathsA, pathsB); + const differentFiles = []; + const errorMsgBuilder = []; for (const filename of inBoth) { - const typeA = metadataA[filename].type - const typeB = metadataB[filename].type + const typeA = metadataA[filename].type; + const typeB = metadataB[filename].type; // skip if both are directories if (typeA === 'directory' && typeB === 'directory') { - continue + continue; } // something is wrong if the types don't match up if (typeA !== typeB) { - differentFiles.push(filename) - continue + differentFiles.push(filename); + continue; } - const [fileContentA, fileContentB] = Promise.all([dirA, dirB].map(dir => fs.readFile(path.join(dir, filename), 'utf8'))) + const [fileContentA, fileContentB] = Promise.all( + [dirA, dirB].map((dir) => fs.readFile(path.join(dir, filename), 'utf8')), + ); if (fileContentA !== fileContentB) { - differentFiles.push(filename) + differentFiles.push(filename); } } if (onlyInA.length) { - errorMsgBuilder.push(`\tEntries only in '${dirA}':`) - for (const file of onlyInA) { errorMsgBuilder.push(`\t ${file}`) } + errorMsgBuilder.push(`\tEntries only in '${dirA}':`); + for (const file of onlyInA) { + errorMsgBuilder.push(`\t ${file}`); + } } if (onlyInB.length) { - errorMsgBuilder.push(`\tEntries only in '${dirB}':`) - for (const file of onlyInB) { errorMsgBuilder.push(`\t ${file}`) } + errorMsgBuilder.push(`\tEntries only in '${dirB}':`); + for (const file of onlyInB) { + errorMsgBuilder.push(`\t ${file}`); + } } if (differentFiles.length) { - errorMsgBuilder.push('\tDifferent file content:') - for (const file of differentFiles) { errorMsgBuilder.push(`\t ${file}`) } + errorMsgBuilder.push('\tDifferent file content:'); + for (const file of differentFiles) { + errorMsgBuilder.push(`\t ${file}`); + } } if (errorMsgBuilder.length) { - throw new Error('\n' + errorMsgBuilder.join('\n')) + throw new Error('\n' + errorMsgBuilder.join('\n')); } -} +}; diff --git a/test/util/compareFileLists.js b/test/util/compareFileLists.js index 7b35ead..95ea654 100644 --- a/test/util/compareFileLists.js +++ b/test/util/compareFileLists.js @@ -1,12 +1,12 @@ -'use strict' +'use strict'; -const assert = require('assert') -const os = require('os') +const assert = require('assert'); +const os = require('os'); -module.exports = function compareFileLists (actual, expected) { +module.exports = function compareFileLists(actual, expected) { // on windows replace slashes with backslashes and crlf with lf if (os.platform() === 'win32') { - expected = expected.replace(/\//g, '\\').replace(/\r\n/g, '\n') + expected = expected.replace(/\//g, '\\').replace(/\r\n/g, '\n'); } - assert.strictEqual(actual, expected) -} + assert.strictEqual(actual, expected); +}; diff --git a/test/util/compareFiles.js b/test/util/compareFiles.js index d80d9aa..82bfb2d 100644 --- a/test/util/compareFiles.js +++ b/test/util/compareFiles.js @@ -1,25 +1,34 @@ -'use strict' +'use strict'; -const assert = require('assert') -const fs = require('../../lib/wrapped-fs') +const assert = require('assert'); +const fs = require('../../lib/wrapped-fs').default; module.exports = async function (actualFilePath, expectedFilePath) { if (process.env.ELECTRON_ASAR_SPEC_UPDATE) { - await fs.writeFile(expectedFilePath, await fs.readFile(actualFilePath)) + await fs.writeFile(expectedFilePath, await fs.readFile(actualFilePath)); } - const [actualFileContent, expectedFileContent] = await Promise.all([fs.readFile(actualFilePath, 'utf8'), fs.readFile(expectedFilePath, 'utf8')]) - assert.strictEqual(actualFileContent, expectedFileContent) + const [actualFileContent, expectedFileContent] = await Promise.all([ + fs.readFile(actualFilePath, 'utf8'), + fs.readFile(expectedFilePath, 'utf8'), + ]); + assert.strictEqual(actualFileContent, expectedFileContent); - const [actualIsSymlink, expectedIsSymlink] = [isSymbolicLinkSync(actualFilePath), isSymbolicLinkSync(expectedFilePath)] - assert.strictEqual(actualIsSymlink, expectedIsSymlink) + const [actualIsSymlink, expectedIsSymlink] = [ + isSymbolicLinkSync(actualFilePath), + isSymbolicLinkSync(expectedFilePath), + ]; + assert.strictEqual(actualIsSymlink, expectedIsSymlink); if (actualIsSymlink && expectedIsSymlink) { - const [actualSymlinkPointer, expectedSymlinkPointer] = [fs.readlinkSync(actualFilePath), fs.readlinkSync(expectedFilePath)] - assert.strictEqual(actualSymlinkPointer, expectedSymlinkPointer) + const [actualSymlinkPointer, expectedSymlinkPointer] = [ + fs.readlinkSync(actualFilePath), + fs.readlinkSync(expectedFilePath), + ]; + assert.strictEqual(actualSymlinkPointer, expectedSymlinkPointer); } -} +}; -function isSymbolicLinkSync (path) { - const stats = fs.lstatSync(path) - return stats.isSymbolicLink() +function isSymbolicLinkSync(path) { + const stats = fs.lstatSync(path); + return stats.isSymbolicLink(); } diff --git a/test/util/transformStream.js b/test/util/transformStream.js index f125b19..03896a2 100644 --- a/test/util/transformStream.js +++ b/test/util/transformStream.js @@ -1,27 +1,27 @@ -'use strict' -const Transform = require('stream').Transform -const basename = require('path').basename +'use strict'; +const Transform = require('stream').Transform; +const basename = require('path').basename; class Reverser extends Transform { - constructor () { - super() - this._data = '' + constructor() { + super(); + this._data = ''; } - _transform (buf, enc, cb) { - this._data += buf - return cb() + _transform(buf, enc, cb) { + this._data += buf; + return cb(); } - _flush (cb) { - const txt = this._data.toString().split('').reverse().join('') - this.push(txt) - return cb() + _flush(cb) { + const txt = this._data.toString().split('').reverse().join(''); + this.push(txt); + return cb(); } } module.exports = function (filename) { if (basename(filename) === 'file0.txt') { - return new Reverser() + return new Reverser(); } -} +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0833e88 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2017", + "lib": [ + "es2017" + ], + "sourceMap": true, + "strict": true, + "outDir": "lib", + "types": [ + "node" + ], + "allowSyntheticDefaultImports": true, + "moduleResolution": "node", + "declaration": true, + "noImplicitAny": true, + "strictNullChecks": true + }, + "include": [ + "src" + ] +} diff --git a/yarn.lock b/yarn.lock index 4af55b3..764c914 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,6 +99,14 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/glob@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -116,6 +124,16 @@ dependencies: "@types/node" "*" +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimatch@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/minimist@^1.2.0": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" @@ -126,6 +144,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== +"@types/node@^12.0.0": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@^16.11.26": version "16.18.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.4.tgz#712ba61b4caf091fc6490301b1888356638c17bd" @@ -2239,6 +2262,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== +prettier@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -2809,6 +2837,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typescript@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" From c9072fbd61be1f18781ef26a00729eabf9c75c26 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 6 Sep 2024 16:08:21 -0700 Subject: [PATCH 2/5] Apply suggestions from code review Co-authored-by: Erik Moura --- src/asar.ts | 10 +++++----- src/wrapped-fs.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/asar.ts b/src/asar.ts index a8735a8..3ab7add 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -53,11 +53,11 @@ export async function createPackageWithOptions(src: string, dest: string, option /** * Create an ASAR archive from a list of filenames. * - * @param {string} src: Base path. All files are relative to this. - * @param {string} dest: Archive filename (& path). - * @param {array} filenames: List of filenames relative to src. - * @param {object} metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) - * @param {object} options: Options passed to `createPackageWithOptions`. + * @param {string} src - Base path. All files are relative to this. + * @param {string} dest - Archive filename (& path). + * @param {array} filenames - List of filenames relative to src. + * @param {object} [metadata] - Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) + * @param {object} [options] - Options passed to `createPackageWithOptions`. */ export async function createPackageFromFiles( src: string, diff --git a/src/wrapped-fs.ts b/src/wrapped-fs.ts index 95c4ef7..a8ed429 100644 --- a/src/wrapped-fs.ts +++ b/src/wrapped-fs.ts @@ -12,7 +12,7 @@ type AsarFS = typeof import('fs') & { writeFile: (typeof import('fs'))['promises']['writeFile']; }; -const promisified: AsarFS = {} as any; +const promisified = {} as AsarFS; for (const method of Object.keys(fs)) { if (promisifiedMethods.includes(method)) { From 7048cd0b417c5597aaa4c508f14f308053dc4a16 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 6 Sep 2024 16:08:34 -0700 Subject: [PATCH 3/5] chore: remove unused imports --- src/asar.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/asar.ts b/src/asar.ts index 3ab7add..f9c8379 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -4,9 +4,8 @@ import * as minimatch from 'minimatch'; import fs from './wrapped-fs'; import { Filesystem, FilesystemEntry } from './filesystem'; import * as disk from './disk'; -import { CrawledFileType, crawl as crawlFilesystem, determineFileType } from './crawlfs'; +import { crawl as crawlFilesystem, determineFileType } from './crawlfs'; import { IOptions } from 'glob'; -import { Stats } from 'fs'; /** * Whether a directory should be excluded from packing due to the `--unpack-dir" option. From b0058da957d6b75a607c372d51caba10bdadf61f Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 6 Sep 2024 16:08:42 -0700 Subject: [PATCH 4/5] chore: update lockfile --- yarn.lock | 1871 +---------------------------------------------------- 1 file changed, 25 insertions(+), 1846 deletions(-) diff --git a/yarn.lock b/yarn.lock index 764c914..9436ac4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,27 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@electron/get@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" @@ -38,27 +17,6 @@ optionalDependencies: global-agent "^3.0.0" -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - "@sindresorhus/is@^4.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" @@ -71,11 +29,6 @@ dependencies: defer-to-connect "^2.0.0" -"@tsd/typescript@~4.9.3": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@tsd/typescript/-/typescript-4.9.3.tgz#87beef743237707b02b88b10056fcf9f58840954" - integrity sha512-iyi45620s9QN62rW90KelRJLG7p15g4NhTezxYCHmE5RY/BI270Sn7E8vWtiLzB+9mQgy71sYXcgyDKjtJamSQ== - "@types/cacheable-request@^6.0.1": version "6.0.3" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" @@ -86,19 +39,6 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/eslint@^7.2.13": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78" - integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - "@types/glob@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -112,11 +52,6 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/json-schema@*": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - "@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" @@ -134,11 +69,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - "@types/node@*": version "18.11.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" @@ -154,11 +84,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.4.tgz#712ba61b4caf091fc6490301b1888356638c17bd" integrity sha512-9qGjJ5GyShZjUfx2ArBIGM+xExdfLvvaCyQR0t6yRXKPcWCVYF/WemtX/uIU3r7FYECXRXkIiw2Vnhn6y8d+pw== -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -178,26 +103,6 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -acorn-jsx@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -ajv@^6.10.0, ajv@^6.10.2: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -208,30 +113,11 @@ ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -247,44 +133,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -315,7 +168,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -350,47 +203,11 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chalk@^2.0.0, chalk@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -399,11 +216,6 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -419,18 +231,6 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -447,13 +247,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -461,11 +254,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -481,27 +269,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg== - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -debug-log@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" - integrity sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA== - debug@4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -509,40 +276,20 @@ debug@4.3.3: dependencies: ms "2.1.2" -debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4.3.4, debug@^4.1.0, debug@^4.1.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.6.9: +debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" @@ -555,17 +302,12 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - defer-to-connect@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -573,18 +315,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -deglob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/deglob/-/deglob-4.0.1.tgz#0685c6383992fd6009be10653a2b1116696fad55" - integrity sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg== - dependencies: - find-root "^1.0.0" - glob "^7.0.5" - ignore "^5.0.0" - pkg-config "^1.1.0" - run-parallel "^1.1.2" - uniq "^1.0.1" - detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -595,35 +325,6 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg== - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - electron-mocha@^11.0.2: version "11.0.2" resolved "https://registry.yarnpkg.com/electron-mocha/-/electron-mocha-11.0.2.tgz#f8fd6c3af539f3c7a9aed4aba29cf12c3f408810" @@ -652,11 +353,6 @@ electron@^22.0.0: "@types/node" "^16.11.26" extract-zip "^2.0.1" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -674,52 +370,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" @@ -735,232 +385,6 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -eslint-config-standard-jsx@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz#314c62a0e6f51f75547f89aade059bec140edfc7" - integrity sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw== - -eslint-config-standard@14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" - integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== - -eslint-formatter-pretty@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz#7a6877c14ffe2672066c853587d89603e97c7708" - integrity sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ== - dependencies: - "@types/eslint" "^7.2.13" - ansi-escapes "^4.2.1" - chalk "^4.1.0" - eslint-rule-docs "^1.1.5" - log-symbols "^4.0.0" - plur "^4.0.0" - string-width "^4.2.0" - supports-hyperlinks "^2.0.0" - -eslint-import-resolver-node@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-module-utils@^2.4.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" - integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== - dependencies: - eslint-utils "^1.4.2" - regexpp "^3.0.0" - -eslint-plugin-import@~2.18.0: - version "2.18.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" - integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== - dependencies: - array-includes "^3.0.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.0" - read-pkg-up "^2.0.0" - resolve "^1.11.0" - -eslint-plugin-node@~10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" - integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== - dependencies: - eslint-plugin-es "^2.0.0" - eslint-utils "^1.4.2" - ignore "^5.1.1" - minimatch "^3.0.4" - resolve "^1.10.1" - semver "^6.1.0" - -eslint-plugin-promise@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== - -eslint-plugin-react@~7.14.2: - version "7.14.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" - integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.1.0" - object.entries "^1.1.0" - object.fromentries "^2.0.0" - object.values "^1.1.0" - prop-types "^15.7.2" - resolve "^1.10.1" - -eslint-plugin-standard@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz#021211a9f077e63a6847e7bb9ab4247327ac8e0c" - integrity sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA== - -eslint-rule-docs@^1.1.5: - version "1.1.235" - resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz#be6ef1fc3525f17b3c859ae2997fedadc89bfb9b" - integrity sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A== - -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.2, eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@~6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -972,39 +396,6 @@ extract-zip@^2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -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" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -1012,20 +403,6 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -1033,11 +410,6 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -find-root@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - find-up@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1046,47 +418,11 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -1120,32 +456,12 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: +get-intrinsic@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== @@ -1154,11 +470,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" -get-stdin@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== - get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -1166,15 +477,7 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1193,7 +496,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: +glob@^7.1.3, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -1217,13 +520,6 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globalthis@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -1231,18 +527,6 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - got@^11.8.5: version "11.8.5" resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" @@ -1260,7 +544,7 @@ got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -1270,21 +554,6 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1297,18 +566,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1321,18 +583,6 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - http-cache-semantics@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -1346,41 +596,6 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.0.0, ignore@^5.1.1, ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1394,51 +609,6 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -irregular-plurals@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" - integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1446,33 +616,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-electron-renderer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2" @@ -1483,106 +626,38 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-yaml@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1590,39 +665,11 @@ js-yaml@4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -1644,14 +691,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsx-ast-utils@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== - dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" - keyv@^4.0.0: version "4.5.2" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" @@ -1659,68 +698,6 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1728,12 +705,12 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: +lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0, log-symbols@^4.0.0: +log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -1741,13 +718,6 @@ log-symbols@4.1.0, log-symbols@^4.0.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -1760,16 +730,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - matcher@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" @@ -1777,42 +737,6 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -1823,11 +747,6 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - minimatch@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" @@ -1849,27 +768,6 @@ minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mocha@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" @@ -1937,16 +835,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nanoid@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -1957,36 +850,6 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -1997,58 +860,11 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2056,49 +872,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -2106,27 +884,6 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -2134,53 +891,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2191,96 +901,26 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ== - dependencies: - pify "^2.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -pkg-config@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" - integrity sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw== - dependencies: - debug-log "^1.0.0" - find-root "^1.0.0" - xtend "^4.0.1" - -plur@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" - integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== - dependencies: - irregular-plurals "^3.2.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2289,21 +929,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -2316,47 +941,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w== - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA== - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2364,33 +948,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -2401,20 +958,6 @@ resolve-alpn@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - responselike@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" @@ -2422,26 +965,6 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -2461,60 +984,22 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.2, run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.1.0, semver@^6.1.2, semver@^6.2.0: +semver@^6.2.0: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4: +semver@^7.3.2: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -2535,116 +1020,11 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -standard-engine@^12.0.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-12.1.0.tgz#b13dbae583de54c06805207b991ef48a582c0e62" - integrity sha512-DVJnWM1CGkag4ucFLGdiYWa5/kJURPONmMmk17p8FT5NE4UnPZB1vxWnXnRo2sPSL78pWJG8xEM+1Tu19z0deg== - dependencies: - deglob "^4.0.1" - get-stdin "^7.0.0" - minimist "^1.2.5" - pkg-conf "^3.1.0" - -standard@^14.3.3: - version "14.3.4" - resolved "https://registry.yarnpkg.com/standard/-/standard-14.3.4.tgz#748e80e8cd7b535844a85a12f337755a7e3a0f6e" - integrity sha512-+lpOkFssMkljJ6eaILmqxHQ2n4csuEABmcubLTb9almFi1ElDzXb1819fjf/5ygSyePCq4kU2wMdb2fBfb9P9Q== - dependencies: - eslint "~6.8.0" - eslint-config-standard "14.1.1" - eslint-config-standard-jsx "8.1.0" - eslint-plugin-import "~2.18.0" - eslint-plugin-node "~10.0.0" - eslint-plugin-promise "~4.2.1" - eslint-plugin-react "~7.14.2" - eslint-plugin-standard "~4.0.0" - standard-engine "^12.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -2654,31 +1034,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2686,19 +1041,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@3.1.1, strip-json-comments@^3.0.1: +strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -2717,60 +1060,13 @@ supports-color@8.1.1: dependencies: has-flag "^4.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2778,85 +1074,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -tsd@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/tsd/-/tsd-0.25.0.tgz#bed2a937ab414e1c5ae1ca687bb44ea3a6f549ba" - integrity sha512-liUlvKtsdr+70XEZP/kkF6U8+Q9URZi4Pw58ih7a9x3kjJblG8rdVgvG62xcvkgRva1q3yWX5qAxfYZuYiC5CA== - dependencies: - "@tsd/typescript" "~4.9.3" - eslint-formatter-pretty "^4.1.0" - globby "^11.0.1" - meow "^9.0.0" - path-exists "^4.0.0" - read-pkg-up "^7.0.0" - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - typescript@^5.5.4: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -2867,37 +1094,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -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" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - which@2.0.2, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2905,18 +1101,13 @@ which@2.0.2, which@^2.0.2: dependencies: isexe "^2.0.0" -which@^1.2.4, which@^1.2.9: +which@^1.2.4: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - workerpool@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" @@ -2941,18 +1132,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - xvfb-maybe@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz#ed8cb132957b7848b439984c66f010ea7f24361b" @@ -2976,7 +1155,7 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^20.2.2, yargs-parser@^20.2.3: +yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== From 12116a72a20ddf55b0718719af3994c9a1d43645 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sat, 7 Sep 2024 01:10:54 -0700 Subject: [PATCH 5/5] clean up --- src/asar.ts | 20 ++++++++++---------- src/disk.ts | 4 ++-- src/filesystem.ts | 2 +- src/integrity.ts | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/asar.ts b/src/asar.ts index f9c8379..08f8052 100644 --- a/src/asar.ts +++ b/src/asar.ts @@ -10,9 +10,9 @@ import { IOptions } from 'glob'; /** * Whether a directory should be excluded from packing due to the `--unpack-dir" option. * - * @param {string} dirPath - directory path to check - * @param {string} pattern - literal prefix [for backward compatibility] or glob pattern - * @param {array} unpackDirs - Array of directory paths previously marked as unpacked + * @param dirPath - directory path to check + * @param pattern - literal prefix [for backward compatibility] or glob pattern + * @param unpackDirs - Array of directory paths previously marked as unpacked */ function isUnpackedDir(dirPath: string, pattern: string, unpackDirs: string[]) { if (dirPath.startsWith(pattern) || minimatch(dirPath, pattern)) { @@ -46,17 +46,17 @@ export async function createPackageWithOptions(src: string, dest: string, option const pattern = src + (options.pattern ? options.pattern : '/**/*'); const [filenames, metadata] = await crawlFilesystem(pattern, globOptions); - return module.exports.createPackageFromFiles(src, dest, filenames, metadata, options); + return createPackageFromFiles(src, dest, filenames, metadata, options); } /** * Create an ASAR archive from a list of filenames. * - * @param {string} src - Base path. All files are relative to this. - * @param {string} dest - Archive filename (& path). - * @param {array} filenames - List of filenames relative to src. - * @param {object} [metadata] - Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) - * @param {object} [options] - Options passed to `createPackageWithOptions`. + * @param src - Base path. All files are relative to this. + * @param dest - Archive filename (& path). + * @param filenames - List of filenames relative to src. + * @param [metadata] - Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional) + * @param [options] - Options passed to `createPackageWithOptions`. */ export async function createPackageFromFiles( src: string, @@ -132,7 +132,7 @@ export async function createPackageFromFiles( } const file = metadata[filename]; - let shouldUnpack; + let shouldUnpack: boolean; switch (file.type) { case 'directory': if (options.unpackDir) { diff --git a/src/disk.ts b/src/disk.ts index 18f34ff..57e2133 100644 --- a/src/disk.ts +++ b/src/disk.ts @@ -82,8 +82,8 @@ export async function writeFilesystem( export function readArchiveHeaderSync(archivePath: string) { const fd = fs.openSync(archivePath, 'r'); - let size; - let headerBuf; + let size: number; + let headerBuf: Buffer; try { const sizeBuf = Buffer.alloc(8); if (fs.readSync(fd, sizeBuf, 0, 8, null) !== 8) { diff --git a/src/filesystem.ts b/src/filesystem.ts index fbc4b66..577beea 100644 --- a/src/filesystem.ts +++ b/src/filesystem.ts @@ -120,7 +120,7 @@ export class Filesystem { return Promise.resolve(); } - let size; + let size: number; const transformed = options.transform && options.transform(p); if (transformed) { diff --git a/src/integrity.ts b/src/integrity.ts index abc0799..089564b 100644 --- a/src/integrity.ts +++ b/src/integrity.ts @@ -31,7 +31,7 @@ export async function getFileIntegrity(path: string): Promise { fs.createReadStream(path), new stream.PassThrough({ decodeStrings: false, - transform(_chunk, encoding, callback) { + transform(_chunk: Buffer, encoding, callback) { fileHash.update(_chunk); function handleChunk(chunk: Buffer) {