From 693b742c9e98765a20e1f98fe9206244b7944902 Mon Sep 17 00:00:00 2001 From: Pacharapol Withayasakpunt Date: Sun, 3 Apr 2022 08:41:43 +0700 Subject: [PATCH] compile from wk --- .prettierrc.json | 6 + .vscode/settings.json | 16 ++ __scripts__/node/.gitignore | 4 + __scripts__/node/package.json | 30 +++ __scripts__/node/scripts/beautify-radicals.ts | 154 ++++++++++++ __scripts__/node/scripts/build-radicals.ts | 39 +++ __scripts__/node/scripts/dump-subjects.ts | 53 ++++ __scripts__/node/scripts/shared.ts | 49 ++++ __scripts__/node/src/index.ts | 232 ++++++++++++++++++ __scripts__/node/src/tsconfig.json | 10 + __scripts__/node/tsconfig.json | 103 ++++++++ __scripts__/node/yarn.lock | 192 +++++++++++++++ 12 files changed, 888 insertions(+) create mode 100644 .prettierrc.json create mode 100644 .vscode/settings.json create mode 100644 __scripts__/node/.gitignore create mode 100644 __scripts__/node/package.json create mode 100644 __scripts__/node/scripts/beautify-radicals.ts create mode 100644 __scripts__/node/scripts/build-radicals.ts create mode 100644 __scripts__/node/scripts/dump-subjects.ts create mode 100644 __scripts__/node/scripts/shared.ts create mode 100644 __scripts__/node/src/index.ts create mode 100644 __scripts__/node/src/tsconfig.json create mode 100644 __scripts__/node/tsconfig.json create mode 100644 __scripts__/node/yarn.lock diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..95bf7f6 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": false, + "arrowParens": "always", + "singleQuote": true, + "trailingComma": "none" +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fe67264 --- /dev/null +++ b/.vscode/settings.json @@ -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 +} diff --git a/__scripts__/node/.gitignore b/__scripts__/node/.gitignore new file mode 100644 index 0000000..2c76074 --- /dev/null +++ b/__scripts__/node/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +/wanikani.json +/wanikani.yaml +/radicals.yaml \ No newline at end of file diff --git a/__scripts__/node/package.json b/__scripts__/node/package.json new file mode 100644 index 0000000..c0cf067 --- /dev/null +++ b/__scripts__/node/package.json @@ -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" + } + } +} diff --git a/__scripts__/node/scripts/beautify-radicals.ts b/__scripts__/node/scripts/beautify-radicals.ts new file mode 100644 index 0000000..ffc6244 --- /dev/null +++ b/__scripts__/node/scripts/beautify-radicals.ts @@ -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() + 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() +} diff --git a/__scripts__/node/scripts/build-radicals.ts b/__scripts__/node/scripts/build-radicals.ts new file mode 100644 index 0000000..d13aab2 --- /dev/null +++ b/__scripts__/node/scripts/build-radicals.ts @@ -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( + `${k}`, + '' + ) + } + + return rows.join('\n') + }) + .join('\n\n') + ) +} + +if (require.main === module) { + main() +} diff --git a/__scripts__/node/scripts/dump-subjects.ts b/__scripts__/node/scripts/dump-subjects.ts new file mode 100644 index 0000000..0cac60b --- /dev/null +++ b/__scripts__/node/scripts/dump-subjects.ts @@ -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() +} diff --git a/__scripts__/node/scripts/shared.ts b/__scripts__/node/scripts/shared.ts new file mode 100644 index 0000000..0914343 --- /dev/null +++ b/__scripts__/node/scripts/shared.ts @@ -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[] + } +} diff --git a/__scripts__/node/src/index.ts b/__scripts__/node/src/index.ts new file mode 100644 index 0000000..5a6fbfd --- /dev/null +++ b/__scripts__/node/src/index.ts @@ -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(params = {}) { + let nextUrl = '/subjects' + + while (true) { + const r = await wkApi.get< + ICollection< + IResource & { + 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( + 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 { + id: number + url: string + data_updated_at: string // Date + data: T +} + +export interface ICollection { + 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 +} diff --git a/__scripts__/node/src/tsconfig.json b/__scripts__/node/src/tsconfig.json new file mode 100644 index 0000000..988127f --- /dev/null +++ b/__scripts__/node/src/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "../lib", + "sourceMap": true, + "declaration": true, + "declarationMap": true + } +} \ No newline at end of file diff --git a/__scripts__/node/tsconfig.json b/__scripts__/node/tsconfig.json new file mode 100644 index 0000000..e36be5a --- /dev/null +++ b/__scripts__/node/tsconfig.json @@ -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 ``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. */ + } +} diff --git a/__scripts__/node/yarn.lock b/__scripts__/node/yarn.lock new file mode 100644 index 0000000..a4baf44 --- /dev/null +++ b/__scripts__/node/yarn.lock @@ -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==