Commit Graph
3331 Commits
Author SHA1 Message Date
Chris Tate b8fc0444ac Format the retired-file check 2026-10-20 18:04:24 -05:00
Chris Tate a1ef7950d0 Delete the docs compatibility metadata file again
#1360 moved the content hash and row count into next.config.mjs and
deleted node-v24-compatibility-meta.json, but a later merge kept a
branch's copy. Nothing reads it, and its hash line conflicts on every
compatibility change. The local compatibility check now fails while the
file exists, so a merge can't bring it back unnoticed.
2026-10-20 17:53:33 -05:00
Chris Tate f446620ae5 Read absent process.versions entries as undefined under @types/node (#1550) 2026-10-20 17:46:00 -05:00
Chris Tate 1abce1868c Build JavaScript default-export objects that hold class values (#1551) 2026-10-20 17:42:08 -05:00
Chris Tate 4bc8a4711c Jump out of WebAssembly traps without __builtin_setjmp on AArch64 sanitized builds (#1560) v0.4.0 2026-10-20 16:57:11 -05:00
Chris Tate a95973b02a Install tsc-ts's platform packages for every release target (#1559) 2026-10-20 16:55:55 -05:00
Chris Tate 5b964e244c Jump out of WebAssembly traps without __builtin_setjmp on AArch64 sanitized builds
Clang has no __builtin_setjmp lowering for AArch64, so scr_wasm.c did not
compile under AddressSanitizer on macOS arm64. Sanitized AArch64 builds
now use an uninstrumented setjmp/longjmp pair that saves the
callee-preserved registers, sp and the frame and link registers; like the
builtin pair, no runtime intercepts it, and scr_wasm_trap still unpoisons
the abandoned frames.
2026-10-20 16:51:09 -05:00
Chris Tate faf3ced3f7 Install tsc-ts's platform packages for every release target
The darwin-arm64, linux-x64-musl and linux-arm64-musl CLI builds failed with
"tsc-ts checker: ... has no @tsc-ts/<platform> executable":

- The lockfile had no entry for @tsc-ts/darwin-arm64@0.0.5, so the
  darwin-arm64 install skipped it. The lockfile now lists all seven
  platform packages.
- A CLI ships the tsc-ts executable of its target. The musl builds run on
  glibc runners, where pnpm installs only the glibc packages. Those jobs now
  add musl to pnpm's supported libc before installing.
2026-10-20 16:50:41 -05:00
Chris Tate b6c10f6b63 Merge pull request #1555 from vercel-labs/ctate/prepare-v0-4-46a693
Prepare v0.4.0 release
2026-10-20 16:22:46 -05:00
Chris Tate a41324ac34 Mark the end of the 0.4.0 release notes 2026-10-20 16:16:56 -05:00
Chris Tate 282e4820d2 v0.4.0 2026-10-20 16:10:37 -05:00
Chris Tate 8993734a35 Pipe into constructor-function streams natively in checked-dynamic stream slots (#1546) 2026-10-20 16:01:38 -05:00
Chris Tate 3d280218b3 Keep constructor-function stream methods on stream slot member calls; order 6471's file reads
Only pipe and unpipe destinations now take the constructor-function
stream probe (stream.dynNativePipe). Member calls on a checked-dynamic
stream slot use the boxed-native probe again, so a constructor-function
stream's own pause(), resume() and on() still run
(5820-node-stream-dyn-constructor-overrides).

6471 started its second file read on the first stream's 'end', so that
stream's 'close' could land after the second stream's data. The second
read now starts on 'close'.
2026-10-20 15:58:30 -05:00
Malte UblandClaude Opus 5.5 d1e39f3d8c Build JavaScript default-export objects that hold class values
`export default { parse, stringify, DateType, ParseError }` failed at
module initialization: the literal's width check against the default
binding's type found class members missing.

- A class name in a shorthand property (`{ ParseError }`) now evaluates
  to the class object, exactly like the long form `{ ParseError:
  ParseError }`; it had no lowering, so the JavaScript literal dropped
  the member.
- A class the program could not lower (one extending Date) is still
  dropped from the literal, its diagnostic deferred to the reads that
  reach it. The default binding of a JavaScript object literal now
  registers its type without such members, so the module initializes
  and the named exports work.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:45:28 -07:00
Chris Tate 19091ebbda Pipe into constructor-function streams natively in checked-dynamic stream slots
With checked-dynamic stream slots, stream.dynNative answered only boxed
runtime streams, so a pipe into a constructor-function stream took the
JavaScript listener protocol, and src.unpipe(this) in its 'pipe' listener
had no runtime pipe to remove (6564-constructor-function-stream-late-hooks).
In programs that link the constructor-function stream unit,
stream.dynNative now answers such a stream's runtime stream, as
stream.unboxDyn does there. A stream that overrides write() or end()
still pipes through its JavaScript members.
2026-10-20 14:49:30 -05:00
Chris Tate 139542bcf1 Read a widening-added member's name with symbolName (#1542) 2026-10-20 14:17:38 -05:00
Chris Tate 81908207cc Read a widening-added member's name with symbolName 2026-10-20 14:14:58 -05:00
Chris Tate bffa54612e Order the undefined members widening adds after an object literal's own (#1540) 2026-10-20 14:00:01 -05:00
Chris Tate 3306c78914 Check the frontend's types against tsc-ts/api (#1538) 2026-10-20 13:49:45 -05:00
Chris Tate c17f9e6706 Run macOS CI jobs nightly and for pull requests that change darwin code (#1539) 2026-10-20 13:49:16 -05:00
Chris Tate eba133dc37 Order the undefined members widening adds after an object literal's own
Widening an array or union of object literals gives each literal an
optional `undefined` member for every property only its siblings
declare. A record shape took its key order from the checker's member
list, where those members sit wherever the checker put them: TypeScript
7.0.2 by the literal its checker widened first, TypeScript 7.1 and
tsc-ts by the sibling that declares them. tsgo and tsc-ts then gave
webassembly-wpt-jsapi.mjs different LLVM IR. The members are never own
keys of the literal's value, so they now follow the declared members,
by name.
2026-10-20 13:47:38 -05:00
Chris Tate f3c4ba0c20 Run macOS CI jobs nightly and for pull requests that change darwin code
Pushes to main now run every lane except macos, so a merged commit no
longer queues the macOS native build, the darwin test slices and the
macOS LLVM artifact jobs. The nightly sweep and manual runs still run
every lane. Pull requests keep running the macOS lane when
scripts/ci-lanes.mjs selects it.

- The iOS runtime pack builds move from mobile_runtime_packs (linux lane)
  to mobile_runtime_packs_ios (macos lane), since they run on macOS
  runners. The Android pack stays in the linux lane.
- The macos_full dispatch input is replaced by macos_suite (full or
  darwin, default full). Manual runs run the complete macOS suite unless
  macos_suite is darwin.
- ci-lanes.mjs also selects the macos lane for paths naming kqueue, the
  runtime's platform header, and every file of the darwin suite in
  scripts/ci-test-plan.mjs (adding tests/harness/differential.test.ts
  and the darwin runtime pack's archive test).
- The required test check counts a skipped macOS job as passing when the
  macos lane is off, as it already did for pull requests.
2026-10-20 13:43:22 -05:00
Chris Tate f97d65de53 Count a computed key as a stack read only when it can be "stack" (#1513) 2026-10-20 13:42:56 -05:00
Chris Tate 5765d89227 Check the frontend's types against tsc-ts/api
The frontend calls tokenStartOfNode, getTextOfNode, getSourceFileOfNode and
forEachChild instead of AstNode's position and traversal methods. Node lists
answer hasTrailingComma(), and a declaration's modifiers are a modifier list
with their flags.

Symbol, Type, Signature, IndexInfo, TypePredicate, Program, TypeChecker and
Diagnostic have tsc-ts/api's members and types. Compiler code reads symbol
names with symbolName(symbol).

tsc-ts goes to 0.0.5. api-conformance.ts asserts that AstNode, AstNodeList,
SourceFile and each node interface are assignable to tsc-ts/api's interface of
the same name, and names the members where the wire format differs.
2026-10-20 13:41:39 -05:00
Chris Tate cad421b35a Search each stack-key local once per question
A key forwarded through functions with several call sites made the search
visit every call path. Each search now visits a local once, and a local
keeps its answer: true once a search reached a key that can be "stack"
from it, false once a search that found none passed it.
2026-10-20 13:39:27 -05:00
Chris Tate cd7b7c3957 Expect SC2020 from three web-stream npm programs (#1536) 2026-10-20 13:35:46 -05:00
Chris Tate bb1452ca5a Expect SC2020 from three web-stream npm programs
The fixture's launch() helper calls run().then, which used to be the
first statement these programs fenced at (SC1090). It compiles since
#1503, so node24-web-stream-pipe-abort and
node24-web-stream-readable-lifecycle now stop at 'new ReadableStream'
and node24-web-stream-tee at 'ReadableStream.tee', which have no
lowering (SC2020).
2026-10-20 13:28:32 -05:00
Chris Tate a0894cc488 Give constructor functions native stream state over the stream classes (#1533) 2026-10-20 13:21:25 -05:00
Chris Tate 5344367219 Read constructor-function stream hooks when they run
A constructor-function stream now reads `_final` and `_flush` when its
writable side finishes, and `_transform` for each chunk, as Node does. A hook
assigned after `Writable.call(this)` or `Transform.call(this)` runs, and an
override of a PassThrough's `_transform` replaces the pass-through. Without
`_final` or `_flush` the finish continues as Node's does.

A runtime stream passed to a constructor-function stream's listeners, such
as the source of a 'pipe' event, is the view whose pipe and unpipe accept
constructor-function streams, so `src.unpipe(this)` in a 'pipe' listener
unpipes instead of throwing.
2026-10-20 13:16:29 -05:00
Chris Tate 178e524662 Compile events.once with an AbortSignal and over streams, and combine Promise.race entries around it (#1531) 2026-10-20 13:04:20 -05:00
Chris Tate 3751afa51f Merge main 2026-10-20 13:02:01 -05:00
Chris Tate 24c73ac7fb Compile any crossings: destructuring, namespace patterns, any parameters and async callbacks (#1503) 2026-10-20 12:58:51 -05:00
Chris Tate e181687405 Merge main 2026-10-20 12:55:10 -05:00
Chris Tate 54e419f89a Declare the WebAssembly W5 and stream-slot entry points in the runtime headers (#1535) 2026-10-20 12:54:23 -05:00
Chris Tate 97bf98cd89 Declare the WebAssembly W5 and stream-slot entry points in the runtime headers
The backend can emit scr_wasm_memory_construct, scr_wasm_table_construct,
scr_wasm_global_construct, scr_wasm_construct_without_new,
scr_wasm_module_imports, scr_wasm_module_exports,
scr_wasm_module_custom_sections and scr_wasm_value_of (#1410), and
scr_stream_dyn_native, scr_stream_pipe_dyn and scr_stream_unpipe_dyn
(#1524). Their prototypes were in scr_wasm.c or nowhere, so the runtime
ABI guard failed. They are now in scr_wasm.h and scr_stream.h, and
scr_wasm.c no longer repeats the header's declarations.

The speculative-hoisting test relied on `v instanceof Num` in a
JavaScript function failing, which constructor-function instanceof now
compiles (#1512). Its hoisted function reads the prototype through
Reflect.getPrototypeOf instead, which still fences.
2026-10-20 12:50:19 -05:00
Malte UblandClaude Opus 5.5 a12827cc35 Read absent process.versions entries as undefined under @types/node
@types/node declares http_parser, v8, uv, zlib, ares and modules as plain
strings, but the runtime's versions object holds only node and openssl. The
dyn read was narrowed to the declared string with a checked extraction, so
comparisons with undefined folded to false and other uses threw. Such reads
now keep the undefined arm, like the optional stream properties, and
unannotated bindings initialized from them store the same union.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 10:48:12 -07:00
Malte UblandClaude Opus 5.5 5f3efe314c Format the runtime-pack matrix entry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 10:35:49 -07:00
Chris Tate 73a595692f Let NodeJS stream interface slots hold JavaScript stream objects (#1524) 2026-10-20 12:32:16 -05:00
Malte UblandClaude Opus 5.5 b89594c276 Keep the legacy Stream constructor on the EventEmitter unit
Programs whose only stream value is the legacy Stream do not need the
stream half.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 10:31:10 -07:00
Chris Tate 28f1646461 Unpipe JavaScript destinations on unpipe() without a destination
With checked-dynamic stream slots, readable.unpipe() also unpipes every
JavaScript destination stream.pipeDyn registered from the source, oldest
pipe first. Each destination hears 'unpipe' and the source pauses, as in
Node's unpipe(), which empties every pipe. Before, those pipes stayed
attached and later chunks still reached them.
2026-10-20 12:29:12 -05:00
Chris Tate a8ee60d5fa Write invisible characters in the WebAssembly spec data as escapes (#1532) 2026-10-20 12:24:37 -05:00
Chris Tate cf003870ee Write invisible characters in the WebAssembly spec data as escapes 2026-10-20 12:18:55 -05:00
Chris Tate 8ac2d854cf WebAssembly W5: the Memory, Table and Global constructors, Module.imports/exports/customSections, and function references from tables (#1410) 2026-10-20 12:12:19 -05:00
Chris Tate cfb94177e9 Adapt method overrides across ABI differences, write Error codes, and close wrapper-reachable gaps (#1497) 2026-10-20 12:10:19 -05:00
Chris Tate ae3642d1bb Merge main 2026-10-20 12:08:37 -05:00
Chris Tate 76227c86c8 Merge main 2026-10-20 12:07:23 -05:00
Chris Tate cb8eb5972e Merge main 2026-10-20 12:04:40 -05:00
Malte UblandClaude Opus 5.5 2a9328cc5c Pipe a runtime stream into constructor-function streams in the transform corpus program
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 09:54:08 -07:00
Chris Tate eea3bc5447 Specialize variadic generic wrappers to the wrapped function's signature (#1413) 2026-10-20 11:52:34 -05:00
Malte UblandClaude Opus 5.5 73e40f4196 Merge main
pipe() into an untyped destination now comes from main's pipeIntoDyn
(stream.unboxDyn); programs with constructor-function streams unbox
through scr_dyn_builtin_stream.c, which also takes those streams, so the
separate dyn.builtinStreamPipe entry point is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 09:49:43 -07:00