diff --git a/development/build/config.js b/development/build/config.js index b320b9dee40..a8ae3030089 100644 --- a/development/build/config.js +++ b/development/build/config.js @@ -72,14 +72,12 @@ function fromEnv(declarations) { } function fromBuildsYML(buildType, config) { - const extractDeclarations = (envArray) => - envArray === undefined + const extractDeclarations = (envObject) => + envObject === undefined ? [] : Object.keys(envObject); + const extractDefinitions = (envObject) => + envObject === undefined ? [] - : envArray.map((env) => (typeof env === 'string' ? env : env.key)); - const extractDefinitions = (envArray) => - envArray === undefined - ? [] - : envArray.filter((env) => typeof env !== 'string'); + : Object.entries(envObject).filter(([, value]) => value !== undefined); // eslint-disable-next-line no-param-reassign buildType = buildType ?? config.default; @@ -99,7 +97,7 @@ function fromBuildsYML(buildType, config) { const definitions = new Map(); // 1. root env - extractDefinitions(config.env).forEach(({ key, value }) => + extractDefinitions(config.env).forEach(([key, value]) => definitions.set(key, value), ); // 2. features env @@ -108,9 +106,9 @@ function fromBuildsYML(buildType, config) { .map((key) => config.features[key].env) .map(extractDefinitions) .flat() - .forEach(({ key, value }) => definitions.set(key, value)); + .forEach(([key, value]) => definitions.set(key, value)); // 3. build type env - extractDefinitions(activeBuild.env).forEach(({ key, value }) => + extractDefinitions(activeBuild.env).forEach(([key, value]) => definitions.set(key, value), ); diff --git a/development/lib/build-type.d.ts b/development/lib/build-type.d.ts deleted file mode 100644 index 0e494e5f006..00000000000 --- a/development/lib/build-type.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Infer, Struct } from 'superstruct'; - -// TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31973 -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Unique> = ( - struct: Struct[], Infer>, - eq?: (a: Infer, b: Infer) => boolean, -) => Struct[], Infer>; - -// BEGIN automatically generated types code -export type BuildTypesConfig = Infer; - -export const loadBuildTypesConfig: () => BuildTypesConfig; - -export type BuildType = { - id: number; - features?: string[]; - env?: (string | { [k: string]: unknown })[]; - isPrerelease?: boolean; - buildNameOverride?: string; -}; - -export type BuildConfig = { - buildTypes: Record; - env: (string | Record)[]; - features: Record< - string, - null | { env?: (string | { [k: string]: unknown })[] } - >; -}; - -export const getBuildTypes: () => BuildConfig; -// END automatically generated types code diff --git a/development/lib/build-type.js b/development/lib/build-type.js index 621122921fb..93b15693e31 100644 --- a/development/lib/build-type.js +++ b/development/lib/build-type.js @@ -1,160 +1,274 @@ +// @ts-check + const fs = require('fs'); const { AssertionError } = require('assert'); const path = require('path'); const { - object, - string, - record, - optional, array, - refine, - any, boolean, coerce, + integer, + literal, + never, + nullable, + object, + optional, + record, + refine, + string, union, - number, unknown, validate, - nullable, - never, - literal, -} = require('superstruct'); +} = require('@metamask/superstruct'); const yaml = require('yaml'); -const { uniqWith } = require('lodash'); +const { cloneDeep, merge, uniqWith } = require('lodash'); + +const BUILDS_YML_PATH = path.resolve(__dirname, '../../builds.yml'); + +/** + * @template {unknown} T + * @typedef {import('@metamask/superstruct').Struct} Struct + */ -const BUILDS_YML_PATH = path.resolve('./builds.yml'); +/** + * @template {Struct} T + * @typedef {import('@metamask/superstruct').Infer} Infer + */ + +/** @typedef {import('@metamask/superstruct').StructError} StructError */ /** - * @type {import('superstruct').Infer | null} + * @type {Infer | null} */ -let cachedBuildTypes = null; +let _cachedBuildTypes = null; + +/** + * Given a source array and a set or array of its unique values, returns the elements + * that are duplicated in the source array. + * + * @template {unknown} Element + * @param {Element[]} source + * @param {Set | Element[]} uniqueValues + * @returns {Element[]} + */ +const getDuplicates = (source, uniqueValues) => { + const uniqueValuesCopy = new Set(uniqueValues); + return source.filter((item) => { + if (uniqueValuesCopy.has(item)) { + uniqueValuesCopy.delete(item); + return false; + } + return true; + }); +}; /** * Ensures that the array item contains only elements that are distinct from each other * - * @template {Struct} Element - * @type {import('./build-type').Unique} + * @template {unknown} Element + * @param {Struct} struct + * @param {(a: Element, b: Element) => boolean} [eq] + * @returns {Struct} */ const unique = (struct, eq) => refine(struct, 'unique', (value) => { - if (uniqWith(value, eq).length === value.length) { + const uniqueValues = new Set(uniqWith(value, eq)); + if (uniqueValues.size === value.length) { return true; } - return 'Array contains duplicated values'; + throw new Error( + `Array contains duplicated values: ${JSON.stringify( + getDuplicates(value, uniqueValues), + null, + 2, + )}`, + ); }); -const EnvDefinitionStruct = coerce( - object({ key: string(), value: unknown() }), - refine(record(string(), any()), 'Env variable declaration', (value) => { - if (Object.keys(value).length !== 1) { - return 'Declaration should have only one property, the name'; +const RawEnvDefinitionStruct = refine( + record(string(), unknown()), + 'Env variable declaration', + (value) => { + if (Object.keys(value).length === 1) { + return true; } - return true; - }), - (value) => ({ key: Object.keys(value)[0], value: Object.values(value)[0] }), + throw new Error( + `Env variable declarations may only have a single property. Received: ${JSON.stringify( + value, + null, + 2, + )}`, + ); + }, ); -const EnvArrayStruct = unique( - array(union([string(), EnvDefinitionStruct])), +const RawEnvArrayStruct = unique( + array(union([string(), RawEnvDefinitionStruct])), (a, b) => { - const keyA = typeof a === 'string' ? a : a.key; - const keyB = typeof b === 'string' ? b : b.key; + const keyA = typeof a === 'string' ? a : Object.keys(a)[0]; + const keyB = typeof b === 'string' ? b : Object.keys(b)[0]; return keyA === keyB; }, ); +// The `env` field is parsed into an array of strings or objects with a single key. +// This struct coerces this array into a single object. +/** + * @type {Struct>} EnvObjectStruct + */ +const EnvObjectStruct = coerce( + record(string(), unknown()), + RawEnvArrayStruct, + (value) => + Object.fromEntries( + value.map((item) => { + if (typeof item === 'string') { + return [item, undefined]; + } + return Object.entries(item)[0]; + }), + ), +); + /** * Ensures a number is within a given range * * @param {number} min * @param {number} max */ -const isInRange = (min, max) => { - /** - * - * @param {number} value - * @returns boolean - */ - function check(value) { - return value >= min && value <= max; - } - return refine(number(), 'range', check); +const RangeStruct = (min, max) => { + return refine( + integer(), + 'range', + (value) => + (value >= min && value <= max) || + `Number must be an integer ${min} <= ${max}. Received: ${value}`, + ); }; +/** + * @type {Struct<{ + * id: number, + * extends?: string | undefined, + * features?: string[] | undefined, + * env?: Record | undefined, + * isPrerelease?: boolean | undefined, + * manifestOverrides?: string | false | undefined, + * buildNameOverride?: string | false | undefined, + * }>} BuildTypeStruct + */ const BuildTypeStruct = object({ - id: isInRange(10, 64), + id: RangeStruct(10, 64), + extends: optional(string()), features: optional(unique(array(string()))), - env: optional(EnvArrayStruct), + env: optional(EnvObjectStruct), isPrerelease: optional(boolean()), - manifestOverrides: union([string(), literal(false)]), - buildNameOverride: union([string(), literal(false)]), + manifestOverrides: optional(union([string(), literal(false)])), + buildNameOverride: optional(union([string(), literal(false)])), }); +/** + * @typedef {Infer} BuildType + */ + +/** + * @type {Struct<{ + * src: string, + * dest: string, + * }>} CopyAssetStruct + */ const CopyAssetStruct = object({ src: string(), dest: string() }); + +/** + * @type {Struct<{ + * exclusiveInclude: string, + * }>} ExclusiveIncludeAssetStruct + */ const ExclusiveIncludeAssetStruct = coerce( object({ exclusiveInclude: string() }), string(), (exclusiveInclude) => ({ exclusiveInclude }), ); + +/** + * @type {Struct< + * Infer | Infer + * >} AssetStruct + */ const AssetStruct = union([CopyAssetStruct, ExclusiveIncludeAssetStruct]); +/** + * @type {Struct<{ + * assets?: Infer[] | undefined, + * }>} FeatureStruct + */ const FeatureStruct = object({ - env: optional(EnvArrayStruct), // TODO(ritave): Check if the paths exist assets: optional(array(AssetStruct)), }); -const FeaturesStruct = refine( - record( - string(), - coerce(FeatureStruct, nullable(never()), () => ({})), - ), - 'feature definitions', - function* (value) { - let isValid = true; - - const definitions = new Set(); - - for (const feature of Object.values(value)) { - for (const env of feature?.env ?? []) { - if (typeof env !== 'string') { - if (definitions.has(env.key)) { - isValid = false; - yield `Multiple defined features have a definition of "${env}" env variable, resulting in a conflict`; - } - definitions.add(env.key); - } - } - } - return isValid; - }, +/** + * @type {Struct>>} FeaturesStruct + */ +const FeaturesStruct = record( + string(), + coerce(FeatureStruct, nullable(never()), () => ({})), ); +/** + * @type {Struct<{ + * default: string, + * buildTypes: Record, + * features: Infer, + * env: Infer, + * }>} BuildTypesStruct + */ const BuildTypesStruct = refine( object({ default: string(), buildTypes: record(string(), BuildTypeStruct), features: FeaturesStruct, - env: EnvArrayStruct, + env: EnvObjectStruct, }), 'BuildTypes', (value) => { - if (!Object.keys(value.buildTypes).includes(value.default)) { + if (!Object.hasOwn(value.buildTypes, value.default)) { return `Default build type "${value.default}" does not exist in builds declarations`; } + + const buildTypeIds = Object.values(value.buildTypes).map( + (buildType) => buildType.id, + ); + const uniqueBuildTypeIds = new Set(buildTypeIds); + if (uniqueBuildTypeIds.size !== buildTypeIds.length) { + return `Build type ids must be unique. Duplicate ids: ${JSON.stringify( + getDuplicates(buildTypeIds, uniqueBuildTypeIds), + null, + 2, + )}`; + } return true; }, ); /** - * Loads definitions of build type and what they are composed of. + * @typedef {Infer} BuildTypesConfig + */ + +/** + * Loads and parses the `builds.yml` file, which contains the definitions of + * our build types. * - * @returns {import('superstruct').Infer} + * @param {BuildTypesConfig | null} cachedBuildTypes - The cached build types, if any. + * @returns {BuildTypesConfig} The parsed builds configuration. */ -function loadBuildTypesConfig() { +module.exports.loadBuildTypesConfig = function loadBuildTypesConfig( + cachedBuildTypes = _cachedBuildTypes, +) { if (cachedBuildTypes !== null) { return cachedBuildTypes; } + const buildsData = yaml.parse(fs.readFileSync(BUILDS_YML_PATH, 'utf8')); const [err, result] = validate(buildsData, BuildTypesStruct, { coerce: true, @@ -164,14 +278,35 @@ function loadBuildTypesConfig() { message: constructFailureMessage(err), }); } - cachedBuildTypes = result; - return cachedBuildTypes; + + applyBuildTypeExtensions(result); + _cachedBuildTypes = result; + return _cachedBuildTypes; +}; + +/** + * Extends any extended build types with their parent build types. This is accomplished + * by merging the extending build type into a copy of its parent build type. + * + * @param {BuildTypesConfig} buildsConfig + */ +function applyBuildTypeExtensions({ buildTypes }) { + for (const [buildType, config] of Object.entries(buildTypes)) { + if (config.extends !== undefined) { + const parentConfig = buildTypes[config.extends]; + if (!parentConfig) { + throw new Error(`Extended build type "${config.extends}" not found`); + } + + buildTypes[buildType] = merge(cloneDeep(parentConfig), config); + } + } } /** * Creates a user readable error message about parse failure. * - * @param {import('superstruct').StructError} structError + * @param {StructError} structError * @returns {string} */ function constructFailureMessage(structError) { @@ -185,5 +320,3 @@ function constructFailureMessage(structError) { .join('\n -> ')} `; } - -module.exports = { loadBuildTypesConfig }; diff --git a/development/lib/build-type.test.ts b/development/lib/build-type.test.ts new file mode 100644 index 00000000000..1d99f42a65f --- /dev/null +++ b/development/lib/build-type.test.ts @@ -0,0 +1,151 @@ +import path from 'path'; +import { cloneDeep } from 'lodash'; +import { parse as yamlParse } from 'yaml'; +import { loadBuildTypesConfig } from './build-type'; + +jest.mock('fs', () => ({ + readFileSync: jest.fn(), +})); + +jest.mock('yaml', () => ({ + parse: jest.fn(), +})); + +const yamlParseMock = jest.mocked(yamlParse); + +const makeBuildsYml = (() => { + const { readFileSync } = jest.requireActual('fs'); + const { parse } = jest.requireActual('yaml'); + const buildsYml = parse( + readFileSync(path.resolve(__dirname, '../../builds.yml'), 'utf8'), + ); + + return () => cloneDeep(buildsYml); +})(); + +describe('loadBuildTypesConfig', () => { + beforeEach(() => { + yamlParseMock.mockReset(); + }); + + it('should load the build types config', () => { + yamlParseMock.mockReturnValueOnce(makeBuildsYml()); + const buildTypes = loadBuildTypesConfig(); + expect(buildTypes).toStrictEqual({ + default: 'main', + buildTypes: expect.any(Object), + features: expect.any(Object), + env: expect.any(Object), + }); + }); + + it('should cache the loaded build types config by default', () => { + yamlParseMock.mockImplementation(() => { + throw new Error('Should not be called'); + }); + const buildTypes1 = loadBuildTypesConfig(); + const buildTypes2 = loadBuildTypesConfig(); + expect(buildTypes1).toBe(buildTypes2); + }); + + it('should apply build type extensions', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.buildTypes.foo = { + id: 63, + extends: 'main', + }; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + const buildTypes = loadBuildTypesConfig(null); + expect(buildTypes.buildTypes.foo).toStrictEqual({ + ...buildTypes.buildTypes.main, + id: 63, + extends: 'main', + }); + }); + + it('should throw if build type id is out of range', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.buildTypes.main.id = 99; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Number must be an integer 10 <= 64. Received: 99`, + ); + }); + + it('should throw if build type id is not an integer', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.buildTypes.main.id = 10.5; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Expected an integer, but received: 10.5`, + ); + }); + + it('should throw if build type ids are not unique', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.buildTypes.main.id = 64; + nextBuildsYml.buildTypes.flask.id = 64; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Build type ids must be unique. Duplicate ids: ${JSON.stringify( + [64], + null, + 2, + )}`, + ); + }); + + it('should throw if extended build type does not exist', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.buildTypes.main.extends = 'foo'; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Extended build type "foo" not found`, + ); + }); + + it('should throw on duplicate env variables', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.env.push('foo'); + nextBuildsYml.env.push('foo'); + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Array contains duplicated values: ${JSON.stringify(['foo'], null, 2)}`, + ); + }); + + it('should throw on malformed env variable object', () => { + const nextBuildsYml = makeBuildsYml(); + nextBuildsYml.env.push({ + foo: 'bar', + baz: 'qux', + }); + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + `Env variable declarations may only have a single property. Received: ${JSON.stringify( + { + foo: 'bar', + baz: 'qux', + }, + null, + 2, + )}`, + ); + }); + + it('should throw if default build type is not defined', () => { + const nextBuildsYml = makeBuildsYml(); + delete nextBuildsYml.buildTypes.main; + yamlParseMock.mockReturnValueOnce(nextBuildsYml); + + expect(() => loadBuildTypesConfig(null)).toThrow( + 'Default build type "main" does not exist in builds declarations', + ); + }); +}); diff --git a/development/webpack/test/cli.test.ts b/development/webpack/test/cli.test.ts index 7f9d5f2fea5..2418decdbef 100644 --- a/development/webpack/test/cli.test.ts +++ b/development/webpack/test/cli.test.ts @@ -1,7 +1,7 @@ import { describe, it } from 'node:test'; import assert from 'node:assert'; +import { loadBuildTypesConfig } from '../../lib/build-type'; import { getDryRunMessage, parseArgv } from '../utils/cli'; -import { getBuildTypes } from '../utils/config'; import { Browsers } from '../utils/helpers'; describe('./utils/cli.ts', () => { @@ -27,7 +27,7 @@ describe('./utils/cli.ts', () => { }; it('should return defaults', () => { - const { args, cacheKey, features } = parseArgv([], getBuildTypes()); + const { args, cacheKey, features } = parseArgv([], loadBuildTypesConfig()); assert.deepStrictEqual(args, defaultArgs); assert.strictEqual( typeof cacheKey, @@ -42,7 +42,7 @@ describe('./utils/cli.ts', () => { }); it('getDryRunMessage', () => { - const { args, features } = parseArgv([], getBuildTypes()); + const { args, features } = parseArgv([], loadBuildTypesConfig()); const message = getDryRunMessage(args, features); // testing the exact message could be nice, but verbose and maybe a bit // brittle, so we just check that it returns a string @@ -55,7 +55,7 @@ describe('./utils/cli.ts', () => { }); it('should allow for build types with no features', () => { - const buildTypesConfig = getBuildTypes(); + const buildTypesConfig = loadBuildTypesConfig(); delete buildTypesConfig.buildTypes.main.features; const { features } = parseArgv([], buildTypesConfig); assert.strictEqual( @@ -66,7 +66,7 @@ describe('./utils/cli.ts', () => { }); it('should allow for a build type with no features section', () => { - const buildTypesConfig = getBuildTypes(); + const buildTypesConfig = loadBuildTypesConfig(); delete buildTypesConfig.buildTypes.main.features; const { features } = parseArgv([], buildTypesConfig); assert.strictEqual( @@ -77,7 +77,7 @@ describe('./utils/cli.ts', () => { }); it('should return all browsers when `--browser all` is specified', () => { - const { args } = parseArgv(['--browser', 'all'], getBuildTypes()); + const { args } = parseArgv(['--browser', 'all'], loadBuildTypesConfig()); assert.deepStrictEqual(args.browser, Browsers); }); }); diff --git a/development/webpack/test/config.test.ts b/development/webpack/test/config.test.ts index c19e4871fbb..a206d401f48 100644 --- a/development/webpack/test/config.test.ts +++ b/development/webpack/test/config.test.ts @@ -2,9 +2,10 @@ import fs from 'node:fs'; import { describe, it, after, mock } from 'node:test'; import assert from 'node:assert'; import { resolve } from 'node:path'; +import { version } from '../../../package.json'; +import { loadBuildTypesConfig } from '../../lib/build-type'; import * as config from '../utils/config'; import { parseArgv } from '../utils/cli'; -import { version } from '../../../package.json'; describe('./utils/config.ts', () => { // variables logic is complex, and is "owned" mostly by the other build @@ -29,7 +30,7 @@ ${Object.entries(env) after(() => mock.restoreAll()); it('should return valid build variables for the default build', () => { - const buildTypes = config.getBuildTypes(); + const buildTypes = loadBuildTypesConfig(); const { args } = parseArgv([], buildTypes); const { variables, safeVariables } = config.getVariables( args, @@ -49,7 +50,7 @@ ${Object.entries(env) }); it('should prefer .metamaskrc variables over others', () => { - const buildTypes = config.getBuildTypes(); + const buildTypes = loadBuildTypesConfig(); const { args } = parseArgv([], buildTypes); const defaultVars = config.getVariables(args, buildTypes); @@ -71,7 +72,7 @@ ${Object.entries(env) // required by the `beta` build type SEGMENT_BETA_WRITE_KEY: '.', }); - const buildTypes = config.getBuildTypes(); + const buildTypes = loadBuildTypesConfig(); const { args } = parseArgv( ['--type', 'beta', '--test', '--env', 'production'], buildTypes, @@ -87,7 +88,7 @@ ${Object.entries(env) }); it("should handle true/false/null/'' in rc", () => { - const buildTypes = config.getBuildTypes(); + const buildTypes = loadBuildTypesConfig(); const { args } = parseArgv([], buildTypes); mockRc({ diff --git a/development/webpack/utils/cli.ts b/development/webpack/utils/cli.ts index 7cae8a9f828..c7cd1dc4c72 100644 --- a/development/webpack/utils/cli.ts +++ b/development/webpack/utils/cli.ts @@ -7,6 +7,7 @@ import type { Options as YargsOptions } from 'yargs'; import yargs from 'yargs/yargs'; import parser from 'yargs-parser'; +import type { BuildTypesConfig } from '../../lib/build-type'; import { Browsers, type Manifest, @@ -14,7 +15,6 @@ import { uniqueSort, toOrange, } from './helpers'; -import { type BuildConfig } from './config'; const ENV_PREFIX = 'BUNDLE'; const addFeat = 'addFeature' as const; @@ -91,7 +91,7 @@ export type Features = ReturnType['features']; */ export function parseArgv( argv: string[], - { buildTypes, features }: BuildConfig, + { buildTypes, features }: BuildTypesConfig, ) { const allBuildTypeNames = Object.keys(buildTypes); const allFeatureNames = Object.keys(features); diff --git a/development/webpack/utils/config.ts b/development/webpack/utils/config.ts index 2f969bda607..c9f15c4c358 100644 --- a/development/webpack/utils/config.ts +++ b/development/webpack/utils/config.ts @@ -1,14 +1,12 @@ import { join } from 'node:path'; import { readFileSync } from 'node:fs'; -import { parse as parseYaml } from 'yaml'; import { parse } from 'dotenv'; import { setEnvironmentVariables } from '../../build/set-environment-variables'; import type { Variables } from '../../lib/variables'; +import type { BuildTypesConfig, BuildType } from '../../lib/build-type'; import { type Args } from './cli'; import { getExtensionVersion } from './version'; -const BUILDS_YML_PATH = join(__dirname, '../../../builds.yml'); - /** * Coerce `"true"`, `"false"`, and `"null"` to their respective JavaScript * values. Coerce the empty string (`""`) to `undefined`; @@ -92,7 +90,7 @@ export function getBuildName( */ export function getVariables( { type, env, ...args }: Args, - buildConfig: BuildConfig, + buildConfig: BuildTypesConfig, ) { const activeBuild = buildConfig.buildTypes[type]; const variables = loadConfigVars(activeBuild, buildConfig); @@ -158,30 +156,6 @@ export function getVariables( return { variables, safeVariables, version }; } -export type BuildType = { - id: number; - features?: string[]; - env?: (string | { [k: string]: unknown })[]; - isPrerelease?: boolean; - buildNameOverride?: string; -}; - -export type BuildConfig = { - buildTypes: Record; - env: (string | Record)[]; - features: Record< - string, - null | { env?: (string | { [k: string]: unknown })[] } - >; -}; - -/** - * - */ -export function getBuildTypes(): BuildConfig { - return parseYaml(readFileSync(BUILDS_YML_PATH, 'utf8')); -} - /** * Loads configuration variables from process.env, .metamaskrc, and build.yml. * @@ -196,26 +170,22 @@ export function getBuildTypes(): BuildConfig { * @param activeBuild * @param build * @param build.env - * @param build.features * @returns */ function loadConfigVars( activeBuild: Pick, - { env, features }: BuildConfig, + { env }: BuildTypesConfig, ) { const definitions = loadEnv(); addRc(definitions, join(__dirname, '../../../.metamaskrc')); addVars(activeBuild.env); - activeBuild.features?.forEach((feature) => addVars(features[feature]?.env)); addVars(env); - function addVars(pairs?: (string | Record)[]): void { - pairs?.forEach((pair) => { - if (typeof pair === 'string') return; - Object.entries(pair).forEach(([key, value]) => { - if (definitions.has(key)) return; - definitions.set(key, value); - }); + function addVars(pairs: Record = {}): void { + Object.entries(pairs).forEach(([key, value]) => { + if (value === undefined) return; + if (definitions.has(key)) return; + definitions.set(key, value); }); } diff --git a/development/webpack/utils/version.ts b/development/webpack/utils/version.ts index ea9cbe7b6e2..3f555c16729 100644 --- a/development/webpack/utils/version.ts +++ b/development/webpack/utils/version.ts @@ -1,4 +1,4 @@ -import type { BuildType } from './config'; +import type { BuildType } from '../../lib/build-type'; /** * Computes the version number for use in the extension manifest. Uses the diff --git a/development/webpack/webpack.config.ts b/development/webpack/webpack.config.ts index 6063a75196d..e7b02bec271 100644 --- a/development/webpack/webpack.config.ts +++ b/development/webpack/webpack.config.ts @@ -19,6 +19,7 @@ import rtlCss from 'postcss-rtlcss'; import autoprefixer from 'autoprefixer'; import discardFonts from 'postcss-discard-font-face'; import type ReactRefreshPluginType from '@pmmmwh/react-refresh-webpack-plugin'; +import { loadBuildTypesConfig } from '../lib/build-type'; import { SelfInjectPlugin } from './utils/plugins/SelfInjectPlugin'; import { type Manifest, @@ -31,11 +32,11 @@ import { transformManifest } from './utils/plugins/ManifestPlugin/helpers'; import { parseArgv, getDryRunMessage } from './utils/cli'; import { getCodeFenceLoader } from './utils/loaders/codeFenceLoader'; import { getSwcLoader } from './utils/loaders/swcLoader'; -import { getBuildTypes, getVariables } from './utils/config'; +import { getVariables } from './utils/config'; import { ManifestPlugin } from './utils/plugins/ManifestPlugin'; import { getLatestCommit } from './utils/git'; -const buildTypes = getBuildTypes(); +const buildTypes = loadBuildTypesConfig(); const { args, cacheKey, features } = parseArgv(argv.slice(2), buildTypes); if (args.dryRun) { console.error(getDryRunMessage(args, features)); diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index ea07c25b7f9..2aa36309df5 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -972,61 +972,61 @@ }, "@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/abi-utils>@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-ledger-bridge-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-snap-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-trezor-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -1153,7 +1153,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/bridge-controller>@metamask/multichain-network-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>bignumber.js": true, "lodash": true, @@ -1171,7 +1171,7 @@ "@metamask/controller-utils": true, "@metamask/keyring-api": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "@metamask/bridge-status-controller>bignumber.js": true, @@ -1314,7 +1314,7 @@ "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1330,7 +1330,7 @@ "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1513,7 +1513,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-snap-client": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "webpack>events": true, "@metamask/eth-snap-keyring>uuid": true @@ -1664,7 +1664,7 @@ "@metamask/keyring-api": { "packages": { "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/keyring-api>bech32": true } @@ -1696,7 +1696,7 @@ "packages": { "@metamask/keyring-api": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/keyring-snap-client>uuid": true } }, @@ -1705,7 +1705,7 @@ "URL": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "bitcoin-address-validation": true } @@ -1766,7 +1766,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/multichain-network-controller>@solana/addresses": true } @@ -1779,7 +1779,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>@metamask/multichain-network-controller>@solana/addresses": true, "lodash": true @@ -2173,7 +2173,7 @@ }, "@metamask/snaps-utils>@metamask/snaps-registry": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "viem>ox>@noble/curves": true, "@noble/hashes": true @@ -2186,7 +2186,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "luxon": true @@ -2199,7 +2199,7 @@ }, "packages": { "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -2223,7 +2223,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2259,7 +2259,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2317,7 +2317,7 @@ "@metamask/gas-fee-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "bn.js": true, @@ -2332,7 +2332,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2347,7 +2347,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2362,7 +2362,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2377,7 +2377,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/eth-sig-util>@metamask/utils>@scure/base": true, "browserify>buffer": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index ea07c25b7f9..2aa36309df5 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -972,61 +972,61 @@ }, "@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/abi-utils>@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-ledger-bridge-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-snap-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-trezor-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -1153,7 +1153,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/bridge-controller>@metamask/multichain-network-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>bignumber.js": true, "lodash": true, @@ -1171,7 +1171,7 @@ "@metamask/controller-utils": true, "@metamask/keyring-api": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "@metamask/bridge-status-controller>bignumber.js": true, @@ -1314,7 +1314,7 @@ "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1330,7 +1330,7 @@ "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1513,7 +1513,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-snap-client": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "webpack>events": true, "@metamask/eth-snap-keyring>uuid": true @@ -1664,7 +1664,7 @@ "@metamask/keyring-api": { "packages": { "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/keyring-api>bech32": true } @@ -1696,7 +1696,7 @@ "packages": { "@metamask/keyring-api": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/keyring-snap-client>uuid": true } }, @@ -1705,7 +1705,7 @@ "URL": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "bitcoin-address-validation": true } @@ -1766,7 +1766,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/multichain-network-controller>@solana/addresses": true } @@ -1779,7 +1779,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>@metamask/multichain-network-controller>@solana/addresses": true, "lodash": true @@ -2173,7 +2173,7 @@ }, "@metamask/snaps-utils>@metamask/snaps-registry": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "viem>ox>@noble/curves": true, "@noble/hashes": true @@ -2186,7 +2186,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "luxon": true @@ -2199,7 +2199,7 @@ }, "packages": { "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -2223,7 +2223,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2259,7 +2259,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2317,7 +2317,7 @@ "@metamask/gas-fee-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "bn.js": true, @@ -2332,7 +2332,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2347,7 +2347,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2362,7 +2362,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2377,7 +2377,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/eth-sig-util>@metamask/utils>@scure/base": true, "browserify>buffer": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index ea07c25b7f9..2aa36309df5 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -972,61 +972,61 @@ }, "@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/abi-utils>@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-ledger-bridge-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-snap-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-trezor-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -1153,7 +1153,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/bridge-controller>@metamask/multichain-network-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>bignumber.js": true, "lodash": true, @@ -1171,7 +1171,7 @@ "@metamask/controller-utils": true, "@metamask/keyring-api": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "@metamask/bridge-status-controller>bignumber.js": true, @@ -1314,7 +1314,7 @@ "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1330,7 +1330,7 @@ "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1513,7 +1513,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-snap-client": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "webpack>events": true, "@metamask/eth-snap-keyring>uuid": true @@ -1664,7 +1664,7 @@ "@metamask/keyring-api": { "packages": { "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/keyring-api>bech32": true } @@ -1696,7 +1696,7 @@ "packages": { "@metamask/keyring-api": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/keyring-snap-client>uuid": true } }, @@ -1705,7 +1705,7 @@ "URL": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "bitcoin-address-validation": true } @@ -1766,7 +1766,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/multichain-network-controller>@solana/addresses": true } @@ -1779,7 +1779,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>@metamask/multichain-network-controller>@solana/addresses": true, "lodash": true @@ -2173,7 +2173,7 @@ }, "@metamask/snaps-utils>@metamask/snaps-registry": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "viem>ox>@noble/curves": true, "@noble/hashes": true @@ -2186,7 +2186,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "luxon": true @@ -2199,7 +2199,7 @@ }, "packages": { "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -2223,7 +2223,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2259,7 +2259,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2317,7 +2317,7 @@ "@metamask/gas-fee-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "bn.js": true, @@ -2332,7 +2332,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2347,7 +2347,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2362,7 +2362,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2377,7 +2377,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/eth-sig-util>@metamask/utils>@scure/base": true, "browserify>buffer": true, diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index e40847e651b..8ed9e99b11b 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -1103,61 +1103,61 @@ }, "@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/abi-utils>@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-ledger-bridge-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-snap-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/eth-trezor-keyring>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/abi-utils": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -1284,7 +1284,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/bridge-controller>@metamask/multichain-network-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>bignumber.js": true, "lodash": true, @@ -1302,7 +1302,7 @@ "@metamask/controller-utils": true, "@metamask/keyring-api": true, "@metamask/bridge-controller>@metamask/polling-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "@metamask/bridge-status-controller>bignumber.js": true, @@ -1445,7 +1445,7 @@ "@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1461,7 +1461,7 @@ "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/eth-sig-util": true, "@metamask/json-rpc-engine": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true @@ -1644,7 +1644,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-snap-client": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "webpack>events": true, "@metamask/eth-snap-keyring>uuid": true @@ -1795,7 +1795,7 @@ "@metamask/keyring-api": { "packages": { "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/keyring-api>bech32": true } @@ -1827,7 +1827,7 @@ "packages": { "@metamask/keyring-api": true, "@metamask/keyring-api>@metamask/keyring-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/keyring-snap-client>uuid": true } }, @@ -1836,7 +1836,7 @@ "URL": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "bitcoin-address-validation": true } @@ -1897,7 +1897,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/multichain-network-controller>@solana/addresses": true } @@ -1910,7 +1910,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/network-controller": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@metamask/bridge-controller>@metamask/multichain-network-controller>@solana/addresses": true, "lodash": true @@ -2304,7 +2304,7 @@ }, "@metamask/snaps-utils>@metamask/snaps-registry": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "viem>ox>@noble/curves": true, "@noble/hashes": true @@ -2317,7 +2317,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "luxon": true @@ -2330,7 +2330,7 @@ }, "packages": { "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true } }, @@ -2354,7 +2354,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2390,7 +2390,7 @@ "@metamask/rpc-errors": true, "@metamask/snaps-utils>@metamask/slip44": true, "@metamask/snaps-sdk": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/utils": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, @@ -2448,7 +2448,7 @@ "@metamask/gas-fee-controller": true, "@metamask/bridge-controller>@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@metamask/transaction-controller": true, "@metamask/utils": true, "bn.js": true, @@ -2463,7 +2463,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2478,7 +2478,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2493,7 +2493,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "browserify>buffer": true, @@ -2508,7 +2508,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/eth-sig-util>@metamask/utils>@scure/base": true, "browserify>buffer": true, diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 313490670c6..0f1f37de628 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -1019,7 +1019,7 @@ "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@metamask/superstruct": true, "@noble/hashes": true, "@metamask/utils>@scure/base": true, "nock>debug": true, @@ -8252,12 +8252,6 @@ "stylelint>sugarss>postcss": true } }, - "superstruct": { - "globals": { - "console.warn": true, - "define": true - } - }, "chalk>supports-color": { "builtin": { "os.release": true, diff --git a/package.json b/package.json index ef157e26f36..7cf83df82f7 100644 --- a/package.json +++ b/package.json @@ -457,6 +457,7 @@ "@metamask/forwarder": "^1.1.0", "@metamask/phishing-warning": "^4.1.0", "@metamask/preferences-controller": "^17.0.0", + "@metamask/superstruct": "^3.2.1", "@metamask/test-bundler": "^1.0.0", "@metamask/test-dapp": "9.3.0", "@metamask/test-dapp-multichain": "^0.10.0", @@ -661,7 +662,6 @@ "string.prototype.matchall": "^4.0.2", "style-loader": "^0.21.0", "stylelint": "^13.6.1", - "superstruct": "^1.0.3", "tar": "^7.4.3", "terser": "^5.7.0", "terser-webpack-plugin": "^5.3.10", diff --git a/yarn.lock b/yarn.lock index cec18abee5f..0b330a50f51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30074,6 +30074,7 @@ __metadata: "@metamask/snaps-utils": "npm:^9.3.0" "@metamask/solana-wallet-snap": "npm:^1.29.0" "@metamask/solana-wallet-standard": "npm:^0.4.1" + "@metamask/superstruct": "npm:^3.2.1" "@metamask/test-bundler": "npm:^1.0.0" "@metamask/test-dapp": "npm:9.3.0" "@metamask/test-dapp-multichain": "npm:^0.10.0" @@ -30362,7 +30363,6 @@ __metadata: string.prototype.matchall: "npm:^4.0.2" style-loader: "npm:^0.21.0" stylelint: "npm:^13.6.1" - superstruct: "npm:^1.0.3" tar: "npm:^7.4.3" terser: "npm:^5.7.0" terser-webpack-plugin: "npm:^5.3.10" @@ -38761,13 +38761,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^1.0.3": - version: 1.0.3 - resolution: "superstruct@npm:1.0.3" - checksum: 10/632b6171ac136b6750e62a55f806cc949b3dbf2b4a7dc70cc85f54adcdf19d21eab9711f04e8a643b7dd622bbd8658366ead924f467adaccb2c8005c133b7976 - languageName: node - linkType: hard - "superstruct@npm:^2.0.2": version: 2.0.2 resolution: "superstruct@npm:2.0.2"