diff --git a/package.json b/package.json index 19b08be..5d0bd38 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "long": "^4.0.0", "node-machine-id": "^1.1.12", "osu-db-parser": "git+https://github.com/yadPe/osu-db-parser.git#6cc783f3a9270f730cd5038d03ada4a78634cd65", + "osu-lazer-db-reader": "0.1.6", "ps-node": "^0.1.6", "react": "^18.1.0", "react-dom": "^18.1.0", diff --git a/scripts/start.js b/scripts/start.js index e4c93c5..16bfe90 100644 --- a/scripts/start.js +++ b/scripts/start.js @@ -142,6 +142,7 @@ checkBrowsers(paths.appPath, isInteractive) console.log(chalk.green("Run 'yarn electron-dev' from either powershell or cmd.")); } else { console.log(chalk.yellow("Couldn't launch electron, try starting it manually")); + console.error(err); } } }).stdout.pipe(process.stdout).on('exit', () => console.log('Electron process terminated')); diff --git a/src/App/Providers/HistoryProvider.js b/src/App/Providers/HistoryProvider.js index e513a20..1a410a9 100644 --- a/src/App/Providers/HistoryProvider.js +++ b/src/App/Providers/HistoryProvider.js @@ -6,7 +6,10 @@ import { outputJSON, readJson } from 'fs-extra'; import { join } from 'path'; import { error, log } from 'electron-log'; import { memoize } from 'underscore'; +import { ipcRenderer } from 'electron'; +import { connect } from 'react-redux'; import { getOsPath } from '../helpers/path'; +import { getIsLazer, getOsuPath } from '../modules/Settings/reducer/selectors'; export const HistoryContext = createContext(); export const useDownloadHistory = () => useContext(HistoryContext); @@ -74,7 +77,18 @@ class HistoryProvider extends Component { } componentDidMount() { - this._readHistory(); + const setup = async () => { + await this._readHistory(); + + const { osuPath, isLazer } = this.props; + const result = await ipcRenderer.invoke('osuSongsScan', { + osuPath, + isLazer, + }); + + this.set(result); + }; + setup(); } componentDidUpdate() { @@ -127,8 +141,8 @@ class HistoryProvider extends Component { }); }; - _readHistory = () => { - readJson(this.path) + _readHistory = async () => { + await readJson(this.path) .then(rawHistory => { // Check if history is from a version prior to 0.3.0 if (!Array.isArray(Object.values(rawHistory)[0])) { @@ -175,4 +189,8 @@ class HistoryProvider extends Component { } } -export default HistoryProvider; +const mapStateToProps = state => ({ + osuPath: getOsuPath(state), + isLazer: getIsLazer(state), +}); +export default connect(mapStateToProps)(HistoryProvider); diff --git a/src/App/modules/MyLibrary/index.jsx b/src/App/modules/MyLibrary/index.jsx index eab1437..93d2af3 100644 --- a/src/App/modules/MyLibrary/index.jsx +++ b/src/App/modules/MyLibrary/index.jsx @@ -6,6 +6,7 @@ import { getFadeIn, sectionSwitchAnimation } from '../../helpers/css.utils'; import AllBeatmapsCollection from './components/AllBeatmaps'; import Collection from './components/Collection'; import CollectionDetails from './components/CollectionDetails'; +import { getCollections } from './selectors'; const useStyle = createUseStyles({ ...getFadeIn(), @@ -51,7 +52,7 @@ const MyLibrary = ({ setHeaderContent, collections }) => {
- {Object.entries(collections).map(([name, beatmapsHash]) => ( + {collections.map(([name, beatmapsHash]) => ( { ); }; -const mapStateToProps = ({ app, library }) => ({ - windowSize: app.window, - collections: library.collections, +const mapStateToProps = (state) => ({ + windowSize: state.app.window, + collections: getCollections(state) }); export default connect(mapStateToProps)(MyLibrary); diff --git a/src/App/modules/MyLibrary/selectors.js b/src/App/modules/MyLibrary/selectors.js new file mode 100644 index 0000000..c81a607 --- /dev/null +++ b/src/App/modules/MyLibrary/selectors.js @@ -0,0 +1 @@ +export const getCollections = state => state.library.collections; diff --git a/src/App/modules/Settings/Setting.js b/src/App/modules/Settings/Setting.js index db77b11..9475d8a 100644 --- a/src/App/modules/Settings/Setting.js +++ b/src/App/modules/Settings/Setting.js @@ -108,7 +108,12 @@ const Setting = ({ settingCategory }) => { case 'Button': return (
-
{item.description}
diff --git a/src/App/modules/Settings/helpers/baseConf.js b/src/App/modules/Settings/helpers/baseConf.js index d8f681b..a336cef 100644 --- a/src/App/modules/Settings/helpers/baseConf.js +++ b/src/App/modules/Settings/helpers/baseConf.js @@ -9,6 +9,7 @@ export default Object.freeze({ autoImport: true, importMethod: 'auto', osuPath: '', + isLazer: false, osuSongsPath: '', theme: { accentColor: config.display.defaultAccentColor, @@ -21,7 +22,7 @@ export default Object.freeze({ isBotAccount: false, }, osuApi: { - key: "", + key: '', }, }, beatconnectAPI: { diff --git a/src/App/modules/Settings/index.js b/src/App/modules/Settings/index.js index 9798439..e024571 100644 --- a/src/App/modules/Settings/index.js +++ b/src/App/modules/Settings/index.js @@ -1,7 +1,7 @@ import React, { useEffect, useState, cloneElement } from 'react'; import { useTheme } from 'react-jss'; import { remote, shell } from 'electron'; -import { connect, useDispatch } from 'react-redux'; +import { connect, useDispatch, useSelector } from 'react-redux'; import { error } from 'electron-log'; import { setIrcUser, setIrcPass, setIRCIsBot, setOSUApiKey, setPrefix } from './reducer/actions'; import ConfLoader from './helpers/ConfLoader'; @@ -17,6 +17,7 @@ import { clearCollections } from '../MyLibrary/actions'; import { scanOsuCollection } from './utils/scanOsuCollections'; import store from '../../../shared/store'; import { getVersion } from '../../helpers/path'; +import { getIsLazer } from './reducer/selectors'; const Settings = ({ userPreferences }) => { const { irc, osuApi, prefix, osuSongsPath, osuPath, lastScan, importMethod } = userPreferences; @@ -24,11 +25,12 @@ const Settings = ({ userPreferences }) => { const theme = useTheme(); const history = useDownloadHistory(); const dispatch = useDispatch(); + const isLazer = useSelector(getIsLazer); const { handleAccentColorSelect, handleImportMethodChange, osuPathSetup } = useSettingsUtils(userPreferences); const scanOsuSongs = useOsuDbScan(); const scanOsu = () => { - scanOsuSongs(); + scanOsuSongs(isLazer); scanOsuCollection(osuPath); }; @@ -54,7 +56,12 @@ const Settings = ({ userPreferences }) => { 'Giving access to the osu! folder allow osu!.db and collection.db read, enabling Beatconnect to auto sync on startup with your game', type: 'Text', }, - { name: 'Select your Osu! Songs folder', action: () => osuPathSetup('song'), type: 'Button' }, + { + name: 'Select your Osu! Songs folder', + action: () => osuPathSetup('song'), + type: 'Button', + disabled: isLazer, + }, { name: osuSongsPath || 'No songs folder set', description: 'By selecting your osu songs folder enable the Bulk import and scan option', @@ -75,8 +82,8 @@ const Settings = ({ userPreferences }) => { value: importMethod === config.settings.importMethod.bulk, action: () => handleImportMethodChange(config.settings.importMethod.bulk), description: - 'Beatmaps are placed in you songs folder after downloading and osu! will import them after reload of the beatmaps selection', - disabled: !osuSongsPath || osuSongsPath === '', + 'Beatmaps are placed in you songs folder after downloading and osu! will import them after reload of the beatmaps selection. Not supported for Osu!Lazer', + disabled: !osuSongsPath || osuSongsPath === '' || isLazer, type: 'CheckBox', }, { diff --git a/src/App/modules/Settings/reducer/actions.js b/src/App/modules/Settings/reducer/actions.js index 21930b1..aaccb0d 100644 --- a/src/App/modules/Settings/reducer/actions.js +++ b/src/App/modules/Settings/reducer/actions.js @@ -45,3 +45,5 @@ export const setLastScan = payload => store.dispatch({ type: 'LASTSCAN', payload export const setImportMethod = payload => store.dispatch({ type: 'SETIMPORTMETHOD', payload }); export const saveThemeAccentColor = payload => store.dispatch({ type: 'SET_THEME_ACCENT_COLOR', payload }); + +export const setIsLazer = payload => store.dispatch({ type: 'SET_IS_LAZER', payload }); diff --git a/src/App/modules/Settings/reducer/reducer.js b/src/App/modules/Settings/reducer/reducer.js index 707efdf..23468b5 100644 --- a/src/App/modules/Settings/reducer/reducer.js +++ b/src/App/modules/Settings/reducer/reducer.js @@ -45,6 +45,9 @@ export default (settings = confLoader.config, { type, payload }) => { case 'SET_THEME_ACCENT_COLOR': userPreferences = { ...userPreferences, theme: { accentColor: payload } }; return { ...settings, userPreferences: { ...userPreferences } }; + case 'SET_IS_LAZER': + userPreferences = { ...userPreferences, isLazer: payload }; + return { ...settings, userPreferences: { ...userPreferences } }; default: return settings; } diff --git a/src/App/modules/Settings/reducer/selectors.js b/src/App/modules/Settings/reducer/selectors.js index c9aeffb..c81d19f 100644 --- a/src/App/modules/Settings/reducer/selectors.js +++ b/src/App/modules/Settings/reducer/selectors.js @@ -12,3 +12,5 @@ export const getOsuApiKey = state => { let apiKey = _.get(getUserPreference(state), ['osuApi', 'key'], ''); return _.isEmpty(apiKey.trim()) ? process.env.BEATCONNECT_CLIENT_API_KEY_V1 : apiKey; }; + +export const getIsLazer = state => _.get(getUserPreference(state), ['isLazer'], false); diff --git a/src/App/modules/Settings/utils/useScanOsuSongs.js b/src/App/modules/Settings/utils/useScanOsuSongs.js index f858d12..fcf6181 100644 --- a/src/App/modules/Settings/utils/useScanOsuSongs.js +++ b/src/App/modules/Settings/utils/useScanOsuSongs.js @@ -7,7 +7,7 @@ import { useSelector } from 'react-redux'; import { useDownloadHistory } from '../../../Providers/HistoryProvider'; import { useTasks } from '../../../Providers/TaskProvider.bs'; import { setLastScan } from '../reducer/actions'; -import { getOsuPath, getOsuSongPath } from '../reducer/selectors'; +import { getIsLazer, getOsuPath, getOsuSongPath } from '../reducer/selectors'; import { scanOsuCollection } from './scanOsuCollections'; export const useOsuDbScan = () => { @@ -17,7 +17,8 @@ export const useOsuDbScan = () => { const history = useDownloadHistory(); const [isScanning, setIsScanning] = useState(false); - const scanOsuSongs = async () => { + const scanOsuSongs = async isLazer => { + console.log('scanOsuSongs', isLazer); if (isScanning) return; if (!osuPath && !osuSongsPath) { alert('You need to select your osu! or songs folder before performing a scan'); @@ -26,7 +27,7 @@ export const useOsuDbScan = () => { setIsScanning(true); addTask({ name: 'Scanning beatmaps', status: 'running', description: '', section: 'Settings' }); try { - const result = await ipcRenderer.invoke('osuSongsScan', { osuPath }); + const result = await ipcRenderer.invoke('osuSongsScan', { osuPath, isLazer }); history.set(result); setLastScan({ date: Date.now(), beatmaps: Object.keys(result.beatmaps).length }); } catch (e) { @@ -45,9 +46,10 @@ export const useOsuDbAutoScan = () => { const osuDbScan = useOsuDbScan(); const osuSongsPath = useSelector(getOsuSongPath); const osuPath = useSelector(getOsuPath); + const isLazer = useSelector(getIsLazer); useEffect(() => { if (osuPath && osuSongsPath !== '') { - osuDbScan(); + osuDbScan(isLazer); scanOsuCollection(osuPath); } }, []); diff --git a/src/App/modules/Settings/utils/useSettingsUtils.js b/src/App/modules/Settings/utils/useSettingsUtils.js index dea8520..df28c63 100644 --- a/src/App/modules/Settings/utils/useSettingsUtils.js +++ b/src/App/modules/Settings/utils/useSettingsUtils.js @@ -5,18 +5,17 @@ import { useSelector } from 'react-redux'; import config from '../../../../shared/config'; import { useDownloadQueue } from '../../../Providers/downloadManager'; import { useSetTheme } from '../../../Providers/ThemeProvider'; -import { saveThemeAccentColor, setImportMethod, setOsuSongsPath, setOsuPath } from '../reducer/actions'; +import { saveThemeAccentColor, setImportMethod, setOsuSongsPath, setOsuPath, setIsLazer } from '../reducer/actions'; import { getOsuSongPath } from '../reducer/selectors'; const checkOsuPath = async path => { try { - const isPathValid = await ipcRenderer.invoke('validate-osu-path', path); - return !!isPathValid; + return await ipcRenderer.invoke('validate-osu-path', path); } catch (e) { // eslint-disable-next-line no-alert alert(`An error occured while setting the osu folder, please try again.`); error('[osuPathSetup]: ', e); - return false; + return { isValid: false, isLazer: false }; } }; @@ -43,14 +42,16 @@ const useSettingsUtils = ({ osuSongsPath, importMethod }) => { setPath(importMethod, filePaths[0]); setOsuSongsPath(filePaths[0]); } else { - const isValid = await checkOsuPath(filePaths[0]); + const { isValid, isLazer } = await checkOsuPath(filePaths[0]); if (!isValid) { // eslint-disable-next-line no-alert alert(`The provided folder doesn't seems be a valid osu folder.`); return; } + // always set isLazer before osuPath or bad things will happen! + setIsLazer(isLazer); setOsuPath(filePaths[0]); - if (!currentOsuSongsPath) { + if (!currentOsuSongsPath && !isLazer) { const songsPath = join(filePaths[0], 'Songs'); if (await isDirectory(songsPath)) { setOsuSongsPath(join(filePaths[0], 'Songs')); diff --git a/src/App/modules/common/Button.jsx b/src/App/modules/common/Button.jsx index 1596f26..9800671 100644 --- a/src/App/modules/common/Button.jsx +++ b/src/App/modules/common/Button.jsx @@ -20,6 +20,9 @@ const useStyles = createUseStyles({ '&:active': { opacity: 0.9, }, + '&:disabled' : { + filter: 'grayscale(.55)', + }, '&:active svg': { transform: 'scale(.88)', }, diff --git a/src/App/modules/common/NavPanel/SidePanel/PlayOsu.js b/src/App/modules/common/NavPanel/SidePanel/PlayOsu.js index 2b7f3e3..00076a9 100644 --- a/src/App/modules/common/NavPanel/SidePanel/PlayOsu.js +++ b/src/App/modules/common/NavPanel/SidePanel/PlayOsu.js @@ -9,7 +9,7 @@ import { changeCurrentSection } from '../../../../app.actions'; import { tFromJs as sections } from '../../../Sections.bs'; import { useOsuDbScan } from '../../../Settings/utils/useScanOsuSongs'; import { scanOsuCollection } from '../../../Settings/utils/scanOsuCollections'; -import { getOsuPath } from '../../../Settings/reducer/selectors'; +import { getIsLazer, getOsuPath } from '../../../Settings/reducer/selectors'; const useStyle = createUseStyles({ playOsuWrapper: { @@ -100,6 +100,7 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => { const isScanning = useRef(false); const osuScan = useOsuDbScan(); const osuPath = useSelector(getOsuPath); + const isLazer = useSelector(getIsLazer); const invalidateNextOsuState = useRef(false); const launchOsu = () => { @@ -125,7 +126,7 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => { useEffect(() => { if (!isOsuSet || isScanning.current || osuIsRunning) return; isScanning.current = true; - osuScan(); + osuScan(isLazer); scanOsuCollection(osuPath) .catch(e => { error(`[scanOsuCollection]: ${e}`); @@ -133,12 +134,12 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => { .finally(() => { isScanning.current = false; }); - }, [osuIsRunning, isOsuSet]); + }, [osuIsRunning, isOsuSet, isLazer]); return (
dispatch(changeCurrentSection(sections('Settings')))} + onClick={isOsuSet && !isLazer ? launchOsu : () => dispatch(changeCurrentSection(sections('Settings')))} role="tab" > @@ -154,7 +155,8 @@ const PlayOsu = ({ onSelect, osuGamePath, ...otherProps }) => {
{!isOsuSet && 'Osu! not set'} - {isOsuSet && (osuIsRunning ? 'Playing !' : 'Play !')} + {isOsuSet && !isLazer && (osuIsRunning ? 'Playing!' : 'Play!')} + {isLazer && 'Lazer!'}
diff --git a/src/App/modules/common/NavPanel/SidePanel/TasksControl.js b/src/App/modules/common/NavPanel/SidePanel/TasksControl.js index 3e542d6..0cd3f11 100644 --- a/src/App/modules/common/NavPanel/SidePanel/TasksControl.js +++ b/src/App/modules/common/NavPanel/SidePanel/TasksControl.js @@ -125,8 +125,10 @@ const TasksControl = ({ onSelect, ...otherProps }) => { ))} ); + return null; }; return ( + // eslint-disable-next-line jsx-a11y/anchor-is-valid - - - + + + @@ -33,8 +33,8 @@ root.render( - - - + + + , ); diff --git a/src/electron/helpers/index.js b/src/electron/helpers/index.js index fef570d..0adf640 100644 --- a/src/electron/helpers/index.js +++ b/src/electron/helpers/index.js @@ -1,3 +1,5 @@ +const { promises: fs } = require('fs'); + const readableBits = (bytes, decimals) => { if (bytes === 0) return '0 Bytes'; const k = 1000; @@ -17,9 +19,19 @@ const getBeatconnectProtocolParams = (argv = [''], protocol) => { return undefined; }; +async function exists(path) { + try { + await fs.access(path); + return true; + } catch { + return false; + } +} + module.exports = { readableBits, makeDownloadUrl, getBeatconnectProtocolParams, removeProtocolPrefix, + exists, }; diff --git a/src/electron/helpers/osuCollections/collections.utils.js b/src/electron/helpers/osuCollections/collections.utils.js index 6912ca2..f1d6a82 100644 --- a/src/electron/helpers/osuCollections/collections.utils.js +++ b/src/electron/helpers/osuCollections/collections.utils.js @@ -6,7 +6,7 @@ const readCollectionDB = path => fs.readFile(path, (err, buf) => { if (err || !buf) return reject(new Error('Failed to open collection.db')); - const collections = {}; + const collections = []; // eslint-disable-next-line no-underscore-dangle, no-unused-vars const _version = buf.readInt32LE(0); @@ -15,7 +15,8 @@ const readCollectionDB = path => for (let i = 0; i < collectionCount; i++) { const name = readString(buf, offset); offset += name.length; - collections[name.str] = []; + + collections[i] = [name.str, []]; const beatmapCount = buf.readInt32LE(offset); offset += 4; @@ -23,7 +24,7 @@ const readCollectionDB = path => for (let j = 0; j < beatmapCount; j++) { const md5 = readString(buf, offset); offset += md5.length; - collections[name.str].push(md5.str); + collections[i][1].push(md5.str); } } @@ -36,19 +37,17 @@ const writeCollectionDB = (path, collections) => let buf = Buffer.alloc(8); buf.writeInt32LE(20160212); - buf.writeInt32LE(Object.keys(collections).length, 4); + buf.writeInt32LE(collections.length, 4); - const collectionNames = Object.keys(collections); - - collectionNames.forEach(name => { + collections.forEach(([name, beatmapsMd5]) => { buf = Buffer.concat([buf, createString(name)]); const beatmapCountBuf = Buffer.alloc(4); - beatmapCountBuf.writeInt32LE(collections[name].length); + beatmapCountBuf.writeInt32LE(beatmapsMd5.length); buf = Buffer.concat([buf, beatmapCountBuf]); - for (let j = 0; j < collections[name].length; j++) { - buf = Buffer.concat([buf, createString(collections[name][j])]); + for (let j = 0; j < beatmapsMd5.length; j++) { + buf = Buffer.concat([buf, createString(beatmapsMd5[j])]); } }); diff --git a/src/electron/helpers/osuLazer.js b/src/electron/helpers/osuLazer.js new file mode 100644 index 0000000..5e54aa0 --- /dev/null +++ b/src/electron/helpers/osuLazer.js @@ -0,0 +1,8 @@ +const { open } = require('osu-lazer-db-reader'); + +const readLazerDb = async path => { + const { beatmaps } = await open(path); + return beatmaps; +}; + +module.exports = { readLazerDb }; diff --git a/src/electron/helpers/osudb.js b/src/electron/helpers/osudb.js index 6da08d1..bd81412 100644 --- a/src/electron/helpers/osudb.js +++ b/src/electron/helpers/osudb.js @@ -190,16 +190,3 @@ module.exports = { readScoresDB, writeScoresDB, }; - -// readCollectionDB('./collection.db', collections => { -// console.log('READ : ', collections); -// collections['Top KEK'] = [ -// 'DABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', -// 'OMEGAROBDAB', -// 'SAMARCH', -// '44444444444444444444444444444449', -// ]; -// writeCollectionDB('./collection.db', collections, () => { -// readCollectionDB('./collection.db', console.log); -// }); -// }); diff --git a/src/electron/ipcMessages.js b/src/electron/ipcMessages.js index 27e0e66..64d5890 100644 --- a/src/electron/ipcMessages.js +++ b/src/electron/ipcMessages.js @@ -4,13 +4,14 @@ const { ipcMain, dialog, shell } = require('electron'); const fs = require('fs').promises; const { join } = require('path'); const { downloadAndSetWallpaper } = require('./wallpaper'); -const { readCollectionDB } = require('./helpers/osuCollections/collections.utils'); +const { readCollectionDB, writeCollectionDB } = require('./helpers/osuCollections/collections.utils'); const startPullingOsuState = require('./threads/osuIsRunning'); const scanOsuDb = require('./threads/osuSongsScan'); +const { exists } = require('./helpers'); -ipcMain.handle('osuSongsScan', async (event, { osuPath }) => { +ipcMain.handle('osuSongsScan', async (event, { osuPath, isLazer }) => { try { - const [beatmaps, overallDuration, overallUnplayedCount] = await scanOsuDb(`${osuPath}/osu!.db`); + const [beatmaps, overallDuration, overallUnplayedCount] = await scanOsuDb(`${osuPath}/osu!.db`, isLazer); return { beatmaps, overallDuration, overallUnplayedCount }; } catch (e) { error(`[scan-osu-songs]: ${e.message}`); @@ -46,6 +47,17 @@ ipcMain.once('start-pulling-osu-state', event => { ipcMain.handle('scan-osu-collections', async (event, osuPath) => { try { const collection = await readCollectionDB(`${osuPath}/collection.db`); + + // const test = await readCollectionDB(`${osuPath}/collection.db`); + + // console.log('READ : ', test); + // test.push([ + // 'Top KEK', + // ['DABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', 'OMEGAROBDAB', 'SAMARCH', '44444444444444444444444444444449'], + // ]); + + // await writeCollectionDB(`${osuPath}/collection.db`, test); + return collection; } catch (e) { error(`[scan-osu-collections]: ${e.message}`); @@ -54,12 +66,13 @@ ipcMain.handle('scan-osu-collections', async (event, osuPath) => { }); ipcMain.handle('validate-osu-path', async (event, osuPath) => { - try { - const isPathValid = await fs.stat(`${osuPath}/osu!.db`); - return isPathValid.isFile(); - } catch { - return false; + const isPathValid = await exists(`${osuPath}/collection.db`); + if (isPathValid) { + const isLegacyOsu = await exists(`${osuPath}/osu.db`); + const isLazer = await exists(`${osuPath}/client.realm`); + return { isValid: isLegacyOsu || isLazer, isLazer }; } + return { isValid: false, isLazer: false }; }); ipcMain.handle('is-dir', async (event, path) => { diff --git a/src/electron/threads/osuSongsScan.js b/src/electron/threads/osuSongsScan.js index 91cae35..fbb0bb2 100644 --- a/src/electron/threads/osuSongsScan.js +++ b/src/electron/threads/osuSongsScan.js @@ -1,31 +1,71 @@ const { Worker } = require('worker_threads'); const { join } = require('path'); const { error } = require('electron-log'); +const { readLazerDb } = require('../helpers/osuLazer'); -const scanOsuDb = osuDbPath => +const scanOsuDb = (osuDbPath, isLazer = false) => new Promise((resolve, reject) => { - const worker = new Worker(join(__dirname, './osuSongsScan.worker.js')); - const terminate = () => { - worker.removeAllListeners(); - worker.terminate(); - }; - worker.on('message', data => { - switch (data[0]) { - case 'result': - terminate(); - resolve(data[1]); - break; - case 'error': - terminate(); - error(`[scanOsuDb thread]: ${data[1]}`); - reject(data[1]); - break; - default: - terminate(); - break; + switch (isLazer) { + case true: { + readLazerDb('/Users/ypetitot/.local/share/osu/client.realm') + .then(beatmaps => { + const beatmapsList = {}; + + beatmaps.forEach(beatmap => { + if (beatmap.BeatmapSet.OnlineID === -1) return; + + if (beatmapsList[beatmap.BeatmapSet.OnlineID]) { + beatmapsList[beatmap.BeatmapSet.OnlineID].mapsMd5.push(beatmap.MD5Hash); + return; + } + beatmapsList[beatmap.BeatmapSet.OnlineID] = { + id: beatmap.BeatmapSet.OnlineID, + date: beatmap.BeatmapSet.DateAdded.getTime(), + title: beatmap.Metadata.Title, + artist: beatmap.Metadata.Artist, + creator: beatmap.Metadata.Author.Username, + isUnplayed: false, + mapsMd5: [beatmap.MD5Hash], + audioPath: '', + previewOffset: beatmap.Metadata.PreviewTime, + songDuration: beatmap.Length / 1000, + }; + }); + + resolve([beatmapsList]); + }) + .catch(reject); + + break; } - }); - worker.postMessage(osuDbPath); + case false: { + const worker = new Worker(join(__dirname, './osuSongsScan.worker.js')); + const terminate = () => { + worker.removeAllListeners(); + worker.terminate(); + }; + worker.on('message', data => { + switch (data[0]) { + case 'result': + terminate(); + resolve(data[1]); + break; + case 'error': + terminate(); + error(`[scanOsuDb thread]: ${data[1]}`); + reject(data[1]); + break; + default: + terminate(); + break; + } + }); + worker.postMessage({ osuDbPath, isLazer }); + break; + } + default: + break; + } }); module.exports = scanOsuDb; diff --git a/src/electron/threads/osuSongsScan.worker.js b/src/electron/threads/osuSongsScan.worker.js index 9e29eac..1971a8d 100644 --- a/src/electron/threads/osuSongsScan.worker.js +++ b/src/electron/threads/osuSongsScan.worker.js @@ -2,40 +2,52 @@ const { parentPort } = require('worker_threads'); const { join } = require('path'); const { readOsuDB, winTickToMs } = require('../helpers/osudb'); -parentPort.on('message', osuDbPath => { - if (osuDbPath) { - try { - const re = readOsuDB(osuDbPath); - const beatmaps = {}; - let overallDuration = 0; - let overallUnplayedCount = 0; - if (!re.beatmaps || !Array.isArray(re.beatmaps)) { - throw new Error('Could not get beatmaps from osu db'); - } - re.beatmaps.forEach(beatmap => { - if (beatmap.beatmapset_id === -1) return; - if (beatmaps[beatmap.beatmapset_id]) { - beatmaps[beatmap.beatmapset_id].mapsMd5.push(beatmap.md5); - return; - } - if (beatmap.unplayed) overallUnplayedCount += 1; - overallDuration += beatmap.total_time; - beatmaps[beatmap.beatmapset_id] = { - id: beatmap.beatmapset_id, - date: winTickToMs(beatmap.last_modification_time), - title: beatmap.song_title, - artist: beatmap.artist_name, - creator: beatmap.creator_name, - isUnplayed: beatmap.unplayed, - mapsMd5: [beatmap.md5], - audioPath: join(beatmap.folder_name, beatmap.audio_file_name), - previewOffset: beatmap.preview_offset, - songDuration: Math.ceil(beatmap.total_time / 1000), - }; - }); - parentPort.postMessage(['result', [beatmaps, overallDuration, overallUnplayedCount]]); - } catch (e) { - parentPort.postMessage(['error', e.message]); +parentPort.on('message', ({ osuDbPath, isLazer = false }) => { + if (!osuDbPath) { + parentPort.postMessage(['error', 'missing osuDbPath']); + return; + } + switch (isLazer) { + case true: { + break; } + case false: { + try { + const re = readOsuDB(osuDbPath); + const beatmaps = {}; + let overallDuration = 0; + let overallUnplayedCount = 0; + if (!re.beatmaps || !Array.isArray(re.beatmaps)) { + throw new Error('Could not get beatmaps from osu db'); + } + re.beatmaps.forEach(beatmap => { + if (beatmap.beatmapset_id === -1) return; + if (beatmaps[beatmap.beatmapset_id]) { + beatmaps[beatmap.beatmapset_id].mapsMd5.push(beatmap.md5); + return; + } + if (beatmap.unplayed) overallUnplayedCount += 1; + overallDuration += beatmap.total_time; + beatmaps[beatmap.beatmapset_id] = { + id: beatmap.beatmapset_id, + date: winTickToMs(beatmap.last_modification_time), + title: beatmap.song_title, + artist: beatmap.artist_name, + creator: beatmap.creator_name, + isUnplayed: beatmap.unplayed, + mapsMd5: [beatmap.md5], + audioPath: join(beatmap.folder_name, beatmap.audio_file_name), + previewOffset: beatmap.preview_offset, + songDuration: Math.ceil(beatmap.total_time / 1000), + }; + }); + parentPort.postMessage(['result', [beatmaps, overallDuration, overallUnplayedCount]]); + } catch (e) { + parentPort.postMessage(['error', e.message]); + } + break; + } + default: + break; } }); diff --git a/yarn.lock b/yarn.lock index cb67866..4b230ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2208,6 +2208,13 @@ __metadata: languageName: node linkType: hard +"@realm.io/common@npm:^0.1.1": + version: 0.1.1 + resolution: "@realm.io/common@npm:0.1.1" + checksum: 29e9e0e0f706d31e1c12babb9d019f87bbd4a51b006d7b4796de375f9bb53ca893beb05a3e21b31d32314dbb905a9dadeebd4742c09a9ff83a612af7c5656192 + languageName: node + linkType: hard + "@rescript/react@npm:0.10.3": version: 0.10.3 resolution: "@rescript/react@npm:0.10.3" @@ -2957,6 +2964,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: cc53ad8df9a6de3f55d4f804fca5106908f855e47b572fb5ab3cdd723b76374686dcefa557a2f87d4396db77e31bc0e6ce9d48637388cef6d884c29ad2691448 + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -3069,6 +3085,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^4.3.0": + version: 4.3.0 + resolution: "agent-base@npm:4.3.0" + dependencies: + es6-promisify: ^5.0.0 + checksum: b40b7d9675c475202afac88c31d5ce42f041e50d2028bd4ad0cfc25b60abe4aedf6b976d9f653641663cbf45295539282d0cf7d50ece7f7c1dd0c05dc99a8112 + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.2.1 resolution: "agentkeepalive@npm:4.2.1" @@ -3300,7 +3325,7 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.1.1": +"aproba@npm:^1.0.3, aproba@npm:^1.1.1": version: 1.2.0 resolution: "aproba@npm:1.2.0" checksum: d4bac3e640af1f35eea8d5ee2b96ce2682549e47289f071aa37ae56066e19d239e43dea170c207d0f71586d7634099089523dd5701f26d4ded7b31dd5848a24a @@ -3317,6 +3342,16 @@ __metadata: languageName: node linkType: hard +"are-we-there-yet@npm:~1.1.2": + version: 1.1.7 + resolution: "are-we-there-yet@npm:1.1.7" + dependencies: + delegates: ^1.0.0 + readable-stream: ^2.0.6 + checksum: 2f2301155887bba5217cadd2a8aeffbc9716bd6339353950732bf3f2df6bbbec2b8a1291066a985719e30dd2a3eb873e9d81ed7962d2c46f9ac182dd265f97ed + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -3364,6 +3399,13 @@ __metadata: languageName: node linkType: hard +"array-back@npm:^3.0.1, array-back@npm:^3.1.0": + version: 3.1.0 + resolution: "array-back@npm:3.1.0" + checksum: 959a3377f21ac97490bc14607cc3fe888d087dc7beadab8db09e03061d59e901d695ac870b050f37cddd261e03963e4fca86287e3055e0688a06b95be66f0825 + languageName: node + linkType: hard + "array-equal@npm:^1.0.0": version: 1.0.0 resolution: "array-equal@npm:1.0.0" @@ -3464,6 +3506,13 @@ __metadata: languageName: node linkType: hard +"asap@npm:~2.0.3": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 3d314f8c598b625a98347bacdba609d4c889c616ca5d8ea65acaae8050ab8b7aa6630df2cfe9856c20b260b432adf2ee7a65a1021f268ef70408c70f809e3a39 + languageName: node + linkType: hard + "asar@npm:^3.1.0": version: 3.1.0 resolution: "asar@npm:3.1.0" @@ -3585,6 +3634,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.3": + version: 3.2.3 + resolution: "async@npm:3.2.3" + checksum: 566b6d62e3108757bca3bfbd2313d833bf3b13fb8d65a7715db8b5de7a284271584aee2029f7f39cc6f39cd9cb58336ea204003f76ca02c31240919022948b97 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -3972,6 +4028,7 @@ __metadata: miragejs: ^0.1.41 node-machine-id: ^1.1.12 osu-db-parser: "git+https://github.com/yadPe/osu-db-parser.git#6cc783f3a9270f730cd5038d03ada4a78634cd65" + osu-lazer-db-reader: 0.1.6 pnp-webpack-plugin: 1.2.1 prettier: ^1.18.2 ps-node: ^0.1.6 @@ -4028,6 +4085,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 15d009339c2eeaedb9dab39c48f910a2fd6a9ba11400e61990917ebf3b25fa32cd9b80c7531a95467078258f6a59bd3f5d93323565423a7843855a16a1794261 + languageName: node + linkType: hard + "bluebird-lst@npm:^1.0.9": version: 1.0.9 resolution: "bluebird-lst@npm:1.0.9" @@ -4299,6 +4367,15 @@ __metadata: languageName: node linkType: hard +"bson@npm:4.4.1": + version: 4.4.1 + resolution: "bson@npm:4.4.1" + dependencies: + buffer: ^5.6.0 + checksum: 2f6ba7f22a0818f0fd33509dd723a9f3f800f0142a7109180d5b17dca4e8cb67461c9f2c9fad71e68d9b9435f499d1b028af6eefa812f3ba727aeeec72a61c89 + languageName: node + linkType: hard + "buffer-alloc-unsafe@npm:^1.1.0": version: 1.1.0 resolution: "buffer-alloc-unsafe@npm:1.1.0" @@ -4369,7 +4446,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.1.0": +"buffer@npm:^5.1.0, buffer@npm:^5.5.0, buffer@npm:^5.6.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -4630,6 +4707,13 @@ __metadata: languageName: node linkType: hard +"caseless@npm:~0.11.0": + version: 0.11.0 + resolution: "caseless@npm:0.11.0" + checksum: 548c8594a26fc3ad14c8ba3df7674f0b45ca6886a3d5b6e77232b490d31e491d2d1b35ba724af6598d7be6ff4acb684afa65ae85a5ad377b91b3b5cb536ee178 + languageName: node + linkType: hard + "caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -4803,6 +4887,21 @@ __metadata: languageName: node linkType: hard +"clang-format@npm:^1.6.0": + version: 1.8.0 + resolution: "clang-format@npm:1.8.0" + dependencies: + async: ^3.2.3 + glob: ^7.0.0 + resolve: ^1.1.6 + bin: + check-clang-format: bin/check-clang-format.js + clang-format: index.js + git-clang-format: bin/git-clang-format + checksum: ab9c75aff5ade98ff08c9599c9f557c85f6fc5e61c757c6c3f8480667bfb75f445613c8b533ce58edee44248a6e84aa9df47bbcbcf38e97703f89a80e0d832cf + languageName: node + linkType: hard + "class-utils@npm:^0.3.5": version: 0.3.6 resolution: "class-utils@npm:0.3.6" @@ -4924,6 +5023,13 @@ __metadata: languageName: node linkType: hard +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 7d9837296e0f1c00239c88542f5a3e0bad11e45d3d0e8d9d097901fe54722dd5d2c006969077a287be8648a202c43f74e096f17552cbd897568308fba7b87ac0 + languageName: node + linkType: hard + "collect-v8-coverage@npm:^1.0.0": version: 1.0.1 resolution: "collect-v8-coverage@npm:1.0.1" @@ -4998,6 +5104,18 @@ __metadata: languageName: node linkType: hard +"command-line-args@npm:^5.1.1": + version: 5.2.1 + resolution: "command-line-args@npm:5.2.1" + dependencies: + array-back: ^3.1.0 + find-replace: ^3.0.0 + lodash.camelcase: ^4.3.0 + typical: ^4.0.0 + checksum: d1ac094956e20d52f8da015718586b04dec3b99455fd00c8c1776bbecbc5d94da97a0adb6bdcf31d100b8aebfb970bd47a82604975d15a720012b07a8da56826 + languageName: node + linkType: hard + "commander@npm:2.17.x": version: 2.17.1 resolution: "commander@npm:2.17.1" @@ -5097,7 +5215,7 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^1.5.0, concat-stream@npm:^1.6.2": +"concat-stream@npm:^1.4.6, concat-stream@npm:^1.4.7, concat-stream@npm:^1.5.0, concat-stream@npm:^1.6.2": version: 1.6.2 resolution: "concat-stream@npm:1.6.2" dependencies: @@ -5161,7 +5279,7 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 58a404d951bf270494fb91e136cf064652c1208ccedac23e4da24e6a3a3933998f302cadc45cbf6582a007a4aa44dab944e84056b24e3b1964e9a28aeedf76c9 @@ -5808,7 +5926,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -5857,6 +5975,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: ^3.1.0 + checksum: bb8b8c42be7767994764d27f91a3949e3dc9008da82f1aaeab1de40f1ebb50d7abf17b31b2e4000f8d267a1e75f76052efd58d4419124c04bf430e184c164fad + languageName: node + linkType: hard + "deep-equal@npm:^1.0.1": version: 1.1.1 resolution: "deep-equal@npm:1.1.1" @@ -5885,6 +6012,13 @@ __metadata: languageName: node linkType: hard +"deepmerge@npm:2.1.0": + version: 2.1.0 + resolution: "deepmerge@npm:2.1.0" + checksum: 7ddcbc182fc324df524ad7e7f079d10d70fc665613a46a04b8979cbe560742410eb866cfec9ea4d58276b2767018da8d225c5146d860340507ddee276e2f0c91 + languageName: node + linkType: hard + "deepmerge@npm:^4.2.2": version: 4.2.2 resolution: "deepmerge@npm:4.2.2" @@ -5999,6 +6133,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.0.1 + resolution: "detect-libc@npm:2.0.1" + checksum: 18266d3cc95aff315809cd0d292cbb0e40673df164a0a674c31e05ff9574b5b088e9f6517c9ac9b5e1896548edc105ad59af71b4c8172229226fbc448a6814ad + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -6543,7 +6684,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -6659,6 +6800,22 @@ __metadata: languageName: node linkType: hard +"es6-promise@npm:^4.0.3": + version: 4.2.8 + resolution: "es6-promise@npm:4.2.8" + checksum: b85e5faab1b3785b8bf1a6c91b5f176cf3e5e4550359508ef54dd58b19ad2b831e04607e2a0a464f2a1407bf02897d5c88daf6e3d94c2ee4510e8191b44b64ef + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: ^4.0.3 + checksum: 657d2f0623ddec94f7e3a881fcd73e33c26e796c25791169b50527014b58995a1cc35578595b6f28a71896d44dc00a98e6cf838804582c8fa38f9a4bb7ef1761 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -7082,6 +7239,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: d176477a31adf328ff50148886e46cef3f61ff8bdc1d6db161f6b3ead2501085d5652a81fab8dddc59aed93727231c0b5c8a0948de77ae401b2d977a3d18329e + languageName: node + linkType: hard + "eventemitter3@npm:^4.0.0": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -7177,6 +7341,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: d1c08a374a2335647562d6958bf23a40371fd9eb64362f3a2475b232a8d2e4bfa8f746066ff45c17efde185dab66f5d0824eaaa26e3e491d03bff50be0be7c3d + languageName: node + linkType: hard + "expect@npm:^26.6.2": version: 26.6.2 resolution: "expect@npm:26.6.2" @@ -7497,6 +7668,15 @@ __metadata: languageName: node linkType: hard +"find-replace@npm:^3.0.0": + version: 3.0.0 + resolution: "find-replace@npm:3.0.0" + dependencies: + array-back: ^3.0.1 + checksum: 9aec6a6dfe746e7dddb12bf38bd395f30b40d2f3f3518ed10b63286daf9ad9f29ee6b4a74e7e4fda4a3bbd63fca9d96c32fdcb7dfe117010d601d2bf74bbf34d + languageName: node + linkType: hard + "find-root@npm:^1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" @@ -7674,6 +7854,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: b8382395f555012591b20bddf08d258723f660b4e7312943d10431a893e2af879295fefc15a917df43c9ed52d80d2f014c0ca8ca359367969be5c8a133e39742 + languageName: node + linkType: hard + "fs-extra@npm:^10.0.0": version: 10.0.1 resolution: "fs-extra@npm:10.0.1" @@ -7685,6 +7872,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^4.0.3": + version: 4.0.3 + resolution: "fs-extra@npm:4.0.3" + dependencies: + graceful-fs: ^4.1.2 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: ad42def19446c82543ebfa707250de2e1adff8f1c902f9cad3946f69b3dad326696f70e86c3aebeab4bc4f19ff3ef9abee0460d7fb775122f3dc9142a4b1280f + languageName: node + linkType: hard + "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -7804,6 +8002,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"gauge@npm:~2.7.3": + version: 2.7.4 + resolution: "gauge@npm:2.7.4" + dependencies: + aproba: ^1.0.3 + console-control-strings: ^1.0.0 + has-unicode: ^2.0.0 + object-assign: ^4.1.0 + signal-exit: ^3.0.0 + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + wide-align: ^1.1.0 + checksum: b136dbeb8e40acaaddab6c71c9f34d3c9aa104efc538c8c0ddcd74b25efb8daeb8dca24a9b30626b477d66beccd3dee8dd31e25eb4c7c97ec58a3f1a82914be1 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -7940,6 +8154,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 9c3bae601535f7de7e2f54cc58dcd2ae62aa7afd262e9edea9021a264e633859ad0aef6ec23328e26607e4259f1efb97ce9b5b01e3f80d7d258085a628c9b710 + languageName: node + linkType: hard + "glob-parent@npm:^3.1.0": version: 3.1.0 resolution: "glob-parent@npm:3.1.0" @@ -7966,6 +8187,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"glob@npm:^7.0.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 48c72ab438f8fc8aa2135d408d8af167d7bacf175b84d87a60d401cbdc50330aeb602cf16868efd4dbdb249117173394c25d49b2f642dd4764813ee6f9458c6c + languageName: node + linkType: hard + "glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.0 resolution: "glob@npm:7.2.0" @@ -8240,7 +8475,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"has-unicode@npm:^2.0.1": +"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" checksum: ed3719f95cbd7dada9e3fde6fad113eae6d317bc8e818a2350954914c098ca6eddb203261af2c291c49a14c52f83610becbc7ab8d569bee81261b9c260a435f2 @@ -8457,6 +8692,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"http-basic@npm:^2.5.1": + version: 2.5.1 + resolution: "http-basic@npm:2.5.1" + dependencies: + caseless: ~0.11.0 + concat-stream: ^1.4.6 + http-response-object: ^1.0.0 + checksum: d7cc8b94838e84b8049cf4a90378f6d199c36883aa070e9212db1c877efe3b65f4e524d01c86544e9ae618b4eba78257ec1d5470928a794a53f51a0ab82c8286 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": version: 4.1.0 resolution: "http-cache-semantics@npm:4.1.0" @@ -8548,6 +8794,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"http-response-object@npm:^1.0.0, http-response-object@npm:^1.0.1, http-response-object@npm:^1.1.0": + version: 1.1.0 + resolution: "http-response-object@npm:1.1.0" + checksum: 4a3a131c521056ba7158b300494d9eb9a880fcf4545bb139cb107b903bbb1c52e81c32583cb45cc5ec1a5c61bd3c2f745c783fe7fa569057c19402a72711e7e8 + languageName: node + linkType: hard + "http-signature@npm:~1.2.0": version: 1.2.0 resolution: "http-signature@npm:1.2.0" @@ -8566,6 +8819,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"https-proxy-agent@npm:^2.2.4": + version: 2.2.4 + resolution: "https-proxy-agent@npm:2.2.4" + dependencies: + agent-base: ^4.3.0 + debug: ^3.1.0 + checksum: 4e42bed005d75debcfd6d3901edbd391dd72cda32a2ece4584443eb7025ac0a0f85fb01f45d385608a380f6bf2d659c632776ac17b898c6d991fd9ec1d32a1f0 + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.0 resolution: "https-proxy-agent@npm:5.0.0" @@ -8785,7 +9048,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": +"ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:^1.3.7, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 62189ce7ea44c5778e757e4232c581212e838f3c39e79d931bb9152fd4b9275f09fb20b96afdd60ba9f5d7996b92486cad6cc617fcb84ff4beedd1b33b86221e @@ -9085,6 +9348,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: ^1.0.0 + checksum: fc3d51ef082eaf0c0d44e94b74cf43b97446e008b147b08186daea8bd5ff402596f04b5fe4fa4c0457470beab5c2de8339c49c96b5be65fe9fdf88f60a0001e8 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^2.0.0": version: 2.0.0 resolution: "is-fullwidth-code-point@npm:2.0.0" @@ -11399,6 +11671,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: cfbf19f66de6ad46df7481d9e8c1a7f30b6fa77dd771ad4a72a0443265041a39768182bde6d1de39001c2774168635bc74f42902e401c8ba33db55d69b773004 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -11429,7 +11708,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -11449,7 +11728,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimist@npm:^1.1.1, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.1.1, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.6 resolution: "minimist@npm:1.2.6" checksum: 56b3aeedcc7776139f72ca9dce0dae06825437f71ebd823d97dc49a34f3280e627909d54aca6fa81c47e17f11e5affc7357bfb8fd8140ca6138e80f946dd0dbc @@ -11588,6 +11867,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: b3c46c62840bdc82c2a5bee417e4e7518a8109d32a85a6dc67bdcfecbe6aff5cfc73cdb98844a61178ddd8ac75743f977857f0badd6e12d14fd18cf1639e41a1 + languageName: node + linkType: hard + "mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" @@ -11704,6 +11990,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: e4dfbec94d315533fea33a96ef5fb4de0d9e8828f2bb2b30e38de089500dfe35fe058ea5bcd72e104381457263f854c3d52d4d8700df9e1f9e6b78e9500ba435 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -11741,6 +12034,24 @@ fsevents@^1.2.7: languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.22.0 + resolution: "node-abi@npm:3.22.0" + dependencies: + semver: ^7.3.5 + checksum: fc1a69ad3085a631ad8ef1c5b1f9554353c40f2fc8f83720a2635e363be92ad4acf04c4961a02896bf2213eaac173a4b0361228de6e762ae42f2ada39c889032 + languageName: node + linkType: hard + +"node-addon-api@npm:4.2.0": + version: 4.2.0 + resolution: "node-addon-api@npm:4.2.0" + dependencies: + node-gyp: latest + checksum: e0911dd01efed65c0a70db660570225904bf24d77b17801be42ecea01c8aaa9423c511b78fd89ce84b09149a7a4ed115bf9a84ff9ee6b779a1f68eefeef3972c + languageName: node + linkType: hard + "node-addon-api@npm:^1.6.3": version: 1.7.2 resolution: "node-addon-api@npm:1.7.2" @@ -11750,7 +12061,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"node-fetch@npm:^2.6.1": +"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" dependencies: @@ -11829,7 +12140,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"node-machine-id@npm:^1.1.12": +"node-machine-id@npm:^1.1.10, node-machine-id@npm:^1.1.12": version: 1.1.12 resolution: "node-machine-id@npm:1.1.12" checksum: 893cf7e3693fd693c3564a2dc1e32c5e43bb09e819365a3fbcbcc9fe1b694a2dd647da842483992653bd4afb7f797ef67c9e654665de5443143eed1db520b495 @@ -11950,6 +12261,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"npmlog@npm:^4.0.1": + version: 4.1.2 + resolution: "npmlog@npm:4.1.2" + dependencies: + are-we-there-yet: ~1.1.2 + console-control-strings: ~1.1.0 + gauge: ~2.7.3 + set-blocking: ~2.0.0 + checksum: 0cd63f127c1bbda403a112e83b11804aaee2b58b0bc581c3bde9b82e4d957c7ed0ad3bee499af706cdd3599bb93669d7cbbf29fb500407d35fe75687ac96e2c0 + languageName: node + linkType: hard + "npmlog@npm:^6.0.0": version: 6.0.1 resolution: "npmlog@npm:6.0.1" @@ -11980,6 +12303,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 42251b2653a16f8b47639d93c3b646fff295a4582a6b3a2fc51a651d4511427c247629709063d19befbceb8a3db1a8e9f17016b3a207291e79e4bd1413032918 + languageName: node + linkType: hard + "nwsapi@npm:^2.1.3, nwsapi@npm:^2.2.0": version: 2.2.0 resolution: "nwsapi@npm:2.2.0" @@ -11994,7 +12324,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 66cf021898fc1b13ea573ea8635fbd5a76533f50cecbc2fcd5eee1e8029af41bcebe7023788b6d0e06cbe4401ecea075d972f78ec74467cdc571a0f1a4d1a081 @@ -12257,6 +12587,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"osu-lazer-db-reader@npm:0.1.6": + version: 0.1.6 + resolution: "osu-lazer-db-reader@npm:0.1.6" + dependencies: + realm: ^10.17.0 + checksum: 69303143eda7fb06c7b5cbc5d6ef9d29ba327663ce2dc45629e6ae02bf419192a03877a2e8ac0f31035de8662ff577051bded1213762393e580c3b4c3913bee9 + languageName: node + linkType: hard + "p-cancelable@npm:^1.0.0": version: 1.1.0 resolution: "p-cancelable@npm:1.1.0" @@ -12715,6 +13054,29 @@ fsevents@^1.2.7: languageName: node linkType: hard +"prebuild-install@npm:^7.0.1": + version: 7.1.0 + resolution: "prebuild-install@npm:7.1.0" + dependencies: + detect-libc: ^2.0.0 + expand-template: ^2.0.3 + github-from-package: 0.0.0 + minimist: ^1.2.3 + mkdirp-classic: ^0.5.3 + napi-build-utils: ^1.0.1 + node-abi: ^3.3.0 + npmlog: ^4.0.1 + pump: ^3.0.0 + rc: ^1.2.7 + simple-get: ^4.0.0 + tar-fs: ^2.0.0 + tunnel-agent: ^0.6.0 + bin: + prebuild-install: bin.js + checksum: 6ac90302e771952f51614bab7be7234bfd7e38c00cef4561abbe5b3f498d0f76a2d0d3f758f5c7c6d4761b13ac9342d90e39f535b2cfc063f139ab5eddc89642 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -12815,6 +13177,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"promise@npm:^7.1.1": + version: 7.3.1 + resolution: "promise@npm:7.3.1" + dependencies: + asap: ~2.0.3 + checksum: 23267a4b078fcb02c57b06ca1a1d5739109deb0932c0fd79615a2c5636dd0571ac6a161f19c4ea9683a4ab89791da13112678fa410b65334de490e97c33410ae + languageName: node + linkType: hard + "prompts@npm:^2.0.1": version: 2.4.2 resolution: "prompts@npm:2.4.2" @@ -12825,7 +13196,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.8.1": +"prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -12965,6 +13336,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"qs@npm:^6.1.0": + version: 6.10.3 + resolution: "qs@npm:6.10.3" + dependencies: + side-channel: ^1.0.4 + checksum: 8428e7246f1cb17b6c05ca9d394ca5149926613409dafab943c7de2393efe5564944d2c8af73508a6dd825b1f9efb036053bed0f73dade26e1d44cfb465ee768 + languageName: node + linkType: hard + "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -13038,7 +13418,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"rc@npm:^1.2.8": +"rc@npm:^1.2.7, rc@npm:^1.2.8": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -13274,7 +13654,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": +"readable-stream@npm:1 || 2, readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": version: 2.3.7 resolution: "readable-stream@npm:2.3.7" dependencies: @@ -13289,7 +13669,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" dependencies: @@ -13320,6 +13700,51 @@ fsevents@^1.2.7: languageName: node linkType: hard +"realm-network-transport@npm:^0.7.2": + version: 0.7.2 + resolution: "realm-network-transport@npm:0.7.2" + dependencies: + abort-controller: ^3.0.0 + node-fetch: ^2.6.0 + checksum: 982b1b5a3a038d99b97dd70c54404d893a652385cd73da9905b8b51a2e03afe70ed53ddaf89f4b2326ec1e949f5e758474730efe88066a0364de0e4608b50f52 + languageName: node + linkType: hard + +"realm@npm:^10.17.0": + version: 10.17.0 + resolution: "realm@npm:10.17.0" + dependencies: + "@realm.io/common": ^0.1.1 + bindings: ^1.5.0 + bson: 4.4.1 + clang-format: ^1.6.0 + command-line-args: ^5.1.1 + deepmerge: 2.1.0 + fs-extra: ^4.0.3 + https-proxy-agent: ^2.2.4 + ini: ^1.3.7 + node-addon-api: 4.2.0 + node-fetch: ^2.6.1 + node-gyp: latest + node-machine-id: ^1.1.10 + prebuild-install: ^7.0.1 + progress: ^2.0.3 + prop-types: ^15.6.2 + realm-network-transport: ^0.7.2 + request: ^2.88.0 + stream-counter: ^1.0.0 + sync-request: ^3.0.1 + tar: ^6.0.1 + url-parse: ^1.4.4 + peerDependencies: + react-native: ">=0.60" + peerDependenciesMeta: + react-native: + optional: true + checksum: b02357598a730454edc479df1a06ed704e3ce94b65314abffcfa96df29b8d52419e3fa86b695523b5b92faa0c4c4088ca7f81176161bac6176a31f1da7bb1a04 + languageName: node + linkType: hard + "realpath-native@npm:^1.1.0": version: 1.1.0 resolution: "realpath-native@npm:1.1.0" @@ -13654,7 +14079,7 @@ resolve@1.17.0: languageName: node linkType: hard -"resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0": +"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0": version: 1.22.0 resolution: "resolve@npm:1.22.0" dependencies: @@ -13686,7 +14111,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.12.0#builtin, resolve@patch:resolve@^1.14.2#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.19.0#builtin, resolve@patch:resolve@^1.20.0#builtin": +"resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.12.0#builtin, resolve@patch:resolve@^1.14.2#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.19.0#builtin, resolve@patch:resolve@^1.20.0#builtin": version: 1.22.0 resolution: "resolve@patch:resolve@npm%3A1.22.0#builtin::version=1.22.0&hash=3388aa" dependencies: @@ -14104,7 +14529,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": +"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" checksum: 0ac2403b0c2d39bf452f6d5d17dfd3cb952b9113098e1231cc0614c436e2f465637e39d27cf3b93556f5c59795e9790fd7e98da784c5f9919edeba4295ffeb29 @@ -14234,6 +14659,24 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 4623960448a49731b5abeedc5430f8158c5caa05f10a685b405b13ed8532c80b5d99e6ef5d53f76a695e66f551cdbcca22c1363ceef8f8b246cda1e21b9ef871 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: ^6.0.0 + once: ^1.3.1 + simple-concat: ^1.0.0 + checksum: 8e7d8dd396915df8461d27ca3ecb8c0c3ddb6c48e14cc44cd6999374295ea125ad332f15b1cb5bd4b579df99685e749a27f4c72e9bd8fa81a46830172032e44b + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -14651,6 +15094,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"stream-counter@npm:^1.0.0": + version: 1.0.0 + resolution: "stream-counter@npm:1.0.0" + checksum: fc5d2ad666d1c19866500ea0a49d22249882556ffec23f04350e87d2fea1bcb1e55cab70e447cb83c4ed3f41230be981aeb64c521235835be17fe45cee47fe7b + languageName: node + linkType: hard + "stream-each@npm:^1.1.0": version: 1.2.3 resolution: "stream-each@npm:1.2.3" @@ -14713,6 +15163,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: ^1.0.0 + is-fullwidth-code-point: ^1.0.0 + strip-ansi: ^3.0.0 + checksum: b11745daa9398a1b3bb37ffa64263f9869c5f790901ed1242decb08171785346447112ead561cffde6b222a5ebeab9d2b382c72ae688859e852aa29325ca9d0b + languageName: node + linkType: hard + "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -15006,6 +15467,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"sync-request@npm:^3.0.1": + version: 3.0.1 + resolution: "sync-request@npm:3.0.1" + dependencies: + concat-stream: ^1.4.7 + http-response-object: ^1.0.1 + then-request: ^2.0.1 + checksum: 1d4c1bcd058018a5208ff9c8c13f7d46c1d6735c80b85e4fac8153264ff8758df1c5d941e46ee0cc071b4c00287fc5151f90f60b1e12f7a569ac575dde346169 + languageName: node + linkType: hard + "table-parser@npm:^0.1.3": version: 0.1.3 resolution: "table-parser@npm:0.1.3" @@ -15035,7 +15507,32 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: 4739382487b6ed646670a52cac637c818ecdceb728eb4718847dfdaddd7322d8cce2ea9db160ba8ad2920194034fda7c307b44f4eeb50d244f198bd7e28f2914 + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: ^4.0.3 + end-of-stream: ^1.4.1 + fs-constants: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + checksum: 7eec0a7fc8d0337729c1c2356d567a7527141d6ba0dd4804db979e17fc6389163e70fd4abdb855fc5ab54b944aeff7988e35e95ab6cee34a4156ca2d42980576 + languageName: node + linkType: hard + +"tar@npm:^6.0.1, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.11 resolution: "tar@npm:6.1.11" dependencies: @@ -15200,6 +15697,20 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"then-request@npm:^2.0.1": + version: 2.2.0 + resolution: "then-request@npm:2.2.0" + dependencies: + caseless: ~0.11.0 + concat-stream: ^1.4.7 + http-basic: ^2.5.1 + http-response-object: ^1.1.0 + promise: ^7.1.1 + qs: ^6.1.0 + checksum: 35a12253decf13fe6cd3752955c8a3f0eda1bb18bf53acdfbf4da4f5f74111d24736ddf91bd97803a6c239622d7c3e74ac40c178470ace2c2f2c7f1b84756ea6 + languageName: node + linkType: hard + "throat@npm:^5.0.0": version: 5.0.0 resolution: "throat@npm:5.0.0" @@ -15611,6 +16122,13 @@ typescript@^3.5.3: languageName: node linkType: hard +"typical@npm:^4.0.0": + version: 4.0.0 + resolution: "typical@npm:4.0.0" + checksum: 6b166af2fe0a11d84e114e6fb227f5f1b91e291506b86502af54e267d2ae74e5dc61c78c487af04d332affcc0626e52a6bf544fd7e45feceeaaf114b73617258 + languageName: node + linkType: hard + "uglify-js@npm:3.4.x": version: 3.4.10 resolution: "uglify-js@npm:3.4.10" @@ -15864,7 +16382,7 @@ typescript@^3.5.3: languageName: node linkType: hard -"url-parse@npm:^1.4.3, url-parse@npm:^1.5.10": +"url-parse@npm:^1.4.3, url-parse@npm:^1.4.4, url-parse@npm:^1.5.10": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: @@ -16393,7 +16911,7 @@ typescript@^3.5.3: languageName: node linkType: hard -"wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: