From d194bcfe606d6bf34e075541dcf807c391374c6f Mon Sep 17 00:00:00 2001 From: Vu Nguyen Date: Sat, 16 Jan 2021 19:31:52 -0600 Subject: [PATCH] Es6 cmp migration (#113) * migrate Alert component * convert Mainlist component * add webpack watch task * update build script for different manifests * add types for api responses * convert changeExtensionIcon * convert inArray, getDomainParts, contains to ts * convert changeExtensionTooltip * convert changeExtensionState to ts --- .eslintrc.js | 2 + package-lock.json | 165 ++++++++++++++++++ package.json | 7 + src/components/Alert.test.tsx | 34 ++++ src/components/Alert.tsx | 11 ++ src/components/MainList.test.tsx | 63 +++++++ src/components/MainList.tsx | 87 +++++++++ src/config.ts | 16 +- src/manifests/chrome.json | 38 ++++ .../manifest.json => manifests/firefox.json} | 0 src/types/heartbeats.d.ts | 28 +++ src/types/summaries.d.ts | 47 +++++ src/types/user.d.ts | 44 +++++ src/utils/changeExtensionIcon.ts | 28 +++ src/utils/changeExtensionState.ts | 34 ++++ src/utils/changeExtensionTooltip.ts | 16 ++ src/utils/contains.ts | 24 +++ src/utils/getDomainFromUrl.ts | 8 + src/utils/inArray.ts | 12 ++ webpack.config.ts | 4 +- xclap.ts | 2 + 21 files changed, 660 insertions(+), 10 deletions(-) create mode 100644 src/components/Alert.test.tsx create mode 100644 src/components/Alert.tsx create mode 100644 src/components/MainList.test.tsx create mode 100644 src/components/MainList.tsx create mode 100644 src/manifests/chrome.json rename src/{html/manifest.json => manifests/firefox.json} (100%) create mode 100644 src/types/heartbeats.d.ts create mode 100644 src/types/summaries.d.ts create mode 100644 src/types/user.d.ts create mode 100644 src/utils/changeExtensionIcon.ts create mode 100644 src/utils/changeExtensionState.ts create mode 100644 src/utils/changeExtensionTooltip.ts create mode 100644 src/utils/contains.ts create mode 100644 src/utils/getDomainFromUrl.ts create mode 100644 src/utils/inArray.ts diff --git a/.eslintrc.js b/.eslintrc.js index 32a2e07..8f58a9b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,6 +13,8 @@ module.exports = { 'kentcdodds/import', 'kentcdodds/jest', 'kentcdodds/possible-errors', + 'plugin:jest-dom/recommended', + 'plugin:testing-library/recommended', 'plugin:@typescript-eslint/recommended', 'plugin:import/errors', 'plugin:import/typescript', diff --git a/package-lock.json b/package-lock.json index af69205..cf03742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5897,6 +5897,144 @@ } } }, + "@testing-library/jest-dom": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.9.tgz", + "integrity": "sha512-Mn2gnA9d1wStlAIT2NU8J15LNob0YFBVjs2aEQ3j8rsfRQo+lAs7/ui1i2TGaJjapLmuNPLTsrm+nPjmZDwpcQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^4.2.2", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "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 + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/react": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.3.tgz", + "integrity": "sha512-BirBUGPkTW28ULuCwIbYo0y2+0aavHczBT6N9r3LrsswEW3pg25l1wgoE7I8QBIy1upXWkwKpYdWY7NYYP0Bxw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + } + }, + "@testing-library/user-event": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.6.0.tgz", + "integrity": "sha512-FNEH/HLmOk5GO70I52tKjs7WvGYckeE/SrnLX/ip7z2IGbffyd5zOUM1tZ10vsTphqm+VbDFI0oaXu0wcfQsAQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" + } + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", @@ -5960,6 +6098,12 @@ "@types/har-format": "*" } }, + "@types/classnames": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.11.tgz", + "integrity": "sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw==", + "dev": true + }, "@types/copy-webpack-plugin": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-6.4.0.tgz", @@ -6278,6 +6422,15 @@ "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", "dev": true }, + "@types/testing-library__jest-dom": { + "version": "5.9.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz", + "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, "@types/uglify-js": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", @@ -10645,6 +10798,12 @@ } } }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=", + "dev": true + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -20413,6 +20572,12 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", diff --git a/package.json b/package.json index 620ef4a..ce055e6 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,12 @@ "webextension-polyfill-ts": "^0.22.0" }, "devDependencies": { + "@testing-library/dom": "^7.29.4", + "@testing-library/jest-dom": "^5.11.9", + "@testing-library/react": "^11.2.3", + "@testing-library/user-event": "^12.6.0", "@types/chrome": "0.0.128", + "@types/classnames": "^2.2.11", "@types/copy-webpack-plugin": "^6.4.0", "@types/firefox-webext-browser": "^82.0.0", "@types/jest": "^26.0.20", @@ -60,9 +65,11 @@ "eslint-config-kentcdodds": "^17.3.0", "eslint-config-prettier": "^7.1.0", "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest-dom": "^3.6.5", "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-react": "^7.22.0", "eslint-plugin-sort-keys-fix": "^1.1.1", + "eslint-plugin-testing-library": "^3.10.1", "eslint-plugin-typescript-sort-keys": "^1.5.0", "gulp": "^3.9.1", "husky": "^4.3.7", diff --git a/src/components/Alert.test.tsx b/src/components/Alert.test.tsx new file mode 100644 index 0000000..88f0e6e --- /dev/null +++ b/src/components/Alert.test.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import Alert from './Alert'; + +describe('Alert Component', () => { + it('should render with proper text on success type', () => { + const text = 'Test Text'; + const { container } = render(); + expect(screen.getByText(text)).toBeTruthy(); + expect(container).toMatchInlineSnapshot(` +
+
+ Test Text +
+
+ `); + }); + it('should render wtih proper text on danger type', () => { + const text = 'Test Text'; + const { container } = render(); + expect(screen.getByText(text)).toBeTruthy(); + expect(container).toMatchInlineSnapshot(` +
+
+ Test Text +
+
+ `); + }); +}); diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx new file mode 100644 index 0000000..52b76e9 --- /dev/null +++ b/src/components/Alert.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import classNames from 'classnames'; +import { SuccessOrFailType } from '../config'; +interface AlertProps { + text: string; + type: SuccessOrFailType; +} + +export default function Alert({ type, text }: AlertProps): JSX.Element { + return
{text}
; +} diff --git a/src/components/MainList.test.tsx b/src/components/MainList.test.tsx new file mode 100644 index 0000000..bbd5d93 --- /dev/null +++ b/src/components/MainList.test.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import MainList from './MainList'; + +type onClick = (event: React.MouseEvent) => void; +describe('MainList', () => { + let disableLogging: onClick; + let enableLogging: onClick; + let loggedIn: boolean; + let loggingEnabled: boolean; + let logoutUser: onClick; + let totalTimeLoggedToday: string; + beforeEach(() => { + disableLogging = jest.fn(); + enableLogging = jest.fn(); + loggingEnabled = false; + loggedIn = false; + logoutUser = jest.fn(); + totalTimeLoggedToday = '1/1/1999'; + }); + it('should render properly', () => { + const { container } = render( + , + ); + expect(container).toMatchInlineSnapshot(` +