[utils] Ban enums, and replace them with alternatives

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

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

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

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.

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.

Dominant language
TypeScript
Stars
422
Forks
313
Avg merge
1d 8h
Merged PRs (30d)
414

Getting set up

  • No Dockerfile or Docker Compose file
  • Has a pull request template
  • No contributing guide

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.

More from MetaMask/core

All issues in MetaMask/core

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.