CodeSampleX

Exemple

@inquirer/prompts 6.0.1

Échantillon vérifié pour npm @inquirer/prompts 6.0.1. Le contrat s'est exécuté sur node 22 · linux debian/x64 · docker et a réussi.

sha256:0f25d91159d9f45f5f82f994686ecbb6e117cefac904c04b583afaccb34769e7

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é node 22.23 linux 24 · ubuntu · glibc 2.39 x64 node 22.23 javascript npm 10

Environnements des exécutions de vérification

Environnement Contrat Étapes Exécution
node 22 · linux debian/x64 · docker ed25519:c1973797be207ac4 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · node-typescript@1node:22@sha256:8a34c4ab3ea2…
2026-09-16

Cas

HOW
Objectif
verify pkg:npm/%40inquirer/prompts@6.0.1
Paquets
Environnement
node 22.23.2
Créé
2026-09-16T12:56:28Z

Contrat

  1. @inquirer/prompts exports expected prompt functions and Separator
  2. Separator instantiates with type separator and duck types via Separator.isSeparator
  3. input prompt reads string from input stream and resolves with entered value
  4. confirm prompt resolves default boolean value when enter key is submitted
  5. select prompt returns selected choice value from choices array with Separator support
  6. number prompt parses and resolves numeric input value
  7. password prompt receives sensitive input and resolves plain text string
  8. prompts support cancellation via AbortSignal in context

Fichiers

  • PROMPT.md
  • csx.json
  • index.mjs
  • package-lock.json
  • package.json
  • spec.json
  • test/contract.mjs

Télécharger l’artefact source (tar.gz)

Code source

PROMPT.md
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/%40inquirer/prompts@6.0.1
Kind: HOW

Use EXACTLY these public packages and versions:
  - pkg:npm/%40inquirer/prompts@6.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.
csx.json
{"case":{"caseId":"case:sha256:ffbb3b02886428cb315269c410442662e6fb5f7f0ab3eb219c942188a5b94a67","contract":["@inquirer/prompts exports expected prompt functions and Separator","Separator instantiates with type separator and duck types via Separator.isSeparator","input prompt reads string from input stream and resolves with entered value","confirm prompt resolves default boolean value when enter key is submitted","select prompt returns selected choice value from choices array with Separator support","number prompt parses and resolves numeric input value","password prompt receives sensitive input and resolves plain text string","prompts support cancellation via AbortSignal in context"],"goal":"verify pkg:npm/%40inquirer/prompts@6.0.1","kind":"HOW","packages":["pkg:npm/%40inquirer/prompts@6.0.1"],"schemaVersion":1},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","distro":"ubuntu","ecosystem":"npm","executionContext":"node","language":"javascript","libc":"glibc","libcVersion":"2.39","moduleSystem":"esm","os":"linux","osVersionBucket":"24","packageManager":"npm","packageManagerVersion":"10.9.8","runtime":"node","runtimeVersion":"22.23.2","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/%40inquirer/prompts@6.0.1"],"schemaVersion":1,"subject":"pkg:npm/%40inquirer/prompts@6.0.1","verifierAdapter":"node-typescript@1"}
index.mjs
import {
  Separator,
  checkbox,
  confirm,
  editor,
  expand,
  input,
  number,
  password,
  rawlist,
  search,
  select
} from '@inquirer/prompts';

export {
  Separator,
  checkbox,
  confirm,
  editor,
  expand,
  input,
  number,
  password,
  rawlist,
  search,
  select
};

/**
 * Prompts user for a text input with optional custom streams or signal.
 * @param {object} config
 * @param {object} [context]
 * @returns {Promise<string>}
 */
export async function promptInput(config, context) {
  return input(config, context);
}

/**
 * Prompts user for a yes/no confirmation with optional custom streams or signal.
 * @param {object} config
 * @param {object} [context]
 * @returns {Promise<boolean>}
 */
export async function promptConfirm(config, context) {
  return confirm(config, context);
}

/**
 * Prompts user to select from a list of choices.
 * @param {object} config
 * @param {object} [context]
 * @returns {Promise<any>}
 */
export async function promptSelect(config, context) {
  return select(config, context);
}

/**
 * Prompts user for numeric input.
 * @param {object} config
 * @param {object} [context]
 * @returns {Promise<number | undefined>}
 */
export async function promptNumber(config, context) {
  return number(config, context);
}

/**
 * Prompts user for a password/secret string.
 * @param {object} config
 * @param {object} [context]
 * @returns {Promise<string>}
 */
export async function promptPassword(config, context) {
  return password(config, context);
}

/**
 * Creates a choices list with standard items and visual separators.
 * @param {Array<{ name: string, value: any }>} items
 * @param {string} [separatorText]
 * @returns {Array<any>}
 */
export function createMenuWithSeparator(items, separatorText) {
  const result = [];
  for (let i = 0; i < items.length; i++) {
    if (i > 0 && separatorText) {
      result.push(new Separator(separatorText));
    }
    result.push(items[i]);
  }
  return result;
}
package-lock.json
{
  "name": "sample-inquirer-prompts",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "sample-inquirer-prompts",
      "version": "1.0.0",
      "license": "MIT-0",
      "dependencies": {
        "@inquirer/prompts": "6.0.1"
      }
    },
    "node_modules/@inquirer/checkbox": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz",
      "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/figures": "^1.0.6",
        "@inquirer/type": "^2.0.0",
        "ansi-escapes": "^4.3.2",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/confirm": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz",
      "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/core": {
      "version": "9.2.1",
      "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz",
      "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/figures": "^1.0.6",
        "@inquirer/type": "^2.0.0",
        "@types/mute-stream": "^0.0.4",
        "@types/node": "^22.5.5",
        "@types/wrap-ansi": "^3.0.0",
        "ansi-escapes": "^4.3.2",
        "cli-width": "^4.1.0",
        "mute-stream": "^1.0.0",
        "signal-exit": "^4.1.0",
        "strip-ansi": "^6.0.1",
        "wrap-ansi": "^6.2.0",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/editor": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz",
      "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0",
        "external-editor": "^3.1.0"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/expand": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz",
      "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/figures": {
      "version": "1.0.15",
      "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
      "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
      "license": "MIT",
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/input": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz",
      "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/number": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz",
      "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/password": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz",
      "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0",
        "ansi-escapes": "^4.3.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/prompts": {
      "version": "6.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz",
      "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/checkbox": "^3.0.1",
        "@inquirer/confirm": "^4.0.1",
        "@inquirer/editor": "^3.0.1",
        "@inquirer/expand": "^3.0.1",
        "@inquirer/input": "^3.0.1",
        "@inquirer/number": "^2.0.1",
        "@inquirer/password": "^3.0.1",
        "@inquirer/rawlist": "^3.0.1",
        "@inquirer/search": "^2.0.1",
        "@inquirer/select": "^3.0.1"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/rawlist": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz",
      "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/type": "^2.0.0",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/search": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz",
      "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/figures": "^1.0.6",
        "@inquirer/type": "^2.0.0",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/select": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz",
      "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==",
      "license": "MIT",
      "dependencies": {
        "@inquirer/core": "^9.2.1",
        "@inquirer/figures": "^1.0.6",
        "@inquirer/type": "^2.0.0",
        "ansi-escapes": "^4.3.2",
        "yoctocolors-cjs": "^2.1.2"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@inquirer/type": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz",
      "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==",
      "license": "MIT",
      "dependencies": {
        "mute-stream": "^1.0.0"
      },
      "engines": {
        "node": ">=18"
      }
    },
    "node_modules/@types/mute-stream": {
      "version": "0.0.4",
      "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz",
      "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==",
      "license": "MIT",
      "dependencies": {
        "@types/node": "*"
      }
    },
    "node_modules/@types/node": {
      "version": "22.20.3",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz",
      "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==",
      "license": "MIT",
      "dependencies": {
        "undici-types": "~6.21.0"
      }
    },
    "node_modules/@types/wrap-ansi": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz",
      "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==",
      "license": "MIT"
    },
    "node_modules/ansi-escapes": {
      "version": "4.3.2",
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
      "license": "MIT",
      "dependencies": {
        "type-fest": "^0.21.3"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "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==",
      "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",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "license": "MIT",
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/chardet": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
      "license": "MIT"
    },
    "node_modules/cli-width": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
      "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
      "license": "ISC",
      "engines": {
        "node": ">= 12"
      }
    },
    "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==",
      "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==",
      "license": "MIT"
    },
    "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==",
      "license": "MIT"
    },
    "node_modules/external-editor": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
      "license": "MIT",
      "dependencies": {
        "chardet": "^0.7.0",
        "iconv-lite": "^0.4.24",
        "tmp": "^0.0.33"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/iconv-lite": {
      "version": "0.4.24",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
      "license": "MIT",
      "dependencies": {
        "safer-buffer": ">= 2.1.2 < 3"
      },
      "engines": {
        "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==",
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/mute-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
      "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
      "license": "ISC",
      "engines": {
        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
      }
    },
    "node_modules/os-tmpdir": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
      "license": "MIT",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "license": "MIT"
    },
    "node_modules/signal-exit": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
      "license": "ISC",
      "engines": {
        "node": ">=14"
      },
      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }
    },
    "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==",
      "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==",
      "license": "MIT",
      "dependencies": {
        "ansi-regex": "^5.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/tmp": {
      "version": "0.0.33",
      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
      "license": "MIT",
      "dependencies": {
        "os-tmpdir": "~1.0.2"
      },
      "engines": {
        "node": ">=0.6.0"
      }
    },
    "node_modules/type-fest": {
      "version": "0.21.3",
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
      "license": "(MIT OR CC0-1.0)",
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/undici-types": {
      "version": "6.21.0",
      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
      "license": "MIT"
    },
    "node_modules/wrap-ansi": {
      "version": "6.2.0",
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
      "license": "MIT",
      "dependencies": {
        "ansi-styles": "^4.0.0",
        "string-width": "^4.1.0",
        "strip-ansi": "^6.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/yoctocolors-cjs": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
      "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
      "license": "MIT",
      "engines": {
        "node": ">=18"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    }
  }
}
package.json
{
  "name": "sample-inquirer-prompts",
  "version": "1.0.0",
  "private": true,
  "description": "Clean-room code sample for @inquirer/prompts@6.0.1",
  "type": "module",
  "main": "src/index.mjs",
  "license": "MIT-0",
  "dependencies": {
    "@inquirer/prompts": "6.0.1"
  }
}
spec.json
{
  "schemaVersion": 1,
  "goal": "verify pkg:npm/%40inquirer/prompts@6.0.1",
  "kind": "HOW",
  "packages": [
    "pkg:npm/%40inquirer/prompts@6.0.1"
  ]
}
test/contract.mjs
import assert from 'node:assert/strict';
import { PassThrough } from 'node:stream';
import {
  Separator,
  checkbox,
  confirm,
  editor,
  expand,
  input,
  number,
  password,
  rawlist,
  search,
  select,
  promptInput,
  promptConfirm,
  promptSelect,
  promptNumber,
  promptPassword,
  createMenuWithSeparator
} from '../index.mjs';

async function testExports() {
  assert.equal(typeof input, 'function', 'input must be a function');
  assert.equal(typeof confirm, 'function', 'confirm must be a function');
  assert.equal(typeof select, 'function', 'select must be a function');
  assert.equal(typeof checkbox, 'function', 'checkbox must be a function');
  assert.equal(typeof number, 'function', 'number must be a function');
  assert.equal(typeof password, 'function', 'password must be a function');
  assert.equal(typeof editor, 'function', 'editor must be a function');
  assert.equal(typeof expand, 'function', 'expand must be a function');
  assert.equal(typeof rawlist, 'function', 'rawlist must be a function');
  assert.equal(typeof search, 'function', 'search must be a function');
  assert.equal(typeof Separator, 'function', 'Separator must be a class/function');
}

async function testSeparator() {
  const sepDefault = new Separator();
  assert.equal(sepDefault.type, 'separator', 'Separator type must be separator');

  const customText = '------ section ------';
  const sepCustom = new Separator(customText);
  assert.equal(sepCustom.separator, customText, 'Separator text must match custom argument');

  assert.equal(Separator.isSeparator(sepDefault), true, 'Separator.isSeparator must return true for instances');
  assert.equal(Separator.isSeparator(sepCustom), true, 'Separator.isSeparator must return true for custom instances');
  assert.equal(Separator.isSeparator({ type: 'separator' }), true, 'Duck-typed object with type separator is recognized as separator');
  assert.equal(Separator.isSeparator({ type: 'choice' }), false, 'Object with different type should return false');
  assert.equal(Separator.isSeparator(null), false, 'null should return false');
  assert.equal(Separator.isSeparator('separator'), false, 'primitive string should return false');
}

async function testInputPrompt() {
  const inputStream = new PassThrough();
  const outputStream = new PassThrough();

  const promise = promptInput({ message: 'Enter your project name' }, { input: inputStream, output: outputStream });
  inputStream.write('my-cli-app\r\n');
  const answer = await promise;

  assert.equal(answer, 'my-cli-app', 'Input prompt should resolve with the entered string');
}

async function testConfirmPrompt() {
  const inputStream = new PassThrough();
  const outputStream = new PassThrough();

  const promise = promptConfirm({ message: 'Proceed with installation?', default: true }, { input: inputStream, output: outputStream });
  inputStream.write('\r\n');
  const answer = await promise;

  assert.equal(answer, true, 'Confirm prompt should resolve to default boolean true upon enter');
}

async function testSelectPrompt() {
  const choices = createMenuWithSeparator([
    { name: 'Node.js', value: 'node' },
    { name: 'Python', value: 'python' }
  ], '--- options ---');

  assert.equal(choices.length, 3, 'Choices array should contain 2 items and 1 separator');
  assert.equal(Separator.isSeparator(choices[1]), true, 'Middle item should be a Separator instance');

  const inputStream = new PassThrough();
  const outputStream = new PassThrough();

  const promise = promptSelect({ message: 'Select language', choices }, { input: inputStream, output: outputStream });
  inputStream.write('\r\n');
  const answer = await promise;

  assert.equal(answer, 'node', 'Select prompt should resolve to the initial selection');
}

async function testNumberPrompt() {
  const inputStream = new PassThrough();
  const outputStream = new PassThrough();

  const promise = promptNumber({ message: 'Enter port number', default: 8080 }, { input: inputStream, output: outputStream });
  inputStream.write('3000\r\n');
  const answer = await promise;

  assert.equal(answer, 3000, 'Number prompt should parse string into number');
  assert.equal(typeof answer, 'number', 'Answer type must be number');
}

async function testPasswordPrompt() {
  const inputStream = new PassThrough();
  const outputStream = new PassThrough();

  const promise = promptPassword({ message: 'Enter secret token', mask: '*' }, { input: inputStream, output: outputStream });
  inputStream.write('super-secret-token\r\n');
  const answer = await promise;

  assert.equal(answer, 'super-secret-token', 'Password prompt should resolve secret string');
}

async function testAbortSignal() {
  const inputStream = new PassThrough();
  const outputStream = new PassThrough();
  const controller = new AbortController();

  const promise = promptInput({ message: 'Will be aborted' }, { input: inputStream, output: outputStream, signal: controller.signal });
  controller.abort();

  await assert.rejects(
    async () => {
      await promise;
    },
    {
      name: 'AbortPromptError'
    },
    'Prompt should reject with AbortPromptError when aborted'
  );
}

async function runAll() {
  await testExports();
  await testSeparator();
  await testInputPrompt();
  await testConfirmPrompt();
  await testSelectPrompt();
  await testNumberPrompt();
  await testPasswordPrompt();
  await testAbortSignal();
  console.log('All contract tests passed.');
}

runAll().catch((err) => {
  console.error('Contract test failure:', err);
  process.exit(1);
});

Seeder d'origine

anonyme