download_m3u8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env ts-node --transpile-only | |
import { createWriteStream, readFileSync, writeFileSync } from "fs"; | |
import { basename, extname } from "path"; | |
import { createHash } from "crypto"; | |
const s3Url = | |
"https://example-video-player-debugging-temporary.s3.amazonaws.com"; | |
const fetch = require("node-fetch"); | |
async function getPlaylist() { | |
const response = await fetch("https://cdn.jwplayer.com/v2/playlists/abcde"); | |
const playlist = await response.json(); | |
return playlist.playlist; | |
} | |
async function streamFileToDisk(remoteUrl, filename) { | |
const outputPath = `${__dirname}/output/${filename}`; | |
return new Promise(async (accept, reject) => { | |
const res = await fetch(remoteUrl); | |
const fileStream = createWriteStream(outputPath); | |
res.body.pipe(fileStream); | |
res.body.on("error", reject); | |
fileStream.on("finish", accept); | |
}); | |
} | |
function findM3u8Files(playlist: any[]) { | |
return playlist.map( | |
item => | |
item.sources.find( | |
source => source.type == "application/vnd.apple.mpegurl" | |
).file | |
); | |
} | |
async function downloadM3u8Files(playlist: any[]) { | |
const promises = findM3u8Files(playlist).map(item => | |
streamFileToDisk(item, basename(item)) | |
); | |
return Promise.all(promises); | |
} | |
async function getVideoFiles(mediaIds: string[]) { | |
const promises = mediaIds.map(async mediaId => { | |
return await readFileSync(`${__dirname}/output/${mediaId}.m3u8`, "utf8"); | |
}); | |
const output: string[] = await Promise.all(promises); | |
return output; | |
} | |
function parseFileUrls(m3u8FileContents: string): string[] { | |
const urls = m3u8FileContents.split("\n").filter(line => /^http/.test(line)); | |
// Removes duplicates. | |
return [...new Set(urls)]; | |
} | |
function getFilenameFromUrl(url: string) { | |
const hash = createHash("sha1") | |
.update(url) | |
.digest("hex"); | |
return `${hash}${extname(url.split("?")[0])}`; | |
} | |
function log(message: string) { | |
console.log(message); | |
} | |
async function main() { | |
// Get the playlist | |
const playlist = await getPlaylist(); | |
// Loop over playlist files | |
for (const url of findM3u8Files(playlist)) { | |
await processItemFromPlaylist(url); | |
} | |
} | |
async function fetchM3u8Url(url: string): string[] { | |
const res = await fetch(url); | |
const text = await res.text(); | |
return text.split("\n"); | |
} | |
async function processItemFromPlaylist(url: string) { | |
// Here this is the individual record from the playlist. | |
log(`Procssing ${url}`); | |
const playlistLines = await fetchM3u8Url(url); | |
const filesForDownload = [ | |
...new Set( | |
playlistLines.filter(line => line.trim()[0] !== "#").filter(Boolean) | |
), | |
]; | |
let text = playlistLines.join("\n"); | |
for (const url of filesForDownload) { | |
text = text.replace(url, `${s3Url}/${getFilenameFromUrl(url)}`); | |
} | |
writeFileSync(`${__dirname}/output/${basename(url)}`, text, "utf8"); | |
console.log("👻 ", filesForDownload); | |
await Promise.all(filesForDownload.map(processChildFromPlaylist)); | |
// /* | |
const promises = filesForDownload.map(file => { | |
return streamFileToDisk(url, getFilenameFromUrl(url)); | |
}); | |
await Promise.all(promises); | |
console.log(filesForDownload); | |
// */ | |
} | |
async function processChildFromPlaylist(url: string) { | |
log(`Subprocessing ${url} ${getFilenameFromUrl(url)}`); | |
const playlistLines = await fetchM3u8Url(url); | |
const res2 = await fetch(url); | |
const m3u8Body = await res2.text(); | |
const childFilesForDownload = [ | |
...new Set( | |
playlistLines.filter(line => line.trim()[0] !== "#").filter(Boolean) | |
), | |
]; | |
let childBody = m3u8Body; | |
for (const line of childFilesForDownload) { | |
log(`sub-subprocessing ${line}`); | |
childBody = childBody.replace(line, `${s3Url}/${getFilenameFromUrl(line)}`); | |
} | |
writeFileSync(`${__dirname}/output/${getFilenameFromUrl(url)}`, childBody); | |
const promises = childFilesForDownload.map(file => | |
streamFileToDisk(`${getBaseURL(url)}/${file}`, getFilenameFromUrl(file)) | |
); | |
await Promise.all(promises); | |
} | |
function getBaseURL(m3u8Url: string): string { | |
const parts = m3u8Url.split("/"); | |
parts.splice(-1); | |
return parts.join("/"); | |
} | |
main().catch(e => { | |
console.error(e); | |
process.exit(1); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "jw-video-downloads", | |
"version": "1.0.0", | |
"main": "index.js", | |
"license": "MIT", | |
"dependencies": { | |
"@types/node": "^12.7.5", | |
"@types/node-fetch": "^2.5.0", | |
"download-m3u8": "^1.0.2", | |
"node-fetch": "^2.6.0", | |
"typescript": "^3.6.3", | |
"typescript-tslint-plugin": "^0.5.4" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Show hidden characters
{ | |
"compilerOptions": { | |
"sourceMap": true, | |
"allowUnreachableCode": false, | |
"strictNullChecks": false, | |
"strictFunctionTypes": true, | |
"noImplicitAny": false, | |
"alwaysStrict": true, | |
"suppressImplicitAnyIndexErrors": true, | |
"noImplicitThis": true, | |
"noUnusedLocals": true, | |
"noUnusedParameters": false, | |
"preserveWatchOutput": true, | |
"module": "commonjs", | |
"target": "es2017", | |
"allowJs": true, | |
"lib": [ | |
"es2015", | |
"es2017" | |
] | |
}, | |
"include": ["**/*.ts"] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. | |
# yarn lockfile v1 | |
"@types/node-fetch@^2.5.0": | |
version "2.5.0" | |
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.0.tgz#1c55616a4591bdd15a389fbd0da4a55b9502add5" | |
integrity sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw== | |
dependencies: | |
"@types/node" "*" | |
"@types/node@*", "@types/node@^12.7.5": | |
version "12.7.5" | |
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" | |
integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w== | |
ajv@^6.5.5: | |
version "6.10.2" | |
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" | |
integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== | |
dependencies: | |
fast-deep-equal "^2.0.1" | |
fast-json-stable-stringify "^2.0.0" | |
json-schema-traverse "^0.4.1" | |
uri-js "^4.2.2" | |
asn1@~0.2.3: | |
version "0.2.4" | |
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" | |
integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== | |
dependencies: | |
safer-buffer "~2.1.0" | |
assert-plus@1.0.0, assert-plus@^1.0.0: | |
version "1.0.0" | |
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" | |
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= | |
asynckit@^0.4.0: | |
version "0.4.0" | |
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" | |
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= | |
aws-sign2@~0.7.0: | |
version "0.7.0" | |
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" | |
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= | |
aws4@^1.8.0: | |
version "1.8.0" | |
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" | |
integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== | |
balanced-match@^1.0.0: | |
version "1.0.0" | |
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" | |
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= | |
bcrypt-pbkdf@^1.0.0: | |
version "1.0.2" | |
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" | |
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= | |
dependencies: | |
tweetnacl "^0.14.3" | |
brace-expansion@^1.1.7: | |
version "1.1.11" | |
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" | |
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== | |
dependencies: | |
balanced-match "^1.0.0" | |
concat-map "0.0.1" | |
caseless@~0.12.0: | |
version "0.12.0" | |
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" | |
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= | |
combined-stream@^1.0.6, combined-stream@~1.0.6: | |
version "1.0.8" | |
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" | |
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== | |
dependencies: | |
delayed-stream "~1.0.0" | |
concat-map@0.0.1: | |
version "0.0.1" | |
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" | |
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= | |
core-util-is@1.0.2: | |
version "1.0.2" | |
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" | |
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= | |
dashdash@^1.12.0: | |
version "1.14.1" | |
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" | |
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= | |
dependencies: | |
assert-plus "^1.0.0" | |
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= | |
download-m3u8@^1.0.2: | |
version "1.0.2" | |
resolved "https://registry.yarnpkg.com/download-m3u8/-/download-m3u8-1.0.2.tgz#c09429c90e9c8a3cbbe9c6e3adc9747f15a3c8fe" | |
integrity sha1-wJQpyQ6cijy76cbjrcl0fxWjyP4= | |
dependencies: | |
mkdirp "^0.5.1" | |
request "^2.81.0" | |
ecc-jsbn@~0.1.1: | |
version "0.1.2" | |
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" | |
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= | |
dependencies: | |
jsbn "~0.1.0" | |
safer-buffer "^2.1.0" | |
extend@~3.0.2: | |
version "3.0.2" | |
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" | |
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== | |
extsprintf@1.3.0: | |
version "1.3.0" | |
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" | |
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= | |
extsprintf@^1.2.0: | |
version "1.4.0" | |
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" | |
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= | |
fast-deep-equal@^2.0.1: | |
version "2.0.1" | |
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" | |
integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= | |
fast-json-stable-stringify@^2.0.0: | |
version "2.0.0" | |
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" | |
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= | |
forever-agent@~0.6.1: | |
version "0.6.1" | |
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" | |
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= | |
form-data@~2.3.2: | |
version "2.3.3" | |
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" | |
integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== | |
dependencies: | |
asynckit "^0.4.0" | |
combined-stream "^1.0.6" | |
mime-types "^2.1.12" | |
get-caller-file@^1.0.2: | |
version "1.0.3" | |
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" | |
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== | |
getpass@^0.1.1: | |
version "0.1.7" | |
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" | |
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= | |
dependencies: | |
assert-plus "^1.0.0" | |
har-schema@^2.0.0: | |
version "2.0.0" | |
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" | |
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= | |
har-validator@~5.1.0: | |
version "5.1.3" | |
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" | |
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== | |
dependencies: | |
ajv "^6.5.5" | |
har-schema "^2.0.0" | |
http-signature@~1.2.0: | |
version "1.2.0" | |
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" | |
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= | |
dependencies: | |
assert-plus "^1.0.0" | |
jsprim "^1.2.2" | |
sshpk "^1.7.0" | |
is-typedarray@~1.0.0: | |
version "1.0.0" | |
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" | |
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= | |
isstream@~0.1.2: | |
version "0.1.2" | |
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" | |
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= | |
jsbn@~0.1.0: | |
version "0.1.1" | |
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" | |
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= | |
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-schema@0.2.3: | |
version "0.2.3" | |
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" | |
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= | |
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" | |
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= | |
jsprim@^1.2.2: | |
version "1.4.1" | |
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" | |
integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= | |
dependencies: | |
assert-plus "1.0.0" | |
extsprintf "1.3.0" | |
json-schema "0.2.3" | |
verror "1.10.0" | |
mime-db@1.40.0: | |
version "1.40.0" | |
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" | |
integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== | |
mime-types@^2.1.12, mime-types@~2.1.19: | |
version "2.1.24" | |
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" | |
integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== | |
dependencies: | |
mime-db "1.40.0" | |
minimatch@^3.0.4: | |
version "3.0.4" | |
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" | |
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== | |
dependencies: | |
brace-expansion "^1.1.7" | |
minimist@0.0.8: | |
version "0.0.8" | |
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" | |
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= | |
mkdirp@^0.5.1: | |
version "0.5.1" | |
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" | |
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= | |
dependencies: | |
minimist "0.0.8" | |
mock-require@^3.0.2: | |
version "3.0.3" | |
resolved "https://registry.yarnpkg.com/mock-require/-/mock-require-3.0.3.tgz#ccd544d9eae81dd576b3f219f69ec867318a1946" | |
integrity sha512-lLzfLHcyc10MKQnNUCv7dMcoY/2Qxd6wJfbqCcVk3LDb8An4hF6ohk5AztrvgKhJCqj36uyzi/p5se+tvyD+Wg== | |
dependencies: | |
get-caller-file "^1.0.2" | |
normalize-path "^2.1.1" | |
node-fetch@^2.6.0: | |
version "2.6.0" | |
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" | |
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== | |
normalize-path@^2.1.1: | |
version "2.1.1" | |
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" | |
integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= | |
dependencies: | |
remove-trailing-separator "^1.0.1" | |
oauth-sign@~0.9.0: | |
version "0.9.0" | |
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" | |
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== | |
performance-now@^2.1.0: | |
version "2.1.0" | |
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" | |
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= | |
psl@^1.1.24: | |
version "1.4.0" | |
resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" | |
integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== | |
punycode@^1.4.1: | |
version "1.4.1" | |
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" | |
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= | |
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== | |
qs@~6.5.2: | |
version "6.5.2" | |
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" | |
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== | |
remove-trailing-separator@^1.0.1: | |
version "1.1.0" | |
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" | |
integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= | |
request@^2.81.0: | |
version "2.88.0" | |
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" | |
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== | |
dependencies: | |
aws-sign2 "~0.7.0" | |
aws4 "^1.8.0" | |
caseless "~0.12.0" | |
combined-stream "~1.0.6" | |
extend "~3.0.2" | |
forever-agent "~0.6.1" | |
form-data "~2.3.2" | |
har-validator "~5.1.0" | |
http-signature "~1.2.0" | |
is-typedarray "~1.0.0" | |
isstream "~0.1.2" | |
json-stringify-safe "~5.0.1" | |
mime-types "~2.1.19" | |
oauth-sign "~0.9.0" | |
performance-now "^2.1.0" | |
qs "~6.5.2" | |
safe-buffer "^5.1.2" | |
tough-cookie "~2.4.3" | |
tunnel-agent "^0.6.0" | |
uuid "^3.3.2" | |
safe-buffer@^5.0.1, safe-buffer@^5.1.2: | |
version "5.2.0" | |
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" | |
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== | |
safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: | |
version "2.1.2" | |
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" | |
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== | |
sshpk@^1.7.0: | |
version "1.16.1" | |
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" | |
integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== | |
dependencies: | |
asn1 "~0.2.3" | |
assert-plus "^1.0.0" | |
bcrypt-pbkdf "^1.0.0" | |
dashdash "^1.12.0" | |
ecc-jsbn "~0.1.1" | |
getpass "^0.1.1" | |
jsbn "~0.1.0" | |
safer-buffer "^2.0.2" | |
tweetnacl "~0.14.0" | |
tough-cookie@~2.4.3: | |
version "2.4.3" | |
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" | |
integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== | |
dependencies: | |
psl "^1.1.24" | |
punycode "^1.4.1" | |
tunnel-agent@^0.6.0: | |
version "0.6.0" | |
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" | |
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= | |
dependencies: | |
safe-buffer "^5.0.1" | |
tweetnacl@^0.14.3, tweetnacl@~0.14.0: | |
version "0.14.5" | |
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" | |
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= | |
typescript-tslint-plugin@^0.5.4: | |
version "0.5.4" | |
resolved "https://registry.yarnpkg.com/typescript-tslint-plugin/-/typescript-tslint-plugin-0.5.4.tgz#febe0cca1fe65133f4f688841eba68262a1d55a5" | |
integrity sha512-CQEfGC+p0SoBARI4N2LrGsWJsp4/OE+uKZ68xsWYKHWqMFq4DFQHqOVlK0deEricSN01NmDTqjap63Pw/DHieg== | |
dependencies: | |
minimatch "^3.0.4" | |
mock-require "^3.0.2" | |
vscode-languageserver "^5.1.0" | |
typescript@^3.6.3: | |
version "3.6.3" | |
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" | |
integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== | |
uri-js@^4.2.2: | |
version "4.2.2" | |
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" | |
integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== | |
dependencies: | |
punycode "^2.1.0" | |
uuid@^3.3.2: | |
version "3.3.3" | |
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" | |
integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== | |
verror@1.10.0: | |
version "1.10.0" | |
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" | |
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= | |
dependencies: | |
assert-plus "^1.0.0" | |
core-util-is "1.0.2" | |
extsprintf "^1.2.0" | |
vscode-jsonrpc@^4.0.0: | |
version "4.0.0" | |
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9" | |
integrity sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg== | |
vscode-languageserver-protocol@3.14.1: | |
version "3.14.1" | |
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz#b8aab6afae2849c84a8983d39a1cf742417afe2f" | |
integrity sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g== | |
dependencies: | |
vscode-jsonrpc "^4.0.0" | |
vscode-languageserver-types "3.14.0" | |
vscode-languageserver-types@3.14.0: | |
version "3.14.0" | |
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" | |
integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== | |
vscode-languageserver@^5.1.0: | |
version "5.2.1" | |
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz#0d2feddd33f92aadf5da32450df498d52f6f14eb" | |
integrity sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A== | |
dependencies: | |
vscode-languageserver-protocol "3.14.1" | |
vscode-uri "^1.0.6" | |
vscode-uri@^1.0.6: | |
version "1.0.8" | |
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.8.tgz#9769aaececae4026fb6e22359cb38946580ded59" | |
integrity sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ== |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment