diff --git a/package.json b/package.json index c09a531f6..f52fab357 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "ts-node": "^8.5.2", "typescript": "^3.0.0", "uglifyjs-webpack-plugin": "^2.0.1", - "unique-commit-id": "^1.0.0", + "git-commit-id": "^2.0.1", "vue-cli-plugin-vuetify": "^0.4.6", "vue-template-compiler": "^2.5.17", "vuetify-loader": "^1.0.5", diff --git a/resource/clients/synologyDownloadStation/init.js b/resource/clients/synologyDownloadStation/init.js index dfd84a296..68f51bad8 100644 --- a/resource/clients/synologyDownloadStation/init.js +++ b/resource/clients/synologyDownloadStation/init.js @@ -1,5 +1,6 @@ /** * @see https://global.download.synology.com/download/Document/DeveloperGuide/Synology_Download_Station_Web_API.pdf + * @backport https://github.com/ronggang/PT-Plugin-Plus/blob/48c2d42a1d05c129c0abbbecf653b1b7d88a8a8e/src/resource/btClients/src/clients/synologyDownloadStation.ts */ (function ($, window) { class Client { @@ -7,7 +8,6 @@ init(options) { this.options = options; this.sessionId = ""; - this.version = 2; if (this.options.address.substr(-1) == "/") { this.options.address = this.options.address.substr(0, this.options.address.length - 1); } @@ -18,7 +18,7 @@ */ getSessionId() { return new Promise((resolve, reject) => { - let url = `${this.options.address}/webapi/auth.cgi?api=SYNO.API.Auth&version=${this.version}&method=login&account=${encodeURIComponent(this.options.loginName)}&passwd=${encodeURIComponent(this.options.loginPwd)}&session=DownloadStation&format=sid`; + let url = `${this.options.address}/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=${encodeURIComponent(this.options.loginName)}&passwd=${encodeURIComponent(this.options.loginPwd)}&session=DownloadStation&format=sid`; $.ajax({ url, timeout: PTBackgroundService.options.connectClientTimeout, @@ -83,8 +83,8 @@ /** * 添加种子链接 - * @param {*} options - * @param {*} callback + * @param {*} options + * @param {*} callback */ addTorrentFromUrl(options, callback) { if (!this.sessionId) { @@ -102,64 +102,66 @@ }) return; } - // let path = [`${this.options.address}/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task`, - // `version=${this.version}`, - // `method=create`, - // `_sid=${this.sessionId}`, - // `uri=` + encodeURIComponent(options.url), - // `destination=` + encodeURIComponent(options.savePath) - // ]; - // $.ajax({ - // url: path.join("&"), - // timeout: PTBackgroundService.options.connectClientTimeout, - // dataType: "json" - // }).done((result) => { - // console.log(result) - // callback(result) - // }).fail(() => { - // callback({ - // status: "error", - // msg: "服务器连接失败" - // }) - // }) - - PTBackgroundService.requestMessage({ - action: "getTorrentDataFromURL", - data: options.url - }) - .then((result) => { - let formData = new FormData(); - formData.append("_sid", this.sessionId); - formData.append("api", "SYNO.DownloadStation.Task"); - formData.append("version", this.version); - formData.append("method", "create"); - - if (options.savePath) { - let savePath = options.savePath + ""; - // 去除路径最后的 / ,以确保可以正常添加目录信息 - if (savePath.substr(-1) == "/") { - savePath = savePath.substr(0, savePath.length - 1); + + let postData = { + api: 'SYNO.DownloadStation2.Task', + method: 'create', + version: 2, + create_list: false, + _sid: this.sessionId // fxxk, _sid 参数不能放在第一位,不然会直接 101 报错 + } + + // fxxk, 没有 destination 参数也会直接报错 + let savePath = (options.savePath || "") + ""; + if (savePath.substr(-1) === "/") { // 去除路径最后的 / ,以确保可以正常添加目录信息 + savePath = savePath.substr(0, savePath.length - 1); + } + postData.destination = `"${savePath || ''}"`; + + if (options.url.startsWith('magnet:')) { + postData.type = '"url"'; + postData.url = [options.url]; + + this.addTorrent(postData, options, callback); + } else { + postData.type = '"file"'; + postData.file = ['torrent']; + + let formData = new FormData(); + Object.keys(postData).forEach((k) => { + let v = postData[k]; + if (v !== undefined) { + if (Array.isArray(v)) { + v = JSON.stringify(v); } - formData.append("destination", savePath) + formData.append(k,v); } + }); - formData.append("file", result, "file.torrent") - this.addTorrent(formData, options, callback); + PTBackgroundService.requestMessage({ + action: "getTorrentDataFromURL", + data: options.url }) - .catch((result) => { - callback && callback(result); - }); + .then((result) => { + formData.append("torrent", result, "file.torrent") + + this.addTorrent(formData, options, callback); + }) + .catch((result) => { + callback && callback(result); + }); + + } } addTorrent(formData, options, callback) { $.ajax({ - url: `${this.options.address}/webapi/DownloadStation/task.cgi`, + url: `${this.options.address}/webapi/entry.cgi`, timeout: PTBackgroundService.options.connectClientTimeout, type: "POST", processData: false, contentType: false, - method: "POST", data: formData, dataType: "json" }).done((result) => { @@ -202,4 +204,4 @@ } // 添加到 window 对象,用于客户页面调用 window.synologyDownloadStation = Client; -})(jQuery, window) \ No newline at end of file +})(jQuery, window) diff --git a/resource/i18n/en.json b/resource/i18n/en.json index 0e6c20e3c..920eb4165 100644 --- a/resource/i18n/en.json +++ b/resource/i18n/en.json @@ -273,6 +273,7 @@ "seeders": "S", "leechers": "L", "completed": "C", + "comments": "Comments", "time": "Time(≈)", "action": "Action" }, diff --git a/resource/i18n/zh-CN.json b/resource/i18n/zh-CN.json index 99a98badd..9599aa9a8 100644 --- a/resource/i18n/zh-CN.json +++ b/resource/i18n/zh-CN.json @@ -272,9 +272,9 @@ "seeders": "上传", "leechers": "下载", "completed": "完成", + "comments": "评论", "time": "发布于(≈)", - "action": "操作", - "comments": "评论" + "action": "操作" }, "optionsIsMissing": "系统参数丢失", "sitesIsMissing": "请先设置站点", diff --git a/resource/schemas/GazelleJSONAPI/config.json b/resource/schemas/GazelleJSONAPI/config.json index 887b3d8dc..7d4224f0a 100644 --- a/resource/schemas/GazelleJSONAPI/config.json +++ b/resource/schemas/GazelleJSONAPI/config.json @@ -63,7 +63,7 @@ "page": "/torrents.php?type=seeding&userid=$user.id$", "fields": { "seedingSize": { - "selector": ["tr.torrent_row > td.nobr"], + "selector": ["tr.torrent_row > td.number_column.nobr"], "filters": ["jQuery.map(query, (item)=>{return $(item).text();})", "_self.getTotalSize(query)"] }, "bonus": { @@ -72,4 +72,4 @@ } } } -} \ No newline at end of file +} diff --git a/resource/schemas/IPTorrents/config.json b/resource/schemas/IPTorrents/config.json index 426af5358..6e53d8776 100644 --- a/resource/schemas/IPTorrents/config.json +++ b/resource/schemas/IPTorrents/config.json @@ -3,7 +3,7 @@ "ver": "0.0.1", "plugins": [{ "name": "种子详情页面", - "pages": ["/details.php"], + "pages": ["/torrent.php"], "scripts": ["/schemas/NexusPHP/common.js", "details.js"] }, { "name": "种子列表", diff --git a/resource/schemas/UNIT3D/config.json b/resource/schemas/UNIT3D/config.json index c0e7f90b9..2da2b6b78 100644 --- a/resource/schemas/UNIT3D/config.json +++ b/resource/schemas/UNIT3D/config.json @@ -76,7 +76,7 @@ }, "bonus": { "selector": ["div.ratio-bar i.fa-coins"], - "filters": ["query.parent().text().trim().replace(/\\s/g,'').match(/([\\d.]+)/)", "(query && query.length>=2)?parseFloat(query[1]):0"] + "filters": ["query.parent().text().trim().replace(/,|\\s/g,'').match(/([\\d.]+)/)", "(query && query.length>=2)?parseFloat(query[1]):0"] }, "seeding": { "selector": ["div.ratio-bar i.fa-upload"], @@ -113,4 +113,4 @@ } } } -} \ No newline at end of file +} diff --git a/resource/sites/aither.cc/config.json b/resource/sites/aither.cc/config.json index 6c23d7a3a..df0cdc7ed 100644 --- a/resource/sites/aither.cc/config.json +++ b/resource/sites/aither.cc/config.json @@ -8,5 +8,28 @@ "综合" ], "host": "aither.cc", - "collaborator": "MewX" + "collaborator": "MewX", + "searchEntry": [ + { + "name": "全部", + "enabled": true + } + ], + "searchEntryConfig": { + "page": "/torrents", + "queryString": "perPage=100&name=$key$", + "area": [ + { + "name": "IMDB", + "keyAutoMatch": "^(tt\\d+)$", + "queryString": "perPage=100&imdbId=$key$", + "replaceKey": [ + "tt", + "" + ] + } + ], + "resultType": "html", + "parseScriptFile": "getSearchResult.js" + } } diff --git a/resource/sites/aither.cc/getSearchResult.js b/resource/sites/aither.cc/getSearchResult.js new file mode 100644 index 000000000..548f47aa7 --- /dev/null +++ b/resource/sites/aither.cc/getSearchResult.js @@ -0,0 +1,124 @@ +(function (options, Searcher) { + class Parser { + constructor() { + this.haveData = false; + if (/\/login/.test(options.responseText)) { + options.status = ESearchResultParseStatus.needLogin; + return; + } + + // Logging in is required. + options.isLogged = true; + this.haveData = true; + } + + /** + * Getting the search results. + */ + getResult() { + if (!this.haveData) { + return []; + } + let site = options.site; + site.searchEntryConfig = options.entry + let selector = "#torrent-list-table"; + let table = options.page.find(selector); + let rows = table.find("> tbody > tr"); + if (rows.length == 0) { + options.status = ESearchResultParseStatus.torrentTableIsEmpty; + return []; + } + + let results = []; + try { + // For each torrent in the table. + for (let index = 0; index < rows.length; index++) { + const row = rows.eq(index); + + // Torrent title. + const title = row.find(".torrent-listings-overview > .torrent-listings-name").text(); + const subTitle = ""; + // Time uploaded. + const time = row.find(".torrent-listings-age").text(); + // File size. + const size = row.find(".torrent-listings-size").text(); + // Number of seeders. + const seeders = row.find(".torrent-listings-seeders").text().trim(); + // Number of leechers. + const leechers = row.find(".torrent-listings-leechers").text().trim(); + // Number of downloads. + const completed = row.find(".torrent-listings-completed").text().trim(); + // Number of comments. + const comments = row.find(".torrent-listings-overview > .torrent-listings-comments").text().trim(); + // Uploader. + const author = row.find(".torrent-listings-uploader").text(); + // Category + const categoryURL = row.find(".torrent-listings-format > a").attr('href'); + const category = this.getCategory( + categoryURL == null ? -1 : + parseInt(categoryURL.substr(categoryURL.lastIndexOf("/") + 1))); + // Download link to the torrent. + const link = row.find(".torrent-listings-download > a").attr('href'); + // Link to the detail page. + const url = row.find(".torrent-listings-overview > .torrent-listings-name").attr('href'); + + // Adding to the results. + results.push({ + title, + subTitle, + link, + url, + size, + time, + author, + seeders, + leechers, + completed, + comments, + site, + tags: Searcher.getRowTags(site, row), // TODO: better tags. + entryName: options.entry.name, + category, + progress: null, // TODO: add support. + status: null, // TODO: add support. + }); + } + if (results.length == 0) { + options.status = ESearchResultParseStatus.noTorrents; + } + } catch (error) { + console.log(error); + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; + alert(error.stack); + } + + return results; + } + + /** + * Get the Cateogry Names. + * @param {*} categoryKey The category ID from URL. + */ + getCategory(categoryKey) { + // List of cateogories: https://aither.cc/categories. + const categoryMap = { + 1: "Movie", + 2: "TV", + 3: "Music", + 4: "Games", + 6: "XXX", + 9: "Sport", + 10: "Software & Apps", + 11: "Ebooks & Magazines", + 14: "Audiobooks", + 15: "Education", + } + return categoryKey in categoryMap ? categoryMap[categoryKey] : null; + } + } + + let parser = new Parser(options); + options.results = parser.getResult(); + console.log(options.results); +})(options, options.searcher); diff --git a/resource/sites/animebytes.tv/config.json b/resource/sites/animebytes.tv/config.json index ae3b17ee7..d8ee21cf6 100644 --- a/resource/sites/animebytes.tv/config.json +++ b/resource/sites/animebytes.tv/config.json @@ -5,14 +5,46 @@ "url": "https://animebytes.tv/", "icon": "https://animebytes.tv/favicon.ico", "tags": ["动漫"], - "schema": "Gazelle", + "schema": "", "host": "animebytes.tv", + "collaborator": [ + "MewX", + "sabersalv" + ], "supportedFeatures": { "userData": true, - "search": false, + "search": true, "imdbSearch": false, "sendTorrent": false }, + "plugins": [ + { + "name": "Custom Torrent List", + "pages": [ + "/series.php", + "/torrents.php", + "/torrents2.php" + ], + "scripts": [ + "/schemas/NexusPHP/common.js", + "userTorrents.js" + ] + } + ], + "securityKeyFields": [ + "authkey", + "torrent_pass" + ], + "searchEntry": [ + { + "entry": "/torrents.php?searchstr=$key$&force_default=1", + "name": "default", + "resultType": "html", + "parseScriptFile": "getSearchResult.js", + "resultSelector": "div.group_cont", + "enabled": true + } + ], "selectors": { "userBaseInfo": { "page": "/index.php", @@ -28,6 +60,10 @@ "isLogged": { "selector": ["a[href*='/user/logout']"], "filters": ["query.length>0"] + }, + "messageCount": { + "selector": [".alertbar.message a[href*='inbox.php']"], + "filters": ["query.text().match(/(\\d+)/)", "(query && query.length>=2)?parseInt(query[1]):0"] } } }, diff --git a/resource/sites/animebytes.tv/getSearchResult.js b/resource/sites/animebytes.tv/getSearchResult.js new file mode 100644 index 000000000..2d5dda08c --- /dev/null +++ b/resource/sites/animebytes.tv/getSearchResult.js @@ -0,0 +1,108 @@ +if (!"".getQueryString) { + String.prototype.getQueryString = function (name, split) { + if (split == undefined) split = "&"; + var reg = new RegExp( + "(^|" + split + "|\\?)" + name + "=([^" + split + "]*)(" + split + "|$)" + ), + r; + if ((r = this.match(reg))) return decodeURI(r[2]); + return null; + }; +} + +(function (options) { + class Parser { + constructor() { + this.haveData = false; + this.categories = {}; + if (/loginform/.test(options.responseText)) { + options.status = ESearchResultParseStatus.needLogin; //`[${options.site.name}]需要登录后再搜索`; + return; + } + options.isLogged = true; + + if (/File slips through fingers/.test(options.responseText)) { + options.status = ESearchResultParseStatus.noTorrents; //`[${options.site.name}]没有搜索到相关的种子`; + return; + } + this.haveData = true; + } + + /** + * Get search results. + */ + getResult() { + let site = options.site; + let results = []; + + // Get groups. Each group has one title and several torrents. + let groups = options.page.find(options.resultSelector); + if (groups.length == 0) { + options.status = ESearchResultParseStatus.torrentTableIsEmpty; //`[${options.site.name}]没有定位到种子列表,或没有相关的种子`; + return results; + } + + try { + for (let ig = 0; ig < groups.length; ig++) { + // Get group info. + let group = groups.eq(ig); + let groupTitle = group.find(".group_title").find("strong:first").text(); + if (groupTitle.length == 0) { + continue; + } + let category = group.find("span.cat:first").text(); + + // Get torrent info. + let torrents = group.find(".torrent_group:first").find("tr.torrent"); + for (let i = 0; i < torrents.length; i++) { + let t = torrents.eq(i); + let subTitle = t.find(".torrent_properties:first").find("a:last").text(); + let dlLink = site.url + t.find(".download_link:first").find("a:first").attr("href"); + let torrentURL = site.url + t.find(".torrent_properties:first").find("a:last").attr("href"); + let size = t.find(".torrent_size:first").text(); + let snatched = t.find(".torrent_snatched:first").text(); + let seeders = t.find(".torrent_seeders:first").text(); + let leechers = t.find(".torrent_leechers:first").text(); + + // Basic validations. + if (dlLink.length == 0) { + console.log("[%s] Invalid torrent link for \"%s\": %s", site.name, groupTitle, dlLink); + continue; + } + + let data = { + title: groupTitle, + subTitle: subTitle, + link: torrentURL, // Note: link means the torrent page. + url: dlLink, // Note: url means the download link. + size: size, + time: "", + author: "", + seeders: seeders, + leechers: leechers, + completed: snatched, + comments: "", + site: site, + entryName: options.entry.name, // TODO: support specifying entry name. + category: category, + }; + results.push(data); + } + } + if (results.length == 0) { + options.status = ESearchResultParseStatus.noTorrents; //`[${options.site.name}]没有搜索到相关的种子`; + } + } catch (error) { + console.error(error); + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; //`[${options.site.name}]获取种子信息出错: ${error.stack}`; + } + return results; + } + + } + + let parser = new Parser(options); + options.results = parser.getResult(); + console.log(options.results); +})(options); diff --git a/resource/sites/animebytes.tv/userTorrents.js b/resource/sites/animebytes.tv/userTorrents.js new file mode 100644 index 000000000..a96e278b0 --- /dev/null +++ b/resource/sites/animebytes.tv/userTorrents.js @@ -0,0 +1,39 @@ +(function ($) { + console.log("this is userTorrents.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + this.initFreeSpaceButton(); + // 设置当前页面 + PTService.pageApp = this; + } + + /** + * 初始化按钮列表 + */ + initButtons() { + this.initListButtons(); + } + + /** + * 获取下载链接 + */ + getDownloadURLs() { + let links = $("a[title='Download torrent']").toArray(); + console.log(links); + + if (links.length == 0) { + return this.t("getDownloadURLsFailed"); //"获取下载链接失败,未能正确定位到链接"; + } + + let urls = $.map(links, item => { + let link = $(item).attr("href"); + return this.getFullURL(link); + }); + console.log(urls); + + return urls; + } + } + new App().init(); +})(jQuery); diff --git a/resource/sites/audiences.me/config.json b/resource/sites/audiences.me/config.json new file mode 100644 index 000000000..1badc3ec6 --- /dev/null +++ b/resource/sites/audiences.me/config.json @@ -0,0 +1,44 @@ +{ + "name": "Audiences", + "timezoneOffset": "+0800", + "description": "观众", + "url": "https://audiences.me/", + "icon": "https://audiences.me/favicon.ico", + "tags": [ + "综合", + "影视", + "音乐", + "电子书", + "有声书" + ], + "schema": "NexusPHP", + "host": "audiences.me", + "collaborator": "Audiences", + "searchEntryConfig": { + "fieldSelector": { + "progress": { + "selector": [ + "td:not(.rowfollow):not(.colhead):not(.embedded)" + ], + "filters": [ + "query.text()=='-'?null:query.text()" + ] + }, + "status": { + "selector": [ + ".torrents-progress", ".torrents-progress2" + ], + "switchFilters": [ + ["query.attr('style').indexOf('100%')!=-1?2:3"], + ["255"] + ] + } + } + }, + "searchEntry": [ + { + "name": "全部", + "enabled": true + } + ] +} diff --git a/resource/sites/beyond-hd.me/config.json b/resource/sites/beyond-hd.me/config.json index cf86b03f2..20ad27ec9 100644 --- a/resource/sites/beyond-hd.me/config.json +++ b/resource/sites/beyond-hd.me/config.json @@ -87,7 +87,7 @@ "filters": ["query.parent().text().trim()"] }, "messageCount": { - "selector": [".beta-alert[href$='/mail'] .notify"], + "selector": [".beta-alert:not([title='Bets']) .notify"], "filters": ["query[0]?11:0"] } } diff --git a/resource/sites/bitpt.cn/config.json b/resource/sites/bitpt.cn/config.json new file mode 100644 index 000000000..da615de98 --- /dev/null +++ b/resource/sites/bitpt.cn/config.json @@ -0,0 +1,175 @@ +{ + "name": "极速之星PT", + "description": "极速之星IPV6资源交流平台", + "url": "https://bitpt.cn/", + "icon": "https://bitpt.cn/favicon.ico", + "tags": [ + "教育网", + "综合", + "影视" + ], + "schema": "NexusPHP", + "host": "bitpt.cn", + "collaborator": "wanicca", + "plugins": [{ + "name": "种子详情页面", + "pages": ["/bbs"], + "scripts": ["/schemas/NexusPHP/common.js", "details.js"] + }, { + "name": "种子列表", + "pages": ["/browse.php"], + "scripts": ["/schemas/NexusPHP/common.js", "torrents.js"] + }], + "searchEntryConfig": { + "page": "/browse.php", + "queryString": "s=$key$", + "resultType": "html", + "parseScriptFile": "getSearchResult.js", + "resultSelector": "table.torrenttable:last", + "fieldIndex": { + "title": 1, + "subTitle": 1, + "url": 1, + "link":1, + "size":3, + "seeders": 4, + "leechers": 5, + "completed": 6, + "author": 7, + "category": 0, + "time":7 + } + }, + "searchEntry": [ + { + "name": "全部", + "enabled": true + }, + { + "queryString": "c=1000", + "name": "Movie", + "enabled": false + } + ], + "categories": [ + { + "entry": "browse.php?", + "result": "c=$id$", + "category": [ + { + "id": 1000, + "name": "Movie" + } + ] + } + ], + "torrentTagSelectors": [ + { + "name": "Free", + "selector": "a[title^='该资源不计下载流量']" + }, + { + "name": "30%", + "selector": "a[title^='该资源计50%流量']" + }, + { + "name": "50%", + "selector": "a[title^='该资源计30%流量']" + } + ], + "selectors": { + "userBaseInfo": { + "page": "/index.php", + "fields": { + "id": { + "selector": "a[href*='userdetails.php']:first", + "attribute": "href", + "filters": [ + "query ? query.getQueryString('uid'):''" + ] + }, + "name": { + "selector": "a[href*='userdetails.php']:first" + }, + "isLogged": { + "selector": [ + "a[href*='logout.php']" + ], + "filters": [ + "query.length>0" + ] + } + } + }, + "userExtendInfo": { + "page": "/userdetails.php?uid=$user.id$", + "fields": { + "uploaded": { + "selector": [ + "td:contains('上传流量') + td" + ], + "filters": [ + "query.text().replace(/,/g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + }, + "downloaded": { + "selector": [ + "td:contains('下载流量') + td" + ], + "filters": [ + "query.text().replace(/,/g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + }, + "ratio": { + "selector": "td:contains('共享率') + td", + "filters": [ + "parseFloat(query.text())" + ] + }, + "levelName": { + "selector": [ + "td:contains('用户级别') + td" + ] + }, + "bonus": { + "selector": [ + "td:contains('星辰') + td" + ], + "filters": [ + "query.text().replace(/,/g,'').match(/([\\d.]+)/)", + "(query && query.length>=2)?query[1]:''" + ] + }, + "joinTime": { + "selector": [ + "td:contains('注册时间') + td" + ], + "filters": [ + "query.text().split(' (')[0]", + "dateTime(query).isValid()?dateTime(query).valueOf():query" + ] + }, + "seeding": { + "selector": [ + "a:contains('当前上传的种子')" + ], + "filters": [ + "query.text().match(/([\\d.]+)个/)", + "(query && query.length>=1)?query[1]:''" + ] + }, + "seedingSize": { + "selector": [ + "a:contains('当前上传的种子')" + ], + "filters": [ + "query.text().replace(/,/g,'').match(/共([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + } + } + } + } +} \ No newline at end of file diff --git a/resource/sites/bitpt.cn/details.js b/resource/sites/bitpt.cn/details.js new file mode 100644 index 000000000..87fe0110e --- /dev/null +++ b/resource/sites/bitpt.cn/details.js @@ -0,0 +1,59 @@ +(function ($, window) { + console.log("this is details.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + // 设置当前页面 + PTService.pageApp = this; + } + /** + * 初始化按钮列表 + */ + initButtons() { + if (this.getDownloadURL()) { + this.initDetailButtons(); + } + } + + /** + * 获取下载链接 + */ + getDownloadURL() { + let query = $("a[href*='download.php']"); + let url = ""; + if (query.length > 0) { + url = query.attr("href"); + } + if (!url) { + return ""; + } + + if (url.substr(0, 2) === '//') { + url = `${location.protocol}${url}`; + } else if (url.substr(0, 1) === "/") { + url = `${location.origin}${url}`; + } else if (url.substr(0, 4) !== "http") { + url = `${location.origin}/${url}`; + } + + if (url.indexOf("ssl=yes") === -1) { + url += "&ssl=yes" + } + + return url; + } + + /** + * 获取当前种子标题 + */ + getTitle() { + let title = $("span#thread_subject").text(); + let datas = /\"(.*?)\"/.exec(title); + if (datas && datas.length > 1) { + return datas[1] || title; + } + return title; + } + }; + (new App()).init(); +})(jQuery, window); \ No newline at end of file diff --git a/resource/sites/bitpt.cn/getSearchResult.js b/resource/sites/bitpt.cn/getSearchResult.js new file mode 100644 index 000000000..aa77ae7c4 --- /dev/null +++ b/resource/sites/bitpt.cn/getSearchResult.js @@ -0,0 +1,210 @@ +/** + * 通用搜索解析脚本 + */ +(function(options, Searcher) { + class Parser { + constructor() { + this.haveData = false; + // 判断是否已登录 + if ( + options.entry.loggedRegex && + !new RegExp(options.entry.loggedRegex, "").test(options.responseText) + ) { + // 需要登录后再搜索 + options.status = ESearchResultParseStatus.needLogin; + return; + } + + options.isLogged = true; + + this.haveData = true; + this.site = options.site; + } + + /** + * 获取搜索结果 + */ + getResult() { + if (!this.haveData) { + return []; + } + let selector = options.resultSelector; + let dataRowSelector = options.entry.dataRowSelector || "> tbody > tr"; + selector = selector.replace(dataRowSelector, ""); + // 获取数据表格 + let table = options.page.find(selector); + console.log(table) + // 获取种子列表行 + let rows = table.find(dataRowSelector); + if (rows.length == 0) { + // 没有定位到种子列表,或没有相关的种子 + options.status = ESearchResultParseStatus.torrentTableIsEmpty; + return []; + } + let subcats = options.page.find("div#subcat") + let results = []; + let beginRowIndex = options.entry.firstDataRowIndex || 0; + + // 用于定位每个字段所列的位置 + let fieldIndex = options.entry.fieldIndex || { + // 发布时间 + time: -1, + // 大小 + size: -1, + // 上传数量 + seeders: -1, + // 下载数量 + leechers: -1, + // 完成数量 + completed: -1, + // 评论数量 + comments: -1, + // 发布人 + author: -1, + // 分类 + category: -1 + }; + + try { + // 遍历数据行 + for (let index = beginRowIndex; index < rows.length; index++) { + const row = rows.eq(index); + let cells = row.find(">td"); + + // let title = this.getTitle(row, cells, fieldIndex); + let title_entry = cells.eq(fieldIndex['title']).find("a[href^='details']") + let title = title_entry.text() + // 没有获取标题时,继续下一个 + if (!title) { + continue; + } + // let link = this.getFieldValue(row, cells, fieldIndex, "link"); + let link = title_entry.attr('href') + + // 获取下载链接 + // let url = this.getFieldValue(row, cells, fieldIndex, "url"); + let url = cells.eq(fieldIndex['url']).find("a[title^='下载种子']").attr('href') + + if (!url || !link) { + continue; + } + + let data = { + title: title, + // subTitle: this.getFieldValue(row, cells, fieldIndex, "subTitle"), + subTitle: cells.eq(fieldIndex['subTitle']).find(">div:last>table>tbody>tr>td>span").text(), + link: this.getFullURL(link), + url: this.getFullURL(url), + size: this.getFieldValue(row, cells, fieldIndex, "size")+"B" || 0, + // time: this.getFieldValue(row, cells, fieldIndex, "time"), + time: cells.eq(fieldIndex['time']).find("p.add_t").text(), + author: this.getFieldValue(row, cells, fieldIndex, "author") || "", //尚未解决 + seeders: this.getFieldValue(row, cells, fieldIndex, "seeders") || 0, + leechers: + this.getFieldValue(row, cells, fieldIndex, "leechers") || 0, + completed: + this.getFieldValue(row, cells, fieldIndex, "completed") || 0, + comments: + this.getFieldValue(row, cells, fieldIndex, "comments") || 0, + site: this.site, + tags: Searcher.getRowTags(this.site, row), + entryName: options.entry.name, + // category: this.getFieldValue(row, cells, fieldIndex, "category"), + category:subcats.find("a[href='"+cells.eq(fieldIndex['category']).find("a[href^='browse']").attr('href').match(/(\?c=\d+)/)[1]+"']").text(), + progress: this.getFieldValue(row, cells, fieldIndex, "progress"), + status: this.getFieldValue(row, cells, fieldIndex, "status") + }; + results.push(data); + } + } catch (error) { + // 获取种子信息出错 + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; + } + + // 没有搜索到相关的种子 + if (results.length == 0 && !options.errorMsg) { + options.status = ESearchResultParseStatus.noTorrents; + } + + return results; + } + + /** + * 获取指定字段内容 + * @param {*} row + * @param {*} cells + * @param {*} fieldIndex + * @param {*} fieldName + */ + getFieldValue(row, cells, fieldIndex, fieldName, returnCell) { + let parent = row; + let cell = null; + if ( + cells && + fieldIndex && + fieldIndex[fieldName] !== undefined && + fieldIndex[fieldName] !== -1 + ) { + cell = cells.eq(fieldIndex[fieldName]); + parent = cell || row; + } + + let result = Searcher.getFieldValue(this.site, parent, fieldName); + + if (!result && cell) { + if (returnCell) { + return cell; + } + result = cell.text(); + } + + return result; + } + + /** + * 获取完整的URL地址 + * @param {string} url + */ + getFullURL(url) { + let URL = PTServiceFilters.parseURL(this.site.url); + if (url.substr(0, 2) === "//") { + url = `${URL.protocol}${url}`; + } else if (url.substr(0, 1) === "/") { + url = `${URL.origin}${url}`; + } else if (url.substr(0, 4) !== "http") { + url = `${URL.origin}/${url}`; + } + return url; + } + + /** + * 获取标题 + */ + getTitle(row, cells, fieldIndex) { + let title = this.getFieldValue(row, cells, fieldIndex, "title", true); + + if (!title) { + return ""; + } + + if (typeof title === "string") { + return title; + } + + // 对title进行处理,防止出现cf的email protect + let cfemail = title.find("span.__cf_email__"); + if (cfemail.length > 0) { + cfemail.each((index, el) => { + $(el).replaceWith(Searcher.cfDecodeEmail($(el).data("cfemail"))); + }); + } + + return title.text(); + } + } + + let parser = new Parser(options); + options.results = parser.getResult(); + console.log(options.results); +})(options, options.searcher); diff --git a/resource/sites/bitpt.cn/torrents.js b/resource/sites/bitpt.cn/torrents.js new file mode 100644 index 000000000..3630b3dc8 --- /dev/null +++ b/resource/sites/bitpt.cn/torrents.js @@ -0,0 +1,60 @@ +(function($) { + console.log("this is torrent.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + this.initFreeSpaceButton(); + // 设置当前页面 + PTService.pageApp = this; + } + + /** + * 初始化按钮列表 + */ + initButtons() { + this.initListButtons(); + } + + /** + * 获取下载链接 + */ + getDownloadURLs() { + let links = $("a[href*='download.php'][href*='ssl=yes']").toArray(); + let siteURL = PTService.site.url; + if (siteURL.substr(-1) != "/") { + siteURL += "/"; + } + + if (links.length == 0) { + return this.t("getDownloadURLsFailed"); //"获取下载链接失败,未能正确定位到链接"; + } + + let urls = $.map(links, item => { + let url = + $(item).attr("href") ; + if (url) { + if (url.substr(0, 1) === "/") { + url = url.substr(1); + } + url = siteURL + url; + + } + return url; + }); + + return urls; + } + + /** + * 确认大小是否超限 + */ + confirmWhenExceedSize() { + return this.confirmSize( + $(".torrents").find( + "td:contains('MB'),td:contains('GB'),td:contains('TB')" + ) + ); + } + } + new App().init(); +})(jQuery); diff --git a/resource/sites/broadcasthe.net/config.json b/resource/sites/broadcasthe.net/config.json index 253e6c8ea..8bb46bec6 100644 --- a/resource/sites/broadcasthe.net/config.json +++ b/resource/sites/broadcasthe.net/config.json @@ -98,6 +98,15 @@ ] } } + }, + "userSeedingTorrents": { + "page": "/bonus.php?action=rate", + "fields": { + "seedingList": { + "selector": ["a[href*='torrentid=']"], + "filters": ["jQuery.map(query, item=>$(item).attr('href').match(/torrentid=(\\d+)/)[1])"] + } + } } }, "supportedFeatures": { diff --git a/resource/sites/broadcasthe.net/getSearchResult.js b/resource/sites/broadcasthe.net/getSearchResult.js index a53cba11f..5d6fc3b54 100644 --- a/resource/sites/broadcasthe.net/getSearchResult.js +++ b/resource/sites/broadcasthe.net/getSearchResult.js @@ -89,6 +89,10 @@ const row = rows.eq(index); let cells = row.find(">td"); + // id + let id = row.find("a[href*='torrentid=']").first().attr("href") + id = id.match(/torrentid=(\d+)/)[1] + // 标题 let title = row.find("[style='float:none;']").first().attr("title"); @@ -112,6 +116,7 @@ let timeStr = (timeStrMatch && timeStrMatch.length >=2) ? timeStrMatch[1].trim() : ""; let data = { + id, title, link, url, diff --git a/resource/sites/bt.byr.cn/config.json b/resource/sites/byr.pt/config.json similarity index 96% rename from resource/sites/bt.byr.cn/config.json rename to resource/sites/byr.pt/config.json index 8a1fd5e22..b2b4d1e9c 100644 --- a/resource/sites/bt.byr.cn/config.json +++ b/resource/sites/byr.pt/config.json @@ -2,16 +2,19 @@ "name": "BYRBT", "timezoneOffset": "+0800", "description": "著名教育网PT站点(仅支持ipv6访问与下载),有10大类资源,资源更新快,保种好。", - "url": "https://bt.byr.cn/", - "icon": "https://bt.byr.cn/favicon.ico", + "url": "https://byr.pt/", + "icon": "https://byr.pt/favicon.ico", "tags": [ "教育网", "影视", "综合" ], "schema": "NexusPHP", - "host": "bt.byr.cn", + "host": "byr.pt", "collaborator": "Rhilip", + "formerHosts": [ + "bt.byr.cn" + ], "searchEntry": [{ "entry": "/torrents.php?search=$key$¬newword=1", "name": "全站", @@ -146,4 +149,4 @@ } ] }] -} \ No newline at end of file +} diff --git a/resource/sites/ccfbits.org/browse.js b/resource/sites/ccfbits.org/browse.js new file mode 100644 index 000000000..02b4c487e --- /dev/null +++ b/resource/sites/ccfbits.org/browse.js @@ -0,0 +1,123 @@ +(function($) { + console.log("this is browse.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + this.initFreeSpaceButton(); + // 设置当前页面 + PTService.pageApp = this; + } + + /** + * 初始化按钮列表 + */ + initButtons() { + this.initListButtons(true); + } + + /** + * 获取下载链接 + */ + getDownloadURLs() { + let links = $("a.bookmark").toArray(); + let urls = $.map(links, item => { + let id = $(item).attr("tid"); + return this.getDownloadURL(id); + }); + + if (links.length == 0) { + return "获取下载链接失败,未能正确定位到链接"; + } + + return urls; + } + + getDownloadURL(id) { + // 格式:vvvid|||passkeyzz + let key = new Base64().encode( + "vvv" + id + "|||" + PTService.site.passkey + "zz" + ); + return `https://${PTService.site.host}/rssdd.php?par=${key}&ssl=yes`; + } + + /** + * 执行指定的操作 + * @param {*} action 需要执行的执令 + * @param {*} data 附加数据 + * @return Promise + */ + call(action, data) { + return new Promise((resolve, reject) => { + switch (action) { + // 从当前的DOM中获取下载链接地址 + case PTService.action.downloadFromDroper: + this.downloadFromDroper(data, () => { + resolve(); + }); + break; + } + }); + } + + /** + * 下载拖放的种子 + * @param {*} data + * @param {*} callback + */ + downloadFromDroper(data, callback) { + if (!PTService.site.passkey) { + PTService.showNotice({ + msg: "请先设置站点密钥(Passkey)。" + }); + callback(); + return; + } + + if (typeof data === "string") { + data = { + url: data, + title: "" + }; + } + + let result = this.getDroperURL(data.url); + + if (!result) { + callback(); + return; + } + + this.sendTorrentToDefaultClient(result) + .then(result => { + callback(result); + }) + .catch(result => { + callback(result); + }); + } + + /** + * 获取有效的拖放地址 + * @param {*} url + */ + getDroperURL(url) { + let values = url.split("/"); + let id = values[values.length - 2]; + let result = this.getDownloadURL(id); + + return result; + } + + /** + * 确认大小是否超限 + */ + confirmWhenExceedSize() { + return this.confirmSize( + $("#torrent_table").find( + "td[align='center']:contains('MB'),td[align='center']:contains('GB'),td[align='center']:contains('TB')" + ) + ); + } + } + new App().init(); +})(jQuery); diff --git a/resource/sites/ccfbits.org/config.json b/resource/sites/ccfbits.org/config.json index db6fc8464..a0368dd55 100644 --- a/resource/sites/ccfbits.org/config.json +++ b/resource/sites/ccfbits.org/config.json @@ -18,7 +18,7 @@ ], "scripts": [ "/schemas/NexusPHP/common.js", - "/site/totheglory.im/details.js" + "details.js" ] }, { @@ -28,7 +28,7 @@ ], "scripts": [ "/schemas/NexusPHP/common.js", - "/site/totheglory.im/browse.js" + "browse.js" ] } ], diff --git a/resource/sites/ccfbits.org/details.js b/resource/sites/ccfbits.org/details.js new file mode 100644 index 000000000..e4863f489 --- /dev/null +++ b/resource/sites/ccfbits.org/details.js @@ -0,0 +1,62 @@ +(function ($, window) { + console.log("this is details.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + // 设置当前页面 + PTService.pageApp = this; + } + /** + * 初始化按钮列表 + */ + initButtons() { + this.showTorrentSize(); + this.initDetailButtons(); + } + + /** + * 获取下载链接 + */ + getDownloadURL() { + // 有一些扩展会为链接添加class,导致选择器失效,因此使用正则来获取链接 + // let query = $("a[href*='/dl/']:not([class])"); + let query = $("a[href*='download.php']") + + let url = ""; + if (query.length > 0) { + url = query.attr("href"); + // 直接获取的链接下载成功率很低 + // 如果设置了 passkey 则使用 rss 订阅的方式下载 + if (PTService.site.passkey) { + let values = url.split("/"); + let id = values[values.length - 2]; + + // 格式:vvvid|||passkeyzz + let key = (new Base64).encode("vvv" + id + "|||" + PTService.site.passkey + "zz"); + url = `https://${PTService.site.host}/rssdd.php?par=${key}&ssl=yes`; + } + } + + return url; + } + + showTorrentSize() { + let query = $("td[valign='top'][align='left']:contains('字节')"); + let size = ""; + if (query.length > 0) { + size = query.text().split(" (")[0]; + // attachment + PTService.addButton({ + title: "当前种子大小", + icon: "attachment", + label: size + }); + } + } + + getTitle() { + return /"(.*?)"/.exec($("title").text())[1]; + } + } + (new App()).init(); +})(jQuery, window); diff --git a/resource/sites/club.hares.top/config.json b/resource/sites/club.hares.top/config.json new file mode 100644 index 000000000..b7705fc03 --- /dev/null +++ b/resource/sites/club.hares.top/config.json @@ -0,0 +1,45 @@ +{ + "name": "HaresClub", + "timezoneOffset": "+0800", + "description": "2160p/4k 及以上的高清资源站点", + "url": "https://club.hares.top/", + "icon": "https://club.hares.top/favicon.ico", + "tags": ["影视", "纪录片","综合"], + "schema": "NexusPHP", + "host": "club.hares.top", + "collaborator": "kevgao", + "formerHosts": [], + "searchEntryConfig": { + "fieldSelector": { + "title": { + "selector": ["a[href*='details.php?id='][title]:first"], + "filters": ["query"] + }, + "subTitle": { + "selector": ["a[href*='details.php?id='][title]:first"], + "filters": ["query.parent()[0].lastChild", "query.nodeName == '#text'?$(query).text().trim():$(query.previousSibling.previousSibling.previousSibling.previousSibling).text().trim()"] + } + } + }, + "searchEntry": [{ + "name": "全部", + "enabled": true + }], + "selectors": { + "userExtendInfo": { + "merge": true, + "fields": { + "bonus": { + "selector": ["td.rowhead:contains('奶糖') + td"], + "filters": ["query.text().replace(/,/g,'')", "parseFloat(query)"] + } + } + } + }, + "plugins": [{ + "name": "官方列表", + "pages": ["/official.php"], + "scripts": ["/schemas/NexusPHP/common.js", "/schemas/NexusPHP/torrents.js"] + }], + "mergeSchemaTagSelectors": true +} \ No newline at end of file diff --git a/resource/sites/exoticaz.to/config.json b/resource/sites/exoticaz.to/config.json index 7d6fb5f1c..6c27c6c14 100644 --- a/resource/sites/exoticaz.to/config.json +++ b/resource/sites/exoticaz.to/config.json @@ -7,6 +7,14 @@ "tags": ["Adult"], "schema": "AvistaZ", "host": "exoticaz.to", + "searchEntry": [{ + "entry": "/torrents?in=1&search=$key$", + "name": "全部", + "resultType": "html", + "parseScriptFile": "getSearchResult.js", + "resultSelector": "div.table-responsive > table:first", + "enabled": true + }], "selectors": { "common": { "merge": true, diff --git a/resource/sites/exoticaz.to/getSearchResult.js b/resource/sites/exoticaz.to/getSearchResult.js new file mode 100644 index 000000000..c46c839d6 --- /dev/null +++ b/resource/sites/exoticaz.to/getSearchResult.js @@ -0,0 +1,259 @@ +(function(options, Searcher) { + class Parser { + constructor() { + this.haveData = false; + if (/\/auth\/login/.test(options.responseText)) { + options.status = ESearchResultParseStatus.needLogin; //`[${options.site.name}]需要登录后再搜索`; + return; + } + + options.isLogged = true; + + this.haveData = true; + } + + /** + * 获取搜索结果 + */ + getResult() { + if (!this.haveData) { + return []; + } + let site = options.site; + let selector = + options.resultSelector || "div.table-responsive > table:first"; + let table = options.page.find(selector); + // 获取种子列表行 + let rows = table.find("> tbody > tr"); + if (rows.length == 0) { + options.status = ESearchResultParseStatus.torrentTableIsEmpty; //`[${options.site.name}]没有定位到种子列表,或没有相关的种子`; + return []; + } + let results = []; + // 获取表头 + let header = table.find("> thead > tr > th"); + let beginRowIndex = 0; + if (header.length == 0) { + beginRowIndex = 1; + header = rows.eq(0).find("th,td"); + } + + // 用于定位每个字段所列的位置 + let fieldIndex = { + // 发布时间 + time: -1, + // 大小 + size: -1, + // 上传数量 + seeders: -1, + // 下载数量 + leechers: -1, + // 完成数量 + completed: -1, + // 评论数量 + comments: -1, + // 发布人 + author: header.length - 1, + // 分类 + category: 0, + progress: null, + status: null + }; + + if (site.url.lastIndexOf("/") != site.url.length - 1) { + site.url += "/"; + } + + // 获取字段所在的列 + for (let index = 0; index < header.length; index++) { + let cell = header.eq(index); + let text = cell.text(); + + // 评论数 + if (cell.find("a[href*='comments']").length) { + fieldIndex.comments = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 发布时间 + if (cell.find("a[href*='age']").length) { + fieldIndex.time = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 大小 + if (cell.find("a[href*='size']").length) { + fieldIndex.size = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 种子数 + if (cell.find("a[href*='seed']").length) { + fieldIndex.seeders = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 下载数 + if (cell.find("a[href*='leech']").length) { + fieldIndex.leechers = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 完成数 + if (cell.find("a[href*='complete']").length) { + fieldIndex.completed = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + + // 分类 + if (cell.is(".torrents-icon")) { + fieldIndex.category = index; + fieldIndex.author = + index == fieldIndex.author ? -1 : fieldIndex.author; + continue; + } + } + + try { + // 遍历数据行 + for (let index = beginRowIndex; index < rows.length; index++) { + const row = rows.eq(index); + let cells = row.find(">td"); + + let title = row.find("a.torrent-filename, a.torrent-link"); + if (title.length == 0) { + continue; + } + let link = title.attr("href"); + if (link && link.substr(0, 4) !== "http") { + link = `${site.url}${link}`; + } + + // 获取下载链接 + let url = row.find("a[href*='/download/torrent/']").attr("href"); + + if (url && url.substr(0, 4) !== "http") { + url = `${site.url}${url}`; + } + + let data = { + title: title.text(), + subTitle: this.getSubTitle(title, row), + link, + url: url, + size: + cells + .eq(fieldIndex.size) + .text() + .trim() || 0, + time: + fieldIndex.time == -1 + ? "" + : cells + .eq(fieldIndex.time) + .find("span[title]") + .attr("title") || + cells.eq(fieldIndex.time).text() || + "", + author: + fieldIndex.author == -1 + ? "" + : cells.eq(fieldIndex.author).text() || "", + seeders: + fieldIndex.seeders == -1 + ? "" + : cells.eq(fieldIndex.seeders).text() || 0, + leechers: + fieldIndex.leechers == -1 + ? "" + : cells.eq(fieldIndex.leechers).text() || 0, + completed: + fieldIndex.completed == -1 + ? "" + : cells.eq(fieldIndex.completed).text() || 0, + comments: + fieldIndex.comments == -1 + ? "" + : cells.eq(fieldIndex.comments).find(".tag.tag-blue").text() || 0, + site: site, + tags: Searcher.getRowTags(site, row), + entryName: options.entry.name, + category: + fieldIndex.category == -1 + ? null + : this.getCategory(cells.eq(fieldIndex.category)), + progress: this.getProgress(row, "progress"), + status: this.getStatus(row, "status") + }; + results.push(data); + } + if (results.length == 0) { + options.status = ESearchResultParseStatus.noTorrents; //`[${options.site.name}]没有搜索到相关的种子`; + } + } catch (error) { + console.log(error); + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; //`[${options.site.name}]获取种子信息出错: ${error.stack}`; + } + + return results; + } + + /** + * 获取副标题 + * @param {*} title + * @param {*} row + */ + getSubTitle(title, row) { + return ""; + } + + getProgress(row, fieldName, returnCell) { + let result =null; + if(row.attr('class').indexOf('success')!=-1) result = 100; + else if(row.attr('class').indexOf('warning')!=-1) result = 100; + else if(row.attr('class').indexOf('danger')!=-1) result = 100; + else if(row.attr('class').indexOf('info')!=-1) result = 0; + return result; + } + + getStatus(row, fieldName, returnCell) { + let result =null; + if(row.attr('class').indexOf('success')!=-1) result = 2; + else if(row.attr('class').indexOf('warning')!=-1) result = 3; + else if(row.attr('class').indexOf('danger')!=-1) result = 3; + else if(row.attr('class').indexOf('info')!=-1) result = 1; + return result; + } + /** + * 获取分类 + * @param {*} cell 当前列 + */ + getCategory(cell) { + let result = { + name: cell.find("i:first").attr("title"), + link: "" + }; + if (result.name) { + result.name = result.name.replace(" Torrent", ""); + } + return result; + } + } + + let parser = new Parser(options); + options.results = parser.getResult(); + console.log(options.results); +})(options, options.searcher); diff --git a/resource/sites/greatposterwall.com/config.json b/resource/sites/greatposterwall.com/config.json index a5110ff69..29cbd68bd 100644 --- a/resource/sites/greatposterwall.com/config.json +++ b/resource/sites/greatposterwall.com/config.json @@ -12,6 +12,17 @@ "collaborator": [ "MewX" ], + "searchEntryConfig": { + "page": "/ajax.php", + "resultType": "json", + "parseScriptFile": "getSearchResult.js", + "asyncParse": true, + "queryString": "action=browse&searchstr=$key$" + }, + "searchEntry": [{ + "name": "全部", + "enabled": true + }], "selectors": { "userSeedingTorrents": { "page": "/bonus.php?action=bprates", @@ -33,6 +44,10 @@ "query.text().replace(/,/g,'').match(/.+?([\\d.]+)/)", "(query && query.length>=2)?query[1]:0" ] + }, + "seedingList": { + "selector": ["a[href*='torrentid=']"], + "filters": ["jQuery.map(query, item=>$(item).attr('href').match(/torrentid=(\\d+)/)[1])"] } } } diff --git a/resource/sites/greatposterwall.com/getSearchResult.js b/resource/sites/greatposterwall.com/getSearchResult.js new file mode 100644 index 000000000..d237ef9e6 --- /dev/null +++ b/resource/sites/greatposterwall.com/getSearchResult.js @@ -0,0 +1,162 @@ +(function(options) { + class Parser { + constructor() { + this.haveData = false; + this.categories = {}; + if (/auth_form/.test(options.responseText)) { + options.status = ESearchResultParseStatus.needLogin; + return; + } + options.isLogged = true; + this.haveData = true; + this.authkey = ""; + this.passkey = ""; + } + + start() { + this.getAuthKey() + .then(() => { + options.resolve(this.getResult()); + }) + .catch(() => { + options.reject({ + success: false, + msg: options.searcher.getErrorMessage( + options.site, + ESearchResultParseStatus.parseError, + options.errorMsg + ), + data: { + site: options.site, + isLogged: options.isLogged + } + }); + }); + } + + /** + * 获取搜索结果 + */ + + getResult() { + if (!this.haveData) { + return []; + } + let site = options.site; + let groups = options.page.response.results; + if (groups.length == 0) { + options.status = ESearchResultParseStatus.noTorrents; + return []; + } + let results = []; + let authkey = this.authkey; + let passkey = this.passkey; + console.log("groups.length", groups.length); + try { + groups.forEach(group => { + if (group.hasOwnProperty("torrents")) { + let torrents = group.torrents; + torrents.forEach(torrent => { + let data = { + id: torrent.torrentId, + title: + group.artist + + " - " + + group.groupName + + " [" + + group.groupYear + + "] [" + + group.releaseType + + "]", + subTitle: + torrent.codec + + " / " + + torrent.source + + " / " + + torrent.resolution + + " / " + + torrent.container + + " / " + + torrent.processing + + (torrent.remasterTitle ? ` / ${torrent.remasterTitle}` : "") + + (torrent.scene ? " / Scene" : "") + + (torrent.isFreeleech || + torrent.isNeutralLeech || + torrent.isPersonalFreeleech + ? " / Freeleech" + : ""), + link: `${site.url}torrents.php?id=${group.groupId}&torrentid=${torrent.torrentId}`, + url: `${site.url}torrents.php?action=download&id=${torrent.torrentId}&authkey=${authkey}&torrent_pass=${passkey}`, + size: parseFloat(torrent.size), + time: torrent.time, + seeders: torrent.seeders, + leechers: torrent.leechers, + completed: torrent.snatches, + site: site, + entryName: options.entry.name, + category: group.releaseType + }; + results.push(data); + }); + } else { + let data = { + title: group.groupName, + link: `${site.url}torrents.php?id=${group.groupId}&torrentid=${group.torrentId}`, + url: `${site.url}torrents.php?action=download&id=${group.torrentId}&authkey=${authkey}&torrent_pass=${passkey}`, + size: parseFloat(group.size), + time: group.groupTime, + author: "", + seeders: group.seeders, + leechers: group.leechers, + completed: group.snatches, + comments: 0, + site: site, + tags: group.tags, + entryName: options.entry.name, + category: group.category + }; + results.push(data); + } + }); + console.log("results.length", results.length); + if (results.length == 0) { + options.status = ESearchResultParseStatus.noTorrents; + } + } catch (error) { + console.log(error); + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; + } + return results; + } + + /** + * 获取 AuthKey ,用于组合完整的下载链接 + */ + getAuthKey() { + const url = (options.site.activeURL + "/ajax.php?action=index") + .replace("://", "****") + .replace(/\/\//g, "/") + .replace("****", "://"); + + return new Promise((resolve, reject) => { + $.get(url) + .done(result => { + if (result && result.status === "success" && result.response) { + this.authkey = result.response.authkey; + this.passkey = result.response.passkey; + resolve(); + } else { + reject(); + } + }) + .fail(() => { + reject(); + }); + }); + } + } + + let parser = new Parser(options); + parser.start(); +})(options); diff --git a/resource/sites/hdroute.org/config.json b/resource/sites/hdroute.org/config.json index 59f7adaa6..b691652a4 100644 --- a/resource/sites/hdroute.org/config.json +++ b/resource/sites/hdroute.org/config.json @@ -100,6 +100,16 @@ "filters": ["query.next().text().match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", "(query && query.length==2)?(query[1]).sizeToNumber():0"] } } + }, + "userSeedingTorrents": { + "page": "/api.php?action=getAllPeeringInfo", + "dataType": "json", + "fields": { + "seedingList": { + "selector": ["seeding"], + "filters": ["let r=[];query.forEach(q=>{r.push(q.torrentid)});r"] + } + } } } } \ No newline at end of file diff --git a/resource/sites/hdroute.org/getSearchResult.js b/resource/sites/hdroute.org/getSearchResult.js index 391fd5484..ea8a8c434 100644 --- a/resource/sites/hdroute.org/getSearchResult.js +++ b/resource/sites/hdroute.org/getSearchResult.js @@ -42,6 +42,7 @@ let link = `${site.url}details.php?id=${id}`; let data = { + id, title: row.find(".title_chs").text(), subTitle: row.find(".title_eng").text(), link, diff --git a/resource/sites/hdtime.org/config.json b/resource/sites/hdtime.org/config.json index b8c64e899..589d67ab6 100644 --- a/resource/sites/hdtime.org/config.json +++ b/resource/sites/hdtime.org/config.json @@ -10,6 +10,26 @@ ], "schema": "NexusPHP", "host": "hdtime.org", + "searchEntryConfig": { + "fieldSelector": { + "progress": { + "selector": ["div[title*='seeding']", "div[title*='inactivity']",""], + "switchFilters": [ + ["100"], + ["query.attr('title').split(' ')", "query[1]?parseInt(query[1].substr(0,query[1].length-1)):undefined"], + ["undefined"] + ] + }, + "status": { + "selector": ["div[title*='seeding']", "div[title*='inactivity']",""], + "switchFilters": [ + ["2"], + ["3"], + ["undefined"] + ] + } + } + }, "searchEntry": [{ "name": "全站", "enabled": true diff --git a/resource/sites/orpheus.network/config.json b/resource/sites/orpheus.network/config.json index 787e631f2..3cfef8407 100644 --- a/resource/sites/orpheus.network/config.json +++ b/resource/sites/orpheus.network/config.json @@ -24,8 +24,8 @@ "filters": ["query.text().replace(/,/g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", "(query && query.length>=2)?(query[1]).sizeToNumber():0"] }, "bonus": { - "selector": ["div#content > div.header > h3"], - "filters": ["query.text().replace(/,/g,'').match(/.+?([\\d.]+)/)", "(query && query.length>=2)?query[1]:0"] + "selector": ["div#content > table > tbody > tr > td:eq(2)"], + "filters": ["query.text().replace(/,/g,'')"] } } }, diff --git a/resource/sites/passthepopcorn.me/config.json b/resource/sites/passthepopcorn.me/config.json index 28b6a8a26..05224986d 100644 --- a/resource/sites/passthepopcorn.me/config.json +++ b/resource/sites/passthepopcorn.me/config.json @@ -77,8 +77,18 @@ } } }, + "userSeedingTorrents": { + "page": "/torrents.php?type=seeding&userid=$user.id$", + "parser": "getUserSeedingTorrents.js", + "fields": { + "seedingList": { + "selector": ["script:last"], + "filters": ["query.text()", "[...query.matchAll(/\"TorrentId\":(\\d+)/g)]", "jQuery.map(query, i=>i[1])"] + } + } + }, "common": { - "page": "/torrents.php", + "page": "/torrents.php", "fields": { "confirmSize": { "selector": ["tr.basic-movie-list__torrent-row > td:contains('iB')"], diff --git a/resource/sites/passthepopcorn.me/getSearchResult.js b/resource/sites/passthepopcorn.me/getSearchResult.js index a529a2648..765127394 100644 --- a/resource/sites/passthepopcorn.me/getSearchResult.js +++ b/resource/sites/passthepopcorn.me/getSearchResult.js @@ -50,6 +50,7 @@ if (!"".getQueryString) { let row = Movies[index]; let torrent = row.Torrents[0]; let data = { + id: `${torrent.Id}`, title: row.Title + "[" + diff --git a/resource/sites/passthepopcorn.me/getUserSeedingTorrents.js b/resource/sites/passthepopcorn.me/getUserSeedingTorrents.js new file mode 100644 index 000000000..202e31912 --- /dev/null +++ b/resource/sites/passthepopcorn.me/getUserSeedingTorrents.js @@ -0,0 +1,113 @@ +(function(options, User) { + class Parser { + constructor(options, dataURL) { + this.options = options; + this.dataURL = dataURL; + this.body = null; + this.rawData = ""; + this.pageInfo = { + count: 0, + current: 1 + }; + this.result = { + seedingList: [] + }; + this.load(); + } + + /** + * 完成 + */ + done() { + this.options.resolve(this.result); + } + + /** + * 解析内容 + */ + parse() { + const doc = new DOMParser().parseFromString(this.rawData, "text/html"); + // 构造 jQuery 对象 + this.body = $(doc).find("body"); + + this.getPageInfo(); + + let results = new User.InfoParser(User.service).getResult( + this.body, + this.options.rule + ); + + if (results) { + this.result.seedingList = this.result.seedingList.concat(results.seedingList) + } + + // 是否已到最后一页 + if (this.pageInfo.current < this.pageInfo.count) { + this.pageInfo.current++; + this.load(); + } else { + this.done(); + } + } + + /** + * 获取页面相关内容 + */ + getPageInfo() { + if (this.pageInfo.count > 0) { + return; + } + // 获取最大页码 + const infos = this.body + .find("a[href*='torrents.php?page=']:contains('Last'):last") + .attr("href"); + + if (infos) { + this.pageInfo.count = parseInt(infos.getQueryString("page")); + } else { + this.pageInfo.count = 2; + } + } + + /** + * 加载当前页内容 + */ + load() { + let url = this.dataURL; + if (this.pageInfo.current > 1) { + url += "&page=" + this.pageInfo.current; + } + $.get(url) + .done(result => { + this.rawData = result; + this.parse(); + }) + .fail(() => { + this.done(); + }); + } + } + + let dataURL = options.site.activeURL + options.rule.page; + dataURL = dataURL + .replace("$user.id$", options.userInfo.id) + .replace("$user.name$", options.userInfo.name) + .replace("://", "****") + .replace(/\/\//g, "/") + .replace("****", "://"); + + new Parser(options, dataURL); +})(_options, _self); +/** + * + _options 表示当前参数 + { + site, + rule, + userInfo, + resolve, + reject + } + + _self 表示 User(/src/background/user.ts) 类实例 + */ diff --git a/resource/sites/pt.zhixing.bjtu.edu.cn/config.json b/resource/sites/pt.zhixing.bjtu.edu.cn/config.json new file mode 100644 index 000000000..e4995f762 --- /dev/null +++ b/resource/sites/pt.zhixing.bjtu.edu.cn/config.json @@ -0,0 +1,161 @@ +{ + "name": "知行PT", + "description": "北京交通大学知行pt", + "url": "http://pt.zhixing.bjtu.edu.cn/", + "icon": "http://pt.zhixing.bjtu.edu.cn/favicon.ico", + "tags": [ + "教育网", + "综合", + "影视" + ], + "plugins": [{ + "name": "种子详情页面", + "pages": ["/torrents/"], + "scripts": ["/schemas/NexusPHP/common.js", "details.js"] + }, { + "name": "种子列表", + "pages": ["/search/"], + "scripts": ["/schemas/NexusPHP/common.js", "torrents.js"] + }], + "schema": "Common", + "host": "pt.zhixing.bjtu.edu.cn", + "collaborator": "wanicca", + "searchEntryConfig": { + "page": "/search/x$key$", + "resultType": "html", + "parseScriptFile": "getSearchResult.js", + "resultSelector": "table.torrenttable:last", + "fieldIndex": { + "title": 1, + "url": 1, + "link":1, + "size":3, + "seeders": 7, + "leechers": 8, + "completed": 9, + "author": 10, + "category": 0, + "time": 6 + } + }, + "searchEntry": [ + { + "name": "全部", + "enabled": true + } + ], + "torrentTagSelectors": [ + { + "name": "Free", + "selector": "img[src^='/static/images/btn_free.gif']" + }, + { + "name": "50%", + "selector": "img[src^='/static/images/btn_50p.gif']" + }, + { + "name": "30%", + "selector": "img[src^='/static/images/btn_30p.gif']" + } + + ], + "selectors": { + "userBaseInfo": { + "page": "/", + "fields": { + "id": { + "selector": "strong.vwmy > a[href*='/user/']:first", + "attribute": "href", + "filters": [ + "query ? query.split('/')[2]:''" + ] + }, + "name": { + "selector": "strong.vwmy > a[href*='/user/']:first" + }, + "isLogged": { + "selector": [ + "a[href*='/user/logout']" + ], + "filters": [ + "query.length>0" + ] + } + } + }, + "userExtendInfo": { + "page": "/user/$user.id$/", + "fields": { + "uploaded": { + "selector": [ + "p:contains('上传流量:')" + ], + "filters": [ + "query.text().replace(/上传流量: /g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + }, + "downloaded": { + "selector": [ + "p:contains('下载流量:')" + ], + "filters": [ + "query.text().replace(/下载流量: /g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + }, + "ratio": { + "selector": "p:contains('共享率')", + "filters": [ + "parseFloat(query.text().replace(/共享率: | (下载-虚拟下载小于20G则共享率为0)/,'')" + ] + }, + "levelName": { + "selector": [ + "p:contains('用户组:')" + ], + "filters": [ + "query.text().match(/用户组:([^ ]+)/)", + "(query && query.length>=2)?(query[1]):''" + ] + }, + "bonus": { + "selector": [ + "p:contains('保种积分')" + ], + "filters": [ + "query.text().replace(/保种积分: /g,'').match(/([\\d.]+)/)", + "(query && query.length>=2)?query[1]:''" + ] + }, + "joinTime": { + "selector": [ + "p:contains('注册时间:')" + ], + "filters": [ + "query.text().split(':')[1]", + "dateTime(query).isValid()?dateTime(query).valueOf():query" + ] + }, + "seeding": { + "selector": [ + "p:contains('当前保种数量:')" + ], + "filters": [ + "query.text().match(/当前保种数量:([\\d.]+)/)", + "(query && query.length>=1)?query[1]:''" + ] + }, + "seedingSize": { + "selector": [ + "p:contains('当前保种容量:')" + ], + "filters": [ + "query.text().replace(/当前保种容量:/g,'').match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", + "(query && query.length>=2)?(query[1]).sizeToNumber():0" + ] + } + } + } + } +} \ No newline at end of file diff --git a/resource/sites/pt.zhixing.bjtu.edu.cn/details.js b/resource/sites/pt.zhixing.bjtu.edu.cn/details.js new file mode 100644 index 000000000..20f86bd95 --- /dev/null +++ b/resource/sites/pt.zhixing.bjtu.edu.cn/details.js @@ -0,0 +1,56 @@ +(function ($, window) { + console.log("this is details.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + // 设置当前页面 + PTService.pageApp = this; + } + /** + * 初始化按钮列表 + */ + initButtons() { + if (this.getDownloadURL()) { + this.initDetailButtons(); + } + } + + /** + * 获取下载链接 + */ + getDownloadURL() { + let query = $("a[href*='/download/']"); + let url = ""; + if (query.length > 0) { + url = query.attr("href"); + } + if (!url) { + return ""; + } + + if (url.substr(0, 2) === '//') { + url = `${location.protocol}${url}`; + } else if (url.substr(0, 1) === "/") { + url = `${location.origin}${url}`; + } else if (url.substr(0, 4) !== "http") { + url = `${location.origin}/${url}`; + } + + + return url; + } + + /** + * 获取当前种子标题 + */ + getTitle() { + let title = $("div.torrent-title").text(); + let datas = /\"(.*?)\"/.exec(title); + if (datas && datas.length > 1) { + return datas[1] || title; + } + return title; + } + }; + (new App()).init(); +})(jQuery, window); \ No newline at end of file diff --git a/resource/sites/pt.zhixing.bjtu.edu.cn/getSearchResult.js b/resource/sites/pt.zhixing.bjtu.edu.cn/getSearchResult.js new file mode 100644 index 000000000..c90d416a8 --- /dev/null +++ b/resource/sites/pt.zhixing.bjtu.edu.cn/getSearchResult.js @@ -0,0 +1,215 @@ +/** + * 通用搜索解析脚本 + */ +(function(options, Searcher) { + class Parser { + constructor() { + this.haveData = false; + // 判断是否已登录 + if ( + options.entry.loggedRegex && + !new RegExp(options.entry.loggedRegex, "").test(options.responseText) + ) { + // 需要登录后再搜索 + options.status = ESearchResultParseStatus.needLogin; + return; + } + + options.isLogged = true; + + this.haveData = true; + this.site = options.site; + } + + /** + * 获取搜索结果 + */ + getResult() { + if (!this.haveData) { + return []; + } + let selector = options.resultSelector; + let dataRowSelector = options.entry.dataRowSelector || "> tbody > tr"; + selector = selector.replace(dataRowSelector, ""); + // 获取数据表格 + let table = options.page.find(selector); + // 获取种子列表行 + let rows = table.find(dataRowSelector); + if (rows.length == 0) { + // 没有定位到种子列表,或没有相关的种子 + options.status = ESearchResultParseStatus.torrentTableIsEmpty; + return []; + } + let cats = options.page.find("div#tabContainer") + let results = []; + let beginRowIndex = options.entry.firstDataRowIndex || 0; + + // 用于定位每个字段所列的位置 + let fieldIndex = options.entry.fieldIndex || { + // 发布时间 + time: -1, + // 大小 + size: -1, + // 上传数量 + seeders: -1, + // 下载数量 + leechers: -1, + // 完成数量 + completed: -1, + // 评论数量 + comments: -1, + // 发布人 + author: -1, + // 分类 + category: -1 + }; + + try { + // 遍历数据行 + for (let index = beginRowIndex; index < rows.length; index++) { + const row = rows.eq(index); + let cells = row.find(">td"); + + // let title = this.getTitle(row, cells, fieldIndex); + let title_entry = cells.eq(fieldIndex['title']).find("a[href^='/torrents/']") + let title = title_entry.text() + // 没有获取标题时,继续下一个 + if (!title) { + continue; + } + // let link = this.getFieldValue(row, cells, fieldIndex, "link"); + let link = title_entry.attr('href') + + // 获取下载链接 + // let url = this.getFieldValue(row, cells, fieldIndex, "url"); + let url = link+"download/" + + if (!url || !link) { + continue; + } + + let time = cells.eq(fieldIndex['time']).text() + if(time.indexOf('-')==2){ + var d = new Date() + time = d.getFullYear().toString() + '-' + time + } + + + let data = { + title: title, + subTitle: this.getFieldValue(row, cells, fieldIndex, "subTitle"), + link: this.getFullURL(link), + url: this.getFullURL(url), + size: this.getFieldValue(row, cells, fieldIndex, "size") || 0, + // time: this.getFieldValue(row, cells, fieldIndex, "time"), + time: time, + author: this.getFieldValue(row, cells, fieldIndex, "author") || "", //尚未解决 + seeders: this.getFieldValue(row, cells, fieldIndex, "seeders") || 0, + leechers: + this.getFieldValue(row, cells, fieldIndex, "leechers") || 0, + completed: + this.getFieldValue(row, cells, fieldIndex, "completed") || 0, + comments: + this.getFieldValue(row, cells, fieldIndex, "comments") || 0, + site: this.site, + tags: Searcher.getRowTags(this.site, row), + entryName: options.entry.name, + // category: this.getFieldValue(row, cells, fieldIndex, "category"), + category:cats.find("a[href='/search/"+cells.eq(fieldIndex['category']).find(">img").attr('src').match(/catpic\/([^\.]+).png/)[1]+"/']").text(), + progress: this.getFieldValue(row, cells, fieldIndex, "progress"), + status: this.getFieldValue(row, cells, fieldIndex, "status") + }; + results.push(data); + } + } catch (error) { + // 获取种子信息出错 + options.status = ESearchResultParseStatus.parseError; + options.errorMsg = error.stack; + } + + // 没有搜索到相关的种子 + if (results.length == 0 && !options.errorMsg) { + options.status = ESearchResultParseStatus.noTorrents; + } + + return results; + } + + /** + * 获取指定字段内容 + * @param {*} row + * @param {*} cells + * @param {*} fieldIndex + * @param {*} fieldName + */ + getFieldValue(row, cells, fieldIndex, fieldName, returnCell) { + let parent = row; + let cell = null; + if ( + cells && + fieldIndex && + fieldIndex[fieldName] !== undefined && + fieldIndex[fieldName] !== -1 + ) { + cell = cells.eq(fieldIndex[fieldName]); + parent = cell || row; + } + + let result = Searcher.getFieldValue(this.site, parent, fieldName); + + if (!result && cell) { + if (returnCell) { + return cell; + } + result = cell.text(); + } + + return result; + } + + /** + * 获取完整的URL地址 + * @param {string} url + */ + getFullURL(url) { + let URL = PTServiceFilters.parseURL(this.site.url); + if (url.substr(0, 2) === "//") { + url = `${URL.protocol}${url}`; + } else if (url.substr(0, 1) === "/") { + url = `${URL.origin}${url}`; + } else if (url.substr(0, 4) !== "http") { + url = `${URL.origin}/${url}`; + } + return url; + } + + /** + * 获取标题 + */ + getTitle(row, cells, fieldIndex) { + let title = this.getFieldValue(row, cells, fieldIndex, "title", true); + + if (!title) { + return ""; + } + + if (typeof title === "string") { + return title; + } + + // 对title进行处理,防止出现cf的email protect + let cfemail = title.find("span.__cf_email__"); + if (cfemail.length > 0) { + cfemail.each((index, el) => { + $(el).replaceWith(Searcher.cfDecodeEmail($(el).data("cfemail"))); + }); + } + + return title.text(); + } + } + + let parser = new Parser(options); + options.results = parser.getResult(); + console.log(options.results); +})(options, options.searcher); diff --git a/resource/sites/pt.zhixing.bjtu.edu.cn/torrents.js b/resource/sites/pt.zhixing.bjtu.edu.cn/torrents.js new file mode 100644 index 000000000..af4d61e83 --- /dev/null +++ b/resource/sites/pt.zhixing.bjtu.edu.cn/torrents.js @@ -0,0 +1,60 @@ +(function($) { + console.log("this is torrent.js"); + class App extends window.NexusPHPCommon { + init() { + this.initButtons(); + this.initFreeSpaceButton(); + // 设置当前页面 + PTService.pageApp = this; + } + + /** + * 初始化按钮列表 + */ + initButtons() { + this.initListButtons(); + } + + /** + * 获取下载链接 + */ + getDownloadURLs() { + let links = $("a[href^='/torrents/']").toArray(); + let siteURL = PTService.site.url; + if (siteURL.substr(-1) != "/") { + siteURL += "/"; + } + + if (links.length == 0) { + return this.t("getDownloadURLsFailed"); //"获取下载链接失败,未能正确定位到链接"; + } + + let urls = $.map(links, item => { + let url = + $(item).attr("href")+"download/" ; + if (url) { + if (url.substr(0, 1) === "/") { + url = url.substr(1); + } + url = siteURL + url; + + } + return url; + }); + + return urls; + } + + /** + * 确认大小是否超限 + */ + confirmWhenExceedSize() { + return this.confirmSize( + $(".torrents").find( + "td:contains('MB'),td:contains('GB'),td:contains('TB')" + ) + ); + } + } + new App().init(); +})(jQuery); diff --git a/resource/sites/pthome.net/config.json b/resource/sites/pthome.net/config.json index 04fc664f3..224df6463 100644 --- a/resource/sites/pthome.net/config.json +++ b/resource/sites/pthome.net/config.json @@ -14,10 +14,9 @@ "filters": ["query.text()=='-'?null:query.text()"] }, "status": { - "selector": [".torrents-progress", ".torrents-progress2"], + "selector": [".torrents-progress"], "switchFilters": [ - ["query.attr('style').indexOf('100%')!=-1?2:3"], - ["255"] + ["query.attr('style').indexOf('100%')!=-1?255:3"] ] } } diff --git a/resource/sites/teamhd.org/config.json b/resource/sites/teamhd.org/config.json index aa1e5a8c2..6879da004 100644 --- a/resource/sites/teamhd.org/config.json +++ b/resource/sites/teamhd.org/config.json @@ -62,20 +62,12 @@ "filters": ["query.text().split('|')[1]"] }, "progress": { - "selector": ["td.ttable_seeding font[color='green'], td.ttable_seeding font[color='black']", "td.ttable_seeding font[color='#ff0000']", ""], - "switchFilters": [ - ["query.length > 0 ? 100:null"], - ["query.length > 0 ? 0:null"], - ["null"] - ] + "selector": ["div.seeder"], + "filters": ["query.length>0?100:undefined"] }, "status": { - "selector": ["td.ttable_seeding font[color='green']", "td.ttable_seeding font[color='black']", "td.ttable_seeding font[color='#ff0000']"], - "switchFilters": [ - ["2"], - ["255"], - ["1"] - ] + "selector": ["div.seeder"], + "filters": ["query.length>0?2:undefined"] } } }, @@ -119,7 +111,8 @@ "filters": ["$(query[0].nextSibling).text()"] }, "bonus": { - "selector": ["a.online[href='/mybonus.php']"] + "selector": ["a.online[href='/mybonus.php']"], + "filters": ["parseFloat(query.text().replaceAll(' ',''))"] } } }, @@ -128,19 +121,39 @@ "fields": { "joinTime": { "selector": ["#profile_right > table.inlay > tbody > tr:nth-child(1) > td:nth-child(2)"], - "filters": ["dateTime(query.text().split('(')[0]).valueOf()"] + "filters": [ + "query.text().split('(')[0].trim()", + "query.replace('января', 'January')", + "query.replace('февраля', 'February')", + "query.replace('марта', 'March')", + "query.replace('апреля', 'April')", + "query.replace('мая', 'May')", + "query.replace('июня', 'June')", + "query.replace('июля', 'July')", + "query.replace('августа', 'August')", + "query.replace('сентября', 'September')", + "query.replace('октября', 'October')", + "query.replace('ноября', 'November')", + "query.replace('декабря', 'December')", + "dateTime(query).valueOf()" + ] }, "levelName": { "selector": ["#profile_left > table > tbody > tr > td:nth-child(2) > p:nth-child(1) > u > span"], "filters": ["query.text()"] - }, + } + } + }, + "userSeedingTorrents": { + "page": "/bprate.php", + "fields": { "seeding": { - "selector": ["img[title='Distributes'] + font > font"], - "filters": ["query.text().match(/(\\d+)/)", "(query && query.length>=2)?parseInt(query[1]):0"] + "selector": ["table.table:first > tbody > tr > td:nth-child(1)"], + "filters": ["parseInt(query.text())"] }, "seedingSize": { - "selector": [""], - "filters": [""] + "selector": ["table.table:first > tbody > tr > td:nth-child(2)"], + "filters": ["_self.getTotalSize([query.text()])"] } } }, diff --git a/resource/sites/tjupt.org/config.json b/resource/sites/tjupt.org/config.json index 2453abd97..8c5100d45 100644 --- a/resource/sites/tjupt.org/config.json +++ b/resource/sites/tjupt.org/config.json @@ -142,6 +142,28 @@ } }, "selectors": { + "userExtendInfo": { + "merge": true, + "fields": { + "uploaded": { + "selector": [".color_uploaded"], + "filters": ["$(query[0].nextSibling).text().trim().sizeToNumber()"] + } + } + }, + "userSeedingTorrents": { + "merge": true, + "fields": { + "seeding": { + "selector": ["b:first"], + "filters": ["query.text().trim()"] + }, + "seedingSize": { + "selector": ["b:first"], + "filters": ["$(query[0].nextSibling).text().trim().match(/([\\d.]+ ?[ZEPTGMK]?i?B)/)", "(query && query.length==2)?(query[0]).sizeToNumber():0"] + } + } + }, "/details.php": { "merge": true, "fields": { diff --git a/resource/sites/uhdbits.org/config.json b/resource/sites/uhdbits.org/config.json index afc68cb58..87cc2bfcd 100644 --- a/resource/sites/uhdbits.org/config.json +++ b/resource/sites/uhdbits.org/config.json @@ -70,6 +70,10 @@ "seedingSize": { "selector": ["td.number_column.nobr"], "filters": ["jQuery.map(query, (item)=>{return $(item).text();})", "_self.getTotalSize(query)"] + }, + "seedingList": { + "selector": ["a[href*='torrentid=']"], + "filters": ["jQuery.map(query, item=>$(item).attr('href').match(/torrentid=(\\d+)/)[1])"] } } } diff --git a/resource/sites/uhdbits.org/getSearchResult.js b/resource/sites/uhdbits.org/getSearchResult.js index e22d47b1a..38d5012d2 100644 --- a/resource/sites/uhdbits.org/getSearchResult.js +++ b/resource/sites/uhdbits.org/getSearchResult.js @@ -72,6 +72,9 @@ if (!"".getQueryString) { const row = rows.eq(index); let cells = row.find(">td"); + let id = row.find("a[href*='#torrent']").first() + id = id.attr('href').match(/#torrent(\d+)/)[1] + let title = row.find("a[href*='torrents.php?id=']").first(); if (title.length == 0) { continue; @@ -113,6 +116,7 @@ if (!"".getQueryString) { } let data = { + id, title: title.text() + ' / ' +subTitle.text(), //subTitle: subTitle.text(), link, diff --git a/resource/sites/uhdbits.org/getUserSeedingTorrents.js b/resource/sites/uhdbits.org/getUserSeedingTorrents.js index 3107348f4..655d98b89 100644 --- a/resource/sites/uhdbits.org/getUserSeedingTorrents.js +++ b/resource/sites/uhdbits.org/getUserSeedingTorrents.js @@ -23,7 +23,8 @@ if ("".getQueryString === undefined) { }; this.result = { seedingSize: 0, - bonus: 0 + bonus: 0, + seedingList: [] }; this.load(); } @@ -52,6 +53,7 @@ if ("".getQueryString === undefined) { if (results) { this.result.seedingSize += results.seedingSize; + this.result.seedingList = this.result.seedingList.concat(results.seedingList) } // 是否已到最后一页 diff --git a/resource/sites/www.haidan.video/config.json b/resource/sites/www.haidan.video/config.json index ea5d4701e..abc264a54 100644 --- a/resource/sites/www.haidan.video/config.json +++ b/resource/sites/www.haidan.video/config.json @@ -3,7 +3,7 @@ "schema": "NexusPHP", "url": "https://www.haidan.video/", "description": "海胆之家", - "icon": "https://www.haidan.video/favicon.ico", + "icon": "https://www.haidan.video/public/pic/favicon.ico", "tags": [ "影视", "综合" ], "host": "www.haidan.video", "collaborator": "rsj", @@ -119,4 +119,4 @@ "color": "black", "selector": "img[src='public/pic/hit_run.gif']" }] -} \ No newline at end of file +} diff --git a/src/background/searcher.ts b/src/background/searcher.ts index 9b5ae6729..78c82945a 100644 --- a/src/background/searcher.ts +++ b/src/background/searcher.ts @@ -546,7 +546,7 @@ export class Searcher { return new Promise((resolve?: any, reject?: any) => { this.searchRequestQueue[url] = $.ajax({ url: url, - cache: false, + cache: ['AvistaZ'].includes(site.schema), dataType: "text", contentType: "text/plain", timeout: this.options.connectClientTimeout || 30000, @@ -594,7 +594,8 @@ export class Searcher { ), data: { logId - } + }, + type: EDataResultType.error }); return; } diff --git a/src/interface/common.ts b/src/interface/common.ts index 5e4e2fdee..a94148036 100644 --- a/src/interface/common.ts +++ b/src/interface/common.ts @@ -340,6 +340,7 @@ export interface SearchResultItemCategory { * 搜索返回结果 */ export interface SearchResultItem { + id?: string; site: Site; title: string; titleHTML?: string; @@ -522,6 +523,8 @@ export interface UserInfo { seeding?: number; // 做种体积 seedingSize?: number; + // 做种列表 + seedingList?: string[]; // 当前下载数量 leeching?: number; // 等级名称 diff --git a/src/options/views/search/SearchTorrent.ts b/src/options/views/search/SearchTorrent.ts index 4f7b06969..0918016c1 100644 --- a/src/options/views/search/SearchTorrent.ts +++ b/src/options/views/search/SearchTorrent.ts @@ -843,6 +843,18 @@ export default Vue.extend({ } } + if (!item.progress && !item.status) { + // 对比用户信息的seedingList修改做种状态信息 + if (item.site && item.site.user && item.site.user.seedingList) { + let seedingList = item.site.user.seedingList; + let seeding = seedingList.some(id => item.id && item.id == id); + if (seeding) { + item.progress = 100; + item.status = 2; + } + } + } + if (dayjs(item.time).isValid()) { let val: number | string = item.time + ""; // 标准时间戳需要 * 1000 @@ -1726,7 +1738,7 @@ export default Vue.extend({ let end = this.lastCheckedIndex; let startIndex = Math.min(start, end); let endIndex = Math.max(start, end) + 1; - let datas = this.clone(this.datas); + let datas = this.clone(this.filteredDatas.length > 0 ? this.filteredDatas : this.datas); datas = datas.sort( this.arrayObjectSort( diff --git a/webpack/prod-background.js b/webpack/prod-background.js index afda649a7..8773eb538 100644 --- a/webpack/prod-background.js +++ b/webpack/prod-background.js @@ -2,7 +2,7 @@ const merge = require("webpack-merge"); const common = require("./common.js"); const path = require("path"); const CopyWebpackPlugin = require("copy-webpack-plugin"); -const ucid = require("unique-commit-id"); +const gitCommitId = require('git-commit-id'); // 用于替换 @ 符号的路径 function resolve(dir) { @@ -32,7 +32,7 @@ module.exports = merge(common, { to: path.join(resolve('dist'), "manifest.json"), transform (content, path) { var manifest = JSON.parse(content.toString()); - manifest.version_name = `${manifest.version}.${ucid.latest()}`; // ex: '01ef00a' + manifest.version_name = `${manifest.version}.${gitCommitId().slice(0, 7)}`; // ex: '01ef00a' return JSON.stringify(manifest); } } diff --git a/yarn.lock b/yarn.lock index d1ec7276f..431b4095a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,7 +14,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== -"@babel/core@^7.0.0", "@babel/core@^7.7.5": +"@babel/core@^7.0.0": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" integrity sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q== @@ -735,22 +735,6 @@ cssnano-preset-default "^4.0.0" postcss "^7.0.0" -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -913,11 +897,6 @@ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.2.tgz#8db514b059c1b2ae14ce9d7bb325296de6a9a0fa" integrity sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw== -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -1434,11 +1413,6 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -1506,7 +1480,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1, anymatch@~3.1.2: +anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1514,13 +1488,6 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1560,11 +1527,6 @@ archiver@^3.0.3, archiver@^3.1.1: tar-stream "^2.1.0" zip-stream "^2.1.2" -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1577,11 +1539,6 @@ argparse@^1.0.7: 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== - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1654,11 +1611,6 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1994,11 +1946,6 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -2218,16 +2165,6 @@ cache-loader@^2.0.1: normalize-path "^3.0.0" schema-utils "^1.0.0" -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.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" @@ -2290,16 +2227,11 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.0.0: 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.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -2330,18 +2262,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai@^4.2.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.1" - type-detect "^4.0.5" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2380,31 +2300,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - check-types@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" @@ -2543,15 +2443,6 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3179,13 +3070,6 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -3219,11 +3103,6 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -3236,13 +3115,6 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - deep-equal@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -3280,13 +3152,6 @@ default-gateway@^5.0.2: dependencies: execa "^3.3.0" -default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== - dependencies: - strip-bom "^4.0.0" - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -3369,11 +3234,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -3678,11 +3538,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3693,11 +3548,6 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0: - version "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.2, 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" @@ -4271,7 +4121,7 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: +find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -4280,14 +4130,6 @@ find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4310,7 +4152,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -4347,11 +4189,6 @@ flat-cache@^2.0.1: 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" @@ -4382,14 +4219,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4441,11 +4270,6 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -4490,7 +4314,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.3.1, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -4515,11 +4339,6 @@ get-caller-file@^2.0.1, get-caller-file@^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-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -4529,11 +4348,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - get-stdin@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" @@ -4570,6 +4384,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-commit-id@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/git-commit-id/-/git-commit-id-2.0.1.tgz#fe6cf5caa34579a33da8f6ba53552248b93b2bef" + integrity sha512-ltEuT5LdiSLK0dc0S8cOWF97mmsQO81KrajzPpNZmCnynXyn6AJklJNVOpNKwcG6Lq2Vp/d/y7DDTkrRFDW9YQ== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -4578,7 +4397,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@~5.1.0, 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== @@ -4590,18 +4409,6 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" @@ -4714,11 +4521,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -4832,15 +4634,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -he@1.2.0, he@1.2.x, he@^1.1.0: +he@1.2.x, he@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -4921,11 +4715,6 @@ html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - html-minifier@^3.2.3: version "3.5.21" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" @@ -5500,11 +5289,6 @@ is-plain-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -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-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -5557,7 +5341,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.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= @@ -5606,67 +5390,6 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" - integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.0" - istanbul-lib-coverage "^3.0.0-alpha.1" - make-dir "^3.0.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^3.3.3" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - javascript-stringify@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3" @@ -5707,13 +5430,6 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -5958,13 +5674,6 @@ locate-path@^5.0.0: 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" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -5995,11 +5704,6 @@ lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -6045,13 +5749,6 @@ lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -6119,7 +5816,7 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -6299,7 +5996,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@^3.0.2, 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== @@ -6391,37 +6088,6 @@ mkdirp@~1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mocha@^8.0.1: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6454,7 +6120,7 @@ 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.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6491,11 +6157,6 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6583,13 +6244,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - node-releases@^1.1.71: version "1.1.73" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" @@ -6682,39 +6336,6 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -6921,13 +6542,6 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: 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" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - 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" @@ -6949,13 +6563,6 @@ p-locate@^4.1.0: 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" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -6985,16 +6592,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -7165,11 +6762,6 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - pbf@^3.2.0, pbf@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" @@ -7648,13 +7240,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -7864,13 +7449,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7957,13 +7535,6 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= - dependencies: - es6-error "^4.0.1" - 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" @@ -8095,11 +7666,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-protobuf-schema@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" @@ -8162,13 +7728,6 @@ rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: dependencies: glob "^7.1.3" -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -8336,13 +7895,6 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - serialize-javascript@^1.4.0, serialize-javascript@^1.7.0: version "1.9.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" @@ -8619,18 +8171,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -8794,7 +8334,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, 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" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8896,11 +8436,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -8916,11 +8451,6 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -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== - strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -8958,13 +8488,6 @@ stylus@^0.54.5: semver "^6.3.0" source-map "^0.7.3" -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -9092,15 +8615,6 @@ terser@^4.1.2, terser@^4.6.12: source-map "~0.6.1" source-map-support "~0.5.12" -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -9318,21 +8832,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - 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.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -9341,13 +8845,6 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9461,15 +8958,6 @@ uniqs@^2.0.0: resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= -unique-commit-id@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-commit-id/-/unique-commit-id-1.0.0.tgz#9d68e623ecea86a682a2d669b998270185996ff1" - integrity sha512-CEvpuUxJ/PLtFQyPzIW2T0Ibv53dFOrOTjAH+hgxgKs/H/lxXp2RaIpz+MQoKOt67NY1VDWcGchP61Wxo+oAkA== - dependencies: - chai "^4.2.0" - mocha "^8.0.1" - nyc "^15.1.0" - unique-filename@^1.1.0, unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -9623,7 +9111,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: +uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -10004,13 +9492,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@2.0.2, which@^2.0.1: - 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" - which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -10018,12 +9499,12 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" word-wrap@~1.2.3: version "1.2.3" @@ -10037,11 +9518,6 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -10051,15 +9527,6 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -10074,16 +9541,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -10148,11 +9605,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -10161,42 +9613,11 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - 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== -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -10213,22 +9634,18 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" + y18n "^5.0.5" + yargs-parser "^20.2.2" yazl@^2.5.1: version "2.5.1" @@ -10242,11 +9659,6 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - yorkie@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"