Skip to content

node 26 bottle is built without Temporal support #281625

Description

@Leask

brew config AND brew doctor output

Your system is ready to brew.
HOMEBREW_VERSION: 5.1.10-33-g6839384
ORIGIN: https://github.com/Homebrew/brew
HEAD: 68393841da13d154749e0d332e20a3b69250a83e
Last commit: 2 hours ago
Branch: main
Core tap HEAD: 7a8dfb265ff976e34a5879fd5993d6de4495fa51
Core tap last commit: 19 minutes ago
Core tap JSON: 08 May 15:44 UTC
Core cask tap HEAD: 8b52a10df8ade147b6cf6632ce9af87d17cc106e
Core cask tap last commit: 40 minutes ago
Core cask tap JSON: 08 May 15:44 UTC
HOMEBREW_PREFIX: /opt/homebrew
HOMEBREW_CASK_OPTS: []
HOMEBREW_DISPLAY: /var/run/com.apple.launchd.8YEix1pkaJ/org.xquartz:0
HOMEBREW_DOWNLOAD_CONCURRENCY: 48
HOMEBREW_EDITOR: /usr/bin/vim
HOMEBREW_FORBID_PACKAGES_FROM_PATHS: set
HOMEBREW_MAKE_JOBS: 24
HOMEBREW_NO_COLOR: set
HOMEBREW_NO_ENV_HINTS: set
HOMEBREW_SORBET_RUNTIME: set
Homebrew Ruby: 4.0.3 => /opt/homebrew/Library/Homebrew/vendor/portable-ruby/4.0.3/bin/ruby
CPU: 24-core 64-bit arm_blizzard_avalanche
Clang: 21.0.0 build 2100
Git: 2.54.0 => /opt/homebrew/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 26.5-arm64
CLT: N/A
Xcode: 26.4.1
Metal Toolchain: N/A
Rosetta 2: false

Verification

  • My brew doctor output says Your system is ready to brew. and am still able to reproduce my issue.
  • I ran brew update and am still able to reproduce my issue.
  • I have resolved all warnings from brew doctor and that did not fix my problem.
  • I searched for recent similar issues at https://github.com/Homebrew/homebrew-core/issues?q=is%3Aissue and found no duplicates.
  • My issue is not about a failure to build a formula from source.

What were you trying to do (and why)?

Use the native Temporal API in Node.js 26, specifically Temporal.Now.zonedDateTimeISO().toString().

Node.js 26 enables Temporal by default upstream, so I expected the Homebrew node 26 bottle to expose globalThis.Temporal as well.

What happened (include all command output)?

Homebrew's node 26 bottle appears to be built without V8 Temporal support:

$ brew info node | sed -n '1,20p'
==> node: stable 26.0.0 (bottled), HEAD
Open-source, cross-platform JavaScript runtime environment
https://nodejs.org/
Installed (on request)
/opt/homebrew/Cellar/node/26.0.0 (1,889 files, 82.4MB) *
  Poured from bottle using the formulae.brew.sh API on 2026-05-08 at 10:50:32
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/n/node.rb
License: MIT
==> Dependencies
Required (17): ada-url, brotli, c-ares, hdrhistogram_c, icu4c@78, libnghttp2, libnghttp3, libngtcp2, libuv, llhttp, merve, nbytes, openssl@3, simdjson, sqlite, uvwasi, zstd
Recursive Runtime (23): all installed ✔
$ node -p "JSON.stringify({version: process.version, execPath: process.execPath, v8: process.versions.v8, temporalGlobal: Object.hasOwn(globalThis, 'Temporal'), temporalNow: typeof globalThis.Temporal?.Now?.zonedDateTimeISO, temporalConfig: process.config.variables.v8_enable_temporal_support}, null, 2)"
{
  "version": "v26.0.0",
  "execPath": "/opt/homebrew/Cellar/node/26.0.0/bin/node",
  "v8": "14.6.202.33-node.19",
  "temporalGlobal": false,
  "temporalNow": "undefined",
  "temporalConfig": 0
}

For comparison, the official upstream Node.js v26.0.0 darwin-arm64 binary exposes Temporal and has v8_enable_temporal_support = 1:

$ ./node-v26.0.0-darwin-arm64/bin/node -p "JSON.stringify({version: process.version, execPath: process.execPath, temporalGlobal: Object.hasOwn(globalThis, 'Temporal'), temporalNow: typeof globalThis.Temporal?.Now?.zonedDateTimeISO, temporalConfig: process.config.variables.v8_enable_temporal_support, sample: globalThis.Temporal?.Now?.zonedDateTimeISO?.().toString()}, null, 2)"
{
  "version": "v26.0.0",
  "execPath": "/private/var/folders/d6/j_bw829j50dc21f_98rtdslh0000gn/T/tmp.uwJLyoHm6d/node-v26.0.0-darwin-arm64/bin/node",
  "temporalGlobal": true,
  "temporalNow": "function",
  "temporalConfig": 1,
  "sample": "2026-05-08T11:53:36.18027002-04:00[America/Toronto]"
}

The formula also seems to know that temporal_capi is only relevant when building with --v8-enable-temporal-support, but I do not see --v8-enable-temporal-support being added to the configure args:

$ brew cat node | rg -n "v8-enable-temporal|temporal_capi|args =|configure" -C 3
99-
100-    # Never install the bundled "npm", always prefer our
101-    # installation from tarball for better packaging control.
102:    args = %W[
103-      --prefix=#{prefix}
104-      --without-npm
105-      --with-intl=system-icu
--
142-    # TODO: Try to devendor these libraries.
143-    # - `--shared-gtest` is only used for building the test suite, which we don't run here.
144-    # - `--shared-simdutf` seems to result in build failures.
145:    # - `--shared-temporal_capi` is only used when building with `--v8-enable-temporal-support`
146-    # - `--shared-lief` is not available as dependency in Homebrew.
147-    ignored_shared_flags = %w[
148-      gtest
149-      simdutf
150:      temporal_capi
151-      lief
152-    ].map { |library| "--shared-#{library}" }
--
173-    # FIXME: re-enable me, currently crashes sequoia runner after 6 hours
174-    # args << "--enable-lto" if OS.mac? && DevelopmentTools.clang_build_version > 1699 && build.bottle?
175-
176:    system "./configure", *args
177-    system "make", "install"

What did you expect to happen?

Homebrew's node 26 bottle should match upstream Node.js 26 behavior:

Object.hasOwn(globalThis, 'Temporal') === true
process.config.variables.v8_enable_temporal_support === 1
typeof Temporal.Now.zonedDateTimeISO === 'function'

If Homebrew's configure environment disables V8's default Temporal support, the formula may need to pass --v8-enable-temporal-support explicitly, and possibly handle the temporal_capi dependency accordingly.

Step-by-step reproduction instructions (by running brew commands)

brew update
brew reinstall node
node -p "JSON.stringify({version: process.version, execPath: process.execPath, v8: process.versions.v8, temporalGlobal: Object.hasOwn(globalThis, 'Temporal'), temporalNow: typeof globalThis.Temporal?.Now?.zonedDateTimeISO, temporalConfig: process.config.variables.v8_enable_temporal_support}, null, 2)"

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    upstream issueAn upstream issue report is needed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions