@ -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== |