From 2fbc20fe8a4d2a0996502f03121e2f3520ee0ef2 Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Alexandrovich Date: Wed, 9 Oct 2024 00:16:12 +0300 Subject: [PATCH] typescript demo step by step --- 01_simple/Readme.md | 15 + 01_simple/index.ts | 3 + 02_basic_config/src/index.ts | 6 + 02_basic_config/src/utils.ts | 1 + 02_basic_config/tsconfig.json | 14 + 03_more_options/dist/index.d.ts | 1 + 03_more_options/dist/index.js | 6 + 03_more_options/dist/index.js.map | 1 + 03_more_options/dist/utils.d.ts | 16 + 03_more_options/dist/utils.js | 16 + 03_more_options/dist/utils.js.map | 1 + 03_more_options/src/index.ts | 7 + 03_more_options/src/utils.ts | 25 + 03_more_options/test.js | 4 + 03_more_options/tsconfig.json | 32 + 04_lint/eslint.config.mjs | 16 + 04_lint/example.ts | 8 + 04_lint/package-lock.json | 1597 +++++++++++++++++++++++++++++ 04_lint/package.json | 18 + 04_lint/src/index.ts | 6 + 04_lint/src/model/enums.ts | 12 + 04_lint/src/model/index.ts | 2 + 04_lint/src/model/types.ts | 4 + 04_lint/src/utils/index.ts | 1 + 04_lint/src/utils/logUtils.ts | 14 + 05_error/animals.js | 40 + 05_error/animals.ts | 11 + 05_error/links.md | 5 + 05_error/tsconfig.json | 110 ++ 06_complex/infer.ts | 17 + assets/01.png | Bin 0 -> 53530 bytes 31 files changed, 2009 insertions(+) create mode 100644 01_simple/Readme.md create mode 100644 01_simple/index.ts create mode 100644 02_basic_config/src/index.ts create mode 100644 02_basic_config/src/utils.ts create mode 100644 02_basic_config/tsconfig.json create mode 100644 03_more_options/dist/index.d.ts create mode 100644 03_more_options/dist/index.js create mode 100644 03_more_options/dist/index.js.map create mode 100644 03_more_options/dist/utils.d.ts create mode 100644 03_more_options/dist/utils.js create mode 100644 03_more_options/dist/utils.js.map create mode 100644 03_more_options/src/index.ts create mode 100644 03_more_options/src/utils.ts create mode 100644 03_more_options/test.js create mode 100644 03_more_options/tsconfig.json create mode 100644 04_lint/eslint.config.mjs create mode 100644 04_lint/example.ts create mode 100644 04_lint/package-lock.json create mode 100644 04_lint/package.json create mode 100644 04_lint/src/index.ts create mode 100644 04_lint/src/model/enums.ts create mode 100644 04_lint/src/model/index.ts create mode 100644 04_lint/src/model/types.ts create mode 100644 04_lint/src/utils/index.ts create mode 100644 04_lint/src/utils/logUtils.ts create mode 100644 05_error/animals.js create mode 100644 05_error/animals.ts create mode 100644 05_error/links.md create mode 100644 05_error/tsconfig.json create mode 100644 06_complex/infer.ts create mode 100644 assets/01.png diff --git a/01_simple/Readme.md b/01_simple/Readme.md new file mode 100644 index 0000000..fdb5185 --- /dev/null +++ b/01_simple/Readme.md @@ -0,0 +1,15 @@ +Для того что бы увидеть как typescript подсветит ошибку необходимо выполнить шаги: + +1. Установка + +```shell +npm install -g typescript +``` + +2. Переименовываем файл + + > index.js -> index.ts + +3. Наблюдаем результат + +![screenshot](../assets/01.png) \ No newline at end of file diff --git a/01_simple/index.ts b/01_simple/index.ts new file mode 100644 index 0000000..b61b1be --- /dev/null +++ b/01_simple/index.ts @@ -0,0 +1,3 @@ +const square = { width: 10, height: 10 }; + +const check = () => console.log(square.width * square.heigth); diff --git a/02_basic_config/src/index.ts b/02_basic_config/src/index.ts new file mode 100644 index 0000000..f02f602 --- /dev/null +++ b/02_basic_config/src/index.ts @@ -0,0 +1,6 @@ +import { add } from './utils'; + +const a = 1; +const b = 22; + +console.info(add(a, b)); diff --git a/02_basic_config/src/utils.ts b/02_basic_config/src/utils.ts new file mode 100644 index 0000000..bc81dd5 --- /dev/null +++ b/02_basic_config/src/utils.ts @@ -0,0 +1 @@ +export const add = (a: number, b: number) => a + b; diff --git a/02_basic_config/tsconfig.json b/02_basic_config/tsconfig.json new file mode 100644 index 0000000..70ab0dd --- /dev/null +++ b/02_basic_config/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "UMD", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "outDir": "dist" + }, + "files": [ + "src/index.ts" + ], + "exclude": [ + "node_modules", + "**/*.ts" + ] +} diff --git a/03_more_options/dist/index.d.ts b/03_more_options/dist/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/03_more_options/dist/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/03_more_options/dist/index.js b/03_more_options/dist/index.js new file mode 100644 index 0000000..1ffed85 --- /dev/null +++ b/03_more_options/dist/index.js @@ -0,0 +1,6 @@ +import { add } from './utils'; +const a = 1; +const b = 2; +const c = 3; +console.info(add(a, b)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/03_more_options/dist/index.js.map b/03_more_options/dist/index.js.map new file mode 100644 index 0000000..36b297c --- /dev/null +++ b/03_more_options/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,GAAW,CAAC,CAAC;AACpB,MAAM,CAAC,GAAW,CAAC,CAAC;AACpB,MAAM,CAAC,GAAG,CAAC,CAAC;AAEZ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/03_more_options/dist/utils.d.ts b/03_more_options/dist/utils.d.ts new file mode 100644 index 0000000..859f0c0 --- /dev/null +++ b/03_more_options/dist/utils.d.ts @@ -0,0 +1,16 @@ +export declare const add: (a: number, b: number) => string | number; +interface Cat { + name?: { + fistName: string; + lastName: string; + age: number; + }; +} +/** + * getCatName в консоль. + * + * @param {Cat} cat Сообщение. + * @param {number} notCat Тип сообщения. + */ +export declare const getCatName: (cat: Cat, notCat: number) => string | undefined; +export {}; diff --git a/03_more_options/dist/utils.js b/03_more_options/dist/utils.js new file mode 100644 index 0000000..4b53b15 --- /dev/null +++ b/03_more_options/dist/utils.js @@ -0,0 +1,16 @@ +export const add = (a, b) => { + if (a > 0) { + return a + b; + } + return '' + a + b; +}; +/** + * getCatName в консоль. + * + * @param {Cat} cat Сообщение. + * @param {number} notCat Тип сообщения. + */ +export const getCatName = (cat, notCat) => { + return cat.name && cat.name.fistName; +}; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/03_more_options/dist/utils.js.map b/03_more_options/dist/utils.js.map new file mode 100644 index 0000000..4f7fdac --- /dev/null +++ b/03_more_options/dist/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;IACxC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC,CAAA;AAUD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAQ,EAAE,MAAc,EAAE,EAAE;IACnD,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAA;AACxC,CAAC,CAAA"} \ No newline at end of file diff --git a/03_more_options/src/index.ts b/03_more_options/src/index.ts new file mode 100644 index 0000000..6d1ef2e --- /dev/null +++ b/03_more_options/src/index.ts @@ -0,0 +1,7 @@ +import { add } from './utils'; + +const a: number = 1; +const b: number = 2; +const c = 3; + +console.info(add(a, b)) diff --git a/03_more_options/src/utils.ts b/03_more_options/src/utils.ts new file mode 100644 index 0000000..9754a33 --- /dev/null +++ b/03_more_options/src/utils.ts @@ -0,0 +1,25 @@ +export const add = (a: number, b: number) => { + if (a > 0) { + return a + b + } + + return '' + a + b +} + +interface Cat { + name?: { + fistName: string; + lastName: string; + age: number; + } +} + +/** + * getCatName в консоль. + * + * @param {Cat} cat Сообщение. + * @param {number} notCat Тип сообщения. + */ +export const getCatName = (cat: Cat, notCat: number) => { + return cat.name && cat.name.fistName +} diff --git a/03_more_options/test.js b/03_more_options/test.js new file mode 100644 index 0000000..74b6421 --- /dev/null +++ b/03_more_options/test.js @@ -0,0 +1,4 @@ +// @ts-check +import { add } from './dist/utils' + +add(1, '2') diff --git a/03_more_options/tsconfig.json b/03_more_options/tsconfig.json new file mode 100644 index 0000000..c8a5c30 --- /dev/null +++ b/03_more_options/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "ESNext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + "outDir": "dist", /* Redirect output structure to the directory. */ + + // "noEmit": true, /* Do not emit outputs. */ + + /* Strict Type-Checking Options */ + "strict": false, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* Enable strict null checks. */ + + /* Additional Checks */ + "noUnusedLocals": false, /* Report errors on unused locals. */ + "noUnusedParameters": false, /* Report errors on unused parameters. */ + "noImplicitReturns": false, /* Report error when not all code paths in function return a value. */ + + /* Source Map Options */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + }, + "files": [ + "src/index.ts" + ], + "exclude": [ + "node_modules", + "**/*.ts" + ] +} diff --git a/04_lint/eslint.config.mjs b/04_lint/eslint.config.mjs new file mode 100644 index 0000000..ee69d3b --- /dev/null +++ b/04_lint/eslint.config.mjs @@ -0,0 +1,16 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; + + +export default [ + {files: ['**/*.{js,mjs,cjs,ts}']}, + {languageOptions: { globals: globals.browser }}, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + rules: { + quotes: ['error', 'single'], + } + } +]; \ No newline at end of file diff --git a/04_lint/example.ts b/04_lint/example.ts new file mode 100644 index 0000000..49b1c10 --- /dev/null +++ b/04_lint/example.ts @@ -0,0 +1,8 @@ +const boys = 32; +const girls = 25; + +const summ = (a, b) => { + return a + b; +} + +const boysAndGirls = summ(boys, girls); diff --git a/04_lint/package-lock.json b/04_lint/package-lock.json new file mode 100644 index 0000000..5ddc2ac --- /dev/null +++ b/04_lint/package-lock.json @@ -0,0 +1,1597 @@ +{ + "name": "04_lint", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "04_lint", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@eslint/js": "^9.12.0", + "eslint": "^9.12.0", + "globals": "^15.10.0", + "typescript-eslint": "^8.8.1" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", + "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", + "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", + "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", + "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", + "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", + "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", + "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", + "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz", + "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz", + "integrity": "sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.8.1", + "@typescript-eslint/parser": "8.8.1", + "@typescript-eslint/utils": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/04_lint/package.json b/04_lint/package.json new file mode 100644 index 0000000..c7735ae --- /dev/null +++ b/04_lint/package.json @@ -0,0 +1,18 @@ +{ + "name": "04_lint", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "devDependencies": { + "@eslint/js": "^9.12.0", + "eslint": "^9.12.0", + "globals": "^15.10.0", + "typescript-eslint": "^8.8.1" + } +} diff --git a/04_lint/src/index.ts b/04_lint/src/index.ts new file mode 100644 index 0000000..9dc7a8f --- /dev/null +++ b/04_lint/src/index.ts @@ -0,0 +1,6 @@ +import { logger } from './utils'; +import { MESSAGE_TYPE } from "./model"; + +logger('good'); +logger("something is wrong", MESSAGE_TYPE.WARNING) +logger('something is very wrong', MESSAGE_TYPE.ERROR); diff --git a/04_lint/src/model/enums.ts b/04_lint/src/model/enums.ts new file mode 100644 index 0000000..df37237 --- /dev/null +++ b/04_lint/src/model/enums.ts @@ -0,0 +1,12 @@ +/** + * Тип сообщения. + * + * WARNING - Предупреждение. + * ERROR - Ошибка. + * SUCCESS - Успешно. + */ +export enum MESSAGE_TYPE { + WARNING = '#EA9325', + ERROR = '#FF3532', + SUCCESS = '#449D2C' +} diff --git a/04_lint/src/model/index.ts b/04_lint/src/model/index.ts new file mode 100644 index 0000000..05975c1 --- /dev/null +++ b/04_lint/src/model/index.ts @@ -0,0 +1,2 @@ +export { MESSAGE_TYPE } from './enums'; +export { TMessage } from './types'; diff --git a/04_lint/src/model/types.ts b/04_lint/src/model/types.ts new file mode 100644 index 0000000..5b929d7 --- /dev/null +++ b/04_lint/src/model/types.ts @@ -0,0 +1,4 @@ +/** + * Сообщение. + */ +export type TMessage = string | number; diff --git a/04_lint/src/utils/index.ts b/04_lint/src/utils/index.ts new file mode 100644 index 0000000..abc1d1c --- /dev/null +++ b/04_lint/src/utils/index.ts @@ -0,0 +1 @@ +export { logger } from './logUtils'; diff --git a/04_lint/src/utils/logUtils.ts b/04_lint/src/utils/logUtils.ts new file mode 100644 index 0000000..45cafe1 --- /dev/null +++ b/04_lint/src/utils/logUtils.ts @@ -0,0 +1,14 @@ +import { TMessage, MESSAGE_TYPE } from '../model'; + +/** + * Логирует цветное сообщение в консоль. + * + * @param {TMessage} message Сообщение. + * @param {MESSAGE_TYPE} type Тип сообщения. + */ +export const logger = (message: TMessage, type: MESSAGE_TYPE = MESSAGE_TYPE.SUCCESS): void => { + console.info(`%c ${message}`, ` + color: ${type}; + font-size: 25px; + `); +}; diff --git a/05_error/animals.js b/05_error/animals.js new file mode 100644 index 0000000..b9a93e3 --- /dev/null +++ b/05_error/animals.js @@ -0,0 +1,40 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var Animal = /** @class */ (function () { + function Animal() { + } + return Animal; +}()); +var Dog = /** @class */ (function (_super) { + __extends(Dog, _super); + function Dog() { + return _super !== null && _super.apply(this, arguments) || this; + } + Dog.prototype.bark = function () { }; + return Dog; +}(Animal)); +var Cat = /** @class */ (function (_super) { + __extends(Cat, _super); + function Cat() { + return _super !== null && _super.apply(this, arguments) || this; + } + Cat.prototype.meow = function () { }; + return Cat; +}(Animal)); +var cage1 = [new Dog(), new Dog()]; +var cage2 = cage1; // ok +cage2.push(new Cat()); // ok +cage1.forEach(function (dog) { return dog.bark(); }); // ok diff --git a/05_error/animals.ts b/05_error/animals.ts new file mode 100644 index 0000000..7cf6584 --- /dev/null +++ b/05_error/animals.ts @@ -0,0 +1,11 @@ +class Animal {} +class Dog extends Animal { bark() {} } +class Cat extends Animal { meow() {} } + +const cage1 = [new Dog(), new Dog()]; + +const cage2: Animal[] = cage1; // ok + +cage2.push(new Cat()); // ok + +cage1.forEach(dog => dog.bark()) // ok diff --git a/05_error/links.md b/05_error/links.md new file mode 100644 index 0000000..baf5148 --- /dev/null +++ b/05_error/links.md @@ -0,0 +1,5 @@ +# Links + + - [Javascript Abstract Syntax Tree](https://www.jointjs.com/demos/abstract-syntax-tree) + - [ast explorer](https://astexplorer.net/) + - [ts ast viewer](https://ts-ast-viewer.com/#) \ No newline at end of file diff --git a/05_error/tsconfig.json b/05_error/tsconfig.json new file mode 100644 index 0000000..56a8ab8 --- /dev/null +++ b/05_error/tsconfig.json @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "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 legacy experimental 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. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* 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. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "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. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "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. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "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. */ + // "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. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "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. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when 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, /* Add 'undefined' to a type when accessed using an index. */ + // "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/06_complex/infer.ts b/06_complex/infer.ts new file mode 100644 index 0000000..9783342 --- /dev/null +++ b/06_complex/infer.ts @@ -0,0 +1,17 @@ +const arr = [1, 2, '3', 4, 5]; +// get type of array +type GetArrItem = Arg extends (infer Item)[] ? Item : never; + +type ArrItem = GetArrItem + +const user = { name: 'John', age: 30 } as const; +// get type of name property +type GetObjectNameType = Name extends { name: infer T } ? T : never + +type UserName = GetObjectNameType + +const double = (x: number, s: 'foo') => x * 2; +// get type of first argument of function +type GetFirstFuncArg = Arg extends (a, x: infer T) => any ? T : never; + +type DoubleArgType = GetFirstFuncArg \ No newline at end of file diff --git a/assets/01.png b/assets/01.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec008fa2cdf03a3b0d9106edb19c431f1577d53 GIT binary patch literal 53530 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 +7dn=F^5}38Q|v% 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