Exemple
detect-libc 2.1.2: Distinguish detect-libc v2 async and sync functions from v1 static properties to avoid truthiness traps on isNonGlibcLinux and unawaited Promise comparisons
Échantillon vérifié pour npm detect-libc 2.1.2: Distinguish detect-libc v2 async and sync functions from v1 static properties to avoid truthiness traps on…
sha256:a90b93363862ab9bf1c31caec9cc9526ff412ebb50669f7f54a8559a3e2ce05a
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
- 2
- Clés de signature qui l’ont compilé
- 2
Environnement déclaré
node linux x64 node node npm
Environnements des exécutions de vérification
| Environnement | Contrat | Étapes | Exécution |
|---|---|---|---|
| node 22 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-16 |
| node 22 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-18 |
Cas
HOW- Objectif
- Distinguish detect-libc v2 async and sync functions from v1 static properties to avoid truthiness traps on isNonGlibcLinux and unawaited Promise comparisons
- Paquets
- Symboles
-
- detect-libc.family
- detect-libc.familySync
- detect-libc.isNonGlibcLinux
- detect-libc.isNonGlibcLinuxSync
- detect-libc.version
- detect-libc.versionSync
- Environnement
- node
- Créé
- 2026-08-16T06:22:11Z
Contrat
- typeof detectLibc.family === 'function'
- typeof detectLibc.version === 'function'
- typeof detectLibc.isNonGlibcLinux === 'function'
- detectLibc.family !== 'glibc'
- detectLibc.family() instanceof Promise
- typeof detectLibc.familySync() === 'string' || detectLibc.familySync() === null
- typeof detectLibc.isNonGlibcLinuxSync() === 'boolean'
- typeof detectLibc.versionSync() === 'string' || detectLibc.versionSync() === null
- detectLibc.method === undefined
Fichiers
- NOTES.md
- csx.json
- package-lock.json
- package.json
- test/contract.mjs
Code source
# Notes: detect-libc v1 -> v2 API Boundary
## search_known_solution Result
`search_known_solution` returned no matching solutions for `detect-libc` (only low-confidence unrelated suggestions for PEP 440 specifiers, Python package distribution names, and esbuild platform binaries).
## What a Model Would Have Written
A model would have read `detectLibc.family`, `detectLibc.version`, and `detectLibc.isNonGlibcLinux` as synchronous static properties (or called `detectLibc.family()` without `await` expecting a synchronous string return value) as defined in `detect-libc` v1.x.
## How the Wrong Version Fails
It fails silently with a green build: in JavaScript `detectLibc.isNonGlibcLinux` is a function reference which evaluates as truthy (`Boolean([Function]) === true`) causing glibc Linux environments to silently enter non-glibc branches, while equality checks like `detectLibc.family === 'glibc'` or `family() === 'glibc'` evaluate to `false` without throwing a TypeError.
{"case":{"caseId":"case:sha256:261397381674399e256f177eec70a422e6755a304ecb1ce72220611648cba04a","contract":["typeof detectLibc.family === 'function'","typeof detectLibc.version === 'function'","typeof detectLibc.isNonGlibcLinux === 'function'","detectLibc.family !== 'glibc'","detectLibc.family() instanceof Promise","typeof detectLibc.familySync() === 'string' || detectLibc.familySync() === null","typeof detectLibc.isNonGlibcLinuxSync() === 'boolean'","typeof detectLibc.versionSync() === 'string' || detectLibc.versionSync() === null","detectLibc.method === undefined"],"goal":"Distinguish detect-libc v2 async and sync functions from v1 static properties to avoid truthiness traps on isNonGlibcLinux and unawaited Promise comparisons","kind":"HOW","packages":["pkg:npm/detect-libc@2.1.2"],"schemaVersion":1,"symbols":["detect-libc.family","detect-libc.familySync","detect-libc.isNonGlibcLinux","detect-libc.isNonGlibcLinuxSync","detect-libc.version","detect-libc.versionSync"]},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","ecosystem":"npm","executionContext":"node","language":"node","os":"linux","packageManager":"npm","runtime":"node","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/detect-libc@2.1.2"],"schemaVersion":1,"symbols":["detect-libc.family","detect-libc.familySync","detect-libc.isNonGlibcLinux","detect-libc.isNonGlibcLinuxSync","detect-libc.version","detect-libc.versionSync"],"verifierAdapter":"node-typescript@1"}
{
"name": "npm-detect-libc-version",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "npm-detect-libc-version",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"detect-libc": "^2.1.2"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
}
}
}
{
"name": "npm-detect-libc-version",
"version": "1.0.0",
"private": true,
"type": "module",
"dependencies": {
"detect-libc": "2.1.2"
}
}
import assert from 'node:assert/strict';
import detectLibc, {
GLIBC,
MUSL,
family,
familySync,
isNonGlibcLinux,
isNonGlibcLinuxSync,
version,
versionSync,
} from 'detect-libc';
// 1. Constants
assert.strictEqual(GLIBC, 'glibc');
assert.strictEqual(MUSL, 'musl');
assert.strictEqual(detectLibc.GLIBC, 'glibc');
assert.strictEqual(detectLibc.MUSL, 'musl');
// 2. v1 -> v2 Breaking Change: family, version, and isNonGlibcLinux are functions, NOT static properties
assert.strictEqual(typeof detectLibc.family, 'function');
assert.notStrictEqual(typeof detectLibc.family, 'string');
assert.strictEqual(typeof detectLibc.version, 'function');
assert.notStrictEqual(typeof detectLibc.version, 'string');
assert.strictEqual(typeof detectLibc.isNonGlibcLinux, 'function');
assert.notStrictEqual(typeof detectLibc.isNonGlibcLinux, 'boolean');
// 3. Silent Trap: Naive truthiness check on isNonGlibcLinux property
// In v1, `if (detectLibc.isNonGlibcLinux)` was false on glibc Linux.
// In v2, `detectLibc.isNonGlibcLinux` is a function reference, which is ALWAYS truthy in JS.
assert.strictEqual(Boolean(detectLibc.isNonGlibcLinux), true);
const syncNonGlibc = isNonGlibcLinuxSync();
assert.strictEqual(typeof syncNonGlibc, 'boolean');
// 4. Silent Trap: Direct property comparison with GLIBC constant
// In v1, `detectLibc.family === detectLibc.GLIBC` returned true on glibc Linux.
// In v2, comparing function reference against string constant silently evaluates to false.
assert.strictEqual(detectLibc.family === GLIBC, false);
// 5. Silent Trap: Calling async family() synchronously without await returns a Promise
const unawaitedFamily = family();
assert.ok(unawaitedFamily instanceof Promise);
assert.notStrictEqual(typeof unawaitedFamily, 'string');
assert.strictEqual(unawaitedFamily === GLIBC, false);
// 6. Synchronous API: familySync(), versionSync(), and isNonGlibcLinuxSync()
const syncFamily = familySync();
const syncVersion = versionSync();
// On Linux: syncFamily is 'glibc' or 'musl' (or null if unknown); on non-Linux: syncFamily is null (never empty string '')
if (process.platform === 'linux') {
assert.ok(syncFamily === GLIBC || syncFamily === MUSL || syncFamily === null);
if (syncFamily !== null) {
assert.strictEqual(typeof syncFamily, 'string');
}
} else {
assert.strictEqual(syncFamily, null);
assert.strictEqual(syncVersion, null);
assert.strictEqual(syncNonGlibc, false);
}
assert.notStrictEqual(syncFamily, '');
assert.notStrictEqual(syncVersion, '');
// 7. Asynchronous API: await family(), await version(), await isNonGlibcLinux()
const asyncFamily = await family();
const asyncVersion = await version();
const asyncNonGlibc = await isNonGlibcLinux();
assert.strictEqual(asyncFamily, syncFamily);
assert.strictEqual(asyncVersion, syncVersion);
assert.strictEqual(asyncNonGlibc, syncNonGlibc);
// 8. Removed Legacy Property: 'method' was removed in v2
assert.strictEqual(detectLibc.method, undefined);