@ -0,0 +1,6 @@ | |||
{ | |||
"semi": false, | |||
"arrowParens": "always", | |||
"singleQuote": true, | |||
"trailingComma": "none" | |||
} |
@ -0,0 +1,16 @@ | |||
{ | |||
"editor.tabSize": 2, | |||
"[javascript]": { | |||
"editor.defaultFormatter": "esbenp.prettier-vscode", | |||
"editor.formatOnSave": true | |||
}, | |||
"[typescript]": { | |||
"editor.defaultFormatter": "esbenp.prettier-vscode", | |||
"editor.formatOnSave": true | |||
}, | |||
"[html]": { | |||
"editor.defaultFormatter": "vscode.html-language-features", | |||
"editor.formatOnSave": true | |||
}, | |||
"sort-imports.on-save": true | |||
} |
@ -0,0 +1,4 @@ | |||
node_modules/ | |||
/wanikani.json | |||
/wanikani.yaml | |||
/radicals.yaml |
@ -0,0 +1,30 @@ | |||
{ | |||
"name": "@polv/wk-extra", | |||
"version": "1.0.0", | |||
"main": "index.js", | |||
"license": "MIT", | |||
"scripts": { | |||
"ts": "ts-node -r tsconfig-paths/register" | |||
}, | |||
"dependencies": { | |||
"axios": "^0.26.1", | |||
"axios-rate-limit": "^1.3.0", | |||
"js-yaml": "^4.1.0", | |||
"wanakana": "^4.0.2" | |||
}, | |||
"devDependencies": { | |||
"@types/js-yaml": "^4.0.5", | |||
"@types/node": "^17.0.23", | |||
"@types/wanakana": "^4.0.3", | |||
"import-sort-parser-typescript": "^6.0.0", | |||
"ts-node": "^10.7.0", | |||
"tsconfig-paths": "^3.14.1", | |||
"typescript": "^4.6.3" | |||
}, | |||
"importSort": { | |||
".js, .ts": { | |||
"parser": "typescript", | |||
"style": "module" | |||
} | |||
} | |||
} |
@ -0,0 +1,154 @@ | |||
import fs from 'fs' | |||
import yaml from 'js-yaml' | |||
import { toKatakana } from 'wanakana' | |||
import { subjects } from './dump-subjects' | |||
import { IKanji, IRadical } from './shared' | |||
interface IItem { | |||
document_url: string | |||
level: number | |||
meaning: string | |||
reading?: string | |||
components: { | |||
[source: string]: string[] | |||
} | |||
similar: string[] | |||
image?: { | |||
src: string | |||
content_type: string | |||
width: string | undefined | |||
height: string | undefined | |||
} | |||
} | |||
interface IBeautifiedRadicals { | |||
[id: string]: IItem | |||
} | |||
export const radicals = { | |||
data: {} as IBeautifiedRadicals, | |||
filename: 'radicals.yaml', | |||
load() { | |||
this.data = yaml.load( | |||
fs.readFileSync(this.filename, 'utf-8') | |||
) as IBeautifiedRadicals | |||
return this.data | |||
}, | |||
dump(d: IBeautifiedRadicals) { | |||
this.data = d | |||
this.finalize() | |||
}, | |||
finalize() { | |||
fs.writeFileSync( | |||
this.filename, | |||
yaml.dump(this.data, { | |||
skipInvalid: true | |||
}) | |||
) | |||
} | |||
} | |||
async function main() { | |||
const rs = subjects.load() | |||
const idMap = new Map<number, string>() | |||
radicals.data = {} | |||
rs.filter((r) => r.object === 'radical').map((r0) => { | |||
const r = r0 as IRadical | |||
const d = { | |||
document_url: r.data.document_url, | |||
level: r.data.level, | |||
meaning: r.data.meanings.filter((m) => m.primary)[0]!.meaning, | |||
components: {}, | |||
sup: r.data.amalgamation_subject_ids.map((it) => it.toString()), | |||
similar: [] | |||
} | |||
let id = r.data.characters | |||
if (id) { | |||
radicals.data[id] = d | |||
} else { | |||
id = d.meaning | |||
const st = (im: { | |||
content_type: string | |||
metadata: { dimensions?: string } | |||
}) => | |||
im.content_type === 'image/svg+xml' | |||
? 5000 | |||
: im.metadata.dimensions | |||
? Math.min(...im.metadata.dimensions.split('x').map(Number)) | |||
: 0 | |||
const im = r.data.character_images.sort((a, b) => st(a) - st(b))[0]! | |||
const dim = im.metadata.dimensions?.split('x') || [] | |||
radicals.data[id] = { | |||
...d, | |||
image: { | |||
src: im.url, | |||
content_type: im.content_type, | |||
width: dim[0], | |||
height: dim[1] | |||
} | |||
} | |||
} | |||
idMap.set(r.id, id) | |||
}) | |||
rs.filter((r) => r.object === 'kanji').map((r0) => { | |||
const r = r0 as IKanji | |||
const reading = r.data.readings.filter((m) => m.primary)[0]! | |||
const d = { | |||
document_url: r.data.document_url, | |||
level: r.data.level, | |||
meaning: r.data.meanings.filter((m) => m.primary)[0]!.meaning, | |||
reading: | |||
reading.type === 'onyomi' | |||
? toKatakana(reading.reading) | |||
: reading.reading, | |||
components: { | |||
wanikani: r.data.component_subject_ids.map((it) => it.toString()) | |||
}, | |||
similar: r.data.visually_similar_subject_ids.map((it) => it.toString()) | |||
} | |||
const id = r.data.characters | |||
idMap.set(r.id, id) | |||
// const prev = radicals.data[id] | |||
// if (prev) { | |||
// radicals.data[id] = { | |||
// ...d, | |||
// sup: prev.sup | |||
// } | |||
// } else { | |||
// radicals.data[id] = { | |||
// ...d, | |||
// sup: [] | |||
// } | |||
// } | |||
radicals.data[id] = d | |||
}) | |||
for (const [k, v] of Object.entries(radicals.data)) { | |||
if (v.components?.['wanikani']) { | |||
v.components['wanikani'] = v.components['wanikani'] | |||
.map((s) => idMap.get(Number(s)) || s) | |||
.filter((s) => s !== k) | |||
} | |||
v.similar = v.similar.map((s) => idMap.get(Number(s)) || s) | |||
// v.sup = v.sup.map((s) => idMap.get(Number(s)) || s) | |||
} | |||
radicals.finalize() | |||
} | |||
if (require.main === module) { | |||
main() | |||
} |
@ -0,0 +1,39 @@ | |||
import fs from 'fs' | |||
import { radicals } from './beautify-radicals' | |||
async function main() { | |||
const map = radicals.load() | |||
fs.writeFileSync( | |||
'../../_radicals.md', | |||
Object.entries(map) | |||
.map(([k, v]) => { | |||
const headers = [k] | |||
if (v.meaning !== k) { | |||
headers.push(v.meaning) | |||
} | |||
if (v.reading) { | |||
headers.push(v.reading) | |||
} | |||
headers.push(String(v.level)) | |||
const rows = [`## ${headers.join(', ')}`, ''] | |||
if (v.image) { | |||
rows.push( | |||
`<img src="${v.image.src}" alt="${k}"${ | |||
v.image.width ? ` width="${v.image.width}"` : '' | |||
}${v.image.height ? ` height="${v.image.height}"` : ''} />`, | |||
'' | |||
) | |||
} | |||
return rows.join('\n') | |||
}) | |||
.join('\n\n') | |||
) | |||
} | |||
if (require.main === module) { | |||
main() | |||
} |
@ -0,0 +1,53 @@ | |||
import fs from 'fs' | |||
import axios from 'axios' | |||
import { IKanji, IRadical } from './shared' | |||
export const subjects = { | |||
data: [] as (IKanji | IRadical)[], | |||
filename: 'wanikani.json', | |||
load() { | |||
this.data = JSON.parse(fs.readFileSync(this.filename, 'utf-8')) | |||
return this.data | |||
}, | |||
dump(d: (IKanji | IRadical)[]) { | |||
this.data = d | |||
this.finalize() | |||
}, | |||
finalize() { | |||
fs.writeFileSync(this.filename, JSON.stringify(this.data)) | |||
} | |||
} | |||
async function main() { | |||
const wk = axios.create({ | |||
baseURL: 'https://api.wanikani.com/v2/', | |||
headers: { | |||
Authorization: `Bearer ${process.env['WANIKANI_API_KEY']}` | |||
} | |||
}) | |||
const data: (IKanji | IRadical)[] = [] | |||
let nextURL = '/subjects?types=radical,kanji' | |||
while (nextURL) { | |||
const r = await wk | |||
.get<{ | |||
pages: { | |||
next_url?: string | |||
} | |||
data: (IKanji | IRadical)[] | |||
}>(nextURL) | |||
.then((r) => r.data) | |||
data.push(...r.data) | |||
console.info(r.pages.next_url) | |||
nextURL = r.pages.next_url || '' | |||
} | |||
subjects.dump(data) | |||
} | |||
if (require.main === module) { | |||
main() | |||
} |
@ -0,0 +1,49 @@ | |||
export interface IKanji { | |||
id: number | |||
/** Actual type */ | |||
object: 'kanji' | |||
url: string | |||
data_updated_at: string | |||
data: { | |||
level: number | |||
document_url: string | |||
characters: string | |||
meanings: { | |||
meaning: string | |||
primary: boolean | |||
}[] | |||
readings: { | |||
reading: string | |||
primary: boolean | |||
type: 'kunyomi' | 'onyomi' | |||
}[] | |||
component_subject_ids: number[] | |||
visually_similar_subject_ids: number[] | |||
} | |||
} | |||
export interface IRadical { | |||
id: number | |||
/** Actual type */ | |||
object: 'radical' | |||
url: string | |||
data_updated_at: string | |||
data: { | |||
level: number | |||
document_url: string | |||
characters: string | null | |||
character_images: { | |||
url: string | |||
metadata: { | |||
inline_styles?: boolean | |||
dimensions?: string | |||
} | |||
content_type: string | |||
}[] | |||
meanings: { | |||
meaning: string | |||
primary: boolean | |||
}[] | |||
amalgamation_subject_ids: number[] | |||
} | |||
} |
@ -0,0 +1,232 @@ | |||
import axios from 'axios' | |||
import rateLimit, { RateLimitedAxiosInstance } from 'axios-rate-limit' | |||
/** | |||
* https://docs.api.wanikani.com/20170710/#rate-limit | |||
* | |||
* Requests per minute 60 | |||
* | |||
* @param apiKey @default process.env['WANIKANI_API_KEY'] | |||
* @returns | |||
*/ | |||
export function makeWanikani( | |||
apiKey = process.env['WANIKANI_API_KEY']! | |||
): WaniKaniAxiosInstance { | |||
const wkApi = rateLimit( | |||
axios.create({ | |||
baseURL: 'https://api.wanikani.com/v2/', | |||
headers: { | |||
Authorization: `Bearer ${apiKey}` | |||
}, | |||
validateStatus: function () { | |||
return true | |||
} | |||
}), | |||
{ | |||
/** | |||
* Per second | |||
*/ | |||
maxRequests: 1, | |||
perMilliseconds: 1000 | |||
} | |||
) | |||
return Object.assign(wkApi, { | |||
async *kanji(params = {}) { | |||
let nextUrl = '/subjects' | |||
while (true) { | |||
const r = await wkApi.get< | |||
ICollection< | |||
IResource<{ | |||
characters: string | |||
level: number | |||
}> | |||
> | |||
>(nextUrl, { | |||
params: { | |||
...params, | |||
types: 'kanji' | |||
} | |||
}) | |||
for (const d of r.data.data) { | |||
yield { | |||
id: d.id, | |||
level: d.data.level, | |||
characters: d.data.characters | |||
} | |||
} | |||
console.error(r.data.url) | |||
nextUrl = r.data.pages.next_url || '' | |||
if (!nextUrl) { | |||
break | |||
} | |||
} | |||
}, | |||
async *vocabulary(params = {}) { | |||
let nextUrl = '/subjects' | |||
while (true) { | |||
const r = await wkApi.get< | |||
ICollection< | |||
IResource<{ | |||
characters: string | |||
level: number | |||
context_sentences: { | |||
ja: string | |||
en: string | |||
}[] | |||
}> | |||
> | |||
>(nextUrl, { | |||
params: { | |||
...params, | |||
types: 'vocabulary' | |||
} | |||
}) | |||
for (const d of r.data.data) { | |||
yield { | |||
id: d.id, | |||
level: d.data.level, | |||
characters: d.data.characters, | |||
sentences: d.data.context_sentences | |||
} | |||
} | |||
console.error(r.data.url) | |||
nextUrl = r.data.pages.next_url || '' | |||
if (!nextUrl) { | |||
break | |||
} | |||
} | |||
}, | |||
async *subjects<T = any>(params = {}) { | |||
let nextUrl = '/subjects' | |||
while (true) { | |||
const r = await wkApi.get< | |||
ICollection< | |||
IResource<any> & { | |||
id: number | |||
object: string | |||
data_updated_at: string | |||
url: string | |||
data: T | |||
} | |||
> | |||
>(nextUrl, { params }) | |||
for (const d of r.data.data) { | |||
yield { | |||
id: d.id, | |||
data_updated_at: d.data_updated_at, | |||
object: d.object, | |||
url: d.url, | |||
data: d.data | |||
} | |||
} | |||
console.error(r.data.url) | |||
nextUrl = r.data.pages.next_url || '' | |||
if (!nextUrl) { | |||
break | |||
} | |||
} | |||
}, | |||
async *assignments( | |||
params = { | |||
unlocked: 'true' | |||
} | |||
) { | |||
let nextUrl = '/assignments' | |||
while (true) { | |||
const r = await wkApi.get< | |||
ICollection< | |||
IResource<{ | |||
subject_id: number | |||
srs_stage: number | |||
}> | |||
> | |||
>(nextUrl, { | |||
params | |||
}) | |||
console.error(r.data.url) | |||
for (const d of r.data.data) { | |||
yield { | |||
id: d.data.subject_id, | |||
srsLevel: d.data.srs_stage | |||
} | |||
} | |||
nextUrl = r.data.pages.next_url || '' | |||
if (!nextUrl) { | |||
break | |||
} | |||
} | |||
} | |||
}) | |||
} | |||
export interface WaniKaniAxiosInstance extends RateLimitedAxiosInstance { | |||
kanji(params?: any): AsyncGenerator<{ | |||
id: number | |||
level: number | |||
characters: string | |||
}> | |||
vocabulary(params?: any): AsyncGenerator<{ | |||
id: number | |||
level: number | |||
characters: string | |||
sentences: { | |||
ja: string | |||
en: string | |||
}[] | |||
}> | |||
subjects<T = any>( | |||
params?: any | |||
): AsyncGenerator<{ | |||
id: number | |||
object: string | |||
data_updated_at: string | |||
url: string | |||
data: T | |||
}> | |||
assignments(params?: any): AsyncGenerator<{ | |||
id: number | |||
srsLevel: number | |||
}> | |||
} | |||
export interface IResource<T = any> { | |||
id: number | |||
url: string | |||
data_updated_at: string // Date | |||
data: T | |||
} | |||
export interface ICollection<T = any> { | |||
object: string | |||
url: string | |||
pages: { | |||
next_url?: string | |||
previous_url?: string | |||
per_page: number | |||
} | |||
total_count: number | |||
data_updated_at: string // Date | |||
data: T[] | |||
} | |||
export interface IError { | |||
error: string | |||
code: number | |||
} |
@ -0,0 +1,10 @@ | |||
{ | |||
"extends": "../tsconfig.json", | |||
"compilerOptions": { | |||
"rootDir": ".", | |||
"outDir": "../lib", | |||
"sourceMap": true, | |||
"declaration": true, | |||
"declarationMap": true | |||
} | |||
} |
@ -0,0 +1,103 @@ | |||
{ | |||
"compilerOptions": { | |||
/* Visit https://aka.ms/tsconfig.json to read more about this file */ | |||
/* Projects */ | |||
// "incremental": true, /* Enable incremental compilation */ | |||
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ | |||
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ | |||
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ | |||
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ | |||
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ | |||
/* Language and Environment */ | |||
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ | |||
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ | |||
// "jsx": "preserve", /* Specify what JSX code is generated. */ | |||
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ | |||
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ | |||
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ | |||
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ | |||
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ | |||
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ | |||
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ | |||
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ | |||
/* Modules */ | |||
"module": "commonjs", /* Specify what module code is generated. */ | |||
// "rootDir": "./", /* Specify the root folder within your source files. */ | |||
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ | |||
"baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ | |||
"paths": { | |||
"@/*": ["src/*"] | |||
}, /* Specify a set of entries that re-map imports to additional lookup locations. */ | |||
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ | |||
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ | |||
// "types": [], /* Specify type package names to be included without being referenced in a source file. */ | |||
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ | |||
// "resolveJsonModule": true, /* Enable importing .json files */ | |||
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */ | |||
/* JavaScript Support */ | |||
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ | |||
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ | |||
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ | |||
/* Emit */ | |||
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ | |||
// "declarationMap": true, /* Create sourcemaps for d.ts files. */ | |||
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ | |||
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */ | |||
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ | |||
// "outDir": "./", /* Specify an output folder for all emitted files. */ | |||
// "removeComments": true, /* Disable emitting comments. */ | |||
// "noEmit": true, /* Disable emitting files from a compilation. */ | |||
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ | |||
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ | |||
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ | |||
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ | |||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ | |||
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ | |||
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ | |||
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ | |||
// "newLine": "crlf", /* Set the newline character for emitting files. */ | |||
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ | |||
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ | |||
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ | |||
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ | |||
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */ | |||
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ | |||
/* Interop Constraints */ | |||
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ | |||
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ | |||
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ | |||
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ | |||
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ | |||
/* Type Checking */ | |||
"strict": true, /* Enable all strict type-checking options. */ | |||
"noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ | |||
"strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ | |||
"strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ | |||
"strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ | |||
"strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ | |||
"noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ | |||
"useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ | |||
"alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ | |||
"noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ | |||
"noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ | |||
"exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ | |||
"noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ | |||
"noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ | |||
"noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ | |||
"noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ | |||
"noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ | |||
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ | |||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ | |||
/* Completeness */ | |||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ | |||
"skipLibCheck": true /* Skip type checking all .d.ts files. */ | |||
} | |||
} |
@ -0,0 +1,192 @@ | |||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. | |||
# yarn lockfile v1 | |||
"@cspotcode/source-map-consumer@0.8.0": | |||
version "0.8.0" | |||
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" | |||
integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== | |||
"@cspotcode/source-map-support@0.7.0": | |||
version "0.7.0" | |||
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" | |||
integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== | |||
dependencies: | |||
"@cspotcode/source-map-consumer" "0.8.0" | |||
"@tsconfig/node10@^1.0.7": | |||
version "1.0.8" | |||
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" | |||
integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== | |||
"@tsconfig/node12@^1.0.7": | |||
version "1.0.9" | |||
resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" | |||
integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== | |||
"@tsconfig/node14@^1.0.0": | |||
version "1.0.1" | |||
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" | |||
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== | |||
"@tsconfig/node16@^1.0.2": | |||
version "1.0.2" | |||
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" | |||
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== | |||
"@types/js-yaml@^4.0.5": | |||
version "4.0.5" | |||
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" | |||
integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== | |||
"@types/json5@^0.0.29": | |||
version "0.0.29" | |||
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" | |||
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= | |||
"@types/node@^17.0.23": | |||
version "17.0.23" | |||
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" | |||
integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== | |||
"@types/wanakana@^4.0.3": | |||
version "4.0.3" | |||
resolved "https://registry.yarnpkg.com/@types/wanakana/-/wanakana-4.0.3.tgz#b67b133b223facbf28aba0338b79f523e92cf97a" | |||
integrity sha512-AibaWzahBKizxmsAy8rEWSIqqcT0v9KZTS8S6zPLmStGBFdccYfXydhgwYOV+6lGqQ890MpA4h2MPET3uPk9Zg== | |||
acorn-walk@^8.1.1: | |||
version "8.2.0" | |||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" | |||
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== | |||
acorn@^8.4.1: | |||
version "8.7.0" | |||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" | |||
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== | |||
arg@^4.1.0: | |||
version "4.1.3" | |||
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" | |||
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== | |||
argparse@^2.0.1: | |||
version "2.0.1" | |||
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" | |||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== | |||
axios-rate-limit@^1.3.0: | |||
version "1.3.0" | |||
resolved "https://registry.yarnpkg.com/axios-rate-limit/-/axios-rate-limit-1.3.0.tgz#03241d24c231c47432dab6e8234cfde819253c2e" | |||
integrity sha512-cKR5wTbU/CeeyF1xVl5hl6FlYsmzDVqxlN4rGtfO5x7J83UxKDckudsW0yW21/ZJRcO0Qrfm3fUFbhEbWTLayw== | |||
axios@^0.26.1: | |||
version "0.26.1" | |||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" | |||
integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== | |||
dependencies: | |||
follow-redirects "^1.14.8" | |||
create-require@^1.1.0: | |||
version "1.1.1" | |||
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" | |||
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== | |||
diff@^4.0.1: | |||
version "4.0.2" | |||
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" | |||
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== | |||
follow-redirects@^1.14.8: | |||
version "1.14.9" | |||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" | |||
integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== | |||
import-sort-parser-typescript@^6.0.0: | |||
version "6.0.0" | |||
resolved "https://registry.yarnpkg.com/import-sort-parser-typescript/-/import-sort-parser-typescript-6.0.0.tgz#98e73cef9e077d073e798722ed59e215b51c17e2" | |||
integrity sha512-pgxnr3I156DonupQriNsgDb2zJN9TxrqCCIN1rwT/6SDO1rkJb+a0fjqshCjlgacTSA92oPAp1eAwmQUeZi3dw== | |||
dependencies: | |||
typescript "^3.2.4" | |||
js-yaml@^4.1.0: | |||
version "4.1.0" | |||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" | |||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== | |||
dependencies: | |||
argparse "^2.0.1" | |||
json5@^1.0.1: | |||
version "1.0.1" | |||
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" | |||
integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== | |||
dependencies: | |||
minimist "^1.2.0" | |||
make-error@^1.1.1: | |||
version "1.3.6" | |||
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" | |||
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== | |||
minimist@^1.2.0, minimist@^1.2.6: | |||
version "1.2.6" | |||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" | |||
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== | |||
strip-bom@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" | |||
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= | |||
ts-node@^10.7.0: | |||
version "10.7.0" | |||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" | |||
integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== | |||
dependencies: | |||
"@cspotcode/source-map-support" "0.7.0" | |||
"@tsconfig/node10" "^1.0.7" | |||
"@tsconfig/node12" "^1.0.7" | |||
"@tsconfig/node14" "^1.0.0" | |||
"@tsconfig/node16" "^1.0.2" | |||
acorn "^8.4.1" | |||
acorn-walk "^8.1.1" | |||
arg "^4.1.0" | |||
create-require "^1.1.0" | |||
diff "^4.0.1" | |||
make-error "^1.1.1" | |||
v8-compile-cache-lib "^3.0.0" | |||
yn "3.1.1" | |||
tsconfig-paths@^3.14.1: | |||
version "3.14.1" | |||
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" | |||
integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== | |||
dependencies: | |||
"@types/json5" "^0.0.29" | |||
json5 "^1.0.1" | |||
minimist "^1.2.6" | |||
strip-bom "^3.0.0" | |||
typescript@^3.2.4: | |||
version "3.9.10" | |||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" | |||
integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== | |||
typescript@^4.6.3: | |||
version "4.6.3" | |||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" | |||
integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== | |||
v8-compile-cache-lib@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" | |||
integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== | |||
wanakana@^4.0.2: | |||
version "4.0.2" | |||
resolved "https://registry.yarnpkg.com/wanakana/-/wanakana-4.0.2.tgz#a7d60186724a56fd50e6e9c224628c09294901d8" | |||
integrity sha512-lBFtnLJhTpp5wQBdH7TrOHhLxqmUabAfL86plNN8+iffyhosjZyx+kkO8KEBGR8zWH5nxSQ67oyx3W/lcEC8sg== | |||
yn@3.1.1: | |||
version "3.1.1" | |||
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" | |||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== |