1
0
mirror of https://github.com/lancedikson/bowser synced 2026-09-24 13:04:24 +00:00

test: guard ES5 runtime APIs and type-check consumers in CI

Follow-up to the ES5 syntax fix, closing the gaps that investigation left.

An ES5-only runtime sandbox. The acorn check catches syntax, but syntax is
only half the contract: preset-env lowers syntax and never polyfills library
calls, so one `Array.prototype.includes` in the parser source compiles
cleanly, passes every test on modern Node, and throws on the browsers es5.js
exists for. The new test runs both legacy bundles in a vm context with the
post-ES5.1 globals, statics and prototype methods deleted, and asserts
bundled.js additionally installs the polyfills its README entry promises.
Includes a test that the sandbox really strips, so it cannot quietly pass
against a modern global.

A consumer type-check across every module resolution mode, run in CI against
the packed tarball. attw already checks that types *resolve* per condition;
it compiles nothing, so it cannot catch a declaration that resolves correctly
and then misdescribes the runtime. Negative cases are asserted too — the maps
must stay non-importable as named exports, which is the line index.d.mts
draws deliberately and only a failing compile can hold.

Also documents two findings that were investigated and deliberately left
alone: the bundled.js size increase is the core-js 2 -> 3 upgrade rather than
waste, and `useBuiltIns: 'usage'` would shrink it by breaking the documented
"all needed polyfills" contract; and the src/*.js ESM-in-CJS wart (publint
warnings, Yarn PnP, Node < 20.19) is longstanding and identical on 2.14.1,
with the nested-package.json fix blocked on @babel/register.

Verified by breaking each guard in turn: an ES6 API call injected into es5.js
fails the sandbox test, and an index.d.mts with its `parse` export removed
fails all three ESM resolution modes while the CJS modes correctly still pass.
This commit is contained in:
naorpeled
2026-08-30 21:57:22 +03:00
parent 2a2ba39ddb
commit 4f59e5d25e
8 changed files with 288 additions and 2 deletions

View File

@@ -77,6 +77,14 @@ check('constant maps are exposed', function () {
// The src/*.js files are ES module sources, so they resolve but do not execute
// under require(). Bundlers are the real consumer here. Assert resolution only.
//
// This is also why publint warns on every `pkg.exports["./src/*"]` entry, and
// why these paths fail under Yarn PnP (ERR_REQUIRE_CYCLE_MODULE) and on Node
// below 20.19, which has no module-syntax detection. Verified identical on
// 2.14.1, so it is longstanding rather than new. The obvious fix — a nested
// `src/package.json` with `"type": "module"` — would stop `@babel/register`
// from loading `src/` and take the whole AVA suite with it, so the wart stays
// until the test tooling moves off `require()` hooks.
[
'bowser.js', 'constants.js', 'parser.js', 'parser-browsers.js',
'parser-engines.js', 'parser-os.js', 'parser-platforms.js', 'utils.js',