From a5d2d971dd722f8b98d33d336dbaebbf980b011d Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Wed, 31 Jul 2019 20:53:57 -0600 Subject: [PATCH] add typescript --- .eslintrc | 13 +++++- package-lock.json | 91 +++++++++++++++++++++++++++++++++++++++ package.json | 10 +++-- src/typescript-example.ts | 21 +++++++++ tsconfig.json | 9 ++++ 5 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 src/typescript-example.ts create mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc index 670ea75..ce8b9ff 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,12 +1,21 @@ { + "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": 2019, "sourceType": "module", "ecmaFeatures": { "jsx": true - } + }, + "project": "./tsconfig.json" }, - "extends": ["eslint:recommended", "eslint-config-prettier"], + "plugins": ["@typescript-eslint/eslint-plugin"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "eslint-config-prettier", + "eslint-config-prettier/@typescript-eslint" + ], "rules": { "strict": ["error", "never"] }, diff --git a/package-lock.json b/package-lock.json index 1e23171..c5317d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -821,6 +821,76 @@ "to-fast-properties": "^2.0.0" } }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz", + "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.0.0", + "eslint-utils": "^1.4.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.14.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz", + "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.0.0", + "eslint-scope": "^4.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz", + "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.0.0", + "@typescript-eslint/typescript-estree": "2.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz", + "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "^6.2.0" + } + }, "acorn": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", @@ -2943,6 +3013,12 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4062,6 +4138,15 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4071,6 +4156,12 @@ "prelude-ls": "~1.1.2" } }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/package.json b/package.json index 9cd5ede..ebd4d8b 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,22 @@ "license": "GPLv3", "scripts": { "build": "babel src --out-dir dist", - "lint": "eslint --ignore-path .gitignore .", + "lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .", + "check-types": "tsc", "prettier": "prettier --ignore-path .gitignore --write \"**/*.+(js|json)\"", "format": "npm run prettier -- --write", "check-format": "npm run prettier -- --list-different", - "validate": "npm run check-format && npm run lint && npm run build" + "validate": "npm run check-types && npm run check-format && npm run lint && npm run build" }, "devDependencies": { "@babel/cli": "^7.5.5", "@babel/core": "^7.5.5", "@babel/preset-env": "^7.5.5", + "@typescript-eslint/eslint-plugin": "^2.0.0", + "@typescript-eslint/parser": "^2.0.0", "eslint": "^6.1.0", "eslint-config-prettier": "^6.0.0", - "prettier": "^1.18.2" + "prettier": "^1.18.2", + "typescript": "^3.5.3" } } diff --git a/src/typescript-example.ts b/src/typescript-example.ts new file mode 100644 index 0000000..1411db7 --- /dev/null +++ b/src/typescript-example.ts @@ -0,0 +1,21 @@ +function add(a: number, b: number): number { + return a + b +} + +interface User { + name: { + first: string + middle: string + last: string + } +} +function getFullName(user: User): string { + const { + name: {first, middle, last}, + } = user + return [first, middle, last].filter(Boolean).join('') +} + +add(1, 2) + +getFullName({name: {first: 'Joe', middle: 'Bud', last: 'Matthews'}}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6826598 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + // because we're compiling with Babel instead of TypeScript + // and we're only using TypeScript for type checking, we'll set "noEmit" + // to true so running type checking doesn't generate any files. + "noEmit": true, + "baseUrl": "./src" + } +}