From 04f393f3203286b7bfc5316915be7f8135959709 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Wed, 31 Jan 2024 12:02:32 -0700 Subject: [PATCH 1/7] Relax peer dependency constraints When we release a new version of a controller, our Yarn constraints enforce that we must also bump any peer dependencies that rely on that controller to match the new version. And one of our policies is that if we bump a peer dependency in a package, we must release a new major version of that package. As a result, because we make changes to controllers all the time, we also end up making major releases all the time too. This is unnecessary if most of those changes aren't actually breaking. To reduce the number of major releases, this commit relaxes constraints such that a peer dependency on a controller is only required to match the major version of its corresponding non-peer dependency (which is itself required to match the current version of the controller). For instance, if the current version of `@metamask/keyring-controller` is 12.2.0, this commit would allow a peer dependency on that controller to merely be `^12.0.0`. --- constraints.pro | 75 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/constraints.pro b/constraints.pro index 1868562675..f6e6197b26 100644 --- a/constraints.pro +++ b/constraints.pro @@ -63,7 +63,7 @@ parse_version_range(VersionRange, Modifier, Major, Minor, Patch) :- % considered as less than the second. % % Borrowed from: -npm_version_range_out_of_sync(VersionRange1, VersionRange2) :- +is_version_range_greater(VersionRange1, VersionRange2) :- parse_version_range(VersionRange1, VersionRange1Modifier, VersionRange1Major, VersionRange1Minor, VersionRange1Patch), parse_version_range(VersionRange2, VersionRange2Modifier, VersionRange2Major, VersionRange2Minor, VersionRange2Patch), VersionRange1Modifier == VersionRange2Modifier, @@ -117,7 +117,7 @@ repo_name(RepoUrl, RepoName) :- RepoNameLength is End - Start, sub_atom(RepoUrl, PrefixLength, RepoNameLength, SuffixLength, RepoName). -% True if DependencyIdent starts with '@metamask' and ends with '-controller' +% True if DependencyIdent starts with '@metamask' and ends with '-controller'. is_controller(DependencyIdent) :- Prefix = '@metamask/', atom_length(Prefix, PrefixLength), @@ -308,43 +308,66 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, 'a range optionally start workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), \+ is_valid_version_range(DependencyRange). -% All references to a workspace package must be up to date with the current -% version of that package. -gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectDependencyRange, DependencyType) :- - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), - workspace_ident(OtherWorkspaceCwd, DependencyIdent), - workspace_version(OtherWorkspaceCwd, OtherWorkspaceVersion), - atomic_list_concat(['^', OtherWorkspaceVersion], CorrectDependencyRange). - -% All dependency ranges for a package must be synchronized across the monorepo -% (the least version range wins), regardless of which "*dependencies" field -% where the package appears. +% All version ranges used to reference one workspace package in another +% workspace package's `dependencies`, `devDependencies`, or `peerDependencies` +% must be the same. Among all references to the same dependency across the +% monorepo, the one with the smallest version range will win. gen_enforced_dependency(WorkspaceCwd, DependencyIdent, OtherDependencyRange, DependencyType) :- workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), workspace_has_dependency(OtherWorkspaceCwd, DependencyIdent, OtherDependencyRange, OtherDependencyType), WorkspaceCwd \= OtherWorkspaceCwd, DependencyRange \= OtherDependencyRange, - npm_version_range_out_of_sync(DependencyRange, OtherDependencyRange). - -% If a dependency is listed under "dependencies", it should not be listed under -% "devDependencies". We match on the same dependency range so that if a -% dependency is listed under both lists, their versions are synchronized and -% then this constraint will apply and remove the "right" duplicate. + is_version_range_greater(DependencyRange, OtherDependencyRange). + +% All version ranges used to reference one workspace package in another +% workspace package's `dependencies` or `devDependencies` must match the current +% version of that package. (We handle `peerDependencies` in another rule.) +%gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectDependencyRange, DependencyType) :- + %DependencyType \= 'peerDependencies', + %workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), + %workspace_ident(OtherWorkspaceCwd, DependencyIdent), + %workspace_version(OtherWorkspaceCwd, OtherWorkspaceVersion), + %atomic_list_concat(['^', OtherWorkspaceVersion], CorrectDependencyRange). + +% If a workspace package is listed under another workspace package's +% `dependencies`, it should not also be listed under its `devDependencies`. +% +% We care that the versions are the same between the two instances here so that +% this constraint will apply and remove the "right" duplicate. gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, DependencyType) :- workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), DependencyType == 'devDependencies'. -% If a controller dependency (other than `base-controller`, `eth-keyring-controller` and -% `polling-controller`) is listed under "dependencies", it should also be -% listed under "peerDependencies". Each controller is a singleton, so we need -% to ensure the versions used match expectations. -gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'peerDependencies') :- - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), +% Each controller is a singleton, so we need to ensure the versions +% used match expectations. To accomplish this, if a controller (other than +% `base-controller`, `eth-keyring-controller` and `polling-controller`) is +% listed under a workspace package's `dependencies`, it should also be listed +% under its `peerDependencies`, and the major version of the peer dependency +% should match the major version of the production dependency. +gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, SourceDependencyType), + workspace_has_dependency(WorkspaceCwd, DependencyIdent, PeerDependencyRange, 'peerDependencies'), + is_controller(DependencyIdent), DependencyIdent \= '@metamask/base-controller', DependencyIdent \= '@metamask/eth-keyring-controller', DependencyIdent \= '@metamask/polling-controller', - is_controller(DependencyIdent). + DependencyRange \= PeerDependencyRange, + SourceDependencyType \= 'peerDependencies', + parse_version_range(DependencyRange, _, DependencyMajor, DependencyMinor, DependencyPatch), + parse_version_range(PeerDependencyRange, _, PeerDependencyMajor, PeerDependencyMinor, PeerDependencyPatch), + ( + is_version_range_greater(PeerDependencyRange, DependencyRange), + DependencyOrPeerDependencyMinor = DependencyMinor ; + DependencyOrPeerDependencyMinor = PeerDependencyMinor + ), + ( + is_version_range_greater(PeerDependencyRange, DependencyRange), + DependencyOrPeerDependencyPatch = DependencyPatch ; + DependencyOrPeerDependencyPatch = PeerDependencyPatch + ), + atomic_list_concat([DependencyMajor, DependencyOrPeerDependencyMinor, DependencyOrPeerDependencyPatch], '.', CorrectPeerDependencyVersion), + atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). % All packages must specify a minimum Node version of 16. gen_enforced_field(WorkspaceCwd, 'engines.node', '>=16.0.0'). From b953b6cde1586ea2b8177fa1ed095d9557beff6a Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 14:56:03 -0700 Subject: [PATCH 2/7] Simplify constraint, and relax peer deps for all other packages --- constraints.pro | 57 ++++++++----------- packages/accounts-controller/package.json | 2 +- packages/assets-controllers/package.json | 4 +- packages/ens-controller/package.json | 2 +- packages/gas-fee-controller/package.json | 2 +- packages/permission-controller/package.json | 2 +- packages/polling-controller/package.json | 2 +- packages/preferences-controller/package.json | 2 +- .../queued-request-controller/package.json | 6 +- .../selected-network-controller/package.json | 2 +- packages/signature-controller/package.json | 6 +- packages/transaction-controller/package.json | 4 +- .../user-operation-controller/package.json | 8 +-- 13 files changed, 44 insertions(+), 55 deletions(-) diff --git a/constraints.pro b/constraints.pro index f6e6197b26..66aa07f0e5 100644 --- a/constraints.pro +++ b/constraints.pro @@ -309,64 +309,53 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, 'a range optionally start \+ is_valid_version_range(DependencyRange). % All version ranges used to reference one workspace package in another -% workspace package's `dependencies`, `devDependencies`, or `peerDependencies` -% must be the same. Among all references to the same dependency across the -% monorepo, the one with the smallest version range will win. +% workspace package's `dependencies` or `devDependencies` must be the same. +% Among all references to the same dependency across the monorepo, the one with +% the smallest version range will win. (We handle `peerDependencies` in another +% constraint, as it has slightly different logic.) gen_enforced_dependency(WorkspaceCwd, DependencyIdent, OtherDependencyRange, DependencyType) :- workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), workspace_has_dependency(OtherWorkspaceCwd, DependencyIdent, OtherDependencyRange, OtherDependencyType), WorkspaceCwd \= OtherWorkspaceCwd, DependencyRange \= OtherDependencyRange, - is_version_range_greater(DependencyRange, OtherDependencyRange). + is_version_range_greater(DependencyRange, OtherDependencyRange), + DependencyType \= 'peerDependencies', + OtherDependencyType \= 'peerDependencies'. % All version ranges used to reference one workspace package in another % workspace package's `dependencies` or `devDependencies` must match the current % version of that package. (We handle `peerDependencies` in another rule.) -%gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectDependencyRange, DependencyType) :- - %DependencyType \= 'peerDependencies', - %workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), - %workspace_ident(OtherWorkspaceCwd, DependencyIdent), - %workspace_version(OtherWorkspaceCwd, OtherWorkspaceVersion), - %atomic_list_concat(['^', OtherWorkspaceVersion], CorrectDependencyRange). +gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectDependencyRange, DependencyType) :- + DependencyType \= 'peerDependencies', + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), + workspace_ident(OtherWorkspaceCwd, DependencyIdent), + workspace_version(OtherWorkspaceCwd, OtherWorkspaceVersion), + atomic_list_concat(['^', OtherWorkspaceVersion], CorrectDependencyRange). % If a workspace package is listed under another workspace package's % `dependencies`, it should not also be listed under its `devDependencies`. -% -% We care that the versions are the same between the two instances here so that -% this constraint will apply and remove the "right" duplicate. -gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, DependencyType) :- +gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, 'devDependencies') :- workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), - DependencyType == 'devDependencies'. + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'devDependencies'). % Each controller is a singleton, so we need to ensure the versions % used match expectations. To accomplish this, if a controller (other than % `base-controller`, `eth-keyring-controller` and `polling-controller`) is % listed under a workspace package's `dependencies`, it should also be listed % under its `peerDependencies`, and the major version of the peer dependency -% should match the major version of the production dependency. +% should match the major part of the current version dependency, with the minor +% and patch parts set to 0. gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, SourceDependencyType), - workspace_has_dependency(WorkspaceCwd, DependencyIdent, PeerDependencyRange, 'peerDependencies'), + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), + (DependencyType == 'dependencies' ; DependencyType == 'peerDependencies'), is_controller(DependencyIdent), DependencyIdent \= '@metamask/base-controller', DependencyIdent \= '@metamask/eth-keyring-controller', DependencyIdent \= '@metamask/polling-controller', - DependencyRange \= PeerDependencyRange, - SourceDependencyType \= 'peerDependencies', - parse_version_range(DependencyRange, _, DependencyMajor, DependencyMinor, DependencyPatch), - parse_version_range(PeerDependencyRange, _, PeerDependencyMajor, PeerDependencyMinor, PeerDependencyPatch), - ( - is_version_range_greater(PeerDependencyRange, DependencyRange), - DependencyOrPeerDependencyMinor = DependencyMinor ; - DependencyOrPeerDependencyMinor = PeerDependencyMinor - ), - ( - is_version_range_greater(PeerDependencyRange, DependencyRange), - DependencyOrPeerDependencyPatch = DependencyPatch ; - DependencyOrPeerDependencyPatch = PeerDependencyPatch - ), - atomic_list_concat([DependencyMajor, DependencyOrPeerDependencyMinor, DependencyOrPeerDependencyPatch], '.', CorrectPeerDependencyVersion), + workspace_ident(DependencyWorkspaceCwd, DependencyIdent), + workspace_version(DependencyWorkspaceCwd, DependencyWorkspaceVersion), + parse_version_range(DependencyWorkspaceVersion, _, DependencyMajorVersion, _, _), + atomic_list_concat([DependencyMajorVersion, 0, 0], '.', CorrectPeerDependencyVersion), atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). % All packages must specify a minimum Node version of 16. diff --git a/packages/accounts-controller/package.json b/packages/accounts-controller/package.json index 0e6b608faf..5b70cd1746 100644 --- a/packages/accounts-controller/package.json +++ b/packages/accounts-controller/package.json @@ -55,7 +55,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/keyring-controller": "^12.2.0", + "@metamask/keyring-controller": "^12.0.0", "@metamask/snaps-controllers": "^4.0.0" }, "engines": { diff --git a/packages/assets-controllers/package.json b/packages/assets-controllers/package.json index 23b82e5dba..e5c68fca29 100644 --- a/packages/assets-controllers/package.json +++ b/packages/assets-controllers/package.json @@ -73,8 +73,8 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2", - "@metamask/network-controller": "^17.2.0", + "@metamask/approval-controller": "^5.0.0", + "@metamask/network-controller": "^17.0.0", "@metamask/preferences-controller": "^7.0.0" }, "engines": { diff --git a/packages/ens-controller/package.json b/packages/ens-controller/package.json index b075a73f41..e1ab184b67 100644 --- a/packages/ens-controller/package.json +++ b/packages/ens-controller/package.json @@ -50,7 +50,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.2.0" + "@metamask/network-controller": "^17.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/gas-fee-controller/package.json b/packages/gas-fee-controller/package.json index aecddfc72c..e14faadedc 100644 --- a/packages/gas-fee-controller/package.json +++ b/packages/gas-fee-controller/package.json @@ -57,7 +57,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.2.0" + "@metamask/network-controller": "^17.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/permission-controller/package.json b/packages/permission-controller/package.json index 7540583309..c29cdfdcdf 100644 --- a/packages/permission-controller/package.json +++ b/packages/permission-controller/package.json @@ -53,7 +53,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2" + "@metamask/approval-controller": "^5.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/polling-controller/package.json b/packages/polling-controller/package.json index 624354b2f2..36ee29e6a0 100644 --- a/packages/polling-controller/package.json +++ b/packages/polling-controller/package.json @@ -51,7 +51,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.2.0" + "@metamask/network-controller": "^17.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/preferences-controller/package.json b/packages/preferences-controller/package.json index e2dce319d6..52b626d835 100644 --- a/packages/preferences-controller/package.json +++ b/packages/preferences-controller/package.json @@ -47,7 +47,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/keyring-controller": "^12.2.0" + "@metamask/keyring-controller": "^12.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/queued-request-controller/package.json b/packages/queued-request-controller/package.json index d3e733b2f4..93f067c19a 100644 --- a/packages/queued-request-controller/package.json +++ b/packages/queued-request-controller/package.json @@ -56,9 +56,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2", - "@metamask/network-controller": "^17.2.0", - "@metamask/selected-network-controller": "^7.0.1" + "@metamask/approval-controller": "^5.0.0", + "@metamask/network-controller": "^17.0.0", + "@metamask/selected-network-controller": "^7.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/selected-network-controller/package.json b/packages/selected-network-controller/package.json index e2473295ac..64dd04d130 100644 --- a/packages/selected-network-controller/package.json +++ b/packages/selected-network-controller/package.json @@ -52,7 +52,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.2.0" + "@metamask/network-controller": "^17.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/signature-controller/package.json b/packages/signature-controller/package.json index fb3fbfd143..20c1a02cf2 100644 --- a/packages/signature-controller/package.json +++ b/packages/signature-controller/package.json @@ -53,9 +53,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2", - "@metamask/keyring-controller": "^12.2.0", - "@metamask/logging-controller": "^2.0.2" + "@metamask/approval-controller": "^5.0.0", + "@metamask/keyring-controller": "^12.0.0", + "@metamask/logging-controller": "^2.0.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/transaction-controller/package.json b/packages/transaction-controller/package.json index 7b58def7e7..b85974c6eb 100644 --- a/packages/transaction-controller/package.json +++ b/packages/transaction-controller/package.json @@ -66,9 +66,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2", + "@metamask/approval-controller": "^5.0.0", "@metamask/gas-fee-controller": "^13.0.0", - "@metamask/network-controller": "^17.2.0", + "@metamask/network-controller": "^17.0.0", "babel-runtime": "^6.26.0" }, "engines": { diff --git a/packages/user-operation-controller/package.json b/packages/user-operation-controller/package.json index 0a1911d659..2e71377950 100644 --- a/packages/user-operation-controller/package.json +++ b/packages/user-operation-controller/package.json @@ -60,11 +60,11 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.1.2", + "@metamask/approval-controller": "^5.0.0", "@metamask/gas-fee-controller": "^13.0.0", - "@metamask/keyring-controller": "^12.2.0", - "@metamask/network-controller": "^17.2.0", - "@metamask/transaction-controller": "^21.1.0" + "@metamask/keyring-controller": "^12.0.0", + "@metamask/network-controller": "^17.0.0", + "@metamask/transaction-controller": "^21.0.0" }, "engines": { "node": ">=16.0.0" From eb7c2cf7ee1ce480bdd0ea4ea3eaee3b9560f4b5 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 15:22:14 -0700 Subject: [PATCH 3/7] No need for this second check --- constraints.pro | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/constraints.pro b/constraints.pro index 66aa07f0e5..f9858ae8a3 100644 --- a/constraints.pro +++ b/constraints.pro @@ -335,8 +335,7 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectDependencyRange, D % If a workspace package is listed under another workspace package's % `dependencies`, it should not also be listed under its `devDependencies`. gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, 'devDependencies') :- - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'devDependencies'). + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'). % Each controller is a singleton, so we need to ensure the versions % used match expectations. To accomplish this, if a controller (other than From 340ceaeaf6605c52cf5190871554f0c27c1dbeeb Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 15:49:55 -0700 Subject: [PATCH 4/7] Relax constraint further, and revert changes to packages --- constraints.pro | 38 +++++++++--- packages/accounts-controller/package.json | 2 +- packages/assets-controllers/package.json | 4 +- .../src/ComposableController.test.ts | 61 ------------------- .../src/ComposableController.ts | 15 ----- packages/ens-controller/package.json | 2 +- packages/gas-fee-controller/package.json | 2 +- packages/permission-controller/package.json | 2 +- packages/polling-controller/package.json | 2 +- packages/preferences-controller/package.json | 2 +- .../queued-request-controller/package.json | 6 +- .../selected-network-controller/package.json | 2 +- packages/signature-controller/package.json | 6 +- packages/transaction-controller/package.json | 4 +- .../user-operation-controller/package.json | 8 +-- 15 files changed, 52 insertions(+), 104 deletions(-) diff --git a/constraints.pro b/constraints.pro index f9858ae8a3..3d66b08e95 100644 --- a/constraints.pro +++ b/constraints.pro @@ -343,19 +343,43 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, 'devDependencies') % listed under a workspace package's `dependencies`, it should also be listed % under its `peerDependencies`, and the major version of the peer dependency % should match the major part of the current version dependency, with the minor -% and patch parts set to 0. +% and patch parts set to 0. If it is already listed there, then the major +% version should match the current version of the package and the minor and +% patch parts should be <= the corresponding parts. +%gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- + %workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), + %\+ workspace_has_dependency(WorkspaceCwd, DependencyIdent, _, 'peerDependencies'), + %is_controller(DependencyIdent), + %DependencyIdent \= '@metamask/base-controller', + %DependencyIdent \= '@metamask/eth-keyring-controller', + %DependencyIdent \= '@metamask/polling-controller', + %workspace_ident(DependencyWorkspaceCwd, DependencyIdent), + %workspace_version(DependencyWorkspaceCwd, CurrentDependencyWorkspaceVersion), + %parse_version_range(CurrentDependencyWorkspaceVersion, _, CurrentDependencyVersionMajor, _, _), + %atomic_list_concat([CurrentDependencyVersionMajor, 0, 0], '.', CorrectPeerDependencyVersion), + %atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- - workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType), - (DependencyType == 'dependencies' ; DependencyType == 'peerDependencies'), + workspace_has_dependency(WorkspaceCwd, DependencyIdent, SpecifiedPeerDependencyRange, 'peerDependencies'), is_controller(DependencyIdent), DependencyIdent \= '@metamask/base-controller', DependencyIdent \= '@metamask/eth-keyring-controller', DependencyIdent \= '@metamask/polling-controller', workspace_ident(DependencyWorkspaceCwd, DependencyIdent), - workspace_version(DependencyWorkspaceCwd, DependencyWorkspaceVersion), - parse_version_range(DependencyWorkspaceVersion, _, DependencyMajorVersion, _, _), - atomic_list_concat([DependencyMajorVersion, 0, 0], '.', CorrectPeerDependencyVersion), - atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). + workspace_version(DependencyWorkspaceCwd, CurrentDependencyVersion), + parse_version_range(CurrentDependencyVersion, _, CurrentDependencyVersionMajor, CurrentDependencyVersionMinor, CurrentDependencyVersionPatch), + parse_version_range(SpecifiedPeerDependencyRange, _, SpecifiedPeerDependencyVersionMajor, SpecifiedPeerDependencyVersionMinor, SpecifiedPeerDependencyVersionPatch), + ( + ( + SpecifiedPeerDependencyVersionMajor == CurrentDependencyVersionMajor, + SpecifiedPeerDependencyVersionMinor @=< CurrentDependencyVersionMinor, + SpecifiedPeerDependencyVersionPatch @=< CurrentDependencyVersionPatch + ) -> + CorrectPeerDependencyRange = SpecifiedPeerDependencyRange ; + ( + atomic_list_concat([CurrentDependencyVersionMajor, 0, 0], '.', CorrectPeerDependencyVersion), + atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange) + ) + ). % All packages must specify a minimum Node version of 16. gen_enforced_field(WorkspaceCwd, 'engines.node', '>=16.0.0'). diff --git a/packages/accounts-controller/package.json b/packages/accounts-controller/package.json index 5b70cd1746..0e6b608faf 100644 --- a/packages/accounts-controller/package.json +++ b/packages/accounts-controller/package.json @@ -55,7 +55,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/keyring-controller": "^12.0.0", + "@metamask/keyring-controller": "^12.2.0", "@metamask/snaps-controllers": "^4.0.0" }, "engines": { diff --git a/packages/assets-controllers/package.json b/packages/assets-controllers/package.json index e5c68fca29..23b82e5dba 100644 --- a/packages/assets-controllers/package.json +++ b/packages/assets-controllers/package.json @@ -73,8 +73,8 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0", - "@metamask/network-controller": "^17.0.0", + "@metamask/approval-controller": "^5.1.2", + "@metamask/network-controller": "^17.2.0", "@metamask/preferences-controller": "^7.0.0" }, "engines": { diff --git a/packages/composable-controller/src/ComposableController.test.ts b/packages/composable-controller/src/ComposableController.test.ts index 6bed303a76..4e5d944fa1 100644 --- a/packages/composable-controller/src/ComposableController.test.ts +++ b/packages/composable-controller/src/ComposableController.test.ts @@ -120,21 +120,6 @@ describe('ComposableController', () => { }); }); - it('should compose flat controller state', () => { - const composableMessenger = new ControllerMessenger().getRestricted({ - name: 'ComposableController', - }); - const controller = new ComposableController({ - controllers: [new BarController(), new BazController()], - messenger: composableMessenger, - }); - - expect(controller.flatState).toStrictEqual({ - bar: 'bar', - baz: 'baz', - }); - }); - it('should notify listeners of nested state change', () => { const controllerMessenger = new ControllerMessenger< never, @@ -188,28 +173,6 @@ describe('ComposableController', () => { }); }); - it('should compose flat controller state', () => { - const controllerMessenger = new ControllerMessenger< - never, - FooControllerEvent - >(); - const fooControllerMessenger = controllerMessenger.getRestricted({ - name: 'FooController', - }); - const fooController = new FooController(fooControllerMessenger); - const composableControllerMessenger = controllerMessenger.getRestricted({ - name: 'ComposableController', - allowedEvents: ['FooController:stateChange'], - }); - const composableController = new ComposableController({ - controllers: [fooController], - messenger: composableControllerMessenger, - }); - expect(composableController.flatState).toStrictEqual({ - foo: 'foo', - }); - }); - it('should notify listeners of nested state change', () => { const controllerMessenger = new ControllerMessenger< never, @@ -273,30 +236,6 @@ describe('ComposableController', () => { }); }); - it('should compose flat controller state', () => { - const barController = new BarController(); - const controllerMessenger = new ControllerMessenger< - never, - FooControllerEvent - >(); - const fooControllerMessenger = controllerMessenger.getRestricted({ - name: 'FooController', - }); - const fooController = new FooController(fooControllerMessenger); - const composableControllerMessenger = controllerMessenger.getRestricted({ - name: 'ComposableController', - allowedEvents: ['FooController:stateChange'], - }); - const composableController = new ComposableController({ - controllers: [barController, fooController], - messenger: composableControllerMessenger, - }); - expect(composableController.flatState).toStrictEqual({ - bar: 'bar', - foo: 'foo', - }); - }); - it('should notify listeners of BaseControllerV1 state change', () => { const barController = new BarController(); const controllerMessenger = new ControllerMessenger< diff --git a/packages/composable-controller/src/ComposableController.ts b/packages/composable-controller/src/ComposableController.ts index b1c7a08d69..6d4f6eb7d8 100644 --- a/packages/composable-controller/src/ComposableController.ts +++ b/packages/composable-controller/src/ComposableController.ts @@ -99,21 +99,6 @@ export class ComposableController extends BaseController< ); } - /** - * Flat state representation, one that isn't keyed - * of controller name. Instead, all child controller state is merged - * together into a single, flat object. - * - * @returns Merged state representation of all child controllers. - */ - get flatState() { - let flatState = {}; - for (const controller of this.#controllers) { - flatState = { ...flatState, ...controller.state }; - } - return flatState; - } - /** * Adds a child controller instance to composable controller state, * or updates the state of a child controller. diff --git a/packages/ens-controller/package.json b/packages/ens-controller/package.json index e1ab184b67..b075a73f41 100644 --- a/packages/ens-controller/package.json +++ b/packages/ens-controller/package.json @@ -50,7 +50,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.0.0" + "@metamask/network-controller": "^17.2.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/gas-fee-controller/package.json b/packages/gas-fee-controller/package.json index e14faadedc..aecddfc72c 100644 --- a/packages/gas-fee-controller/package.json +++ b/packages/gas-fee-controller/package.json @@ -57,7 +57,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.0.0" + "@metamask/network-controller": "^17.2.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/permission-controller/package.json b/packages/permission-controller/package.json index c29cdfdcdf..7540583309 100644 --- a/packages/permission-controller/package.json +++ b/packages/permission-controller/package.json @@ -53,7 +53,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0" + "@metamask/approval-controller": "^5.1.2" }, "engines": { "node": ">=16.0.0" diff --git a/packages/polling-controller/package.json b/packages/polling-controller/package.json index 36ee29e6a0..624354b2f2 100644 --- a/packages/polling-controller/package.json +++ b/packages/polling-controller/package.json @@ -51,7 +51,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.0.0" + "@metamask/network-controller": "^17.2.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/preferences-controller/package.json b/packages/preferences-controller/package.json index 52b626d835..e2dce319d6 100644 --- a/packages/preferences-controller/package.json +++ b/packages/preferences-controller/package.json @@ -47,7 +47,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/keyring-controller": "^12.0.0" + "@metamask/keyring-controller": "^12.2.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/queued-request-controller/package.json b/packages/queued-request-controller/package.json index 93f067c19a..d3e733b2f4 100644 --- a/packages/queued-request-controller/package.json +++ b/packages/queued-request-controller/package.json @@ -56,9 +56,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0", - "@metamask/network-controller": "^17.0.0", - "@metamask/selected-network-controller": "^7.0.0" + "@metamask/approval-controller": "^5.1.2", + "@metamask/network-controller": "^17.2.0", + "@metamask/selected-network-controller": "^7.0.1" }, "engines": { "node": ">=16.0.0" diff --git a/packages/selected-network-controller/package.json b/packages/selected-network-controller/package.json index 64dd04d130..e2473295ac 100644 --- a/packages/selected-network-controller/package.json +++ b/packages/selected-network-controller/package.json @@ -52,7 +52,7 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/network-controller": "^17.0.0" + "@metamask/network-controller": "^17.2.0" }, "engines": { "node": ">=16.0.0" diff --git a/packages/signature-controller/package.json b/packages/signature-controller/package.json index 20c1a02cf2..fb3fbfd143 100644 --- a/packages/signature-controller/package.json +++ b/packages/signature-controller/package.json @@ -53,9 +53,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0", - "@metamask/keyring-controller": "^12.0.0", - "@metamask/logging-controller": "^2.0.0" + "@metamask/approval-controller": "^5.1.2", + "@metamask/keyring-controller": "^12.2.0", + "@metamask/logging-controller": "^2.0.2" }, "engines": { "node": ">=16.0.0" diff --git a/packages/transaction-controller/package.json b/packages/transaction-controller/package.json index b85974c6eb..7b58def7e7 100644 --- a/packages/transaction-controller/package.json +++ b/packages/transaction-controller/package.json @@ -66,9 +66,9 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0", + "@metamask/approval-controller": "^5.1.2", "@metamask/gas-fee-controller": "^13.0.0", - "@metamask/network-controller": "^17.0.0", + "@metamask/network-controller": "^17.2.0", "babel-runtime": "^6.26.0" }, "engines": { diff --git a/packages/user-operation-controller/package.json b/packages/user-operation-controller/package.json index 2e71377950..0a1911d659 100644 --- a/packages/user-operation-controller/package.json +++ b/packages/user-operation-controller/package.json @@ -60,11 +60,11 @@ "typescript": "~4.8.4" }, "peerDependencies": { - "@metamask/approval-controller": "^5.0.0", + "@metamask/approval-controller": "^5.1.2", "@metamask/gas-fee-controller": "^13.0.0", - "@metamask/keyring-controller": "^12.0.0", - "@metamask/network-controller": "^17.0.0", - "@metamask/transaction-controller": "^21.0.0" + "@metamask/keyring-controller": "^12.2.0", + "@metamask/network-controller": "^17.2.0", + "@metamask/transaction-controller": "^21.1.0" }, "engines": { "node": ">=16.0.0" From 12d68e8d5da64b9626752f2f13cba6f7733db862 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 15:54:19 -0700 Subject: [PATCH 5/7] Revert name change --- constraints.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constraints.pro b/constraints.pro index 3d66b08e95..1bcc0a88c1 100644 --- a/constraints.pro +++ b/constraints.pro @@ -63,7 +63,7 @@ parse_version_range(VersionRange, Modifier, Major, Minor, Patch) :- % considered as less than the second. % % Borrowed from: -is_version_range_greater(VersionRange1, VersionRange2) :- +npm_version_range_out_of_sync(VersionRange1, VersionRange2) :- parse_version_range(VersionRange1, VersionRange1Modifier, VersionRange1Major, VersionRange1Minor, VersionRange1Patch), parse_version_range(VersionRange2, VersionRange2Modifier, VersionRange2Major, VersionRange2Minor, VersionRange2Patch), VersionRange1Modifier == VersionRange2Modifier, @@ -318,7 +318,7 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, OtherDependencyRange, Dep workspace_has_dependency(OtherWorkspaceCwd, DependencyIdent, OtherDependencyRange, OtherDependencyType), WorkspaceCwd \= OtherWorkspaceCwd, DependencyRange \= OtherDependencyRange, - is_version_range_greater(DependencyRange, OtherDependencyRange), + npm_version_range_out_of_sync(DependencyRange, OtherDependencyRange), DependencyType \= 'peerDependencies', OtherDependencyType \= 'peerDependencies'. From b90dd10d3f64a327f12a5b02963974ad0529e499 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 16:00:32 -0700 Subject: [PATCH 6/7] Restore commented out constraints --- constraints.pro | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/constraints.pro b/constraints.pro index 1bcc0a88c1..b85dd87a3e 100644 --- a/constraints.pro +++ b/constraints.pro @@ -346,18 +346,18 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, null, 'devDependencies') % and patch parts set to 0. If it is already listed there, then the major % version should match the current version of the package and the minor and % patch parts should be <= the corresponding parts. -%gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- - %workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), - %\+ workspace_has_dependency(WorkspaceCwd, DependencyIdent, _, 'peerDependencies'), - %is_controller(DependencyIdent), - %DependencyIdent \= '@metamask/base-controller', - %DependencyIdent \= '@metamask/eth-keyring-controller', - %DependencyIdent \= '@metamask/polling-controller', - %workspace_ident(DependencyWorkspaceCwd, DependencyIdent), - %workspace_version(DependencyWorkspaceCwd, CurrentDependencyWorkspaceVersion), - %parse_version_range(CurrentDependencyWorkspaceVersion, _, CurrentDependencyVersionMajor, _, _), - %atomic_list_concat([CurrentDependencyVersionMajor, 0, 0], '.', CorrectPeerDependencyVersion), - %atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). +gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- + workspace_has_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, 'dependencies'), + \+ workspace_has_dependency(WorkspaceCwd, DependencyIdent, _, 'peerDependencies'), + is_controller(DependencyIdent), + DependencyIdent \= '@metamask/base-controller', + DependencyIdent \= '@metamask/eth-keyring-controller', + DependencyIdent \= '@metamask/polling-controller', + workspace_ident(DependencyWorkspaceCwd, DependencyIdent), + workspace_version(DependencyWorkspaceCwd, CurrentDependencyWorkspaceVersion), + parse_version_range(CurrentDependencyWorkspaceVersion, _, CurrentDependencyVersionMajor, _, _), + atomic_list_concat([CurrentDependencyVersionMajor, 0, 0], '.', CorrectPeerDependencyVersion), + atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange). gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRange, 'peerDependencies') :- workspace_has_dependency(WorkspaceCwd, DependencyIdent, SpecifiedPeerDependencyRange, 'peerDependencies'), is_controller(DependencyIdent), From ff19a10778177119f7ad088c7827371e0db1b79b Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 1 Feb 2024 16:21:45 -0700 Subject: [PATCH 7/7] Fix version comparison logic --- constraints.pro | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/constraints.pro b/constraints.pro index b85dd87a3e..94d6db04a3 100644 --- a/constraints.pro +++ b/constraints.pro @@ -371,14 +371,16 @@ gen_enforced_dependency(WorkspaceCwd, DependencyIdent, CorrectPeerDependencyRang ( ( SpecifiedPeerDependencyVersionMajor == CurrentDependencyVersionMajor, - SpecifiedPeerDependencyVersionMinor @=< CurrentDependencyVersionMinor, - SpecifiedPeerDependencyVersionPatch @=< CurrentDependencyVersionPatch - ) -> - CorrectPeerDependencyRange = SpecifiedPeerDependencyRange ; ( - atomic_list_concat([CurrentDependencyVersionMajor, 0, 0], '.', CorrectPeerDependencyVersion), - atom_concat('^', CorrectPeerDependencyVersion, CorrectPeerDependencyRange) + SpecifiedPeerDependencyVersionMinor @< CurrentDependencyVersionMinor ; + ( + SpecifiedPeerDependencyVersionMinor == CurrentDependencyVersionMinor, + SpecifiedPeerDependencyVersionPatch @=< CurrentDependencyVersionPatch + ) ) + ) -> + CorrectPeerDependencyRange = SpecifiedPeerDependencyRange ; + atom_concat('^', CurrentDependencyVersion, CorrectPeerDependencyRange) ). % All packages must specify a minimum Node version of 16.