Add compiled overlay parsing using AAPT2
This commit is contained in:
parent
a60c36178f
commit
3e7e348e2f
5 changed files with 288 additions and 196 deletions
|
@ -17,8 +17,7 @@
|
|||
"ora": "5.4.1",
|
||||
"tslib": "^1",
|
||||
"unzipit": "^1.3.5",
|
||||
"yaml": "^1.10.2",
|
||||
"zx": "^4.2.0"
|
||||
"yaml": "^1.10.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@oclif/dev-cli": "^1",
|
||||
|
|
268
src/blobs/overlays.ts
Normal file
268
src/blobs/overlays.ts
Normal file
|
@ -0,0 +1,268 @@
|
|||
import * as path from 'path'
|
||||
import { aapt2 } from '../util/aapt2'
|
||||
|
||||
import { exists, listFilesRecursive } from '../util/fs'
|
||||
import { parseLines } from '../util/parse'
|
||||
import { EXT_PARTITIONS } from '../util/partitions'
|
||||
|
||||
const TARGET_PACKAGE_PATTERN = /^\s+A: http:\/\/schemas.android.com\/apk\/res\/android:targetPackage\(0x[a-z0-9]+\)="(.+)" \(Raw: ".*$/m
|
||||
|
||||
// This is terrible, but aapt2 doesn't escape strings properly and some of these
|
||||
// strings contain double quotes, which break our parser.
|
||||
const EXCLUDE_LOCALES = new Set(['ar', 'iw'])
|
||||
|
||||
export type ResValue = number | boolean | string | Array<ResValue>
|
||||
|
||||
export interface ResKey {
|
||||
type: string
|
||||
key: string
|
||||
flags: string | null
|
||||
}
|
||||
|
||||
export type ResValues = Map<string, ResValue>
|
||||
|
||||
export type PartResValues = { [part: string]: ResValues }
|
||||
|
||||
function encodeResKey(key: ResKey) {
|
||||
return `${key.type}/${key.key}${key.flags != null ? `:${key.flags}` : ''}`
|
||||
}
|
||||
|
||||
export function decodeResKey(encoded: string) {
|
||||
let [type, kf] = encoded.split('/')
|
||||
let [key, flags] = kf.split(':')
|
||||
|
||||
return {
|
||||
type: type,
|
||||
key: key,
|
||||
flags: flags != undefined ? flags : null,
|
||||
} as ResKey
|
||||
}
|
||||
|
||||
function toResKey(type: string | null, key: string | null, flags: string | null) {
|
||||
return encodeResKey({
|
||||
type: type!,
|
||||
key: key!,
|
||||
flags: flags!,
|
||||
})
|
||||
}
|
||||
|
||||
function finishArray(
|
||||
values: Map<string, ResValue>,
|
||||
type: string | null,
|
||||
key: string | null,
|
||||
flags: string | null,
|
||||
arrayLines: Array<string> | null,
|
||||
) {
|
||||
if (EXCLUDE_LOCALES.has(flags!)) {
|
||||
return
|
||||
}
|
||||
|
||||
let array = parseAaptJson(arrayLines!.join('\n')) as Array<ResValue>
|
||||
|
||||
// Change to typed array?
|
||||
if (array[0] instanceof String) {
|
||||
type = 'string-array'
|
||||
} else if (typeof array[0] == 'number') {
|
||||
// Float arrays are just <array>, so check for integers
|
||||
if (array.find(v => !Number.isInteger(v)) == undefined) {
|
||||
type = 'integer-array'
|
||||
}
|
||||
}
|
||||
|
||||
values.set(toResKey(type, key, flags), array)
|
||||
}
|
||||
|
||||
function parseAaptJson(value: string) {
|
||||
// Fix backslash escapes
|
||||
value = value.replaceAll(/\\/g, '\\\\')
|
||||
|
||||
// Parse hex arrays
|
||||
value = value.replaceAll(/\b0x[0-9a-f]+\b/g, value => `${parseInt(value.slice(2), 16)}`)
|
||||
|
||||
return JSON.parse(value)
|
||||
}
|
||||
|
||||
function parseRsrcLines(rsrc: string) {
|
||||
// Finished values with encoded res keys
|
||||
let values: ResValues = new Map<string, ResValue>()
|
||||
|
||||
// Current resource state machine
|
||||
let curType: string | null = null
|
||||
let curKey: string | null = null
|
||||
let curFlags: string | null = null
|
||||
let curArray: Array<string> | null = null
|
||||
|
||||
// Parse line-by-line
|
||||
for (let line of parseLines(rsrc)) {
|
||||
// Start resource
|
||||
let resStart = line.match(/^resource 0x[a-z0-9]+ (.+)$/)
|
||||
if (resStart) {
|
||||
// Finish last array?
|
||||
if (curArray != null) {
|
||||
console.log({
|
||||
type: curType,
|
||||
key: curKey,
|
||||
flags: curFlags,
|
||||
curArray: curArray,
|
||||
arrayJson: curArray!.join('\n'),
|
||||
})
|
||||
finishArray(values, curType, curKey, curFlags, curArray)
|
||||
}
|
||||
|
||||
let keyParts = resStart[1]!.split('/')
|
||||
curType = keyParts[0]
|
||||
curKey = keyParts[1]
|
||||
curFlags = null
|
||||
curArray = null
|
||||
continue
|
||||
}
|
||||
|
||||
// New resource is array
|
||||
let arrayLine = line.match(/^\(([a-zA-Z0-9\-_+]*)\) \(array\) size=\d+$/)
|
||||
if (arrayLine) {
|
||||
// Finish last array?
|
||||
if (curArray != null) {
|
||||
console.log({
|
||||
type: curType,
|
||||
key: curKey,
|
||||
flags: curFlags,
|
||||
curArray: curArray,
|
||||
arrayJson: curArray!.join('\n').replaceAll(/\\/g, '\\\\'),
|
||||
})
|
||||
finishArray(values, curType, curKey, curFlags, curArray)
|
||||
}
|
||||
|
||||
// Start new array
|
||||
curFlags = arrayLine[1]
|
||||
curArray = []
|
||||
continue
|
||||
}
|
||||
|
||||
// New value
|
||||
let valueLine = line.match(/^\(([a-zA-Z0-9\-_+]*)\) (.+)$/)
|
||||
if (valueLine) {
|
||||
curFlags = valueLine![1]
|
||||
|
||||
// Exclude broken locales and styles for now
|
||||
if (EXCLUDE_LOCALES.has(curFlags!) || curType == 'style') {
|
||||
continue
|
||||
}
|
||||
|
||||
let value: ResValue
|
||||
let rawValue = valueLine![2]
|
||||
console.log({
|
||||
type: curType,
|
||||
key: curKey,
|
||||
flags: curFlags,
|
||||
rawValue: rawValue,
|
||||
})
|
||||
if (curType == 'dimen') {
|
||||
// Keep dimensions as strings to preserve unit
|
||||
value = rawValue
|
||||
} else if (curType == 'color') {
|
||||
// Hex color code
|
||||
value = parseInt(rawValue.slice(1), 16)
|
||||
} else if (rawValue.startsWith('(file) ')) {
|
||||
// Just return the file path for now
|
||||
value = rawValue.split(' ')[1]
|
||||
} else if (rawValue.startsWith('0x')) {
|
||||
// Hex integer
|
||||
value = parseInt(rawValue.slice(2), 16)
|
||||
} else if (rawValue.startsWith('(styled string) ')) {
|
||||
// Skip styled strings for now
|
||||
continue
|
||||
} else if (curType == 'string') {
|
||||
// Don't rely on quotes for simple strings
|
||||
value = rawValue.slice(1, -1)
|
||||
} else {
|
||||
value = parseAaptJson(rawValue)
|
||||
}
|
||||
|
||||
values.set(toResKey(curType, curKey, curFlags), value)
|
||||
}
|
||||
|
||||
// New type section
|
||||
let typeLine = line.match(/^type .+$/)
|
||||
if (typeLine) {
|
||||
// Just skip this line. Next resource/end will finish the last array, and this
|
||||
// shouldn't be added to the last array.
|
||||
continue
|
||||
}
|
||||
|
||||
// Continuation of array?
|
||||
if (curArray != null) {
|
||||
curArray.push(line)
|
||||
}
|
||||
}
|
||||
|
||||
// Finish remaining array?
|
||||
if (curArray != null) {
|
||||
finishArray(values, curType, curKey, curFlags, curArray)
|
||||
}
|
||||
|
||||
return values
|
||||
}
|
||||
|
||||
async function parseOverlayApksRecursive(
|
||||
aapt2Path: string,
|
||||
overlaysDir: string,
|
||||
pathCallback?: (path: string) => void,
|
||||
) {
|
||||
let values: ResValues = new Map<string, ResValue>()
|
||||
|
||||
for await (let apkPath of listFilesRecursive(overlaysDir)) {
|
||||
if (path.extname(apkPath) != '.apk') {
|
||||
continue
|
||||
}
|
||||
|
||||
if (pathCallback != undefined) {
|
||||
pathCallback(apkPath)
|
||||
}
|
||||
|
||||
// Check the manifest for eligibility first
|
||||
let manifest = await aapt2(aapt2Path, 'dump', 'xmltree', '--file', 'AndroidManifest.xml', apkPath)
|
||||
// Overlays that have categories are user-controlled, so they're not relevant here
|
||||
if (manifest.includes('A: http://schemas.android.com/apk/res/android:category(')) {
|
||||
continue
|
||||
}
|
||||
// Prop-guarded overlays are almost always in AOSP already, so don't bother checking them
|
||||
if (manifest.includes('A: http://schemas.android.com/apk/res/android:requiredSystemPropertyName(')) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Get the target package
|
||||
let match = manifest.match(TARGET_PACKAGE_PATTERN)
|
||||
if (!match) throw new Error(`Overlay ${apkPath} is missing target package`)
|
||||
let targetPkg = match[1]
|
||||
|
||||
// Overlay is eligible, now read the resource table
|
||||
let rsrc = await aapt2(aapt2Path, 'dump', 'resources', apkPath)
|
||||
let apkValues = parseRsrcLines(rsrc)
|
||||
|
||||
// Merge overlayed values
|
||||
for (let [key, value] of apkValues) {
|
||||
values.set(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
return values
|
||||
}
|
||||
|
||||
export async function parsePartOverlayApks(
|
||||
aapt2Path: string,
|
||||
root: string,
|
||||
pathCallback?: (path: string) => void,
|
||||
) {
|
||||
let partValues: PartResValues = {}
|
||||
|
||||
for (let partition of EXT_PARTITIONS) {
|
||||
let src = `${root}/${partition}/overlay`
|
||||
if (!(await exists(src))) {
|
||||
continue
|
||||
}
|
||||
|
||||
partValues[partition] = await parseOverlayApksRecursive(aapt2Path, src, pathCallback)
|
||||
}
|
||||
|
||||
return partValues
|
||||
}
|
|
@ -1,8 +1,16 @@
|
|||
import { $ } from 'zx'
|
||||
import * as util from 'util'
|
||||
import { exec as execCb } from 'child_process'
|
||||
|
||||
$.verbose = false
|
||||
const exec = util.promisify(execCb)
|
||||
|
||||
export async function aapt2(path: string, ...args: Array<string>) {
|
||||
let procOut = await $`${path} ${args.join('\n')}`
|
||||
return procOut.stdout.trim()
|
||||
// TODO: stop using shell
|
||||
let { stdout, stderr } = await exec(`${path} ${args.join(' ')}`)
|
||||
console.log({
|
||||
cmd: `${path} ${args.join(' ')}`,
|
||||
stdout: stdout,
|
||||
stderr: stderr,
|
||||
})
|
||||
console.log(stdout)
|
||||
return stdout.trim()
|
||||
}
|
||||
|
|
|
@ -5,6 +5,6 @@ export function* parseLines(lines: string) {
|
|||
continue
|
||||
}
|
||||
|
||||
yield line
|
||||
yield line.trim()
|
||||
}
|
||||
}
|
||||
|
|
195
yarn.lock
195
yarn.lock
|
@ -359,13 +359,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
|
||||
integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
|
||||
|
||||
"@types/fs-extra@^9.0.12":
|
||||
version "9.0.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
|
||||
integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/glob@^7.1.1":
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
|
||||
|
@ -389,25 +382,12 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
|
||||
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
|
||||
|
||||
"@types/minimist@^1.2.2":
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
|
||||
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
|
||||
|
||||
"@types/mocha@^5":
|
||||
version "5.2.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea"
|
||||
integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==
|
||||
|
||||
"@types/node-fetch@^2.5.12":
|
||||
version "2.5.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
|
||||
integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
form-data "^3.0.0"
|
||||
|
||||
"@types/node@*", "@types/node@^16.11.6", "@types/node@^16.6":
|
||||
"@types/node@*", "@types/node@^16.11.6":
|
||||
version "16.11.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae"
|
||||
integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==
|
||||
|
@ -562,11 +542,6 @@ array-union@^2.1.0:
|
|||
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
|
||||
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
|
||||
|
||||
array-union@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975"
|
||||
integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==
|
||||
|
||||
assertion-error@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
|
||||
|
@ -577,11 +552,6 @@ astral-regex@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
|
||||
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
|
@ -853,13 +823,6 @@ colors@^1.1.2:
|
|||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
|
||||
|
||||
combined-stream@^1.0.8:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
commander@2.15.1:
|
||||
version "2.15.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
|
@ -967,11 +930,6 @@ defaults@^1.0.3:
|
|||
dependencies:
|
||||
clone "^1.0.2"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
|
||||
|
||||
detect-indent@^6.0.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
|
||||
|
@ -1001,11 +959,6 @@ doctrine@^3.0.0:
|
|||
dependencies:
|
||||
esutils "^2.0.2"
|
||||
|
||||
duplexer@~0.1.1:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
|
||||
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
|
||||
|
||||
electron-to-chromium@^1.3.886:
|
||||
version "1.3.890"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz#e7143b659f73dc4d0512d1ae4baeb0fb9e7bc835"
|
||||
|
@ -1342,19 +1295,6 @@ esutils@^2.0.2:
|
|||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
|
||||
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
|
||||
|
||||
event-stream@=3.3.4:
|
||||
version "3.3.4"
|
||||
resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
|
||||
integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=
|
||||
dependencies:
|
||||
duplexer "~0.1.1"
|
||||
from "~0"
|
||||
map-stream "~0.1.0"
|
||||
pause-stream "0.0.11"
|
||||
split "0.3"
|
||||
stream-combiner "~0.0.4"
|
||||
through "~2.3.1"
|
||||
|
||||
execa@^0.10.0:
|
||||
version "0.10.0"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
|
||||
|
@ -1401,7 +1341,7 @@ fast-deep-equal@^3.1.1:
|
|||
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.0.3, fast-glob@^3.1.1, fast-glob@^3.2.7:
|
||||
fast-glob@^3.0.3, fast-glob@^3.1.1:
|
||||
version "3.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
|
||||
integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
|
||||
|
@ -1503,34 +1443,11 @@ foreground-child@^1.5.6:
|
|||
cross-spawn "^4"
|
||||
signal-exit "^3.0.0"
|
||||
|
||||
form-data@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
|
||||
integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.8"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
from@~0:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
|
||||
integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
|
||||
|
||||
fs-constants@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
fs-extra@^10.0.0:
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
|
||||
integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
fs-extra@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
|
||||
|
@ -1658,18 +1575,6 @@ globby@^11.0.1:
|
|||
merge2 "^1.3.0"
|
||||
slash "^3.0.0"
|
||||
|
||||
globby@^12.0.1:
|
||||
version "12.0.2"
|
||||
resolved "https://registry.yarnpkg.com/globby/-/globby-12.0.2.tgz#53788b2adf235602ed4cabfea5c70a1139e1ab11"
|
||||
integrity sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==
|
||||
dependencies:
|
||||
array-union "^3.0.1"
|
||||
dir-glob "^3.0.1"
|
||||
fast-glob "^3.2.7"
|
||||
ignore "^5.1.8"
|
||||
merge2 "^1.4.1"
|
||||
slash "^4.0.0"
|
||||
|
||||
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.8"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
||||
|
@ -1760,7 +1665,7 @@ ignore@^4.0.2, ignore@^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.1.1, ignore@^5.1.4, ignore@^5.1.8:
|
||||
ignore@^5.1.1, ignore@^5.1.4:
|
||||
version "5.1.9"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
|
||||
integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==
|
||||
|
@ -2027,15 +1932,6 @@ jsonfile@^4.0.0:
|
|||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
|
||||
dependencies:
|
||||
universalify "^2.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
levn@^0.3.0, levn@~0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
|
||||
|
@ -2192,11 +2088,6 @@ make-error@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
|
||||
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
|
||||
|
||||
map-stream@~0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
|
||||
integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=
|
||||
|
||||
merge-source-map@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
|
||||
|
@ -2204,7 +2095,7 @@ merge-source-map@^1.1.0:
|
|||
dependencies:
|
||||
source-map "^0.6.1"
|
||||
|
||||
merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
|
||||
merge2@^1.2.3, merge2@^1.3.0:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||
|
@ -2217,18 +2108,6 @@ micromatch@^4.0.2, micromatch@^4.0.4:
|
|||
braces "^3.0.1"
|
||||
picomatch "^2.2.3"
|
||||
|
||||
mime-db@1.50.0:
|
||||
version "1.50.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
|
||||
integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
|
||||
|
||||
mime-types@^2.1.12:
|
||||
version "2.1.33"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
|
||||
integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
|
||||
dependencies:
|
||||
mime-db "1.50.0"
|
||||
|
||||
mimic-fn@^1.0.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
|
||||
|
@ -2347,7 +2226,7 @@ nock@^13.0.0:
|
|||
lodash.set "^4.3.2"
|
||||
propagate "^2.0.0"
|
||||
|
||||
node-fetch@2, node-fetch@^2.6.1:
|
||||
node-fetch@2:
|
||||
version "2.6.6"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
|
||||
integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
|
||||
|
@ -2601,13 +2480,6 @@ pathval@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
|
||||
integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
|
||||
|
||||
pause-stream@0.0.11:
|
||||
version "0.0.11"
|
||||
resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
|
||||
integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=
|
||||
dependencies:
|
||||
through "~2.3"
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
|
@ -2662,13 +2534,6 @@ propagate@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45"
|
||||
integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==
|
||||
|
||||
ps-tree@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd"
|
||||
integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==
|
||||
dependencies:
|
||||
event-stream "=3.3.4"
|
||||
|
||||
pseudomap@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
||||
|
@ -2950,11 +2815,6 @@ slash@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
|
||||
|
||||
slash@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
|
||||
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
|
||||
|
||||
slice-ansi@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
|
||||
|
@ -3027,13 +2887,6 @@ spdx-license-ids@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b"
|
||||
integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==
|
||||
|
||||
split@0.3:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
|
||||
integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
|
||||
dependencies:
|
||||
through "2"
|
||||
|
||||
sprintf-js@~1.0.2:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||
|
@ -3047,13 +2900,6 @@ stdout-stderr@^0.1.9:
|
|||
debug "^4.1.1"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
stream-combiner@~0.0.4:
|
||||
version "0.0.4"
|
||||
resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
|
||||
integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=
|
||||
dependencies:
|
||||
duplexer "~0.1.1"
|
||||
|
||||
string-width@^2.1.0, string-width@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
|
||||
|
@ -3217,7 +3063,7 @@ text-table@^0.2.0:
|
|||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
|
||||
|
||||
through@2, through@^2.3.6, through@~2.3, through@~2.3.1:
|
||||
through@^2.3.6:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||
|
@ -3332,11 +3178,6 @@ universalify@^0.1.0:
|
|||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||
|
||||
unzipit@^1.3.5:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/unzipit/-/unzipit-1.3.5.tgz#3ee48a478a3b7e248d65d3bc0bb189a8d63c3ce1"
|
||||
|
@ -3406,13 +3247,6 @@ which@^1.2.9, which@^1.3.0:
|
|||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
which@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
||||
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
widest-line@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
|
||||
|
@ -3543,20 +3377,3 @@ yn@3.1.1:
|
|||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
|
||||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
|
||||
|
||||
zx@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/zx/-/zx-4.2.0.tgz#5f7c15f4446ad33ae23717e5aba4c0199aa90851"
|
||||
integrity sha512-/4f7FaJecA9I655KXKXIHO3CFNYjAz2uSmTz6v2eNlKdrQKyz4VyF3RjqFuP6nQG+Hd3+NjOvrVNBkv8Ne9d4Q==
|
||||
dependencies:
|
||||
"@types/fs-extra" "^9.0.12"
|
||||
"@types/minimist" "^1.2.2"
|
||||
"@types/node" "^16.6"
|
||||
"@types/node-fetch" "^2.5.12"
|
||||
chalk "^4.1.2"
|
||||
fs-extra "^10.0.0"
|
||||
globby "^12.0.1"
|
||||
minimist "^1.2.5"
|
||||
node-fetch "^2.6.1"
|
||||
ps-tree "^1.2.0"
|
||||
which "^2.0.2"
|
||||
|
|
Loading…
Reference in a new issue