Exemple
@babel/plugin-transform-async-generator-functions 8.0.1
Échantillon vérifié pour npm @babel/plugin-transform-async-generator-functions 8.0.1. Le contrat s'est exécuté sur node 22 · linux alpine/x64 · docker et a…
sha256:c7e529abd1c19429fdf67e90d2d3bbb5436ead92010c93c60dd4b0cd920dd6a3
Ce réseau offre une seule chose : un échantillon qui compile. Il l'a exécuté dans un bac à sable et conservé le reçu signé. Il ne note rien et ne garantit rien : si le même code compile chez vous, il ne l'a pas mesuré.
Combien de clés de signature distinctes ont déposé un reçu de contrat réussi. Une seule, c'est l'auteur ; plus d'une signifie que quelqu'un d'autre l'a compilé aussi. Une clé est auto-générée sans identité enregistrée derrière, donc on compte des clés, pas des personnes.
MIT-0
Preuves d'exécution
L'environnement déclaré et les exécutions signées sont séparés, pour que vous voyiez exactement ce que cet échantillon a exécuté et où.
- Base de preuve
- Contrat signé réussi
- Reçus de vérification
- 1
- Clés de signature qui l’ont compilé
- 1
Environnement déclaré
linux 24 · ubuntu · glibc 2.39 x64 npm
Environnements des exécutions de vérification
| Environnement | Contrat | Étapes | Exécution |
|---|---|---|---|
| node 22 · linux alpine/x64 · docker ed25519:c1973797be207ac4 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1node:22-alpine@sha256:c610fcdfb1d5… |
2026-08-27 |
Cas
HOW- Objectif
- verify pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1
- Créé
- 2026-08-27T20:51:58Z
Contrat
- Plugin default export is a function factory declaring Babel 7 and Babel 8 compatibility
- Plugin factory returns an object named transform-async-generator-functions with Program visitor
- Program visitor delegates traversal to internal function and loop visitors
- Function visitor ignores non-async functions without modification
- Function visitor attaches for-await-of visitor to async non-generator functions
- Function visitor attaches yield star visitor and flags async_generator_function on async generator functions
- Yield star visitor skips arrow functions and delegates yield star expressions with helper calls
- For-await visitor skips arrow functions and ignores non-await for-of loops
- Module helper utilities create plugin instance, identify async generators, and identify for-await statements
Fichiers
- PROMPT.md
- csx.json
- package-lock.json
- package.json
- spec.json
- src/index.mjs
- test/contract.mjs
Code source
Clean-room public code sample — generation instructions
Write a brand-new, minimal, self-contained code sample in this clean-room directory.
Do not copy, paraphrase, or reference any existing project source. Work only from this spec.
A csx.json manifest scaffold already exists. Do not recreate it from memory. Preserve its case.goal, packages and symbols; fill its empty case.contract with exact assertions and correct its environment, commands and verifierAdapter for the files you generate.
Goal: verify pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1
Kind: HOW
Use EXACTLY these public packages and versions:
- pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1
Rules:
- One focused purpose; the smallest project that proves the goal.
- Include a contract test (test/contract.*) that runs OFFLINE and exits 0 exactly when the goal behavior works.
- Pin every dependency with a lockfile so resolution is reproducible.
- No secrets, credentials, or tokens. No real URLs (only example.com or localhost). No absolute paths.
- No personal names, emails, company names, or project identifiers of any kind.
- No binaries and no generated output (node_modules, dist, target, venv, .git, .env).
- Keep it under 200 files and 256KB packed.
{"case":{"caseId":"case:sha256:dd89764b52a76e4f8612818f65ec08cd02d149b434af65d52ba05c5de20cd394","contract":["Plugin default export is a function factory declaring Babel 7 and Babel 8 compatibility","Plugin factory returns an object named transform-async-generator-functions with Program visitor","Program visitor delegates traversal to internal function and loop visitors","Function visitor ignores non-async functions without modification","Function visitor attaches for-await-of visitor to async non-generator functions","Function visitor attaches yield star visitor and flags async_generator_function on async generator functions","Yield star visitor skips arrow functions and delegates yield star expressions with helper calls","For-await visitor skips arrow functions and ignores non-await for-of loops","Module helper utilities create plugin instance, identify async generators, and identify for-await statements"],"goal":"verify pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1","kind":"HOW","packages":["pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1"],"schemaVersion":1},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","distro":"ubuntu","ecosystem":"npm","libc":"glibc","libcVersion":"2.39","os":"linux","osVersionBucket":"24","packageManager":"npm","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1"],"schemaVersion":1,"subject":"pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1","verifierAdapter":"node-typescript@1"}
{
"name": "sample-babel-plugin-transform-async-generator-functions",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "sample-babel-plugin-transform-async-generator-functions",
"version": "1.0.0",
"dependencies": {
"@babel/plugin-transform-async-generator-functions": "8.0.1"
}
},
"node_modules/@babel/code-frame": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz",
"integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^8.0.0",
"js-tokens": "^10.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/compat-data": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0.tgz",
"integrity": "sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==",
"license": "MIT",
"peer": true,
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/core": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.1.tgz",
"integrity": "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^8.0.0",
"@babel/generator": "^8.0.0",
"@babel/helper-compilation-targets": "^8.0.0",
"@babel/helpers": "^8.0.0",
"@babel/parser": "^8.0.0",
"@babel/template": "^8.0.0",
"@babel/traverse": "^8.0.0",
"@babel/types": "^8.0.0",
"@types/gensync": "^1.0.5",
"convert-source-map": "^2.0.0",
"empathic": "^2.0.1",
"gensync": "^1.0.0-beta.2",
"import-meta-resolve": "^4.2.0",
"json5": "^2.2.3",
"obug": "^2.1.1",
"semver": "^7.7.3"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/generator": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz",
"integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^8.0.0",
"@babel/types": "^8.0.0",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"@types/jsesc": "^2.5.0",
"jsesc": "^3.0.2"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz",
"integrity": "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==",
"license": "MIT",
"dependencies": {
"@babel/types": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0.tgz",
"integrity": "sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/compat-data": "^8.0.0",
"@babel/helper-validator-option": "^8.0.0",
"browserslist": "^4.24.0",
"lru-cache": "^11.0.0",
"semver": "^7.7.3"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-globals": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz",
"integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==",
"license": "MIT",
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz",
"integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==",
"license": "MIT",
"engines": {
"node": "^22.18.0 || >=24.11.0"
},
"peerDependencies": {
"@babel/core": "^8.0.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-8.0.1.tgz",
"integrity": "sha512-baAKuLEMmu6BCSY3tuiU7qglM1qOZt6F1SrFScA241oNqksxkxfEZEKztlGRmoVns9AQ5UgArH7RsUEjxWnzgQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^8.0.0",
"@babel/helper-wrap-function": "^8.0.0",
"@babel/traverse": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
},
"peerDependencies": {
"@babel/core": "^8.0.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz",
"integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==",
"license": "MIT",
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz",
"integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==",
"license": "MIT",
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0.tgz",
"integrity": "sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-wrap-function": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-8.0.0.tgz",
"integrity": "sha512-Qpm8+wi5xfDkBfollanwriCcKniFfBmMmaKB01GVM6VGzKXo1fdxosZp04qEr5HM+LKhwr3hG1yRy8+ORsficA==",
"license": "MIT",
"dependencies": {
"@babel/template": "^8.0.0",
"@babel/traverse": "^8.0.0",
"@babel/types": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helpers": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0.tgz",
"integrity": "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/template": "^8.0.0",
"@babel/types": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/parser": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz",
"integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==",
"license": "MIT",
"dependencies": {
"@babel/types": "^8.0.4"
},
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-8.0.1.tgz",
"integrity": "sha512-kqnSMF1YHBzuiQrl68675i5Ma1oljvo+SJsNEZFZVBu5BUrVIZm9KId3ui2PdtLK2sv2zM8sJnjPDfgLxQlEqQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^8.0.1",
"@babel/helper-remap-async-to-generator": "^8.0.1",
"@babel/traverse": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
},
"peerDependencies": {
"@babel/core": "^8.0.0"
}
},
"node_modules/@babel/template": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz",
"integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^8.0.0",
"@babel/parser": "^8.0.0",
"@babel/types": "^8.0.0"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/traverse": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz",
"integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^8.0.0",
"@babel/generator": "^8.0.0",
"@babel/helper-globals": "^8.0.0",
"@babel/parser": "^8.0.4",
"@babel/template": "^8.0.0",
"@babel/types": "^8.0.4",
"obug": "^2.1.1"
},
"engines": {
"node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/types": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz",
"integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^8.0.0",
"@babel/helper-validator-identifier": "^8.0.4"
},
"engines": {
"node": "^22.18.0 || >=24.11.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==",
"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==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"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==",
"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==",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@types/gensync": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.5.tgz",
"integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==",
"license": "MIT",
"peer": true
},
"node_modules/@types/jsesc": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz",
"integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==",
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.11.19",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz",
"integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"baseline-browser-mapping": "dist/cli.cjs"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/browserslist": {
"version": "4.28.8",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
"integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.11.12",
"caniuse-lite": "^1.0.30001809",
"electron-to-chromium": "^1.5.402",
"node-releases": "^2.0.53",
"update-browserslist-db": "^1.3.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001810",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
"integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0",
"peer": true
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"license": "MIT",
"peer": true
},
"node_modules/electron-to-chromium": {
"version": "1.5.415",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz",
"integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==",
"license": "ISC",
"peer": true
},
"node_modules/empathic": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.1.tgz",
"integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=14"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/import-meta-resolve": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
"integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
"license": "MIT",
"peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/js-tokens": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
"integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
"license": "MIT"
},
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=6"
}
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"license": "MIT",
"peer": true,
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/lru-cache": {
"version": "11.5.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
"license": "BlueOak-1.0.0",
"peer": true,
"engines": {
"node": "20 || >=22"
}
},
"node_modules/node-releases": {
"version": "2.0.54",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
"integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18"
}
},
"node_modules/obug": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
"integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
"funding": [
"https://github.com/sponsors/sxzz",
"https://opencollective.com/debug"
],
"license": "MIT",
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC",
"peer": true
},
"node_modules/semver": {
"version": "7.8.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"peer": true,
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/update-browserslist-db": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
"integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
}
}
}
{
"name": "sample-babel-plugin-transform-async-generator-functions",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"test": "node test/contract.mjs"
},
"dependencies": {
"@babel/plugin-transform-async-generator-functions": "8.0.1"
}
}
{
"schemaVersion": 1,
"goal": "verify pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1",
"kind": "HOW",
"packages": [
"pkg:npm/%40babel/plugin-transform-async-generator-functions@8.0.1"
]
}
import asyncGeneratorFunctionsPlugin from '@babel/plugin-transform-async-generator-functions';
/**
* Creates and initializes the async-generator-functions plugin instance.
* @param {object} [api] - Optional Babel API object.
* @param {object} [options] - Optional plugin options.
* @returns {object} Plugin instance object with name and visitor.
*/
export function createAsyncGeneratorFunctionsPlugin(api, options = {}) {
const plugin = asyncGeneratorFunctionsPlugin.default || asyncGeneratorFunctionsPlugin;
const babelApi = api || {
assertVersion: (range) => Boolean(range)
};
return plugin(babelApi, options);
}
/**
* Checks whether an AST node or path represents an async generator function.
* @param {object} pathOrNode - AST path or node object.
* @returns {boolean} True if the node is an async generator function.
*/
export function isAsyncGeneratorFunction(pathOrNode) {
const node = pathOrNode?.node || pathOrNode;
return Boolean(node && node.async && node.generator);
}
/**
* Checks whether an AST node or path represents a for-await-of loop.
* @param {object} pathOrNode - AST path or node object.
* @returns {boolean} True if the node is a ForOfStatement with await flag.
*/
export function isForAwaitStatement(pathOrNode) {
const node = pathOrNode?.node || pathOrNode;
return Boolean(node && node.type === 'ForOfStatement' && node.await);
}
/**
* Applies the plugin's Program visitor to an AST path.
* @param {object} pluginInstance - Plugin instance returned by createAsyncGeneratorFunctionsPlugin.
* @param {object} path - Babel AST path for Program node.
* @param {object} [state] - Optional traversal state.
*/
export function applyPluginProgramVisitor(pluginInstance, path, state = {}) {
if (pluginInstance?.visitor && typeof pluginInstance.visitor.Program === 'function') {
pluginInstance.visitor.Program(path, state);
}
}
import assert from 'node:assert/strict';
import asyncGeneratorFunctionsPlugin from '@babel/plugin-transform-async-generator-functions';
import {
createAsyncGeneratorFunctionsPlugin,
isAsyncGeneratorFunction,
isForAwaitStatement,
applyPluginProgramVisitor
} from '../src/index.mjs';
function invokeVisitor(visitor, nodeType, path, state = {}) {
const handler = visitor?.[nodeType];
if (typeof handler === 'function') {
return handler(path, state);
}
if (handler && Array.isArray(handler.enter)) {
for (const fn of handler.enter) {
fn(path, state);
}
}
}
// 1. Plugin default export is a function factory declaring Babel 7 and Babel 8 compatibility
const plugin = asyncGeneratorFunctionsPlugin.default || asyncGeneratorFunctionsPlugin;
assert.equal(typeof plugin, 'function', 'Default export must be a plugin factory function');
let assertedVersion = null;
const mockApi = {
assertVersion(version) {
assertedVersion = version;
}
};
const instance = plugin(mockApi, {});
assert.equal(assertedVersion, '^7.0.0-0 || ^8.0.0', 'Plugin must assert Babel 7/8 compatibility range');
// 2. Plugin factory returns an object named transform-async-generator-functions with Program visitor
assert.equal(typeof instance, 'object', 'Plugin factory must return an object');
assert.equal(instance.name, 'transform-async-generator-functions', 'Plugin name must be transform-async-generator-functions');
assert.equal(typeof instance.visitor, 'object', 'Plugin must provide a visitor object');
assert.equal(typeof instance.visitor.Program, 'function', 'Visitor must provide Program method');
// 3. Program visitor delegates traversal to internal function and loop visitors
{
let traversedVisitor = null;
let traversedState = null;
const mockProgramPath = {
traverse(visitor, state) {
traversedVisitor = visitor;
traversedState = state;
}
};
const dummyState = { testKey: 'testVal' };
instance.visitor.Program(mockProgramPath, dummyState);
assert.ok(traversedVisitor, 'Program visitor must initiate traversal');
assert.equal(typeof traversedVisitor.Function, 'function', 'Traversed visitor must include Function visitor');
assert.equal(traversedState, dummyState, 'Program visitor must forward traversal state');
}
// 4. Function visitor ignores non-async functions without modification
{
let innerTraverseCalled = false;
let dataSetKey = null;
const syncFunctionPath = {
node: { type: 'FunctionDeclaration', async: false, generator: true },
traverse() {
innerTraverseCalled = true;
},
setData(key) {
dataSetKey = key;
}
};
let traversedVisitor = null;
instance.visitor.Program({
traverse(v) {
traversedVisitor = v;
}
}, {});
traversedVisitor.Function(syncFunctionPath, {});
assert.equal(innerTraverseCalled, false, 'Function visitor must ignore non-async functions');
assert.equal(dataSetKey, null, 'Function visitor must not set metadata on non-async functions');
}
// 5. Function visitor attaches for-await-of visitor to async non-generator functions
{
let traversedInnerVisitor = null;
let dataSetKey = null;
const asyncNonGenPath = {
node: { type: 'FunctionDeclaration', async: true, generator: false },
traverse(v) {
traversedInnerVisitor = v;
},
setData(key) {
dataSetKey = key;
}
};
let traversedVisitor = null;
instance.visitor.Program({
traverse(v) {
traversedVisitor = v;
}
}, {});
traversedVisitor.Function(asyncNonGenPath, {});
assert.ok(traversedInnerVisitor, 'Async non-generator function must traverse for-await visitor');
assert.ok(traversedInnerVisitor.ForOfStatement, 'Inner visitor must handle ForOfStatement');
assert.ok(traversedInnerVisitor.ArrowFunctionExpression, 'Inner visitor must handle ArrowFunctionExpression');
assert.equal(dataSetKey, null, 'Async non-generator function must not set async_generator_function metadata');
}
// 6. Function visitor attaches yield star visitor and flags async_generator_function on async generator functions
{
let traversedVisitors = [];
let attachedData = {};
const asyncGenPath = {
node: {
type: 'FunctionDeclaration',
async: true,
generator: true
},
traverse(v) {
traversedVisitors.push(v);
},
setData(key, val) {
attachedData[key] = val;
}
};
let traversedVisitor = null;
instance.visitor.Program({
traverse(v) {
traversedVisitor = v;
}
}, {});
const mockHelperState = {
addHelper: (name) => ({ type: 'Identifier', name: `_${name}` })
};
try {
traversedVisitor.Function(asyncGenPath, mockHelperState);
} catch {
// remapAsyncToGenerator mock boundary is expected
}
assert.equal(
attachedData['@babel/plugin-transform-async-generator-functions/async_generator_function'],
true,
'Must set async_generator_function metadata on async generator functions'
);
assert.ok(traversedVisitors.some(v => v.YieldExpression), 'Must traverse yield star visitor on async generator functions');
}
// 7. Yield star visitor skips arrow functions and delegates yield star expressions with helper calls
{
let traversedVisitors = [];
const asyncGenPath = {
node: { type: 'FunctionDeclaration', async: true, generator: true },
traverse(v) {
traversedVisitors.push(v);
},
setData: () => {}
};
let traversedVisitor = null;
instance.visitor.Program({
traverse(v) {
traversedVisitor = v;
}
}, {});
const mockHelperState = {
addHelper: (name) => ({ type: 'Identifier', name: `_${name}` })
};
try {
traversedVisitor.Function(asyncGenPath, mockHelperState);
} catch {}
const yieldVisitor = traversedVisitors.find(v => v.YieldExpression);
assert.ok(yieldVisitor, 'Yield star visitor must be present');
let arrowSkipped = false;
invokeVisitor(yieldVisitor, 'ArrowFunctionExpression', {
isArrowFunctionExpression: () => true,
skip() {
arrowSkipped = true;
}
});
assert.equal(arrowSkipped, true, 'Arrow functions must be skipped in yield visitor');
const nonDelegateYield = {
node: { type: 'YieldExpression', delegate: false, argument: { type: 'Identifier', name: 'val' } }
};
invokeVisitor(yieldVisitor, 'YieldExpression', nonDelegateYield, mockHelperState);
assert.equal(nonDelegateYield.node.argument.type, 'Identifier', 'Non-delegate yield expression argument is unchanged');
const delegateYield = {
node: { type: 'YieldExpression', delegate: true, argument: { type: 'Identifier', name: 'subIter' } }
};
invokeVisitor(yieldVisitor, 'YieldExpression', delegateYield, mockHelperState);
assert.equal(delegateYield.node.argument.type, 'CallExpression', 'Delegated yield argument must become CallExpression');
assert.equal(delegateYield.node.argument.callee.name, '_asyncGeneratorDelegate', 'Outer call must be asyncGeneratorDelegate helper');
assert.equal(delegateYield.node.argument.arguments[0].type, 'CallExpression', 'Inner call must be CallExpression');
assert.equal(delegateYield.node.argument.arguments[0].callee.name, '_asyncIterator', 'Inner call must be asyncIterator helper');
}
// 8. For-await visitor skips arrow functions and ignores non-await for-of loops
{
let traversedVisitors = [];
const asyncPath = {
node: { type: 'FunctionDeclaration', async: true, generator: false },
traverse(v) {
traversedVisitors.push(v);
},
setData: () => {}
};
let traversedVisitor = null;
instance.visitor.Program({
traverse(v) {
traversedVisitor = v;
}
}, {});
traversedVisitor.Function(asyncPath, {});
const forAwaitVisitor = traversedVisitors.find(v => v.ForOfStatement);
assert.ok(forAwaitVisitor, 'For-await visitor must be present');
let forAwaitArrowSkipped = false;
invokeVisitor(forAwaitVisitor, 'ArrowFunctionExpression', {
isArrowFunctionExpression: () => true,
skip() {
forAwaitArrowSkipped = true;
}
});
assert.equal(forAwaitArrowSkipped, true, 'Arrow functions must be skipped in for-await visitor');
let nonAwaitTouched = false;
const nonAwaitPath = {
node: { type: 'ForOfStatement', await: false },
ensureBlock() {
nonAwaitTouched = true;
}
};
invokeVisitor(forAwaitVisitor, 'ForOfStatement', nonAwaitPath, { file: { addHelper: () => {} } });
assert.equal(nonAwaitTouched, false, 'Non-await ForOfStatement must be ignored');
}
// 9. Module helper utilities create plugin instance, identify async generators, and identify for-await statements
{
const helperInstance = createAsyncGeneratorFunctionsPlugin();
assert.equal(helperInstance.name, 'transform-async-generator-functions');
assert.equal(isAsyncGeneratorFunction({ async: true, generator: true }), true);
assert.equal(isAsyncGeneratorFunction({ node: { async: true, generator: true } }), true);
assert.equal(isAsyncGeneratorFunction({ async: true, generator: false }), false);
assert.equal(isAsyncGeneratorFunction({ async: false, generator: true }), false);
assert.equal(isAsyncGeneratorFunction(null), false);
assert.equal(isForAwaitStatement({ type: 'ForOfStatement', await: true }), true);
assert.equal(isForAwaitStatement({ node: { type: 'ForOfStatement', await: true } }), true);
assert.equal(isForAwaitStatement({ type: 'ForOfStatement', await: false }), false);
assert.equal(isForAwaitStatement({ type: 'ForStatement' }), false);
assert.equal(isForAwaitStatement(null), false);
let programVisitorCalled = false;
const mockPath = {
traverse() {
programVisitorCalled = true;
}
};
applyPluginProgramVisitor(helperInstance, mockPath);
assert.equal(programVisitorCalled, true, 'applyPluginProgramVisitor must execute Program visitor');
}
Seeder d'origine
anonyme