Build/Submit form data
eas-cli/18.11.0 darwin-arm64 node-v20.19.4 (also reproduces on EAS Build cloud workers)
Summary
Starting today (2026-05-08), eas build crashes during the auto-fingerprint step with:
(0 , brace_expansion_1.default) is not a function
To skip this step, set the environment variable: EAS_SKIP_AUTO_FINGERPRINT=1
Builds that succeeded a few hours earlier now fail without any code change on our side. The trigger is an upstream npm publish of [email protected] (and @2.1.0 from 2026-04-11) that removes the CJS-friendly default export shape that [email protected]/10.x consume via TypeScript's __importDefault helper.
Reproduction
Clean install on a project where @expo/[email protected] (bundled by recent eas-cli) resolves [email protected] -> [email protected] (or [email protected] -> [email protected]):
pnpm install # re-resolves transitive minimatch -> brace-expansion
eas build --profile preview --platform ios
Crashes inside @expo/fingerprint/node_modules/minimatch/dist/commonjs/index.js line 7:
const brace_expansion_1 = __importDefault(require("brace-expansion"));
__importDefault returns mod unchanged when mod.__esModule === true. brace-expansion 2.1.0 / 5.0.6 ship as ESM-only ("type": "module", named export only — no default), so brace_expansion_1.default is undefined.
Root cause
Upstream regression in brace-expansion:
| Version |
Published |
Notes |
| 2.0.2 |
2025-06-11 |
Last CJS-compatible 2.x |
| 1.1.14 |
2026-04-11 |
|
| 2.1.0 |
2026-04-11 |
ESM-only, no default export |
| 5.0.5 |
2026-03-24 |
|
| 5.0.6 |
2026-05-08 |
ESM-only, no default export |
[email protected] and [email protected] both still emit CJS dist/commonjs/index.js that does __importDefault(require("brace-expansion")) and calls .default(...). That worked against 2.0.x / 5.0.5 (CJS, wrapped by the helper into { default: expand }), but breaks against the new ESM publish (helper sees __esModule: true and skips wrapping).
This is a published-as-minor / published-as-patch breaking change in an upstream transitive — every consumer that re-resolves after the publish window inherits the break.
Why this hits EAS users specifically today
@expo/fingerprint declares minimatch: ^9.x (resolves to 9.0.9 -> brace-expansion 2.1.0) without a floor that blocks the regression. EAS Build runs pnpm install / npm install on the cloud worker; any project whose lockfile gets refreshed (or that has wildcard versions in package.json forcing re-resolution) picks up [email protected] / 2.1.0 and the auto-fingerprint step instantly fails.
Workarounds (confirmed)
In the consuming project root package.json:
{
"pnpm": {
"overrides": {
"brace-expansion@>=2.1.0 <3": "2.0.2",
"brace-expansion@>=5.0.6": "5.0.5"
}
}
}
(npm equivalent: top-level "overrides".)
Then pnpm install --frozen-lockfile (or commit the regenerated lockfile) and rebuild. EAS_SKIP_AUTO_FINGERPRINT=1 also unblocks builds but disables a feature, so it is not a real fix.
Suggested fix in eas-cli / @expo/fingerprint
One of:
- Pin
brace-expansion via @expo/fingerprint own package.json overrides / resolutions, so users on a fresh install get a working version regardless of npm registry state.
- Bump
minimatch (and rebuild against a tag that uses named imports — import { expand } from "brace-expansion" — so the new ESM shape is fine).
- Vendor a small brace-expansion replacement; transitive churn from this dep has been a recurring source of EAS Build outages.
Happy to test a release candidate.
Environment
- eas-cli: 18.11.0
- @expo/fingerprint: 0.15.4 (transitively, bundled with eas-cli)
- expo: 54.0.33
- pnpm: 10.x
- Node: 20.19.4 (local); default Node on EAS Build workers reproduces the same.
Build/Submit form data
eas-cli/18.11.0 darwin-arm64 node-v20.19.4 (also reproduces on EAS Build cloud workers)
Summary
Starting today (2026-05-08),
eas buildcrashes during the auto-fingerprint step with:Builds that succeeded a few hours earlier now fail without any code change on our side. The trigger is an upstream npm publish of
[email protected](and@2.1.0from 2026-04-11) that removes the CJS-friendly default export shape that[email protected]/10.xconsume via TypeScript's__importDefaulthelper.Reproduction
Clean install on a project where
@expo/[email protected](bundled by recenteas-cli) resolves[email protected]->[email protected](or[email protected]->[email protected]):Crashes inside
@expo/fingerprint/node_modules/minimatch/dist/commonjs/index.jsline 7:__importDefaultreturnsmodunchanged whenmod.__esModule === true. brace-expansion2.1.0/5.0.6ship as ESM-only ("type": "module", named export only — nodefault), sobrace_expansion_1.defaultisundefined.Root cause
Upstream regression in
brace-expansion:[email protected]and[email protected]both still emit CJSdist/commonjs/index.jsthat does__importDefault(require("brace-expansion"))and calls.default(...). That worked against2.0.x/5.0.5(CJS, wrapped by the helper into{ default: expand }), but breaks against the new ESM publish (helper sees__esModule: trueand skips wrapping).This is a published-as-minor / published-as-patch breaking change in an upstream transitive — every consumer that re-resolves after the publish window inherits the break.
Why this hits EAS users specifically today
@expo/fingerprintdeclaresminimatch: ^9.x(resolves to 9.0.9 -> brace-expansion 2.1.0) without a floor that blocks the regression. EAS Build runspnpm install/npm installon the cloud worker; any project whose lockfile gets refreshed (or that has wildcard versions inpackage.jsonforcing re-resolution) picks up[email protected]/2.1.0and the auto-fingerprint step instantly fails.Workarounds (confirmed)
In the consuming project root
package.json:{ "pnpm": { "overrides": { "brace-expansion@>=2.1.0 <3": "2.0.2", "brace-expansion@>=5.0.6": "5.0.5" } } }(npm equivalent: top-level
"overrides".)Then
pnpm install --frozen-lockfile(or commit the regenerated lockfile) and rebuild.EAS_SKIP_AUTO_FINGERPRINT=1also unblocks builds but disables a feature, so it is not a real fix.Suggested fix in eas-cli / @expo/fingerprint
One of:
brace-expansionvia@expo/fingerprintownpackage.jsonoverrides / resolutions, so users on a fresh install get a working version regardless of npm registry state.minimatch(and rebuild against a tag that uses named imports —import { expand } from "brace-expansion"— so the new ESM shape is fine).Happy to test a release candidate.
Environment