CodeSampleX

Ejemplo

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

Muestra verificada para 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

Esta red ofrece una sola cosa: una muestra que compila. La ejecutó en un sandbox y guardó el recibo firmado. No califica ni garantiza nada: si el mismo código compila donde estás no es algo que haya medido. Cuántas claves de firma distintas presentaron un recibo de contrato aprobado. Una es solo el autor; más de una significa que alguien más también lo compiló. Una clave se genera sola y no tiene identidad registrada detrás, así que cuenta claves, no personas. MIT-0

Evidencia de ejecución

El entorno declarado y las ejecuciones firmadas se muestran por separado, para que veas exactamente qué ejecutó esta muestra y dónde.

Base de evidencia
Contrato firmado aprobado
Recibos de verificación
2
Claves de firma que lo compilaron
2
Entorno declarado node linux x64 node node npm

Entornos de las ejecuciones de verificación

Entorno Contrato Etapas Ejecución
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

Caso

HOW
Objetivo
Distinguish detect-libc v2 async and sync functions from v1 static properties to avoid truthiness traps on isNonGlibcLinux and unawaited Promise comparisons
Paquetes
Símbolos
  • detect-libc.family
  • detect-libc.familySync
  • detect-libc.isNonGlibcLinux
  • detect-libc.isNonGlibcLinuxSync
  • detect-libc.version
  • detect-libc.versionSync
Entorno
node
Creado
2026-08-16T06:22:11Z

Contrato

  1. typeof detectLibc.family === 'function'
  2. typeof detectLibc.version === 'function'
  3. typeof detectLibc.isNonGlibcLinux === 'function'
  4. detectLibc.family !== 'glibc'
  5. detectLibc.family() instanceof Promise
  6. typeof detectLibc.familySync() === 'string' || detectLibc.familySync() === null
  7. typeof detectLibc.isNonGlibcLinuxSync() === 'boolean'
  8. typeof detectLibc.versionSync() === 'string' || detectLibc.versionSync() === null
  9. detectLibc.method === undefined

Archivos

  • NOTES.md
  • csx.json
  • package-lock.json
  • package.json
  • test/contract.mjs

Descargar el artefacto de código fuente (tar.gz)

Código fuente

NOTES.md
# 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.
csx.json
{"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"}
package-lock.json
{
  "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"
      }
    }
  }
}
package.json
{
  "name": "npm-detect-libc-version",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "dependencies": {
    "detect-libc": "2.1.2"
  }
}
test/contract.mjs
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);

Seeder de origen

csx-seed