diff --git a/.babelrc b/.babelrc index 14d0d1f..85ecc0f 100644 --- a/.babelrc +++ b/.babelrc @@ -1,25 +1,3 @@ { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true - } - ], - "@babel/react" - ], - "env": { - "production-esm": { - "presets": [ - [ - "@babel/env", - { - "modules": false, - "loose": true - } - ], - "@babel/react" - ] - } - } + "presets": ["@babel/typescript", "@babel/env", "@babel/react"] } diff --git a/.eslintrc.json b/.eslintrc.json index 6f2c8ec..a22106e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,9 @@ { - "extends": "wojtekmaj/react-no-automatic-runtime" + "extends": [ + "wojtekmaj/react-no-automatic-runtime", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"] } diff --git a/package.json b/package.json index f9ff3e1..eebdcbd 100644 --- a/package.json +++ b/package.json @@ -4,18 +4,20 @@ "description": "A button that handles Promises for your React app.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", - "source": "src/index.js", + "source": "src/index.ts", + "types": "src/index.ts", "scripts": { "build": "yarn build-esm && yarn build-cjs", - "build-esm": "BABEL_ENV=production-esm babel src -d dist/esm --ignore \"**/*.spec.js,**/*.spec.jsx\"", - "build-cjs": "BABEL_ENV=production-cjs babel src -d dist/cjs --ignore \"**/*.spec.js,**/*.spec.jsx\"", + "build-esm": "tsc --project tsconfig.build.json --outDir dist/esm --module esnext", + "build-cjs": "tsc --project tsconfig.build.json --outDir dist/cjs --module commonjs", "clean": "rimraf dist", "jest": "jest", - "lint": "eslint src --ext .jsx,.js", + "lint": "eslint src --ext .js,.jsx,.ts,.tsx", "postinstall": "husky install", "prepack": "yarn clean && yarn build", "prettier": "prettier --check . --cache", - "test": "yarn lint && yarn prettier && yarn jest" + "test": "yarn lint && yarn tsc && yarn prettier && yarn jest", + "tsc": "tsc --noEmit" }, "keywords": [ "react", @@ -28,18 +30,22 @@ }, "license": "MIT", "dependencies": { - "make-cancellable-promise": "^1.0.0", + "@types/react": "*", + "make-cancellable-promise": "^1.2.0", "prop-types": "^15.6.0" }, "devDependencies": { - "@babel/cli": "^7.15.0", "@babel/core": "^7.15.0", "@babel/preset-env": "^7.15.0", "@babel/preset-react": "^7.14.0", + "@babel/preset-typescript": "^7.18.6", "@testing-library/dom": "^8.11.0", "@testing-library/jest-dom": "^5.15.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^14.4.0", + "@types/jest": "^29.0.0", + "@typescript-eslint/eslint-plugin": "^5.41.0", + "@typescript-eslint/parser": "^5.44.0", "eslint": "^8.26.0", "eslint-config-wojtekmaj": "^0.7.1", "husky": "^8.0.0", @@ -49,7 +55,8 @@ "pretty-quick": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "rimraf": "^3.0.0" + "rimraf": "^3.0.0", + "typescript": "^4.9.4" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" diff --git a/src/index.spec.jsx b/src/index.spec.tsx similarity index 62% rename from src/index.spec.jsx rename to src/index.spec.tsx index a545fe6..2073eca 100644 --- a/src/index.spec.jsx +++ b/src/index.spec.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { createRef } from 'react'; import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; @@ -26,7 +26,7 @@ describe(' component', () => { errorConfig, }; - let user; + let user: ReturnType; beforeEach(() => { user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime, @@ -40,7 +40,7 @@ describe(' component', () => { }); it('passes ref correctly', () => { - const ref = React.createRef(); + const ref = createRef(); render(); @@ -63,7 +63,9 @@ describe(' component', () => { }); it('changes button state to success on click if onClick is synchronous', async () => { - const onClick = () => {}; + const onClick = () => { + // Intentionally empty + }; render(); @@ -76,7 +78,9 @@ describe(' component', () => { }); it('changes button state to default after refresh timeout has passed', async () => { - const onClick = () => {}; + const onClick = () => { + // Intentionally empty + }; render(); @@ -103,9 +107,9 @@ describe(' component', () => { }); it('changes button state to pending on click if onClick is asynchronous', async () => { - let resolve; + let resolve: () => void; const onClick = () => - new Promise((res) => { + new Promise((res) => { resolve = res; }); @@ -124,9 +128,9 @@ describe(' component', () => { }); it('changes button state to success after asynchronous onClick is resolved', async () => { - let resolve; + let resolve: () => void; const onClick = () => - new Promise((res) => { + new Promise((res) => { resolve = res; }); @@ -148,9 +152,9 @@ describe(' component', () => { }); it('changes button state to default after refresh timeout has passed', async () => { - let resolve; + let resolve: () => void; const onClick = () => - new Promise((res) => { + new Promise((res) => { resolve = res; }); @@ -184,4 +188,71 @@ describe(' component', () => { const button5 = screen.getByRole('button'); expect(button5).toHaveTextContent('Click me'); }); + + it('should allow button props to be passed by default', () => { + // @ts-expect-no-error + ; + }); + + it('should allow button props to be passed given as="button"', () => { + // @ts-expect-no-error + ; + }); + + it('should not allow link props to be passed given as="button"', () => { + // @ts-expect-error-next-line + ; + + // Sanity check + // @ts-expect-error-next-line + ; + }); + + it('should allow link props to be passed given as="a"', () => { + // @ts-expect-no-error + ; + }); + + it('should not allow button props to be passed given as="a"', () => { + // @ts-expect-error-next-line + ; + + // Sanity check + // @ts-expect-error-next-line + + Click me + ; + }); + + it('should not allow button props to be passed given as={MyButton}', () => { + function MyButton() { + return ; + } + + // @ts-expect-error-next-line + ; + + // Sanity check + function MyCustomComponent({ as, ...otherProps }: { as: React.ElementType }) { + const Component = as || 'div'; + return ; + } + + // @ts-expect-error-next-line + ; + }); + + it('should not allow invalid values for as', () => { + // @ts-expect-error-next-line + ; + + // Sanity check + function MyCustomComponent({ as }: { as: React.ElementType }) { + const Component = as || 'div'; + return ; + } + + // @ts-expect-error-next-line + ; + }); }); diff --git a/src/index.jsx b/src/index.tsx similarity index 68% rename from src/index.jsx rename to src/index.tsx index 103cdaf..6004d4b 100644 --- a/src/index.jsx +++ b/src/index.tsx @@ -2,29 +2,42 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import makeCancellable from 'make-cancellable-promise'; +type Config = React.ComponentPropsWithoutRef; + +type AsyncButtonProps = { + as?: T; + errorConfig?: Config; + onClick?: (event: React.MouseEvent) => void | Promise; + pendingConfig?: Config; + resetTimeout?: number; + successConfig?: Config; +} & Config; + +type PolymorphicRef = React.ComponentPropsWithRef['ref']; + const STATES = { ERROR: 'error', INIT: 'init', PENDING: 'pending', SUCCESS: 'success', -}; +} as const; const AsyncButton = React.forwardRef( - ( + ( { - as = 'button', + as, errorConfig, onClick, pendingConfig, resetTimeout = 2000, successConfig, ...otherProps - }, - ref, + }: AsyncButtonProps, + ref?: PolymorphicRef, ) => { - const [buttonState, setButtonState] = useState(STATES.INIT); - const cancellablePromise = useRef(); - const timeout = useRef(); + const [buttonState, setButtonState] = useState(STATES.INIT); + const cancellablePromise = useRef>(); + const timeout = useRef>(); useEffect( () => () => { @@ -37,7 +50,11 @@ const AsyncButton = React.forwardRef( ); const onClickInternal = useCallback( - (event) => { + (event: React.MouseEvent) => { + if (!onClick) { + return; + } + clearTimeout(timeout.current); const onSuccess = () => { @@ -76,9 +93,9 @@ const AsyncButton = React.forwardRef( [onClick, resetTimeout], ); - const Component = as; + const Component = as || 'button'; - const buttonConfig = (() => { + const buttonConfig: Config | null | undefined = (() => { switch (buttonState) { case STATES.ERROR: return errorConfig; @@ -120,4 +137,6 @@ AsyncButton.propTypes = { successConfig: isConfigObject, }; -export default AsyncButton; +export default AsyncButton as ( + props: AsyncButtonProps & { ref?: PolymorphicRef }, +) => React.ReactElement | null; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..699011c --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..48adf34 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "importsNotUsedAsValues": "error", + "isolatedModules": true, + "jsx": "react", + "moduleResolution": "node", + "noUncheckedIndexedAccess": true, + "outDir": "dist", + "strict": true, + "strictNullChecks": true, + "target": "es5" + }, + "include": ["src"] +} diff --git a/yarn.lock b/yarn.lock index 3b7327f..2c1b4e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,33 +22,6 @@ __metadata: languageName: node linkType: hard -"@babel/cli@npm:^7.15.0": - version: 7.20.7 - resolution: "@babel/cli@npm:7.20.7" - dependencies: - "@jridgewell/trace-mapping": ^0.3.8 - "@nicolo-ribaudo/chokidar-2": 2.1.8-no-fsevents.3 - chokidar: ^3.4.0 - commander: ^4.0.1 - convert-source-map: ^1.1.0 - fs-readdir-recursive: ^1.1.0 - glob: ^7.2.0 - make-dir: ^2.1.0 - slash: ^2.0.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependenciesMeta: - "@nicolo-ribaudo/chokidar-2": - optional: true - chokidar: - optional: true - bin: - babel: ./bin/babel.js - babel-external-helpers: ./bin/babel-external-helpers.js - checksum: 162d9645b82925cfd0a40162bbe2ed0014b215478165091c6cf9eed1fc89ceb0c462d37f4b0be48b5dc5453be33c96af092e290328deef788f18c2ae4e6618e3 - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -793,7 +766,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.20.0 resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" dependencies: @@ -1209,6 +1182,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.18.6": + version: 7.20.7 + resolution: "@babel/plugin-transform-typescript@npm:7.20.7" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.20.7 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-typescript": ^7.20.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ca569a1b8001e7e8971874656091789c6b3209f155c91c56bce82b545e43d09d156b4fcf2f0dfcdf7911a2c546c7090c2aff167a5692443f6f0382b358c233e0 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.18.10": version: 7.18.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.10" @@ -1348,6 +1334,19 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/preset-typescript@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-validator-option": ^7.18.6 + "@babel/plugin-transform-typescript": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7fe0da5103eb72d3cf39cf3e138a794c8cdd19c0b38e3e101507eef519c46a87a0d6d0e8bc9e28a13ea2364001ebe7430b9d75758aab4c3c3a8db9a487b9dc7c + languageName: node + linkType: hard + "@babel/runtime-corejs3@npm:^7.10.2": version: 7.20.7 resolution: "@babel/runtime-corejs3@npm:7.20.7" @@ -1755,7 +1754,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.8, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -1765,13 +1764,6 @@ __metadata: languageName: node linkType: hard -"@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": - version: 2.1.8-no-fsevents.3 - resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" - checksum: ee55cc9241aeea7eb94b8a8551bfa4246c56c53bc71ecda0a2104018fcc328ba5723b33686bdf9cc65d4df4ae65e8016b89e0bbdeb94e0309fe91bb9ced42344 - languageName: node - linkType: hard - "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1782,14 +1774,14 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5": +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1989,7 +1981,7 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*": +"@types/jest@npm:*, @types/jest@npm:^29.0.0": version: 29.2.5 resolution: "@types/jest@npm:29.2.5" dependencies: @@ -2010,6 +2002,13 @@ __metadata: languageName: node linkType: hard +"@types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + languageName: node + linkType: hard + "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -2072,6 +2071,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.1 resolution: "@types/stack-utils@npm:2.0.1" @@ -2111,30 +2117,155 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^5.41.0": + version: 5.49.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.49.0" + dependencies: + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/type-utils": 5.49.0 + "@typescript-eslint/utils": 5.49.0 + debug: ^4.3.4 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 15423cd9fde1ac3f8ba34526a07e537464e70463f1af784be5567fdc78e5745352fa0a2c3be0c13d066bc4b9720b5fa438d64647f624d29722eb4f158c039dcc + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.44.0": + version: 5.49.0 + resolution: "@typescript-eslint/parser@npm:5.49.0" + dependencies: + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/typescript-estree": 5.49.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 87b3760cfc29b3edd3d28fe0d5e9e5a3833d60398d7779ecc657b9e3bfec624cd464176e26b24b0761fb79cc88daddae19560340f91119c4856b91f9663594dd + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/scope-manager@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + checksum: 466047e24ff8a4195f14aadde39375f22891bdaced09e58c89f2c32af0aa4a0d87e71a5f006f6ab76858e6f30c4b764b1e0ef7bc26713bb78add30638108c45f + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/type-utils@npm:5.49.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.49.0 + "@typescript-eslint/utils": 5.49.0 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 9dcee0a21cfdb3549e2305120535af5ab2c5d0cafdd410827e79d7548f8fc4e7da7cbb77a4338ade8b8b8aaf246fee56b919f1857931bbe2ac5df2fbb5e62ee6 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/types@npm:5.49.0" + checksum: 41f72a043007fc3f3356b5a38d7bfa54871545b4a309810a062f044cff25122413a9660ce6d83d1221762f60d067351d020b0cb68f7e1279817f53e77ce8f33d + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: f331af9f0ef3ce3157c421b8cc727dec5aa0a60add305aa4c676a02c63ec07799105268af192c5ed193a682b7ed804564d29d49bdbd2019678e495d80e65e29a + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/utils@npm:5.49.0" + dependencies: + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/typescript-estree": 5.49.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 8218c566637d5104dfb2346216f8cb4c244f31c2a39e261aafe554b8abd48bd630a0d0807a0a8d776af8f9d9914c8776d86abf0a523049f3c5619c498a7e5b1e + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + eslint-visitor-keys: ^3.3.0 + checksum: 46dc7bc713e8825d1fccba521fdf7c6e2f8829e491c2afd44dbe4105c6432e3c3dfe7e1ecb221401269d639264bb4af77b60a7b65521fcff9ab02cd31d8ef782 + languageName: node + linkType: hard + "@wojtekmaj/react-async-button@workspace:.": version: 0.0.0-use.local resolution: "@wojtekmaj/react-async-button@workspace:." dependencies: - "@babel/cli": ^7.15.0 "@babel/core": ^7.15.0 "@babel/preset-env": ^7.15.0 "@babel/preset-react": ^7.14.0 + "@babel/preset-typescript": ^7.18.6 "@testing-library/dom": ^8.11.0 "@testing-library/jest-dom": ^5.15.0 "@testing-library/react": ^13.4.0 "@testing-library/user-event": ^14.4.0 + "@types/jest": ^29.0.0 + "@types/react": "*" + "@typescript-eslint/eslint-plugin": ^5.41.0 + "@typescript-eslint/parser": ^5.44.0 eslint: ^8.26.0 eslint-config-wojtekmaj: ^0.7.1 husky: ^8.0.0 jest: ^29.0.0 jest-environment-jsdom: ^29.0.0 - make-cancellable-promise: ^1.0.0 + make-cancellable-promise: ^1.2.0 prettier: ^2.7.0 pretty-quick: ^3.1.0 prop-types: ^15.6.0 react: ^18.2.0 react-dom: ^18.2.0 rimraf: ^3.0.0 + typescript: ^4.9.4 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 languageName: unknown @@ -2272,7 +2403,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -2559,13 +2690,6 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -2585,7 +2709,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -2726,25 +2850,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.0": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2848,13 +2953,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^4.0.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2869,7 +2967,7 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.1.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": +"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 @@ -2965,7 +3063,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3091,6 +3189,15 @@ __metadata: languageName: node linkType: hard +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -3433,6 +3540,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + "eslint-scope@npm:^7.1.1": version: 7.1.1 resolution: "eslint-scope@npm:7.1.1" @@ -3556,6 +3673,13 @@ __metadata: languageName: node linkType: hard +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -3631,6 +3755,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + 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 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -3747,13 +3884,6 @@ __metadata: languageName: node linkType: hard -"fs-readdir-recursive@npm:^1.1.0": - version: 1.1.0 - resolution: "fs-readdir-recursive@npm:1.1.0" - checksum: 29d50f3d2128391c7fc9fd051c8b7ea45bcc8aa84daf31ef52b17218e20bfd2bd34d02382742801954cc8d1905832b68227f6b680a666ce525d8b6b75068ad1e - languageName: node - linkType: hard - "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -3761,7 +3891,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:^2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -3771,7 +3901,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" dependencies: @@ -3880,6 +4010,15 @@ __metadata: languageName: node linkType: hard +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + "glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" @@ -3889,16 +4028,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": +"glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -3941,6 +4071,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -4222,15 +4366,6 @@ __metadata: languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - "is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" @@ -4287,7 +4422,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -5252,20 +5387,10 @@ __metadata: languageName: node linkType: hard -"make-cancellable-promise@npm:^1.0.0": - version: 1.1.0 - resolution: "make-cancellable-promise@npm:1.1.0" - checksum: e036fa6164acb52b0e6298c4d5f4e0ba887e4c96de15ef1e316fcc8374995c29543e8a3ea48d38e1c2c767e985c8869c744774af5881700a90d21128b7535a68 - languageName: node - linkType: hard - -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: ^4.0.1 - semver: ^5.6.0 - checksum: 043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab +"make-cancellable-promise@npm:^1.2.0": + version: 1.2.0 + resolution: "make-cancellable-promise@npm:1.2.0" + checksum: 2f443d10e712a96c70e40bb168a9027ac97e0909bba4f568105b712a86e1dba8449188f0902659fc84feb09c9902cb4ede684a09c2239fc7d76f1b027905b487 languageName: node linkType: hard @@ -5318,6 +5443,13 @@ __metadata: languageName: node linkType: hard +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + "micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -5512,6 +5644,13 @@ __metadata: languageName: node linkType: hard +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -5571,7 +5710,7 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 @@ -5848,6 +5987,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -5855,20 +6001,13 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - "pirates@npm:^4.0.4": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -6077,15 +6216,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -6351,15 +6481,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.6.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf - languageName: node - linkType: hard - "semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" @@ -6369,7 +6490,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5": +"semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -6428,13 +6549,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 - languageName: node - linkType: hard - "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -6755,6 +6869,24 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -6794,6 +6926,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^4.9.4": + version: 4.9.4 + resolution: "typescript@npm:4.9.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.9.4#~builtin": + version: 4.9.4 + resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=ddd1e8" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 37f6e2c3c5e2aa5934b85b0fddbf32eeac8b1bacf3a5b51d01946936d03f5377fe86255d4e5a4ae628fd0cd553386355ad362c57f13b4635064400f3e8e05b9d + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2"