MetaMask / MetaMask/core

[utils] Ban enums, and replace them with alternatives

Open
#10,211 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
413
Forks
308
Avg merge
1d 4h
Merged PRs (30d)
253

Description

Carried over from https://github.com/MetaMask/utils/pull/280, which was approved but still open when `@metamask/utils` moved into core.

TypeScript is structurally typed nearly everywhere, but enums are nominal. Two enums that look identical are not assignable to each other, so a value produced by one copy of a package fails to typecheck against a function from another copy. That bites hardest in a monorepo with duplicated versions in the tree.

`packages/utils` still exports three:

- `KnownCaipNamespace` in `src/caip-types.ts:134`
- `JsonSize` in `src/misc.ts:137`
- `Duration` in `src/time.ts:4`

The original PR replaces them with const objects plus derived union types, which keeps the call sites working while making the types structural.

Note this is a breaking change for consumers who use the enum types nominally, so it wants a major. The PR's `.eslintrc.js` rule does not port directly since core has its own shared config.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in packages/utils at src/caip-types.ts:134, src/misc.ts:137, and src/time.ts:4 to inspect the three exported enums and their call sites. Replace them with const objects and derived union types while preserving call-site behavior, and adapt the lint rule to core's shared configuration. Done means the enum exports are structural and the breaking change is prepared for a major release.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
tooling
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
65/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.