From 13a13abaa9b99577e36c66aa956254668aa1179a Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Tue, 20 Jan 2026 14:46:14 -0700 Subject: [PATCH 01/10] get started on technical report --- .gitignore | 2 + README.md | 9 + package-lock.json | 1736 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 27 + runtime-keys.json | 162 +++++ spec.html | 444 ++++++++++++ 6 files changed, 2380 insertions(+) create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 runtime-keys.json create mode 100644 spec.html diff --git a/.gitignore b/.gitignore index 2901159..603ff8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ index.html .vercel +node_modules/ +out.html \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0595eb --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Runtime Keys + +This repo contains the WinterTC Runtime Keys ECMA Technical Report source and build tooling. + +To get started, run `npm install` to install project dependencies + +To build the report run `npm run build` + +To view the report open `out.html` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3301375 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1736 @@ +{ + "name": "runtime-keys", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "runtime-keys", + "version": "1.0.0", + "devDependencies": { + "ecmarkup": "^22.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esfx/async-canceltoken": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@esfx/async-canceltoken/-/async-canceltoken-1.0.0.tgz", + "integrity": "sha512-3Ps/4NPd7qFltmHL+CYXCjZtNXcQGV9BZmpzu8Rt3/0SZMtbQve0gtX0uJDJGvAWa6w3IB4HrKVP12VPoFONmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@esfx/cancelable": "^1.0.0", + "@esfx/canceltoken": "^1.0.0", + "@esfx/disposable": "^1.0.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@esfx/cancelable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@esfx/cancelable/-/cancelable-1.0.0.tgz", + "integrity": "sha512-2dry/TuOT9ydpw86f396v09cyi/gLeGPIZSH4Gx+V/qKQaS/OXCRurCY+Cn8zkBfTAgFsjk9NE15d+LPo2kt9A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@esfx/disposable": "^1.0.0" + } + }, + "node_modules/@esfx/canceltoken": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@esfx/canceltoken/-/canceltoken-1.0.0.tgz", + "integrity": "sha512-/TgdzC5O89w5v0TgwE2wcdtampWNAFOxzurCtb4RxYVr3m72yk3Bg82vMdznx+H9nnf28zVDR0PtpZO9FxmOkw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@esfx/cancelable": "^1.0.0", + "@esfx/disposable": "^1.0.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@esfx/disposable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@esfx/disposable/-/disposable-1.0.0.tgz", + "integrity": "sha512-hu7EI+YxlEWEKrb2himbS13HNaq5mlUePASf99KeQqkiNeqiAZbKqG4w59uDcLZs8JrV3qJqS/NYib5ZMhbfTQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecmarkdown": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ecmarkdown/-/ecmarkdown-8.1.0.tgz", + "integrity": "sha512-dx6cM6RFjzAXkWr2KQRikED4gy70NFQ0vTI4XUQM/LWcjUYRJUbGdd7nd++trXi5az1JSe49TeeCIVMKDXOtcQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "escape-html": "^1.0.1" + } + }, + "node_modules/ecmarkup": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/ecmarkup/-/ecmarkup-22.0.0.tgz", + "integrity": "sha512-DMZYlRH0QEPieu+iqFfCThMdnPmMLySHepZcYEq1I7U4gMJIf3jy5Pwy8cusxmvJ732PeMeqr9b4mhY3dw0dVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "command-line-args": "^5.2.0", + "command-line-usage": "^6.1.1", + "dedent-js": "^1.0.1", + "ecmarkdown": "^8.1.0", + "eslint-formatter-codeframe": "^7.32.1", + "fast-glob": "^3.2.7", + "grammarkdown": "^3.3.2", + "highlight.js": "11.0.1", + "html-escape": "^1.0.2", + "js-yaml": "^3.13.1", + "jsdom": "^25.0.1", + "nwsapi": "2.2.0", + "parse5": "^6.0.1", + "prex": "^0.4.7", + "promise-debounce": "^1.0.1" + }, + "bin": { + "ecmarkup": "bin/ecmarkup.js", + "emu-format": "bin/emu-format.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-formatter-codeframe": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.2.tgz", + "integrity": "sha512-0X5vEQeNniQRbGm+ec9Ow6LWj4RqZEcjPSfZ+t8qLPWqwyaBa67GrNetTxd0aYKoHrpbZeoRRlvA2gz9HujiEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/grammarkdown": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/grammarkdown/-/grammarkdown-3.3.2.tgz", + "integrity": "sha512-inNbeEotDr7MENqoZlms3x4gBzvK73wR2NGpNVnw4oEZcsq2METUbAh0J3VWtEqd9t2+U3poEqiJ9CDgBXr5Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@esfx/async-canceltoken": "^1.0.0-pre.13", + "@esfx/cancelable": "^1.0.0-pre.13", + "@esfx/disposable": "^1.0.0-pre.13" + }, + "bin": { + "grammarkdown": "bin/grammarkdown" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.0.1.tgz", + "integrity": "sha512-EqYpWyTF2s8nMfttfBA2yLKPNoZCO33pLS4MnbXQ4hECf1TKujCt1Kq7QAdrio7roL4+CqsfjqwYj4tYgq0pJQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escape": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-escape/-/html-escape-1.0.2.tgz", + "integrity": "sha512-r4cqVc7QAX1/jpPsW9OJNsTTtFhcf+ZBqoA3rWOddMg/y+n6ElKfz+IGKbvV2RTeECDzyrQXa2rpo3IFFrANWg==", + "dev": true, + "license": "Public Domain" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prex": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/prex/-/prex-0.4.9.tgz", + "integrity": "sha512-pQCB9AH8MXQRBaelDkhnTkqY6GRiXt1xWlx2hBReZYZwVA0m7EQcnF/K55zr87cCADDHmdD+qq7G6a8Pu+BRFA==", + "deprecated": "This package has been deprecated in favor of several '@esfx/*' packages that replace it. Please see the README for more information", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@esfx/cancelable": "^1.0.0 || >=1.0.0-pre.13", + "@esfx/disposable": "^1.0.0 || >=1.0.0-pre.13" + } + }, + "node_modules/promise-debounce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-debounce/-/promise-debounce-1.0.1.tgz", + "integrity": "sha512-jq3Crngf1DaaOXQIOUkPr7LsW4UsWyn0KW1MJ+yMn5njTJ+F1AuHmjjwJhod9HuoNSSMspSLS9PS3V7BrexwjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c3d357 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "runtime-keys", + "description": "WinterTC55 Runtime Keys technical report", + "version": "1.0.0", + "private": "true", + "license": "", + "homepage": "", + "bugs": { + "url": "https://github.com/WinterTC55/runtime-keys/issues" + }, + "author": { + "name": "Ethan Arrowood", + "email": "ethan@arrowood.dev", + "url": "https://ethanarrowood.com" + }, + "contributors": [], + "repository": { + "type": "git", + "url": "https://github.com/WinterTC55/runtime-keys.git" + }, + "scripts": { + "build": "ecmarkup spec.html out.html" + }, + "devDependencies": { + "ecmarkup": "^22.0.0" + } +} diff --git a/runtime-keys.json b/runtime-keys.json new file mode 100644 index 0000000..d0699d5 --- /dev/null +++ b/runtime-keys.json @@ -0,0 +1,162 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "WinterTC55 Runtime Keys Registry", + "description": "A registry of runtime keys for JavaScript runtime environments", + "version": "1.0.0", + "lastModified": "2026-01-20", + "runtimes": [ + { + "organization": "Alibaba Cloud", + "name": "edge-routine", + "key": "edge-routine", + "description": "The JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.", + "website": "https://www.alibabacloud.com/help/en/dynamic-route-for-cdn/latest/er-overview", + "repository": null, + "deprecated": false + }, + { + "organization": "Arvancloud", + "name": "Edge Computing", + "key": "arvancloud", + "description": "The JavaScript runtime that powers Arvancloud Edge Computing.", + "website": "https://www.arvancloud.ir/en/products/edge-computing", + "repository": null, + "deprecated": false + }, + { + "organization": "Azion", + "name": "Edge Functions", + "key": "azion", + "description": "Azion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing.", + "website": "https://www.azion.com/en/products/edge-functions/", + "repository": null, + "deprecated": false + }, + { + "organization": "Cloudflare", + "name": "workerd", + "key": "workerd", + "description": "The JavaScript / WebAssembly runtime that powers Cloudflare Workers.", + "website": "https://workers.cloudflare.com/", + "repository": "https://github.com/cloudflare/workerd", + "deprecated": false + }, + { + "organization": "Deno Land", + "name": "Deno", + "key": "deno", + "description": "A modern runtime for JavaScript and TypeScript.", + "website": "https://deno.com", + "repository": "https://github.com/denoland/deno", + "deprecated": false + }, + { + "organization": "Fastly", + "name": "JavaScript on Compute@Edge", + "key": "fastly", + "description": "JavaScript runtime for Fastly Compute@Edge.", + "website": "https://developer.fastly.com/learning/compute/javascript/", + "repository": "https://github.com/fastly/js-compute-runtime", + "deprecated": false + }, + { + "organization": "Kiesel", + "name": "Kiesel", + "key": "kiesel", + "description": "A JavaScript engine and runtime written in Zig.", + "website": "https://kiesel.dev/", + "repository": "https://codeberg.org/kiesel-js/runtime", + "deprecated": false + }, + { + "organization": "Lagon", + "name": "Lagon Runtime", + "key": "lagon", + "description": "Lagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge.", + "website": "https://lagon.app", + "repository": "https://github.com/lagonapp/lagon", + "deprecated": false + }, + { + "organization": "Meta", + "name": "React Native", + "key": "react-native", + "description": "A framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).", + "website": "https://reactnative.dev/", + "repository": "https://github.com/facebook/react-native", + "deprecated": false + }, + { + "organization": "Moddable", + "name": "Moddable SDK", + "key": "moddable", + "description": "Open source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs.", + "website": "https://www.moddable.com/", + "repository": "https://github.com/Moddable-OpenSource/moddable", + "deprecated": false + }, + { + "organization": "Netlify", + "name": "Edge Functions", + "key": "netlify", + "description": "Edge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge.", + "website": "https://docs.netlify.com/edge-functions/overview/", + "repository": "https://github.com/netlify/edge-functions", + "deprecated": false + }, + { + "organization": "OpenJS Foundation", + "name": "Electron", + "key": "electron", + "description": "Build cross-platform desktop apps with JavaScript, HTML, and CSS.", + "website": "https://www.electronjs.org/", + "repository": "https://github.com/electron/electron", + "deprecated": false + }, + { + "organization": "OpenJS Foundation", + "name": "Node.js", + "key": "node", + "description": "Node.js is an open-source, cross-platform JavaScript runtime environment.", + "website": "https://nodejs.org", + "repository": "https://github.com/nodejs/node", + "deprecated": false + }, + { + "organization": "Oven", + "name": "Bun", + "key": "bun", + "description": "Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.", + "website": "https://bun.sh/", + "repository": "https://github.com/oven-sh/bun", + "deprecated": false + }, + { + "organization": "React", + "name": "Server Components", + "key": "react-server", + "description": "Used by React Server Components.", + "website": "https://react.dev/", + "repository": "https://github.com/facebook/react", + "deprecated": false + }, + { + "organization": "Vercel", + "name": "Edge Light", + "key": "edge-light", + "description": "Developing, testing, and defining the runtime Web APIs for Edge infrastructure.", + "website": "https://edge-runtime.vercel.app/", + "repository": "https://github.com/vercel/edge-runtime", + "deprecated": false + }, + { + "organization": "Wasmer", + "name": "Wasmer Edge", + "key": "wasmer", + "description": "The JavaScript runtime that brings JavaScript to Wasmer Edge.", + "website": "https://wasmer.io/products/edge", + "repository": "https://github.com/wasmerio/winterjs", + "deprecated": false + } + ] +} diff --git a/spec.html b/spec.html new file mode 100644 index 0000000..15bd4f1 --- /dev/null +++ b/spec.html @@ -0,0 +1,444 @@ + + + + + + + + + + Runtime Keys + + + +
+  title: Runtime Keys
+  status: draft
+  location: https://github.com/WinterTC55/runtime-keys
+  contributors: WinterTC55
+  
+ +

Scope

+

This Technical Report defines a registry of runtime keys for JavaScript runtime environments.

+ + +

Description

+

A runtime key is a unique string identifier that represents a specific JavaScript runtime environment. Runtime keys provide a standardized mechanism for identifying JavaScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. These keys are meant to particularly represent server environments. Browsers should still be generally referenced by other mechanisms such as the browserslist project.

+ +

This specification defines:

+
    +
  • The registry of runtime keys and associated metadata
  • +
  • The normative requirements for runtime keys
  • +
  • The governance process for adding and modifying registry entries
  • +
+ + +

This specification does not define how runtime keys should be used by tools or libraries. The purpose of this registry is to prevent conflicts and provide a reliable, authoritative source of runtime identifiers that the community can build tooling around.

+
+ + +

Inclusion in this registry does not imply that the specified runtime is conformant with any WinterTC specification, including the Minimum Common API. Inclusion does not imply endorsement of any kind.

+
+
+
+ + +

Conformance

+

This document is a Technical Report and does not define conformance requirements for implementations. The registry defined herein is informative and provides a canonical list of runtime keys for use by the JavaScript ecosystem.

+
+ + +

Normative References

+

There are no normative references.

+
+ + +

Runtime Key Requirements

+ + +

Key Format

+

A runtime key must satisfy the following requirements:

+
    +
  • It must be a string value
  • +
  • It must be usable in common configuration formats such as JSON and YAML
  • +
  • It must meaningfully represent the associated runtime environment
  • +
  • It must be simple and unambiguous
  • +
+ + +

Future versions of this specification may define a formal grammar for allowable characters in runtime keys.

+
+
+ + +

Key Uniqueness

+

A runtime key must not conflict with:

+
    +
  • Any other existing runtime key in this registry
  • +
  • Existing Browserslist browser entries (excludes references to server runtimes within Browserslist)
  • +
+
+ + +

Key Naming Guidelines

+

Runtime keys are subject to expert review by WinterTC members. Keys should:

+
    +
  • Avoid being too similar to existing keys
  • +
  • Avoid similarity to common English words or offensive terms
  • +
  • Avoid being too generic or similar to general terminology such as "Web Runtimes", "Edge Runtimes", or "JavaScript Runtimes"
  • +
  • Demonstrate reasonable specificity and clarity
  • +
+
+ + +

Runtime Existence Requirement

+

The runtime environment represented by a key must actually exist, whether as open source, source-available, or proprietary software. Registry entries exist to identify real runtimes, not to reserve names for future projects.

+ + +

A runtime should demonstrate "proof of use" before being added to the registry. Examples include usage in package.json exports fields, published documentation, or active community adoption.

+
+
+ + +

Runtime Metadata

+

Each runtime key entry includes the following metadata:

+
    +
  • Organization (required): The organization or individual responsible for the runtime
  • +
  • Name (required): The human-readable name of the runtime
  • +
  • Key (required): The unique string identifier
  • +
  • Description (required): A brief description of the runtime
  • +
  • Website (optional): The primary website for the runtime
  • +
  • Repository (optional): The source code repository URL, if available
  • +
  • Deprecated (required): A boolean indicating whether the key is deprecated
  • +
+
+
+ + +

Runtime Key Registry

+

The following table lists all registered runtime keys, sorted alphabetically by Organization.

+ + +

This section is generated from the machine-readable registry data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OrganizationNameKeyDescriptionWebsiteRepository
Alibaba Cloudedge-routineedge-routineThe JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.Website-
ArvancloudEdge ComputingarvancloudThe JavaScript runtime that powers Arvancloud Edge Computing.Website-
AzionEdge FunctionsazionAzion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing.Website-
CloudflareworkerdworkerdThe JavaScript / WebAssembly runtime that powers Cloudflare Workers.WebsiteRepository
Deno LandDenodenoA modern runtime for JavaScript and TypeScript.WebsiteRepository
FastlyJavaScript on Compute@EdgefastlyJavaScript runtime for Fastly Compute@Edge.WebsiteRepository
KieselKieselkieselA JavaScript engine and runtime written in Zig.WebsiteRepository
LagonLagon RuntimelagonLagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge.WebsiteRepository
MetaReact Nativereact-nativeA framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).WebsiteRepository
ModdableModdable SDKmoddableOpen source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs.WebsiteRepository
NetlifyEdge FunctionsnetlifyEdge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge.WebsiteRepository
OpenJS FoundationElectronelectronBuild cross-platform desktop apps with JavaScript, HTML, and CSS.WebsiteRepository
OpenJS FoundationNode.jsnodeNode.js is an open-source, cross-platform JavaScript runtime environment.WebsiteRepository
OvenBunbunIncredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.WebsiteRepository
ReactServer Componentsreact-serverUsed by React Server Components.WebsiteRepository
VercelEdge Lightedge-lightDeveloping, testing, and defining the runtime Web APIs for Edge infrastructure.WebsiteRepository
WasmerWasmer EdgewasmerThe JavaScript runtime that brings JavaScript to Wasmer Edge.WebsiteRepository
+
+
+ + +

Governance and Modification Process

+ + +

Adding Registry Entries

+

All JavaScript runtimes are welcome to propose a key for inclusion in this registry, subject to the requirements specified in . Runtime entries in this registry are encouraged, but not required, to participate in WinterTC.

+ + +

Proposal Process

+ + 1. The proposer creates a pull request in the runtime-keys repository. + 1. The pull request must add the runtime entry to the machine-readable registry data file (runtime-keys.json). + 1. The entry must include all required metadata fields as specified in . + 1. The entry must be inserted in alphabetical order by Organization. + 1. The pull request must be reviewed by WinterTC members. + 1. At least two WinterTC members not directly affiliated with the proposed runtime must approve the pull request. + 1. The pull request must be formally approved at a WinterTC plenary meeting before merging. + 1. After plenary approval, designated editors merge the pull request and update the published registry. + +
+ + +

Expert Review

+

All proposed entries undergo expert review to ensure compliance with the naming guidelines specified in and other requirements. Reviewers evaluate whether:

+
    +
  • The proposed key is appropriately specific and non-generic
  • +
  • The runtime has demonstrated proof of use or adoption
  • +
  • The key does not conflict with existing entries or Browserslist identifiers
  • +
  • The metadata is complete and accurate
  • +
+
+
+ + +

Modifying Registry Entries

+ + +

Metadata Modification

+

Modifications to runtime metadata (organization, name, description, website, or repository) follow the same process as adding entries:

+ + 1. The proposer creates a pull request modifying the entry in runtime-keys.json. + 1. At least two WinterTC members not affiliated with the runtime must approve the pull request. + 1. The modification must be formally approved at a WinterTC plenary meeting. + 1. After plenary approval, designated editors merge the pull request. + +
+ + +

Key Immutability

+

To prevent breaking existing tools and configurations that depend on runtime keys, runtime keys are immutable and must not be modified except in extraordinary circumstances requiring plenary consensus.

+
+ + +

Deprecation

+

Runtime keys may be deprecated to indicate that a runtime project is inactive or discontinued. To deprecate a key:

+ + 1. The proposer creates a pull request setting the `deprecated` field to `true` in runtime-keys.json. + 1. The pull request follows the standard approval process. + 1. After plenary approval and merge, the key is marked as deprecated in the published registry. + + +

Deprecated keys may be undeprecated if the original runtime project resumes activity, following the same approval process. Implementations should not add support for deprecated keys.

+ + +

Deprecated keys remain in the registry to preserve historical information and prevent reuse that could cause confusion.

+
+
+
+ + +

Publication Cadence

+

The registry is published on a semi-annual basis as an ECMA Technical Report. Changes approved at plenary meetings between publication cycles are available in the draft registry maintained in the WinterTC runtime-keys repository.

+
+
+ + +

Machine-Readable Registry Data

+

The authoritative, machine-readable form of the runtime key registry is maintained as a JSON file: runtime-keys.json.

+ + +

JSON Schema

+

The registry JSON file conforms to the following structure:

+
{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "title": "Runtime Keys Registry",
+  "description": "A registry of runtime keys for JavaScript runtime environments",
+  "version": "1.0.0",
+  "lastModified": "YYYY-MM-DD",
+  "runtimes": [
+    {
+      "organization": "string (required)",
+      "name": "string (required)",
+      "key": "string (required)",
+      "description": "string (required)",
+      "website": "string | null (optional)",
+      "repository": "string | null (optional)",
+      "deprecated": "boolean (required, default: false)"
+    }
+  ]
+}
+
+ + +

Accessing the Registry

+

The current machine-readable registry is available at:

+
    +
  • Draft version: https://github.com/WinterTC55/runtime-keys/blob/main/runtime-keys.json
  • +
  • Published version: To be determined upon ECMA TR publication
  • +
+
+
+ + +

Example Usage

+

This annex provides non-normative examples of how runtime keys may be used in practice.

+ + +

This specification does not prescribe how runtime keys should be used. The following examples are illustrative only.

+
+ + +

Package.json Example

+

A library package might use runtime keys in its package.json to specify conditional exports and runtime version requirements:

+
{
+  "name": "example-library",
+  "version": "1.0.0",
+  "exports": {
+    "node": "./dist/node/index.js",
+    "deno": "./dist/deno/index.js",
+    "bun": "./dist/bun/index.js",
+    "workerd": "./dist/workerd/index.js"
+  },
+  "engines": {
+    "node": ">=18",
+    "deno": ">=1.30",
+    "bun": ">=1.0"
+  }
+}
+
+ + +

Configuration File Example

+

A build tool or framework might use runtime keys to specify runtime-specific configuration:

+
{
+  "runtimes": {
+    "node": {
+      "outputDir": "./dist/node",
+      "target": "ES2022"
+    },
+    "deno": {
+      "outputDir": "./dist/deno",
+      "target": "ES2022"
+    },
+    "workerd": {
+      "outputDir": "./dist/workerd",
+      "target": "ES2022",
+      "polyfills": ["node:buffer"]
+    }
+  }
+}
+
+
+ + From ebeb7d6c78a2f802d9f64b893a2c77dff41c3fce Mon Sep 17 00:00:00 2001 From: Aki Date: Tue, 3 Mar 2026 16:11:06 +0000 Subject: [PATCH 02/10] Edits to align with Ecma house style (#31) --- package.json | 3 +- spec.html | 206 +++++++++++++++++++++++++++------------------------ 2 files changed, 113 insertions(+), 96 deletions(-) diff --git a/package.json b/package.json index 4c3d357..9a60de4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "url": "https://github.com/WinterTC55/runtime-keys.git" }, "scripts": { - "build": "ecmarkup spec.html out.html" + "build": "ecmarkup spec.html out.html", + "watch": "ecmarkup --watch --verbose --lint-spec spec.html out.html" }, "devDependencies": { "ecmarkup": "^22.0.0" diff --git a/spec.html b/spec.html index 15bd4f1..7a0b2e5 100644 --- a/spec.html +++ b/spec.html @@ -19,93 +19,104 @@ location: https://github.com/WinterTC55/runtime-keys contributors: WinterTC55 + + +

Introduction

+ +

This Technical Report defines a canonical source for identifiers of unique ECMAScript runtime environments, known as runtime keys.

+
+

Scope

-

This Technical Report defines a registry of runtime keys for JavaScript runtime environments.

- -

Description

-

A runtime key is a unique string identifier that represents a specific JavaScript runtime environment. Runtime keys provide a standardized mechanism for identifying JavaScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. These keys are meant to particularly represent server environments. Browsers should still be generally referenced by other mechanisms such as the browserslist project.

- -

This specification defines:

-
    -
  • The registry of runtime keys and associated metadata
  • -
  • The normative requirements for runtime keys
  • -
  • The governance process for adding and modifying registry entries
  • -
+

Runtime keys provide a consistent and predictable mechanism for identifying ECMAScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. This document focusses on providing informative identifiers primarily for web servers, though other ECMAScript server environments may find it useful. These keys are not intended to be used in web browsers, which should be referenced by other mechanisms such as the browserslist project.

+

This Report defines:

+
    +
  • the canonical source of runtime keys and associated metadata,
  • +
  • guidance for future ECMAScript runtimes to submit runtime keys, and
  • +
  • TC55's governance process for adding and modifying runtime keys to the Report.
  • +
- -

This specification does not define how runtime keys should be used by tools or libraries. The purpose of this registry is to prevent conflicts and provide a reliable, authoritative source of runtime identifiers that the community can build tooling around.

-
+ +

This Report does not define how runtime keys should be used by tools or libraries. The purpose of this Report is to prevent conflicts and provide a reliable, authoritative source of runtime identifiers.

+
- -

Inclusion in this registry does not imply that the specified runtime is conformant with any WinterTC specification, including the Minimum Common API. Inclusion does not imply endorsement of any kind.

-
-
+ +

Inclusion in this Report does not imply that the specified runtime is conformant with any ECMA TC55 specification, including the WinterTC Minimum Common API. Inclusion does not imply endorsement of any kind.

+
- -

Conformance

-

This document is a Technical Report and does not define conformance requirements for implementations. The registry defined herein is informative and provides a canonical list of runtime keys for use by the JavaScript ecosystem.

-
+ +

Terms and definitions

- -

Normative References

-

There are no normative references.

+

For the purposes of this document, the following terms and definitions apply.

+ + +

ECMAScript runtime

+

implementation of the ECMA-262 ECMAScript langauge specification

+
+ + +

runtime key

+

unique string identifier that represents a specific ECMAScript runtime environment

+
- -

Runtime Key Requirements

+ +

Runtime key structure

-

Key Format

-

A runtime key must satisfy the following requirements:

+

Key format

+

A runtime key satisfies all of the following conditions:

    -
  • It must be a string value
  • -
  • It must be usable in common configuration formats such as JSON and YAML
  • -
  • It must meaningfully represent the associated runtime environment
  • -
  • It must be simple and unambiguous
  • +
  • It is a string value.
  • +
  • It is usable in common configuration formats such as JSON and YAML.
  • +
  • It meaningfully represents the associated runtime environment.
  • +
  • It is simple and unambiguous.
-

Future versions of this specification may define a formal grammar for allowable characters in runtime keys.

+

Future versions of this Report may define a formal grammar for allowable characters in runtime keys.

-

Key Uniqueness

-

A runtime key must not conflict with:

+

Key uniqueness

+

A runtime key included in this Report will not conflict with the following:

    -
  • Any other existing runtime key in this registry
  • -
  • Existing Browserslist browser entries (excludes references to server runtimes within Browserslist)
  • +
  • any other existing runtime key in this Report, or
  • +
  • + any existing Browserslist browser entries. + This explicitly excludes references to server runtimes within Browserslist. +
-

Key Naming Guidelines

-

Runtime keys are subject to expert review by WinterTC members. Keys should:

+

Key naming guidelines

+

Runtime keys are subject to expert review by TC55. Acceptable keys will:

    -
  • Avoid being too similar to existing keys
  • -
  • Avoid similarity to common English words or offensive terms
  • -
  • Avoid being too generic or similar to general terminology such as "Web Runtimes", "Edge Runtimes", or "JavaScript Runtimes"
  • -
  • Demonstrate reasonable specificity and clarity
  • +
  • avoid being too similar to existing keys,
  • +
  • avoid similarity to common English words or offensive terms,
  • +
  • avoid being too generic or similar to general terminology such as "Web Runtimes", "Edge Runtimes", or "JavaScript Runtimes", and
  • +
  • demonstrate reasonable specificity and clarity.
-

Runtime Existence Requirement

-

The runtime environment represented by a key must actually exist, whether as open source, source-available, or proprietary software. Registry entries exist to identify real runtimes, not to reserve names for future projects.

+

Runtime existence validation

+

The runtime environment represented by a key must actually exist, whether as open source, source-available, or proprietary software. Entries in this Report exist to identify real runtimes, not to reserve names for future projects.

-

A runtime should demonstrate "proof of use" before being added to the registry. Examples include usage in package.json exports fields, published documentation, or active community adoption.

+

A runtime should demonstrate "proof of use" before being added to the Report. Examples include usage in package.json exports fields, published documentation, or active community adoption.

-

Runtime Metadata

+

Runtime metadata

Each runtime key entry includes the following metadata:

    -
  • Organization (required): The organization or individual responsible for the runtime
  • +
  • Organization (required): The organisation or individual responsible for the runtime
  • Name (required): The human-readable name of the runtime
  • Key (required): The unique string identifier
  • Description (required): A brief description of the runtime
  • @@ -116,12 +127,12 @@

    Runtime Metadata

    - -

    Runtime Key Registry

    -

    The following table lists all registered runtime keys, sorted alphabetically by Organization.

    + +

    Canonical source for runtime keys

    +

    The following table lists all previously recorded runtime keys, sorted alphabetically by organisation.

    -

    This section is generated from the machine-readable registry data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

    +

    This section is generated from the machine-readable source data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

    @@ -279,55 +290,53 @@

    Runtime Key Registry

    -

    Governance and Modification Process

    +

    Governance and modification process

    -

    Adding Registry Entries

    -

    All JavaScript runtimes are welcome to propose a key for inclusion in this registry, subject to the requirements specified in . Runtime entries in this registry are encouraged, but not required, to participate in WinterTC.

    +

    Proposing entries for future editions

    +

    All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the attributes specified in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

    -

    Proposal Process

    +

    Proposal process

    1. The proposer creates a pull request in the runtime-keys repository. - 1. The pull request must add the runtime entry to the machine-readable registry data file (runtime-keys.json). - 1. The entry must include all required metadata fields as specified in . - 1. The entry must be inserted in alphabetical order by Organization. - 1. The pull request must be reviewed by WinterTC members. - 1. At least two WinterTC members not directly affiliated with the proposed runtime must approve the pull request. - 1. The pull request must be formally approved at a WinterTC plenary meeting before merging. - 1. After plenary approval, designated editors merge the pull request and update the published registry. + 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). + 1. The entry includes all mandatory metadata fields as described in . + 1. The entry is inserted in alphabetical order by organisation. + 1. [id="step-approval-process"] The pull request is reviewed by WinterTC participants. + 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. + 1. The pull request is be formally approved at a TC55 plenary meeting before merging. + 1. After plenary approval, designated editors merge the pull request and update the current draft Report.
    -

    Expert Review

    -

    All proposed entries undergo expert review to ensure compliance with the naming guidelines specified in and other requirements. Reviewers evaluate whether:

    +

    Expert review

    +

    All proposed entries undergo expert review to ensure compliance with the naming guidelines specified in and other expectations. Reviewers evaluate whether:

      -
    • The proposed key is appropriately specific and non-generic
    • -
    • The runtime has demonstrated proof of use or adoption
    • -
    • The key does not conflict with existing entries or Browserslist identifiers
    • -
    • The metadata is complete and accurate
    • +
    • the proposed key is appropriately specific and non-generic,
    • +
    • the runtime has demonstrated proof of use or adoption,
    • +
    • the key does not conflict with existing entries or Browserslist identifiers, and
    • +
    • the metadata is complete and accurate.
    -

    Modifying Registry Entries

    +

    Modifying entries

    -

    Metadata Modification

    -

    Modifications to runtime metadata (organization, name, description, website, or repository) follow the same process as adding entries:

    +

    Metadata modification

    +

    Modifications to runtime metadata (organisation, name, description, website, or repository) follow the same process as adding entries:

    1. The proposer creates a pull request modifying the entry in runtime-keys.json. - 1. At least two WinterTC members not affiliated with the runtime must approve the pull request. - 1. The modification must be formally approved at a WinterTC plenary meeting. - 1. After plenary approval, designated editors merge the pull request. + 1. The proposal continues as described starting at step in the approval process.
    -

    Key Immutability

    -

    To prevent breaking existing tools and configurations that depend on runtime keys, runtime keys are immutable and must not be modified except in extraordinary circumstances requiring plenary consensus.

    +

    Key immutability

    +

    To prevent breaking existing tools and configurations that depend on runtime keys, runtime keys are immutable and will not be modified except in extraordinary circumstances requiring plenary consensus.

    @@ -335,35 +344,34 @@

    Deprecation

    Runtime keys may be deprecated to indicate that a runtime project is inactive or discontinued. To deprecate a key:

    1. The proposer creates a pull request setting the `deprecated` field to `true` in runtime-keys.json. - 1. The pull request follows the standard approval process. - 1. After plenary approval and merge, the key is marked as deprecated in the published registry. + 1. The proposal continues as described starting at step in the approval process.

    Deprecated keys may be undeprecated if the original runtime project resumes activity, following the same approval process. Implementations should not add support for deprecated keys.

    -

    Deprecated keys remain in the registry to preserve historical information and prevent reuse that could cause confusion.

    +

    Deprecated keys remain in the Report to preserve historical information and prevent reuse that could cause confusion.

    -

    Publication Cadence

    -

    The registry is published on a semi-annual basis as an ECMA Technical Report. Changes approved at plenary meetings between publication cycles are available in the draft registry maintained in the WinterTC runtime-keys repository.

    +

    Publication cadence

    +

    This Report is published on a semi-annual basis as an ECMA Technical Report. Changes approved at TC55 plenary meetings between publication cycles can be found in the publicly-available draft maintained in the WinterTC runtime-keys repository.

    - -

    Machine-Readable Registry Data

    -

    The authoritative, machine-readable form of the runtime key registry is maintained as a JSON file: runtime-keys.json.

    + +

    Machine-readable canonical source

    +

    The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

    -

    JSON Schema

    -

    The registry JSON file conforms to the following structure:

    +

    JSON schema

    +

    The runtime keys source data JSON file conforms to the following structure:

    {
       "$schema": "https://json-schema.org/draft/2020-12/schema",
    -  "title": "Runtime Keys Registry",
    -  "description": "A registry of runtime keys for JavaScript runtime environments",
    +  "title": "Runtime Keys",
    +  "description": "A collection of runtime keys for ECMAScript runtime environments",
       "version": "1.0.0",
       "lastModified": "YYYY-MM-DD",
       "runtimes": [
    @@ -380,9 +388,9 @@ 

    JSON Schema

    }
    - -

    Accessing the Registry

    -

    The current machine-readable registry is available at:

    + +

    Accessing the source data

    +

    The current machine-readable source is available at:

    • Draft version: https://github.com/WinterTC55/runtime-keys/blob/main/runtime-keys.json
    • Published version: To be determined upon ECMA TR publication
    • @@ -391,7 +399,7 @@

      Accessing the Registry

      -

      Example Usage

      +

      Example usage

      This annex provides non-normative examples of how runtime keys may be used in practice.

      @@ -399,7 +407,7 @@

      Example Usage

      -

      Package.json Example

      +

      package.json example

      A library package might use runtime keys in its package.json to specify conditional exports and runtime version requirements:

      {
         "name": "example-library",
      @@ -440,5 +448,13 @@ 

      Configuration File Example

      }
      + + +

      Bibliography

      +

      + ECMA-262, ECMAScript® Language Specification
      + https://tc39.es/ecma262/multipage/ +

      +
      From 7984625496cd11a59ae8aee70d15bb0aa9ba6f90 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Tue, 3 Mar 2026 11:16:12 -0700 Subject: [PATCH 03/10] additional edits from reviews and create build script --- build.mjs | 33 ++++ package-lock.json | 242 +++++++++++++++++++++++- package.json | 7 +- spec-injected.html | 460 +++++++++++++++++++++++++++++++++++++++++++++ spec.html | 147 +-------------- 5 files changed, 739 insertions(+), 150 deletions(-) create mode 100644 build.mjs create mode 100644 spec-injected.html diff --git a/build.mjs b/build.mjs new file mode 100644 index 0000000..3f4b02e --- /dev/null +++ b/build.mjs @@ -0,0 +1,33 @@ +import { readFileSync, writeFileSync } from "node:fs"; +import { resolve } from "node:path"; + +const specPath = resolve(import.meta.dirname, "spec.html"); +const dataPath = resolve(import.meta.dirname, "runtime-keys.json"); +const outPath = resolve(import.meta.dirname, "spec-injected.html"); + +const spec = readFileSync(specPath, "utf8"); +const { runtimes } = JSON.parse(readFileSync(dataPath, "utf8")); + +function escapeHtml(str) { + return str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +const rows = runtimes +// intentional whitespace so output is human readable + .map((r) => ` + ${escapeHtml(r.organization)} + ${escapeHtml(r.name)} + ${escapeHtml(r.key)} + ${escapeHtml(r.description)} + ${r.website ? `Website` : "-"} + ${r.repository ? `Repository` : "-"} + ` + ) + .join("\n"); +const injected = spec.replace(" ", rows); + +writeFileSync(outPath, injected, "utf8"); diff --git a/package-lock.json b/package-lock.json index 3301375..9ace392 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,8 @@ "name": "runtime-keys", "version": "1.0.0", "devDependencies": { - "ecmarkup": "^22.0.0" + "concurrently": "^9.2.1", + "ecmarkup": "^23.0.2" } }, "node_modules/@asamuzakjp/css-color": { @@ -217,7 +218,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -241,7 +241,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -336,6 +335,16 @@ "node": ">= 14" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -423,6 +432,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -576,6 +600,47 @@ "node": ">=8" } }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/cssstyle": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", @@ -689,9 +754,9 @@ } }, "node_modules/ecmarkup": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/ecmarkup/-/ecmarkup-22.0.0.tgz", - "integrity": "sha512-DMZYlRH0QEPieu+iqFfCThMdnPmMLySHepZcYEq1I7U4gMJIf3jy5Pwy8cusxmvJ732PeMeqr9b4mhY3dw0dVg==", + "version": "23.0.2", + "resolved": "https://registry.npmjs.org/ecmarkup/-/ecmarkup-23.0.2.tgz", + "integrity": "sha512-hnCtidy6d8o3TJcT64PTSRFwH+lgQXtr8F8eyImDaygzbh38OZWILqIphYTpDMd0wwoBai8nG5oB+QFms6eLGA==", "dev": true, "license": "MIT", "dependencies": { @@ -720,6 +785,13 @@ "node": ">= 18" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -782,6 +854,16 @@ "node": ">= 0.4" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -910,6 +992,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1123,6 +1215,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1407,6 +1509,16 @@ "node": ">=6" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -1449,6 +1561,16 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1469,6 +1591,19 @@ "node": ">=v12.22.7" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1476,6 +1611,34 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1591,6 +1754,16 @@ "node": ">=18" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -1693,6 +1866,24 @@ "node": ">=8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/ws": { "version": "8.19.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", @@ -1731,6 +1922,45 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index 9a60de4..8f1a25a 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,11 @@ "url": "https://github.com/WinterTC55/runtime-keys.git" }, "scripts": { - "build": "ecmarkup spec.html out.html", - "watch": "ecmarkup --watch --verbose --lint-spec spec.html out.html" + "build": "node build.mjs && ecmarkup spec-injected.html out.html", + "watch": "concurrently 'node --watch-path=./runtime-keys.json --watch-path=./spec.html build.mjs' 'ecmarkup --watch --verbose --lint-spec spec-injected.html out.html'" }, "devDependencies": { - "ecmarkup": "^22.0.0" + "concurrently": "^9.2.1", + "ecmarkup": "^23.0.2" } } diff --git a/spec-injected.html b/spec-injected.html new file mode 100644 index 0000000..c90b393 --- /dev/null +++ b/spec-injected.html @@ -0,0 +1,460 @@ + + + + + + + + + + Runtime Keys + + + + + + +

      Introduction

      + +

      This Technical Report defines a canonical source for identifiers of unique ECMAScript runtime environments, known as runtime keys.

      +
      + + +

      Scope

      + +

      Runtime keys provide a consistent and predictable mechanism for identifying ECMAScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. This document focusses on providing informative identifiers primarily for web servers, though other ECMAScript server environments may find it useful. These keys are not intended to be used in web browsers, which should be referenced by other mechanisms such as the browserslist project.

      +

      This Report defines:

      +
        +
      • the canonical source of runtime keys and associated metadata,
      • +
      • guidance for future ECMAScript runtimes to submit runtime keys, and
      • +
      • TC55's governance process for adding and modifying runtime keys to the Report.
      • +
      + + +

      This Report does not define how runtime keys should be used by tools or libraries. The purpose of this Report is to prevent conflicts and provide a reliable, authoritative source of runtime identifiers.

      +
      + + +

      Inclusion in this Report does not imply that the specified runtime is conformant with any ECMA TC55 specification, including the WinterTC Minimum Common API. Inclusion does not imply endorsement of any kind.

      +
      +
      + + +

      Terms and definitions

      + +

      For the purposes of this document, the following terms and definitions apply.

      + + +

      ECMAScript runtime

      +

      implementation of the ECMA-262 ECMAScript langauge specification

      +
      + + +

      runtime key

      +

      unique string identifier that represents a specific ECMAScript runtime environment

      +
      +
      + + +

      Runtime key structure

      + + +

      Key format

      +

      A runtime key satisfies all of the following:

      +
        +
      • It is a string value.
      • +
      • It is usable in common configuration formats such as JSON and YAML.
      • +
      • It meaningfully represents the associated runtime environment.
      • +
      • It is simple and unambiguous.
      • +
      + + +

      Future versions of this Report may define a formal grammar for allowable characters in runtime keys.

      +
      +
      + + +

      Key uniqueness

      +

      A runtime key included in this Report will not conflict with the following:

      +
        +
      • any other existing runtime key in this Report, or
      • +
      • + any existing Browserslist browser entries. + This explicitly excludes references to server runtimes within Browserslist. +
      • +
      +
      + + +

      Key naming guidelines

      +

      Runtime keys are subject to expert review by TC55. Acceptable keys will:

      +
        +
      • avoid being too similar to existing keys,
      • +
      • avoid similarity to common English words or offensive terms,
      • +
      • avoid being too generic or similar to general terminology such as "Web Runtimes", "Edge Runtimes", or "JavaScript Runtimes", and
      • +
      • demonstrate reasonable specificity and clarity.
      • +
      +
      + + +

      Runtime existence validation

      +

      The runtime environment represented by a key must actually exist, whether as open source, source-available, or proprietary software. Entries in this Report exist to identify real runtimes, not to reserve names for future projects.

      + + +

      A runtime should demonstrate "proof of use" before being added to the Report. Examples include usage in package.json exports fields, published documentation, or active community adoption.

      +
      +
      + + +

      Runtime metadata

      +

      Each runtime key entry includes the following metadata:

      +
        +
      • Organization (required): The organisation or individual responsible for the runtime
      • +
      • Name (required): The human-readable name of the runtime
      • +
      • Key (required): The unique string identifier
      • +
      • Description (required): A brief description of the runtime
      • +
      • Website (optional): The primary website for the runtime
      • +
      • Repository (optional): The source code repository URL, if available
      • +
      • Deprecated (required): A boolean indicating whether the key is deprecated
      • +
      +
      +
      + + +

      Canonical source for runtime keys

      +

      The following table lists all previously recorded runtime keys, sorted alphabetically by organisation.

      + + +

      This section is generated from the machine-readable source data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      OrganizationNameKeyDescriptionWebsiteRepository
      Alibaba Cloudedge-routineedge-routineThe JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.Website-
      ArvancloudEdge ComputingarvancloudThe JavaScript runtime that powers Arvancloud Edge Computing.Website-
      AzionEdge FunctionsazionAzion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing.Website-
      CloudflareworkerdworkerdThe JavaScript / WebAssembly runtime that powers Cloudflare Workers.WebsiteRepository
      Deno LandDenodenoA modern runtime for JavaScript and TypeScript.WebsiteRepository
      FastlyJavaScript on Compute@EdgefastlyJavaScript runtime for Fastly Compute@Edge.WebsiteRepository
      KieselKieselkieselA JavaScript engine and runtime written in Zig.WebsiteRepository
      LagonLagon RuntimelagonLagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge.WebsiteRepository
      MetaReact Nativereact-nativeA framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).WebsiteRepository
      ModdableModdable SDKmoddableOpen source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs.WebsiteRepository
      NetlifyEdge FunctionsnetlifyEdge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge.WebsiteRepository
      OpenJS FoundationElectronelectronBuild cross-platform desktop apps with JavaScript, HTML, and CSS.WebsiteRepository
      OpenJS FoundationNode.jsnodeNode.js is an open-source, cross-platform JavaScript runtime environment.WebsiteRepository
      OvenBunbunIncredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.WebsiteRepository
      ReactServer Componentsreact-serverUsed by React Server Components.WebsiteRepository
      VercelEdge Lightedge-lightDeveloping, testing, and defining the runtime Web APIs for Edge infrastructure.WebsiteRepository
      WasmerWasmer EdgewasmerThe JavaScript runtime that brings JavaScript to Wasmer Edge.WebsiteRepository
      +
      +
      + + +

      Governance and modification process

      + + +

      Proposing new runtime key entries

      +

      All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the attributes specified in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

      + + +

      Proposal process

      + + 1. The proposer creates a pull request in the runtime-keys repository. + 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). + 1. The entry includes all mandatory metadata fields as described in . + 1. The entry is inserted in alphabetical order by organisation. + 1. [id="step-approval-process"] The pull request is reviewed by WinterTC participants. + 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. + 1. The pull request is formally approved at a TC55 plenary meeting before merging. + 1. After plenary approval, designated editors merge the pull request and update the current draft Report. + +
      + + +

      Expert review

      +

      All proposed entries undergo expert review to ensure compliance with the naming guidelines specified in and other expectations. Reviewers evaluate whether:

      +
        +
      • the proposed key is appropriately specific and non-generic,
      • +
      • the runtime has demonstrated proof of use or adoption,
      • +
      • the key does not conflict with existing entries or Browserslist identifiers, and
      • +
      • the metadata is complete and accurate.
      • +
      +
      +
      + + +

      Modifying entries

      + + +

      Metadata modification

      +

      Modifications to runtime metadata (organisation, name, description, website, or repository) follow the same process as adding entries:

      + + 1. The proposer creates a pull request modifying the entry in runtime-keys.json. + 1. The proposal continues as described starting at step in the approval process. + +
      + + +

      Key immutability

      +

      To prevent breaking existing tools and configurations that depend on runtime keys, runtime keys are immutable and will not be modified except in extraordinary circumstances requiring plenary consensus.

      +
      + + +

      Deprecation

      +

      Runtime keys may be deprecated to indicate that a runtime project is inactive or discontinued. To deprecate a key:

      + + 1. The proposer creates a pull request setting the `deprecated` field to `true` in runtime-keys.json. + 1. The proposal continues as described starting at step in the approval process. + + +

      Deprecated keys may be undeprecated if the original runtime project resumes activity, following the same approval process. Implementations should not add support for deprecated keys.

      + + +

      Deprecated keys remain in the Report to preserve historical information and prevent reuse that could cause confusion.

      +
      +
      +
      + + +

      Publication cadence

      +

      This Report is published on a semi-annual basis as an ECMA Technical Report. Changes approved at TC55 plenary meetings between publication cycles can be found in the publicly-available draft maintained in the WinterTC runtime-keys repository.

      +
      +
      + + +

      Machine-readable canonical source

      +

      The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

      + + +

      JSON schema

      +

      The runtime keys source data JSON file conforms to the following structure:

      +
      {
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "title": "Runtime Keys",
      +  "description": "A collection of runtime keys for ECMAScript runtime environments",
      +  "version": "1.0.0",
      +  "lastModified": "YYYY-MM-DD",
      +  "runtimes": [
      +    {
      +      "organization": "string (required)",
      +      "name": "string (required)",
      +      "key": "string (required)",
      +      "description": "string (required)",
      +      "website": "string | null (optional)",
      +      "repository": "string | null (optional)",
      +      "deprecated": "boolean (required, default: false)"
      +    }
      +  ]
      +}
      +
      + + +

      Accessing the source data

      +

      The current machine-readable source is available at:

      +
        +
      • Draft version: https://github.com/WinterTC55/runtime-keys/blob/main/runtime-keys.json
      • +
      • Published version: To be determined upon ECMA TR publication
      • +
      +
      +
      + + +

      Example usage

      +

      This annex provides non-normative examples of how runtime keys may be used in practice.

      + + +

      This specification does not prescribe how runtime keys should be used. The following examples are illustrative only.

      +
      + + +

      package.json example

      +

      A library package might use runtime keys in its package.json to specify conditional exports and runtime version requirements:

      +
      {
      +  "name": "example-library",
      +  "version": "1.0.0",
      +  "exports": {
      +    "node": "./dist/node/index.js",
      +    "deno": "./dist/deno/index.js",
      +    "bun": "./dist/bun/index.js",
      +    "workerd": "./dist/workerd/index.js"
      +  },
      +  "engines": {
      +    "node": ">=18",
      +    "deno": ">=1.30",
      +    "bun": ">=1.0"
      +  }
      +}
      +
      + + +

      Configuration File Example

      +

      A build tool or framework might use runtime keys to specify runtime-specific configuration:

      +
      {
      +  "runtimes": {
      +    "node": {
      +      "outputDir": "./dist/node",
      +      "target": "ES2022"
      +    },
      +    "deno": {
      +      "outputDir": "./dist/deno",
      +      "target": "ES2022"
      +    },
      +    "workerd": {
      +      "outputDir": "./dist/workerd",
      +      "target": "ES2022",
      +      "polyfills": ["node:buffer"]
      +    }
      +  }
      +}
      +
      +
      + + +

      Bibliography

      +

      + ECMA-262, ECMAScript® Language Specification
      + https://tc39.es/ecma262/multipage/ +

      +
      + + diff --git a/spec.html b/spec.html index 7a0b2e5..029655a 100644 --- a/spec.html +++ b/spec.html @@ -67,7 +67,7 @@

      Runtime key structure

      Key format

      -

      A runtime key satisfies all of the following conditions:

      +

      A runtime key satisfies all of the following:

      • It is a string value.
      • It is usable in common configuration formats such as JSON and YAML.
      • @@ -148,142 +148,7 @@

        Canonical source for runtime keys

        - - Alibaba Cloud - edge-routine - edge-routine - The JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine. - Website - - - - - Arvancloud - Edge Computing - arvancloud - The JavaScript runtime that powers Arvancloud Edge Computing. - Website - - - - - Azion - Edge Functions - azion - Azion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing. - Website - - - - - Cloudflare - workerd - workerd - The JavaScript / WebAssembly runtime that powers Cloudflare Workers. - Website - Repository - - - Deno Land - Deno - deno - A modern runtime for JavaScript and TypeScript. - Website - Repository - - - Fastly - JavaScript on Compute@Edge - fastly - JavaScript runtime for Fastly Compute@Edge. - Website - Repository - - - Kiesel - Kiesel - kiesel - A JavaScript engine and runtime written in Zig. - Website - Repository - - - Lagon - Lagon Runtime - lagon - Lagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge. - Website - Repository - - - Meta - React Native - react-native - A framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web). - Website - Repository - - - Moddable - Moddable SDK - moddable - Open source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs. - Website - Repository - - - Netlify - Edge Functions - netlify - Edge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge. - Website - Repository - - - OpenJS Foundation - Electron - electron - Build cross-platform desktop apps with JavaScript, HTML, and CSS. - Website - Repository - - - OpenJS Foundation - Node.js - node - Node.js is an open-source, cross-platform JavaScript runtime environment. - Website - Repository - - - Oven - Bun - bun - Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one. - Website - Repository - - - React - Server Components - react-server - Used by React Server Components. - Website - Repository - - - Vercel - Edge Light - edge-light - Developing, testing, and defining the runtime Web APIs for Edge infrastructure. - Website - Repository - - - Wasmer - Wasmer Edge - wasmer - The JavaScript runtime that brings JavaScript to Wasmer Edge. - Website - Repository - + @@ -293,19 +158,19 @@

        Canonical source for runtime keys

        Governance and modification process

        -

        Proposing entries for future editions

        +

        Proposing new runtime key entries

        All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the attributes specified in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

        Proposal process

        - 1. The proposer creates a pull request in the runtime-keys repository. + 1. The proposer creates a pull request in the runtime-keys repository. 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). 1. The entry includes all mandatory metadata fields as described in . 1. The entry is inserted in alphabetical order by organisation. 1. [id="step-approval-process"] The pull request is reviewed by WinterTC participants. 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. - 1. The pull request is be formally approved at a TC55 plenary meeting before merging. + 1. The pull request is formally approved at a TC55 plenary meeting before merging. 1. After plenary approval, designated editors merge the pull request and update the current draft Report.
        @@ -363,7 +228,7 @@

        Publication cadence

        Machine-readable canonical source

        -

        The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

        +

        The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

        JSON schema

        From 38a8ebaf9ae507c65aa6306fa15564b2a2969be1 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Fri, 3 Apr 2026 07:43:39 -0600 Subject: [PATCH 04/10] Apply suggestions from code review Co-authored-by: Aki --- spec.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spec.html b/spec.html index 029655a..98a31a5 100644 --- a/spec.html +++ b/spec.html @@ -15,7 +15,7 @@ @@ -29,7 +29,7 @@

        Introduction

        Scope

        -

        Runtime keys provide a consistent and predictable mechanism for identifying ECMAScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. This document focusses on providing informative identifiers primarily for web servers, though other ECMAScript server environments may find it useful. These keys are not intended to be used in web browsers, which should be referenced by other mechanisms such as the browserslist project.

        +

        Runtime keys provide a consistent and predictable mechanism for identifying ECMAScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. This document focuses on providing informative identifiers primarily for web servers, though other ECMAScript server environments may find it useful. These keys are not intended to be used in web browsers, which should be referenced by other mechanisms such as the browserslist project.

        This Report defines:

        • the canonical source of runtime keys and associated metadata,
        • @@ -53,7 +53,7 @@

          Terms and definitions

          ECMAScript runtime

          -

          implementation of the ECMA-262 ECMAScript langauge specification

          +

          implementation of the ECMA-262 ECMAScript language specification

          @@ -129,10 +129,10 @@

          Runtime metadata

          Canonical source for runtime keys

          -

          The following table lists all previously recorded runtime keys, sorted alphabetically by organisation.

          +

          The following table lists runtime keys submitted to TC55 and reviewed by the Committee, sorted alphabetically by organisation.

          -

          This section is generated from the machine-readable source data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

          +

          This section is generated from the machine-readable source data (see ).

          @@ -159,16 +159,16 @@

          Governance and modification process

          Proposing new runtime key entries

          -

          All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the attributes specified in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

          +

          All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the structure as described in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

          Proposal process

          - 1. The proposer creates a pull request in the runtime-keys repository. + 1. The proposer creates a pull request in the WinterTC55/runtime-keys GitHub repository. 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). 1. The entry includes all mandatory metadata fields as described in . 1. The entry is inserted in alphabetical order by organisation. - 1. [id="step-approval-process"] The pull request is reviewed by WinterTC participants. + 1. [id="step-approval-process"] The pull request is reviewed by TC55 participants. 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. 1. The pull request is formally approved at a TC55 plenary meeting before merging. 1. After plenary approval, designated editors merge the pull request and update the current draft Report. @@ -226,7 +226,7 @@

          Publication cadence

          - +

          Machine-readable canonical source

          The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

          @@ -258,14 +258,14 @@

          Accessing the source data

          The current machine-readable source is available at:

          • Draft version: https://github.com/WinterTC55/runtime-keys/blob/main/runtime-keys.json
          • -
          • Published version: To be determined upon ECMA TR publication
          • +
          • Published version: To be determined upon Ecma TR publication

          Example usage

          -

          This annex provides non-normative examples of how runtime keys may be used in practice.

          +

          This Annex provides informative examples of how runtime keys may be used in practice.

          This specification does not prescribe how runtime keys should be used. The following examples are illustrative only.

          From c6aebe530836503ac006fd75e1fe94c048165cd9 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Fri, 3 Apr 2026 10:40:28 -0600 Subject: [PATCH 05/10] update spec.html for remaining review feedback --- spec.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spec.html b/spec.html index 98a31a5..260980d 100644 --- a/spec.html +++ b/spec.html @@ -42,7 +42,7 @@

          Scope

          -

          Inclusion in this Report does not imply that the specified runtime is conformant with any ECMA TC55 specification, including the WinterTC Minimum Common API. Inclusion does not imply endorsement of any kind.

          +

          Inclusion in this Report does not imply that the specified runtime is fully conformant with any Ecma specification, including the WinterTC Minimum Common API. Inclusion does not imply endorsement of any kind.

          @@ -86,7 +86,7 @@

          Key uniqueness

          • any other existing runtime key in this Report, or
          • - any existing Browserslist browser entries. + any existing Browserslist browser entries. This explicitly excludes references to server runtimes within Browserslist.
          @@ -184,6 +184,7 @@

          Expert review

        • the key does not conflict with existing entries or Browserslist identifiers, and
        • the metadata is complete and accurate.
        +

        TC55 may reject a runtime key submission for any reason, including those not enumerated in the above sections. In such a scenario, the Committee will provide that reason and information on how to resolve any issue.

        @@ -222,7 +223,7 @@

        Deprecation

        Publication cadence

        -

        This Report is published on a semi-annual basis as an ECMA Technical Report. Changes approved at TC55 plenary meetings between publication cycles can be found in the publicly-available draft maintained in the WinterTC runtime-keys repository.

        +

        This Report is published on a semi-annual basis as an ECMA Technical Report at https://runtime-keys.proposal.wintercg.org/. Changes approved at TC55 plenary meetings between publication cycles can be found in the publicly-available draft maintained in the WinterTC runtime-keys repository.

        From d67dbd26beb15aedc0b6cd9068260068c267d531 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Fri, 3 Apr 2026 10:42:15 -0600 Subject: [PATCH 06/10] update package.json to enforce dep and runtime versions --- README.md | 4 +- package-lock.json | 506 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 7 +- 3 files changed, 507 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d0595eb..60e2e7c 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,6 @@ To get started, run `npm install` to install project dependencies To build the report run `npm run build` -To view the report open `out.html` \ No newline at end of file +To view the report open `out.html` + +To run the build process in watch mode use `npm run watch`. This script concurrently executes the `build.mjs` script for producing the injected spec document and the `ecmarkup` process for generating the `out.html` file. diff --git a/package-lock.json b/package-lock.json index 9ace392..c6e082e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,11 @@ "name": "runtime-keys", "version": "1.0.0", "devDependencies": { - "concurrently": "^9.2.1", - "ecmarkup": "^23.0.2" + "concurrently": "9.2.1", + "ecmarkup": "24.1.0" + }, + "engines": { + "node": ">= 24" } }, "node_modules/@asamuzakjp/css-color": { @@ -287,6 +290,56 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -325,6 +378,19 @@ "node": ">= 8" } }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -388,6 +454,13 @@ "dev": true, "license": "MIT" }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -401,6 +474,13 @@ "node": ">=8" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -415,6 +495,17 @@ "node": ">= 0.4" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -432,6 +523,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -600,6 +704,16 @@ "node": ">=8" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/concurrently": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", @@ -641,6 +755,86 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/cssstyle": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", @@ -728,6 +922,89 @@ "node": ">=0.4.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -754,13 +1031,14 @@ } }, "node_modules/ecmarkup": { - "version": "23.0.2", - "resolved": "https://registry.npmjs.org/ecmarkup/-/ecmarkup-23.0.2.tgz", - "integrity": "sha512-hnCtidy6d8o3TJcT64PTSRFwH+lgQXtr8F8eyImDaygzbh38OZWILqIphYTpDMd0wwoBai8nG5oB+QFms6eLGA==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/ecmarkup/-/ecmarkup-24.1.0.tgz", + "integrity": "sha512-mdS/6VB9WKdEOeR3SEMl6u1ML7T1A6dif+8q5XxSTK73F2JXjJwpY04FoM+a3w/S3acepb2cvFxB+0r3yIE0xg==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", + "clean-css": "^5.3.3", "command-line-args": "^5.2.0", "command-line-usage": "^6.1.1", "dedent-js": "^1.0.1", @@ -770,19 +1048,22 @@ "grammarkdown": "^3.3.2", "highlight.js": "11.0.1", "html-escape": "^1.0.2", + "html-minifier-terser": "^7.2.0", "js-yaml": "^3.13.1", "jsdom": "^25.0.1", "nwsapi": "2.2.0", "parse5": "^6.0.1", "prex": "^0.4.7", - "promise-debounce": "^1.0.1" + "promise-debounce": "^1.0.1", + "svgo": "^4.0.1", + "terser": "^5.46.1" }, "bin": { "ecmarkup": "bin/ecmarkup.js", "emu-format": "bin/emu-format.js" }, "engines": { - "node": ">= 18" + "node": ">= 24" } }, "node_modules/emoji-regex": { @@ -1164,6 +1445,41 @@ "dev": true, "license": "Public Domain" }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -1344,6 +1660,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1361,6 +1687,13 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1415,6 +1748,30 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -1422,6 +1779,17 @@ "dev": true, "license": "MIT" }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -1429,6 +1797,17 @@ "dev": true, "license": "MIT" }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1509,6 +1888,16 @@ "node": ">=6" } }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1578,6 +1967,16 @@ "dev": true, "license": "MIT" }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -1604,6 +2003,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1652,6 +2082,42 @@ "node": ">=8" } }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -1695,6 +2161,32 @@ "node": ">=8" } }, + "node_modules/terser": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/tldts": { "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", diff --git a/package.json b/package.json index 8f1a25a..bc0ab13 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,10 @@ "watch": "concurrently 'node --watch-path=./runtime-keys.json --watch-path=./spec.html build.mjs' 'ecmarkup --watch --verbose --lint-spec spec-injected.html out.html'" }, "devDependencies": { - "concurrently": "^9.2.1", - "ecmarkup": "^23.0.2" + "concurrently": "9.2.1", + "ecmarkup": "24.1.0" + }, + "engines": { + "node": ">= 24" } } From 8321d78492be4ec3bba6b5c5b289dc1dedf708ad Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Fri, 3 Apr 2026 10:43:20 -0600 Subject: [PATCH 07/10] remove old files, update gitignore --- .gitignore | 5 +- index.bs | 282 --------------------------- spec-injected.html | 460 --------------------------------------------- 3 files changed, 2 insertions(+), 745 deletions(-) delete mode 100644 index.bs delete mode 100644 spec-injected.html diff --git a/.gitignore b/.gitignore index 603ff8c..d882ef8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -index.html -.vercel node_modules/ -out.html \ No newline at end of file +out.html +spec-injected.html \ No newline at end of file diff --git a/index.bs b/index.bs deleted file mode 100644 index 9021321..0000000 --- a/index.bs +++ /dev/null @@ -1,282 +0,0 @@ - - - -Introduction {#intro} -===================== - -This proposal defines a list of keys that represent various runtime environments. - -These keys can be used in a variety of ways, and should be considered a reliable representation of the given runtime. - -For example, they may be used in a project configuration file to indicate the given project supports the specified runtime. - -This specification does not detail how the keys can be used; that is left up to community developed tools. - -The point of this proposal is to only define what the keys are in order to prevent conflicts, and provide users a reliable list of platforms they can build tooling around. - -Inclusion in this registry does not imply that the specified runtime is conformant with the WinterCG [Minimum Common API](https://proposal-common-min-api.deno.dev/). - -Inclusing in this registry does not imply endorsement of any kind. - -## Example Usage ## {#example-usage} - -One example of how these keys may be used (remember, this proposal does not specify how the keys are to be used) is within `package.json` files for projects hosted on npm. - -The following `package.json` file demonstrates a library that exports separate outputs for Node.js and Deno, as well as specifies which versions of each runtime it supports. - -```json -{ - "name": "the-library", - "version": "1.0.0", - "exports": { - "node": "./dist/node/index.js", - "deno": "./dist/deno/index.js" - }, - "engines": { - "node": ">=16", - "deno": ">=1.10" - } -} -``` - -Keys {#keys} -============ - -## Alibaba Cloud - edge-routine ## {#edge-routine} - -The JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine. - -Key: `edge-routine` - -Website: [https://www.alibabacloud.com/help/en/dynamic-route-for-cdn/latest/er-overview](https://www.alibabacloud.com/help/en/dynamic-route-for-cdn/latest/er-overview) - -## Arvancloud Edge Computing ## {#arvancloud} - -The JavaScript runtime that powers Arvancloud Edge Computing. - -Key: `arvancloud` - -Website: [https://www.arvancloud.ir/en/products/edge-computing](https://www.arvancloud.ir/en/products/edge-computing) - -## Azion - Edge Functions ## {#azion} - -Azion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing. - -Key: `azion` - -Website: [https://www.azion.com/en/products/edge-functions/](https://www.azion.com/en/products/edge-functions/) - -## Cloudflare - workerd ## {#workerd} - -The JavaScript / WebAssembly runtime that powers Cloudflare Workers. - -Key: `workerd` - -Website: [https://workers.cloudflare.com/](https://workers.cloudflare.com/) - -Repository: [https://github.com/cloudflare/workerd](https://github.com/cloudflare/workerd) - -## Deno Land - Deno ## {#deno} - -A modern runtime for JavaScript and TypeScript. - -Key: `deno` - -Website: [https://deno.com](https://deno.com) - -Repository: [https://github.com/denoland/deno](https://github.com/denoland/deno) - -## Lagon - Lagon Runtime ## {#lagon} - -Lagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge. - -Key: `lagon` - -Website: [https://lagon.app](https://lagon.app) - -Repository: [https://github.com/lagonapp/lagon](https://github.com/lagonapp/lagon) - -## Meta - React Native ## {#react-native} - -A framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web). - -Key: `react-native` - -Website: [https://reactnative.dev/](https://reactnative.dev/) - -Repository: [https://github.com/facebook/react-native](https://github.com/facebook/react-native) - -## Moddable - Moddable SDK ## {#moddable} - -Open source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs. - -Key: `moddable` - -Website: [https://www.moddable.com/](https://www.moddable.com/) - -Repository: [https://github.com/Moddable-OpenSource/moddable](https://github.com/Moddable-OpenSource/moddable) - -## Netlify - Edge Functions ## {#netlify} - -Edge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge. - -Key: `netlify` - -Website: [https://docs.netlify.com/edge-functions/overview/](https://docs.netlify.com/edge-functions/overview/) - -Repository: [https://github.com/netlify/edge-functions](https://github.com/netlify/edge-functions) - -## OpenJS Foundation - Electron ## {#electron} - -Build cross-platform desktop apps with JavaScript, HTML, and CSS. - -Key: `electron` - -Website: [https://www.electronjs.org/](https://www.electronjs.org/) - -Repository: [https://github.com/electron/electron](https://github.com/electron/electron) - -## OpenJS Foundation - Node.js ## {#node} - -Node.js is an open-source, cross-platform JavaScript runtime environment. - -Key: `node` - -Website: [https://nodejs.org](https://nodejs.org) - -Repository: [https://github.com/nodejs/node](https://github.com/nodejs/node) - -## Oven - Bun ## {#bun} - -Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one. - -Key: `bun` - -Website: [https://bun.sh/](https://bun.sh/) - -Repository: [https://github.com/oven-sh/bun](https://github.com/oven-sh/bun) - -## React - Server Components ## {#react-server} - -Used by React Server Components. - -Key: `react-server` - -Website: [https://react.dev/](https://react.dev/) - -Repository: [https://github.com/facebook/react](https://github.com/facebook/react) - - -## Vercel - Edge Light ## {#edge-light} - -Developing, testing, and defining the runtime Web APIs for Edge infrastructure. - -Key: `edge-light` - -Website: [https://edge-runtime.vercel.app/](https://edge-runtime.vercel.app/) - -Repository: [https://github.com/vercel/edge-runtime](https://github.com/vercel/edge-runtime) - -## Fastly - JavaScript on Compute@Edge ## {#fastly} - -JavaScript runtime for Fastly Compute@Edge. - -Key: `fastly` - -Website: [https://developer.fastly.com/learning/compute/javascript/](https://developer.fastly.com/learning/compute/javascript/) - -Repository: [https://github.com/fastly/js-compute-runtime](https://github.com/fastly/js-compute-runtime) - -## Kiesel ## {#kiesel} - -A JavaScript engine and runtime written in Zig. - -Key: `kiesel` - -Website: [https://kiesel.dev/](https://kiesel.dev/) - -Repository: [https://codeberg.org/kiesel-js/runtime](https://codeberg.org/kiesel-js/runtime) - -## Wasmer Edge ## {#wasmer} - -The JavaScript runtime that brings JavaScript to Wasmer Edge. - -Key: `wasmer` - -Website: [https://wasmer.io/products/edge](https://wasmer.io/products/edge) - -Repository: [https://github.com/wasmerio/winterjs](https://github.com/wasmerio/winterjs) - - - -Key Management {#key-management} -================================ - -## Adding a key ## {#adding-a-key} - -All JavaScript runtimes are welcome to create a key and add it to this list. New keys must not conflict with another existing key. Runtime entries on this list are encouraged, but not required, to participate in the community group. - -To propose a new key, create a pull request in [runtime-keys](https://github.com/wintercg/runtime-keys) repository that adds the desired key to the `index.bs` file using the following format: - -```md -## - ## {#} - - - -Key: \`\` - -Website: []() - -Repository: []() -``` - -The key should be inserted in alphabetical order based on the first character of the Runtime Organization. - -Keys should meaningfully represent the relative runtime and be a simple, string-like value so it can be used in common configuration formats such as JSON and YAML. - -Keys should also not conflict with existing [Browserlist entries](https://github.com/browserslist/browserslist#browsers). - -Entry pull requests must be approved by at least two active members of the community group that are not directly affiliated with the proposed runtime. - -## Modifying a key ## {#modifying-a-key} - -Modifying an entry requires opening a pull request and recieving two approvals from active community group members not affiliated with the relative runtime project. - -Modifications can be made to aspects such as the Organization, Name, Description, Website, and Repository. - -Aside from extraordinary circumstances, to prevent breaking tools built around this list, Keys are not modifiable. - -Keys may be deprecated to indicate inactive runtime projects. - -Deprecated Keys may be undeprecated and claimed by another runtime. - -To deprecate or undeprecate a key, open a pull request adding or removing `[Deprecated]` from the Name: - -```diff -+ ## [Deprecated] - ## {#} -- ## - ## {#} -``` diff --git a/spec-injected.html b/spec-injected.html deleted file mode 100644 index c90b393..0000000 --- a/spec-injected.html +++ /dev/null @@ -1,460 +0,0 @@ - - - - - - - - - - Runtime Keys - - - - - - -

        Introduction

        - -

        This Technical Report defines a canonical source for identifiers of unique ECMAScript runtime environments, known as runtime keys.

        -
        - - -

        Scope

        - -

        Runtime keys provide a consistent and predictable mechanism for identifying ECMAScript runtimes in a variety of contexts, including but not limited to project configuration files, package manifests, conditional exports, and runtime detection mechanisms. This document focusses on providing informative identifiers primarily for web servers, though other ECMAScript server environments may find it useful. These keys are not intended to be used in web browsers, which should be referenced by other mechanisms such as the browserslist project.

        -

        This Report defines:

        -
          -
        • the canonical source of runtime keys and associated metadata,
        • -
        • guidance for future ECMAScript runtimes to submit runtime keys, and
        • -
        • TC55's governance process for adding and modifying runtime keys to the Report.
        • -
        - - -

        This Report does not define how runtime keys should be used by tools or libraries. The purpose of this Report is to prevent conflicts and provide a reliable, authoritative source of runtime identifiers.

        -
        - - -

        Inclusion in this Report does not imply that the specified runtime is conformant with any ECMA TC55 specification, including the WinterTC Minimum Common API. Inclusion does not imply endorsement of any kind.

        -
        -
        - - -

        Terms and definitions

        - -

        For the purposes of this document, the following terms and definitions apply.

        - - -

        ECMAScript runtime

        -

        implementation of the ECMA-262 ECMAScript langauge specification

        -
        - - -

        runtime key

        -

        unique string identifier that represents a specific ECMAScript runtime environment

        -
        -
        - - -

        Runtime key structure

        - - -

        Key format

        -

        A runtime key satisfies all of the following:

        -
          -
        • It is a string value.
        • -
        • It is usable in common configuration formats such as JSON and YAML.
        • -
        • It meaningfully represents the associated runtime environment.
        • -
        • It is simple and unambiguous.
        • -
        - - -

        Future versions of this Report may define a formal grammar for allowable characters in runtime keys.

        -
        -
        - - -

        Key uniqueness

        -

        A runtime key included in this Report will not conflict with the following:

        -
          -
        • any other existing runtime key in this Report, or
        • -
        • - any existing Browserslist browser entries. - This explicitly excludes references to server runtimes within Browserslist. -
        • -
        -
        - - -

        Key naming guidelines

        -

        Runtime keys are subject to expert review by TC55. Acceptable keys will:

        -
          -
        • avoid being too similar to existing keys,
        • -
        • avoid similarity to common English words or offensive terms,
        • -
        • avoid being too generic or similar to general terminology such as "Web Runtimes", "Edge Runtimes", or "JavaScript Runtimes", and
        • -
        • demonstrate reasonable specificity and clarity.
        • -
        -
        - - -

        Runtime existence validation

        -

        The runtime environment represented by a key must actually exist, whether as open source, source-available, or proprietary software. Entries in this Report exist to identify real runtimes, not to reserve names for future projects.

        - - -

        A runtime should demonstrate "proof of use" before being added to the Report. Examples include usage in package.json exports fields, published documentation, or active community adoption.

        -
        -
        - - -

        Runtime metadata

        -

        Each runtime key entry includes the following metadata:

        -
          -
        • Organization (required): The organisation or individual responsible for the runtime
        • -
        • Name (required): The human-readable name of the runtime
        • -
        • Key (required): The unique string identifier
        • -
        • Description (required): A brief description of the runtime
        • -
        • Website (optional): The primary website for the runtime
        • -
        • Repository (optional): The source code repository URL, if available
        • -
        • Deprecated (required): A boolean indicating whether the key is deprecated
        • -
        -
        -
        - - -

        Canonical source for runtime keys

        -

        The following table lists all previously recorded runtime keys, sorted alphabetically by organisation.

        - - -

        This section is generated from the machine-readable source data (see ). In the build process, this content should be dynamically generated from runtime-keys.json.

        -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        OrganizationNameKeyDescriptionWebsiteRepository
        Alibaba Cloudedge-routineedge-routineThe JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.Website-
        ArvancloudEdge ComputingarvancloudThe JavaScript runtime that powers Arvancloud Edge Computing.Website-
        AzionEdge FunctionsazionAzion Edge Functions for ultra-low latency, edge-native applications, built with open standards for secure, high-performance serverless computing.Website-
        CloudflareworkerdworkerdThe JavaScript / WebAssembly runtime that powers Cloudflare Workers.WebsiteRepository
        Deno LandDenodenoA modern runtime for JavaScript and TypeScript.WebsiteRepository
        FastlyJavaScript on Compute@EdgefastlyJavaScript runtime for Fastly Compute@Edge.WebsiteRepository
        KieselKieselkieselA JavaScript engine and runtime written in Zig.WebsiteRepository
        LagonLagon RuntimelagonLagon is an open-source runtime and platform that allows developers to run TypeScript and JavaScript Functions at the Edge.WebsiteRepository
        MetaReact Nativereact-nativeA framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).WebsiteRepository
        ModdableModdable SDKmoddableOpen source runtime for resource-constrained embedded devices using standard JavaScript and TypeScript. Supports standard ECMA-419 APIs.WebsiteRepository
        NetlifyEdge FunctionsnetlifyEdge Functions connect the Netlify platform and workflow with an open runtime standard at the network edge.WebsiteRepository
        OpenJS FoundationElectronelectronBuild cross-platform desktop apps with JavaScript, HTML, and CSS.WebsiteRepository
        OpenJS FoundationNode.jsnodeNode.js is an open-source, cross-platform JavaScript runtime environment.WebsiteRepository
        OvenBunbunIncredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.WebsiteRepository
        ReactServer Componentsreact-serverUsed by React Server Components.WebsiteRepository
        VercelEdge Lightedge-lightDeveloping, testing, and defining the runtime Web APIs for Edge infrastructure.WebsiteRepository
        WasmerWasmer EdgewasmerThe JavaScript runtime that brings JavaScript to Wasmer Edge.WebsiteRepository
        -
        -
        - - -

        Governance and modification process

        - - -

        Proposing new runtime key entries

        -

        All ECMAScript runtimes are welcome to propose a key for inclusion in this Report, subject to the attributes specified in . Runtimes which contribute to this Report are encouraged, but not required, to participate in Ecma TC55.

        - - -

        Proposal process

        - - 1. The proposer creates a pull request in the runtime-keys repository. - 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). - 1. The entry includes all mandatory metadata fields as described in . - 1. The entry is inserted in alphabetical order by organisation. - 1. [id="step-approval-process"] The pull request is reviewed by WinterTC participants. - 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. - 1. The pull request is formally approved at a TC55 plenary meeting before merging. - 1. After plenary approval, designated editors merge the pull request and update the current draft Report. - -
        - - -

        Expert review

        -

        All proposed entries undergo expert review to ensure compliance with the naming guidelines specified in and other expectations. Reviewers evaluate whether:

        -
          -
        • the proposed key is appropriately specific and non-generic,
        • -
        • the runtime has demonstrated proof of use or adoption,
        • -
        • the key does not conflict with existing entries or Browserslist identifiers, and
        • -
        • the metadata is complete and accurate.
        • -
        -
        -
        - - -

        Modifying entries

        - - -

        Metadata modification

        -

        Modifications to runtime metadata (organisation, name, description, website, or repository) follow the same process as adding entries:

        - - 1. The proposer creates a pull request modifying the entry in runtime-keys.json. - 1. The proposal continues as described starting at step in the approval process. - -
        - - -

        Key immutability

        -

        To prevent breaking existing tools and configurations that depend on runtime keys, runtime keys are immutable and will not be modified except in extraordinary circumstances requiring plenary consensus.

        -
        - - -

        Deprecation

        -

        Runtime keys may be deprecated to indicate that a runtime project is inactive or discontinued. To deprecate a key:

        - - 1. The proposer creates a pull request setting the `deprecated` field to `true` in runtime-keys.json. - 1. The proposal continues as described starting at step in the approval process. - - -

        Deprecated keys may be undeprecated if the original runtime project resumes activity, following the same approval process. Implementations should not add support for deprecated keys.

        - - -

        Deprecated keys remain in the Report to preserve historical information and prevent reuse that could cause confusion.

        -
        -
        -
        - - -

        Publication cadence

        -

        This Report is published on a semi-annual basis as an ECMA Technical Report. Changes approved at TC55 plenary meetings between publication cycles can be found in the publicly-available draft maintained in the WinterTC runtime-keys repository.

        -
        -
        - - -

        Machine-readable canonical source

        -

        The authoritative, machine-readable form of the runtime key source is maintained as a JSON file: runtime-keys.json.

        - - -

        JSON schema

        -

        The runtime keys source data JSON file conforms to the following structure:

        -
        {
        -  "$schema": "https://json-schema.org/draft/2020-12/schema",
        -  "title": "Runtime Keys",
        -  "description": "A collection of runtime keys for ECMAScript runtime environments",
        -  "version": "1.0.0",
        -  "lastModified": "YYYY-MM-DD",
        -  "runtimes": [
        -    {
        -      "organization": "string (required)",
        -      "name": "string (required)",
        -      "key": "string (required)",
        -      "description": "string (required)",
        -      "website": "string | null (optional)",
        -      "repository": "string | null (optional)",
        -      "deprecated": "boolean (required, default: false)"
        -    }
        -  ]
        -}
        -
        - - -

        Accessing the source data

        -

        The current machine-readable source is available at:

        -
          -
        • Draft version: https://github.com/WinterTC55/runtime-keys/blob/main/runtime-keys.json
        • -
        • Published version: To be determined upon ECMA TR publication
        • -
        -
        -
        - - -

        Example usage

        -

        This annex provides non-normative examples of how runtime keys may be used in practice.

        - - -

        This specification does not prescribe how runtime keys should be used. The following examples are illustrative only.

        -
        - - -

        package.json example

        -

        A library package might use runtime keys in its package.json to specify conditional exports and runtime version requirements:

        -
        {
        -  "name": "example-library",
        -  "version": "1.0.0",
        -  "exports": {
        -    "node": "./dist/node/index.js",
        -    "deno": "./dist/deno/index.js",
        -    "bun": "./dist/bun/index.js",
        -    "workerd": "./dist/workerd/index.js"
        -  },
        -  "engines": {
        -    "node": ">=18",
        -    "deno": ">=1.30",
        -    "bun": ">=1.0"
        -  }
        -}
        -
        - - -

        Configuration File Example

        -

        A build tool or framework might use runtime keys to specify runtime-specific configuration:

        -
        {
        -  "runtimes": {
        -    "node": {
        -      "outputDir": "./dist/node",
        -      "target": "ES2022"
        -    },
        -    "deno": {
        -      "outputDir": "./dist/deno",
        -      "target": "ES2022"
        -    },
        -    "workerd": {
        -      "outputDir": "./dist/workerd",
        -      "target": "ES2022",
        -      "polyfills": ["node:buffer"]
        -    }
        -  }
        -}
        -
        -
        - - -

        Bibliography

        -

        - ECMA-262, ECMAScript® Language Specification
        - https://tc39.es/ecma262/multipage/ -

        -
        - - From f2609763fe9f5efcac44c86430dc81357bd5f4d2 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Mon, 27 Apr 2026 09:25:20 -0600 Subject: [PATCH 08/10] update workflow --- .github/workflows/deploy.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 49564c7..b049fc9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,14 +11,25 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v2 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2 - - name: Build spec + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e #v6.4.0 + with: + node-version: 24 + + - name: Install Deps + run: npm install + + - name: Build + run: npm run build + + - name: Create `out` dir run: | mkdir -p out - curl --retry 2 --fail https://api.csswg.org/bikeshed/ --output out/index.html --header "Accept: text/plain, text/html" -F die-on=fatal -F file=@"index.bs" + mv out.html out/index.html - - name: Upload to Deno Deploy + - name: Upload `out` to Deno Deploy uses: denoland/deployctl@v1 with: project: "wintercg-runtime-keys" From 0c0dd62ab80ebeb4f3a83fe50a308f8729171d12 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Tue, 28 Apr 2026 11:56:00 -0600 Subject: [PATCH 09/10] Add pending runtimes to technical report (#33) * add pending runtimes * add pythonmonkey and andromeda. order by key --- runtime-keys.json | 138 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 96 insertions(+), 42 deletions(-) diff --git a/runtime-keys.json b/runtime-keys.json index d0699d5..4d879cc 100644 --- a/runtime-keys.json +++ b/runtime-keys.json @@ -6,12 +6,12 @@ "lastModified": "2026-01-20", "runtimes": [ { - "organization": "Alibaba Cloud", - "name": "edge-routine", - "key": "edge-routine", - "description": "The JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.", - "website": "https://www.alibabacloud.com/help/en/dynamic-route-for-cdn/latest/er-overview", - "repository": null, + "organization": "Andromeda", + "name": "Andromeda", + "key": "andromeda", + "description": "A modern, and secure JavaScript & TypeScript runtime built in Rust, powered by the Nova engine and Oxc. Provides zero-config TypeScript, rich Web APIs (Canvas, Web Crypto, Storage, HTTP, SQLite), and aims for WinterTC compliance.", + "website": "https://tryandromeda.dev", + "repository": "https://github.com/tryandromeda/andromeda", "deprecated": false }, { @@ -33,12 +33,21 @@ "deprecated": false }, { - "organization": "Cloudflare", - "name": "workerd", - "key": "workerd", - "description": "The JavaScript / WebAssembly runtime that powers Cloudflare Workers.", - "website": "https://workers.cloudflare.com/", - "repository": "https://github.com/cloudflare/workerd", + "organization": "Oven", + "name": "Bun", + "key": "bun", + "description": "Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.", + "website": "https://bun.sh/", + "repository": "https://github.com/oven-sh/bun", + "deprecated": false + }, + { + "organization": "Convex", + "name": "Convex Runtime", + "key": "convex", + "description": "The JavaScript runtime used to execute deterministic Query and Mutation Functions as well as nondeterministic Action Functions in the Convex backend platform.", + "website": "https://docs.convex.dev/functions/runtimes#default-convex-runtime", + "repository": "https://github.com/get-convex/convex-backend", "deprecated": false }, { @@ -50,6 +59,33 @@ "repository": "https://github.com/denoland/deno", "deprecated": false }, + { + "organization": "Vercel", + "name": "Edge Light", + "key": "edge-light", + "description": "Developing, testing, and defining the runtime Web APIs for Edge infrastructure.", + "website": "https://edge-runtime.vercel.app/", + "repository": "https://github.com/vercel/edge-runtime", + "deprecated": false + }, + { + "organization": "Alibaba Cloud", + "name": "edge-routine", + "key": "edge-routine", + "description": "The JavaScript/Webassembly runtime that powers Alibaba Cloud edge-routine.", + "website": "https://www.alibabacloud.com/help/en/dynamic-route-for-cdn/latest/er-overview", + "repository": null, + "deprecated": false + }, + { + "organization": "OpenJS Foundation", + "name": "Electron", + "key": "electron", + "description": "Build cross-platform desktop apps with JavaScript, HTML, and CSS.", + "website": "https://www.electronjs.org/", + "repository": "https://github.com/electron/electron", + "deprecated": false + }, { "organization": "Fastly", "name": "JavaScript on Compute@Edge", @@ -77,15 +113,6 @@ "repository": "https://github.com/lagonapp/lagon", "deprecated": false }, - { - "organization": "Meta", - "name": "React Native", - "key": "react-native", - "description": "A framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).", - "website": "https://reactnative.dev/", - "repository": "https://github.com/facebook/react-native", - "deprecated": false - }, { "organization": "Moddable", "name": "Moddable SDK", @@ -104,15 +131,6 @@ "repository": "https://github.com/netlify/edge-functions", "deprecated": false }, - { - "organization": "OpenJS Foundation", - "name": "Electron", - "key": "electron", - "description": "Build cross-platform desktop apps with JavaScript, HTML, and CSS.", - "website": "https://www.electronjs.org/", - "repository": "https://github.com/electron/electron", - "deprecated": false - }, { "organization": "OpenJS Foundation", "name": "Node.js", @@ -123,12 +141,39 @@ "deprecated": false }, { - "organization": "Oven", - "name": "Bun", - "key": "bun", - "description": "Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.", - "website": "https://bun.sh/", - "repository": "https://github.com/oven-sh/bun", + "organization": "Fabrice Bellard", + "name": "QuickJS", + "key": "quickjs", + "description": "QuickJS is a small and embeddable Javascript engine.", + "website": "https://bellard.org/quickjs/", + "repository": "https://github.com/bellard/quickjs", + "deprecated": false + }, + { + "organization": "QuickJS-NG", + "name": "QuickJS-NG", + "key": "quickjs-ng", + "description": "A fork of the original QuickJS project by Fabrice Bellard and Charlie Gordon.", + "website": "https://quickjs-ng.github.io/quickjs/", + "repository": "https://github.com/quickjs-ng/quickjs", + "deprecated": false + }, + { + "organization": "Distributive", + "name": "PythonMonkey", + "key": "pythonmonkey", + "description": "Mozilla JS engine embedded into a Python host environment with cross-platform datatypes and event loop.", + "website": "https://pythonmonkey.io", + "repository": "https://github.com/Distributive-Network/PythonMonkey", + "deprecated": false + }, + { + "organization": "Meta", + "name": "React Native", + "key": "react-native", + "description": "A framework for building native apps using React. This key represents supported React Native JS runtimes on native platforms (excludes react-native-web).", + "website": "https://reactnative.dev/", + "repository": "https://github.com/facebook/react-native", "deprecated": false }, { @@ -141,12 +186,12 @@ "deprecated": false }, { - "organization": "Vercel", - "name": "Edge Light", - "key": "edge-light", - "description": "Developing, testing, and defining the runtime Web APIs for Edge infrastructure.", - "website": "https://edge-runtime.vercel.app/", - "repository": "https://github.com/vercel/edge-runtime", + "organization": "Mozilla", + "name": "Rhino", + "key": "rhino", + "description": "Rhino is an open-source implementation of JavaScript written entirely in Java.", + "website": "https://rhino.github.io/", + "repository": "https://github.com/mozilla/rhino", "deprecated": false }, { @@ -157,6 +202,15 @@ "website": "https://wasmer.io/products/edge", "repository": "https://github.com/wasmerio/winterjs", "deprecated": false + }, + { + "organization": "Cloudflare", + "name": "workerd", + "key": "workerd", + "description": "The JavaScript / WebAssembly runtime that powers Cloudflare Workers.", + "website": "https://workers.cloudflare.com/", + "repository": "https://github.com/cloudflare/workerd", + "deprecated": false } ] } From 8676cae674c2f9b7957b2181cc149af9fd2c359c Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Tue, 28 Apr 2026 12:22:32 -0600 Subject: [PATCH 10/10] order by key, fix table rendering --- build.mjs | 18 +++++++++++++----- spec.html | 9 +++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/build.mjs b/build.mjs index 3f4b02e..6899ea1 100644 --- a/build.mjs +++ b/build.mjs @@ -16,15 +16,23 @@ function escapeHtml(str) { .replace(/"/g, """); } +function links(runtimeKey) { + let str = ''; + if (runtimeKey.website) { + str += `
        Website` + } + if (runtimeKey.repository) { + str += `
        Repository` + } + return str; +} + const rows = runtimes // intentional whitespace so output is human readable .map((r) => ` - ${escapeHtml(r.organization)} - ${escapeHtml(r.name)} ${escapeHtml(r.key)} - ${escapeHtml(r.description)} - ${r.website ? `Website` : "-"} - ${r.repository ? `Repository` : "-"} + ${escapeHtml(r.organization)} / ${escapeHtml(r.name)} + ${escapeHtml(r.description)}${links(r)} ` ) .join("\n"); diff --git a/spec.html b/spec.html index 260980d..eb3546e 100644 --- a/spec.html +++ b/spec.html @@ -139,12 +139,9 @@

        Canonical source for runtime keys

        - - - - - + + @@ -167,7 +164,7 @@

        Proposal process

        1. The proposer creates a pull request in the WinterTC55/runtime-keys GitHub repository. 1. The pull request adds the runtime entry to the machine-readable source data file (runtime-keys.json). 1. The entry includes all mandatory metadata fields as described in . - 1. The entry is inserted in alphabetical order by organisation. + 1. The entry is inserted in alphabetical order by key. 1. [id="step-approval-process"] The pull request is reviewed by TC55 participants. 1. At least two delegates within TC55 not directly affiliated with the proposed runtime approve the pull request. 1. The pull request is formally approved at a TC55 plenary meeting before merging.
        OrganizationName KeyDescriptionWebsiteRepositoryOrganization / NameDescription, Website, Repository