diff --git a/.eslintrc b/.eslintrc index 03fc411e..486a54e5 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,14 +6,23 @@ "extends": [ "eslint:recommended", "plugin:flowtype/recommended", - "plugin:actions/recommended" + "plugin:actions/recommended", + "plugin:import/recommended" ], "rules": { "arrow-spacing": 2, "brace-style": [2, "1tbs", { "allowSingleLine": true }], // We'd possibly like to remove the 'properties': 'never' one day. "camelcase": [2, { "properties": "never" }], - "comma-dangle": [2, "always-multiline"], + // Require dangling commas for all but function calls + // (a feature added in ECMAScript 2017). + "comma-dangle": [2, { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "only-multiline", + }], "comma-spacing": [2, { "before": false, "after": true }], "constructor-super": 2, "curly": 2, @@ -71,7 +80,12 @@ // Might be nice to turn this on one day, but since we don't // use jsdoc anywhere it seems silly to require it yet. "valid-jsdoc": 0, - "require-jsdoc": 0 + "require-jsdoc": 0, + // We frequently `import` and `import type` from the same module. + "import/no-duplicates": 0, + // We use `import mod from "mod"` a lot. + "import/no-named-as-default": 0, + "import/no-named-as-default-member": 0, }, "env": { "es6": true, @@ -80,6 +94,12 @@ "jest": true }, "settings": { + "import/external-module-folders": [".yarn", "node_modules"], + "import/resolver": { + "webpack": { + "config-index": 0 + } + }, "react": { "version": "16.8" } diff --git a/package.json b/package.json index d0fa0e69..5231acb2 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,10 @@ "css-loader": "^6.0.0", "cssnano": "^5.0.0-rc.1", "eslint": "^8.0.0", + "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-actions": "^2.0.0", "eslint-plugin-flowtype": "^8.0.0", + "eslint-plugin-import": "^2.25.2", "eslint-plugin-react": "^7.20.3", "flow-bin": "^0.135.0", "fs-extra": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 03d68d47..2f87b542 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2423,6 +2423,13 @@ __metadata: languageName: node linkType: hard +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + "@types/keyv@npm:*": version: 3.1.1 resolution: "@types/keyv@npm:3.1.1" @@ -3043,6 +3050,13 @@ __metadata: languageName: node linkType: hard +"array-find@npm:^1.0.0": + version: 1.0.0 + resolution: "array-find@npm:1.0.0" + checksum: 6588ebfd15841296923f7c8c70f9f4cfd0e803c9f66cf53382431e5d5c763f1a866120181ba80aba7ebed73b27c5756fdb2202054e7ef475290239839185544b + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -3077,6 +3091,19 @@ __metadata: languageName: node linkType: hard +"array-includes@npm:^3.1.4": + version: 3.1.4 + resolution: "array-includes@npm:3.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + get-intrinsic: ^1.1.1 + is-string: ^1.0.7 + checksum: 69967c38c52698f84b50a7aed5554aadc89c6ac6399b6d92ad061a5952f8423b4bba054c51d40963f791dfa294d7247cdd7988b6b1f2c5861477031c6386e1c0 + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -3084,6 +3111,17 @@ __metadata: languageName: node linkType: hard +"array.prototype.flat@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.flat@npm:1.2.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + checksum: 9cc6414b111abfc7717e39546e4887b1e5ec74df8f1618d83425deaa95752bf05d475d1d241253b4d88d4a01f8e1bc84845ad5b7cc2047f8db2f614512acd40e + languageName: node + linkType: hard + "array.prototype.flatmap@npm:^1.2.4": version: 1.2.4 resolution: "array.prototype.flatmap@npm:1.2.4" @@ -4519,7 +4557,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9": +"debug@npm:2.6.9, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -4540,7 +4578,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.1, debug@npm:^3.2.6": +"debug@npm:^3.1.1, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -5008,6 +5046,17 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^0.9.1": + version: 0.9.1 + resolution: "enhanced-resolve@npm:0.9.1" + dependencies: + graceful-fs: ^4.1.2 + memory-fs: ^0.2.0 + tapable: ^0.1.8 + checksum: 397106771257d12177a3f07fd86db33b6dd6881a087ef2d43054d82b5e1fb8c1ce9add36f1f0c57e226e5d40e5764c44127f4adeb76bcd7fe0bd0a194c24f98c + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.8.3": version: 5.8.3 resolution: "enhanced-resolve@npm:5.8.3" @@ -5120,6 +5169,34 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": + version: 1.19.1 + resolution: "es-abstract@npm:1.19.1" + dependencies: + call-bind: ^1.0.2 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + get-intrinsic: ^1.1.1 + get-symbol-description: ^1.0.0 + has: ^1.0.3 + has-symbols: ^1.0.2 + internal-slot: ^1.0.3 + is-callable: ^1.2.4 + is-negative-zero: ^2.0.1 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.1 + is-string: ^1.0.7 + is-weakref: ^1.0.1 + object-inspect: ^1.11.0 + object-keys: ^1.1.1 + object.assign: ^4.1.2 + string.prototype.trimend: ^1.0.4 + string.prototype.trimstart: ^1.0.4 + unbox-primitive: ^1.0.1 + checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 + languageName: node + linkType: hard + "es-module-lexer@npm:^0.9.0": version: 0.9.0 resolution: "es-module-lexer@npm:0.9.0" @@ -5192,6 +5269,49 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.6": + version: 0.3.6 + resolution: "eslint-import-resolver-node@npm:0.3.6" + dependencies: + debug: ^3.2.7 + resolve: ^1.20.0 + checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + languageName: node + linkType: hard + +"eslint-import-resolver-webpack@npm:^0.13.2": + version: 0.13.2 + resolution: "eslint-import-resolver-webpack@npm:0.13.2" + dependencies: + array-find: ^1.0.0 + debug: ^3.2.7 + enhanced-resolve: ^0.9.1 + find-root: ^1.1.0 + has: ^1.0.3 + interpret: ^1.4.0 + is-core-module: ^2.7.0 + is-regex: ^1.1.4 + lodash: ^4.17.21 + resolve: ^1.20.0 + semver: ^5.7.1 + peerDependencies: + eslint-plugin-import: ">=1.4.0" + webpack: ">=1.11.0" + checksum: 6c40164747bf894a0e34cbc9626566193471062e8809cef7aa8be74e0346c962d03aa7b8f3579a3d348245269860c1f241eba5379ec04acc89daffa4fb6b5f17 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.7.0": + version: 2.7.1 + resolution: "eslint-module-utils@npm:2.7.1" + dependencies: + debug: ^3.2.7 + find-up: ^2.1.0 + pkg-dir: ^2.0.0 + checksum: c30dfa125aafe65e5f6a30a31c26932106fcf09934a2f47d7f8a393ed9106da7b07416f2337b55c85f9db0175c873ee0827be5429a24ec381b49940f342b9ac3 + languageName: node + linkType: hard + "eslint-plugin-actions@npm:^2.0.0": version: 2.0.0 resolution: "eslint-plugin-actions@npm:2.0.0" @@ -5217,6 +5337,29 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.25.2": + version: 2.25.2 + resolution: "eslint-plugin-import@npm:2.25.2" + dependencies: + array-includes: ^3.1.4 + array.prototype.flat: ^1.2.5 + debug: ^2.6.9 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.6 + eslint-module-utils: ^2.7.0 + has: ^1.0.3 + is-core-module: ^2.7.0 + is-glob: ^4.0.3 + minimatch: ^3.0.4 + object.values: ^1.1.5 + resolve: ^1.20.0 + tsconfig-paths: ^3.11.0 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 4ca36e37faf72fb1ed25361ea8a6abbcc9daa65f3a9ac1dc0a660029000456e8c8b98a87b8cc2316541b13c6e5915df41d2dc4a1d7fe0729d9b72b9a3bd5b909 + languageName: node + linkType: hard + "eslint-plugin-react@npm:^7.20.3": version: 7.26.1 resolution: "eslint-plugin-react@npm:7.26.1" @@ -5701,7 +5844,14 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0": +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + +"find-up@npm:^2.0.0, find-up@npm:^2.1.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" dependencies: @@ -6755,6 +6905,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^1.4.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 + languageName: node + linkType: hard + "interpret@npm:^2.2.0": version: 2.2.0 resolution: "interpret@npm:2.2.0" @@ -6871,6 +7028,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.7.0": + version: 2.8.0 + resolution: "is-core-module@npm:2.8.0" + dependencies: + has: ^1.0.3 + checksum: f8b52714891e1a6c6577fcb8d5e057bab064a7a30954aab6beb5092e311473eb8da57afd334de4981dc32409ffca998412efc3a2edceb9e397cef6098d21dd91 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1": version: 1.0.2 resolution: "is-date-object@npm:1.0.2" @@ -7059,6 +7225,13 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "is-shared-array-buffer@npm:1.0.1" + checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.0 resolution: "is-stream@npm:2.0.0" @@ -7100,6 +7273,15 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.0.1": + version: 1.0.1 + resolution: "is-weakref@npm:1.0.1" + dependencies: + call-bind: ^1.0.0 + checksum: fdafb7b955671dd2f9658ff47c86e4025c0650fc68a3542a40e5a75898a763b1abd6b1e1f9f13207eed49541cdd76af67d73c44989ea358b201b70274cf8f6c1 + languageName: node + linkType: hard + "is-what@npm:^3.7.1": version: 3.12.0 resolution: "is-what@npm:3.12.0" @@ -8038,8 +8220,10 @@ __metadata: css-loader: ^6.0.0 cssnano: ^5.0.0-rc.1 eslint: ^8.0.0 + eslint-import-resolver-webpack: ^0.13.2 eslint-plugin-actions: ^2.0.0 eslint-plugin-flowtype: ^8.0.0 + eslint-plugin-import: ^2.25.2 eslint-plugin-react: ^7.20.3 flow-bin: ^0.135.0 fs-extra: ^10.0.0 @@ -8722,6 +8906,13 @@ __metadata: languageName: node linkType: hard +"memory-fs@npm:^0.2.0": + version: 0.2.0 + resolution: "memory-fs@npm:0.2.0" + checksum: 7a8268eab60ff7214ab25d9248ac0b9c51124193e4999f18a4190e64a997d9a5302704c0e5ba9e2e365acb8ab59c9f49139c9eff9bf6e9c5eca783442437b1d6 + languageName: node + linkType: hard + "meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" @@ -9652,6 +9843,17 @@ __metadata: languageName: node linkType: hard +"object.values@npm:^1.1.5": + version: 1.1.5 + resolution: "object.values@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.1 + checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 + languageName: node + linkType: hard + "obuf@npm:^1.0.0, obuf@npm:^1.1.2": version: 1.1.2 resolution: "obuf@npm:1.1.2" @@ -10157,6 +10359,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-dir@npm:2.0.0" + dependencies: + find-up: ^2.1.0 + checksum: 8c72b712305b51e1108f0ffda5ec1525a8307e54a5855db8fb1dcf77561a5ae98e2ba3b4814c9806a679f76b2f7e5dd98bde18d07e594ddd9fdd25e9cf242ea1 + languageName: node + linkType: hard + "pkg-dir@npm:^3.0.0": version: 3.0.0 resolution: "pkg-dir@npm:3.0.0" @@ -11893,7 +12104,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0, semver@npm:^5.7.1": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -12773,6 +12984,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"tapable@npm:^0.1.8": + version: 0.1.10 + resolution: "tapable@npm:0.1.10" + checksum: fe02f5f4ce696b44c0c2d1176e41427a2fa54c2d59e80a2d16d9c8bab308c2603c3c78327a58b71e5a57abd427ddc54698736201039cc4f3d5d8b9c37b7940bb + languageName: node + linkType: hard + "tapable@npm:^2.1.1, tapable@npm:^2.2.0": version: 2.2.0 resolution: "tapable@npm:2.2.0" @@ -13052,6 +13270,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"tsconfig-paths@npm:^3.11.0": + version: 3.11.0 + resolution: "tsconfig-paths@npm:3.11.0" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.1 + minimist: ^1.2.0 + strip-bom: ^3.0.0 + checksum: e14aaa6883f316d611db41cbb0fc8779b59c66b31d1e045565ad4540c77ccd3d2bb66f7c261b74ff535d3cc6b4a1ce21dc84774bf2a2a603ed6b0fb96f7e0cc7 + languageName: node + linkType: hard + "tslib@npm:^1.9.0": version: 1.13.0 resolution: "tslib@npm:1.13.0"