diff --git a/eslintrc.ts.base.json b/eslintrc.ts.base.json new file mode 100644 index 00000000..ba7fe944 --- /dev/null +++ b/eslintrc.ts.base.json @@ -0,0 +1,12 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:prettier/recommended", + "prettier/@typescript-eslint" + ] +} diff --git a/eslintrc.ts.react.base.json b/eslintrc.ts.react.base.json new file mode 100644 index 00000000..41692415 --- /dev/null +++ b/eslintrc.ts.react.base.json @@ -0,0 +1,23 @@ +{ + "parserOptions": { + "ecmaFeatures": { + "jsx": true + } + }, + "plugins": ["react"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:react/recommended", + "plugin:prettier/recommended", + "prettier/@typescript-eslint", + "prettier/react" + ], + "settings": { + "react": { + "version": "detect" + } + } +} diff --git a/eslintrc.ts.react.jest.base.json b/eslintrc.ts.react.jest.base.json new file mode 100644 index 00000000..9627f74f --- /dev/null +++ b/eslintrc.ts.react.jest.base.json @@ -0,0 +1,15 @@ +{ + "plugins": ["jest"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:react/recommended", + "plugin:jest/recommended", + "plugin:jest/style", + "plugin:prettier/recommended", + "prettier/@typescript-eslint", + "prettier/react" + ] +} diff --git a/packages/react-json-tree/.eslintrc.js b/packages/react-json-tree/.eslintrc.js index 3aa52681..a67c00a1 100644 --- a/packages/react-json-tree/.eslintrc.js +++ b/packages/react-json-tree/.eslintrc.js @@ -3,29 +3,18 @@ module.exports = { overrides: [ { files: ['*.ts', '*.tsx'], - parser: '@typescript-eslint/parser', + extends: '../../eslintrc.ts.react.base.json', parserOptions: { tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - ecmaFeatures: { - jsx: true - } - }, - plugins: ['@typescript-eslint', 'react'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking', - 'plugin:react/recommended', - 'plugin:prettier/recommended', - 'prettier/@typescript-eslint', - 'prettier/react' - ], - settings: { - react: { - version: 'detect' - } + project: ['./tsconfig.json'] + } + }, + { + files: ['test/*.ts', 'test/*.tsx'], + extends: '../../eslintrc.ts.react.jest.base.json', + parserOptions: { + tsconfigRootDir: __dirname, + project: ['./tsconfig.test.json'] } } ] diff --git a/packages/react-json-tree/package.json b/packages/react-json-tree/package.json index 6bd4bda7..784bdd20 100644 --- a/packages/react-json-tree/package.json +++ b/packages/react-json-tree/package.json @@ -15,7 +15,7 @@ "build:umd:min": "webpack --env.minimize --progress --config webpack.config.umd.js", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", - "test": "jest", + "test": "tsc --project test/tsconfig.json --noEmit && jest", "prepare": "npm run build", "prepublishOnly": "npm run test && npm run clean && npm run build && npm run build:umd && npm run build:umd:min", "start": "cd examples && npm start" @@ -52,10 +52,13 @@ "@babel/preset-env": "^7.3.1", "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.9.0", + "@types/jest": "^25.2.1", "@types/react": "^15.0.0 || ^16.0.0", + "@types/react-test-renderer": "^16.9.2", "@typescript-eslint/eslint-plugin": "^2.31.0", "@typescript-eslint/parser": "^2.31.0", "babel-loader": "^8.0.5", + "eslint-plugin-jest": "^23.9.0", "jest": "^24.1.0", "react": "^15.0.0 || ^16.0.0", "react-test-renderer": "^16.0.0", diff --git a/packages/react-json-tree/test/index.spec.jsx b/packages/react-json-tree/test/index.spec.tsx similarity index 91% rename from packages/react-json-tree/test/index.spec.jsx rename to packages/react-json-tree/test/index.spec.tsx index 9e21fdb8..8e3d01ba 100644 --- a/packages/react-json-tree/test/index.spec.jsx +++ b/packages/react-json-tree/test/index.spec.tsx @@ -6,7 +6,7 @@ import JSONNode from '../src/JSONNode'; const BASIC_DATA = { a: 1, b: 'c' }; -function render(component) { +function render(component: React.ReactElement) { const renderer = createRenderer(); renderer.render(component); return renderer.getRenderOutput(); diff --git a/packages/react-json-tree/test/objType.spec.js b/packages/react-json-tree/test/objType.spec.ts similarity index 90% rename from packages/react-json-tree/test/objType.spec.js rename to packages/react-json-tree/test/objType.spec.ts index c8ec51c6..6b8784b3 100644 --- a/packages/react-json-tree/test/objType.spec.js +++ b/packages/react-json-tree/test/objType.spec.ts @@ -10,7 +10,11 @@ describe('objType', () => { expect(objType(new WeakSet())).toBe('WeakSet'); expect(objType(new Error())).toBe('Error'); expect(objType(new Date())).toBe('Date'); - expect(objType(() => {})).toBe('Function'); + expect( + objType(() => { + // noop + }) + ).toBe('Function'); expect(objType('')).toBe('String'); expect(objType(true)).toBe('Boolean'); expect(objType(null)).toBe('Null'); diff --git a/packages/react-json-tree/test/tsconfig.json b/packages/react-json-tree/test/tsconfig.json new file mode 100644 index 00000000..ca19def4 --- /dev/null +++ b/packages/react-json-tree/test/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../../tsconfig.react.base.json", + "include": ["../src", "."] +} diff --git a/packages/react-json-tree/tsconfig.json b/packages/react-json-tree/tsconfig.json index 1c282a01..eee740ea 100644 --- a/packages/react-json-tree/tsconfig.json +++ b/packages/react-json-tree/tsconfig.json @@ -1,14 +1,4 @@ { - "compilerOptions": { - "target": "esnext", - "module": "commonjs", - "jsx": "react", - "declaration": true, - "outDir": "lib", - "strict": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true - }, + "extends": "../../tsconfig.react.base.json", "include": ["src"] } diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..9f461de1 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "declaration": true, + "outDir": "lib", + "strict": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/tsconfig.react.base.json b/tsconfig.react.base.json new file mode 100644 index 00000000..0b24a1a9 --- /dev/null +++ b/tsconfig.react.base.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "jsx": "react" + } +} diff --git a/yarn.lock b/yarn.lock index fe2f0cf1..20941f86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1425,6 +1425,16 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@lerna/add@^3.9.0": version "3.20.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.20.0.tgz#bea7edf36fc93fb72ec34cb9ba854c48d4abf309" @@ -2632,6 +2642,14 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest@^25.2.1": + version "25.2.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" + integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" @@ -2662,7 +2680,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react@^15.0.0 || ^16.0.0": +"@types/react-test-renderer@^16.9.2": + version "16.9.2" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5" + integrity sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^15.0.0 || ^16.0.0": version "16.9.34" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.34.tgz#f7d5e331c468f53affed17a8a4d488cd44ea9349" integrity sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow== @@ -2725,6 +2750,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^15.0.0": + version "15.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" + integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^2.31.0": version "2.31.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz#942c921fec5e200b79593c71fafb1e3f57aa2e36" @@ -2735,7 +2767,7 @@ regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.31.0": +"@typescript-eslint/experimental-utils@2.31.0", "@typescript-eslint/experimental-utils@^2.5.0": version "2.31.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz#a9ec514bf7fd5e5e82bc10dcb6a86d58baae9508" integrity sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA== @@ -3189,7 +3221,7 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -6034,6 +6066,11 @@ diff-sequences@^24.9.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -6681,6 +6718,13 @@ eslint-plugin-babel@^5.3.0: dependencies: eslint-rule-composer "^0.3.0" +eslint-plugin-jest@^23.9.0: + version "23.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.9.0.tgz#7f4932eceb7ca487d171898fb9d55c05e6b36701" + integrity sha512-8mt5xJQIFh33W5nE7vCikkDTE4saTo08V91KjU6yI5sLQ9e8Jkp1OXkWJoIHLheFqY5OXIZdAjZmNYHSJ3IpzQ== + dependencies: + "@typescript-eslint/experimental-utils" "^2.5.0" + eslint-plugin-prettier@^3.0.1: version "3.1.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" @@ -9563,6 +9607,16 @@ jest-diff@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" +jest-diff@^25.2.1: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + jest-docblock@^24.3.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" @@ -9609,6 +9663,11 @@ jest-get-type@^24.9.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + jest-haste-map@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" @@ -13214,6 +13273,16 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" +pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + private@^0.1.8, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"