Added script for downloading ephinea drop table in TSV format. Added HuntOptimizer component and error boundary.

This commit is contained in:
Daan Vanden Bosch 2019-05-30 17:57:31 +02:00
parent f31570d5f5
commit f324886240
11 changed files with 7066 additions and 20 deletions

View File

@ -6,7 +6,6 @@
"@blueprintjs/core": "^3.15.1",
"@types/jest": "24.0.13",
"@types/lodash": "^4.14.132",
"@types/node": "12.0.2",
"@types/react": "16.8.18",
"@types/react-dom": "16.8.4",
"@types/text-encoding": "^0.0.35",
@ -25,7 +24,8 @@
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
"eject": "react-scripts eject",
"updateDropsEphinea": "ts-node --project=tsconfig-scripts.json src/static/updateDropsEphinea.ts"
},
"eslintConfig": {
"extends": "react-app"
@ -41,5 +41,12 @@
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@types/cheerio": "^0.22.0",
"@types/node": "^12.0.3",
"cheerio": "^0.22.0",
"isomorphic-fetch": "^2.2.1",
"ts-node": "^8.2.0"
}
}

6711
public/drops.ephinea.tsv Normal file

File diff suppressed because it is too large Load Diff

View File

@ -40,6 +40,16 @@ interface PickEntityResult {
manipulating: boolean;
}
let renderer: Renderer | undefined;
export function getRenderer(): Renderer {
if (!renderer) {
renderer = new Renderer();
}
return renderer;
}
/**
* Renders a quest area or an NJ/XJ model.
*/

View File

@ -0,0 +1,115 @@
import 'isomorphic-fetch';
import cheerio from 'cheerio';
import fs from 'fs';
const SECTION_IDS = [
'Viridia', 'Greenill', 'Skyly', 'Bluefull', 'Purplenum', 'Pinkal', 'Redria', 'Oran', 'Yellowboze', 'Whitill',
];
async function update() {
const csv =
[
['mode', 'episode', 'section_id', 'monster', 'item', 'drop_rate', 'rare_rate'],
...await download('normal'),
...await download('hard'),
...await download('vhard', 'very-hard'),
...await download('ultimate')
]
.map(r => r.join('\t'))
.join('\n')
return fs.promises.writeFile('./public/drops.ephinea.tsv', csv);
}
async function download(mode: string, modeUrl: string = mode) {
const response = await fetch(`https://ephinea.pioneer2.net/drop-charts/${modeUrl}/`);
const body = await response.text();
const $ = cheerio.load(body);
let episode = 1;
const data: any[][] = [];
$('table').each((tableI, table) => {
const isBox = tableI >= 3;
$('tr', table).each((_, tr) => {
const monsterText = $(tr.firstChild).text();
if (monsterText.trim() === '') {
return;
} else if (monsterText.startsWith('EPISODE ')) {
episode = parseInt(monsterText.slice(-1), 10);
return;
}
try {
const monster = monsterText.split('/')[mode === 'ultimate' ? 1 : 0] || monsterText;
$('td', tr).each((tdI, td) => {
if (tdI === 0) {
return;
}
const sectionId = SECTION_IDS[tdI - 1];
if (isBox) {
$('font font', td).each((_, font) => {
const item = $('b', font).text();
const rareRateNum = parseFloat($('sup', font).text());
const rareRateDenom = parseFloat($('sub', font).text());
data.push(
[
mode,
episode,
sectionId,
`${monster} Box`,
item,
1,
rareRateNum / rareRateDenom
]
);
});
return;
} else {
const item = $('font b', td).text();
if (item.trim() === '') {
return;
}
try {
const title = $('font abbr', td).attr('title').replace('\r', '');
const [, dropRateNum, dropRateDenom] =
/Drop Rate: (\d+)\/(\d+(\.\d+)?)/g.exec(title)!.map(parseFloat);
const [, rareRateNum, rareRateDenom] =
/Rare Rate: (\d+)\/(\d+(\.\d+)?)/g.exec(title)!.map(parseFloat);
data.push(
[
mode,
episode,
sectionId,
monster,
item,
dropRateNum / dropRateDenom,
rareRateNum / rareRateDenom,
]
);
} catch (e) {
console.error(`Error while processing item ${item} of ${monster} in episode ${episode} ${mode}.`, e);
}
}
});
} catch (e) {
console.error(`Error while processing ${monsterText} in episode ${episode} ${mode}.`, e);
}
});
});
return data;
}
update().catch((e) => {
console.error(e);
});

View File

@ -27,4 +27,15 @@ div.ApplicationComponent .ApplicationComponent-heading {
.ApplicationComponent-main>* {
flex: 1;
}
.ApplicationComponent-error {
display: flex;
flex-direction: column;
align-items: center;
}
.ApplicationComponent-error > div {
width: 300px;
margin-top: 30px;
}

View File

@ -1,9 +1,10 @@
import { Classes, Navbar, NavbarGroup, NavbarHeading, Button } from '@blueprintjs/core';
import { Classes, Navbar, NavbarGroup, NavbarHeading, Button, Callout, Intent } from '@blueprintjs/core';
import { observer } from 'mobx-react';
import React from 'react';
import './ApplicationComponent.css';
import { QuestEditorComponent } from './quest-editor/QuestEditorComponent';
import { observable, action } from 'mobx';
import { HuntOptimizerComponent } from './hunt-optimizer/HuntOptimizerComponent';
import './ApplicationComponent.css';
@observer
export class ApplicationComponent extends React.Component {
@ -16,6 +17,9 @@ export class ApplicationComponent extends React.Component {
case 'quest-editor':
toolComponent = <QuestEditorComponent />;
break;
case 'hunt-optimizer':
toolComponent = <HuntOptimizerComponent />;
break;
}
return (
@ -28,13 +32,20 @@ export class ApplicationComponent extends React.Component {
<Button
text="Quest Editor (Beta)"
minimal={true}
active={this.tool === 'quest-editor'}
onClick={() => this.setTool('quest-editor')}
/>
<Button
text="Hunt Optimizer"
minimal={true}
active={this.tool === 'hunt-optimizer'}
onClick={() => this.setTool('hunt-optimizer')}
/>
</NavbarGroup>
</Navbar>
<div className="ApplicationComponent-main">
<ErrorBoundary>
{toolComponent}
</div>
</ErrorBoundary>
</div>
);
}
@ -43,3 +54,27 @@ export class ApplicationComponent extends React.Component {
this.tool = tool;
});
}
class ErrorBoundary extends React.Component {
state = {
hasError: false
}
render() {
return (
<div className="ApplicationComponent-main" >
{this.state.hasError ? (
<div className="ApplicationComponent-error">
<div>
<Callout intent={Intent.DANGER} title="Something went wrong." />
</div>
</div>
) : this.props.children}
</div>
);
}
static getDerivedStateFromError(_error: Error) {
return { hasError: true };
}
}

View File

@ -0,0 +1,10 @@
import React from "react";
import './HuntOptimizerComponent.css';
export class HuntOptimizerComponent extends React.Component {
render() {
return (
<div></div>
);
}
}

View File

@ -1,7 +1,7 @@
import React from 'react';
import { Object3D } from 'three';
import { Area, Quest } from '../../domain';
import { Renderer } from '../../rendering/Renderer';
import { getRenderer } from '../../rendering/Renderer';
interface Props {
quest?: Quest;
@ -10,7 +10,7 @@ interface Props {
}
export class RendererComponent extends React.Component<Props> {
private renderer = new Renderer();
private renderer = getRenderer();
render() {
return <div style={{ overflow: 'hidden' }} ref={this.modifyDom} />;
@ -36,9 +36,11 @@ export class RendererComponent extends React.Component<Props> {
return false;
}
private modifyDom = (div: HTMLDivElement) => {
this.renderer.setSize(div.clientWidth, div.clientHeight);
div.appendChild(this.renderer.domElement);
private modifyDom = (div: HTMLDivElement | null) => {
if (div) {
this.renderer.setSize(div.clientWidth, div.clientHeight);
div.appendChild(this.renderer.domElement);
}
}
private onResize = () => {

25
tsconfig-scripts.json Normal file
View File

@ -0,0 +1,25 @@
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "commonjs",
"moduleResolution": "node",
"resolveJsonModule": true,
"noEmit": true,
"experimentalDecorators": true,
"downlevelIteration": true
},
"include": [
"src"
]
}

138
yarn.lock
View File

@ -1264,6 +1264,13 @@
dependencies:
"@babel/types" "^7.3.0"
"@types/cheerio@^0.22.0":
version "0.22.11"
resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.11.tgz#61c0facf9636d14ba5f77fc65ed8913aa845d717"
integrity sha512-x0X3kPbholdJZng9wDMhb2swvUi3UYRNAuWAmIPIWlfgAJZp//cql/qblE7181Mg7SjWVwq6ldCPCLn5AY/e7w==
dependencies:
"@types/node" "*"
"@types/dom4@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.1.tgz#506d5781b9bcab81bd9a878b198aec7dee2a6033"
@ -1311,10 +1318,10 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5"
integrity sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==
"@types/node@12.0.2":
version "12.0.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40"
integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==
"@types/node@^12.0.3":
version "12.0.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.3.tgz#5d8d24e0033fc6393efadc85cb59c1f638095c9a"
integrity sha512-zkOxCS/fA+3SsdA+9Yun0iANxzhQRiNwTvJSr6N95JhuJ/x27z9G2URx1Jpt3zYFfCGUXZGL5UDxt5eyLE7wgw==
"@types/prop-types@*":
version "15.7.1"
@ -1710,6 +1717,11 @@ are-we-there-yet@~1.1.2:
delegates "^1.0.0"
readable-stream "^2.0.6"
arg@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0"
integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -2450,6 +2462,28 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
cheerio@^0.22.0:
version "0.22.0"
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=
dependencies:
css-select "~1.2.0"
dom-serializer "~0.1.0"
entities "~1.1.1"
htmlparser2 "^3.9.1"
lodash.assignin "^4.0.9"
lodash.bind "^4.1.4"
lodash.defaults "^4.0.1"
lodash.filter "^4.4.0"
lodash.flatten "^4.2.0"
lodash.foreach "^4.3.0"
lodash.map "^4.4.0"
lodash.merge "^4.4.0"
lodash.pick "^4.2.1"
lodash.reduce "^4.4.0"
lodash.reject "^4.4.0"
lodash.some "^4.4.0"
chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4:
version "2.1.5"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d"
@ -2950,7 +2984,7 @@ css-select-base-adapter@^0.1.1:
resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
css-select@^1.1.0:
css-select@^1.1.0, css-select@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
@ -3297,6 +3331,11 @@ diff-sequences@^24.3.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975"
integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==
diff@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff"
integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@ -3370,7 +3409,7 @@ dom-helpers@^3.4.0:
dependencies:
"@babel/runtime" "^7.1.2"
dom-serializer@0:
dom-serializer@0, dom-serializer@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
@ -3524,7 +3563,7 @@ enhanced-resolve@^4.1.0:
memory-fs "^0.4.0"
tapable "^1.0.0"
entities@^1.1.1:
entities@^1.1.1, entities@~1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
@ -4648,7 +4687,7 @@ html-webpack-plugin@4.0.0-beta.5:
tapable "^1.1.0"
util.promisify "1.0.0"
htmlparser2@^3.3.0:
htmlparser2@^3.3.0, htmlparser2@^3.9.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
@ -5213,7 +5252,7 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isomorphic-fetch@^2.1.1:
isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
@ -5984,11 +6023,71 @@ lodash._reinterpolate@~3.0.0:
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
lodash.assignin@^4.0.9:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI=
lodash.bind@^4.1.4:
version "4.2.1"
resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=
lodash.defaults@^4.0.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
lodash.filter@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=
lodash.flatten@^4.2.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
lodash.foreach@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
lodash.map@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=
lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
lodash.merge@^4.4.0:
version "4.6.1"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==
lodash.pick@^4.2.1:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
lodash.reduce@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=
lodash.reject@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=
lodash.some@^4.4.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@ -6061,6 +6160,11 @@ make-dir@^2.0.0, make-dir@^2.1.0:
pify "^4.0.1"
semver "^5.6.0"
make-error@^1.1.1:
version "1.3.5"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
makeerror@1.0.x:
version "1.0.11"
resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
@ -9408,6 +9512,17 @@ trough@^1.0.0:
resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24"
integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==
ts-node@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.2.0.tgz#4a89754b00560bb24cd54526e1685fa38c45f240"
integrity sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==
dependencies:
arg "^4.1.0"
diff "^4.0.1"
make-error "^1.1.1"
source-map-support "^0.5.6"
yn "^3.0.0"
ts-pnp@1.1.2, ts-pnp@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552"
@ -10274,3 +10389,8 @@ yargs@^12.0.2:
which-module "^2.0.0"
y18n "^3.2.1 || ^4.0.0"
yargs-parser "^11.1.1"
yn@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114"
integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==