setup a eslint/prettier setup with plugins, and a basic webpack setup

This commit is contained in:
Vu Nguyen
2021-01-14 22:54:40 -06:00
parent ba3182fd59
commit b9cfc9b18e
14 changed files with 10807 additions and 72 deletions

View File

@@ -1,2 +1,5 @@
assets
public
tests
coverage
gulpfile.js

53
.eslintrc.js Normal file
View File

@@ -0,0 +1,53 @@
module.exports = {
env: {
browser: true,
es2021: true,
es6: true,
'jest/globals': true,
node: true,
},
extends: [
'eslint:recommended',
'kentcdodds/best-practices',
'kentcdodds/es6/possible-errors',
'kentcdodds/import',
'kentcdodds/jest',
'kentcdodds/possible-errors',
'plugin:@typescript-eslint/recommended',
'plugin:import/errors',
'plugin:import/typescript',
'plugin:prettier/recommended',
'plugin:react/recommended',
'plugin:typescript-sort-keys/recommended',
],
globals: {
browser: true,
chrome: true,
phantom: true,
},
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
sourceType: 'module', // Allows for the use of imports
},
plugins: ['react', '@typescript-eslint', 'typescript-sort-keys', 'sort-keys-fix'],
rules: {
'prettier/prettier': 'error',
'sort-keys-fix/sort-keys-fix': 'error',
},
settings: {
'import/extensions': ['.js', '.jsx', '.ts', '.tsx'],
'import/ignore': ['.scss', '.css'],
'import/parsers': {
'@typescript-eslint/parser': ['.ts', '.tsx'],
},
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
};

3
.gitignore vendored
View File

@@ -34,3 +34,6 @@ vendor/bower_components
public/
web-ext-artifacts/
.web-extension-id
# Distribution folders
dist

View File

@@ -1,5 +0,0 @@
coverage/
node_modules/
public/
vendor/
tests/

View File

@@ -1,10 +0,0 @@
{
"node": true,
"curly": true,
"latedef": true,
"quotmark": true,
"undef": true,
"unused": true,
"trailing": true,
"predef": ["chrome"]
}

View File

@@ -1,4 +1,5 @@
module.exports = {
plugins: [require('prettier-plugin-sort-json'), require('prettier-plugin-packagejson')],
printWidth: 100,
singleQuote: true,
trailingComma: 'all',

View File

@@ -1,6 +1,6 @@
{
"pre-commit": ["lint", "validate", "test"],
"scripts": {
"lint": "jshint ."
},
"pre-commit": ["lint", "validate", "test"]
}
}

View File

@@ -1,23 +1,4 @@
{
"manifest_version": 2,
"name": "WakaTime",
"version": "2.0.1",
"description": "Automatic time tracking for Chrome.",
"homepage_url": "https://wakatime.com",
"devtools_page": "devtools.html",
"icons": {
"16": "graphics/wakatime-logo-16.png",
"48": "graphics/wakatime-logo-48.png",
"128": "graphics/wakatime-logo-128.png"
},
"permissions": [
"https://api.wakatime.com/*",
"https://wakatime.com/*",
"alarms",
"tabs",
"storage",
"idle"
],
"background": {
"scripts": ["public/js/browser-polyfill.min.js", "public/js/events.js"],
"persistent": false
@@ -30,14 +11,33 @@
"default_title": "WakaTime",
"default_popup": "popup.html"
},
"options_ui": {
"page": "options.html",
"chrome_style": false
},
"browser_specific_settings": {
"gecko": {
"id": "addon@wakatime.com",
"strict_min_version": "48.0"
}
}
},
"description": "Automatic time tracking for Chrome.",
"devtools_page": "devtools.html",
"homepage_url": "https://wakatime.com",
"icons": {
"16": "graphics/wakatime-logo-16.png",
"48": "graphics/wakatime-logo-48.png",
"128": "graphics/wakatime-logo-128.png"
},
"manifest_version": 2,
"name": "WakaTime",
"options_ui": {
"page": "options.html",
"chrome_style": false
},
"permissions": [
"https://api.wakatime.com/*",
"https://wakatime.com/*",
"alarms",
"tabs",
"storage",
"idle"
],
"version": "2.0.1"
}

10619
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,14 @@
{
"name": "chrome-wakatime",
"private": true,
"scripts": {
"test": "clap test",
"start": "clap build",
"gulp": "gulp",
"watch": "gulp watch",
"lint": "clap lint",
"postinstall": "clap postinstall",
"validate": "npm ls"
"lint": "clap lint",
"start": "clap build",
"test": "clap test",
"validate": "npm ls",
"watch": "gulp watch"
},
"husky": {
"hooks": {
@@ -26,28 +27,54 @@
]
},
"jest": {
"verbose": true,
"testURL": "http://localhost/",
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
"testDirectoryName": "tests",
"testFileExtensions": [
"jest.js"
],
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
"testDirectoryName": "tests",
"testURL": "http://localhost/",
"unmockedModulePathPatterns": [
"<rootDir>/node_modules/react"
]
],
"verbose": true
},
"dependencies": {
"bootstrap": "3.4.1",
"classnames": "^2.2.5",
"create-react-class": "^15.6.3",
"font-awesome": "4.6.3",
"jquery": "^3.0.0",
"moment": "^2.13.0",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-transition-group": "^1.0.0",
"webextension-polyfill": "^0.4.0"
},
"private": true,
"devDependencies": {
"@types/chrome": "0.0.128",
"@types/jest": "^26.0.20",
"@types/jquery": "^3.5.5",
"@types/node": "^14.14.20",
"@types/react": "^17.0.0",
"@types/react-dom": "^17.0.0",
"@typescript-eslint/eslint-plugin": "^4.13.0",
"@typescript-eslint/parser": "^4.13.0",
"@xarc/run": "^1.0.4",
"babel-jest": "^22.1.0",
"bower": "^1.7.9",
"chai": "^4.1.2",
"del": "^3.0.0",
"eslint": "^7.17.0",
"eslint-config-kentcdodds": "^17.3.0",
"eslint-config-prettier": "^7.1.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0",
"eslint-plugin-sort-keys-fix": "^1.1.1",
"eslint-plugin-typescript-sort-keys": "^1.5.0",
"gulp": "^3.9.1",
"husky": "^4.3.7",
"jest": "^26.6.3",
"jest-cli": "^22.1.4",
"jsdom": "^16.4.0",
"jshint": "^2.9.2",
@@ -61,24 +88,17 @@
"phantomjs": "^2.1.7",
"popper.js": "^1.14.6",
"prettier": "^2.2.1",
"prettier-plugin-packagejson": "^2.2.9",
"prettier-plugin-sort-json": "0.0.1",
"rimraf": "^3.0.2",
"sinon": "^4.2.2",
"sinon-chai": "^2.8.0",
"sinon-chrome": "^2.2.4",
"traceur": "^0.0.111",
"ts-loader": "^8.0.14",
"ts-node": "^9.1.1",
"typescript": "^4.1.3"
},
"dependencies": {
"bootstrap": "3.4.1",
"classnames": "^2.2.5",
"create-react-class": "^15.6.3",
"font-awesome": "4.6.3",
"jquery": "^3.0.0",
"moment": "^2.13.0",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-transition-group": "^1.0.0",
"webextension-polyfill": "^0.4.0"
"typescript": "^4.1.3",
"webpack": "^5.14.0",
"webpack-cli": "^4.3.1"
}
}

1
src/app.tsx Normal file
View File

@@ -0,0 +1 @@
// Stub for port of previous extension

19
tsconfig.json Normal file
View File

@@ -0,0 +1,19 @@
{
"compilerOptions": {
"esModuleInterop": true,
"sourceMap": true,
"strict": true,
"noImplicitReturns": true,
"noImplicitAny": true,
"module": "commonjs",
"moduleResolution": "node",
"target": "es5",
"allowSyntheticDefaultImports": true,
"jsx": "react",
"outDir": "lib",
"lib": ["es2015", "es2016", "es2017", "dom"],
"baseUrl": "./",
"paths": {}
},
"exclude": ["**/lib/", "**/*.test.ts"]
}

30
webpack.config.ts Normal file
View File

@@ -0,0 +1,30 @@
import * as path from 'path';
import * as webpack from 'webpack';
export default (): webpack.Configuration[] => {
const cfgs: webpack.Configuration[] = [];
const chromeExtCfg: webpack.Configuration = {
entry: {
app: [path.join(__dirname, 'src', 'app.tsx')],
},
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
use: 'ts-loader',
},
],
},
output: {
filename: '[name].js',
path: path.join(__dirname, 'dist', 'chrome'),
},
plugins: [],
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
};
cfgs.push(chromeExtCfg);
return cfgs;
};

View File

@@ -1,12 +1,19 @@
const { load, exec, concurrent, serial } = require('@xarc/run');
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-var-requires */
const { load, exec, serial } = require('@xarc/run');
load({
build: ['postinstall', exec('gulp'), 'prettier'],
build: [serial('postinstall', exec('gulp'), 'webpack', 'prettier'), 'webpack'],
clean: exec('rimraf public coverage vendor'),
prettier: [exec('prettier --write .')],
lint: ['prettier'],
'clean:webpack': exec('rimraf dist'),
eslint: exec('eslint src . --fix'),
lint: ['prettier', 'eslint'],
postinstall: ['clean', exec('gulp postinstall')],
prettier: [exec('prettier --write .')],
test: ['build', 'lint', 'test-jest', 'test-js'],
'test-jest': [exec('jest --clearCache'), exec('jest --verbose --coverage')],
'test-js': 'phantomjs tests/run.js',
webpack: ['clean:webpack', exec('webpack --mode production')],
'webpack:dev': ['clean:webpack', exec('webpack --mode development')],
});