diff --git a/package.json b/package.json index adf5b578..12dd0ef6 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@rollup/plugin-replace": "^2.3.4", "@rollup/plugin-url": "^5.0.0", "autoprefixer": "^10.0.1", + "chart.js": "^2.9.4", "dayjs": "^1.9.4", "dotenv": "^8.2.0", "postcss": "^8.1.2", diff --git a/src/components/Header.svelte b/src/components/Header.svelte index 45dfad2f..39f1dc77 100644 --- a/src/components/Header.svelte +++ b/src/components/Header.svelte @@ -9,7 +9,7 @@ } -
+
Paimon.moe diff --git a/src/components/Table/TableHeader.svelte b/src/components/Table/TableHeader.svelte index 43f69b48..8bb339c2 100644 --- a/src/components/Table/TableHeader.svelte +++ b/src/components/Table/TableHeader.svelte @@ -4,13 +4,21 @@ import Icon from '../Icon.svelte'; + export let className = ''; + export let styleList = ''; export let sort = false; export let order = false; export let align = 'left'; + export let padding = 'px-4'; - - + + {#if sort}
diff --git a/src/components/WishImportModal.svelte b/src/components/WishImportModal.svelte index ee784cf2..718ec41e 100644 --- a/src/components/WishImportModal.svelte +++ b/src/components/WishImportModal.svelte @@ -135,7 +135,7 @@ console.log(wishNumber, type); url.searchParams.set('auth_appid', 'webview_gacha'); url.searchParams.set('init_type', '301'); - url.searchParams.set('gacha_id', 'd610857102f9256ba143ccf2e03b964c76a6ed'); + url.searchParams.set('gacha_id', 'b8fd0d8a6c940c7a16a486367de5f6d2232f53'); url.searchParams.set('lang', 'en'); url.searchParams.set('device_type', getDeviceType()); if (region !== '') url.searchParams.set('region', region); @@ -155,10 +155,12 @@ let page = 1; let result = []; let lastTime = 0; + let lastId = 0; do { if (cancelled) return; url.searchParams.set('page', page); + url.searchParams.set('end_id', lastId); currentPage = page; @@ -242,6 +244,7 @@ } page = page + 1; + lastId = result.length > 0 ? result[result.length - 1].id : 0; await sleep(1000); console.log(wishes); } catch (err) { diff --git a/src/data/banners.js b/src/data/banners.js new file mode 100644 index 00000000..b988528b --- /dev/null +++ b/src/data/banners.js @@ -0,0 +1,178 @@ +export const banners = { + beginners: [ + { + name: "Beginners' Wish", + shortName: 'Beginners\' Wish', + image: 1, + start: '2000-01-01 00:00:00', + end: '2200-01-01 00:00:00', + color: '#FFFFFF', + }, + ], + standard: [ + { + name: 'Wanderlust Invocation', + shortName: 'Wanderlust Invocation', + image: 1, + start: '2000-01-01 00:00:00', + end: '2200-01-01 00:00:00', + color: '#FFFFFF', + }, + ], + characters: [ + { + name: 'Ballad in Goblets', + image: 1, + shortName: 'Venti', + start: '2020-09-28 00:00:00', + end: '2020-10-18 18:00:00', + color: '#55E4B0', + }, + { + name: 'Sparkling Steps', + image: 1, + shortName: 'Klee', + start: '2020-10-20 18:00:00', + end: '2020-11-10 18:00:00', + color: '#CA360E', + }, + { + name: 'Farewell of Snezhnaya', + image: 1, + shortName: 'Tartaglia', + start: '2020-11-11 06:00:00', + end: '2020-12-01 18:00:00', + color: '#50A3C0', + }, + { + name: 'Gentry of Hermitage', + image: 1, + shortName: 'Zhongli', + start: '2020-12-01 18:00:00', + end: '2020-12-22 15:00:00', + color: '#D1A55C', + }, + { + name: 'Secretum Secretorum', + image: 1, + shortName: 'Albedo', + start: '2020-12-23 10:00:00', + end: '2021-01-12 16:00:00', + color: '#FCFE83', + }, + { + name: 'Adrift in the Harbor', + image: 1, + shortName: 'Ganyu', + start: '2021-01-12 18:00:00', + end: '2021-02-02 15:00:00', + color: '#6994DF', + }, + { + name: 'Invitation to Mundane Life', + image: 1, + shortName: 'Xiao', + start: '2021-02-03 06:00:00', + end: '2021-02-17 16:00:00', + color: '#2BE3F8', + }, + { + name: 'Dance of Lanterns', + image: 1, + shortName: 'Keqing', + start: '2021-02-17 18:00:00', + end: '2021-03-02 16:00:00', + color: '#AB6CD7', + }, + { + name: 'Moment of Bloom', + image: 1, + shortName: 'Hu Tao', + start: '2021-03-02 18:00:00', + end: '2021-03-16 15:00:00', + color: '#BF5042', + }, + { + name: 'Ballad in Goblets', + image: 2, + shortName: 'Venti', + start: '2021-03-17 06:00:00', + end: '2021-04-06 16:00:00', + color: '#35C297', + }, + ], + weapons: [ + { + name: 'Epitome Invocation', + image: 1, + start: '2020-09-28 00:00:00', + end: '2020-10-18 18:00:00', + shortName: 'Amos', + color: '#f54e42' + }, + { + name: 'Epitome Invocation', + image: 2, + start: '2020-10-20 18:00:00', + end: '2020-11-10 18:00:00', + shortName: 'WGS', + color: '#f5c242' + }, + { + name: 'Epitome Invocation', + image: 3, + start: '2020-11-11 06:00:00', + end: '2020-12-01 18:00:00', + shortName: 'Skyward', + color: '#f5ef42' + }, + { + name: 'Epitome Invocation', + image: 4, + start: '2020-12-01 18:00:00', + end: '2020-12-22 15:00:00', + shortName: 'Vortex', + color: '#7ef542' + }, + { + name: 'Epitome Invocation', + image: 5, + start: '2020-12-23 10:00:00', + end: '2021-01-12 16:00:00', + shortName: 'Summit', + color: '#42ecf5' + }, + { + name: 'Epitome Invocation', + image: 6, + start: '2021-01-12 18:00:00', + end: '2021-02-02 15:00:00', + shortName: 'Amos', + color: '#424ef5' + }, + { + name: 'Epitome Invocation', + image: 7, + start: '2021-02-03 06:00:00', + end: '2021-02-23 16:00:00', + shortName: 'Primordial', + color: '#b042f5' + }, + { + name: 'Epitome Invocation', + image: 8, + start: '2021-02-23 18:00:00', + end: '2021-03-16 15:00:00', + shortName: 'Homa', + color: '#f542c8' + }, + { + name: 'Epitome Invocation', + image: 9, + start: '2021-03-17 06:00:00', + end: '2021-04-06 16:00:00', + shortName: 'Elegy', + color: '#f54e42' + }, + ], +}; diff --git a/src/data/weaponList.js b/src/data/weaponList.js index c950112c..09d2952c 100644 --- a/src/data/weaponList.js +++ b/src/data/weaponList.js @@ -1071,7 +1071,7 @@ export const weaponList = { atk: 42, secondary: 'Elemental Mastery', type: weapons.sword, - source: 'forgingnorthlander sword prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -1130,7 +1130,7 @@ export const weaponList = { atk: 44, secondary: 'Physical DMG Bonus', type: weapons.sword, - source: 'adventure rank 10 rewardforging:northlander sword prototype x1crystal chunk x50white iron chunk x50', + source: 'adventure rank 10 reward, forging', ascension: [ { items: [ @@ -1307,7 +1307,7 @@ export const weaponList = { atk: 42, secondary: 'ATK', type: weapons.bow, - source: 'forgingnorthlander bow prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -1602,7 +1602,7 @@ export const weaponList = { atk: 44, secondary: 'Physical DMG Bonus', type: weapons.polearm, - source: 'forgingnorthlander polearm prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -2137,49 +2137,49 @@ export const weaponList = { ascension: [ { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.tile_of_decarabians_tower, amount: 3 }, + { item: itemList.heavy_horn, amount: 3 }, + { item: itemList.divining_scroll, amount: 2 }, ], mora: 5000, }, { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.debris_of_decarabians_city, amount: 3 }, + { item: itemList.heavy_horn, amount: 12 }, + { item: itemList.divining_scroll, amount: 8 }, ], mora: 15000, }, { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.debris_of_decarabians_city, amount: 6 }, + { item: itemList.black_bronze_horn, amount: 6 }, + { item: itemList.sealed_scroll, amount: 6 }, ], mora: 20000, }, { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.fragment_of_decarabians_epic, amount: 3 }, + { item: itemList.black_bronze_horn, amount: 12 }, + { item: itemList.sealed_scroll, amount: 9 }, ], mora: 30000, }, { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.fragment_of_decarabians_epic, amount: 6 }, + { item: itemList.black_crystal_horn, amount: 9 }, + { item: itemList.forbidden_curse_scroll, amount: 6 }, ], mora: 35000, }, { items: [ - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, - { item: itemList.unknown, amount: 0 }, + { item: itemList.scattered_piece_of_decarabians_dream, amount: 4 }, + { item: itemList.black_crystal_horn, amount: 18 }, + { item: itemList.forbidden_curse_scroll, amount: 12 }, ], mora: 45000, }, @@ -2303,65 +2303,65 @@ export const weaponList = { }, ], }, - // alley_hunter: { - // name: 'Alley Hunter', - // id: 'alley_hunter', - // rarity: 4, - // atk: 41, - // secondary: 'CRIT Rate', - // type: weapons.bow, - // source: 'wish', - // ascension: [ - // { - // items: [ - // { item: itemList.boreal_wolfs_milk_tooth, amount: 3 }, - // { item: itemList.dead_ley_line_branch, amount: 3 }, - // { item: itemList.treasure_hoarder_insignia, amount: 2 }, - // ], - // mora: 5000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_cracked_tooth, amount: 3 }, - // { item: itemList.dead_ley_line_branch, amount: 12 }, - // { item: itemList.treasure_hoarder_insignia, amount: 8 }, - // ], - // mora: 15000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_cracked_tooth, amount: 6 }, - // { item: itemList.dead_ley_line_leaves, amount: 6 }, - // { item: itemList.silver_raven_insignia, amount: 6 }, - // ], - // mora: 20000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_broken_fang, amount: 3 }, - // { item: itemList.dead_ley_line_leaves, amount: 12 }, - // { item: itemList.silver_raven_insignia, amount: 9 }, - // ], - // mora: 30000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_broken_fang, amount: 6 }, - // { item: itemList.ley_line_sprouts, amount: 9 }, - // { item: itemList.golden_raven_insignia, amount: 6 }, - // ], - // mora: 35000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_nostalgia, amount: 4 }, - // { item: itemList.ley_line_sprouts, amount: 18 }, - // { item: itemList.golden_raven_insignia, amount: 12 }, - // ], - // mora: 45000, - // }, - // ], - // }, + alley_hunter: { + name: 'Alley Hunter', + id: 'alley_hunter', + rarity: 4, + atk: 41, + secondary: 'CRIT Rate', + type: weapons.bow, + source: 'wish', + ascension: [ + { + items: [ + { item: itemList.boreal_wolfs_milk_tooth, amount: 3 }, + { item: itemList.dead_ley_line_branch, amount: 3 }, + { item: itemList.treasure_hoarder_insignia, amount: 2 }, + ], + mora: 5000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 3 }, + { item: itemList.dead_ley_line_branch, amount: 12 }, + { item: itemList.treasure_hoarder_insignia, amount: 8 }, + ], + mora: 15000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 6 }, + { item: itemList.dead_ley_line_leaves, amount: 6 }, + { item: itemList.silver_raven_insignia, amount: 6 }, + ], + mora: 20000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 3 }, + { item: itemList.dead_ley_line_leaves, amount: 12 }, + { item: itemList.silver_raven_insignia, amount: 9 }, + ], + mora: 30000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 6 }, + { item: itemList.ley_line_sprouts, amount: 9 }, + { item: itemList.golden_raven_insignia, amount: 6 }, + ], + mora: 35000, + }, + { + items: [ + { item: itemList.boreal_wolfs_nostalgia, amount: 4 }, + { item: itemList.ley_line_sprouts, amount: 18 }, + { item: itemList.golden_raven_insignia, amount: 12 }, + ], + mora: 45000, + }, + ], + }, lithic_spear: { name: 'Lithic Spear', id: 'lithic_spear', @@ -2421,65 +2421,65 @@ export const weaponList = { }, ], }, - // wine_and_song: { - // name: 'Wine and Song', - // id: 'wine_and_song', - // rarity: 4, - // atk: 42, - // secondary: 'Energy Recharge', - // type: weapons.catalyst, - // source: 'currently unobtainable', - // ascension: [ - // { - // items: [ - // { item: itemList.boreal_wolfs_milk_tooth, amount: 3 }, - // { item: itemList.dead_ley_line_branch, amount: 3 }, - // { item: itemList.divining_scroll, amount: 2 }, - // ], - // mora: 5000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_cracked_tooth, amount: 3 }, - // { item: itemList.dead_ley_line_branch, amount: 12 }, - // { item: itemList.divining_scroll, amount: 8 }, - // ], - // mora: 15000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_cracked_tooth, amount: 6 }, - // { item: itemList.dead_ley_line_leaves, amount: 6 }, - // { item: itemList.sealed_scroll, amount: 6 }, - // ], - // mora: 20000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_broken_fang, amount: 3 }, - // { item: itemList.dead_ley_line_leaves, amount: 12 }, - // { item: itemList.sealed_scroll, amount: 9 }, - // ], - // mora: 30000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_broken_fang, amount: 6 }, - // { item: itemList.ley_line_sprouts, amount: 9 }, - // { item: itemList.forbidden_curse_scroll, amount: 6 }, - // ], - // mora: 35000, - // }, - // { - // items: [ - // { item: itemList.boreal_wolfs_nostalgia, amount: 4 }, - // { item: itemList.ley_line_sprouts, amount: 18 }, - // { item: itemList.forbidden_curse_scroll, amount: 12 }, - // ], - // mora: 45000, - // }, - // ], - // }, + wine_and_song: { + name: 'Wine and Song', + id: 'wine_and_song', + rarity: 4, + atk: 42, + secondary: 'Energy Recharge', + type: weapons.catalyst, + source: 'currently unobtainable', + ascension: [ + { + items: [ + { item: itemList.boreal_wolfs_milk_tooth, amount: 3 }, + { item: itemList.dead_ley_line_branch, amount: 3 }, + { item: itemList.treasure_hoarder_insignia, amount: 2 }, + ], + mora: 5000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 3 }, + { item: itemList.dead_ley_line_branch, amount: 12 }, + { item: itemList.treasure_hoarder_insignia, amount: 8 }, + ], + mora: 15000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 6 }, + { item: itemList.dead_ley_line_leaves, amount: 6 }, + { item: itemList.silver_raven_insignia, amount: 6 }, + ], + mora: 20000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 3 }, + { item: itemList.dead_ley_line_leaves, amount: 12 }, + { item: itemList.silver_raven_insignia, amount: 9 }, + ], + mora: 30000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 6 }, + { item: itemList.ley_line_sprouts, amount: 9 }, + { item: itemList.golden_raven_insignia, amount: 6 }, + ], + mora: 35000, + }, + { + items: [ + { item: itemList.boreal_wolfs_nostalgia, amount: 4 }, + { item: itemList.ley_line_sprouts, amount: 18 }, + { item: itemList.golden_raven_insignia, amount: 12 }, + ], + mora: 45000, + }, + ], + }, blackcliff_warbow: { name: 'Blackcliff Warbow', id: 'blackcliff_warbow', @@ -2664,7 +2664,7 @@ export const weaponList = { atk: 42, secondary: 'Energy Recharge', type: weapons.polearm, - source: 'forgingnorthlander polearm prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -2723,7 +2723,7 @@ export const weaponList = { atk: 42, secondary: 'DEF', type: weapons.claymore, - source: 'forgingnorthlander claymore prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -2841,7 +2841,7 @@ export const weaponList = { atk: 41, secondary: 'Physical DMG Bonus', type: weapons.bow, - source: 'forgingnorthlander bow prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -3313,7 +3313,7 @@ export const weaponList = { atk: 44, secondary: 'Elemental Mastery', type: weapons.catalyst, - source: 'forgingnorthlander catalyst prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -3903,7 +3903,7 @@ export const weaponList = { atk: 44, secondary: 'ATK', type: weapons.claymore, - source: 'forgingnorthlander claymore prototype x1crystal chunk x50white iron chunk x50', + source: 'forging', ascension: [ { items: [ @@ -6256,4 +6256,63 @@ export const weaponList = { }, ], }, + elegy_for_the_end: { + name: "Elegy for the End", + id: "elegy_for_the_end", + rarity: 5, + type: weapons.bow, + source: "wish", + atk: 46, + secondary: "Energy Recharge", + ascension: [ + { + items: [ + { item: itemList.boreal_wolfs_milk_tooth, amount: 3 }, + { item: itemList.heavy_horn, amount: 3 }, + { item: itemList.recruits_insignia, amount: 2 }, + ], + mora: 10000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 3 }, + { item: itemList.heavy_horn, amount: 12 }, + { item: itemList.recruits_insignia, amount: 8 }, + ], + mora: 20000, + }, + { + items: [ + { item: itemList.boreal_wolfs_cracked_tooth, amount: 6 }, + { item: itemList.black_bronze_horn, amount: 6 }, + { item: itemList.sergeants_insignia, amount: 6 }, + ], + mora: 30000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 3 }, + { item: itemList.black_bronze_horn, amount: 12 }, + { item: itemList.sergeants_insignia, amount: 9 }, + ], + mora: 45000, + }, + { + items: [ + { item: itemList.boreal_wolfs_broken_fang, amount: 6 }, + { item: itemList.black_crystal_horn, amount: 9 }, + { item: itemList.lieutenants_insignia, amount: 6 }, + ], + mora: 55000, + }, + { + items: [ + { item: itemList.boreal_wolfs_nostalgia, amount: 4 }, + { item: itemList.black_crystal_horn, amount: 18 }, + { item: itemList.lieutenants_insignia, amount: 12 }, + ], + mora: 65000, + }, + ], + }, }; diff --git a/src/locales/en.json b/src/locales/en.json index 40682bc0..d204a47b 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -12,7 +12,7 @@ }, "wish": { "autoImport": "Auto Import", - "helpAndSetting": "Help & Setting", + "helpAndSetting": "Help & Settings", "wishesWorth": "Wishes Worth", "lifetimePulls": "Lifetime Pulls", "guarantee": "Guaranteed at {pity}", @@ -26,11 +26,11 @@ "manualButton": "Enable Manual Input", "import": { "title": "Import Wish History", - "faqsButton": "FAQS - READ FIRST", + "faqsButton": "FAQ - READ FIRST", "nonew": "No New Wishes", "importNotice1": "Imported wishes will be appended or replaced accordingly to existing data", "importNotice2": "If you don't have any data saved before, first wish will be counted as pity 1", - "saveData": "Save the data?", + "saveData": "Save wish data?", "reCalculating": "Re-calculating pity...", "processing": "Processing", "banner": "Banner", @@ -49,26 +49,26 @@ "invalidData": "Invalid data returned from API, try again later", "success": "Import success πŸ˜€!", "faqs": { - "title": "Import Wish History FAQS", + "title": "Import Wish History FAQ", "q1": "How does it work?", - "a1": "Genshin Impact wish history is basically a web page, so you can access it by opening the web page url. A temporary key will be generated after you open the wish history page or the feedback page, and the importer will automatically use the MiHoYo API to fetch your wish history.", + "a1": "Genshin Impact wish history is basically a web page, so you can access it by opening the web page url. A temporary key will be generated after you open the wish history page or the feedback page, and the importer will automatically use MiHoYo API to fetch your wish history.", "q2": "Is it safe? Will I get banned?", - "a2": "Paimon.moe use the same request that Genshin Impact use to get the wish history, and Paimon.moe has no way whatsoever to modify any game files or memory, and it should be safe. But use it at your own risk (well I use it on my main account). You still can input your data manually πŸ˜€.", + "a2": "Paimon.moe uses the same request that Genshin Impact use to get the wish history, and Paimon.moe has no way whatsoever to modify any game files or memory, and it should be safe. But use it at your own risk (well I use it on my main account). You still can input your data manually πŸ˜€.", "q3": "Can you hack my account then?", "a3": [ - "Paimon.moe never save anything related to your account (even your uid or nickname), so the answer is no. This project is open source on", - ", I'm not planning to damage my reputation by hacking other people account." + "Paimon.moe never saves anything related to your account (even your UID or nickname), so the answer is no. This project is open source on", + "; I'm not planning to damage my reputation by hacking other people's account." ], - "q4": "Hey I checked the request and stuff, but why it request to your domain instead of MiHoYo API?", + "q4": "Hey I checked the requests and stuff, but why does it request to your domain instead of MiHoYo API?", "a4": [ "Paimon.moe cannot request directly to MiHoYo API because of", - ", so the request redirected to a simple cors proxy to make it work. You can see the code", + ", so the request is redirected to a simple CORS proxy to make it work. You can see the code", "here" ], "q5": "Do you store my temporary key or wish history?", - "a5": "Paimon.moe never store your key, and use HTTPS to pass your url to a cors proxy to make the CORS works. All your wish history is saved on your device only (or your google drive if you turn on sync on setting). Paimon.moe does not save anything to the server (yes anything).", - "q6": "I tried the step, but I got some API error?", - "a6": "Make sure you copy all the text (just hold and press select all), maybe you left over some text that are needed for the importer to work" + "a5": "Paimon.moe will never store your keys, and uses HTTPS to pass your URL to a CORS proxy to make the CORS work. All your wish history is saved on your device only (or your Google Drive if you turned on sync). Paimon.moe does not save anything to the server (yes, anything).", + "q6": "I've done all the steps, but I got some API error?", + "a6": "Make sure you copy all the text (hold and press Select All for mobile devices); maybe you missed some text that are needed for the importer to work." }, "guide": { "pc": [ @@ -82,11 +82,11 @@ "Open Paimon menu", "Press Feedback", "Wait for it to load and a feedback page should open", - "Turn off your wifi and data connection", + "Turn off your Wi-Fi and data connection", "Press refresh on top right corner", - "The page should error and show you a text with black font", + "The page should display an error and show you some text with black font", "Hold the text and press select all, then copy that text (don't copy only some portion of the text)", - "Turn on your wifi or data connection", + "Turn on your Wi-Fi or data connection", "Paste the text to the textbox below", "Paste text here... Webpage not available..." ], @@ -96,8 +96,8 @@ "Wait for it to load and a feedback page should open", "Press In-game issue", "Press Co-Op Mode", - "There is a link on the bottom of the reply, press that", - "A browser should open up, copy the link and paste it below", + "There is a link on the bottom of the reply; press that", + "A browser should open up. Copy the link and paste it below", "Paste link here... https://genshin.mihoyo..." ] } @@ -105,33 +105,53 @@ "help": { "title": "Wish Counter Help & Settings", "enableManual": "Enable Manual Input", - "notice": "Using the Auto Import and manual input together is not recommended still need some testing!", - "consider": "Consider using the Auto Import first, access it on button beside the button you click to open this How To", + "notice": "Using Auto Import and manual input together is not recommended as it still requires some more testing!", + "consider": "Consider using the Auto Importer first. Access it by clicking the button next to the button you clicked to open this How To.", "howto": { "title": "How to use manual input", - "subtitle": "After you do x1 pull Wish:", + "subtitle": "After a 1x Wish:", "press": "Press", "whenYouGet": "when you get", "p1": "It will automatically add the lifetime pulls,", "and": "and", - "p2": ["When the", "pity reach 10, it will automatically reset to 0"], - "p3": ["When the", "pity reach 90, it will automatically reset to 0"], + "p2": ["When the", "pity reaches 10, it will automatically be reset to 0"], + "p3": ["When the", "pity reaches 90, it will automatically be reset to 0"], "p4": [ - "For when you do x10 pulls Wish, press", - "but the pity counter won't be accurate, because there is no way to tell when the drop occur (maybe you got it on the 1st or even the 10th). To make the counter still accurate, you need to check it on the history table and add it 1 by 1 like you do 1 pull Wish." + "After a 10x Wish, press", + "but keep in mind that the pity counter might not be accurate, because there is no way to tell when the drop occured (maybe you got it on the 1st or even the 10th pull). To ensure that the counter is still accurate, you need to check the history table and add it one-by-one like you do 1x Wishes." ], - "p5": ["You can also press", "button to edit the values manually!"], + "p5": ["You can also press the", "button to edit the values manually!"], "p6": [ - "Press the arrow on the bottom to see your pulls detail. A popup will show up when you get", + "Press the arrow on the bottom to see your pulls' details. A popup will show up when you get a", "or", - "Or you can add or edit the table manually." + "You can also add or edit the table manually." ] } + }, + "types": { + "beginners": "Beginners' Wish", + "standard": "Standard", + "character-event": "Character Event", + "weapon-event": "Weapon Event" + }, + "detail": { + "weapon": "Weapon", + "character": "Character", + "time": "Time", + "pity": "Pity", + "name": "Name", + "type": "Type", + "banner": "Banner", + "roll": "#Roll", + "totalThisBanner": "Total pull on this banner", + "worth": "Worth", + "loading": "Loading... (If this stuck, change your server on settings page)" } }, "calculator": { "titleWeapon": "Weapon Calculator", "titleCharacter": "Character Calculator", + "titleResin": "Resin Calculator", "goto": "Go To", "howToUse": "How to Use", "guide": { @@ -143,12 +163,12 @@ "calculateAscension": "Calculate Ascension Material?", "selectRarity": "Select weapon rarity", "selectWeapon": "Select weapon", - "current": "Current Weapon Level, Exp, & Ascension", + "current": "Current Weapon Level, EXP, & Ascension", "inputCurrentLevel": "Input current weapon level...", - "inputCurrentExp": "Input current weapon exp...", + "inputCurrentExp": "Input current weapon EXP...", "intended": "Intended Weapon Level & Ascension", "inputIntendedLevel": "Input intended weapon level...", - "resource": "Resource to Use", + "resource": "Resources to Use", "calculate": "Calculate", "unknownInformation": "There are some unknown information", "ascensionLevel": "Ascension level", @@ -160,9 +180,9 @@ "character": { "calculateAscension": "Calculate Ascension Material?", "selectCharacter": "Select character", - "current": "Current Character Level, Exp, & Ascension", + "current": "Current Character Level, EXP, & Ascension", "inputCurrentLevel": "Input current character level...", - "inputCurrentExp": "Input current character exp...", + "inputCurrentExp": "Input current character EXP...", "intended": "Intended Character Level & Ascension", "inputIntendedLevel": "Input intended character level...", "resource": "Resource to Use", @@ -182,8 +202,15 @@ "expTable": { "level": "Level", "items": "Items", - "wasted": "Wasted Exp", + "wasted": "Wasted EXP", "mora": "Mora Cost" + }, + "resin": { + "inputCurrentResin": "Input Current Resin...", + "timeFormat": "en", + "calculate": "Calculate", + "currentTime": "Current Time", + "fullTime": "Resin Will Be Replenished At" } }, "items": { @@ -216,7 +243,7 @@ "summary": "Summary", "empty": ["Nothing to do yet πŸ˜€", "Add some from the Items page or the Calculator!"], "farmableToday": "Farmable Today", - "resin": "resin needed", + "resin": "Resin needed", "based": "Based on AR:{ar} and WL:{wl}", "change": "(change on settings)", "approximation": "Approximation calculated from drop rates by", @@ -236,15 +263,15 @@ }, "settings": { "version": "Data Version:", - "multiple": "Have multiple account? Choose account here to separate your wish and todo data", + "multiple": "Have multiple accounts? Choose accounts here to separate your Wish and Todo data", "selectAccount": "Select your account", "reset": "Reset", "delete": "Delete", "add": "Add", "server": "Select your server:", "drive": [ - "Paimon.moe use Application Data Directory on your Google Drive to save and sync your wish counter and todo list.", - "Paimon.moe can only read and write file that this site create." + "Paimon.moe uses the Application Data Directory on your Google Drive to save and sync your Wish counter and Todo list.", + "Paimon.moe can only read and write files that this site created." ], "driveError": "Google Drive API cannot be loaded", "driveSignIn": "Sign in to Google Drive", @@ -253,11 +280,11 @@ "waiting": "Waiting...", "syncing": "Syncing...", "lastSync": "Last Sync:", - "feedback": "If you found any bug, wrong data, or you have any feedback, please leave a message on", + "feedback": "If you found any bugs, wrong data, or any other feedback, please leave a message on", "or": "or", "thanks": "Thanks😁!", "modal": { - "notice": "All todo and wish history data will be deleted", + "notice": "All Todo and Wish history data will be deleted", "cancel": "Cancel", "delete": "Delete", "reset": "Reset" diff --git a/src/locales/id.json b/src/locales/id.json index 342101eb..6e549827 100644 --- a/src/locales/id.json +++ b/src/locales/id.json @@ -127,11 +127,31 @@ "Atau kamu bisa menambahkan atau mengedit tabel nya secara manual." ] } + }, + "types": { + "beginners": "Beginners' Wish", + "standard": "Standard", + "character-event": "Event Karakter", + "weapon-event": "Event Senjata" + }, + "detail": { + "weapon": "Senjata", + "character": "Karakter", + "time": "Waktu", + "pity": "Pity", + "name": "Nama", + "type": "Tipe", + "banner": "Banner", + "roll": "#Roll", + "totalThisBanner": "Total pull di banner ini", + "worth": "Setara dengan", + "loading": "Loading... (Kalau tidak selesai-selesai, ganti server di halaman settings)" } }, "calculator": { - "titleWeapon": "Kalulator Senjata", + "titleWeapon": "Kalkulator Senjata", "titleCharacter": "Kalkulator Karakter", + "titleResin": "Kalkulator Resin", "goto": "Ke", "howToUse": "Cara Penggunaan", "guide": { @@ -184,6 +204,13 @@ "items": "Items", "wasted": "Exp Terbuang", "mora": "Jumlah Mora" + }, + "resin": { + "inputCurrentResin": "Masukkan Jumlah Resin Sekarang...", + "timeFormat": "id", + "calculate": "Hitung", + "currentTime": "Waktu Sekarang", + "fullTime": "Resin Akan Penuh Pada" } }, "items": { diff --git a/src/routes/_layout.svelte b/src/routes/_layout.svelte index 8c6cb240..0279448f 100644 --- a/src/routes/_layout.svelte +++ b/src/routes/_layout.svelte @@ -17,7 +17,7 @@ import SettingData from '../components/SettingData.svelte'; import Toast from '../components/Toast.svelte'; import Icon from '../components/Icon.svelte'; - import { mdiDiscord } from '@mdi/js'; + import { mdiDiscord, mdiFacebook, mdiReddit, mdiTelegram } from '@mdi/js'; export let segment; @@ -61,9 +61,31 @@ Paimon.moe is not affiliated with miHoYo.
Genshin Impact, game content and materials are trademarks and copyrights of miHoYo.

- - Join Our Discord - +
+ + Join Our Discord + +
+ Community Links + + Telegram + +
+
+ Official Links + +
+
diff --git a/src/routes/wish/_counter.svelte b/src/routes/wish/_counter.svelte index b350c6fb..00ba94ec 100644 --- a/src/routes/wish/_counter.svelte +++ b/src/routes/wish/_counter.svelte @@ -3,7 +3,7 @@ import { onMount, getContext } from 'svelte'; import { slide } from 'svelte/transition'; - import { mdiPencil, mdiStar, mdiChevronDown } from '@mdi/js'; + import { mdiPencil, mdiStar, mdiChevronDown, mdiTableOfContents } from '@mdi/js'; import debounce from 'lodash/debounce'; const { open: openModal, close: closeModal } = getContext('simple-modal'); @@ -245,13 +245,18 @@
-
-

{name}

+
+

{name}

{#if manualInput} {/if} + + +
+ import { t } from 'svelte-i18n'; + + import dayjs from 'dayjs'; + import Icon from '../../components/Icon.svelte'; + import { mdiStar } from '@mdi/js'; + + let numberFormat = Intl.NumberFormat('en', { + maximumFractionDigits: 1, + minimumFractionDigits: 0, + }); + + export let banner; + + function calculateColor(percentage) { + const hue = percentage * 120; + return `color: hsl(${hue}, 100%, 60%);`; + } + + const legendaryPity = banner.legendary.reduce((prev, next) => { + prev += next.pity; + return prev; + }, 0); + + let rarePity = 0; + let rarePityCharacter = 0; + let rarePityWeapon = 0; + let rareTotal = banner.rare.character.length + banner.rare.weapon.length; + + for (let item of banner.rare.character) { + rarePity += item.pity; + rarePityCharacter += item.pity; + } + for (let item of banner.rare.weapon) { + rarePity += item.pity; + rarePityWeapon += item.pity; + } + + +
+ {banner.name} +

{banner.name}

+

+ + {dayjs.unix(banner.start).format('ddd, D MMM YYYY HH:mm')} + - + + {dayjs.unix(banner.end).format('ddd, D MMM YYYY HH:mm')} +

+

+ {$t('wish.detail.totalThisBanner')} + {banner.total} +

+

+ {$t('wish.detail.worth')} + primogem + {banner.total * 160} +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RarityTotalPercentPity AVG
+ 5 + + {numberFormat.format(banner.legendary.length)} + + {numberFormat.format((banner.legendary.length / banner.total) * 100)}% + + {banner.legendary.length ? numberFormat.format(legendaryPity / banner.legendary.length) : 0} +
+ 4 + + {numberFormat.format(rareTotal)} + + {numberFormat.format((rareTotal / banner.total) * 100)}% + + {rareTotal > 0 ? numberFormat.format(rarePity / rareTotal) : 0} +
+ β”” Character + + {numberFormat.format(banner.rare.character.length)} + + {numberFormat.format((banner.rare.character.length / banner.total) * 100)}% + + {rareTotal > 0 ? numberFormat.format(rarePityCharacter / rareTotal) : 0} +
+ β”” Weapon + + {numberFormat.format(banner.rare.weapon.length)} + + {numberFormat.format((banner.rare.weapon.length / banner.total) * 100)}% + + {rareTotal > 0 ? numberFormat.format(rarePityWeapon / rareTotal) : 0} +
+
+ {#each banner.legendary as pull} + {pull.name} {pull.pity} + {/each} +
+
+ + diff --git a/src/stores/server.js b/src/stores/server.js index 60570ea4..ef207deb 100644 --- a/src/stores/server.js +++ b/src/stores/server.js @@ -19,6 +19,10 @@ const timeOffset = { const weekdays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; +export const getTimeOffset = () => { + return timeOffset[get(server)]; +} + export const getTimeDifference = () => { const now = dayjs(); const local = now.utcOffset(); diff --git a/src/stores/time.js b/src/stores/time.js new file mode 100644 index 00000000..c131bcec --- /dev/null +++ b/src/stores/time.js @@ -0,0 +1,11 @@ +import { readable } from 'svelte/store'; + +export const time = readable(new Date(), function start(set) { + const interval = setInterval(() => { + set(new Date()); + }, 1000); + + return function stop() { + clearInterval(interval); + }; +}); diff --git a/static/images/banners/Adrift in the Harbor 1.png b/static/images/banners/Adrift in the Harbor 1.png new file mode 100644 index 00000000..e5513729 Binary files /dev/null and b/static/images/banners/Adrift in the Harbor 1.png differ diff --git a/static/images/banners/Ballad in Goblets 1.png b/static/images/banners/Ballad in Goblets 1.png new file mode 100644 index 00000000..58927f6e Binary files /dev/null and b/static/images/banners/Ballad in Goblets 1.png differ diff --git a/static/images/banners/Ballad in Goblets 2.png b/static/images/banners/Ballad in Goblets 2.png new file mode 100644 index 00000000..22c25751 Binary files /dev/null and b/static/images/banners/Ballad in Goblets 2.png differ diff --git a/static/images/banners/Beginners' Wish 1.png b/static/images/banners/Beginners' Wish 1.png new file mode 100644 index 00000000..041f6b3c Binary files /dev/null and b/static/images/banners/Beginners' Wish 1.png differ diff --git a/static/images/banners/Dance of Lanterns 1.png b/static/images/banners/Dance of Lanterns 1.png new file mode 100644 index 00000000..15d257a0 Binary files /dev/null and b/static/images/banners/Dance of Lanterns 1.png differ diff --git a/static/images/banners/Epitome Invocation 1.png b/static/images/banners/Epitome Invocation 1.png new file mode 100644 index 00000000..23940480 Binary files /dev/null and b/static/images/banners/Epitome Invocation 1.png differ diff --git a/static/images/banners/Epitome Invocation 2.png b/static/images/banners/Epitome Invocation 2.png new file mode 100644 index 00000000..3524a6e5 Binary files /dev/null and b/static/images/banners/Epitome Invocation 2.png differ diff --git a/static/images/banners/Epitome Invocation 3.png b/static/images/banners/Epitome Invocation 3.png new file mode 100644 index 00000000..655e0447 Binary files /dev/null and b/static/images/banners/Epitome Invocation 3.png differ diff --git a/static/images/banners/Epitome Invocation 4.png b/static/images/banners/Epitome Invocation 4.png new file mode 100644 index 00000000..a3daf81c Binary files /dev/null and b/static/images/banners/Epitome Invocation 4.png differ diff --git a/static/images/banners/Epitome Invocation 5.png b/static/images/banners/Epitome Invocation 5.png new file mode 100644 index 00000000..6807c68f Binary files /dev/null and b/static/images/banners/Epitome Invocation 5.png differ diff --git a/static/images/banners/Epitome Invocation 6.png b/static/images/banners/Epitome Invocation 6.png new file mode 100644 index 00000000..9374b76a Binary files /dev/null and b/static/images/banners/Epitome Invocation 6.png differ diff --git a/static/images/banners/Epitome Invocation 7.png b/static/images/banners/Epitome Invocation 7.png new file mode 100644 index 00000000..ba40922f Binary files /dev/null and b/static/images/banners/Epitome Invocation 7.png differ diff --git a/static/images/banners/Epitome Invocation 8.png b/static/images/banners/Epitome Invocation 8.png new file mode 100644 index 00000000..d5363231 Binary files /dev/null and b/static/images/banners/Epitome Invocation 8.png differ diff --git a/static/images/banners/Epitome Invocation 9.png b/static/images/banners/Epitome Invocation 9.png new file mode 100644 index 00000000..e7de80f9 Binary files /dev/null and b/static/images/banners/Epitome Invocation 9.png differ diff --git a/static/images/banners/Farewell of Snezhnaya 1.png b/static/images/banners/Farewell of Snezhnaya 1.png new file mode 100644 index 00000000..1dd97dd0 Binary files /dev/null and b/static/images/banners/Farewell of Snezhnaya 1.png differ diff --git a/static/images/banners/Gentry of Hermitage 1.png b/static/images/banners/Gentry of Hermitage 1.png new file mode 100644 index 00000000..a60b638c Binary files /dev/null and b/static/images/banners/Gentry of Hermitage 1.png differ diff --git a/static/images/banners/Invitation to Mundane Life 1.png b/static/images/banners/Invitation to Mundane Life 1.png new file mode 100644 index 00000000..b0027e83 Binary files /dev/null and b/static/images/banners/Invitation to Mundane Life 1.png differ diff --git a/static/images/banners/Moment of Bloom 1.png b/static/images/banners/Moment of Bloom 1.png new file mode 100644 index 00000000..5ba76a9b Binary files /dev/null and b/static/images/banners/Moment of Bloom 1.png differ diff --git a/static/images/banners/Secretum Secretorum 1.png b/static/images/banners/Secretum Secretorum 1.png new file mode 100644 index 00000000..67fbb10b Binary files /dev/null and b/static/images/banners/Secretum Secretorum 1.png differ diff --git a/static/images/banners/Sparkling Steps 1.png b/static/images/banners/Sparkling Steps 1.png new file mode 100644 index 00000000..6372edae Binary files /dev/null and b/static/images/banners/Sparkling Steps 1.png differ diff --git a/static/images/banners/Wanderlust Invocation 1.png b/static/images/banners/Wanderlust Invocation 1.png new file mode 100644 index 00000000..e333ff05 Binary files /dev/null and b/static/images/banners/Wanderlust Invocation 1.png differ diff --git "a/static/images/items/divining_scroll\n.png" "b/static/images/items/divining_scroll\n.png" deleted file mode 100644 index 1a658d53..00000000 Binary files "a/static/images/items/divining_scroll\n.png" and /dev/null differ diff --git "a/static/images/items/forbidden_curse_scroll\n.png" "b/static/images/items/forbidden_curse_scroll\n.png" deleted file mode 100644 index bb7b77d9..00000000 Binary files "a/static/images/items/forbidden_curse_scroll\n.png" and /dev/null differ diff --git "a/static/images/items/guide_to_ballad\n.png" "b/static/images/items/guide_to_ballad\n.png" deleted file mode 100644 index 3e4131fe..00000000 Binary files "a/static/images/items/guide_to_ballad\n.png" and /dev/null differ diff --git "a/static/images/items/philosophies_of_ballad\n.png" "b/static/images/items/philosophies_of_ballad\n.png" deleted file mode 100644 index c653fe0b..00000000 Binary files "a/static/images/items/philosophies_of_ballad\n.png" and /dev/null differ diff --git "a/static/images/items/sealed_scroll\n.png" "b/static/images/items/sealed_scroll\n.png" deleted file mode 100644 index d1399d99..00000000 Binary files "a/static/images/items/sealed_scroll\n.png" and /dev/null differ diff --git "a/static/images/items/tusk_of_monoceros_caeli\n.png" "b/static/images/items/tusk_of_monoceros_caeli\n.png" deleted file mode 100644 index 8511a441..00000000 Binary files "a/static/images/items/tusk_of_monoceros_caeli\n.png" and /dev/null differ diff --git a/static/images/weapons/alley_hunter.png b/static/images/weapons/alley_hunter.png index b2e00f1e..e49aa853 100644 Binary files a/static/images/weapons/alley_hunter.png and b/static/images/weapons/alley_hunter.png differ diff --git a/static/images/weapons/elegy_for_the_end.png b/static/images/weapons/elegy_for_the_end.png new file mode 100644 index 00000000..2bd72ee9 Binary files /dev/null and b/static/images/weapons/elegy_for_the_end.png differ diff --git a/static/images/weapons/wine_and_song.png b/static/images/weapons/wine_and_song.png index f50a82ef..4cdf000c 100644 Binary files a/static/images/weapons/wine_and_song.png and b/static/images/weapons/wine_and_song.png differ diff --git a/yarn.lock b/yarn.lock index 4319cab8..15786df2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1163,6 +1163,29 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chart.js@^2.9.4: + version "2.9.4" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684" + integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A== + dependencies: + chartjs-color "^2.1.0" + moment "^2.10.2" + +chartjs-color-string@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" + integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== + dependencies: + color-name "^1.0.0" + +chartjs-color@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" + integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== + dependencies: + chartjs-color-string "^0.6.0" + color-convert "^1.9.3" + clean-css@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" @@ -1170,7 +1193,7 @@ clean-css@^4.2.1: dependencies: source-map "~0.6.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1874,6 +1897,11 @@ minimist@^1.1.1, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +moment@^2.10.2: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + mri@^1.1.0: version "1.1.6" resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6"