diff --git a/.eslintrc.js b/.eslintrc.js index b2967de39..a62366c17 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,5 @@ +const { version: reactVersion } = require('react/package.json'); + module.exports = { root: true, parser: '@babel/eslint-parser', @@ -213,7 +215,12 @@ module.exports = { settings: { react: { - version: 'detect', + // If this is set to 'detect', ESLint will import React in order to find + // its version. Because we run ESLint in the build system under LavaMoat, + // this means that detecting the React version requires a LavaMoat policy + // for all of React, in the build system. That's a no-go, so we grab it + // from React's package.json. + version: reactVersion, }, }, }; diff --git a/development/build/index.js b/development/build/index.js index b98fbfdd7..d96f0706f 100755 --- a/development/build/index.js +++ b/development/build/index.js @@ -3,8 +3,10 @@ // // run any task with "yarn build ${taskName}" // +const path = require('path'); const livereload = require('gulp-livereload'); const minimist = require('minimist'); +const { sync: globby } = require('globby'); const { createTask, composeSeries, @@ -18,7 +20,8 @@ const createStaticAssetTasks = require('./static'); const createEtcTasks = require('./etc'); const { BuildType, getBrowserVersionMap } = require('./utils'); -// packages required dynamically via browserify configuration in dependencies +// Packages required dynamically via browserify configuration in dependencies +// Required for LavaMoat policy generation require('loose-envify'); require('@babel/plugin-proposal-object-rest-spread'); require('@babel/plugin-transform-runtime'); @@ -28,6 +31,19 @@ require('@babel/plugin-proposal-nullish-coalescing-operator'); require('@babel/preset-env'); require('@babel/preset-react'); require('@babel/core'); +// ESLint-related +require('@babel/eslint-parser'); +require('@babel/eslint-plugin'); +require('@metamask/eslint-config'); +require('@metamask/eslint-config-nodejs'); +require('eslint'); +require('eslint-config-prettier'); +require('eslint-import-resolver-node'); +require('eslint-plugin-import'); +require('eslint-plugin-node'); +require('eslint-plugin-prettier'); +require('eslint-plugin-react'); +require('eslint-plugin-react-hooks'); defineAndRunBuildTasks(); @@ -45,6 +61,8 @@ function defineAndRunBuildTasks() { const browserVersionMap = getBrowserVersionMap(browserPlatforms); + const ignoredFiles = getIgnoredFiles(buildType); + const staticTasks = createStaticAssetTasks({ livereload, browserPlatforms, @@ -63,6 +81,7 @@ function defineAndRunBuildTasks() { const scriptTasks = createScriptTasks({ browserPlatforms, buildType, + ignoredFiles, isLavaMoat, livereload, shouldLintFenceFiles, @@ -188,3 +207,35 @@ function parseArgv() { skipStats: argv[NamedArgs.SkipStats], }; } + +/** + * Gets the files to be ignored by the current build, if any. + * + * @param {string} buildType - The type of the current build. + * @returns {string[] | null} The array of files to be ignored by the current + * build, or `null` if no files are to be ignored. + */ +function getIgnoredFiles(currentBuildType) { + const excludedFiles = Object.values(BuildType) + // This filter removes "main" and the current build type. The files of any + // build types that remain in the array will be excluded. "main" is the + // default build type, and has no files that are excluded from other builds. + .filter( + (buildType) => + buildType !== BuildType.main && buildType !== currentBuildType, + ) + // Compute globs targeting files for exclusion for each excluded build + // type. + .reduce((excludedGlobs, excludedBuildType) => { + return excludedGlobs.concat([ + `../../app/**/${excludedBuildType}/**`, + `../../shared/**/${excludedBuildType}/**`, + `../../ui/**/${excludedBuildType}/**`, + ]); + }, []) + // This creates absolute paths of the form: + // PATH_TO_REPOSITORY_ROOT/app/**/${excludedBuildType}/** + .map((pathGlob) => path.resolve(__dirname, pathGlob)); + + return globby(excludedFiles); +} diff --git a/development/build/scripts.js b/development/build/scripts.js index bfdac3840..d8a22251e 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -138,6 +138,7 @@ module.exports = createScriptTasks; function createScriptTasks({ browserPlatforms, buildType, + ignoredFiles, isLavaMoat, livereload, shouldLintFenceFiles, @@ -182,8 +183,9 @@ function createScriptTasks({ } return `./app/scripts/${label}.js`; }), - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), ); @@ -253,6 +255,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -266,6 +269,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -279,6 +283,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -296,8 +301,9 @@ function createScriptTasks({ devMode, entryFilepath: `./app/scripts/${inpage}.js`, label: inpage, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), createNormalBundle({ buildType, @@ -306,8 +312,9 @@ function createScriptTasks({ devMode, entryFilepath: `./app/scripts/${contentscript}.js`, label: contentscript, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), ); } @@ -318,8 +325,9 @@ function createFactoredBuild({ buildType, devMode, entryFiles, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }) { return async function () { // create bundler setup and apply defaults @@ -336,6 +344,7 @@ function createFactoredBuild({ buildType, devMode, envVars, + ignoredFiles, minify, reloadOnChange, shouldLintFenceFiles, @@ -480,6 +489,7 @@ function createNormalBundle({ devMode, entryFilepath, extraEntries = [], + ignoredFiles, label, modulesToExpose, shouldLintFenceFiles, @@ -500,6 +510,7 @@ function createNormalBundle({ buildType, devMode, envVars, + ignoredFiles, minify, reloadOnChange, shouldLintFenceFiles, @@ -544,12 +555,20 @@ function createBuildConfiguration() { manualExternal: [], manualIgnore: [], }; - return { label, bundlerOpts, events }; + return { bundlerOpts, events, label }; } function setupBundlerDefaults( buildConfiguration, - { buildType, devMode, envVars, minify, reloadOnChange, shouldLintFenceFiles }, + { + buildType, + devMode, + envVars, + ignoredFiles, + minify, + reloadOnChange, + shouldLintFenceFiles, + }, ) { const { bundlerOpts } = buildConfiguration; @@ -579,6 +598,11 @@ function setupBundlerDefaults( bundlerOpts.transform.push([envify(envVars), { global: true }]); } + // Ensure that any files that should be ignored are excluded from the build + if (ignoredFiles) { + bundlerOpts.manualExclude = ignoredFiles; + } + // Setup reload on change if (reloadOnChange) { setupReloadOnChange(buildConfiguration); @@ -661,11 +685,17 @@ function setupSourcemaps(buildConfiguration, { devMode }) { async function bundleIt(buildConfiguration) { const { label, bundlerOpts, events } = buildConfiguration; const bundler = browserify(bundlerOpts); + // manually apply non-standard options bundler.external(bundlerOpts.manualExternal); bundler.ignore(bundlerOpts.manualIgnore); + if (Array.isArray(bundlerOpts.manualExclude)) { + bundler.exclude(bundlerOpts.manualExclude); + } + // output build logs to terminal bundler.on('log', log); + // forward update event (used by watchify) bundler.on('update', () => performBundle()); diff --git a/development/build/transforms/utils.js b/development/build/transforms/utils.js index c438d5351..171c38eae 100644 --- a/development/build/transforms/utils.js +++ b/development/build/transforms/utils.js @@ -1,6 +1,22 @@ const { ESLint } = require('eslint'); const eslintrc = require('../../../.eslintrc.js'); +// We don't want linting to fail for purely stylistic reasons. +eslintrc.rules['prettier/prettier'] = 'off'; + +// Remove all test-related overrides. We will never lint test files here. +eslintrc.overrides = eslintrc.overrides.filter((override) => { + return !( + (override.extends && + override.extends.find( + (configName) => + configName.includes('jest') || configName.includes('mocha'), + )) || + (override.plugins && + override.plugins.find((pluginName) => pluginName.includes('jest'))) + ); +}); + /** * The singleton ESLint instance. * diff --git a/lavamoat/node/policy-override.json b/lavamoat/node/policy-override.json index 85e84f001..eaa6b9b26 100644 --- a/lavamoat/node/policy-override.json +++ b/lavamoat/node/policy-override.json @@ -1,13 +1,5 @@ { "resources": { - "node-sass": { - "native": true - }, - "module-deps": { - "packages": { - "loose-envify": true - } - }, "@babel/core": { "packages": { "": true, @@ -20,6 +12,34 @@ "@babel/plugin-proposal-nullish-coalescing-operator": true } }, + "@eslint/eslintrc": { + "packages": { + "@babel/eslint-parser": true, + "@babel/eslint-plugin": true, + "@metamask/eslint-config": true, + "@metamask/eslint-config-nodejs": true, + "eslint": true, + "eslint-config-prettier": true, + "eslint-plugin-import": true, + "eslint-plugin-node": true, + "eslint-plugin-prettier": true, + "eslint-plugin-react": true, + "eslint-plugin-react-hooks": true + } + }, + "eslint-module-utils": { + "packages": { + "eslint-import-resolver-node": true + } + }, + "node-sass": { + "native": true + }, + "module-deps": { + "packages": { + "loose-envify": true + } + }, "sass": { "env": "unfrozen", "builtin": { diff --git a/lavamoat/node/policy.json b/lavamoat/node/policy.json index 601d1e488..5526f328d 100644 --- a/lavamoat/node/policy.json +++ b/lavamoat/node/policy.json @@ -41,6 +41,20 @@ "source-map": true } }, + "@babel/eslint-parser": { + "packages": { + "@babel/core": true, + "eslint-scope": true, + "eslint-visitor-keys": true, + "semver": true + } + }, + "@babel/eslint-plugin": { + "packages": { + "eslint": true, + "eslint-rule-composer": true + } + }, "@babel/generator": { "globals": { "console.error": true @@ -815,7 +829,6 @@ "espree": true, "globals": true, "ignore": true, - "import-fresh": true, "js-yaml": true, "minimatch": true, "strip-json-comments": true @@ -1038,6 +1051,15 @@ "make-iterator": true } }, + "array-includes": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "get-intrinsic": true, + "is-string": true + } + }, "array-initial": { "packages": { "array-slice": true, @@ -1054,6 +1076,19 @@ "array-uniq": true } }, + "array.prototype.flat": { + "packages": { + "define-properties": true, + "es-abstract": true + } + }, + "array.prototype.flatmap": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true + } + }, "async-done": { "builtin": { "domain.create": true @@ -1340,6 +1375,12 @@ "process.cwd": true } }, + "call-bind": { + "packages": { + "function-bind": true, + "get-intrinsic": true + } + }, "chalk": { "globals": { "process.env.TERM": true, @@ -1491,6 +1532,11 @@ "typedarray": true } }, + "contains-path": { + "builtin": { + "path.normalize": true + } + }, "convert-source-map": { "builtin": { "fs.readFileSync": true, @@ -1679,7 +1725,8 @@ "assert": true }, "packages": { - "esutils": true + "esutils": true, + "isarray": true } }, "dom-serializer": { @@ -1753,9 +1800,22 @@ "WeakRef": true }, "packages": { + "call-bind": true, + "es-to-primitive": true, "function-bind": true, + "get-intrinsic": true, "has": true, - "has-symbols": true + "has-symbols": true, + "is-callable": true, + "is-regex": true, + "object-inspect": true + } + }, + "es-to-primitive": { + "packages": { + "is-callable": true, + "is-date-object": true, + "is-symbol": true } }, "es5-ext": { @@ -1866,6 +1926,141 @@ "regexpp": true } }, + "eslint-config-prettier": { + "globals": { + "process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED": true + } + }, + "eslint-import-resolver-node": { + "builtin": { + "path.dirname": true, + "path.resolve": true + }, + "packages": { + "debug": true, + "resolve": true + } + }, + "eslint-module-utils": { + "builtin": { + "crypto.createHash": true, + "fs.existsSync": true, + "fs.readdirSync": true, + "module": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true + }, + "globals": { + "__dirname": true, + "console.warn": true, + "process.cwd": true, + "process.hrtime": true + }, + "packages": { + "debug": true, + "pkg-dir": true + } + }, + "eslint-plugin-es": { + "packages": { + "eslint-utils": true, + "regexpp": true + } + }, + "eslint-plugin-import": { + "builtin": { + "fs": true, + "path": true, + "vm": true + }, + "globals": { + "process.cwd": true, + "process.env": true + }, + "packages": { + "array-includes": true, + "array.prototype.flat": true, + "contains-path": true, + "debug": true, + "doctrine": true, + "eslint": true, + "eslint-module-utils": true, + "has": true, + "minimatch": true, + "object.values": true, + "read-pkg-up": true, + "resolve": true, + "tsconfig-paths": true, + "typescript": true + } + }, + "eslint-plugin-node": { + "builtin": { + "fs.readFileSync": true, + "fs.readdirSync": true, + "fs.statSync": true, + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.isAbsolute": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "eslint-plugin-es": true, + "eslint-utils": true, + "ignore": true, + "minimatch": true, + "resolve": true, + "semver": true + } + }, + "eslint-plugin-prettier": { + "packages": { + "prettier": true, + "prettier-linter-helpers": true + } + }, + "eslint-plugin-react": { + "builtin": { + "fs.statSync": true, + "path.dirname": true, + "path.extname": true + }, + "globals": { + "console.error": true, + "console.log": true, + "process.argv.join": true, + "process.cwd": true + }, + "packages": { + "array-includes": true, + "array.prototype.flatmap": true, + "doctrine": true, + "has": true, + "jsx-ast-utils": true, + "minimatch": true, + "object.entries": true, + "object.fromentries": true, + "object.values": true, + "prop-types": true, + "resolve": true, + "string.prototype.matchall": true + } + }, + "eslint-plugin-react-hooks": { + "globals": { + "process.env.NODE_ENV": true + } + }, "eslint-scope": { "builtin": { "assert": true @@ -2064,6 +2259,17 @@ "to-regex-range": true } }, + "find-up": { + "builtin": { + "path.dirname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true + }, + "packages": { + "locate-path": true + } + }, "first-chunk-stream": { "builtin": { "util.inherits": true @@ -2234,6 +2440,18 @@ "assert.equal": true } }, + "get-intrinsic": { + "globals": { + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "function-bind": true, + "has": true, + "has-symbols": true + } + }, "get-stream": { "builtin": { "stream.PassThrough": true @@ -2613,6 +2831,12 @@ "kind-of": true } }, + "hosted-git-info": { + "builtin": { + "url.URL": true, + "url.parse": true + } + }, "htmlparser2": { "builtin": { "buffer.Buffer": true, @@ -2698,6 +2922,13 @@ "xtend": true } }, + "internal-slot": { + "packages": { + "get-intrinsic": true, + "has": true, + "side-channel": true + } + }, "is-absolute": { "packages": { "is-relative": true, @@ -2723,6 +2954,11 @@ "binary-extensions": true } }, + "is-callable": { + "globals": { + "document": true + } + }, "is-core-module": { "globals": { "process.versions": true @@ -2802,11 +3038,22 @@ "isobject": true } }, + "is-regex": { + "packages": { + "call-bind": true, + "has-symbols": true + } + }, "is-relative": { "packages": { "is-unc-path": true } }, + "is-symbol": { + "packages": { + "has-symbols": true + } + }, "is-unc-path": { "packages": { "unc-path-regex": true @@ -2872,6 +3119,14 @@ "Buffer": true } }, + "jsx-ast-utils": { + "globals": { + "console.error": true + }, + "packages": { + "object.assign": true + } + }, "just-debounce": { "globals": { "clearTimeout": true, @@ -2988,6 +3243,29 @@ "type-check": true } }, + "load-json-file": { + "builtin": { + "path.relative": true + }, + "packages": { + "graceful-fs": true, + "parse-json": true, + "pify": true, + "strip-bom": true + } + }, + "locate-path": { + "builtin": { + "path.resolve": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "p-locate": true, + "path-exists": true + } + }, "lodash": { "globals": { "define": true @@ -3285,6 +3563,18 @@ "osenv": true } }, + "normalize-package-data": { + "builtin": { + "url.parse": true, + "util.format": true + }, + "packages": { + "hosted-git-info": true, + "resolve": true, + "semver": true, + "validate-npm-package-license": true + } + }, "normalize-path": { "packages": { "remove-trailing-separator": true @@ -3338,6 +3628,7 @@ }, "object.assign": { "packages": { + "call-bind": true, "define-properties": true, "es-abstract": true, "has-symbols": true, @@ -3352,6 +3643,21 @@ "isobject": true } }, + "object.entries": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has": true + } + }, + "object.fromentries": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true + } + }, "object.omit": { "packages": { "for-own": true, @@ -3369,6 +3675,14 @@ "make-iterator": true } }, + "object.values": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has": true + } + }, "once": { "packages": { "wrappy": true @@ -3430,6 +3744,16 @@ "os-tmpdir": true } }, + "p-limit": { + "packages": { + "p-try": true + } + }, + "p-locate": { + "packages": { + "p-limit": true + } + }, "parent-module": { "packages": { "callsites": true @@ -3479,6 +3803,12 @@ "process.platform": true } }, + "path-exists": { + "builtin": { + "fs.access": true, + "fs.accessSync": true + } + }, "path-is-absolute": { "globals": { "process.platform": true @@ -3519,6 +3849,9 @@ "builtin": { "fs": true, "util.promisify": true + }, + "packages": { + "pify": true } }, "pause-stream": { @@ -3548,6 +3881,14 @@ "pinkie": true } }, + "pkg-dir": { + "builtin": { + "path.dirname": true + }, + "packages": { + "find-up": true + } + }, "plugin-error": { "builtin": { "util.inherits": true @@ -3634,11 +3975,62 @@ "postcss": true } }, + "prettier": { + "builtin": { + "assert": true, + "events": true, + "fs": true, + "module": true, + "os": true, + "path": true, + "stream": true, + "tty": true, + "util": true + }, + "globals": { + "Buffer": true, + "Intl": true, + "PerformanceObserver": true, + "WorkerGlobalScope": true, + "XMLHttpRequest": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, + "__dirname": true, + "__filename": true, + "atob": true, + "btoa": true, + "clearTimeout": true, + "console": true, + "define": true, + "document": true, + "localStorage": true, + "navigator": true, + "performance": true, + "process": true, + "setImmediate": true, + "setTimeout": true + } + }, + "prettier-linter-helpers": { + "packages": { + "fast-diff": true + } + }, "process-nextick-args": { "globals": { "process": true } }, + "prop-types": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + }, + "packages": { + "object-assign": true, + "react-is": true + } + }, "pump": { "builtin": { "fs": true @@ -3709,11 +4101,33 @@ "strip-json-comments": true } }, + "react-is": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + } + }, "read-only-stream": { "packages": { "readable-stream": true } }, + "read-pkg": { + "builtin": { + "path.join": true + }, + "packages": { + "load-json-file": true, + "normalize-package-data": true, + "path-type": true + } + }, + "read-pkg-up": { + "packages": { + "find-up": true, + "read-pkg": true + } + }, "readable-stream": { "builtin": { "buffer.Buffer": true, @@ -3788,6 +4202,12 @@ "safe-regex": true } }, + "regexp.prototype.flags": { + "packages": { + "call-bind": true, + "define-properties": true + } + }, "regexpu-core": { "packages": { "regenerate": true, @@ -4052,6 +4472,13 @@ "shebang-regex": true } }, + "side-channel": { + "packages": { + "call-bind": true, + "get-intrinsic": true, + "object-inspect": true + } + }, "signal-exit": { "builtin": { "assert.equal": true, @@ -4130,6 +4557,22 @@ "urix": true } }, + "source-map-support": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true + }, + "globals": { + "XMLHttpRequest": true, + "console.error": true, + "process": true + }, + "packages": { + "buffer-from": true, + "source-map": true + } + }, "source-map-url": { "globals": { "define": true @@ -4140,6 +4583,22 @@ "define": true } }, + "spdx-correct": { + "packages": { + "spdx-license-ids": true + } + }, + "spdx-expression-parse": { + "builtin": { + "fs.readFileSync": true, + "path.normalize": true + }, + "globals": { + "console.log": true, + "process.argv.slice": true, + "process.exit": true + } + }, "specificity": { "globals": { "define": true @@ -4237,6 +4696,16 @@ "strip-ansi": true } }, + "string.prototype.matchall": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has-symbols": true, + "internal-slot": true, + "regexp.prototype.flags": true + } + }, "string_decoder": { "builtin": { "buffer.Buffer": true @@ -4490,6 +4959,21 @@ "through2": true } }, + "tsconfig-paths": { + "builtin": { + "fs.existsSync": true, + "fs.lstatSync": true, + "fs.readFileSync": true, + "fs.statSync": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "packages": { + "json5": true, + "strip-bom": true + } + }, "type-check": { "packages": { "prelude-ls": true @@ -4503,6 +4987,51 @@ "is-typedarray": true } }, + "typescript": { + "builtin": { + "buffer.Buffer": true, + "crypto": true, + "fs.closeSync": true, + "fs.mkdirSync": true, + "fs.openSync": true, + "fs.readFileSync": true, + "fs.readdirSync": true, + "fs.realpathSync": true, + "fs.statSync": true, + "fs.unlinkSync": true, + "fs.unwatchFile": true, + "fs.utimesSync": true, + "fs.watch": true, + "fs.watchFile": true, + "fs.writeFileSync": true, + "fs.writeSync": true, + "inspector": true, + "os.EOL": true, + "os.platform": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "globals": { + "Intl": true, + "TypeScript": "write", + "__dirname": true, + "__filename": true, + "__magic__": true, + "clearTimeout": true, + "console.log": true, + "gc": true, + "globalThis": "write", + "onProfilerEvent": true, + "performance": true, + "process": true, + "setTimeout": true, + "toolsVersion": "write" + }, + "packages": { + "source-map-support": true + } + }, "undeclared-identifiers": { "packages": { "acorn-node": true, @@ -4620,6 +5149,12 @@ "util.deprecate": true } }, + "validate-npm-package-license": { + "packages": { + "spdx-correct": true, + "spdx-expression-parse": true + } + }, "vfile": { "builtin": { "path.basename": true, diff --git a/package.json b/package.json index e53f4c07e..5553a9651 100644 --- a/package.json +++ b/package.json @@ -264,6 +264,7 @@ "enzyme-adapter-react-16": "^1.15.1", "eslint": "^7.23.0", "eslint-config-prettier": "^8.1.0", + "eslint-import-resolver-node": "^0.3.4", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jest": "^24.3.4", "eslint-plugin-mocha": "^8.1.0", @@ -277,6 +278,7 @@ "ganache-cli": "^6.12.1", "ganache-core": "^2.13.1", "geckodriver": "^1.21.0", + "globby": "^11.0.4", "gulp": "^4.0.2", "gulp-autoprefixer": "^5.0.0", "gulp-dart-sass": "^1.0.2", diff --git a/patches/@eslint+eslintrc+0.4.0.patch b/patches/@eslint+eslintrc+0.4.0.patch new file mode 100644 index 000000000..c469c7c84 --- /dev/null +++ b/patches/@eslint+eslintrc+0.4.0.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/@eslint/eslintrc/lib/config-array-factory.js b/node_modules/@eslint/eslintrc/lib/config-array-factory.js +index c7ff6a0..6a88c6d 100644 +--- a/node_modules/@eslint/eslintrc/lib/config-array-factory.js ++++ b/node_modules/@eslint/eslintrc/lib/config-array-factory.js +@@ -41,7 +41,6 @@ + + const fs = require("fs"); + const path = require("path"); +-const importFresh = require("import-fresh"); + const stripComments = require("strip-json-comments"); + const ConfigValidator = require("./shared/config-validator"); + const naming = require("./shared/naming"); +@@ -222,7 +221,7 @@ function loadLegacyConfigFile(filePath) { + function loadJSConfigFile(filePath) { + debug(`Loading JS config file: ${filePath}`); + try { +- return importFresh(filePath); ++ return require(filePath); + } catch (e) { + debug(`Error reading JavaScript file: ${filePath}`); + e.message = `Cannot read config file: ${filePath}\nError: ${e.message}`; diff --git a/patches/eslint+7.23.0.patch b/patches/eslint+7.23.0.patch new file mode 100644 index 000000000..8582fadc6 --- /dev/null +++ b/patches/eslint+7.23.0.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/eslint/lib/linter/linter.js b/node_modules/eslint/lib/linter/linter.js +index adb5c21..4a4be92 100644 +--- a/node_modules/eslint/lib/linter/linter.js ++++ b/node_modules/eslint/lib/linter/linter.js +@@ -560,7 +560,7 @@ function resolveParserOptions(parserName, providedOptions, enabledEnvironments) + */ + function resolveGlobals(providedGlobals, enabledEnvironments) { + return Object.assign( +- {}, ++ Object.create(null), + ...enabledEnvironments.filter(env => env.globals).map(env => env.globals), + providedGlobals + ); diff --git a/patches/object.values+1.1.1.patch b/patches/object.values+1.1.1.patch new file mode 100644 index 000000000..f0323c184 --- /dev/null +++ b/patches/object.values+1.1.1.patch @@ -0,0 +1,23 @@ +diff --git a/node_modules/object.values/index.js b/node_modules/object.values/index.js +index b8ba091..2dc8083 100644 +--- a/node_modules/object.values/index.js ++++ b/node_modules/object.values/index.js +@@ -1,17 +1,3 @@ + 'use strict'; + +-var define = require('define-properties'); +- +-var implementation = require('./implementation'); +-var getPolyfill = require('./polyfill'); +-var shim = require('./shim'); +- +-var polyfill = getPolyfill(); +- +-define(polyfill, { +- getPolyfill: getPolyfill, +- implementation: implementation, +- shim: shim +-}); +- +-module.exports = polyfill; ++module.exports = Object.values; diff --git a/ui/helpers/utils/build-types.js b/ui/helpers/utils/build-types.js index 759466e66..675e0222b 100644 --- a/ui/helpers/utils/build-types.js +++ b/ui/helpers/utils/build-types.js @@ -1,17 +1,25 @@ +///: BEGIN:ONLY_INCLUDE_IN(beta) import betaJson from '../../../app/build-types/beta/beta-mascot.json'; +///: END:ONLY_INCLUDE_IN +///: BEGIN:ONLY_INCLUDE_IN(flask) import flaskJson from '../../../app/build-types/flask/flask-mascot.json'; +///: END:ONLY_INCLUDE_IN const assetList = { main: { // Will use default provided by the @metamask/logo library foxMeshJson: undefined, }, + ///: BEGIN:ONLY_INCLUDE_IN(beta) beta: { foxMeshJson: betaJson, }, + ///: END:ONLY_INCLUDE_IN + ///: BEGIN:ONLY_INCLUDE_IN(flask) flask: { foxMeshJson: flaskJson, }, + ///: END:ONLY_INCLUDE_IN }; export function isBeta() { @@ -26,8 +34,8 @@ export function getBuildSpecificAsset(assetName) { !assetList[buildType] || !Object.keys(assetList[buildType]).includes(assetName) ) { - console.warn( - `Cannot find asset for build ${buildType}: ${assetName}, returning main build asset`, + console.error( + `Cannot find asset "${assetName}" for build "${buildType}", returning main build asset.`, ); return assetList.main[assetName]; } diff --git a/yarn.lock b/yarn.lock index d2ceaa846..4cd6fd695 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14718,7 +14718,7 @@ globby@11.0.1, globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.2, globby@^11.0.3: +globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==