diff --git a/.gitignore b/.gitignore index 5fb4776..8d25863 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -# Patches -*.patch - # Logs logs *.log @@ -9,10 +6,11 @@ yarn-debug.log* yarn-error.log* # Ignore config -config.js +/config.js -# Ignore localstorage -keys +# Ignore JSON +/timeline.json +/notification.json # Runtime data pids diff --git a/README.md b/README.md index 1d07ae4..b913264 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,34 @@ -# ligh7hau5 - -The ligh7hau5 project is used on the Matrix protocol to communicate with the Fediverse. It is also used to proxy popular media networks(Twitter, YouTube, etc) to alternative front ends(Nitter, Invidious, etc). This repository can be ran locally, as on a RPi, or on a VPS. -# Archive (+archive URL) - -This command will send a given URL to archive.is, and return an archive.is URL. This can be beneficial in two ways. One, archive.is receives your traffic instead of the URL that you wish to archive. Two, you are creating a historical context of a given URL with a dated attribute. Additionally, if there are changes that have occurred on a page, since the time of last archive, you can also use the rearchive(+rearchive URL) command. If you wish to use a different archiver, this can be configured, see the config.example.js file. -# Social Media (+proxy URL) - -This command is given a Twitter or YouTube post, and then returned a respective Nitter/Invidious URL. Additionally, some data is returned about what the URL is, such as: title, description, etc. Instances can also be configured like in the above, see the config.example.js file. -# Fediverse - -The ligh7hau5 works as a lite client for the Fediverse. It was built to communicate with a Pleroma instance, but it most likely works on Mastodon as well. Assuming you already have a registered account in regards to the bot, just change the config.js file and fediverse_auth.json will fill out once the bot starts. - -Commands for the Fediverse include: - -`+flood : turn on timeline in channel` - -`+notify : show notifications in channel` - -`+post : post` - -`+reply : reply to message` - -`+media : post media` - -`+redact : delete post` - -`+follow : follow` - -`+unfollow : unfollow` - -`+copy : repeat/repost/retweet` - -`+clap : favorite` - -`+boo : unfavorite` +# Plemara +Plemara acts as a [Matrix](https://matrix.org/docs/spec/) bridge to the Fediverse. This application should allow you to do most actions on the Fediverse including livefeed, posting, subscribing, etc. via Matrix. Configuration for the app can be found in [config.js](https://github.com/vulet/plemara/blob/master/config.js). You will need to provide a Matrix username and password for the bridge to work, this can be done through an account made on @matrix.org, or your own homeserver. For the Fediverse side, you will need an access_token, this can be created through the CURL steps below. You would replace `fediverse.site` with where you would like to run the bridge from. # Installation - -First, set up your config.js file, you can see config.example.js as an example. The Matrix & Fediverse login information is then used to populate keys/matrix_auth and keys/fediverse_auth during your initial login. These tokens are then used on sequential logins. - -1. `git clone https://github.com/vulet/ligh7hau5` -2. `cd ligh7hau5 && yarn install` +1. `git clone https://github.com/vulet/plemara` +2. `cd plemara && yarn install` 3. `node main.js` +# Generating an access_token +1. `curl -X POST -d "client_name=&redirect_uris=urn:ietf:wg:oauth:2.0:oob&scopes=write follow read&website=http://fediverse.site" https://fediverse.site/api/v1/apps` -# Contributors -CryptoMooners +Result: +```json +{"client_id":"result", +"client_secret":"result", +"id":"result", +"name":"result", +"redirect_uri":"urn:ietf:wg:oauth:2.0:oob", +"website":"http://fediverse.site", +"vapid_key":"vapid_key"} +``` + +2. `curl -X POST -d "client_id=sekret&client_secret=sekret&scope=write follow read&grant_type=password&username=sekret@email.com&password=sekret" https://fediverse.site/oauth/token` + +Result: +```json +{"token_type":"Bearer", +"scope":"write read", +"me":"https://fediverse.site/users/", +"access_token":"result"} +``` + +The access_token from the above command is then stored in the [config.js](https://github.com/vulet/plemara/blob/master/config.js) file. +# Images +![Bridge](https://civseed.com/_matrix/media/v1/download/civseed.com/wwLEtYGUUfYanovmSSAxdTJI) \ No newline at end of file diff --git a/auth.js b/auth.js deleted file mode 100644 index 4c1e216..0000000 --- a/auth.js +++ /dev/null @@ -1,113 +0,0 @@ -const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store'); -const matrixTokenLogin = async () => { - matrixClient = sdk.createClient({ - baseUrl: config.matrix.domain, - accessToken: matrix.auth.access_token, - userId: matrix.auth.user_id, - deviceId: matrix.auth.device_id, - cryptoStore: new LocalStorageCryptoStore(localStorage), - }); - matrixClient.initCrypto() - .then(() => { - if (!localStorage.getItem('crypto.device_data')) { - return console.log( - '====================================================\n' - + 'New OLM Encryption Keys created, please restart ligh7hau5.\n' - + '====================================================', - ); - } - matrixClient.setGlobalErrorOnUnknownDevices(config.matrix.manualVerify); - matrixClient.startClient(); - }); -}; - -module.exports.matrixTokenLogin = matrixTokenLogin; - -module.exports.getMatrixToken = async () => { - matrixClient = sdk.createClient({ baseUrl: config.matrix.domain }); - matrixClient.loginWithPassword(config.matrix.user, config.matrix.password) - .then((response) => { - matrix.auth = { - user_id: response.user_id, - access_token: response.access_token, - device_id: response.device_id, - }; - localStorage.setItem('matrix_auth', JSON.stringify(response, null, 2)); - }).then(() => matrixTokenLogin()) - .catch((e) => { - console.log(e); - }); -}; - -const getFediverseLink = (domain,roomId) => { - let apps = {} - apps = JSON.parse(localStorage.getItem("apps")); - if(!apps[domain]){ - axios.post(`https://${domain}/api/v1/apps`, - { - client_name: config.fediverse.client_name, - redirect_uris: 'urn:ietf:wg:oauth:2.0:oob', - scopes: 'read write follow push', - }) - .then((response) => { - console.log(response.data) - if(!response.data.client_id || !response.data.client_secret) return false; - apps[domain] = { - client_id: response.data.client_id, - client_secret: response.data.client_secret - } - localStorage.setItem("apps",JSON.stringify(apps)) - matrixClient.sendHtmlNotice(roomId,"Приложение зарегистрировано. Введите команду еще раз для создания ссылки") - // return getFediverseLink(domain) - }).catch((e) => { - console.log(e); - }); - }else{ - const app = apps[domain] - const uri = "urn:ietf:wg:oauth:2.0:oob".replace(/:/g,"%3A") - const scope = "read write follow push".replace(/ /g,"%20") - return `https://${domain}/oauth/authorize?client_id=${app.client_id}&response_type=code&redirect_uri=${uri}&scope=${scope}` - } - return "nothing" -}; - -const obtainAccessToken = (domain,code,event) => { - const apps = JSON.parse(localStorage.getItem("apps")); - console.log(domain,code) - const app = apps[domain]; - axios.post(`https://${domain}/oauth/token`, { - client_id: app.client_id, - client_secret: app.client_secret, - redirect_uri: "urn:ietf:wg:oauth:2.0:oob", - grant_type: "authorization_code", - code: code, - scopes: "read write follow push" - }).then(response => { - if(!response.data.access_token) return console.log(response.data) - fediverse.auth[event.getSender()] = { - domain: domain, - access_token: response.data.access_token - } - localStorage.setItem("fediverse_auth", JSON.stringify(fediverse.auth)) - getFediverseUserInfo(event) - }).catch(e => console.error(e)) -} - -const getFediverseUserInfo = (event) => { - const user = event.getSender() - axios({ - method: "GET", - url: `https://${fediverse.auth[user].domain}/api/v1/accounts/verify_credentials`, - headers: { - Authorization: `Bearer ${fediverse.auth[user].access_token}` - } - }).then(response => { - if(response.data.username){ - matrixClient.sendHtmlNotice(event.getRoomId(), `Успешный вход в аккаунт ${response.data.display_name || response.data.username} (@${response.data.username}@${fediverse.auth[user].domain})`) - }else{ - console.log(response.data) - } - }).catch(e => console.error(e)) -} -module.exports.getFediverseLink = getFediverseLink; -module.exports.obtainAccessToken = obtainAccessToken; \ No newline at end of file diff --git a/commands/archive.js b/commands/archive.js deleted file mode 100644 index 7e625ac..0000000 --- a/commands/archive.js +++ /dev/null @@ -1,78 +0,0 @@ -const { JSDOM } = require('jsdom'); -const qs = require('qs'); -const https = require('https'); - -const sleep = ms => new Promise(r => setTimeout(r, ms)); - -const headers = ({ domain, userAgent }) => ({ - 'Host': `${domain}`, - 'User-Agent': `${userAgent}` -}); - -const archive = async (instance, url, rearchive) => { - const form = await instance({ method: 'GET', url: '/' }); - if (form.statusText !== 'OK') throw form; - const submitId = form.data.match(/name="submitid" value="([^"]+)/); - const submit = await instance({ - method: 'POST', - url: '/submit/', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - data: qs.stringify({ anyway: rearchive ? '1' : undefined, submitid: submitId ? submitId[1] : undefined, url }) - }); - submit.title = new JSDOM(submit.data).window.document.title; - if (submit.statusText !== 'OK') throw submit; - if (submit.request.path !== '/submit/') - return { id: submit.request.path, date: submit.headers['memento-datetime'], title: submit.title }; - if (submit.headers.refresh) - return { refresh: submit.headers.refresh.split(';url=')[1] }; - throw submit; -}; - -const reqStr = str => `Sending archive request for ${str}`; -const arc1Str = str => `Archiving page ${str}`; -const arc2Str = (str, title, date) => `Archived page ${str} [${date}]
${title}`; -const arc3Str = str => `Timed out ${str}`; - -const run = async (roomId, userInput, rearchive) => { - const instance = axios.create({ - baseURL: `https://${config.archive.domain}`, - httpsAgent: https.Agent({ maxVersion: "TLSv1.2"}), - headers: headers(config.archive), - transformResponse: [], - timeout: 10 * 1000 - }); - - let reply = null; - try { - reply = await matrixClient.sendHtmlNotice(roomId, ' ', reqStr(userInput)); - const { refresh, id, title, date } = await archive(instance, userInput, rearchive); - if (id) - return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); - if (refresh) { - const path = refresh.split(`https://${config.archive.domain}`); - if (!path[1]) throw refresh; - await matrix.utils.editNoticeHTML(roomId, reply, arc1Str(refresh)); - let tries = 30; - while (tries--) { - await sleep(10000); - const { title, date, id } = await archive(instance, userInput); - if (rearchive == false && title !== undefined) - return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${id}`, title, date)); - const { request: { path: reqPath }, headers: { 'memento-datetime': rearchiveDate } } = await instance({ method: 'HEAD', url: path[1] }) - .catch(e => ({ request: { path: path[1] } })); - if (rearchive == true && reqPath !== path[1]) - return await matrix.utils.editNoticeHTML(roomId, reply, arc2Str(`${config.archive.domain}${reqPath}`, title, rearchiveDate)); - } - return await matrix.utils.editNoticeHTML(roomId, reply, arc3Str(refresh)); - } - throw 'sad'; - } catch (e) { - const sad = `Sad!
${`${e}`.replace(/<[^<]+?>/g, '').substr(0, 100)}`; - if (reply) - matrix.utils.editNoticeHTML(roomId, reply, sad, 'sad').catch(() => {}); - else - matrixClient.sendHtmlNotice(roomId, 'sad', sad).catch(() => {}); - } -}; - -exports.runQuery = run; diff --git a/commands/beg.js b/commands/beg.js new file mode 100644 index 0000000..0ddc0e2 --- /dev/null +++ b/commands/beg.js @@ -0,0 +1,21 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + data: { status: `@10grans@fedi.cc beg` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` +
You have begged for 10grans.
+ (id: ${response.data.id}
) +

`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; \ No newline at end of file diff --git a/commands/boo.js b/commands/boo.js new file mode 100644 index 0000000..0801ac2 --- /dev/null +++ b/commands/boo.js @@ -0,0 +1,18 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/unfavourite`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `You have boo'd: ${response.data.account.acct} +
${response.data.content}`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/clap.js b/commands/clap.js new file mode 100644 index 0000000..ea47753 --- /dev/null +++ b/commands/clap.js @@ -0,0 +1,18 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/favourite`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `You have clapped: ${response.data.account.acct}: +
${response.data.content}`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/copy.js b/commands/copy.js new file mode 100644 index 0000000..1768cb6 --- /dev/null +++ b/commands/copy.js @@ -0,0 +1,18 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/reblog`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `You have repeated: +
${response.data.content}`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/expand.js b/commands/expand.js deleted file mode 100644 index f327bcb..0000000 --- a/commands/expand.js +++ /dev/null @@ -1,9 +0,0 @@ -exports.runQuery = async (roomId, event, userInput) => { - return matrix.utils.fetchEncryptedOrNot(roomId, { event_id: userInput }) - .then(event => matrix.utils.expandReact(event)) - .catch(e => { - matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!') - }) - .catch(() => {}); - }; - diff --git a/commands/fediverse/auth.js b/commands/fediverse/auth.js deleted file mode 100644 index 292d5dc..0000000 --- a/commands/fediverse/auth.js +++ /dev/null @@ -1,12 +0,0 @@ -exports.runQuery = (roomId,event,userInput) => { - - //matrixClient.sendHtmlNotice(roomId,"Проверка связи","Проверка связи"); - const link = auth.getFediverseLink(userInput) - if(!link){ - matrixClient.sendHtmlNotice(roomId,"Не удалось получить ссылку") - }else if(link == "nothing"){ - }else{ - authEvents.push(event.event_id) - matrixClient.sendHtmlNotice(roomId,`Перейдите по ссылке для входа в аккаунт. Для завершения ответьте на это сообщение кодом (еще не готово, пж не переходе по ссылке): ${link}`) - } -} \ No newline at end of file diff --git a/commands/fediverse/boo.js b/commands/fediverse/boo.js deleted file mode 100644 index 3296b2d..0000000 --- a/commands/fediverse/boo.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unfavourite`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/clap.js b/commands/fediverse/clap.js deleted file mode 100644 index 4142b2d..0000000 --- a/commands/fediverse/clap.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/favourite`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/copy.js b/commands/fediverse/copy.js deleted file mode 100644 index 0927c76..0000000 --- a/commands/fediverse/copy.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/reblog`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/flood.js b/commands/fediverse/flood.js deleted file mode 100644 index 8b671ee..0000000 --- a/commands/fediverse/flood.js +++ /dev/null @@ -1,39 +0,0 @@ -let intervalId = null; - -exports.runQuery = function (roomId, disable) { - - if (intervalId) { - clearInterval(intervalId); - intervalId = null; - } - - if (disable) return; - - intervalId = setInterval(() => { - axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/timelines/home`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then((res) => { - let timeline = JSON.parse(localStorage.getItem('timeline')); - past = timeline[event.getSender()] || {} - if (past.length === 0) past = res.data; - const events = res.data; - const len = events.length; - for (let i = len - 1; i >= 0; i--) { - if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { - const lastStored = past.slice(past.length - 1, past.length); - if (events[i].created_at < lastStored[0].created_at) return; - events[i].label = 'status'; - fediverse.utils.formatter(events[i], roomId); - } - } - timeline[event.getSender()] = events - localStorage.setItem('timeline', JSON.stringify(timeline, null, 2)); - }) - .catch((e) => { - matrix.utils.sendError(null, roomId, e); - }); - }, 30000); -}; diff --git a/commands/fediverse/follow.js b/commands/fediverse/follow.js deleted file mode 100644 index 5458a37..0000000 --- a/commands/fediverse/follow.js +++ /dev/null @@ -1,19 +0,0 @@ -exports.runQuery = async function (roomId, event, userInput) { - const loadingString = `Searching for ${userInput}...`; - const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); - const found = []; - const suggest = []; - axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v2/search?q=${userInput}&type=accounts`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }).then((findUserId) => { - const results = findUserId.data.accounts; - const len = results.length; - for (let i = 0; i < len; i++) results[i].acct !== userInput ? suggest.push(results[i].acct) : found.push(results[i]); - if (found.length > 0) return fediverse.utils.follow(roomId, found, event, original); - if (suggest.length > 0) msg = `${userInput} was not found, suggesting:
${suggest.join('
')}
`; - if (suggest.length === 0) msg = `No results found for: ${userInput}.`; - return matrix.utils.editNoticeHTML(roomId, original, msg); - }); -}; diff --git a/commands/fediverse/notify.js b/commands/fediverse/notify.js deleted file mode 100644 index 074f139..0000000 --- a/commands/fediverse/notify.js +++ /dev/null @@ -1,39 +0,0 @@ -let intervalId = null; - -exports.runQuery = function (roomId, disable) { - - if (intervalId) { - clearInterval(intervalId); - intervalId = null; - } - - if (disable) return; - - intervalId = setInterval(() => { - axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/notifications`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then((res) => { - let notifications = JSON.parse(localStorage.getItem('notifications')); - let past = notifications[event.getSender()] || {} - if (past.length === 0) past = res.data; - const events = res.data; - const len = events.length; - for (let i = len - 1; i >= 0; i--) { - if (past.findIndex((x) => x.created_at === events[i].created_at) === -1) { - const lastStored = past.slice(past.length - 1, past.length); - if (events[i].created_at < lastStored[0].created_at) return; - events[i].label = 'notifications'; - fediverse.utils.formatter(events[i], roomId); - } - } - notifications[event.getSender()] = events - localStorage.setItem('notifications', JSON.stringify(notifications, null, 2)); - }) - .catch((e) => { - matrix.utils.sendError(null, roomId, e); - }); - }, 30000); -}; diff --git a/commands/fediverse/pin.js b/commands/fediverse/pin.js deleted file mode 100644 index c5c58e2..0000000 --- a/commands/fediverse/pin.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/pin`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/post.js b/commands/fediverse/post.js deleted file mode 100644 index 3ad97f0..0000000 --- a/commands/fediverse/post.js +++ /dev/null @@ -1,132 +0,0 @@ -const qs = require('qs'); -const crypto = require('crypto'); -const FormData = require('form-data'); - -const emojis = { public: '🌐', unlisted: '📝', private: '🔒️', direct: '✉️' }; -exports.visibilityEmoji = (v) => emojis[v] || v; - -const mediaPathRegex = /^\/_matrix\/media\/r0\/download\/[^/]+\/[^/]+\/?$/; - -const decryptMedia = (media, file) => { - const { v, key: { alg, ext, k, }, iv } = file; - - if (v !== 'v2' || ext !== true || alg !== 'A256CTR') - throw new Error('Unsupported file encryption'); - - const key = Buffer.from(k, 'base64'); - const _iv = Buffer.from(iv, 'base64'); - const cipher = crypto.createDecipheriv('aes-256-ctr', key, _iv); - const data = Buffer.concat([ cipher.update(media.data), cipher.final() ]); - return Object.assign({}, media, { data }); -}; - -const getMediaInfoFromEvent = async (roomId, event_id) => { - const event = await matrix.utils.fetchEncryptedOrNot(roomId, { event_id }); - if (event.getType() !== 'm.room.message') throw new Error('Invalid type'); - const content = event.getContent(); - if (content.msgtype !== 'm.image') throw new Error('Invalid msgtype'); - if (content.url) return { url: getMediaUrl(content.url) }; - if (content.file) return { - url: getMediaUrl(content.file.url), - filename: content.body, - mimetype: content.info ? content.info.mimetype : null, - file: content.file - }; - throw new Error('Invalid event'); -}; - -const getMediaUrl = string => { - let url = new URL(string); - if (url.protocol === 'mxc:' && url.hostname && url.pathname) - url = new URL(`${config.matrix.domain}/_matrix/media/r0/download/${url.hostname}${url.pathname}`); - if (url.protocol !== 'https:' || - !config.matrix.domains.includes(url.hostname) || - !mediaPathRegex.test(url.pathname)) - throw new Error('Invalid URL'); - return url.toString(); -}; - -const getMedia = async (roomId, string) => { - let opts = {}; - if (string.startsWith('mxe://')) - opts = await getMediaInfoFromEvent(roomId, string.substring(6)); - else - opts.url = getMediaUrl(string); - const media = await mediaDownload(opts); - return opts.file ? decryptMedia(media, opts.file) : media; -}; - -const getFilename = (header) => { - if (typeof header !== 'string') return null; - try { - const m = header.match(/inline; filename(?:=(.+)|\*=utf-8''(.+))/); - return !m ? null : m[2] && decodeURIComponent(m[2]) || m[1]; - } catch (e) { - return null; - } -}; - -const mediaDownload = async (opts) => { - const { whitelist, blacklist } = config.fediverse.mimetypes; - const media = await axios({ method: 'GET', url: opts.url, responseType: 'arraybuffer' }); - const filename = opts.filename || getFilename(media.headers['content-disposition']); - const mimetype = opts.mimetype || media.headers['content-type']; - if (media.statusText !== 'OK' || blacklist.includes(mimetype)) throw media; - if (whitelist.length && !whitelist.includes(mimetype)) throw media; - return { data: media.data, filename, mimetype }; -}; - -const mediaUpload = async ({ domain }, { data, filename, mimetype }) => { - const form = new FormData(); - form.append('file', data, { - filename: filename || 'upload', - contentType: mimetype, - }); - const upload = await axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/media`, - headers: form.getHeaders({ Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }), - data: form, - }); - if (upload.statusText !== 'OK') throw upload; - return upload.data.id; -}; - -const run = async (roomId, event, content, replyId, mediaURL, subject, visibility) => { - let mediaId = null; - if (mediaURL) { - const media = await getMedia(roomId, mediaURL); - mediaId = await mediaUpload(config.fediverse, media); - } - if (replyId) content = await fediverse.utils.getStatusMentions(replyId, event).then(m => m.concat(content).join(' ')); - const response = await axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}`, 'Content-Type': 'application/x-www-form-urlencoded' }, - data: qs.stringify({ - status: content, - content_type: 'text/markdown', - visibility: visibility || undefined, - media_ids: mediaURL && [mediaId] || undefined, - in_reply_to_id: replyId || undefined, - spoiler_text: subject || undefined, - }, { arrayFormat: 'brackets' }), - }); - return fediverse.utils.sendEventWithMeta(roomId, `${response.data.id}`, `redact ${response.data.id}`); -}; - -exports.runQuery = async (roomId, event, userInput, { isReply, hasMedia, hasSubject, visibility }) => { - try { - const chunks = userInput.trim().split(' '); - if (!chunks.length || chunks.length < !!isReply + !!hasMedia) throw ''; - let replyId = null; - let mediaURL = null; - const subject = hasSubject ? config.fediverse.subject : null; - if (isReply) replyId = chunks.shift(); - if (hasMedia) mediaURL = chunks.shift(); - return await run(roomId, event, chunks.join(' '), replyId, mediaURL, subject, visibility); - } catch (e) { - console.error(e) - return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); - } -}; diff --git a/commands/fediverse/react.js b/commands/fediverse/react.js deleted file mode 100644 index 1ceac6a..0000000 --- a/commands/fediverse/react.js +++ /dev/null @@ -1,26 +0,0 @@ -const run = async (roomId, event, id, emoji, remove) => { - axios({ - method: remove ? 'DELETE' : 'PUT', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/pleroma/statuses/${id}/reactions/${emoji}`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; - -exports.runQuery = async (roomId, event, userInput, remove) => { - try { - const chunks = userInput.trim().split(' '); - if (chunks.length !== 2) throw ''; - const id = encodeURIComponent(chunks[0]); - const emoji = encodeURIComponent(chunks[1]); - return run(roomId, event, id, emoji, remove); - } catch (e) { - return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); - } -}; diff --git a/commands/fediverse/redact.js b/commands/fediverse/redact.js deleted file mode 100644 index 18b0ce1..0000000 --- a/commands/fediverse/redact.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'DELETE', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/status.js b/commands/fediverse/status.js deleted file mode 100644 index d2d0b4a..0000000 --- a/commands/fediverse/status.js +++ /dev/null @@ -1,15 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then((response) => { - response.label = 'status'; - fediverse.utils.formatter(response, roomId); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/unfollow.js b/commands/fediverse/unfollow.js deleted file mode 100644 index e34bb8d..0000000 --- a/commands/fediverse/unfollow.js +++ /dev/null @@ -1,19 +0,0 @@ -exports.runQuery = async function (roomId, event, userInput) { - const loadingString = `Searching for ${userInput}...`; - const original = await matrixClient.sendHtmlNotice(roomId, `${loadingString}`, `${loadingString}`); - const found = []; - const suggest = []; - axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v2/search?q=${userInput}&type=accounts`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }).then((findUserId) => { - const results = findUserId.data.accounts; - const len = results.length; - for (let i = 0; i < len; i++) results[i].acct !== userInput ? suggest.push(results[i].acct) : found.push(results[i]); - if (found.length > 0) return fediverse.utils.unfollow(roomId, found, event, original); - if (suggest.length > 0) msg = `${userInput} was not found, suggesting:
${suggest.join('
')}
`; - if (suggest.length === 0) msg = `No results found for: ${userInput}.`; - return matrix.utils.editNoticeHTML(roomId, original, msg); - }); -}; diff --git a/commands/fediverse/unpin.js b/commands/fediverse/unpin.js deleted file mode 100644 index 7c3d5d2..0000000 --- a/commands/fediverse/unpin.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unpin`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/unreblog.js b/commands/fediverse/unreblog.js deleted file mode 100644 index 8e612b7..0000000 --- a/commands/fediverse/unreblog.js +++ /dev/null @@ -1,14 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${userInput}/unreblog`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/unroll.js b/commands/fediverse/unroll.js deleted file mode 100644 index cb47bce..0000000 --- a/commands/fediverse/unroll.js +++ /dev/null @@ -1,28 +0,0 @@ -exports.runQuery = function (roomId, event, userInput) { - const instance = axios.create({ - baseURL: 'https://' + fediverse.auth[event.getSender()].domain, - method: 'GET', - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }); - instance.get(`/api/v1/statuses/${userInput}/context`) - .then(async (response) => { - let story = []; - const rel = event.getContent()['m.relates_to']; - const eventId = rel && rel.event_id ? rel.event_id : event.getId(); - const original = await instance.get(`/api/v1/statuses/${userInput}`); - const ancestors = response.data.ancestors; - const descendants = response.data.descendants; - story = [...story, ancestors, original.data, descendants]; - const book = story.flat(); - await fediverse.utils.thread(roomId, eventId, '

...Beginning thread...



'); - for (const [i, entry] of book.entries()) { - entry.label = 'thread'; - fediverse.utils.formatter(entry, roomId, eventId); - } - await fediverse.utils.thread(roomId, eventId, '

...Thread ended...



'); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; diff --git a/commands/fediverse/utils.js b/commands/fediverse/utils.js deleted file mode 100644 index b1f8d54..0000000 --- a/commands/fediverse/utils.js +++ /dev/null @@ -1,193 +0,0 @@ -const sendEventWithMeta = async (roomId, content, meta) => { - await matrixClient.sendEvent(roomId, 'm.room.message', { - body: content.replace(/<[^<]+?>/g, ''), - msgtype: 'm.notice', - formatted_body: content, - meta: meta, - format: 'org.matrix.custom.html', - }); -}; - -const thread = async (roomId, eventId, content, meta) => { - await matrixClient.sendEvent(roomId, 'm.room.message', { - body: content.replace(/<[^<]+?>/g, ''), - msgtype: 'm.notice', - formatted_body: content, - meta: meta, - format: 'org.matrix.custom.html', - 'm.relates_to': { - rel_type: 'm.thread', - event_id: eventId, - }, - }) -}; - -const hasAttachment = (res) => { - if (res.status) res = res.status; - if (!res.media_attachments) return '
'; - return res.media_attachments.map((media) => { - const mediaURL = new URL(media.remote_url); - media.name = new URLSearchParams(mediaURL.search).get('name') || 'Unknown file name.'; - return `File attachment: ${media.name}
`; - }).join('
'); -}; - -const notifyFormatter = (res, roomId) => { - userDetails = ` - ${res.account.acct}`; - switch (res.type) { - case 'follow': - fediverse.auth.me !== res.account.url ? res.meta = 'follow' : res.meta = 'redact'; - meta = `${res.meta} ${res.account.id}`; - content = `${userDetails} - has followed you. -
${res.account.note}
`; - sendEventWithMeta(roomId, content, meta); - break; - case 'favourite': - fediverse.auth.me !== res.account.url ? res.meta = 'favourite' : res.meta = 'redact'; - meta = `${res.meta} ${res.status.id}`; - content = `${userDetails} - has favorited - your post: -
${res.status.content}
- ${hasAttachment(res)} -
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} -
`; - sendEventWithMeta(roomId, content, res.meta); - break; - case 'mention': - fediverse.auth.me !== res.account.url ? res.meta = 'mention' : res.meta = 'redact'; - meta = `${res.meta} ${res.status.id}`; - content = `${userDetails} - has mentioned - you:
${res.status.content}
- ${hasAttachment(res)} -
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} -
`; - sendEventWithMeta(roomId, content, meta); - break; - case 'reblog': - fediverse.auth.me !== res.account.url ? res.meta = 'reblog' : res.meta = 'redact'; - meta = `${res.meta} ${res.status.id}`; - content = `${userDetails} - has repeated - your post:
${res.status.content}
- ${hasAttachment(res)} -
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} -
`; - sendEventWithMeta(roomId, content, meta); - break; - case 'pleroma:emoji_reaction': - fediverse.auth.me !== res.account.url ? res.meta = 'react' : res.meta = 'redact'; - meta = `${res.meta} ${res.status.id}`; - content = `${userDetails} - has reacted with - ${ res.emoji_url ? `${res.emoji}` : `${res.emoji}` } - to your post:
${res.status.content}
- ${hasAttachment(res)} -
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)} -
`; - sendEventWithMeta(roomId, content, meta); - break; - default: - return console.log('Unknown notification type.'); - } -}; - -const isOriginal = (res, roomId, event) => { - if (res.data) res = res.data; - userDetails = ` - ${res.account.acct}`; - fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'redact'; - meta = `${res.meta} ${res.id}`; - content = `${userDetails} -
${res.content}
- ${hasAttachment(res)} -
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)} -
`; - if (res.label == 'thread') thread(roomId, event, content, meta); - else sendEventWithMeta(roomId, content, meta); -}; - -const isReblog = (res, roomId) => { - if (res.data) res = res.data; - userDetails = ` - ${res.account.acct}`; - fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'unreblog'; - meta = `${res.meta} ${res.reblog.id}`; - content = `${userDetails} - has repeated - ${res.reblog.account.acct}'s post: -
${res.content}
- ${hasAttachment(res)} -
(id: ${res.reblog.id}) ${registrar.post.visibilityEmoji(res.visibility)} -
`; - sendEventWithMeta(roomId, content, meta); -}; - -module.exports.sendEventWithMeta = sendEventWithMeta; - -module.exports.thread = thread; - -module.exports.formatter = (res, roomId, event) => { - const filtered = (res.label === 'notifications') - ? notifyFormatter(res, roomId) - : (res.reblog == null) - ? isOriginal(res, roomId, event) - : isReblog(res, roomId); - return filtered; -}; - -module.exports.follow = (roomId, account, event, original) => { - axios({ - method: 'POST', - url: `https://${config.fediverse[event.getSender()].domain}/api/v1/accounts/${account[0].id}/follow`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - matrix.utils.editNoticeHTML(roomId, original, `Followed ${account[0].acct}.`); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; - -module.exports.unfollow = (roomId, account, event, original) => { - axios({ - method: 'POST', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/accounts/${account[0].id}/unfollow`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }) - .then(() => { - matrix.utils.addReact(event, '✅'); - matrix.utils.editNoticeHTML(roomId, original, `Unfollowed ${account[0].acct}.`); - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); -}; - -module.exports.getStatusMentions = (notice, event) => { - const users = axios({ - method: 'GET', - url: `https://${fediverse.auth[event.getSender()].domain}/api/v1/statuses/${notice}`, - headers: { Authorization: `Bearer ${fediverse.auth[event.getSender()].access_token}` }, - }).then((notice) => { - const users = []; - users.push('@' + notice.data.account.acct); - for(let i = 0; i < notice.data.mentions.length; i++) { - if(!config.fediverse.username.includes(notice.data.mentions[i].acct)) - users.push('@' + notice.data.mentions[i].acct) - } - return users; - }) - .catch((e) => { - matrix.utils.addReact(event, '❌'); - matrix.utils.sendError(event, roomId, e); - }); - return users; -}; diff --git a/commands/flood.js b/commands/flood.js new file mode 100644 index 0000000..d682713 --- /dev/null +++ b/commands/flood.js @@ -0,0 +1,41 @@ +const axios = require('axios'); +const fs = require('fs'); + +exports.runQuery = function (matrixClient, room, registrar) { + setInterval(() => { + axios({ + method: 'GET', + url: `${registrar.config.fediverse}/api/v1/timelines/home`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((events) => { + const event = fs.readFileSync('timeline.json', 'utf8'); + fs.writeFileSync('timeline.json', events.data[0].created_at, 'utf8'); + if (event !== events.data[0].created_at) { + if (events.data[0].reblog === null) { + matrixClient.sendHtmlNotice(room.roomId, + '', + `${events.data[0].account.acct} +
${events.data[0].content}
+ ${events.data[0].media_attachments.map(media => + ``+`${media.description}`+'' + ).join('
')} + (id: ${events.data[0].id}) +
`); + } else { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` + ${events.data[0].account.acct} + has repeated: +
${events.data[0].reblog.account.acct}
+
${events.data[0].content}
+ ${events.data[0].media_attachments.map(media => + ``+`Proxied image, no description available.`+'' + ).join('
')} +
(id: ${events.data[0].id}) +
`); + } + } + }); + }, 8000); +}; diff --git a/commands/fren.js b/commands/fren.js new file mode 100644 index 0000000..62ed399 --- /dev/null +++ b/commands/fren.js @@ -0,0 +1,20 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios.get(`${registrar.config.fediverse}/api/v1/accounts/${userInput}`).then((findUID) => { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/accounts/${findUID.data.id}/follow`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }) + .then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `Subscribed: +
${registrar.config.fediverse}/${response.data.id}`); + }); + }).catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/help.js b/commands/help.js index e076d5b..b9a2691 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,33 +1,18 @@ -exports.runQuery = function (roomId) { - matrixClient.sendHtmlNotice(roomId, - ' ', - '
fediverse commands
' - + '+post [your message] : post
' - + '+direct [@recipient] [message] : direct message
' - + '+private [message] : follower-only message
' +exports.runQuery = function (matrixClient, room) { + matrixClient.sendHtmlNotice(room.roomId, + '', + '
+plemara [your message] : post
' + '+redact [post id] : delete post
' - + '+follow [user id] : follow
' - + '+unfollow [user id] : unfollow
' - + '+media [homeserver image URL or MXC] [optional message] : post media
' + + '+fren [user id] : follow
' + + '+unfren [user id] : unfollow
' + '+copy [post id] : repeat/repost/retweet
' - + '+crossblog [status URL]: cross blog twitter post to fediverse post
' + '+reply [post id] [content] : reply to post
' + + '+tip [@user@fedi.url] [amount] : tip 10grans' + + '+beg : beg for 10grans' + '+clap [post id] : favorite
' + '+boo [post id] : unfavorite
' + '
channel commands
' - + '+flood : turn on timeline in channel
' - + '+notify : show notifications in channel
' - + '+unflood : stop timeline in channel
' - + '+unnotify : stop notifications in channel
' - + '+archive [URL] : archive content
' - + '+rearchive [URL] : re-archive content
' - + '+nitter [status URL] : redirect twitter to nitter, also embed tweet
' - + '+invidious [video URL] : redirect youtube to invidious, also embed description
' - + '+proxy [twitter/youtube]: both +nitter and +invidious commands combined

' - + `
ligh7hau5 version ${require('../package.json').version}
` - + '--- Contributors🐱 ---
' - + 'CRYPTOMOONERS
' - + 'doesnm
' - + 'docs by LINT
' -); + + '+flood : turn on timeline
' + + '+notify : show notifications
' + + '
--- docs by lint ---
'); }; diff --git a/commands/invidious.js b/commands/invidious.js deleted file mode 100644 index 8187df8..0000000 --- a/commands/invidious.js +++ /dev/null @@ -1,58 +0,0 @@ -const invidious = async (instance, url) => { - const req = await instance({ method: 'GET', url }); - if (req.statusText !== 'OK') throw req; - const { headers } = instance.defaults; - const video = JSON.parse(req.data); - return { - url: headers['Host'], - name: video.title, - date: video.publishedText, - description: video.descriptionHtml, - author: video.author, - views: video.viewCount, - likes: video.likeCount, - dislikes: video.dislikeCount, - }; -}; - -const card = (video, path) => -`${video.name}
` + -((video.description.length > 300) ? `${video.description.substr(0, 300)}…` : ``)+ -((video.description === '

') ? `No description.`: ``)+ -((video.description.length < 300 && video.description !== '

') ? `${video.description}` : ``)+ -`
🔍️ ${video.views.toLocaleString()} ` + -`❤️ ${video.likes.toLocaleString()} ` + -`❌ ${video.dislikes.toLocaleString()}`+ -`
(${video.date})

-
`; - -const getInstance = (domain, config) => - axios.create({ - baseURL: `https://${domain}/api/v1/videos`, - headers: { - Host: `${domain}`, - 'User-Agent': `${config.userAgent}`, - }, - transformResponse: [], - timeout: 10 * 1000, - }); - -const run = async (roomId, userInput) => { - const cfg = config.invidious; - const video = await matrix.utils.retryPromise(cfg.domains.redirect, domain => invidious(getInstance(domain, cfg), userInput)); - return matrixClient.sendHtmlNotice(roomId, ' ', card(video, userInput)); -}; - -exports.runQuery = async (roomId, event, userInput) => { - try { - const url = new URL(userInput); - const { redirect, original } = config.invidious.domains; - if (!redirect.includes(url.hostname) && !original.includes(url.hostname)) throw ''; - if (/^\/[\w-]{11}$/.test(url.pathname)) return await run(roomId, url.pathname.slice(1)); - const params = new URLSearchParams(url.search).get('v'); - if (!/^[\w-]{11}$/.test(params)) throw ''; - return await run(roomId, params); - } catch (e) { - return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); - } -}; diff --git a/commands/nitter.js b/commands/nitter.js deleted file mode 100644 index bec5c2f..0000000 --- a/commands/nitter.js +++ /dev/null @@ -1,88 +0,0 @@ -const { JSDOM } = require('jsdom'); - -const nitter = async (instance, url) => { - const req = await instance({ method: 'GET', url }); - if (req.statusText !== 'OK') throw req; - const dom = new JSDOM(req.data); - const { document } = dom.window; - const tweet = document.querySelector('#m'); - const stats = tweet.querySelectorAll('.tweet-body > .tweet-stats .icon-container'); - const quote = tweet.querySelector('.tweet-body > .quote'); - const isReply = tweet.querySelector('.tweet-body > .replying-to'); - const replies = document.querySelectorAll('.main-thread > .before-tweet > .timeline-item'); - const { defaults } = instance; - return { - url: defaults.baseURL, - text: tweet.querySelector('.tweet-body > .tweet-content').innerHTML, - date: tweet.querySelector('.tweet-body > .tweet-published').textContent, - name: tweet.querySelector('.tweet-body > div .fullname').textContent, - check: !!tweet.querySelector('.tweet-body > div .fullname .icon-ok'), - handle: tweet.querySelector('.tweet-body > div .username').textContent, - hasAttachments: !!tweet.querySelector('.tweet-body > .attachments'), - quote: quote ? { - path: quote.querySelector('a.quote-link').href, - text: quote.querySelector('.quote-text') ? quote.querySelector('.quote-text').innerHTML : '', - } : null, - isReply: isReply && replies.length > 0 ? replies[replies.length - 1].classList.contains('unavailable') ? 'unavailable' : { - path: replies[replies.length - 1].querySelector('a.tweet-link').href, - text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, - } : null, - isThread: !isReply && replies.length > 0 ? replies[replies.length - 1].classList.contains('unavailable') ? 'unavailable' : { - path: replies[replies.length - 1].querySelector('a.tweet-link').href, - text: replies[replies.length - 1].querySelector('.tweet-content').innerHTML, - } : null, - stats: { - replies: stats[0].textContent.trim(), - retweets: stats[1].textContent.trim(), - favorites: stats[2].textContent.trim(), - }, - }; -}; - -const card = (tweet, check, path) => -`${tweet.name} ` + -(tweet.check ? `${check} ` : '') + -`${tweet.date} ` + -`🗨️ ${tweet.stats.replies} ` + -`🔁 ${tweet.stats.retweets} ` + -`❤️ ${tweet.stats.favorites} ` + -`
${tweet.text.replace('\n', '
')}
` + -(tweet.hasAttachments ? '
This tweet has attached media.
' : '') + -(tweet.isReply ? tweet.isReply === 'unavailable' ? '
Replied Tweet is unavailable
' : `
Replied Tweet
${tweet.isReply.text.replace('\n', '
')}
` : '') + -(tweet.isThread ? tweet.isThread === 'unavailable' ? '
Previous Tweet is unavailable
' : `
Previous Tweet
${tweet.isThread.text.replace('\n', '
')}
` : '') + -(tweet.quote ? `
Quoted Tweet
${tweet.quote.text.replace('\n', '
')}
` : ''); - -const getInstance = (domain, config) => - axios.create({ - baseURL: `https://${domain}`, - headers: { - Host: `${domain}`, - 'User-Agent': `${config.userAgent}`, - }, - transformResponse: [], - timeout: 10 * 1000, - }); - -const run = async (roomId, userInput, fedi) => { - const cfg = config.nitter; - const tweet = await matrix.utils.retryPromise(cfg.domains.redirect, domain => nitter(getInstance(domain, cfg), userInput)); - const tweetCard = card(tweet, cfg.check, userInput); - return fedi ? axios({ - method: 'POST', - url: `${config.fediverse.domain}/api/v1/statuses`, - headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, - data: { status: tweetCard, content_type: 'text/html' } - }) : matrixClient.sendHtmlNotice(roomId, ' ', tweetCard); -}; - -exports.runQuery = async (roomId, event, userInput, fedi) => { - try { - const url = new URL(userInput); - const { redirect, original } = config.nitter.domains; - if (!redirect.includes(url.hostname) && !original.includes(url.hostname)) throw ''; - if (!/^\/[^/]+\/status\/\d+\/?$/.test(url.pathname)) throw ''; - return await run(roomId, url.pathname, fedi); - } catch (e) { - return matrixClient.sendHtmlNotice(roomId, 'Sad!', 'Sad!').catch(() => {}); - } -}; diff --git a/commands/notify.js b/commands/notify.js new file mode 100644 index 0000000..6007964 --- /dev/null +++ b/commands/notify.js @@ -0,0 +1,51 @@ +const axios = require('axios'); +const fs = require('fs'); + +exports.runQuery = function (matrixClient, room, registrar) { + setInterval(() => { + axios({ + method: 'GET', + url: `${registrar.config.fediverse}/api/v1/notifications`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((notifications) => { + const event = fs.readFileSync('notification.json', 'utf8'); + fs.writeFileSync('notification.json', notifications.data[0].created_at, 'utf8'); + + if (event !== notifications.data[0].created_at) { + if (notifications.data[0].type === 'follow') { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` + ${notifications.data[0].account.acct} + has followed you. +
${notifications.data[0].account.note}`); + } else if (notifications.data[0].type === 'favourite') { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` + ${notifications.data[0].account.acct} + has favorited + your post: +
${notifications.data[0].status.content}
`); + } else if (notifications.data[0].type === 'mention') { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` + ${notifications.data[0].account.acct} + has mentioned + you:
${notifications.data[0].status.content} +
(id: ${notifications.data[0].status.id})
+
`); + } else if (notifications.data[0].type === 'reblog') { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` + ${notifications.data[0].account.acct} + has repeated + your post:
+
${notifications.data[0].status.content}
`); + } + } + }); + }, 8000); +}; diff --git a/commands/pin.js b/commands/pin.js new file mode 100644 index 0000000..7a1e632 --- /dev/null +++ b/commands/pin.js @@ -0,0 +1,20 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/pin`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `Pinned: +
+ ${response.data.content} +
`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/plemara.js b/commands/plemara.js new file mode 100644 index 0000000..550e7e4 --- /dev/null +++ b/commands/plemara.js @@ -0,0 +1,21 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + data: { status: userInput, content_type: `text/markdown` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` +
${response.data.content}
+ (id: ${response.data.id}) +

`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/redact.js b/commands/redact.js new file mode 100644 index 0000000..52f6b35 --- /dev/null +++ b/commands/redact.js @@ -0,0 +1,17 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'DELETE', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + '
Redacted. { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/reply.js b/commands/reply.js new file mode 100644 index 0000000..3f40162 --- /dev/null +++ b/commands/reply.js @@ -0,0 +1,18 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + data: { status: flaggedInput, in_reply_to_id: address, content_type: `text/markdown` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `${response.data.content} ${response.data.url}`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/tip.js b/commands/tip.js new file mode 100644 index 0000000..44cb095 --- /dev/null +++ b/commands/tip.js @@ -0,0 +1,21 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, address, flaggedInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + data: { status: `@10grans@fedi.cc tip `+ flaggedInput + ` to `+address }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + ` +
Tipping ${response.data.content}
+ (id: ${response.data.id}) +

`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; \ No newline at end of file diff --git a/commands/unfren.js b/commands/unfren.js new file mode 100644 index 0000000..c18a671 --- /dev/null +++ b/commands/unfren.js @@ -0,0 +1,20 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios.get(`${registrar.config.fediverse}/api/v1/accounts/${userInput}`).then((findUID) => { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/accounts/${findUID.data.id}/unfollow`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }) + .then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `Unsubscribed: +
${registrar.config.fediverse}/${response.data.id}`); + }); + }).catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/commands/unpin.js b/commands/unpin.js new file mode 100644 index 0000000..2871f2e --- /dev/null +++ b/commands/unpin.js @@ -0,0 +1,20 @@ +const axios = require('axios'); + +exports.runQuery = function (matrixClient, room, userInput, registrar) { + axios({ + method: 'POST', + url: `${registrar.config.fediverse}/api/v1/statuses/${userInput}/unpin`, + headers: { Authorization: `Bearer ${registrar.config.fediverseToken}` }, + }).then((response) => { + matrixClient.sendHtmlNotice(room.roomId, + '', + `Unpinned: +
+ ${response.data.content} +
`); + }) + .catch((e) => { + matrixClient.sendHtmlNotice(room.roomId, + '', `${e}`); + }); +}; diff --git a/config.js b/config.js new file mode 100644 index 0000000..e6cff93 --- /dev/null +++ b/config.js @@ -0,0 +1,8 @@ +module.exports = { + matrixServer: 'https://server.com', + userId: '@matrixUser:server.com', + matrixUser: 'hello', + matrixPass: 'password', + fediverse: 'https://server.com', + fediverseToken: 'access_token', +}; diff --git a/main.js b/main.js index 64e41d2..3c42b2d 100644 --- a/main.js +++ b/main.js @@ -1,44 +1,110 @@ -global.registrar = require('./registrar.js'); +const sdk = require('matrix-js-sdk'); +const axios = require('axios'); +const registrar = require('./registrar.js'); -matrix.auth.access_token ? auth.matrixTokenLogin() : auth.getMatrixToken(); -//if (!fediverse.auth.access_token && config.fediverse.username) auth.registerFediverseApp(); +const auth = { + type: 'm.login.password', + user: registrar.config.matrixUser, + password: registrar.config.matrixPass, +}; -matrixClient.on('RoomMember.membership', (event, member) => { - if (member.membership === 'invite' && member.userId === matrixClient.credentials.userId) { - matrixClient.joinRoom(member.roomId).then(() => { - console.log('Auto-joined %s', member.roomId); - }); - } - - if (member.membership === 'leave' && member.userId === matrixClient.credentials.userId) { - matrixClient.forget(member.roomId).then(() => { - console.log('Kicked %s', member.roomId); - }); - } +axios.post(`${registrar.config.matrixServer}/_matrix/client/r0/login`, auth).then((response) => { + CreateClient(response.data.access_token); +}).catch((e) => { + console.log(e); }); -matrixClient.on('event', async (event) => { - if (event.isEncrypted()) await matrixClient.decryptEventIfNeeded(event, { emit: false, isRetry: false }); - if (event.getSender() === matrixClient.credentials.userId) return matrix.utils.selfReact(event); - if (!event.event.content['m.relates_to']) return; - if (event.event.unsigned.age > 10000) return; - return event.getType() === 'm.room.message' - ? matrix.utils.handleReply(event) : matrix.utils.handleReact(event); -}); +let CreateClient = (token) => { + const matrixClient = sdk.createClient({ + baseUrl: registrar.config.matrixServer, + accessToken: token, + userId: registrar.config.userId, + timelineSupport: true, + }); -matrixClient.on('Room.timeline', async (event, member, toStartOfTimeline) => { - if (toStartOfTimeline) return; - if (event.isEncrypted()) await matrixClient.decryptEventIfNeeded(event, { emit: false, isRetry: false }); - if (event.getType() !== 'm.room.message') return; - if (event.getSender() === matrixClient.credentials.userId) return; - if (event.event.unsigned.age > 10000) return; - roomId = event.event.room_id; - content = event.getContent().body; - if (!typeof content === 'string') return; - if (content.charAt(0) === '+') { - const args = content.slice(1).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - console.log(`Logs: ${event.event.sender} - ${content}`); - matrix.utils.eventHandler(args, roomId, command, event); - } -}); + matrixClient.on('RoomMember.membership', (event, member) => { + if (member.membership === 'invite' && member.userId === registrar.config.userId) { + matrixClient.joinRoom(member.roomId).done(() => { + console.log('Auto-joined %s', member.roomId); + }); + } + }); + + matrixClient.on('Room.timeline', (event, room, toStartOfTimeline) => { + if (toStartOfTimeline) return; + if (event.getType() !== 'm.room.message') return; + if (event.getSender() === registrar.config.userId) return; + if (event.event.unsigned.age > 10000) return; + if (event.event.content.body.charAt(0) === '+') { + console.log(`Logs: ${event.event.sender} - ${event.event.content.body}`); + const args = event.event.content.body.slice(1).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + const userInput = args.join(' '); + const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); + const address = args.slice(0, 1).join(' ').replace(/"/g, ''); + + if (command === 'boo') { + registrar.boo.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'beg') { + registrar.beg.runQuery(matrixClient, room, registrar); + } + + if (command === 'clap') { + registrar.clap.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'copy') { + registrar.copy.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'flood') { + registrar.flood.runQuery(matrixClient, room, registrar); + } + + if (command === 'fren') { + registrar.fren.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'help') { + registrar.help.runQuery(matrixClient, room); + } + + if (command === 'pin') { + registrar.pin.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'plemara') { + registrar.plemara.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'notify') { + registrar.notify.runQuery(matrixClient, room, registrar); + } + + if (command === 'redact') { + registrar.redact.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'reply') { + registrar.reply.runQuery(matrixClient, room, address, flaggedInput, registrar); + } + + if (command === 'tip') { + registrar.tip.runQuery(matrixClient, room, address, flaggedInput, registrar); + } + + if (command === 'unfren') { + registrar.unfren.runQuery(matrixClient, room, userInput, registrar); + } + + if (command === 'unpin') { + registrar.unpin.runQuery(matrixClient, room, userInput, registrar); + } + } + }); + + matrixClient.startClient(); + module.exports = matrixClient; +}; diff --git a/notification.json b/notification.json new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 9370635..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1027 +0,0 @@ -{ - "name": "ligh7hau5", - "version": "3.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ligh7hau5", - "version": "3.0.1", - "license": "AGPL-3.0-only", - "dependencies": { - "axios": "^0.25.0", - "form-data": "^4.0.0", - "jsdom": "^19.0.0", - "matrix-js-sdk": "^27.2.0", - "node-localstorage": "^2.2.1", - "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", - "qs": "^6.11.2" - }, - "devDependencies": {}, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@matrix-org/matrix-sdk-crypto-wasm": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz", - "integrity": "sha512-DCb7Q83PCQK0uav5vB3KNV/hJPlxAhT/ddar+VHz2kC39hMLKGzWYVhprpLYVcavaE/6OX+Q/xFkAoV/3QtUHQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "license": "MIT" - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/another-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==", - "license": "Apache-2.0" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, - "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", - "license": "MIT" - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "license": "BSD-2-Clause" - }, - "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", - "license": "MIT" - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", - "license": "MIT" - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/matrix-events-sdk": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz", - "integrity": "sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==", - "license": "Apache-2.0" - }, - "node_modules/matrix-js-sdk": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz", - "integrity": "sha512-jsoA5oPv0eQbELlOzQ6J3v1HTPU0oydqgLQNVpztsajEj6AfJYvCaZueFak8jac9RsopZlqWbP8CXI8r5MvNEA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@matrix-org/matrix-sdk-crypto-wasm": "^1.2.0", - "another-json": "^0.2.0", - "bs58": "^5.0.0", - "content-type": "^1.0.4", - "jwt-decode": "^3.1.2", - "loglevel": "^1.7.1", - "matrix-events-sdk": "0.0.1", - "matrix-widget-api": "^1.5.0", - "oidc-client-ts": "^2.2.4", - "p-retry": "4", - "sdp-transform": "^2.14.1", - "unhomoglyph": "^1.0.6", - "uuid": "9" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/matrix-widget-api": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz", - "integrity": "sha512-hKGfqQKK5qVMwW0Sp8l2TiuW8UuHafTvUZNSWBPghedB/rSFbVLlr0mufuEV0iq/pQ7ChW96q/WEC6Llie4SnA==", - "license": "Apache-2.0", - "dependencies": { - "@types/events": "^3.0.0", - "events": "^3.2.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/node-localstorage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", - "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", - "license": "MIT", - "dependencies": { - "write-file-atomic": "^1.1.4" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "license": "MIT" - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-client-ts": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz", - "integrity": "sha512-omAHoLdFcylnwZeHJahOnJBwd0r78JzhmVAmsQjLGrexAnQKiHW9Ilr9FlRD5qjMikmabvaucI4k49AbQLXhmQ==", - "license": "Apache-2.0", - "dependencies": { - "crypto-js": "^4.1.1", - "jwt-decode": "^3.1.2" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/olm": { - "name": "@matrix-org/olm", - "version": "3.2.14", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", - "integrity": "sha512-Yz8X5+R1PL0RwJNjuH4r9WgWgXHX5v4NB093baUUE3Wh1INHEminESeur6FtIfQhVRQd8UZ9HRBh+Rd2nkNFGQ==", - "license": "Apache-2.0" - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "license": "MIT" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sdp-transform": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz", - "integrity": "sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw==", - "license": "MIT", - "bin": { - "sdp-verify": "checker.js" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "license": "ISC", - "engines": { - "node": "*" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/unhomoglyph": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", - "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" - } - } -} diff --git a/package.json b/package.json index 666116b..8d3656a 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,7 @@ { - "name": "ligh7hau5", - "version": "3.0.1", + "name": "plemara", + "version": "0.2.1", "description": "A Matrix to Fediverse client", - "engines": { - "node": ">=18.0.0" -}, "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -12,22 +9,22 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/vulet/ligh7hau5.git" + "url": "git+https://github.com/vulet/plemara.git" }, "author": "vul", "license": "AGPL-3.0-only", "bugs": { - "url": "https://github.com/vulet/lighthau5/issues" + "url": "https://github.com/vulet/plemara/issues" }, - "homepage": "https://github.com/vulet/lighthau5#readme", + "homepage": "https://github.com/vulet/plemara#readme", "dependencies": { - "axios": "^0.25.0", - "form-data": "^4.0.0", - "jsdom": "^19.0.0", - "matrix-js-sdk": "^27.2.0", - "node-localstorage": "^2.2.1", - "olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", - "qs": "^6.11.2" + "axios": "^0.19.2", + "file-system": "^2.2.2", + "matrix-js-sdk": "^2.4.6" }, - "devDependencies": {} + "devDependencies": { + "eslint": "^5.16.0", + "eslint-config-airbnb-base": "^13.1.0", + "eslint-plugin-import": "^2.17.3" + } } diff --git a/registrar.js b/registrar.js index 5d4590c..760869a 100644 --- a/registrar.js +++ b/registrar.js @@ -1,51 +1,18 @@ -global.Olm = require('olm'); -global.sdk = require('matrix-js-sdk'); -global.axios = require('axios'); -global.config = require('./config.js'); -global.auth = require('./auth.js'); -global.authEvents = []; -const { LocalStorage } = require('node-localstorage'); -global.localStorage = new LocalStorage('./keys'); -if (!localStorage.getItem('matrix_auth')) { - localStorage.clear(); - localStorage.setItem('matrix_auth', '[]'); -} -if (!localStorage.getItem('fediverse_auth')) localStorage.setItem('fediverse_auth', '{}'); -if (!localStorage.getItem('timeline')) localStorage.setItem('timeline', '{}'); -if (!localStorage.getItem('notifications')) localStorage.setItem('notifications', '{}'); - - -global.fediverse = { - auth: JSON.parse(localStorage.getItem('fediverse_auth')), - utils: require('./commands/fediverse/utils.js'), -}; -global.matrix = { - auth: JSON.parse(localStorage.getItem('matrix_auth')), - utils: require('./utils.js'), -}; - module.exports = { config: require('./config.js'), - archive: require('./commands/archive.js'), - proxy: require('./commands/proxy.js'), - invidious: require('./commands/invidious.js'), - nitter: require('./commands/nitter.js'), - boo: require('./commands/fediverse/boo.js'), - clap: require('./commands/fediverse/clap.js'), - copy: require('./commands/fediverse/copy.js'), - flood: require('./commands/fediverse/flood.js'), - follow: require('./commands/fediverse/follow.js'), - help: require('./commands/help.js'), - notify: require('./commands/fediverse/notify.js'), - pin: require('./commands/fediverse/pin.js'), - post: require('./commands/fediverse/post.js'), - redact: require('./commands/fediverse/redact.js'), - status: require('./commands/fediverse/status.js'), - unfollow: require('./commands/fediverse/unfollow.js'), - unpin: require('./commands/fediverse/unpin.js'), - unreblog: require('./commands/fediverse/unreblog.js'), - unroll: require('./commands/fediverse/unroll.js'), - react: require('./commands/fediverse/react.js'), - expand: require('./commands/expand.js'), - auth: require("./commands/fediverse/auth.js") + boo: require('./commands/boo.js'), + beg: require('./commands/beg.js'), + clap: require('./commands/clap.js'), + copy: require('./commands/copy.js'), + flood: require('./commands/flood.js'), + fren: require('./commands/fren.js'), + help: require('./commands/help.js'), + pin: require('./commands/pin.js'), + plemara: require('./commands/plemara.js'), + redact: require('./commands/redact.js'), + notify: require('./commands/notify.js'), + reply: require('./commands/reply.js'), + tip: require('./commands/tip.js'), + unfren: require('./commands/unfren.js'), + unpin: require('./commands/unpin.js'), }; diff --git a/timeline.json b/timeline.json new file mode 100644 index 0000000..e69de29 diff --git a/utils.js b/utils.js deleted file mode 100644 index 3b93a24..0000000 --- a/utils.js +++ /dev/null @@ -1,211 +0,0 @@ -const { MatrixEvent } = require('matrix-js-sdk/lib/models/event'); -const url = require("url") -const isEmoji = string => true; - -const sendError = async (event, roomId, e) => { - e.response ? error = `Error(${e.response.status}): ${e.response.data.error}` - : e.data ? error = `Error(${e.errcode}): ${e.data.error}` - : error = `Error: ${e.syscall}, ${e.code}`; - return matrixClient.sendHtmlNotice(roomId, - ' ', error); -}; - -const addReact = async (event, key) => { - const roomId = event.event.room_id; - return matrixClient.sendEvent(event.event.room_id, 'm.reaction', { - 'm.relates_to': { - rel_type: 'm.annotation', - event_id: event.getId(), - key, - }, - }).catch((e) => sendError(null, roomId, e)); -}; - -const eventHandler = (args, roomId, command, event) => { - const userInput = args.join(' '); - const flaggedInput = userInput.substr(userInput.indexOf(' ') + 1); - const address = args.slice(0, 1).join(' ').replace(/"/g, ''); - - args = []; - let visibility = null; - - switch (command) { - case 'config': - return; - case 'help': case 'flood': case 'notify': - args.push(roomId); - break; - case 'unflood': case 'unnotify': - args.push(roomId, true); - command = command.substring(2); - break; - case 'unreact': - args.push(roomId, event, userInput, true); - command = 'react'; - break; - case 'tip': case 'makeitrain': - args.push(roomId, event, address, flaggedInput); - break; - case 'archive': case 'rearchive': - args.push(roomId, userInput, !!~command.indexOf('re')); - command = 'archive'; - break; - case 'post': case 'reply': case 'media': case 'mediareply': - case 'random': case 'randomreply': case 'randommedia': case 'randommediareply': - case 'direct': case 'directreply': case 'directmedia': case 'directmediareply': - case 'private': case 'privatereply': case 'privatemedia': case 'privatemediareply': - case 'unlisted': case 'unlistedreply': case 'unlistedmedia': case 'unlistedmediareply': - visibility = command.match(/^(direct|private|unlisted)/); - args.push(roomId, event, userInput, { - isReply: !!~command.indexOf('reply'), - hasMedia: !!~command.indexOf('media'), - hasSubject: !!~command.indexOf('random'), - visibility: visibility ? visibility[1] : null - }); - command = 'post'; - break; - case 'crossblog': - args.push(roomId, event, userInput, true); - command = 'nitter' - break; - // fallthrough - default: - args.push(roomId, event, userInput); - } - if(["boo","clap","copy","flood","follow","notify","pin","unpin","post","react","redact","status","unfollow","unreblog","unroll"].includes(command) && !fediverse.auth[event.getSender()]) return matrixClient.sendHtmlNotice(roomId, ' ',`${event.getSender()}, для использования команды ${command} нужно привязать аккаунт Fediverse. Используйте для этого команду +auth <имя сервера>`) - registrar[command] && registrar[command].runQuery.apply(null, args); -}; - -/** -matrixClient.fetchRoomEvent() does not return an Event class -however, this class is necessary for decryption, so reinstate it. -afterwards, decrypt. -*/ -const fetchEncryptedOrNot = async (roomId, event) => { - const fetchedEvent = await matrixClient.fetchRoomEvent(roomId, event.event_id) - const realEvent = new MatrixEvent(fetchedEvent); - if (realEvent.isEncrypted()) { - await matrixClient.decryptEventIfNeeded(realEvent, { emit: false, isRetry: false }); - } - return realEvent; -} - -module.exports.sendError = sendError; - -module.exports.addReact = addReact; - -module.exports.eventHandler = eventHandler; - -module.exports.fetchEncryptedOrNot = fetchEncryptedOrNot - -module.exports.editNoticeHTML = (roomId, event, html, plain) => matrixClient.sendMessage(roomId, { - body: ` * ${plain || html.replace(/<[^<]+?>/g, '')}`, - formatted_body: ` * ${html}`, - format: 'org.matrix.custom.html', - msgtype: 'm.notice', - 'm.new_content': { - body: plain || html.replace(/<[^<]+?>/g, ''), - formatted_body: html, - format: 'org.matrix.custom.html', - msgtype: 'm.notice', - }, - 'm.relates_to': { - rel_type: 'm.replace', - event_id: event.event_id, - }, -}); - -module.exports.handleReact = async (event) => { - const reactions = config.matrix.reactions; - const roomId = event.event.room_id; - if (!event.getContent()['m.relates_to']) return; - const reaction = event.getContent()['m.relates_to']; - const metaEvent = await fetchEncryptedOrNot(roomId, reaction); - if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; - let args = metaEvent.getContent().meta.split(' '); - isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; - if (!isMeta.includes(args[0])) return; - let command = []; - args.shift().toLowerCase(); - switch (reaction.key) { - case reactions.copy: command = 'copy'; break; - case reactions.clap: command = 'clap'; break; - case reactions.redact: command = 'redact'; break; - case reactions.rain: command = 'makeitrain'; break; - case reactions.unroll: command = 'unroll'; break; - case reactions.expand: - command = 'expand'; - args = [ reaction.event_id ]; - break; - default: - if (isEmoji(reaction.key)) { - command = 'react'; - args.push(reaction.key); - } - break; - } - eventHandler(args, roomId, command, event); -}; - -module.exports.handleReply = async (event) => { - const roomId = event.event.room_id; - if(!event.event.content['m.relates_to']['m.in_reply_to']) return; - const reply = event.event.content['m.relates_to']['m.in_reply_to']; - const metaEvent = await fetchEncryptedOrNot(roomId, reply); - if(authEvents.includes(metaEvent.event_id)){ -const domain = metaEvent.event.content.body.match(/https?:\/\/[^\s]+/); -if(domain && domain[0]){ - domain[0] = url.parse(domain[0]).host - let code = event.getContent().body.split("\n"); - code = code[code.length-1].trim() - auth.obtainAccessToken(domain[0],code,event) - authEvents = authEvents.filter(f => f != event.event_id) -} - } - if (!metaEvent.getContent().meta || metaEvent.event.sender !== config.matrix.user) return; - const args = metaEvent.getContent().meta.split(' '); - args.push(event.getContent().formatted_body.trim().split('')[1]); - isMeta = ['status', 'reblog', 'mention', 'redact', 'unreblog']; - if (!isMeta.includes(args[0])) return; - args.shift().toLowerCase(); - command = 'reply'; - eventHandler(args, roomId, command, event); -}; - -module.exports.selfReact = async (event) => { - const reactions = config.matrix.reactions; - if (event.getType() !== 'm.room.message') return; - if (event.event.unsigned.age > 10000) return; - if (!event.getContent().meta) return; - const { meta } = event.getContent(); - const type = meta.split(' ')[0]; - if (type === 'redact' || type === 'unreblog') - addReact(event, reactions.redact); - if (type === 'status' || type === 'reblog' || type === 'mention') - addReact(event, reactions.expand); -}; - -module.exports.expandReact = async (event) => { - const reactions = config.matrix.reactions; - if (event.getSender() !== matrixClient.credentials.userId) return; - if (!event.getContent().meta) return; - const { meta } = event.getContent(); - const type = meta.split(' ')[0]; - if (type === 'status' || type === 'reblog' || type === 'mention') { - addReact(event, reactions.unroll); - addReact(event, reactions.copy); - addReact(event, reactions.clap); - if (config.fediverse.tipping) - addReact(event, reactions.rain); - } -}; - -module.exports.retryPromise = async (argList, promiseFn) => { - let err; - for(var arg of argList) { - try { - return await promiseFn(arg); - } catch(e) { err = e; } - } - throw err || new Error('retryPromise error'); -}; diff --git a/yarn.lock b/yarn.lock index b2d3ac2..19d268d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,621 +2,1307 @@ # yarn lockfile v1 -"@babel/runtime@^7.12.5": - version "7.22.10" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz" - integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" dependencies: - regenerator-runtime "^0.14.0" + "@babel/highlight" "^7.0.0" -"@matrix-org/matrix-sdk-crypto-wasm@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-1.2.1.tgz" - integrity sha512-DCb7Q83PCQK0uav5vB3KNV/hJPlxAhT/ddar+VHz2kC39hMLKGzWYVhprpLYVcavaE/6OX+Q/xFkAoV/3QtUHQ== - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@types/events@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -abab@^2.0.5, abab@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^6.0.7: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" -acorn@^8.5.0: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== +ajv@^6.5.5, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" dependencies: - debug "4" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" another-json@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz" - integrity sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg== + resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== dependencies: - follow-redirects "^1.14.7" + follow-redirects "1.5.10" -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" -browser-process-hrtime@^1.0.0: +balanced-match@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== +base-x@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.6.tgz#de047ec95f5f7b99ae63d830a2a894c96538b2cd" dependencies: - base-x "^4.0.0" + safe-buffer "^5.0.1" -call-bind@^1.0.0: +bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + tweetnacl "^0.14.3" -combined-stream@^1.0.8: +bluebird@3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +browser-request@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" + +bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + dependencies: + base-x "^3.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" dependencies: delayed-stream "~1.0.0" -content-type@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -crypto-js@^4.1.1: +confusing-browser-globals@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz#5ae852bd541a910e7ffb2dbb864a2d21a36ad29b" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-type@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +core-js@^2.4.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^4.0.1: version "4.1.1" - resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: - cssom "~0.3.6" + ms "^2.1.1" -data-urls@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decimal.js@^10.3.1: - version "10.4.3" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + object-keys "^1.0.12" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: - webidl-conversions "^7.0.0" - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" + isarray "^1.0.0" -esprima@^4.0.1: +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + dependencies: + esutils "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.12.0, es-abstract@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^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" + +eslint-config-airbnb-base@^13.1.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz#f6ea81459ff4dec2dda200c35f1d8f7419d57943" + dependencies: + confusing-browser-globals "^1.0.5" + object.assign "^4.1.0" + object.entries "^1.1.0" + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.17.3: + version "2.18.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + dependencies: + eslint-visitor-keys "^1.0.0" + +eslint-visitor-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" -follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + dependencies: + flat-cache "^2.0.1" + +file-match@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/file-match/-/file-match-1.0.2.tgz#c9cad265d2c8adf3a81475b0df475859069faef7" + dependencies: + utils-extend "^1.0.6" + +file-system@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/file-system/-/file-system-2.2.2.tgz#7d65833e3a2347dcd956a813c677153ed3edd987" + dependencies: + file-match "^1.0.1" + utils-extend "^1.0.4" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + dependencies: + debug "=3.1.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.8" + combined-stream "^1.0.6" mime-types "^2.1.12" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" -get-intrinsic@^1.0.2: - version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -graceful-fs@^4.1.11: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-proto@^1.0.1: +functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" -has@^1.0.3: +glob@^7.1.2, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + 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" + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + +graceful-fs@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has@^1.0.1, has@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: function-bind "^1.1.1" -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: - agent-base "6" - debug "4" + safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - -jwt-decode@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" - integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== - -loglevel@^1.7.1: - version "1.8.1" - resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== - -matrix-events-sdk@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz" - integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== - -matrix-js-sdk@^27.2.0: - version "27.2.0" - resolved "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-27.2.0.tgz" - integrity sha512-jsoA5oPv0eQbELlOzQ6J3v1HTPU0oydqgLQNVpztsajEj6AfJYvCaZueFak8jac9RsopZlqWbP8CXI8r5MvNEA== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^1.2.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^3.1.2" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.5.0" - oidc-client-ts "^2.2.4" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - -matrix-widget-api@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/matrix-widget-api/-/matrix-widget-api-1.5.0.tgz" - integrity sha512-hKGfqQKK5qVMwW0Sp8l2TiuW8UuHafTvUZNSWBPghedB/rSFbVLlr0mufuEV0iq/pQ7ChW96q/WEC6Llie4SnA== - dependencies: - "@types/events" "^3.0.0" - events "^3.2.0" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -node-localstorage@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz" - integrity sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw== - dependencies: - write-file-atomic "^1.1.4" - -nwsapi@^2.2.0: - version "2.2.7" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -oidc-client-ts@^2.2.4: - version "2.2.5" - resolved "https://registry.npmjs.org/oidc-client-ts/-/oidc-client-ts-2.2.5.tgz" - integrity sha512-omAHoLdFcylnwZeHJahOnJBwd0r78JzhmVAmsQjLGrexAnQKiHW9Ilr9FlRD5qjMikmabvaucI4k49AbQLXhmQ== - dependencies: - crypto-js "^4.1.1" - jwt-decode "^3.1.2" - -"olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": - version "3.2.14" - resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz" - integrity sha512-Yz8X5+R1PL0RwJNjuH4r9WgWgXHX5v4NB093baUUE3Wh1INHEminESeur6FtIfQhVRQd8UZ9HRBh+Rd2nkNFGQ== - -p-retry@4: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -qs@^6.11.2: - version "6.11.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -sdp-transform@^2.14.1: - version "2.14.1" - resolved "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.1.tgz" - integrity sha512-RjZyX3nVwJyCuTo5tGPx+PZWkDMCg7oOLpSlhjDdZfwUoNqG1mM8nyj31IGHyaPWXhjbP7cdK3qZ2bmkJ1GzRw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" - integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== - -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -unhomoglyph@^1.0.6: +inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz" - integrity sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" + once "^1.3.0" + wrappy "1" -uuid@9: - version "9.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== +inquirer@^6.2.2: + version "6.4.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" dependencies: - browser-process-hrtime "^1.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" -whatwg-encoding@^2.0.0: +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: - iconv-lite "0.6.3" + has "^1.0.1" -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" + has-symbols "^1.0.0" -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.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" -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz" - integrity sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" +isarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" -ws@^8.2.3: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -xml-name-validator@^4.0.0: +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -xmlchars@^2.2.0: +js-yaml@^3.13.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash@^4.17.11: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + +loglevel@^1.6.4: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +matrix-js-sdk@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.4.6.tgz#162e46dccc880889312b056e4a7b4b91c17a5842" + integrity sha512-ydU64WwAYFjaTJ7JTv/JM3HmSY7leHWm3x3j0J4KWVhDDxsLoQ/v8Tc6FwlVom9/B9VvGTk+AG3aY0zgNk8LQg== + dependencies: + another-json "^0.2.0" + babel-runtime "^6.26.0" + bluebird "3.5.5" + browser-request "^0.3.3" + bs58 "^4.0.1" + content-type "^1.0.2" + loglevel "^1.6.4" + qs "^6.5.2" + request "^2.88.0" + unhomoglyph "^1.0.2" + +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + dependencies: + mime-db "1.40.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + dependencies: + callsites "^3.0.0" + +parse-json@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + +psl@^1.1.24: + version "1.2.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +qs@^6.5.2: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + +request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.5.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +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" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +table@^5.2.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +unhomoglyph@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unhomoglyph/-/unhomoglyph-1.0.2.tgz#d69e5f5a6a1c6b211941a0889b81eba86595c253" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +utils-extend@^1.0.4, utils-extend@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/utils-extend/-/utils-extend-1.0.8.tgz#ccfd7b64540f8e90ee21eec57769d0651cab8a5f" + +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + dependencies: + mkdirp "^0.5.1"